计算化学公社

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

[综合交流] 计算化学编程语言

  [复制链接 Copy URL]

103

帖子

5

威望

1012

eV
积分
1215

Level 4 (黑子)

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 sky 于 2017-7-11 10:54 编辑

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

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

为什么一定要学编程
当初我是因为电脑玩得好才入的计算坑,在某个组学计算的时候发现组里的人做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++了。对于大多做量化计算的人,我想处理的数据都达不到这个量级,那本文讨论的情况是完全适用的。





评分 Rate

参与人数
Participants 12
eV +57 收起 理由
Reason
1145075595 + 4 谢谢
energy1 + 1 谢谢
笙歌落 + 5 谢谢
hxmals + 4
Shine剪水 + 6 谢谢
明日又青山 + 4 赞!
rtransformation + 5 谢谢
乐平 + 5 赞!
liuxiaogang0206 + 5 谢谢
kevin + 5 好物!
sobereva + 8 欢迎讨论
yflchx + 5 欢迎讨论

查看全部评分 View all ratings

446

帖子

0

威望

7799

eV
积分
8245

Level 6 (一方通行)

2#
发表于 Post on 2016-7-30 11:16:01 | 只看该作者 Only view this author
写的挺好,支持。


我一直从工具的角度看,

语言也好,软件也好,

哪个好用用哪个。所以,我觉得个人喜好至关重要。

3097

帖子

29

威望

1万

eV
积分
17098

Level 6 (一方通行)

3#
发表于 Post on 2016-7-30 11:24:49 | 只看该作者 Only view this author
yflchx 发表于 2016-7-30 11:16
写的挺好,支持。

我倒不觉得是“个人喜好至关重要”,而是每个语言设计之初就有其适于使用的范围,要做什么事情就应该用相应的(几种)语言。

35

帖子

0

威望

2317

eV
积分
2352

Level 5 (御坂)

4#
发表于 Post on 2016-7-30 14:58:11 | 只看该作者 Only view this author
很期待 楼主加油

121

帖子

1

威望

519

eV
积分
660

Level 4 (黑子)

5#
发表于 Post on 2016-7-30 15:54:57 | 只看该作者 Only view this author
写得很好,程序是给人服务的,能够满足自己的需求就好,没必要追求最快的语言。
233

236

帖子

0

威望

5064

eV
积分
5300

Level 6 (一方通行)

6#
发表于 Post on 2016-7-30 20:47:49 | 只看该作者 Only view this author
已star

1552

帖子

2

威望

6477

eV
积分
8069

Level 6 (一方通行)

给dalao们倒茶

7#
发表于 Post on 2016-7-30 21:33:33 | 只看该作者 Only view this author
程序是个好东西,我个人觉得程序就是专门做重复而且繁琐的东西,既不可将其神圣化(无论什么都用程序实现),也不能有不用程序的想法。楼主写的东西我感觉挺不错的,推荐的我也赞同。我感觉吧,Fortran学习学习还是不错的,python和perl我是没用过,一直都是C,Fortran,Shell script三者轮着用,哪个方便用哪个(PS:C出场的机会确实很少),对于有大量浮点数运算的,我还是首先会选择Fortran。
总结一下吧,搞计算的或多或少,一定要学习一点程序语言,否则有的东西处理起来真的是看似简单,动起手来又十分繁琐。然后就是,知道什么情况下,用什么样的语言较合适,这样就可以了。全部个人见解,如有意见请指正。

评分 Rate

参与人数
Participants 1
eV +1 收起 理由
Reason
sobereva + 1 欢迎讨论

查看全部评分 View all ratings

淡泊以明志,宁静以致远。

103

帖子

5

威望

1012

eV
积分
1215

Level 4 (黑子)

8#
 楼主 Author| 发表于 Post on 2016-7-31 09:03:54 | 只看该作者 Only view this author
978142355 发表于 2016-7-30 21:33
程序是个好东西,我个人觉得程序就是专门做重复而且繁琐的东西,既不可将其神圣化(无论什么都用程序实现) ...

说实话,当初就是看到有人上来就学C来处理数据我才有写这篇文章的想法。
我没有用到大量浮点运算的地方,除了上老师课之外从未写过Fortran。没用过python的话,还是推荐试一试,shell script好用但是毕竟功能有限。

1552

帖子

2

威望

6477

eV
积分
8069

Level 6 (一方通行)

给dalao们倒茶

9#
发表于 Post on 2016-7-31 09:29:03 | 只看该作者 Only view this author
sky 发表于 2016-7-31 09:03
说实话,当初就是看到有人上来就学C来处理数据我才有写这篇文章的想法。
我没有用到大量浮点运算的地方 ...

因为我们的计算需要大量的浮点数,所以fortran我还是经常用的,不过脚本我一般还是首选。听LZ这么推荐,以及咱们论坛里LiyuanHe老师的使用,感觉python可能确实不错,我想我有C的基础,应该学的很快吧。
淡泊以明志,宁静以致远。

198

帖子

0

威望

2242

eV
积分
2440

Level 5 (御坂)

10#
发表于 Post on 2016-7-31 12:20:52 | 只看该作者 Only view this author
期待楼主继续发帖,本人小白,一直都想学些计算机的知识,现在还在shell脚本的基础挣扎,期待自己有一天也能把这些工具用的很好。
给楼主手动点赞!!!
站在宇宙中心呼唤爱

98

帖子

1

威望

2834

eV
积分
2952

Level 5 (御坂)

11#
发表于 Post on 2016-8-1 18:30:49 | 只看该作者 Only view this author
学习了,希望看到下一篇!

146

帖子

0

威望

1313

eV
积分
1459

Level 4 (黑子)

12#
发表于 Post on 2016-8-13 12:16:02 | 只看该作者 Only view this author
很棒的帖子!期待楼主更新,很想学习一下!目前菜鸟一只。。

155

帖子

0

威望

2876

eV
积分
3031

Level 5 (御坂)

13#
发表于 Post on 2016-8-13 22:28:39 | 只看该作者 Only view this author
python使用起来真的很爽,写起来相当舒服。再加上perl已经能够很好的完成我的工作了

54

帖子

0

威望

2286

eV
积分
2340

Level 5 (御坂)

14#
发表于 Post on 2017-1-9 22:53:21 | 只看该作者 Only view this author
楼主给推荐一些Python和Perl的入门书籍或者其他学习资料吧

1

帖子

0

威望

9

eV
积分
10

Level 1 能力者

15#
发表于 Post on 2018-12-24 10:36:15 | 只看该作者 Only view this author
本帖最后由 AEYOU 于 2018-12-24 10:38 编辑

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

本版积分规则 Credits rule

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

GMT+8, 2025-8-15 07:26 , Processed in 0.283588 second(s), 27 queries , Gzip On.

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