跳转至

零碎设置

我在文档中整理了一些可能对我的计算过程起到帮助的设置

level-shift

在SCF计算过程中,如果自旋轨道之间的能级间隙过于接近,那么可能会导致算法无法正确收敛,以及在某些体系中,alpha和beta轨道并不是简并的,这个时候就需要对自旋做一定的偏移使得体系更好的进行收敛

这种情况尤其在计算金属团簇体系的时候会出现,对这种大体系一般采用orca进行计算,可以在输入文件中指定level-shift,不写的话程序会在遇到问题的时候自动指定一个小的level-shift.

# Break alpha and beta degeneracy by applying different level shift
#
mf = scf.UHF(mol)
mf.level_shift = (0.3, 0.2)
mf.kernel()

双激发计算和无收缩基组

DHF即考虑了双重激发的HF计算方法,有一部分的电子关联

以计算HCL为例,考虑电子激发可以获得更精确的能量.

同时,对于一些复杂且重要的分子如H-CL中的Cl原子,我们可以考虑给原子指定不同的基组来加速计算,例如,指定Cl的基组为无收缩的ccpvdz基组,指定H的基组为普通的ccpvdz基组.

这两种基组的差别在于,收缩基组是固定好几个高斯函数前面的系数,将他们组合成为原子轨道后作为原子轨道基组,也就是说,在总组合中,这几个高斯函数的系数是一起变化的.

而无收缩基组就不固定高斯函数前的系数,在收敛迭代的过程中确定系数,这样的描述显然会更加精确:

pyscf中使用字典来制定原子轨道基组:

basis = {'Cl': 'unc-ccpvdz',
             'H' : 'ccpvdz'},

使用无收缩基组的时间成本会提升

converged SCF energy = -461.421612153775
计算时间:7.438036680221558
converged SCF energy = -463.392784627854
计算时间:10.732428073883057

弥散函数

在描述长程相互作用的时候,比如氢键或者一些带负电很多的负离子,我们需要在基组中加入弥散函数.

mol.basis = 'aug-ccpvdz'

没有在文档中找到其支持哪些弥散函数

fast_newton

这是一种比默认方法要快的优化方法,通常在构建自洽场对象的时候,在外面再套一层scf.fast_newton():

mf=scf.fast_newton(scf.RHF(mol))

但是经过试验,发现计算小分子的时候,还是默认方法更快,例如,下面是HCl的单点能计算结果:

converged SCF energy = -459.989656978441
快速牛顿法用时 2.2400104999542236
converged SCF energy = -459.989656978441
默认方法用时 1.632215976715088

然后尝试一个比较大的体系(双氯联苯)

converged SCF energy = -1378.11231899653
快速牛顿法用时 76.15665197372437
converged SCF energy = -1378.11231899655
默认方法用时 98.44448351860046

可以看到快速牛顿法有着显著的优势,值得注意的是scf.fast_newton就已经执行运算了,不需要在下面再加一个mf.kernel(),否则会重复计算,浪费计算资源.

这个函数包装了两部分,第一部分是使用密度拟合技术改进初始猜测,第二部分是调用牛顿法求解.

改进初始猜测

重复计算某个体系的时候,可以保存一些比较良好的初始猜测,例如,可以在低级别下计算直至scf收敛(甚至不收敛只跑几圈),然后将计算结果保存到chkfile文件中,下次直接调用检查点文件接着算就好了

mf = scf.RHF(mol)
mf.chkfile = 'cu3-diis.chk'# 检查点文件,用于保存少量迭代的结果
mf.max_cycle = 2 # 设定HF的最大迭代次数为2,用于改进初始猜测
mf.kernel()

#
# Load the DIIS results then use it as initial guess for function
# scf.fast_newton
#
mf = scf.RHF(mol)
mf.__dict__.update(scf.chkfile.load('cu3-diis.chk', 'scf'))
scf.fast_newton(mf)