计算化学公社

标题: 询问DFT格点积分的细节 [打印本页]

作者
Author:
Freeman    时间: 2025-10-13 01:43
标题: 询问DFT格点积分的细节
本帖最后由 Freeman 于 2025-10-13 01:50 编辑

大家好。我已经实现原子轨道基DFT很久了,但是速度一直提不上去。研究了很久以后,现在我觉得,慢的原因是我没有利用到基函数-格点矩阵的稀疏性。比如有一个大分子,它最左边的原子的基函数在最右边原子周围的格点上的值就几乎为零了。在一个格点上遍历基函数时,只要遍历那些在该格点上有明显大于零的值的基函数就可以了,而我的程序则遍历了所有基函数,所以很慢。我想询问一下具体是怎样实现的。我设想了两种可能的实现方式。

一、每个格点是一个单位。在一个格点上,只记录非零的基函数,这样做的缺点是,当计算XC能量和Fock矩阵时,要对格点求和,而因为每个格点都是独立的对象,缓存命中率将会极低,还是会浪费很多时间。

二、每个原子产生的所有格点是一个单位。对于同一个单位的所有格点,记录该原子和相邻几个原子的所有基函数。这样一来,格点就是一批一批的了,求和时缓存命中肯定会很好,但是缺点是格点的独立性就没那么理想了:某个基函数在同一个单位的两个格点上,可能一个是非零,一个是零。保险起见,只好都当成非零值了,这就把一些冗余的零值纳入了计算。

主流的程序都是怎么做的呢?请大佬给我解惑。谢谢!

作者
Author:
卡开发发    时间: 2025-10-13 08:33
或许你可以参考FHI-aims的做法(DOI:10.1016/j.cpc.2020.107314),不过那个batch在处理的时候没那么简单,我不太懂,但愿能帮到你。
作者
Author:
wzkchem5    时间: 2025-10-13 10:34
确实需要分batch,但不是每个原子的所有格点都是一个batch,那样的batch太大了。
一般取一个较小的2的幂作为batch size,例如ORCA的默认batch size是64,BDF是128。一般把相近的若干格点作为一个batch,这些格点可以属于一个原子(代码写起来简单),也可以不属于。
作者
Author:
Freeman    时间: 2025-11-13 16:32
卡开发发 发表于 2025-10-13 08:33
或许你可以参考FHI-aims的做法(DOI:10.1016/j.cpc.2020.107314),不过那个batch在处理的时候没那么简单 ...

谢谢!那篇文献里确实有我要找的东西。
作者
Author:
RTChou    时间: 2025-11-17 18:20
如果使用julia,有专门的稀疏矩阵相关的数学包,arpack,sparsearrays等




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