本帖最后由 sky 于 2017-7-15 10:03 编辑
在上一篇《量化计算中的技巧(二)》中说到了用shell script完成各式各样的命令,但是这种方法有两个问题: 1. 难以做出复杂的功能 2. 可读性差 3. 代码复用很困难
shell script是可以做很复杂的功能的,它支持正则表达式,支持数组,还有大量好用的系统命令,比如sed和awk。有兴趣的可以去看看《sed与awk》,两个命令写出了400多页的书。当年我就看过某老师写的把MS的输出文件*.cell转换成POSCAR的脚本,里面灵活运用了sed、awk、数组等功能,我是很服气的。 但是这种脚本很难读懂,写起来也很复杂。比如你能看懂这段代码是干什么的吗? - awk 'BEGIN{i=1} /imag/,\
- /\/imag/ \
- {a=$2 ; b=$3 ; c=$4; d=$5 ; e=$6 ; f=$7; g=$8; i=i+1} \
- END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml
光是学习sed、awk的时间就够你学几遍python了。而且代码很难复用,比如说你写了个把gjf文件转换成cif文件的脚本,在里面实现了一个读取gjf文件的子功能。但是下次再想要写个把gjf文件转换成POSCAR文件的脚本,之前写过的代码就基本没用了。所以除了学shell script 外,还需要再学一门高级语言:perl或者python. 关于语言的选择,我在第一篇《计算化学编程语言》里说过,在这里不赘述。网上有一套流传广泛的的vasp用的脚本:theory.cm.utexas.edu/vtsttools/scripts.html 这是用perl写的,而且写的非常好。我一开始原本打算直接学python的,看到这套脚本之后没办法只好先学perl,然后学着修改这套脚本,最后再开始写一些想要的功能。 客观来说perl学起来比python要困难,有三方面原因: 1. 动态语义 同样一个表达式,在不同的环境中有不同的意思。学过这么多语言,唯独perl有这个功能,这也是我喜欢perl的一个重要原因。这个功能用好了非常方便,但是对于初学者来说会很困惑。 2. 简写 perl中有很多简写,导致代码无论是写起来还是读起来都很困难,对新手不友好。 3. 没有成熟靠谱的IDE 当年我是在vim里写perl的,vim除了语法高亮之外什么都没有。每写一个函数或者功能都要去查名字和用法对了没。写完之后运行有一大堆报错,只能在命令行下调试。记得当时写一个把震动模式转换成VMD可以播放动画的xyz文件时,花了一天多时间。而python有非常成熟的pycharm可用,对各种内置函数的提示、对语法的检查,还有完善的debug功能。现在我写同样的脚本一个小时足够了。
对于perl和python,因为网上各种教程例子已经很多了,在这里只谈一些我做的功能来说明一下它们的作用。上面也提到了,对于VASP网上只有一套成熟的perl脚本可用,导致当年我不得不去学perl。所以最近我也在准备把perl的主要功能搬到python上,主要是perl脚本里的Vasp.pm模块。 https://github.com/Mabinogiysk/VASP-script
这个模块实现了POSCAR文件的读取和写入,分数坐标和笛卡尔坐标的转换等功能。这样在写其它脚本时,只需要从模块中导出相应的功能,大大简化了脚本的实现。现在已经完成了read_poscar()和write_poscar()以及分数坐标和笛卡尔坐标转换的功能,有兴趣的朋友也可以来帮助开发。
python脚本功能: 1. 不同格式文件之间的转换 比如vasp和gjf文件之间的转换,vasp和cif文件之间的转换,笛卡尔坐标和分数坐标之间的转换。 这些都是常用功能,如果用shell script来实现将会非常麻烦。 现在只需要导入VASP.py模块,使用一行代码就能读取POSCAR文件:
- import VASP.py
- ...
- lattice, basis, elements, num_atoms, selectiveflag, coordinate_type, coordinates, selective = read_poscar(file_name)
- ...
- write_poscar(file_name, lattice, basis, elements, num_atoms, selectiveflag, coordinate_type, coordinates, selective)
自动给出基矢,元素种类和数量,坐标等信息。对元素操作之后,再用一行代码就能把这些信息写回到POSCAR中,非常方便。
2. 频率计算之后,把OUTCAR里的虚频提取出来,再转化为在VMD里可以播放动画的文件格式xyz:
- > imagefreq.py
- --------------------Processing--------------------
- freq18
- --------------------Done--------------------
- > freqmov.pl POSCAR freq18 30 0.6
- ################ This script makes animation of vibration ################
- Processing freq18
- ------------------ Done ------------------
freqmov.pl 可以把提取出的虚频转化为VMD可以读取的动画文件xyz,具体的说明和用法链接里有。这个功能用shell script做几乎是不现实的,但用高级语言能很容易做出来。在上面连接里的example文件夹下有两个实例,感兴趣的同学可以去看一下。
3. moviecombine.pl:提取NEB计算的image的信息做成动画
从image1到image8每一步的坐标都提取出来做成动画。找出一个合适的构型接着跑dimer就能很容易找到过渡态。
对于perl、python这样的语言,可以说只有想不到的用法,没有做不出来的功能。学会使用这些编程语言,无疑还能进一步提高工作效率。
|