请选择 进入手机版 | 继续访问电脑版

计算化学公社

 找回密码
 现在注册!
查看: 1321|回复: 15

[其它量化程序] PySCF测评

[复制链接]

152

帖子

2

威望

1333

eV
积分
1525

Level 5 (御坂)

发表于 2018-8-1 05:38:16 | 显示全部楼层 |阅读模式
本帖最后由 Accelerator 于 2018-8-4 23:00 编辑

    经大家指正并确认过后发现PySCF默认是全核并行的,因此实际上与Gaussian相比并无速度优势。

    PySCF是用Python写的量子化学程序。程序提供简单,轻量级的高效平台,用于量子化学计算和代码开发。当前版本可以在一个SMP节点上有效地操作中等尺寸体系(大约3000基函数,1000电子)。
(以上复制自量子化学网)

    PySCF的安装非常简单,运行pip install pyscf即可。用PySCF进行计算需要编写Python脚本。在这里以苯乙炔的单点能为例。
  1. <font face="宋体" size="2">import datetime
  2. startTime=datetime.datetime.now()
  3. from pyscf import gto
  4. mol=gto.Mole()
  5. mol.atom=' C                  3.23425500    0.00028800    0.00000500;\
  6. C                  2.02419900   -0.00014700    0.00000000;\
  7. H                  4.30046100   -0.00092300   -0.00003200;\
  8. C                  0.59427700   -0.00006400    0.00000300;\
  9. C                 -0.11989600    1.21305600   -0.00000200;\
  10. C                 -0.11999300   -1.21311200    0.00000200;\
  11. C                 -1.51250400    1.20860200    0.00000100;\
  12. H                  0.42865400    2.14989400   -0.00000300;\
  13. C                 -1.51261100   -1.20854100   -0.00000200;\
  14. H                  0.42847400   -2.15000300    0.00000200;\
  15. C                 -2.21304900    0.00005500   -0.00000100;\
  16. H                 -2.05292200    2.15133500    0.00000200;\
  17. H                 -2.05309200   -2.15123800   -0.00000200;\
  18. H                 -3.29963800    0.00010900   -0.00000100'
  19. mol.basis='def2tzvp'
  20. mol.max_memory=2000
  21. from pyscf import dft
  22. scf=dft.RKS(mol)
  23. scf.xc='pbe0'
  24. scf.kernel()
  25. endTime=datetime.datetime.now()
  26. print (endTime-startTime).seconds</font>
复制代码
    首先通过gto定义分子构型。gto的属性包含了基组(basis),电荷(charge),自旋多重度(spin),同位素(mass)等,定义方式非常自然。例如基组既可以用上述字符串定义,如果希望使用混合基组,也可以用数组定义。以下是官网给出的例子。
mol.symmetry = 1mol.charge = 1mol.spin = 1mol.nucmod = {'O1': 1}mol.mass = {'O1': 18, 'H': 2}    PySCF的官方文档上写分子构型中不同原子可以通过分号或换行分隔,所以如果直接读取xyz文件的话应该可以不作处理。不过由于字符串中间直接换行是不合语法的,像现在这样手动输入坐标的话就还是要在换行处补加斜杠了,因此也顺便加上了分号。PySCF对笛卡尔坐标和内坐标均支持。
    PySCF官网并没有列出其内置的基组。Rita一开始尝试在basis中指定6-311+G(d,p)报错后在报错信息中找到了内置基组的存放位置(/usr/local/lib/python2.7/dist-packages/pyscf/gto/basis/),找到了内置基组的列表。
