[TOC]
Nudged Elastic Band(NEB)介绍
搬运链接:https://mp.weixin.qq.com/s/pQ-GNPx94W0DndkIoRZ74A
Nudged Elastic Band(NEB)
是一种常用的用于搜寻过渡态和反应路径的(chain-of-states
)方法。将VTST
的代码集成到VASP
的源代码后重新编译(http://hmli.ustc.edu.cn/doc/app/vasp.5.4.1-vtst.htm),就可以做`CI-NEB(Climbing Image)方法, 相比于常规的
NEB方法,它能够更好地定位过渡态。同时
VTST`提供了大量的脚本用于辅助过渡态的计算。(https://www.bigbrosci.com/2018/11/10/ex72/)
chain-of-states
这类方法主要好处是只需要提供反应物和产物结构就能得到准确的反应路径和过渡态。首先在二者结构之间以类似LST的方式线性、均匀地插入一批新的结构(使用内坐标更为适宜),一般为5~40个,每个结构就是势能面上的一个点(称为image
),并将相邻的点以某种势函数相连,这样它们在势能面上就如同组成了一条链子。对这些点在某些限制条件下优化后,在势能面上的分布描述的就是MEP
,能量最高的结构就是近似的过渡态位置。
CI-NEB
与NEB
的关键区别是能量最高的点受力的定义,在CI-NEB
中这个点不会受到相邻点的弹簧力,避免位置被拉离过渡态,而且将此点平行于路径方向的势能力分量的符号反转,促使此点沿着路径往能量升高的方向上爬到过渡态。这个方法只需要很少的点,比如包含初、末态总共5个甚至3个点就能准确定位过渡态,是最有效率的寻找过渡态的方法之一。
线性插点和IDPP插点方法
如何生成合理的images
呢?VTST
提供了一种线性插值的生成初始结构的方法(nebmake.pl
)。简单来说就是将初态和末态的原子坐标的差值均分来获得一系列处于初态和末态之间的images
。这种线性插值的方法对于近乎于直线的原子扩散问题的研究比较适用。如果反应路径并非直线,通过线性插值的点可能距离真正的能量最小路径甚远,此时可能就需要花费更高的时间用来优化。更严重的是涉及到原子旋转的反应路径,线性插值得到的images
很可能发生原子重叠的情况,此时优化任务就进行不下去了。
因此Hannes Jónsson
等人在2014年发表了一篇文章:Improved initial guess for minimum energy path calculations
专门研究了非线性插点的问题。文章里面讲到一种名为image dependent pair potential (IDPP)
的方法来简单优化初始的线性插值的结构。其主要思想是利用路径上每个离散点(image
)处的成对距离插值和Nudged Elastic Band
构造目标函数曲面(IDPP
),然后在新构造的势能面上找到最佳的路径。一旦构造了势能面,即可通过现有的优化算法获得最小能量路径。博客中的代码没有考虑在images
之间加弹簧力限制,因此可能会出现原子飞走的情况。(http://blog.sina.com.cn/s/blog_b364ab230102wj0g.html)
幸运的是ASE
和pymatgen-diffusion
这两个Python
第三方库已经实现了IDPP
插点方法。测试发现ASE
的IDPP
插点方法不完善,原子可能会出现错位的情况。因此本人基于pymatgen-diffusion
和pymatgen
两个库开发了一个python
脚本idpp.py
,实现了与nebmake.pl
一样的插点用法,因此熟悉nebmake.pl
的用户可以很快熟悉IDPP
的插点方法。
idpp.py所需环境安装
idpp.py
使用到了pymatgen-diffusion
和pymatgen
两个Python
库,因此需要安装这两个库。使用pip
工具可以很快地进行安装。
先更新
pip
工具1
python -m pip install --upgrade pip
安装
pymatgen
和pymatgen-diffusion
1
2
3
4pip3 install pymatgen pymatgen-diffusion --user
#or pip install pymatgen pymatgen-diffusion --user
pip3 --default-timeout=1000 install -U pymatgen pymatgen-diffusion
安装好之后测试pymatgen
和pymatgen-diffusion
有没有安装好:
1 | import pymatgen |
在优化好初态(./ini
)和末态结构(./fin
)后,使用idpp.py
进行插点,在初态和末态之间插6个images
:
1 | python idpp.py ./ini/CONTCAR ./fin/CONTCAR 6 |
短暂等待之后,就会得到00~07
一个8
个文件夹。接下来就设置INCAR
,POTCAR
和KPOINTS
运行NEB
任务叭。
下图比较了使用线性插值方法和idpp.py
两种插点方法插点的路径的区别。插点后使用vaspkit 504
功能将images
合并后生成PDB轨迹文件,并使用VMD
软件可视化。可以看到使用线性插值的方法得到的路径存在有原子过近的问题,而idpp
方法得到了更合理的插点结果。
线性插值方法得到的路径
IDPP方法得到的路径
1 | #!/public/software/apps/Anaconda3/bin/python |
劳动节依然劳动,大家五一假期快乐。
Code 和测试例子可在我的Github仓库里下载。
(https://github.com/tamaswells/VASP_script/tree/master/testidpp)