4.8. 过渡态¶
过渡态结构是指在反应路径的势能面上的能量最高点,它通过最小能量路径(Minimum Energy Path,MEP)连接反应物和产物的结构。 过渡态结构在势能面上是一阶鞍点(一阶导数为0),只有在沿反应路径的二阶导数为负,其他方向均为正。
过渡态搜索有两大类方法:chain-of-states和surface walking。 chain-of-states方法在势能面上选择若干不同的点,能够从比较差的初始猜测得到收敛的结果,同时还能得到迁移能垒等性质,但得到的过渡态结构精度较低;而surface walking类似结构优化,从一个点出发,根据局域性质不断在势能面上移动,直到找到过渡态,通常需要比较好的初始猜测才能收敛,但能得到高精度的过渡态结构。
NEB是chain-of-states搜索方法的一种,经过长时间的发展形成现在的准确性好,稳定性好的CI-NEB方法。
dimer是surface walking搜索方法的一种。核心思想是,通过计算结构附近的两个点(一组dimer),得到曲率最小的方向,对应一个振动模式,然后沿着这个振动模式平移一定距离。反复如此得到最终结果。在寻找振动模式时需要不断旋转dimer,直至旋转角很小,因此又可以把dimer迭代的每一步分为旋转步和平移步两部分。
当需要高精度过渡态结构时,可以先进行NEB计算,得到一个粗略的过渡态结构,然后以此为初始猜测进行dimer计算。
4.8.1. Si的NEB计算输入文件¶
NEB过渡态计算的输入文件包含一个JSON文件和元素对应的赝势文件。
JSON文件如下:
{
"job": {
"calculation_type": "neb"
},
"job_io": {
"prefix": "neb",
"pp_dir": ".",
"pp_files": [
"Si_ONCV_PBE_sr.upf"
]
},
"pw": {
"ecutwfc": 20,
"ecutrho": 80
},
"kpts": {
"k_type": "automatic",
"k_mesh": [
3,
3,
3
]
},
"electron_step": {
"elec_e_conv": 5e-7,
"elec_max_steps": 100
},
"neb": {
"neb_num_images_given": 2,
"neb_positions": [
[
[
0,
0.5,
0.5
],
[
0.5,
0.5,
0
],
[
0.5,
0,
0.5
],
[
0.75,
0.25,
0.75
],
[
0.25,
0.25,
0.25
],
[
0.25,
0.75,
0.75
],
[
0.75,
0.75,
0.25
]
],
[
[
0,
0.5,
0.5
],
[
0.5,
0.5,
0
],
[
0.5,
0,
0.5
],
[
0.75,
0.25,
0.75
],
[
0,
0,
0
],
[
0.25,
0.75,
0.75
],
[
0.75,
0.75,
0.25
]
]
],
"neb_coord_can_move": [
[
true,
true,
true
],
[
true,
true,
true
],
[
true,
true,
true
],
[
true,
true,
true
],
[
true,
true,
true
],
[
true,
true,
true
],
[
true,
true,
true
]
],
"neb_num_images": 5,
"neb_nstep_path": 100,
"neb_path_conv": 0.05,
"neb_ci_scheme": "no-CI",
"neb_opt_scheme": "broyden"
},
"cell": {
"lattice": [
10.26253573,
0,
0,
0,
10.26253573,
0,
0,
0,
10.26253573
],
"cell_units": "bohr"
}
}
JSON输入参数介绍:
JSON输入文件可以分为几个模块,这里分别是job/job_io/kpts/pw/electron_step/neb/cell, 与scf自洽计算有大量相同的参数,这里只介绍一些与scf自洽计算不同的参数, 下面将依次进行介绍。
job模块: 用来设置和本次计算类型相关的参数。
calculation_type
:设置计算类型,本次计算为neb过渡态计算。
neb模块: 用来设置和过渡态相关的参数。
neb_num_images_given
:设置NEB计算中输入结构的数目。这里设置为2,即只输入初态和末态结构。neb_positions
:设置输入结构的原子位置,这里分别为初态结构和末态结构。neb_coord_can_move
:设置NEB计算中结构中哪些原子的坐标允许改变。顺序与neb_positions
中的原子一一对应。这里设置的所有原子都可以自由移动。neb_num_images
:设置NEB计算中使用结构的数目,包括初态结构、末态结构和所有中间态结构。这里设置为5。neb_nstep_path
:设置NEB计算中的最大步数,这里设置为100。neb_path_conv
:设置NEB计算的收敛标准,这里设置为0.05。neb_ci_scheme
:设置是否使用CI-NEB方法,这里设置为no-CI,表示不使用CI-NEB方法。neb_opt_scheme
:设置NEB计算中结构演变使用的算法,这里设置为broyden。
4.8.2. 执行计算¶
准备好JSON文件和赝势文件之后,按照 Hylanemos运行 中的方法执行计算。
4.8.3. 计算结果分析¶
根据上述的输入文件,计算完成之后将会得到 neb_OUT
、 neb_OUT.json
、 neb_PROGRESS.yaml
、
neb_DATA/neb.data
、 neb_DATA/parallel_info.json
这5个文件:
neb_OUT
:Hylanemos计算过程中输出的日志文件。neb_OUT.json
:Hylanemos计算结束之后输出的一个文件,是对整个计算的结果的一个汇总。neb_PROGRESS.yaml
:Hylanemos计算过程中输出一个和计算进度相关的文件。neb_DATA/NEB_x.yaml
:Hylanemos计算过程中输出的一系列的文件,包括每个image的能量和收敛情况,和能垒大小。neb_DATA/parallel_info.json
:Hylanemos计算过程中输出的并行相关的文件。neb_DATA/NEB_parallel.json
:Hylanemos计算过程中输出的和NEB的images的并行相关的文件。
使用Matter Craft可直接对输出文件进行处理,做出能垒图。具体的操作方法可参考 Matter Craft用户手册。
也可以使用 neb_DATA/NEB_x.yaml
中的数据手动进行能垒图的绘制。
计算出的过渡态如下:
从图中可以看出迁移能垒为29.8meV。
4.8.4. NH3翻转过渡态的dimer计算输入文件¶
dimer过渡态计算的输入文件包含一个JSON文件和元素对应的赝势文件。
JSON文件如下:
{
"job": {
"calculation_type": "dimer",
"occupation_method": "smearing"
},
"job_io": {
"pp_dir": "../../pseudopotentials",
"pp_files": ["H_ONCV_PBE_sr.upf", "N_ONCV_PBE_sr.upf"],
"output_rho": true,
"prefix": "dimer"
},
"symmetry": {
"use_sym": false
},
"cell": {
"lattice": [6.0, 0.0, 0.0, 0.0, 7.0, 0.0, 0.0, 0.0, 8.0],
"cell_units": "A"
},
"ions": {
"element_names": ["H", "N"],
"element_nums": [3, 1],
"positions": [
[0.6462, 0.5736, 0.5000],
[0.5000, 0.3547, 0.5000],
[0.3538, 0.5736, 0.5000],
[0.5000, 0.5000, 0.5000]
]
},
"dimer": {
"dimer_init_mode": [
[ 0.000004, -0.000001, 0.511990],
[ 0.000000, -0.000003, 0.547859],
[-0.000004, -0.000001, 0.511988],
[ 0.000000, 0.000000, -0.111986]
],
"dimer_max_steps": 100,
"dimer_max_rotation_steps": 5
},
"pw": {
"ecutwfc": 50.0
},
"kpts": {
"k_type": "automatic",
"k_mesh": [1, 1, 1]
},
"electron_step": {
"elec_e_conv": 5e-9
},
"smearing": {
"smearing_alg": "gauss",
"smearing_width": 0.005
}
}
JSON输入参数介绍:
JSON输入文件可以分为几个模块,这里分别是job/job_io/symmetry/kpts/pw/electron_step/neb/cell/ions/smearing/dimer, 与scf自洽计算有大量相同的参数,这里只介绍一些与scf自洽计算不同的参数, 下面将依次进行介绍。
job模块: 用来设置和本次计算类型相关的参数。
calculation_type
:设置计算类型,本次计算为dimer过渡态计算。
dimer模块: 用来设置和过渡态相关的参数。
dimer_init_mode
:初始振动模式的猜测,通常需要对结构进行粗略的频率分析得到。如果不给的话会随机生成一个振动模式,但这样会极大影响收敛速度,有可能导致不能收敛。dimer_max_steps
:dimer的最大迭代步数。这里设为100。dimer_max_rotation_steps
:dimer的每步迭代中,旋转步的最大迭代步数。如果达到此步数还没有找到最合适的振动模式,就直接以最后一个振动模式进行平移。这里设为5。
4.8.5. 执行计算¶
准备好JSON文件和赝势文件之后,按照 Hylanemos运行 中的方法执行计算。
4.8.6. 计算结果分析¶
根据上述的输入文件,计算完成之后将会得到 dimer_OUT
、 dimer_OUT.json
、 dimer_PROGRESS.yaml
、 dimer_DATA/CURRENTPOS
、 dimer_DATA/STEPPOS
这3个文件:
dimer_OUT
:Hylanemos计算过程中输出的日志文件。dimer_OUT.json
:Hylanemos计算结束之后输出的一个文件,是对整个计算的结果的一个汇总。dimer_PROGRESS.yaml
:Hylanemos计算过程中输出一个和计算进度相关的文件。dimer_DATA/CURRENTPOS
:Hylanemos计算过程中输出的一个当前离子步的结构文件。dimer_DATA/STEPPOS
:Hylanemos计算过程中输出的一个从第一个离子步到当前离子步的结构文件。