湖南科技网 湖南科技网-科技创新战略,引领时代先锋

思想家公社的门口:量子化学·分子模拟·二次元

2019-10-07 07:54 已围观93次 来源:湖南科技网 编辑:张馨予

笔者注:读者不要说诸如“此文我看了,还是不收敛”、“我用了文中的方法还是不收敛”这类话。绝对没有哪个方法能100%保证解决SCF不收敛。本文绝对没有一条馊主意,所有Gaussian支持的真正有可能能解决SCF不收敛的做法在本文都已经全面列举了,没有任何遗漏。倘若本文的做法都做了尝试还没解决,那也别指望有任何其它方法能解决。才随便试了文中一个做法,或者以不正当的方式(没有真正了解原理的基础上)瞎试几个就说没解决问题,这根本什么也说明不了。要想解决问题,必须认真阅读本文,所有有可能对当前问题有用的方法都依次尝试,有必要的时候几个一起结合使用。本文列举的做法已经把最坏的情况都考虑了,所以出现所谓的“看了本文还是没解决问题”的情况一定是读者还没真正仔细看、仔细领会、充分尝试。


解决SCF不收敛问题的方法

文/Sobereva @西安科音
First release: 2010-May-17    Last update: 2019-Aug-19


1 前言

量子化学计算离不开SCF(自洽场)迭代,如半经验方法、HF、DFT等。在SCF迭代中,由Fock矩阵F对角化获得新的系数矩阵C和轨道能{ε},然后构造密度矩阵D=C'C'^(T),其中C'为不含虚轨道的C矩阵,再由D构造新的Fock矩阵,反复进行直到收敛,可以写为F_(1)->C_(1)->D_(1)->F_(2)->C_(2)->D_(2)...。收敛判据不是唯一的,比如Gaussian中用的判据是当前步与上一步的密度矩阵元变化量的最大值和方均根(RMS)以及能量的变化,当数值都小于一定范围就认为已经收敛了。默认判据和设定下多数情况在25步以内能达到收敛。但慢收敛甚至完全不能收敛的情况是经常会遇到的。常见的是迭代后期能量随迭代呈现震荡,直到达到默认的最大步数仍未收敛。也可能能量虽然震荡但总趋势是慢慢降低的,一直迭代下去能收敛,但震荡行为明显拖慢了收敛速度。也可能震荡的规律性不显著,迭代过程能量曲线看上去有随机性,但就是很难达到收敛限。不收敛、难收敛情况的出现有很多数值巧合因素,但有些情况不好收敛是众所周知的,例如:基组含弥散函数、体系处于明显的非平衡构型、HOMO-LUMO能隙较小(过渡金属化合物、成键方式古怪等静态相关较强体系中容易出现此情况)、限制性开壳层(RO)计算、明尼苏达系列泛函。

人们提出过一些方案加速收敛或试图解决不收敛,如DIIS、阻尼方法、温度展宽、能级移动、二次收敛方法等。主流的量化程序,如Gaussian、ORCA中默认就会使用一部分这样的帮助收敛。而这些主流的量化程序为了加速SCF计算耗时,会引入一些数值近似,比如一开始先默认用较低的DFT积分格点、忽略数值较小的积分、Incremental fock方式加速Fock矩阵的构建等等,这些近似有时候会阻碍收敛。

Gaussian中对应SCF不收敛的错误提示是L502出错,并伴随Convergence criterion not met和Convergence failure -- run terminated.的具体提示(但从G16 B.01开始,仅提示Convergence criterion not met而不报错中断)。SCF不收敛怎么办是初学者最最最常问的问题,本文第2节将解决不收敛问题的可行办法进行了汇总,并给出在Gaussian中对应的关键词。读者不要听信除计算化学公社论坛()以外的网上其它一些地方的关于解决SCF不收敛的说法,那里面>90%的讨论都是误人子弟。如果读者对其中的DIIS、能级移动、阻尼、温度展宽和二次收敛方法的原理感兴趣,可以阅读本文第3节的详细介绍。

顺带一提,对于Gaussian用户,如果凭经验预感当前体系SCF不容易收敛,或者算的体系比较大,或者遇到SCF不收敛后加了本文提到的帮助收敛的关键词重算,一定要用#P,这样SCF迭代过程的每一轮信息才会输出出来,才能够了解当前已经迭代到了第几轮,能量变化(Delta-E)、密度矩阵元最大变化(MaxDP)和密度矩阵平均变化(RMSDP)是多少,当前离收敛限还有多远(收敛限会在SCF开始之前明确提示)以及迭代过程是否有收敛的趋势。如果没用#P,显然用户会被完全蒙在鼓里。


2 Gaussian中解决SCF不收敛问题的常用做法 绝对没有哪个或哪些关键词只要加上就一定能解不收敛问题,解决不收敛问题需要在理解关键词含义的基础上反复尝试。以下方法越靠前的往往越值得优先考虑,大多数可以结合在一起使用以得到更好效果。

(1) 对于M06、M06-2X等明尼苏达系列泛函可尝试增加泛函积分格点的精度,对于其它泛函这个做法见效几率则比较有限。G09默认是int=fine,相当于(75,302),可以提升到int=ultrafine,相当于(99,590),耗时也会增加,收敛的几率也会增加,结果精度也会提升。
注:从G16开始,默认就是int=ultrafine了。