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

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

文/Sobereva(3)

First release: 2015-Jan-16   Last update: 2017-Jan-24


众所周知,做振动分析之前必须先在相同级别下优化。总有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最后的输出为
 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,结果可靠么?笔者认为,如果数值比默认情况的收敛限高不太多,不超过一倍,还是可以接受的。比如上面的情况就基本可以接受。但是,如果你对频率/结构的准确度要求高,或者发现出现了虚频,则应当做更精确的优化。

避免freq最后出现NO乃至虚频,或者说让优化更精确的做法有二:
(1)几何优化时用更严的收敛限,即opt里面写上tight。对于DFT来讲,建议同时搭配int=ultrafine使用更高精度的积分格点,效果会明显更好(注:从G16开始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比较远了。

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


另外再提一下,实际上,优化过程只要力收敛了,即便位移没收敛,但只要受力小于收敛限的100倍也自动被Gaussian算作收敛,这主要考虑势能面非常非常缓的大的柔性分子,相对于这样尺度的分子,收敛到那么精确意义也不大,这样可避免收敛太慢。这种情况下,连opt最后都有NO,显然freq最后也肯定有NO。解决方法同上面(1)、(2)。


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时基于牛顿法判断出的位移有所不同。

已有 11 条评论

  1. Rainy

    谢谢Sobereva大神的指导。我最近开始接触DFT计算,在优化某个Ir配合物构型上出现了如下的问题不知该如何处理:我的方法是先用小基组优化(b3lyp/6-31g(d)(针对C,H,O,N,Cl), LANL2DZ(针对Ir)) 再用M06/6-311+G(d,p), LANL2DZ计算单点能。出现的问题就是小基组下优化后没有虚频,但我用优化后的构型算单点能时出现了虚频,虚频主要是Cp环上的CH3 twisting。我试过将原结构加上opt=verytight, int(grid=ultrafine) 然后再用M06算单点能也还是出现了虚频。不知道这样的情况下该如何优化? 谢谢!

    1. sobereva

      算单点能哪可能有虚频,根本就不给出频率值

      1. Rainy

        可能是我对这些术语理解有误。我的计算过程是先用opt=verytight freq b3lyp/genecp int(grid=ultrafine) 优化结构(Ir :LANL2DZ, others: 6-31g(d))然后再用freq M06/genecp (Ir: LANL2DZ, others: 6-311+g(d,p))计算优化后的结构的能量以及一些热力学的参数,由于后一步用了freq,所以结果中可以看频率,然后发现对一些结构,后一步计算中freq出现了虚频,不知道这个问题怎么解决。谢谢

        1. gavin

          第二步计算的时候加上freq是没有意义的,所用的计算水平不一样,出现虚频很正常。只需用m06计算一个单点能,然后结合b3lyp的频率做零点能矫正和分析

  2. kevin

    对于楼主所说的#(很值得一提的是,用calcall的时候,优化任务最后会自动做振动分析,也就是说,此时实际上完全没有必要再单独用freq关键词做振动分析了。)# 我验证后确实有了频率的计算,但是最后没有那四个值的验证。

    1. sobereva

      calcall时看振动分析前的收敛判断(也即最后一次输出的)即可

  3. Jack

    “选上Manual Displacement并拉动滑条来沿着虚频模式略微调整结构”这边大概的数值范围是多少,是0.2-0.6?还是0.02-0.06?

    1. sobereva

      0.1~0.2

      1. an

        在消虚频的过程中,我选上Manual Displacement并把滑条拉动了0.1来沿着虚频模式略微调整结构,优化的时候就出现Problem with coordinate system.这个错误。接着加了opt=cartesian,又立马报错说Illegal IType or MSType generated by parse.这是怎么回事呢?

        1. lairylil

          我也出现了这个问题求解答

          1. sobereva

            没细节没法说,把问题发到计算化学公社上,上传压缩后的输入输出文件

评论已关闭