24小时热门版块排行榜    

查看: 632  |  回复: 0

endlesslov

新虫 (初入文坛)

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

有时,我们需要进行较为重复的多任务计算并从输出文件中提取数据。例如一维和二维势能面计算,可能多达几千个任务。所以,不可能每个任务都由手工操作,一定要通过自动化的程序实现。Perl语言的文档数据处理极为强大,易学易用,且已内嵌到Linux中(windows需安装程序)。这里通过一个例子,达到抛砖引玉的作用。即使从未接触过perl,也能迅速开始计算工作。当然,如果需要更多,还需对perl多加学习。
这是一个一维势能面计算,原始g09输入文件m062x.com中的zzz为势能面的一维变量。所以在循环中(变量为$step),每一次将原始输入文件复制为新文件,并将zzz替换为$step,然后计算。这是gaussian09的例子,当然可以改成任何其它计算程序。最后从g09输出文件提取能量数值并写入表格 m062x.summary。
最后,感谢Alex最初提供给我一个例子,使我进入perl应用的领域,极大地提高了效率。

#!/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;

转载自 http://blog.sciencenet.cn/blog-2854406-1076151.html
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 endlesslov 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见