计算化学公社

标题: 计算化学编程语言 [打印本页]

作者
Author:
sky    时间: 2016-7-30 10:47
标题: 计算化学编程语言
本帖最后由 sky 于 2017-7-11 10:54 编辑

在搞计算化学的几年间接触过不同的几个组,发现无论学术水平高低,计算机水平都比较落后。毕竟大家都是以学术为主,而且不少人还是因为贪图计算化学不用做实验才入坑的,对计算机一无所知。看着不少人,甚至高水平组的人,用着简陋的工具,白底黑字的登录界面,实在是不忍直视;很多人对linux不熟悉,对编程不了解,明明一个小时能干完的活却要花费一整天。所以我就有了写一系列有关计算化学中计算机知识的想法,希望能借此传播计算机知识,提高工作效率。也希望能与更多的人交流经验。
我本人是计算机爱好者,当初也是因为对计算机的喜爱而入的坑。所以文章将以计算机方面的知识为主。这篇文章是本系列的第一篇文章,就先讨论一下计算化学编程语言的问题。

我想这是很多人在入门量化的时候纠结过的问题,要不要学编程?学什么语言?我在入门的时候也纠结过,先后学过Fortran,C++,perl等语言,期间走过很多弯路,在此写下一些经验教训供人参考。
先上结论,除非你的专业是写量化计算程序的,否则不要碰C/C++, Fortran能读懂就行。除此之外还要把linux玩熟,并且学会以下几种语言:

为什么一定要学编程
当初我是因为电脑玩得好才入的计算坑,在某个组学计算的时候发现组里的人做vasp的节奏是先用gaussian view建好模型,再手动将文件格式改成vasp的输入文件。计算完成之后,要打开输出文件,找到原子坐标,手动转换成gjf文件在用gaussian view。大量地时间消耗在了这些毫无意义地数据处理、格式转换上。
为什么说「量化穷三代,计算毁一生」? - 化学,最高票答主余旷就提到:
“博士第二年,你终于学会了用vi和linux工作,发现你一天的活师兄半小时就可以干完,于是你开始学bash和python。”
计算机最大的好处之一就是能节省大量重复性的工作,身为化学中跟计算机联系最紧密的专业,就要利用好这些优势。在这几年中我写了很多脚本或者程序来辅助我工作,常常是别人要忙活半天的事,我只需要敲一下键盘就行了,这些脚本大大提升了我的工作效率。不仅如此,我还可以根据自己的需求来定制一些功能。比如我写的freqmov.pl就是一个把vasp频率计算中的频率做成动画的脚本。
以下是我这几年工作中用到的全部脚本,现在分享出来供大家用:
GitHub - Mabinogiysk/VASP-script

下面来谈谈编程语言的选择,仅涉及C/C++, Fortran, Shell Script, Perl,Pyhton.
犹记得我刚入行时看到软件都是Fortran写的,所以想着一定要把Fortran学会。可之后又有人说C/C++更快,于是又纠结于学C/C++还是Fortran.我想很多刚入行的人也有跟我当时一样的困惑。

首先要明白你学语言的目的是什么
在我看来学编程语言无非这么几个用处:
前两者不在讨论范围,那必然是C/C++或Fortran必学一个了。在我看来,大部分的人都属于后两者。对于这部分人,我是强烈不推荐学C/C++和Fortran的。

为什么不学C/C++和Fortran

作为非计算机专业人士,学编程就应该学那种半天就能看懂,一天就能上手写项目的语言。Python无疑是其中的佼佼者,python语法贴近自然语言,简单易懂,网上还有大量的参考资料和教程。在慕课,网易云课堂等在线学习网站也有相应的视频教学和练习。

Python还有一个巨大的优势就是兼容C语言,这也就使得他和C/C++的速度差距缩小了。先用Python开发出整个程序,再在性能瓶颈处用C语言改写。量化程序About — ASE documentationASE就是用python写的,使用容易,功能强大,计算小分子完全不是问题。其矩阵运算的部分就是用C语言写的。

Perl和Python选一个学就行,我个人比较推崇Perl是因为其强大的数据处理能力。Perl的前身是用于文本处理和系统管理的语言,在工业界有极为广泛的应用,只是最近十年由于Python的崛起而有些衰落。其文本处理能力,代码简洁程度我认为是优于python的,我尤其喜欢perl内置的正则表达式,比python方便很多。