1.png
对cc和def2系列基组支持相当完备,cc支持到5-zeta,带弥散的只支持无止尽的八月。Def2系列包含一系列RI辅助基组;完整内置pc和pcseg系列。这些基组的输入形式比较自由,如cc-pvtz, ccpvtz等均可。
2.png
Pople系列基组的文件名称就显得有些诡异。经过尝试,输入6-31G(d)可以识别,但6-311+G(d,p)就不行,要写作6-311+G**.
执行上述文件输出到test1.log里,可以看到计算得到的能量,用时80 s. 默认的输出详细度下只输出了能量的数值。
作为能量和效率的对比,用Gaussian进行相同的计算(并设置使用的内存同为2000 MB)。G09给出的能量是-308.124621981,与PySCF基本相同,用时为318 s。
为了一探Gaussian为什么比PySCF慢这么多,把PySCF的输出详细程度调到最大(scf.verbose=9,一般设到4或5即可得到需要的信息),同时也看一看PySCF的“noisy”模式会输出什么。
3.png
每一次迭代都会输出这样一大串信息。由此可以看出SCF收敛限为1E-9,比Gaussian的默认收敛限还要严格一个数量级;整个任务经过11次迭代,比Gaussian少4次,不过也不足以解释巨大的时间差。因此PySCF的速度优势应当是在算法的某处。所以即使Gaussian的双电子积分几乎是令人绝望的优秀,但在其他地方的效率还是有很多可以优化之处的。顺带一提PySCF的DFT默认没有开RI(可以通过with_df.auxbasis属性设置),如果再开RI应该还会更快。
尝试了def2基组之后,再来看一看PySCF对Gaussian最擅长的Pople基组的表现。6-311+G(d,p)在PySCF里要写作6-311+G**。本次计算用时57 s,能量-308.090572698915;Gaussian用时43 s,能量-308.090450328。Gaussian对Pople基组的效率还是相当好的。
接下来测试UDFT。首先是苯乙炔的三重态,用PBE0/def2-SVP算单点。注意这里的mol.spin指定的是alpha电子减去beta电子,因此等于自旋多重度-1.这里输出详细度指定为4,就只输出了每一轮迭代的能量。计算在22 s完成,能量为-307.661565969255。Gaussian在相同水平下的计算用时51 s,能量-307.665874496。在官方手册上波函数稳定性分析部分神奇地留空了。在下方给出了一个自动调节自旋态的功能,在这个例子中虽然没有指定氧气的自旋态,但如果使用UHF,通过addons的设置可以自动收敛到三重态基态。很想试验一下这个功能,但发现似乎只能用于UHF,不支持将UKS的mf对象作为参数(之前的代码中把scf用作了对象的名称,但现在如果import scf的话就只能用其他名称了)。由于手册里相应部分留空,很好奇PySCF里是否有波函数稳定性分析的功能。
  1. from pyscf import gto, scf
  2. mol = gto.M(atom='O 0 0 0; O 0 0 1')
  3. mf = scf.UHF(mol)
  4. mf.verbose=4
  5. mf = scf.addons.dynamic_sz_(mf)
  6. mf.kernel()
  7. print('S^2 = %s, 2S+1 = %s' % mf.spin_square())
复制代码
PySCF的DFT有一个好玩的特性,即可以自定义泛函。对于范围分离泛函可以通过omega属性指定omega值。不过手册里没有提到双杂化泛函,由于其使用了Libxc的泛函库,去查了Libxc的手册,其中也没有双杂化相关内容。看起来是不能使用双杂化了。
  1. from pyscf import gto, dft
  2. mol = gto.M(atom='H  0  0  0; F  0.9  0  0', basis='6-31g')
  3. mf = dft.RKS(mol)
  4. mf.xc = 'HF*0.2 + .08*LDA + .72*B88, .81*LYP + .19*VWN'
  5. mf.kernel()
  6. mf.xc = 'HF*0.5 + .08*LDA + .42*B88, .81*LYP + .19*VWN'
  7. mf.kernel()
  8. mf.xc = 'HF*0.8 + .08*LDA + .12*B88, .81*LYP + .19*VWN'
  9. mf.kernel()
  10. mf.xc = 'HF'
  11. mf.kernel()
复制代码
PySCF的RI效率如何呢;在一开始的代码里SCF部分改成如下内容:
  1. <font face="宋体" size="2">from pymf import dft
  2. mf=dft.RKS(mol)
  3. mf.xc='pbe0'
  4. mf.verbose=4
  5. mf = mf.density_fit()
  6. mf.kernel()</font>
复制代码
以默认的辅助基组进行RI.用时只降低了4 s。在mf =mf.density_fit()后面写mf.with_df.auxbasis = 'def2-tzvp-ri'指定辅助基组,耗时也只从80 s降低到了74 s。不过不加RI本身就已经这么快了,这样的成绩也算是可以接受。
然后是PySCF的CASSCF功能。仍然以苯乙炔为例,考虑到CASSCF一般比较慢,所以基组小至6-31G(d),活性空间取(4,4)。写法如下:
  1. <font face="宋体" size="2">mol.basis='6-31G*'
  2. mol.max_memory=2000
  3. from pyscf import scf, mcscf
  4. mf = scf.RHF(mol).run()
  5. mc = mcscf.CASCI(mf, 4, 4)
  6. mc.kernel()</font>
