opt收敛 freq不收敛
(2016-04-06 10:24:10)Gaussian中几何优化收敛后Freq时出现NO或虚频的原因和解决方法
文/Sobereva(3)
First release:
2015-Jan-16
众所周知,做振动分析之前必须先在相同级别下优化。总有Gaussian使用者问,优化收敛了,也显示四个YES了,怎么做freq之后四个收敛判断标准却有的出现NO,甚至还出现虚频了?这里简单说一下。
牛顿法,是高效、最常用的寻找多元函数驻点的方法,在量化研究中,这个方法被广泛用来搜索过渡态和优化几何结构。然而,牛顿法的每一步需要计算一次Hessian矩阵,也就是能量对几何坐标的二阶导数矩阵,如果进一步考虑质量权重后就是所谓的力常数矩阵。对于较高计算级别或大体系,计算一次Hessian矩阵是相当耗时的,另外很多方法在Gaussian09里没有解析二阶导数(如TDDFT、CCSD、MP4等),对于这样的方法计算大体系的Hessian矩阵更是耗时甚巨甚至无法承受。因此,为了节省优化时间,一般量子化学程序默认用的都是赝牛顿法,也就是每一步不精确计算Hessian,而是只计算受力,通过受力和上一步的Hessian矩阵来近似得到这一步的Hessian矩阵。虽然赝牛顿法由于用的是近似的Hessian矩阵,比起基于精确Hessian的牛顿法需要更多步数才能找到过渡态/极小点,但由于每一步的耗时低得多(比如赝牛顿法的10步耗时可能只相当于牛顿法的1、2步),所以整体还是比牛顿法便宜得多得多,所以是大多数量化程序默认的优化方法。当Gaussian发现当前结构的受力以及位移(下一步结构相当于当前结构的变化)都收敛了,优化就停止。受力和位移都按照最大值和均方根来检测,因此共有四个判断标准,即四个都YES时就宣告收敛。
做频率计算,则必须先精确计算一次Hessian矩阵(或者读取精确的Hessian矩阵),才能经过一番处理得到频率。freq任务之后,Gaussian会自动根据当前结构的受力和现成的精确Hessian矩阵也用上述四个判断标准考察一下当前结构是否真的是极小点。
正因为几何优化默认用的是近似的Hessian矩阵,而频率计算用的是精确Hessian矩阵,因此判断收敛时,在后两项,即最大位移和均方根位移上的判断会存在差异(受力那两项是完全一致的)。常见的情况是优化的最后一步,四个标准都YES了,但是到了freq任务时,基于精确Hessian矩阵判断则发现后两个并非都YES,甚至出现了虚频,这说明优化的精度不是很高。
下面是个典型的例子,opt最后的输出为
Freq最后的输出为
那么,opt最后都YES了但freq最后没有都YES,结果可靠么?笔者认为,如果数值比默认情况的收敛限高不太多,不超过一倍,还是可以接受的。比如上面的情况就基本可以接受。但是,如果你对频率/结构的准确度要求高,或者发现出现了虚频,则应当做更精确的优化。
避免freq最后出现NO乃至虚频,或者说让优化更精确的做法有二:
(1)几何优化时用更严的收敛限,即opt里面写上tight。对于DFT来讲,建议同时搭配int=ultrafine使用更高精度的积分格点,效果会明显更好。这样来解决出现NO和虚频对计算耗时增加不太多,不过也有可能会反复震荡很难达到这个收敛限。
注意:如果写opt=tight
freq,则freq最后也会用tight标准来判断是否收敛。实际上只要能满足默认判断标准即可,不需要非得满足tight的判断标准。
(2)使用精确的Hessian矩阵。在opt里写上calcall,那么几何优化过程中每一步都会精确计算Hessian,此时几何优化和freq所用的Hessian都是一致的,因此对收敛的判断结果也是完全相同的。也就是说,只要opt最后是YES则freq最后也必然是YES,并且也可以确保无虚频。(很值得一提的是,用calcall的时候,优化任务最后会自动做振动分析,也就是说,此时实际上完全没有必要再单独用freq关键词做振动分析了。)
不过,每一步优化都精确计算Hessian太耗时。如果你之前可以已经在默认情况下优化过,可以取最后的结构重新优化,并在opt里写上calcfc,这样只在优化第一步的时候精确计算Hessian,而之后还是近似计算Hessian。这样收敛后也往往可以避免freq之后出现NO。但是如果初始结构离实际极小点太远则这么做无效,因为等到收敛时Hessian矩阵可能又偏离精确Hessian比较远了。
另外再提一下,实际上,优化过程只要力收敛了,即便位移没收敛,但只要受力小于收敛限的100倍也自动被Gaussian算作收敛,这主要考虑势能面非常非常缓的大的柔性分子,相对于这样尺度的分子,收敛到那么精确意义也不大,这样可避免收敛太慢。这种情况下,连opt最后都有NO,显然freq最后也肯定有NO。解决方法同上。
Gaussian中几何优化和搜索过渡态的算法很相似(除了QST2/3),上文的讨论因此对于过渡态研究也完全适用。
PS1:赝牛顿法、牛顿法在不同量子化学程序里具体实现不同,有很多数值方面的技巧和额外考虑,这里没有细谈。想了解更多的话可以看看《过渡态、反应路径的计算方法及相关问题》(http://sobereva.com/44)以及《几何优化、过渡态搜索、IRC综述与原文合集》(http://bbs.keinsci.com/forum.php?mod=viewthread&tid=105)当中的详细讨论。GDIIS法和牛顿法有一定差异,但它也同样依赖于Hessian矩阵,所以本文的讨论对GDIIS方法优化同样适用。
PS2:有人问,为什么有的时候优化时明明用了calcall,但是基于其结构再做freq任务的时候显示的判断标准却依然和优化最后一步不同,甚至又出现了NO。可能原因有三 (1)优化时用的级别、数值设定(如DFT积分格点)等因素和几何优化时不完全一致 (2)用gview读取优化的输出文件,然后又保存成freq任务的输入文件的时候,由于小数位数有限,因此造成了一点数值误差 (3)几何优化的时候用了GDIIS(默认的GEDIIS也有一定GDIIS的成份),由于这种方法预测下一步位移的时候还会参考之前步的信息,因此会和freq时基于牛顿法判断出的位移有所不同。
PS3:有时候虚频是由于优化所用的初始结构对称性太高导致的。比如联苯实际上两个苯环间是有一定二面角的,但优化联苯所用的初始结构如果是纯平面的,优化过程就会一直保持平面状态,最终也得到平面构型,显然会发现有对应于两个平面彼此间扭转的虚频。