计算化学公社

标题: 求助,关于加速SCF计算 [打印本页]

作者
Author:
zha23    时间: 2022-3-26 23:31
标题: 求助,关于加速SCF计算
目前我实现了通过direct-SCF计算单点能,并通过CDIIS+EDIIS来加速收敛。对于很小的分子如水,甲烷和氨气都可以得到和现有的程序效率相当(psi4,pyscf),但是随着体系增大和原子数目变多,速度会变得很慢,迭代的次数基本一样。以下列出我的程序和psi4计算正烷烃的结果,蓝线为我的结果,橙线为psi4的结果。可以看出我的结果基本为O(N^2)的标度,而psi4基本为线性,pyscf测试结果基本一样。

psi4等成熟的计算软件一般都采用了一些加速方法。比如direct SCF提出时库伦矩阵和交换矩阵是同时计算的,但现在方法其为分开计算的,J可以通过density fitting和FMM线性标度计算,而K矩阵也有计算方法。density fitting在测试过程中并不会使得计算时间有几倍的差距,所以我认为是FMM加速了计算,但是FMM实现十分复杂,我怕我理解错了。所以我想弄明白是哪种方法使得计算如此快,除了FMM还有其他方法吗,FMM是否十分重要。

作者
Author:
wzkchem5    时间: 2022-3-26 23:40
FMM和传统方法的crossover没有这么早,大概在60个原子左右,对于一维体系可能早一些,但也不会在乙烷就crossover。所以我觉得psi4、pyscf的线性标度可能其实是常数时间overhead+O(N^2)标度的结果,不是真线性标度。
你做Schwarz prescreening了吗?另外积分库是调用的现成的库还是自己写的积分代码?分子增大以后高角动量积分,比如(dd|dd)占总积分的比例会增加,如果高角动量积分算得不够快,可能就会出现你看到的这种现象。
作者
Author:
zjxitcc    时间: 2022-3-26 23:41
本帖最后由 zjxitcc 于 2022-3-26 23:42 编辑

施瓦兹不等式筛选积分、incremental Fock等技术考虑了没?这些程序里是否有开启?你的程序或其他程序用了点群对称性加速么?关了没?
作者
Author:
zha23    时间: 2022-3-26 23:43
用了施瓦兹不等式,积分库用的是libcint,其他程序的对称性都关了。
作者
Author:
zha23    时间: 2022-3-26 23:44
zjxitcc 发表于 2022-3-26 23:41
施瓦兹不等式筛选积分、incremental Fock等技术考虑了没?这些程序里是否有开启?你的程序或其他程序用了点 ...

麻烦问一下,什么是incremental Fock
作者
Author:
zha23    时间: 2022-3-26 23:46
如果是用密度矩阵的差值更新Fock矩阵做了。
作者
Author:
zha23    时间: 2022-3-27 00:05
我猜还可能是用了半direct方法,存储了部分的双电子积分,但我不知道这时是如何存的,如果用数组存储,在用的时候如何快速查找以及存储的标准是什么,各位大佬可以麻烦解答一下吗。
作者
Author:
wangxubo    时间: 2022-3-27 05:07
密度拟合你在测pyscf的时候没主动开,就是没开,scf也都是direct的。还是多从screening的技巧上去提速吧
作者
Author:
Freeman    时间: 2022-3-27 12:47
zha23 发表于 2022-3-26 23:44
麻烦问一下,什么是incremental Fock

如果不用incremental fock,那么每一次迭代都要完整地算一遍电子积分,完整地构建fock矩阵。incremental fock好像是用近似的办法,从前一步的fock矩阵推出后一步的fock矩阵,可以帮direct-scf省很多时间。如果用orca做direct-scf的话,能从输出文件中看到哪些步是incremental fock来的,哪些步是完整地构建fock矩阵来的。
作者
Author:
hebrewsnabla    时间: 2022-3-27 14:29
AO积分的8-fold对称性考虑了吗?既然你是用libcint做积分,这一块可以参考pyscf/lib/vhf/nr_direct.c

如8楼所说,pyscf默认不开密度拟合。不过体系过小的时候scf是incore的。

prescreening可以参考pyscf/lib/vhf/optimizer.c

据我所知pyscf应该没有FMM。

有没有检查决速步是哪一步?电子积分以外的步骤(如张量运算)不能太慢。


作者
Author:
zha23    时间: 2022-3-27 20:39
多谢各位,问题找到了,是screening时我是每次计算积分前都要在差值密度矩阵中寻找一对shell的最大值,这样就要慢很多,我看了pyscf的代码他是提前将这一部分算好的,这样可以节省很多时间。




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