计算化学公社

 找回密码 Forget password
 注册 Register
Views: 11714|回复 Reply: 15
打印 Print 上一主题 Last thread 下一主题 Next thread

[综合交流] 量化计算中的技巧(三):perl、python

[复制链接 Copy URL]

103

帖子

5

威望

1000

eV
积分
1203

Level 4 (黑子)

本帖最后由 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这样的语言,可以说只有想不到的用法,没有做不出来的功能。学会使用这些编程语言,无疑还能进一步提高工作效率。


评分 Rate

参与人数
Participants 4
威望 +1 eV +13 收起 理由
Reason
amo305 + 3 赞!
zsu007 + 5 赞!
ggdh + 5 谢谢
sobereva + 1

查看全部评分 View all ratings

1102

帖子

18

威望

6643

eV
积分
8105

Level 6 (一方通行)

計算化学の社畜

2#
发表于 Post on 2017-7-15 10:38:28 | 只看该作者 Only view this author
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学
Stand on the shoulders of giants

50

帖子

0

威望

1491

eV
积分
1542

Level 5 (御坂)

3#
发表于 Post on 2017-7-15 12:33:21 | 只看该作者 Only view this author
冰释之川 发表于 2017-7-15 10:38
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学

没必要
http://www.kuqin.com/abyteofpython_cn/
两三个小时就看完了

50

帖子

0

威望

1491

eV
积分
1542

Level 5 (御坂)

4#
发表于 Post on 2017-7-15 12:37:08 | 只看该作者 Only view this author
perl 写的我想死啊,跟乱码一样,可读性跟 sh, sed, awk 半斤八两。但是MS脚本只能用 perl,不得不学。

294

帖子

0

威望

3528

eV
积分
3822

Level 5 (御坂)

5#
发表于 Post on 2017-7-15 17:19:30 | 只看该作者 Only view this author

903

帖子

37

威望

5324

eV
积分
6967

Level 6 (一方通行)

6#
发表于 Post on 2017-7-15 18:43:04 | 只看该作者 Only view this author
本帖最后由 ggdh 于 2017-7-15 18:51 编辑

感觉perl有点野,说什么:
“There is more than one way to doing something”
这对于有选择恐惧症来说,简直是噩梦。
另外从维护以及共同开发角度说,倾向python,程序写好了可以直接看,注释都不需要,加上强制缩进。符合clean code的审美。
perl据说是write-only的脚本。。。

103

帖子

5

威望

1000

eV
积分
1203

Level 4 (黑子)

7#
 楼主 Author| 发表于 Post on 2017-7-15 22:10:38 | 只看该作者 Only view this author
ulosggs 发表于 2017-7-15 12:37
perl 写的我想死啊,跟乱码一样,可读性跟 sh, sed, awk 半斤八两。但是MS脚本只能用 perl,不得不学。

当年学vtst的脚本就痛苦的要死,perl入门教程看完了还看不懂人家写了什么。
其实我觉得最痛苦的是没有ide和只能用命令行调试,好在现在终于弃坑了。

103

帖子

5

威望

1000

eV
积分
1203

Level 4 (黑子)

8#
 楼主 Author| 发表于 Post on 2017-7-15 22:16:20 | 只看该作者 Only view this author
冰释之川 发表于 2017-7-15 10:38
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学

python简明教程吧,只看过这个。
我是有C++/java/perl的底子才来学python的,基本什么都没看过。多写几个脚本,遇到不懂的地方百度一下,自然而然就会了。。。
说真的,比起前面那些python实在太简单了。

103

帖子

5

威望

1000

eV
积分
1203

Level 4 (黑子)

9#
 楼主 Author| 发表于 Post on 2017-7-15 22:22:07 | 只看该作者 Only view this author
ggdh 发表于 2017-7-15 18:43
感觉perl有点野,说什么:
“There is more than one way to doing something”
这对于有选择恐惧症来说 ...

所以我最后还是弃坑了

903

帖子

37

威望

5324

eV
积分
6967

Level 6 (一方通行)

10#
发表于 Post on 2017-7-15 22:57:32 | 只看该作者 Only view this author
本帖最后由 ggdh 于 2017-7-15 22:59 编辑
冰释之川 发表于 2017-7-15 10:38
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学


找那种一天简易入门的教程,然后开始写小项目,有问题直接google,stackoverflow上面一般都会有不错的解决方案。写过几个小项目,有点感觉之后,可以看相关的书籍比如:Fluent python, Python Cookbook 3, Numpy Cookbook, Effective python, Mastering Pandas, Mastering Matplotlib, Python in Practice,提高代码的质量。

8

帖子

0

威望

802

eV
积分
810

Level 4 (黑子)

11#
发表于 Post on 2017-7-17 22:22:43 | 只看该作者 Only view this author
冰释之川 发表于 2017-7-15 10:38
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学

用python做科学计算

120

帖子

0

威望

2560

eV
积分
2680

Level 5 (御坂)

12#
发表于 Post on 2019-4-16 21:31:56 | 只看该作者 Only view this author
个人觉得虽然也许perl的开发者最初是把perl作为一种胶水语言来处理的,而由于它强大的正则表达式处理能力,所以基本上变成了一种文本处理工具。而python很适合作为一种胶水语言。shell看人吧,sed和awk都可以单独作为一门语言来学习,逻辑太复杂的时候不好用,简单的文本处理,尤其是只需要读一遍就能处理完的文档,用shell还是很高效的,很多时候只需要一行就能解决问题。

230

帖子

0

威望

2653

eV
积分
2883

Level 5 (御坂)

13#
发表于 Post on 2019-4-20 09:50:57 | 只看该作者 Only view this author
那段awk写错了吧,a到g几个一直当普通变量用,最后怎么当成数组了?

16

帖子

0

威望

818

eV
积分
834

Level 4 (黑子)

14#
发表于 Post on 2019-12-18 09:27:04 | 只看该作者 Only view this author
ulosggs 发表于 2017-7-15 12:33
没必要
http://www.kuqin.com/abyteofpython_cn/
两三个小时就看完了

老师,网站失效了,还有别的途径吗

5

帖子

0

威望

49

eV
积分
54

Level 2 能力者

15#
发表于 Post on 2020-7-21 16:02:57 | 只看该作者 Only view this author
冰释之川 发表于 2017-7-15 10:38
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学

python最经典的还是《python学习手册》,厚是厚一点,但认真看完绝对受益匪浅

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-23 18:54 , Processed in 0.308236 second(s), 27 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list