存储问题
电子在轨道中的排布实际上就是一个排列组合问题,每种排布方式称为一个“组态”(configuration),排布时需要考虑电子是不可区分的而轨道是可区分的。事实上,“轨道”(orbital)这个概念在量子力学中并不是准确的,这与天文学中的“轨道”(orbit)不同。电子并不会在一个特定的圆周上运动,而是在从原子核表面到无穷远处的整个空间内都可能存在,只不过不同位置的分布概率有差异。所以为了精确描述电子的分布,应该使用无穷多个轨道,包含从原子核表面到空间无穷远处的整个空间。这种情况称为“基组极限”,显然实际上不可能做到。更多的轨道会使计算更加精确,但是也会使电子组态数目更大。假设我们有这样一个体系,该体系由 40 个轨道、20 个 alpha 电子和 20 个 beta 电子组成(这样总自旋为 0,因为 alpha 电子与 beta 电子的数目相等),因为总的组态空间等于 alpha 空间与 beta 空间的直积,若不考虑对称性等额外因素,则总的组态数目为
这个数字大约等于 1.9E22。那么这些组态构成的哈密顿矩阵元的数目等于组态数目的平方,即 3.6E44 项。假设每一个矩阵元都用 64 位双精度浮点数来保存,那么此哈密顿矩阵需要 2.6E33 TB 的内存空间。即使考虑到哈密顿矩阵是实对称矩阵,保存时只保留上三角部分或下三角部分,那也无非是将占用空间减小一半。即使再使用点群对称性进一步简化,也不会改变这个矩阵不可能用目前世界上任何设备保存下来的事实,并且并不是任何体系都能使用点群对称性。实际上 40 个轨道只是很常见的体系的大小,并且这样大小的计算是不够精确的。实际计算中,我们可能会遇到几百个轨道的情况。这时候保存哈密顿矩阵显然不可能。一般的计算程序在处理这个问题的时候都采用所谓“direct”的方式,即需要用到某个矩阵元的时候才去计算此矩阵元的数值。这就引出了下一个问题:矩阵元的计算效率。
矩阵元的计算效率
从之前两篇文章(http://blog.youkuaiyun.com/luozhen07/article/details/78701311 和 http://blog.youkuaiyun.com/luozhen07/article/details/78703872)的推导和代码中,我们可以看到行列式哈密顿矩阵元的计算主要涉及激发次数计算、激发模式(即电子产生和湮灭的位置)寻找、相位符号的计算以及单双电子积分的读取。参考文章 http://blog.youkuaiyun.com/luozhen07/article/details/78703872 中的 CI::H_ij(det_i,det_j,integrals,norb)
函数,这个函数大致的复杂度为 O(n^2)
,其中 n
为行列式中的电子数。对于多组态波函数的哈密顿矩阵元,还需要对左矢和右矢波函数中的所有行列式都做遍历,故函数 H_ij(set_i,set_j,integral