复制代码
令人震惊的是仅仅3 s计算就结束了。得到能量为-306.401162634104。索性将活性空间扩大到(10,10),计算用时4 s, 能量为-306.42444538471。接下来将活性空间扩大到(54,54)(PySCF也有FCI功能),10分钟没有算完,放弃。此外PySCF也可以手动指定纳入活性空间的轨道标号。
相较之下Gaussian在(4,4)的活性空间下用时119 s,收敛失败。xswl
除此之外PySCF里还有一些有用的特性:
可以自定义哈密尔顿
可以生成任意原子轨道积分;此外PySCF还提供了libcint积分库的接口可以自己退(划掉)自己用
可以做轨道定域化
可以算周期性体系(手册上写了很多,不知道这个功能怎么样)
可以提取解析梯度(手册上解析梯度只介绍了HF,而Heissian虽然有这一条目但也是空的。尝试写grad.RKS但报错了)

PySCF不支持的功能
隐式溶剂化
既然梯度和Hessian那么有限应该不能用来做几何结构优化和频率计算
之前提到过的双杂化泛函
耦合簇只支持CCSD和CCSD(T),不支持DLPNO(但支持F12)

由此来看,Pyscf如果要与主流量化软件抗衡还远远不够。不过由于其开源以及Python易于扩展的特性,很高的计算效率,以及可以调泛函调积分等功能,作为新的泛函等的开发工具,或是为一些需求不超出其功能范围的程序提供快速计算,无疑是十分有吸引力的。

本文首先发表在了自己的公众号“Rita是美少女”上;鉴于论坛上似乎还没有有关PySCF的讨论就转过来了。

评分

参与人数 2威望 +1 eV +4 收起 理由
ymygca + 4 好物!
sobereva + 1

查看全部评分

1万

帖子

25

威望

1万

eV
积分
34891

管理员

公社社长

发表于 2018-8-1 06:01:04 | 显示全部楼层
Hessian误拼成了Heissian

关于"比Gaussian的默认收敛限还要严格一个数量级",这其实得看具体怎么定义的,Gaussian里同时用密度矩阵和能量作为判断标准,默认标准下对密度矩阵的要求已经严过头了,达到收敛的时候,大多数情况下能量变化已经远小于1E-9了。

DFT积分格点的设置不同,可以导致耗时相差非常大。G09默认的fine比多数程序都要高。6-311+G(d,p)下两个程序的结果其实差异也不算很小,我没用过PySCF,但怀疑积分格点可能比G09默认的低不少。

另外,指令集的利用也明显影响耗时。G09没有支持AVX2的版本,PySCF的积分库应该充分利用了AVX2。

Gaussian当基组里有f角动量的时候,诸如def2-TZVP,耗时会比不带f的猛增很多,可能PySCF这点占了优势。

PySCF的一个特色应该算是可以方便地做DMRG。
北京科音自然科学研究中心:http://www.keinsci.com  致力于计算化学的发展和传播,不定期开办各层次量子化学、分子动力学、波函数分析与Multiwfn程序等主题的培训。欢迎加入“北京科音”微信公众号获取培训最新消息和计算化学资讯
思想家公社的门口Blog:http://sobereva.com(发布大量原创计算化学相关博文)
Multiwfn主页:http://sobereva.com/multiwfn(最流行的量子化学波函数分析程序)
计算化学公社论坛:http://bbs.keinsci.com(高水平、高人气、综合性计算化学交流论坛)
思想家公社QQ群1号:18616395,2号:466017436。用于讨论理论、计算化学,两个群讨论范畴相同,可加入任意其一但不可都加入,申请信息必须注明具体研究方向,否则一概不批。研究方向和理论、计算化学无关者勿加,以免浪费宝贵的空位

此账号为诸Sobereva共用
Money and papers are rubbish, get a real life!

213

帖子

0

威望

1656

eV
积分
1869

Level 5 (御坂)

发表于 2018-8-1 09:47:05 | 显示全部楼层
我也感觉在高角动量时PySCF比高斯快很多。
PS1:在PySCF中使用自定义基组,令其基组数据完全与高斯一致,可使波函数方法(如HF, CASSCF)的电子能量与高斯在小数点后前6-8位一致(还依赖于收敛精度)。
PS2:PySCF有检测波函数稳定性的功能,例子如pyscf/examples/scf/17-stability.py。不过HF的收敛技巧和收敛性与高斯还无法相媲美。
PS3:自从用了PySCF的CASSCF之后,感觉飞上天,孙启明的黑科技二阶CASSCF啊
最后也推销一下自己参与的公众号“量子化学”,其中写了一系列安装PySCF和Block做DMRG及NEVPT2的帖子

