Gaussian中几何优化收敛后Freq时出现NO或虚频的原因和解决方法

Gaussian中几何优化收敛后Freq时出现NO或虚频的原因和解决方法
Reasons and solutions for solving appearance of NO or imaginary frequency when convergence of geometric optimization is reached in Gaussian

文/Sobereva @北京科音

First release: 2015-Jan-16   Last update: 2024-Dec-7


 

1 前言

众所周知,做振动分析之前必须先在相同级别下优化。总有Gaussian使用者问,优化收敛了,也显示四个YES了,怎么做freq之后四个收敛判断标准却有的出现NO,甚至还出现虚频了?此文件就专门说一下。Gaussian中opt=TS方式的搜索过渡态的算法和几何优化很似,因此下面的讨论对于过渡态的优化也完全适用,只不过要消的虚频显然不是感兴趣的那个(看振动动画可判断),而是额外存在的多余的虚频。

特别要强调的是,按本文的做法,绝对不存在消不掉的虚频,笔者从来没见过例外(除非犯了低级错误,诸如振动分析之前没做几何优化,或几何优化和振动分析不在严格相同级别下进行等等)。不要在网上问我怎么按照此文的做法还是没消掉虚频,消不掉一定是没认真领会此文并充分尝试。不存在本文没提到的其它能解决虚频的做法。

