menmenbengbeng的个人博客分享 http://blog.sciencenet.cn/u/menmenbengbeng

博文

计算化学多任务及数据提取 – perl程序的应用

已有 3026 次阅读 2017-9-15 17:31 |系统分类:科研笔记

m062x.pl



有时,我们需要进行较为重复的多任务计算并从输出文件中提取数据。例如一维和二维势能面计算,可能多达几千个任务。所以,不可能每个任务都由手工操作,一定要通过自动化的程序实现。Perl语言的文档数据处理极为强大,易学易用,且已内嵌到Linux中(windows需安装程序)。这里通过一个例子,达到抛砖引玉的作用。即使从未接触过perl,也能迅速开始计算工作。当然,如果需要更多,还需对perl多加学习。

这是一个一维势能面计算,原始g09输入文件m062x.com中的zzz为势能面的一维变量。所以在循环中(变量为$step),每一次将原始输入文件复制为新文件,并将zzz替换为$step,然后计算。这是gaussian09的例子,当然可以改成任何其它计算程序。最后从g09输出文件提取能量数值并写入表格 m062x.summary

最后,感谢Alex最初提供给我一个例子,使我进入perl应用的领域,极大地提高了效率。


     由于原程序在本站的显示有些问题,请以附件m062x.pl 为准。      


#!/usr/bin/perl -w


# MODULES

# -----------------------------------------------

use strict;

use sigtrap;

use diagnostics;

use File::Copy;

# -----------------------------------------------


my $summary = "m062x.summary";

open (SUM, "> $summary") or die "Cannot open $summary : $!\n";


printf SUM "# STEP\t\t\t\tEnergy\n";


foreach my $step ('0.0001','0.25','0.50','0.75','1.00','1.25','1.50','1.75','2.00') {


     printf SUM "\t\%16.8E", $step;


     my $origfname = "m062x.com";  

     my $newfname  = "m062x-$step.com";

     my $newfnamet = "m062x-$step.log";


     copy($origfname, $newfname) or die "Copy failed: $!";

     system("perl -p -i -e s/'zzz'/$step/g $newfname");


     my $return = system("g09 $newfname 2>&1");

     die "System failed ($return)\n\n" if ($return != 0);


               my $ener;

# EXTRACT INFO FROM OUTPUT

open (OUT, "< $newfnamet") or die "Cannot open $newfnamet : $!\n";

while (<OUT>) {

             $ener = (split /\s+/)[5] if (/SCF Done:/);

}

close OUT;

printf SUM "\t\%16.8E", $ener;


               printf SUM "n";


}



# -----------------------------------------------


exit 0;




https://blog.sciencenet.cn/blog-2854406-1076151.html

上一篇:如何从零开始学习理论计算化学?
收藏 IP: 159.226.25.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-27 09:23

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部