62

帖子

1

威望

778

eV
积分
860

Level 4 (黑子)

发表于 2018-8-1 17:03:23 | 显示全部楼层
本帖最后由 ene 于 2018-8-1 22:49 编辑

确实效率很高啊,看来值得使用
PS. 话说这么比,不怕banned by Gaussian吗

178

帖子

3

威望

1412

eV
积分
1650

Level 5 (御坂)

发表于 2018-8-1 19:02:33 | 显示全部楼层
本帖最后由 Warm_Cloud 于 2018-8-1 19:07 编辑

很奇怪那个80s和318s 的,它是不是默认并行?

152

帖子

2

威望

1333

eV
积分
1525

Level 5 (御坂)

 楼主| 发表于 2018-8-1 21:49:38 | 显示全部楼层
zjxitcc 发表于 2018-8-1 09:47
我也感觉在高角动量时PySCF比高斯快很多。
PS1:在PySCF中使用自定义基组,令其基组数据完全与高斯一致, ...

不知道PySCF的CASSCF和molpro之类的专业软件比起来怎么样

152

帖子

2

威望

1333

eV
积分
1525

Level 5 (御坂)

 楼主| 发表于 2018-8-1 21:50:19 | 显示全部楼层
ene 发表于 2018-8-1 17:03
确实效率很高啊,看来值得使用
PS. 话说这么比,不怕baned by Gaussian吗

绝对会被ban的(x
被ban了就用ORCA 无所畏惧

152

帖子

2

威望

1333

eV
积分
1525

Level 5 (御坂)

 楼主| 发表于 2018-8-1 21:50:34 | 显示全部楼层
Warm_Cloud 发表于 2018-8-1 19:02
很奇怪那个80s和318s 的,它是不是默认并行?

这个确认过的,没有并行

62

帖子

1

威望

778

eV
积分
860

Level 4 (黑子)

发表于 2018-8-1 22:36:21 | 显示全部楼层
Accelerator 发表于 2018-8-1 21:50
绝对会被ban的(x
被ban了就用ORCA 无所畏惧

大牛风范啊

18

帖子

0

威望

654

eV
积分
672

Level 4 (黑子)

发表于 2018-8-2 01:00:29 | 显示全部楼层
算casscf可以指定dmrg,fciqmc还有shci作为fcisolver,这样你的(54,54)就也能算了.

178

帖子

3

威望

1412

eV
积分
1650

Level 5 (御坂)

发表于 2018-8-2 10:53:03 | 显示全部楼层
Accelerator 发表于 2018-8-1 21:50
这个确认过的,没有并行

我们自己测了一下,pyscf默认用并行,我们的电脑上耗时65s,高斯16耗时36s。你top一下再确认是不是有并行。

213

帖子

0

威望

1656

eV
积分
1869

Level 5 (御坂)

发表于 2018-8-2 11:18:20 | 显示全部楼层
PySCF默认是并行的,如misc.num_threads(n=4)可以设定并行核数。当然其中有些步骤(如Einstein求和)是串行的,这时候num_threads不起作用。有时候有些任务时间太短了,看不到并行也是可能的。

2347

帖子

9

威望

3960

eV
积分
6487

Level 6 (一方通行)

首席卖萌官

发表于 2018-8-2 15:14:37 | 显示全部楼层
传一个Pyscf 1.4版本的说明书

PySCF-1.4.pdf (986.16 KB, 下载次数: 36)
She doesn't love me.
Even so,
my heart has been taken away by her.

152

帖子

2

威望

1333

eV
积分
1525

Level 5 (御坂)

 楼主| 发表于 2018-8-4 22:59:20 | 显示全部楼层
感谢大家的更正。重新看了一下应该确实是默认全核并行的。这样的话PySCF实际上应该没有什么速度优势。

20

帖子

0

威望

58

eV
积分
78

Level 2 能力者

发表于 2018-8-5 02:41:26 | 显示全部楼层
Accelerator 发表于 2018-8-4 22:59
感谢大家的更正。重新看了一下应该确实是默认全核并行的。这样的话PySCF实际上应该没有什么速度优势。

吹上了天 呵呵
本尊都没出来吹
您需要登录后才可以回帖 登录 | 现在注册!

本版积分规则

手机版|北京科音自然科学研究中心|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949-1号 )

GMT+8, 2018-10-19 18:15 , Processed in 0.222902 second(s), 28 queries .

快速回复 返回顶部 返回列表