|
|
双电子积分因为有八重对换对称性(ab|cd)=(ab|dc)=......,不需要全部算完,只要算n*(n+1)*(n*(n+1)/2+1)/4≈n^4/8个unique quartets即可。筛选这些unique quartets一般使用这种算法:
- for A=1,nshells # 遍历所有unique shell quartets
- for B=1,A
- for C=1,A
- for D=1,(A==C?B:C) # 三目运算符,指当A=C时,D最大取值为B,否则为C
- compute all unique quartets in (AB|CD) # 计算(AB|CD)里的所有unique basis function quartets
- end for
- end for
- end for
- end for
复制代码 我发现这样的算法可能有问题,因为有的basis function quartets本身是unique的,但是却隐藏在非unique的shell quartets里面,于是被以上算法遗漏。
举个例子来说,假如我的基组里有一个S壳层(壳层编号0,内含基函数编号0)和一个P壳层(壳层编号1,内含基函数编号1、2、3),如果按照上述算法筛选unique basis function quartets,就会遗漏四个。这四个是(20|11)、(30|11)、(30|21)、(30|22),满足b<=a, c<=a, d<=(a==c?b:c)的unique basis function条件,但是它们所属的(10|11)却不满足B<=A, C<=A, D<=(A==C?B:C)的unique shell条件。另外,按照第一段的公式计算可得unique basis function总数为55,但上述算法只能筛出51个,正好缺了这四个unique basis function quartet。
细思极恐之处在于,我在很多文献、书籍、代码里都看到了上述算法,说明这个有遗漏unique quartet嫌疑的算法可能正广泛应用于各个计算化学软件。难道这些软件的结果都有问题吗?
几个使用可疑算法之处:
1. Dupuis, M. and King, H.F. (1977), Molecular symmetry and closed-shell SCF calculations. I. Int. J. Quantum Chem., 11: 613-625. https://doi.org/10.1002/qua.560110408 公式62的L的上限为min(B,C)而非上述可疑算法的(A==C?B:C),但筛出的个数也不对。
2. 《Parallel Computing in Quantum Chemistry》Figure 7.1
3. Libint2的示例libint/tests/hartree-fock/hartree-fock.cc的compute_2body_fock函数
附上我写的计算unique quartet个数的脚本,能给出(1)公式n*(n+1)*(n*(n+1)/2+1)/4算出的、(2)上述可疑算法数出来的和(3)我自己想到的大概正确的算法数出来的个数。
shell.py
(1.97 KB, 下载次数 Times of downloads: 4)
|
|