|
有时,我们需要进行较为重复的多任务计算并从输出文件中提取数据。例如一维和二维势能面计算,可能多达几千个任务。所以,不可能每个任务都由手工操作,一定要通过自动化的程序实现。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;
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 09:23
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社