CASSCF计算#

在一个正确的CASSCF计算的基础上,CASPT2/NEVPT2/MRCI计算基本上是黑箱的。所以成功的关键在于CASSCF计算。

CASSCF计算基本流程:

  • RHF -> 选择轨道 -> CASSCF

  • UHF -> UNO -> CASSCF

RHF选择轨道的步骤也可以通过一定的算法来自动化完成。UNO则本身就是自动的,前提是UHF需要收敛到最低的稳定的解。 下面介绍UHF收敛方法

使用高斯:一般方法guess=mix stable=opt, 进阶方法需要片段初猜:

#p uhf guess(fragment=2)

title

0 1 0 4 0 -4
N(fragment=1) 0.0 0.0 0.0
N(fragment=2) 0.0 0.0 4.0

--link1--
%chk=xxx.chk
#p uhf stable=opt guess=read grom=allcheck

这里在整体的电荷和自旋多重度0 1后面指定了两个片段的电荷和自旋多重度。为了使alpha、beta电子数守恒,第二个片段需要有三个beta单电子,而不是alpha单电子,这样的自旋多重度用负数表示。

使用pyAutoMR:有三种初猜方法

  • general,不改变PySCF默认初猜。“0, 0” 表示电荷和自旋。注意自旋为2S,不是2S+1.

from automr import guess

xyz = '''N 0.0 0.0 0.0; N 0.0 0.0 1.0'''
bas = 'cc-pvtz'

mf = guess.gen(xyz, bas, 0, 0) 
  • mix, 相当于高斯的guess=mix

mf = guess.mix(xyz, bas, conv='tight')
# 或
mf = guess.mix_tight(xyz, bas)
  • fragment,相当于高斯的guess=fragment[[0],[1]]表示两个片段包含的原子编号;[0,0]表示两个片段的电荷,[3,-3]表示两个片段的自旋。

mf = guess.from_frag_tight(xyz, bas, [[0],[1]], [0,0], [3,-3])

mixfrom_frag_tight都会自动做stable=opt。手动做的方法是

mf = guess.check_stab(mf)

下面我们可以做CASSCF计算

  • 使用pyAutoMR

from automr import autocas
mf2 = autocas.cas(mf, (6,(3,3)))

Tip:autocas.cas可以自动判断活性空间,但是做扫描的时候为了保证活性空间一致,需要指定一个参数,这里的参数表示6个活性轨道,3个alpha活性电子,3个beta活性电子。不需要指定自旋多重度,如果算三重态就是(6,(4,2))。

  • 使用MOKIT

%nproc=8
%mem=10gb
# CASSCF(2,2)/cc-pvtz 

mokit{}

0 1 
F 0.0 0.0 0.0
F 0.0 0.0 1.5

MOKIT的输入格式与高斯类似,程序选项写在mokit后的花括号内。此处我们使用默认选项,什么都不用写。 MOKIT会自动做RHF/UHF -> GVB -> CASSCF计算,自动程度比pyAutoMR高。