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_OUTneb_OUT.jsonneb_PROGRESS.yamlneb_DATA/neb.dataneb_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 中的数据手动进行能垒图的绘制。

计算出的过渡态如下:

../_images/Si过渡态.png

从图中可以看出迁移能垒为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_OUTdimer_OUT.jsondimer_PROGRESS.yamldimer_DATA/CURRENTPOSdimer_DATA/STEPPOS 这3个文件:

  • dimer_OUT :Hylanemos计算过程中输出的日志文件。

  • dimer_OUT.json :Hylanemos计算结束之后输出的一个文件,是对整个计算的结果的一个汇总。

  • dimer_PROGRESS.yaml :Hylanemos计算过程中输出一个和计算进度相关的文件。

  • dimer_DATA/CURRENTPOS :Hylanemos计算过程中输出的一个当前离子步的结构文件。

  • dimer_DATA/STEPPOS :Hylanemos计算过程中输出的一个从第一个离子步到当前离子步的结构文件。