dimer和NEB是固体计算中最常用的两种过渡态搜寻手段,NEB更是可以为我们展示一条最有可能的反应路径。在NEB计算中,我们首先需要构建一条包含一定镜像数的初始路径,目前最为流行的也是最为直观的方法就是线性插值,相应的分析脚本都集成在VTST里面。不过对于很多情况而言,线性插值可能会导致部分原子相靠太近甚至发生重叠,所以往往在插值结束后总是需要自己再在各种可视化软件上进行微调。

VTST官方网站:

http://theory.cm.utexas.edu/vtsttools/

镜像一多的时候微调确实麻烦,而且眼睛上很难直观的有个判据。既然如此,这些活索性就交给code去做就好了,死板的工作不需要人去麻烦。我在标题中把这叫做非线性插值其实是很不严格的,毕竟严格上的非线性插值是指我们使用一个相对于广义坐标的非线性函数去插值初末态,这里大家应该注意一下。

非线性插值的叫法只是为了跟线性插值区分开来,接下来我就把其改口叫做非线性优化。本章讲的方法是pymatgen已经使用的IDPP(image dependent pair potential)方法。这个方法配合pymatgen模块用来生成NEB路径在之前楠神的文章(改进的NEB路径插点方法)中已经讲过,因为我暂时不准备用这个模块,因此我这里介绍的脚本只需要numpy模块,核心优化过程参考了李湃最早的原始脚本。我的改进在于,输入文件同时支持Cartesian和Direct,同时支持固定原子或者不固定原子,支持读入用户预先手调的初始路径,增加输出XDATCAR方便观看动画,语言由python2变为python3。

李湃个人博客网站:

http://blog.sina一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(1).com.cn/s/blog_b3一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(2)64ab230102wj0g.html http://home.ustc.edu.cn/~lipai/me.html

首先简单讲一下IDPP的原理。IDPP本身也是先做了一次线性插值,获得原始线性路径,

一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(3)

我们将初始路径中的每一个镜像中任意两个原子的距离做出来(图中的d),作为参考值,实际对应原子间的距离与其差值平方(防止出现负数)后乘上权重函数 $\omega$使得尽可能对靠的很近的原子提供更大的斥力。获得了这样一个势能面以后,只需要对其求导我们即可获得伪力,也就为原子的弛豫提供了具体的方向,具体的步长当然可以由自己控制。

接下来讲讲具体用法首先你需要准备VASP的POSCAR格式的初末态两个结构文件,文件的命名可以随意。随后你只需要将两者与idpp.py放置于同一个文件夹,运行idpp.py即可。程序会要求你依次输入镜像的个数(不包括初末态),初始文件名和末尾文件名。然后code就会进行优化,每一个镜像优化完成后都会提示你该镜像已经收敛,以及相应的循环数。如果你的镜像达到了100次还没收敛,程序会提示你,你可以试试脚本的步长的数值。脚本对各种类型的POSCAR都支持,但你应该保证初末态的格式是完全一致的,因为脚本对末态只一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(4)关注原子位置信息。最重要的,你应该保证初末态的原子序数是一致的,这没有任何脚本能够帮助你完成,因为这是一个主观的操作。

一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(5)

脚本执行完后,会生成对应镜像的文件夹,你可以直接拷贝到计算目录。你也可以打开XDATCAR,看看整个反应路径的动画,作二次确认。

一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(6)

我这里给了一个NH3旋转的例子。可以看到,idpp的结果给出了非常顺滑的旋转过程,这是线性插值做不到的。

本次先到这里(欢迎一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(7)关注他的Github主页https://github一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(8).com/ponychen123)。

ponychen

20190822

一文搞懂常用的插值算法(非线性插值获得一条相对更好的NEB初猜路径)(9)

,