当遇到数值非常小的虚频时,对于计算能量相关问题,并非必须不惜一切代价得把所有虚频消掉不可。关于这点我有博文做了深入讨论,非常建议阅读:《谈谈有小虚频时热力学量的计算》(http://sobereva.com/699)。


2 关于几何优化收敛的判断和出现虚频的原因

牛顿法是高效、最常用的寻找多元函数驻点的方法,在量化研究中,这个方法被广泛用来搜索过渡态和优化几何结构。然而,牛顿法的每一步需要计算一次Hessian矩阵(更具体来说是其逆矩阵),也就是能量对几何坐标的二阶导数矩阵,如果进一步考虑质量权重后就是所谓的力常数矩阵。对于较高计算级别或大体系,计算一次Hessian矩阵是当耗时的,另外很多方法在Gaussian里没有二阶解析导数(如CCSD、MP4等),对于这样的方法计算大体系的Hessian矩阵更是耗时甚巨甚至无法承受。因此,为了节省优化时间,一般量子化学程序默认用的都是准牛顿法,也就是每一步不精确计算Hessian,而是只计算受力,通过受力和上一步的Hessian矩阵来近似得到这一步的Hessian矩阵。虽然准牛顿法由于用的是近似的Hessian矩阵,比起基于精确Hessian的牛顿法需要更多步数才能找到过渡态/极小点,但由于每一步的耗时低得多(比如准牛顿法的10步耗时可能只当于牛顿法的1、2步),所以整体还是比牛顿法便宜得多得多,所以是大多数量化程序默认的优化方法。当Gaussian发现当前结构的受力以及位移(下一步结构当于当前结构的变化)都收敛了,优化就停止。受力和位移都按照最大值和方均根(RMS)来检测,因此共有四个判断标准,即四个都YES时就宣告收敛。

做频率计算,则必须先精确计算一次Hessian矩阵(或者读取精确的Hessian矩阵),才能经过一番处理得到频率,参见《基于fch中的Hessian矩阵计算振动频率的简单程序Hess2freq》(http://sobereva.com/328)里的介绍。freq任务之后,Gaussian会自动根据当前结构的受力和现成的精确Hessian矩阵也用上述四个判断标准考察一下当前结构是否真的准确收敛到了极小点。

正因为几何优化默认用的是近似的Hessian矩阵,而频率计算用的是精确Hessian矩阵,因此判断收敛时,在后两项,即最大位移和均方根位移上的判断会存在差异(受力那两项是一致的)。常见的情况是优化的最后一步四个标准都显示YES了,但是到了freq任务时,基于精确Hessian矩阵判断则发现后两个并非都YES,甚至出现了虚频,这说明优化的精度不是很高。特别是虚频如果较大的话,更是体现当前结构偏离极小点可能挺明显。

下面是个典型的例子,opt最后的输出为
 Maximum Force            0.000401     0.000450     YES
 RMS     Force            0.000197     0.000300     YES
 Maximum Displacement     0.001791     0.001800     YES
 RMS     Displacement     0.000951     0.001200     YES
Freq最后的输出为
 Maximum Force            0.000401     0.000450     YES
 RMS     Force            0.000197     0.000300     YES
 Maximum Displacement     0.002231     0.001800     NO
 RMS     Displacement     0.001325     0.001200     NO

那么,opt最后都YES了但freq最后没有都YES,结果还能用么?笔者认为,如果数值比默认情况的收敛限高不太多,不超过2倍,且没有虚频出现,一般还是可以接受的。比如上面的情况就基本可以接受。但是,如果你对频率/结构的准确度要求高,或者都出现了虚频,则应当做更精确的优化。


3 提升优化和数值精度解决虚频的做法

下面介绍让优化更精确来避免freq最后出现NO乃至虚频的做法。

3.1 几何优化时用更严的收敛限

在opt里面写上tight可以将默认的优化收敛限设严一个数量级以上。由于极小点定位得更精准了,出现虚频的可能性自然大大降低了。但代价是达到收敛限的难度大大增加,因此优化达到收敛所需的步数会大大增加、耗时大大提升,还增加了因为震荡而一直达不到较严格的收敛限的概率。

注意如果写了opt=tight freq,则freq最后也会用tight标准来判断是否收敛,而实际上freq最后只要能满足默认收敛限判断标准就够了,不需要非得满足tight那么严苛的判断标准。

值得一提的是优化过程中即便位移没收敛,但只要受力小于收敛限的100倍也自动被Gaussian算作收敛。我认为这主要是考虑到势能面非常平缓的柔性大分子或分子团簇,对于其体系的尺度,把结构收敛到那么精确意义也不大。这种情况下,连opt最后都有NO,显然freq最后也肯定有NO。若对结构精度要求高的话可以把优化的收敛限设严。

3.2 提升DFT积分格点精度

对于DFT计算要考虑交换-关泛函的积分格点质量问题。如果不了解什么是DFT的积分格点,可参看《密度泛函计算中的格点积分方法》(http://sobereva.com/69)。如果积分格点质量不够理想,DFT计算的受力和Hessian的精度就不够高,这往往是造成虚频出现的原因。此时即便用了tight收敛限也解决不了问题,而且改用tight后可能还极难收敛、容易震荡。如果你是Gaussian 09的用户,用opt=tight时应同时搭配int=ultrafine使用比默认的int=fine更高精度的积分格点。从Gaussian 16开始int=ultrafine已成为默认,因此就不需要手动写了。

对积分格点的要求与使用的泛函、体系都有密切联系。一些明尼苏达系列泛函(比如M06-2X等,但不是所有)对于积分格点精度要求比B3LYP、PBE0、TPSS等其它常见泛函高得多。因此比如M06-2X在int=ultrafine下依然有时会因为积分格点精度不够而导致很微小的虚频的出现,此时可尝试更高档次的积分格点int=superfine,但这非常昂贵。

对于DFT计算极个别色散作用主导的弱互作用体系,有时候更需要用int=superfine。比如笔者曾经在ωB97XD/def2-TZVP(-f)下计算C30嵌套结构,老是有二点几波数的微小虚频死活消不掉。最终有一次我虽然没设更严收敛限,但是用了int=superfine,可算把虚频给搞掉了。但这种情况极度罕见,切勿视为普遍情况。只是说对于某些弱互作用体系,哪怕不是明尼苏达系列泛函,当你碰到极微小虚频且实在干不掉时,还是值得得试一把int=superfine。

3.3 使用精确的Hessian矩阵

在opt里写上calcall,那么几何优化过程中每一步都会精确计算Hessian,自然最终能优化得比基于近似Hessian的准牛顿法更准确。此时几何优化和freq所用的Hessian都是一致的,因此对收敛的判断结果也是完全相同的。也就是说,只要opt最后是YES则freq最后也必然是YES,并且多数情况可以确保无虚频(值得一提的是,用calcall的时候,优化任务结束后会自动做振动分析,因此完全没有必要再单独写freq关键词要求做振动分析了)。

不过,每一步优化都精确计算Hessian太耗时。如果你之前已经在默认情况下优化过,可以取最后的结构重新优化,并在opt里写上calcfc,这样只在优化第一步的时候精确计算Hessian,而之后还是近似估计Hessian,这样收敛后也往往可以避免freq之后出现NO和虚频。但是如果初始结构离实际极小点太远则这么做无效,因为等到结构收敛时Hessian矩阵可能又偏离精确Hessian比较远了。

从Gaussian 16开始,opt里加入了一个很有用的选项recalc。比如opt=recalc=n就代表第一步精确计算一次Hessian矩阵,之后每n步重新计算一次Hessian矩阵。这种做法的效果和耗时都介于calcfc和calcall之间。对计算Hessian成本不很高的情况,n取3~5左右比较合适,对计算Hessian成本较高的情况,n取5~10比较合适,能达到效果和耗时的权衡。读者请随机应变。


4 其它导致虚频的因素和解决方法

4.1 结构对称性问题

有时候虚频是由于优化所用的初始结构对称性太高导致的。比如联苯在基态下实际上两个苯环间是有一定二面角的,但优化联苯所用的初始结构如果是纯平面的,则优化过程就会一直保持平面状态,最终也得到平面构型,显然会发现有对应于两个平面彼此间扭转的虚频。碰到这种情况,最佳的解决方法是在GaussView观看振动模式的界面中选中虚频模式,选上Manual Displacement并拉动滑条来沿着虚频模式略微调整结构,然后点save structure得到新的结构,再拿这个新结构保存新的输入文件,重新优化和做振动分析后通常就已经没虚频了。有时候对于大体系,也可能因为某些局部区域的初始对称性太高,一直维持到最后而出现虚频,这时候也应按照虚频调节结构。对于其它情况,这么按照虚频调节结构的做法解决虚频的几率比较有限,虽然也可以尝试一下。而对于有多个虚频的情况,想通过这种做法一次性就把所有虚频都解决没太大可能。我经常看到网上有很多人但凡只要看到虚频就总是妄图通过这种按照虚频调结构的办法试图消掉,这是明显不对的!!!真正应该优先尝试的是本文前面说的做法!

4.2 SMD隐式溶剂模型问题

SMD隐式模型流行度很高,在《谈谈隐式溶剂模型下溶解自由能和体系自由能的计算》(http://sobereva.com/327)我专门介绍过。我强烈不建议对opt和freq任务用SMD模型,因为此模型下很容易由于数值噪音而产生虚假的虚频,而且还可能由此造成几何优化难收敛。因此当优化和振动分析必须在溶剂模型下做时,强烈建议用Gaussian的scrf关键词默认的IEFPCM溶剂模型。从几何优化结果来讲,SMD较IEFPCM也没有丝毫额外的好处,如327号博文所述,SMD比IEFPCM长处在于额外多考虑了非极性部分,对计算溶剂环境下的能量很重要,而非极性部分对优化的结构影响甚微。所以,opt freq在IEFPCM下做,而之后算能量时再在SMD下做,是比较得当的做法。

4.3 IOp定义泛函的问题

在Gaussian中可以自定义泛函,见《Gaussian中非内置的理论方法和泛函的用法》(http://sobereva.com/344)和《在Gaussian中自定义范围分离泛函的方法》(http://sobereva.com/550),这需要用到IOp关键词。很多人用自定义泛函的时候还是按习惯写上opt freq关键词,这是不行的。要知道,IOp是没法传递到下一个任务的,结合opt freq用的时候只对opt有效,而对freq无效,自然会导致振动分析和优化时用的泛函定义不同、对应的势能面不同,故很可能因此出虚频。所以用自定义泛函的时候opt和freq必须分开做。

4.4 程序bug问题

Gaussian从G09 D.01版开始加入DFT-D3,关介绍见《谈谈“计算时是否需要加DFT-D3色散校正?”》(http://sobereva.com/413)、《DFT-D色散校正的使用》(http://sobereva.com/210)、《乱谈DFT-D)《http://sobereva.com/83》。DFT-D3有零阻尼和BJ阻尼两个版本,分别用em=gd3和em=gd3bj关键词使用。后者最常用,因为算互作用能的精度整体更好一点。BJ阻尼版本在G09 D.01里的解析二阶导数存在bug,会导致你结合DFT-D3(BJ)做优化完全精确的情况下,结合DFT-D3(BJ)做的振动分析也可能出现虚频。因此解决办法是用G09 E.01及以后的版本,或者用零阻尼版本DFT-D3(0)做opt和freq。


PS1:准牛顿法、牛顿法在不同量子化学程序里具体实现不同,有很多数值方面的技巧和额外考虑,本文中没有细谈。想了解更多的话可以看看《过渡态、反应路径的计算方法及关问题》(http://sobereva.com/44)以及《几何优化、过渡态搜索、IRC综述与原文合集》(http://bbs.keinsci.com/thread-105-1-1.html)当中的详细讨论。Gaussian做opt默认用的方法并不是简简单单的准牛顿法,而是牵扯到很多细节,在手册的opt部分里有专门的描述。

PS2:有人问,为什么有的时候优化时明明用了calcall,但是基于其结构再做freq任务的时候显示的判断标准却依然和优化最后一步不同,甚至又出现了NO。可能原因有: (1)优化时用的级别、数值设定(如DFT积分格点)等因素和几何优化时不完全一致
(2)用GaussView读取优化的输出文件,然后又保存成freq任务的输入文件的时候,由于小数位数有限,因此造成了一点数值误差
(3)几何优化的时候用了GDIIS(默认的GEDIIS也有一定GDIIS的成份),由于这种方法预测下一步位移的时候还会参考之前步的信息,因此会和freq时基于牛顿法判断出的位移有所不同
(4)单独做freq任务时没有收敛到和之前最后一步相同的波函数,对比一下两次计算得到的单点能,如果有明显不同说明就是这种情况。能量高的那个肯定是当前结构下不稳定的波函数(虽然也未必能量低的那个一定就对应稳定波函数,这需要做波函数稳定性测试来确认)。freq任务用guess=read读取优化任务的chk文件可以确保收敛到相同波函数