本帖最后由 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
- C/C++和Fortran的优势在于速度快,但除非是写量化程序,否则这个快是没有意义的。现代计算的处理速度对于一般人而言绰绰有余。我用Perl写的数据处理脚本,处理两百多万行的vasp输出文件仅需两三秒,C/C++和Fortran再快也就能节省一两秒钟,没有任何实际意义。
- C/C++和Fortran的学习成本很高(相比于python),并且开发效率极低。用Python一个小时写出的功能,用C/C++和Fortran花一天时间也不见得能写出来。而且在所有主流编程语言中,C/C++是最难学的语言,没有之一。深入理解该语言需要很多底层的计算机知识和硬件知识,其中各种陷阱更是无数。没有个两三年的编程经验,都不敢说自己懂C/C++。
- 对于自己写小程序的人酌情考虑。如果需要写的是运算量非常大的程序,或者用python写出的程序要跑两三天,那可以考虑Fortran. Fortran的速度可以跟C/C++媲美,最重要的是学习成本低(相比于C/C++)。
作为非计算机专业人士,学编程就应该学那种半天就能看懂,一天就能上手写项目的语言。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++了。对于大多做量化计算的人,我想处理的数据都达不到这个量级,那本文讨论的情况是完全适用的。
|