顺便插一句,要想更好地处理数据,正则表达式是一定要学的,无论你用的是perl, python, 还shell script.
shell script是linux内置的脚本语言,功能有限,但是写起来简单快捷,主要用于完成一些重复性地工作。用linux的人是离不开shell script的,我的电脑上也有大量的shell script脚本,提交计算任务后自动生成INCAR文件,自动调用不同版本的vasp,当一个计算完成后自动开始下一个计算,自动清理,自动备份等等,可以节省相当的工作量。以后会专开一篇文章讲shell script的作用。
-------------------------------------------------------------------------
2017-7-11更新
曾有人评论过说做分子动力学要处理几个G的文件。对于这种情况,那当然最好用C/C++了。对于大多做量化计算的人,我想处理的数据都达不到这个量级,那本文讨论的情况是完全适用的。






作者
Author:
yflchx    时间: 2016-7-30 11:16
写的挺好,支持。


我一直从工具的角度看,

语言也好,软件也好,

哪个好用用哪个。所以,我觉得个人喜好至关重要。
作者
Author:
liyuanhe211    时间: 2016-7-30 11:24
yflchx 发表于 2016-7-30 11:16
写的挺好,支持。

我倒不觉得是“个人喜好至关重要”,而是每个语言设计之初就有其适于使用的范围,要做什么事情就应该用相应的(几种)语言。
作者
Author:
wull    时间: 2016-7-30 14:58
很期待 楼主加油
作者
Author:
菩城    时间: 2016-7-30 15:54
写得很好,程序是给人服务的,能够满足自己的需求就好,没必要追求最快的语言。
作者
Author:
get-it    时间: 2016-7-30 20:47
已star
作者
Author:
978142355    时间: 2016-7-30 21:33
程序是个好东西,我个人觉得程序就是专门做重复而且繁琐的东西,既不可将其神圣化(无论什么都用程序实现),也不能有不用程序的想法。楼主写的东西我感觉挺不错的,推荐的我也赞同。我感觉吧,Fortran学习学习还是不错的,python和perl我是没用过,一直都是C,Fortran,Shell script三者轮着用,哪个方便用哪个(PS:C出场的机会确实很少),对于有大量浮点数运算的,我还是首先会选择Fortran。
总结一下吧,搞计算的或多或少,一定要学习一点程序语言,否则有的东西处理起来真的是看似简单,动起手来又十分繁琐。然后就是,知道什么情况下,用什么样的语言较合适,这样就可以了。全部个人见解,如有意见请指正。
作者
Author:
sky    时间: 2016-7-31 09:03
978142355 发表于 2016-7-30 21:33
程序是个好东西,我个人觉得程序就是专门做重复而且繁琐的东西,既不可将其神圣化(无论什么都用程序实现) ...

说实话,当初就是看到有人上来就学C来处理数据我才有写这篇文章的想法。
我没有用到大量浮点运算的地方,除了上老师课之外从未写过Fortran。没用过python的话,还是推荐试一试,shell script好用但是毕竟功能有限。
作者
Author:
978142355    时间: 2016-7-31 09:29
sky 发表于 2016-7-31 09:03
说实话,当初就是看到有人上来就学C来处理数据我才有写这篇文章的想法。
我没有用到大量浮点运算的地方 ...

因为我们的计算需要大量的浮点数,所以fortran我还是经常用的,不过脚本我一般还是首选。听LZ这么推荐,以及咱们论坛里LiyuanHe老师的使用,感觉python可能确实不错,我想我有C的基础,应该学的很快吧。
作者
Author:
kevin    时间: 2016-7-31 12:20
期待楼主继续发帖,本人小白,一直都想学些计算机的知识,现在还在shell脚本的基础挣扎,期待自己有一天也能把这些工具用的很好。
给楼主手动点赞!!!
作者
Author:
lindlar    时间: 2016-8-1 18:30
学习了,希望看到下一篇!
作者
Author:
珊珊来迟    时间: 2016-8-13 12:16
很棒的帖子!期待楼主更新,很想学习一下!目前菜鸟一只。。
作者
Author:
dark_cosmos    时间: 2016-8-13 22:28
python使用起来真的很爽,写起来相当舒服。再加上perl已经能够很好的完成我的工作了
作者
Author:
caofan_success    时间: 2017-1-9 22:53
楼主给推荐一些Python和Perl的入门书籍或者其他学习资料吧
作者
Author:
AEYOU    时间: 2018-12-24 10:36
本帖最后由 AEYOU 于 2018-12-24 10:38 编辑

感谢分享。先Mark一下。虽然入行才一周,但发现自己确实对这个挺感兴趣的。很赞同楼主的观点:重复的工作一定要用代码解决。之所以来这里,也是源于此。师姐给了一个shell脚本,用来生成POSCAR的。但每生成新的POSCAR后,INCAR中相应的数值也要改。组里同学或者没改,或者手动改。但我想在师姐给的那个shell脚本基础上自己再写个新脚本,把这两个工作一起搞定。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3