利用Multiwfn令Dalton计算时使用其它程序产生的轨道作为初猜
利用Multiwfn令Dalton计算时使用其它程序产生的轨道作为初猜
Using Multiwfn to take orbitals generated by other programs as initial guess in Dalton calculations
文/Sobereva@北京科音 2025-Apr-5
1 前言
Dalton这个量子化学程序虽然用起来复杂,但有很多独特的亮点,例如可以在SOPPA(CCSD)和CASSCF级别下计算各种磁属性(笔者最近在Chem. Eur. J., e202404138 (2025)文中就用Dalton在CASSCF下算了NICS),可以用响应方式较准确地计算磷光寿命,可以算双光子吸收(北京科音高级量子化学培训班http://www.keinsci.com/KAQC里专门有一节讲了),可以用高级别耦合簇方法算激发态(见《使用Dalton通过CC3方法极高精度计算激发态》http://sobereva.com/463),等等。可惜Dalton的SCF收敛方面做得一般,比不上Gaussian,而且单靠Dalton无法产生一些重要的轨道,比如UHF计算产生的UNO轨道经常被用于CASSCF的初猜,但Dalton甚至连UHF都做不了,因为Dalton里开壳层只支持RO形式。
为解决以上问题,从2025-Apr-5更新的Multiwfn开始,Multiwfn产生Dalton输入文件的功能支持了将Multiwfn中当前的轨道波函数写入到Dalton的输入文件.dal里作为初猜波函数。因此借助Multiwfn,Dalton用户可以用Gaussian、ORCA、GAMESS-US等诸多主流的量子化学程序产生的波函数当初猜,从而解决Dalton遇到SCF不收敛的问题。而且,Dalton用户还可以直接用Multiwfn产生的UNO、定域化分子轨道(LMO,见http://sobereva.com/380)等当CASSCF初猜。
下面就通过例子简单演示一下具体实现方法,本文中涉及的文件都可以在http://sobereva.com/attach/740/file.zip下载。Multiwfn可以在http://sobereva.com/multiwfn免费下载,相关常识看《Multiwfn FAQ》(http://sobereva.com/452)。如果读者还不知道Dalton怎么安装、运行、产生输入文件的话,看《量子化学程序Dalton的编译方法和运行方式简介》(http://sobereva.com/463)。本文用的Multiwfn是2025-Apr-5更新的版本,Gaussian是G16 B.01,Dalton是2022版。
如果本文介绍的Multiwfn的功能给你的研究带来了帮助,请在论文中引用Multiwfn刚启动时提示的Multiwfn程序的原文,这是对Multiwfn开发和维护最好的支持!
2 把Gaussian收敛的HF波函数当Dalton做CCSD(T)的初猜
这一节以CH3NH2为例演示把Gaussian收敛的HF/cc-pVTZ波函数当Dalton做CCSD(T)/cc-pVTZ的初猜。首先用Gaussian做一个普通的单点计算,输入文件是本文文件包里的CH3NH2.gjf,内容如下所示。算完后把得到的CH3NH2.chk用formchk转成CH3NH2.fch。
%chk=D:\CH3NH2.chk
# HF/cc-pVTZ int=NoBasisTransform
[空行]
test
[空行]
0 1
C 0.05159500 0.70381800 0.00000000
H 0.59439800 1.06209400 0.88166000
H 0.59439800 1.06209400 -0.88166000
H -0.94293100 1.18451300 0.00000000
N 0.05159500 -0.76078400 0.00000000
H -0.45830300 -1.10306000 0.81258800
H -0.45830300 -1.10306000 -0.81258800
[空行]
[空行]
之后启动Multiwfn,载入CH3NH2.fch,依次输入
100 //其它功能(Part 1)
2 //产生输入文件
19 //产生Dalton输入文件
CCSDpT.dal //要产生的输入文件名
[回车] //要产生的.mol文件名用默认的CH3NH2.mol
y //由于当前内存里有基函数信息,Multiwfn问你是否把轨道展开系数写入到.dal文件里
1 //使用Dalton标准格式(4F18.14)方式写入。即四个值换一行,每个值占18列、小数位数14个
此时当前目录下就有了CCSDpT.dal和CH3NH2.mol。把CH3NH2.mol里的基组名都替换为cc-pVTZ_emsl。目前CCSDpT.dal里的计算设置对应B3LYP算单点,自行把关键词改为CCSD(T)计算用的,此时CCSDpT.dal的内容如下
**DALTON INPUT
.RUN WAVE FUNCTIONS
**WAVE FUNCTIONS
.CC
*CC INPUT
.CC(T)
*ORBITAL
.MOSTART //代表从**MOLORB部分读取轨道展开系数作为初猜
FORM18
**MOLORB (Punched by Multiwfn)
-0.00001750284370 0.00060444251600 0.00013849165900 -0.00001024308040
0.00002442752580 -0.00001726827680 -0.00014237439200 0.00004058047020
...略
**END OF INPUT
用Dalton进行计算,可以看到SCF一轮就收敛了,达到了我们的目的:
@ *** DIIS converged in 1 iterations !
@ Converged SCF energy, gradient: -95.252488149534 1.44D-07
- total time used in SIRFCK : 0.00 seconds
之后CCSD(T)计算也顺利跑完了。
一些注意事项和相关信息:
• 对于广义或部分广义收缩基组,都应当用int=NoBasisTransform关键词,拿不准就始终带上。详见《将Gaussian等程序收敛的波函数作为ORCA的初猜波函数的方法》(http://sobereva.com/517)里对此关键词的解释。
• 把Gaussian的cc-pVDZ、cc-pVTZ的波函数当Dalton的初猜时,Dalton要用cc-pVDZ_emsl、cc-pVTZ_emsl基组,而不要用不带_emsl后缀的,否则还是需要迭代很多次才能收敛(甚至可能不收敛),但带不带_emsl的版本收敛后的结果是相同的。而如果是def、def2系列基组,没什么特别要注意的,比如Gaussian里def-TZVP和def2-TZVP做的计算,在Dalton里基组名分别写成Turbomole-TZVP、def2_tzvp即可,注意对大小写有要求,必须对应Dalton目录下的basis子目录里的基组文件名。
• Dalton默认是基于球谐型基函数做的计算,因此如果在Gaussian里使用的是比如6-31G*等D壳层默认是笛卡尔型基函数的基组,应当写上5d关键词强行要求用球谐型,详见《谈谈5d、6d型d壳层基函数与它们在Gaussian中的标识》(http://sobereva.com/51)。虽然Dalton也可以用笛卡尔型基函数,但Multiwfn往Dalton输入文件里写入初猜轨道系数的功能不支持此情况。
• 只要一个量子化学程序能输出Multiwfn可以识别的带有基函数信息的波函数文件,并且用的是球谐型基函数,则波函数都可以通过以上方式作为Dalton的初猜。支持的文件详见《详谈Multiwfn支持的输入文件类型、产生方法以及相互转换》(http://sobereva.com/379)。例如ORCA做计算产生的molden文件也可以载入Multiwfn后像上面那样产生带初猜波函数的Dalton输入文件。
3 把Gaussian收敛的DFT波函数当Dalton做DFT的初猜
此例以顺铂体系为例,把Gaussian收敛的PBE0波函数当Dalton做PBE0计算的初猜,对Pt用Stuttgart小核赝势,对配体用6-311G*。Gaussian输入文件如下(本文文件包里的Ptcoord.gjf):
%chk=D:\Ptcoord.chk
#P PBE1PBE/genecp int=NoBasisTransform
[空行]
b3lyp/def2TZVP opted //众所周知这是纯给自己看的标题行,别问为什么写成这个
[空行]
0 1
[坐标略...]
[空行]
N H Cl
6-311G*
****
Pt
SDD
****
[空行]
Pt
SDD
[空行]
[空行]
按照和上一节例子相同的过程,把chk转成fch,再用Multiwfn产生.dal和.mol文件。.dal里的泛函名改成PBE0,然后设置.mol里的基组和赝势成为下面这样,当前对Pt用的赝势和赝势基组和Gaussian里的情况一样(若不确定的话,可以Gaussian里用gfinput关键词输出定义,并和Dalton的基组、赝势目录下的相应文件对照)。
ATOMBASIS
test molecule
Generated by Multiwfn
Atomtypes=4 Angstrom Nosymmetry charge=0
Charge=1.0 Atoms=6 Basis=6-311G*
H1 -0.82596600 1.64390200 2.14978600
H2 0.00000000 2.40772900 0.93575300
H3 0.82596600 1.64390200 2.14978600
H4 -0.82596600 -1.64390200 2.14978600
H5 -0.00000000 -2.40772900 0.93575300
H6 0.82596600 -1.64390200 2.14978600
Charge=7.0 Atoms=2 Basis=6-311G*
N1 0.00000000 1.59755500 1.56108400
N2 -0.00000000 -1.59755500 1.56108400
Charge=17.0 Atoms=2 Basis=6-311G*
Cl1 0.00000000 1.70827400 -1.36819100
Cl2 -0.00000000 -1.70827400 -1.36819100
Charge=78.0 Atoms=1 Basis=stuttgart_rsc_1997_ecp ECP=stuttgart_rsc_1997_ecp
Pt1 -0.00000000 -0.00000000 0.18195700
用Dalton计算后,经过4轮SCF就轻易收敛了,结果为-1152.597056,和Gaussian给出的-1152.596983非常接近。而如果此例Gaussian和Dalton都用HF的话,会和上例一样,结果精确相同且SCF一轮可收敛。
4 把UNO轨道当Dalton做CASSCF的初猜
之前在《CASSCF计算双自由基以及双自由基特征的计算》(http://sobereva.com/264)里示例过用Gaussian基于UNO初猜轨道做CASSCF(2,2)计算的方法,不了解这种计算和UNO概念的话建议先看看。这一节演示使用Gaussian产生UHF波函数,读入Multiwfn并产生UNO轨道,然后写入.dal文件用于Dalton做CASSCF(2,2)计算的初猜轨道的流程。示例体系还是264号博文里的C4H8双自由基,基组还是此文里的6-31G*。
首先用以下Gaussian输入文件(本文文件包里的C4H8.gjf)对C4H8做UHF计算得到对称破缺波函数。不了解为什么用guess=mix的话看《谈谈片段组合波函数与自旋极化单重态》(http://sobereva.com/82)。
%chk=D:\C4H8.chk
# UHF/6-31G* guess=mix 5d
[空行]
ub3lyp/6-31g(d) opted
[空行]
0 1
C -0.74742092 1.77656753 0.00000000
H -0.62438907 2.32965189 0.92333358
H -0.62438907 2.32965189 -0.92333358
C -0.74742092 0.30933780 0.00000000
H -1.24978876 -0.09122321 0.88294562
H -1.24978876 -0.09122321 -0.88294562
C 0.74742092 -0.30933780 0.00000000
H 1.24978876 0.09122321 -0.88294562
H 1.24978876 0.09122321 0.88294562
C 0.74742092 -1.77656753 0.00000000
H 0.62438907 -2.32965189 -0.92333358
H 0.62438907 -2.32965189 0.92333358
[空行]
[空行]
计算完毕后把C4H8.chk转成C4H8.fch,载入Multiwfn,然后依次输入
200 //其它功能(Part 2)
16 //基于fch文件里的密度矩阵产生自然轨道。这个功能在《在Multiwfn中基于fch产生自然轨道的方法与激发态波函数、自旋自然轨道分析实例》(http://sobereva.com/403)里有专门的介绍
SCF //读取fch里的SCF类型的密度矩阵
1 //产生空间自然轨道
此时从屏幕上看到如下信息,这便是UNO轨道的占据数。其中最高占据自然轨道(HONO)和最低非占据自然轨道(LUNO)的占据数分别是1.123225和0.876775,都偏离整数显著,很满足期望。
Occupation numbers:
2.000000 2.000000 1.999999 1.999999 1.999904 1.999898
1.999881 1.999835 1.999309 1.999120 1.999004 1.998977
1.996829 1.996536 1.996053 1.123225 0.876775 0.003947
0.003464 0.003171 0.001023 0.000996 0.000880 0.000691
...略
接着输入
n //不把自然轨道导出成new.mwfn文件并重新载入,因为当前不需要如此(如果你想看一下当前的UNO轨道图像的话,应选y,之后用Multiwfn主功能0观看轨道)
0 //返回主菜单
100 //其它功能(Part 1)
2 //产生输入文件
19 //产生Dalton输入文件
CASSCF.dal //要产生的输入文件名
[回车] //要产生的.mol文件名用默认的C4H8.mol
y //把当前内存里的轨道(即UNO)的展开系数写入到.dal文件里
1 //使用Dalton标准格式(4F18.14)方式写入
当前C4H8.mol里的基组默认就是6-31G*,不用改。修改CASSCF.dal,把以下两行
.DFT
B3LYPg
替换为CASSCF(2,2)计算的设置:
.MCSCF
*CONFIGURATION INPUT
.CAS SPACE
2
.ELECTRONS
2
.INACTIVE
15
Dalton计算完毕后,活性空间内自然轨道占据数为1.2679和0.7320,能量为-156.024938 Hartree,和Gaussian在同级别做CASSCF精确一致。你若想看Dalton做CASSCF产生的自然轨道,把计算产生的.tar.gz文件里的molden.inp解压出来载入Multiwfn,并效仿《使用Multiwfn观看分子轨道》(http://sobereva.com/269)的方式观看即可。
5 关于线性依赖基函数的问题
较大基组(尤其是带弥散函数的),计算原子分布较致密的体系很容易出现线性依赖问题,Gaussian和Dalton此时都会自动去除线性依赖基函数,导致最终求解出来的轨道数会少于基函数数目。这种情况下,Gaussian输出信息中的NBsUse(实际用的基函数数目,等同于实际求解出来的轨道数)小于NBasis,Dalton输出文件中的Total number of orbitals小于Number of basis functions。这给上文的传轨道带来了麻烦。有两个解决方法:
(1)不去除线性依赖基函数:Gaussian计算时带着IOp(3/32=2)关键词、Dalton计算时在**WAVE FUNCTIONS里面加上以下内容,从而让两个程序都不去除线性依赖基函数
*ORBITAL
.AO DELETE
1E-100
这种做法的缺点是可能导致数值不稳定性。
(2)自动去除线性依赖基函数,但让Dalton少读取轨道:比如Gaussian计算显示NBsUse=50、NBasis=54,因此自动去除了4个线性依赖基函数。因此当Multiwfn载入fch文件后,最后4个轨道的展开系数都会为0,导出到.dal文件里也是如此。此时Dalton若照常读取全部轨道,计算一开始会报错*** ORTHO-FATAL ERROR ***。解决方法是在*ORBITAL里写上
.DELETE
4
这样Dalton就不会读取最后4个轨道了,计算可以正常进行。
6 .dal里的轨道展开系数存在星号而无法读取的问题
有时候Multiwfn写入到.dal里的轨道展开系数会存在一堆星号,导致Dalton读取轨道时提示input conversion error错误。这不是Multiwfn的问题,而是Dalton自身设计不周。Dalton定义的**MOLORB字段中记录展开系数的格式在前面说了,每个数值都是F18.14格式,因此当有的轨道展开系数特别大,超过了其整数位记录上限,就会被记录成一堆星号。这种问题在基组较弥散而又不让自动去除线性依赖基函数的情况下出现概率大。这是为什么Multiwfn导出Dalton输入文件的时候特意让你选择记录的格式,前面的例子都是选1用4F18.14格式,还可以选2用4E20.12格式,这是使用科学计数法输出,因此就不会出现数值过大记录成星号的问题了。相应地,必须自己修改Dalton的读取轨道展开系数的源代码。对于Dalton 2022版,需要修改Dalton源代码目录下的DALTON/sirius/sirgp.F文件,把PFMT = '(4F18.14)'替换为PFMT = '(4E20.12)',之后重新编译即可。
7 其它
Multiwfn就相当一个大熔炉,能读取诸多量子化学程序产生的波函数,又能导出波函数作为诸多量子化学程序的初猜,这在《详谈Multiwfn支持的输入文件类型、产生方法以及相互转换》(http://sobereva.com/379)里专门说了。对于传轨道到ORCA的情况我之前还专门写过《将Gaussian等程序收敛的波函数作为ORCA的初猜波函数的方法》(http://sobereva.com/517)。
MOKIT也是很好的可以实现不同程序间传轨道的工具,fch到.dal和.mol的转换可以用里面的fch2dal子程序。相对于MOKIT,本文介绍的用Multiwfn传轨道有几个额外的好处:
(1)Multiwfn不需要安装MOKIT所需的Python环境。尤其是对于Windows用户,Multiwfn解压即用明显更为方便
(2)Multiwfn特意考虑了.dal里记录轨道展开系数的格式的问题并给了解决办法,上一节说了
(3)Multiwfn自身可以产生诸多类型的轨道(定域化分子轨道、空间/自旋自然轨道、NAdO、AdNDP、NTO、双正交化轨道等等)并输出作为Dalton的初猜
而fch2dal也有额外的优点,它会把fch里的基组、赝势的具体定义直接写到输出的.mol里,因此如果Gaussian计算时用的基组、赝势在Dalton里没有自带也能直接计算而不需要自定义。并且fch2dal支持用笛卡尔型基函数的情况。