化学反応の解析 — PHASE/0 Manual 2021.02 ドキュメント

# 化学反応の解析

## NEB 法

### 機能の概要

Nudged Elastic Band (NEB)法 [Mills94] およびClimbing Image (CI) NEB法 [Henkelman00] は，反応経路における始状態と終状態の間の最小エネルギー経路と鞍点を求める方法です。

NEB法およびCI-NEB法を用いた反応経路計算においては，始状態の原子配置(\({\overrightarrow{R}}_{0}\))および終状態の原子配置(\({\overrightarrow{R}}_{N}\))が既知であるとして，始状態と終状態の間の中間状態(\({\overrightarrow{R}}_{i},\ \ i = 2 \sim N - 1\))の原子配置やエネルギーなどを，隣接する状態(イメージ)間がばねによって結ばれているという拘束条件の下で構造最適化計算を行います。ここで\({\overrightarrow{R}}_{i}\)は，各イメージにおける3\(M\)次元(\(M\)は原子数)の座標です。NEB法およびCI-NEB法の中間状態における初期原子配置は始状態と終状態から任意に決定することが可能ですが，始状態と終状態をイメージで等分割し決める方法が多くの場合採用されます。

- NEB法

通常のNEB法においては，各イメージの作用力は次のように与えられます。

()\[{\overrightarrow{F}}_{i} = {\overrightarrow{F}}_{i}^{s}|_{\parallel} - \nabla E\left( {\overrightarrow{R}}_{i} \right)|_{\bot}.\]

ここで，\({\overrightarrow{F}}_{i}^{s}|_{\parallel}\)は隣接するイメージ間のバネによる作用力の接線方向の成分であり，以下のように求められます。

()\[{\overrightarrow{F}}_{i}^{s}|_{\parallel} = k\left( \left| {\overrightarrow{R}}_{i + 1} - {\overrightarrow{R}}_{i} \right| - \left| {\overrightarrow{R}}_{i} - {\overrightarrow{R}}_{i - 1} \right| \right) \cdot \widehat{\tau}\widehat{\tau}.\]

ここで\(k\)はバネ定数です。\(\widehat{\tau}\)は接線方向の単位ベクトルであり，次のように計算します。

()\[\widehat{\tau} = \frac{{\overrightarrow{R}}_{i} - {\overrightarrow{R}}_{i - 1}}{\left| {\overrightarrow{R}}_{i} - {\overrightarrow{R}}_{i - 1} \right|} + \frac{{\overrightarrow{R}}_{i + 1} - {\overrightarrow{R}}_{i}}{\left| {\overrightarrow{R}}_{i + 1} - {\overrightarrow{R}}_{i} \right|}.\]

(5.62) 式の\(\nabla E\left( {\overrightarrow{R}}_{i} \right)|_{\bot}\)は，第一原理計算などによって得られる，原子に働く力の接線に垂直な成分であり，以下のように求められます。

()\[\nabla E\left( {\overrightarrow{R}}_{i} \right)|_{\bot} = \nabla E\left( {\overrightarrow{R}}_{i} \right) - \nabla E\left( {\overrightarrow{R}}_{i} \right) \cdot \widehat{\tau}\widehat{\tau}.\]

- CI-NEB法

CI-NEB法は，通常のNEB法に対して最もエネルギーの高いイメージにおける作用力の計算方法を改良した方法です。CI-NEB法計算では，通常のNEB法を用いて反応経路計算をある程度進めた後に最も高いエネルギーのイメージ(\({\overrightarrow{R}}_{i,\max}\))を決定し，\({\overrightarrow{R}}_{i,\max}\)に働く作用力を次のように計算します。

\[{\overrightarrow{F}}_{i,\max} = - \nabla E\left( {\overrightarrow{R}}_{i,\max} \right) + 2\nabla E\left( {\overrightarrow{R}}_{i,\max} \right)\]
()\[= {\overrightarrow{F}}_{i,\max}|_{\bot} - {\overrightarrow{F}}_{i,\max}|_{\parallel}\]

- バネ定数の計算方法

最少遷移エネルギーを求める反応経路計算においては，鞍点付近の計算精度を高くすることが好ましいと考えられます。このことから，鞍点付近でイメージの密度を高くし，接線の傾きを高い精度で求める必要があります。特に，反応経路全体と比較してポテンシャル障壁の領域が極めて狭い場合には，ポテンシャル障壁近傍のイメージ密度を高くすることにより高精度の計算を効率よく行うことが可能となります。 最少エネルギー経路において鞍点付近にイメージを密に分布させる方法として，鞍点付近のバネ定数\(k\)を大きくする方法が考えられています。NEB法およびCI-NEB法における作用力は，バネによる作用力とエネルギー計算によって得られた作用力の線形結合で表わさせれるので，イメージ間のバネ定数は異なる値を選択することが可能です。バネ定数の設定方法としては，以下のエネルギーの線形関数が提唱されています。

\[k = k_{\max} - \Delta\left( \frac{E_{\max} - E_{i}}{E_{\max} - E_{\text{ref}}} \right)\text{ }\left( E_{i} \geq E_{\text{ref}}の場合 \right),\]
()\[k = k_{\max} - \Delta\text{k }\left( E_{i} < E_{\text{ref}}の場合 \right).\]

ここで，\(k_{\max}\)はバネ定数の最大値，\(\Delta k\)はバネ定数の最大値と最小値の差です。\(E_{i}\)は\(i\)番目のバネで結ばれた2つのイメージのうち高いエネルギーのイメージのエネルギー，\(E_{\max}\)は全イメージ中最も高いエネルギー，\(E_{\text{ref}}\)は始状態と終状態のうち，高い方のエネルギーです。この\(E_{\text{ref}}\)の値の設定によって，反応経路における始状態付近と終状態付近のイメージ密度が等しくなります。

### 入力パラメータ

入力パラメータの指定

NEB法に関連する，入力データのタグおよびその説明を以下に示します。

NEBに関連する入力データ
第1ブロック | 第 2第3ブロック | タグ識別子 | 説明
--- | --- | --- | ---
Control |  |  |
|  | multiple_replica_mode | NEB計算の実行 ON,OFF
|  | multiple_replica_max_iteration | NEB iteration数
multiple_replica |  |  |
|  | method | 反応経路計算手法 nudged_elast ic_band_method
| accuracy |  |
|  | dt | NEB計算における原子 座標更新の \(\Delta t\)
|  | neb_time_integral | 時間積分法 quench, ste epest_descent, cg, fireから 選択できる(cg, fireはバージョ ン2020.01以降) デフ ォルト値は，20 20.01以前はste epest_descent, 2020 .01以降はfire.
|  | penalty_function | ペナルティ関数 ON,OFF
|  | neb_converg ence_condition | NEB収束判定法(後述)
|  | neb_converg ence_threshold | NEB収束判定値
| constraint |  |
|  | ci_neb | CI-NEB ON, OFF
|  | sp_k_init | バネ定数(初期値)
|  | sp_k_min | バネ定数(最小値)
|  | sp_k_max | バネ定数(最大値)
|  | sp_k_variable | バネ定数の固定，変動 OFF固定，ON変動
| structure |  |
|  | number_of_replicas | レプリカ数
| replica |  | レプリカ情報
|  | endpoint_images | 両端のイメ ージの指定方法 directin, file
| atom_list_end0 |  | 両端のイメー ジの原子リスト
| atom_list_end1 |  | 両端のイメー ジの原子リスト
structure |  |  |
| symmetry |  |
|  | method | 対称性の与え方

NEB法の入力パラメータの指定について説明します。

NEB法の計算は，以下の指定を行います。

- NEB法の機能を有効にする

- NEB用の収束判定の設定を行う

- 結晶の対称性を設定する

- レプリカ列両端のレプリカの座標データを設定する

- レプリカの中間レプリカの座標データを設定する

各々について，以下に説明をします。

- NEB機能を有効にする。

PHASEにNEB法による計算を実行することを伝えるため，以下のようにcontrolブロックの下でmultiple_replica_mode変数をonとします。

    control{
      multiple_replica_mode = on
    }

- 収束判定

収束判定条件は，multiple_replicaブロックの下のaccuracyブロックの変数neb_convergence_conditionで設定します。

    multiple_replica{
      accuracy{
        neb_convergence_condition = energy_e
      }
    }

neb_convergence_conditionには，数値または文字列を指定することができます。次の表に，設定できる条件を示します。

収束判定条件設定のパラメータ

数値 | 文字列 | 説明
--- | --- | ---
1 | energy_e | dE \(<\)threshold
2 | phase_force | PHASEの力の 最大値\(<\)threshold
3 | neb_force | NEB計算で補正した力の 最大値\(<\)threshold
4 | force_at_transition_state | 最大エネ ルギーイメージのPHASEの力の 最大値\(<\)threshold
5 | phase_force_normal | PHA SEの，経路に垂直な成分の力の 最大値\(<\)threshold

- 結晶の対称性を指定する

バージョン2020.01未満：対称性に自動探索（structure{symmetry{method = automatic}}）を設定すると，両端のレプリカのいずれかあるいは両方に、中間のレプリカよりも高い対称性が見つかった場合に，正常に計算が進まなくなります。マニュアル設定にして，必要ならば生成元を与えることによって（4.2.1.2参照）、全レプリカの対称性を揃えて下さい。

バージョン2020.01以上：対称性に自動探索（structure{symmetry{method = automatic}}）を設定すると，始状態，終状態を含むすべてのレプリカいに共通する対称性のみが適用されるように動作します。

- 両端のレプリカの指定：入力で直接指定する方法

両端のレプリカの原子座標を入力において直接指定するには，以下のような記述を行います。

    multiple_replica{
        ....
        ....
        structure{
            ....
            ....
            endpoint_images = directin
            atom_list_end0{
                coordinate_system = cartesian ! {internal
                atoms{
                #units angstrom
                #tag element rx ry rz
                Si    0.000000000000      0.000000000000      0.000000000000
                Si    2.751721694800      2.751721694800      0.000000000000
                ....
                ....
                }
            }
            atom_list_end1{
                coordinate_system = cartesian ! {internal
                atoms{
                #units angstrom
                #tag element rx  ry  rz
                Si    0.000000000000      0.000000000000      0.000000000000
                Si    2.751721694800      2.751721694800      0.000000000000
                ....
                ....
                }
            }
            ....
            ....
        }
        ....
        ....

変数endpoint_imagesにdirectinという文字列を指定し, さらに atom_list_end0ブロックに始状態の，atom_list_end1に終状態のレプリカの座標値を通常のPHASEのatom_listブロックにおける指定と同じように指定します．

- 両端のレプリカの指定：両端のレプリカの原子座標をファイルから指定する方法

両端のイメージの原子座標をファイルで指定する場合は，入力データのendpoint_imagesの値をfileとし，file_names.dataにイメージのファイル名を設定します。 その際，file_names.dataファイル中ではF_IMAGE(-1)およびF_IMAGE(0)というファイルポインターを利用します。以下は、入力データとfile_names.dataの記述例です。

入力データの記述例

    multiple_replica{
        ...
        ...
        structure{
            endpoint_images = file
        }
        ...
        ...
    }

file_names.dataファイルの記述例

    &fnames
    ...
    ...
    /
    &nebfiles
    F_IMAGE(0)  = './endpoint0.data'
    F_IMAGE(-1) = './endpoint1.data'
    ...
    ...
    /

また，原子座標データファイル(上記の例ではendpoint0.dataやendpoint1.dataというファイル名)は，次のような形式で記述します。

    coordinate_system=cartesian
    #units angstrom
    Si      0.000000000000      0.000000000000      0.000000000000
    Si      2.751721694800      2.751721694800      0.000000000000
    Si      1.375860847400      1.375860847400      1.375860847400
    Si      4.127582542200      4.127582542200      1.375860847400
    Si      0.000000000000      2.751721694800      2.751721694800
    Si      2.751721694800      0.000000000000      2.751721694800
    Si      1.375860847400      4.127582542200      4.127582542200
    Si      4.127582542200      1.375860847400      4.127582542200
    Si      0.000000000000      0.000000000000      5.503443389600
    Si      2.751721694800      2.751721694800      5.503443389600
    Si      1.375860847400      1.375860847400      6.879304237000
    H       1.644706293661      1.095414892118     11.000000000000
    H       1.095414929519      1.644706317263     11.000000000000

- 中間レプリカの指定：中間レプリカの原子座標を両端の原子座標の線形補間で指定する方法(proportional)

中間レプリカの原子座標を両端の原子座標の線形補間で指定する場合は、replicaタグ内のhowtogive_coordinatesをproportinalとします。入力データの記述例を以下に示します。

    multiple_replica{
      structure{
        number_of_replicas = 6
        replicas{
          #tag replica_number howtogive_coordinates end0 end1
                      1 proportional 0 -1 ! 0: end0, -1:end1
                      2 proportional 0 -1
                      3 proportional 0 -1
                      4 proportional 0 -1
                      5 proportional 0 -1
                      6 proportional 0 -1
        }
      }
    }

- 中間レプリカの指定：中間レプリカの原子座標をファイルから指定する方法(file)

中間イメージをファイルで指定する場合は，replicaタグ内のhowtogive_coordinatesをfileとし，対応する原子座標ファイルはfile_names.dataファイルで指定します。 入力データとfile_names.dataファイルの記述例を以下に示します。

入力データの記述例

    multiple_replica{
        ...
        ...
        structure{
            number_of_replicas = 3
            replicas{
                 #tag replica_number  howtogive_coordinates   end0  end1
                    1            file              0      -1 ! 0: end0, -1:end1
                    2            file              0      -1
                    3            file              0      -1
            }
        }
    }

file_names.dataの記述例

    &fnames
    ...
    ...
    /
    &nebfiles
    F_IMAGE(0)  = './endpoint0.data'
    F_IMAGE(-1) = './endpoint1.data'
    F_IMAGE(1)  = './image1.data'
    F_IMAGE(2)  = './image2.data'
    F_IMAGE(3)  = './image3.data'
    /

原子座標データを指定するファイルの書式は，両端イメージの場合と同じです。

入力パラメータの例を以下に示します。

    Control{
        condition = initial   ! {initial|continuation|automatic}
        cpumax = 1 day ! {sec|min|hour|day}
        max_iteration = 10000000
        multiple_replica_mode = ON
        multiple_replica_max_iteration = 2000
    }
    accuracy{
        cutoff_wf =  10.00  rydberg
        cutoff_cd =  40.00 rydberg
        num_bands =  28
        ksampling{
            method = monk  ! {mesh|file|directin|gamma}
            mesh{  nx = 2, ny =  2, nz =  1  }
        }
        smearing{
            method = parabolic ! {parabolic|tetrahedral}
            width  = 0.001 hartree
        }
        xctype = ggapbe
        scf_convergence{
            delta_total_energy = 0.5e-7   hartree
            succession   = 2   !default value = 3
        }
        initial_wavefunctions = matrix_diagon  !{random_numbers|matrix_diagion}
        matrix_diagon{
            cutoff_wf =  3.00  hartree
        }
    }
    structure{
        unit_cell_type = primitive
        unit_cell{
             a_vector =  10.400      0.000      0.000
             b_vector =   0.000     10.400      0.000
             c_vector =   0.000      0.000     30.200
        }
        symmetry{
          method = manual
          sw_inversion = off
        }
        atom_list{
            coordinate_system = cartesian ! {cartesian|internal}
            atoms{
            #units angstrom
            #tag  element  rx  ry  rz   mobile
        Si    0.000000000000      0.000000000000      0.000000000000    0
        Si    2.751721694800      2.751721694800      0.000000000000    0
        Si     1.375860847400      1.375860847400      1.375860847400    0
        Si     4.127582542200      4.127582542200      1.375860847400    0
        Si     0.000000000000      2.751721694800      2.751721694800    0
        Si     2.751721694800      0.000000000000      2.751721694800    0
        Si     1.375860847400      4.127582542200      4.127582542200    0
        Si     4.127582542200      1.375860847400      4.127582542200    0
        Si     0.000000000000      0.000000000000      5.503443389600    0
        Si     2.751721694800      2.751721694800      5.503443389600    0
        Si     1.375860847400      1.375860847400      6.879304237000    0
        H    1.644706293661      1.095414892118     11.000000000000    1
        H    1.095414929519      1.644706317263     11.000000000000    1
             }
        }
        element_list{
                #tag element  atomicnumber  mass  zeta   dev
                #units atomic_mass
                Si        14     28.085
                H          1     1.008
        }
    }
    multiple_replica{
        method = nudged_elastic_band_method
        accuracy{
            dt = 40 au_time
            neb_time_integral = quench
            penalty_function = off
            neb_convergence_condition = 3
            neb_convergence_threshold = 5.0e-04
        }
        constraint{
            ci_neb = OFF
            sp_k_init = 0.03
            sp_k_min = 0.03
            sp_k_max = 0.03
            sp_k_variable = OFF
        }
        structure{
            number_of_replicas = 6
            replicas{
                #tag replica_number  howtogive_coordinates   end0  end1
                1            proportional              0      -1 ! 0: end0, -1:end1
                2            proportional              0      -1
                3            proportional              0      -1
                4            proportional              0      -1
                5            proportional              0      -1
                6            proportional              0      -1
            }
            endpoint_images = directin ! {no or nothing | file | directin}
            howtogive_coordinates = from_endpoint_images
            atom_list_end0{
               coordinate_system = cartesian ! {internal|cartesian}
                atoms{
                #units angstrom
                #tag element rx ry rz
                     Si    0.000000000000      0.000000000000      0.000000000000
                     Si    2.751721694800      2.751721694800      0.000000000000
                     Si    1.375860847400      1.375860847400      1.375860847400
                     Si    4.127582542200      4.127582542200      1.375860847400
                     Si    0.000000000000      2.751721694800      2.751721694800
                     Si    2.751721694800      0.000000000000      2.751721694800
                     Si    1.375860847400      4.127582542200      4.127582542200
                     Si    4.127582542200      1.375860847400      4.127582542200
                     Si    0.000000000000      0.000000000000      5.503443389600
                     Si    2.751721694800      2.751721694800      5.503443389600
                     Si    1.375860847400      1.375860847400      6.879304237000
                      H    1.644706293661      1.095414892118     11.000000000000
                      H    1.095414929519      1.644706317263     11.000000000000
                }
            }
            atom_list_end1{
                  coordinate_system = cartesian ! {internal|cartesian}
                atoms{
                #units angstrom
                #tag element rx  ry  rz
                     Si    0.000000000000      0.000000000000      0.000000000000
                     Si    2.751721694800      2.751721694800      0.000000000000
                     Si    1.375860847400      1.375860847400      1.375860847400
                     Si    4.127582542200      4.127582542200      1.375860847400
                     Si    0.000000000000      2.751721694800      2.751721694800
                     Si    2.751721694800      0.000000000000      2.751721694800
                     Si    1.375860847400      4.127582542200      4.127582542200
                     Si    4.127582542200      1.375860847400      4.127582542200
                     Si    0.000000000000      0.000000000000      5.503443389600
                     Si    2.751721694800      2.751721694800      5.503443389600
                     Si    1.375860847400      1.375860847400      6.879304237000
                      H    2.22686927     0.48813212     7.65400988
                      H    0.48813224     2.22686933     7.65400957
                }
            }
        }
    }
    wavefunction_solver{
        solvers{
           #tag   sol    till_n  dts  dte  itr  var    prec cmix submat
              lmMSD   -1      0.2  0.2  1  linear   on    1   on
        }
    }
    charge_mixing{
        mixing_methods{
        #tag no   method   rmxs   rmxe   itr  var     prec istr  nbmix  update
              1  broyden2  0.10   0.10   1  linear  on  1  0   RENEW
        }
    }
    printoutlevel{
        base=1
    }

NEB関連ファイルの指定

NEB関連のファイルは，file_names.dataで設定します。次のように記述します。

    &fnames
    F_INP='./nfinp.data'
    F_POT(1)='./Si_ggapbe_nc_01.pp'
    ...
    ...
    /
    &nebfiles
    F_IMAGE(0)  = './endpoint0.data'
    F_IMAGE(-1) = './endpoint1.data'
    F_NEB_OUT   = './output_neb'
    F_NEB_ENF   = './nfnebenf.data'
    F_NEB_DYNM  = './nfnebdynm.data'
    /

ファイル読み込みのnamelistとして，&nebfilesを利用している点にご注意ください。

&nebfilesで利用できるファイルポインターを，次の表に示します。

NEBで利用できるファイルポインター
ファイル名変数 | Unit番号 | デフォルト値 | 備考
--- | --- | --- | ---
F_IMAGE(-1:99) | 201 | ./endpoint0.data (F_IMAGE(0)) ./endpoint1.data (F_IMAGE(1)) | イ メージの原子座標
F_NEB_STOP | 202 | ./nfnebstop.data | NEBステッ プ終了用ファイル
F_NEB_OUT | 203 | ./output_neb | NEB計算 ログ出力
F_NEB_CNTN | 204 | ./neb_continue.data | NEB継 続計算用ファイル
F_NEB_ENF | 205 | ./nfnebenf.data | エネルギー ，力出力ファイル
F_NEB_DYNM | 206 | ./nfnebdynm.data | 原子 座標出力ファイル

### 入力パラメーター指定（バージョン2020.01以上）

NEB法は，2020.01以上のバージョンにおいて入力形式の簡略化と機能拡張がほどこされています（バージョン2020.01未満の指定方法も依然として利用できます）。具体的には以下の通り。

- 最適化手法の拡充：従来から利用できた最急降下法とquench法に加え，fire法とcg法が使えるようになりました。新しいデフォルトの最適化手法はfire法です。

- CI-NEB切り替え：CI-NEB法はNEB法の初期の段階で適用すると破綻してしまう場合があるので，通常のNEB法をしばらく実施してからCI-NEBに遷移する，という使い方が一般的です。このような使い方は，これまではいったん計算を終了し，継続計算のタイミングで行うというやり方でしか実現できませんでした。バージョン2020.01以降，ある閾値を満たした場合に遷移するという方法も利用できるようになりました。NEB法ではエネルギーやNEB力など複数の収束判定条件を利用できるようになっていますが，CI-NEBの切り替えの判定条件はNEB自体の判定条件と同じです。閾値はユーザーが指定することができますが，デフォルト値は通常のNEBの収束判定条件から動的に決まります。

- 対称性：始状態，終状態には存在しても中間レプリカには存在しない対称性がある場合があり，2020.01未満のバージョンでは中間レプリカが対称性チェックを満たせず，異常終了してしまいます。そこで，2020.01以降は始状態・終状態ふくめすべてのレプリカに共通する対称性のみ考慮するという動作に改良されました。中間レプリカが対称性を持つことはあまりないですが，表面モデルにおける反転対称性などは持つ場合があります。

- nfdynm.dataファイルからの座標値の読み込み：始状態・終状態をnfdynm.dataファイルから読み込めるようになりました。また，nfdynm.dataファイルの座標履歴を反応座標に見立てて読み込むことも可能です。

- 必須設定の削減：2020.01未満のバージョンにおいては，原子配置を三カ所で定義する必要がありました。2020.01以上のバージョンにおいては，始状態・終状態の原子座標のデフォルト値を通常の座標指定のそれになっています。そのため，通常の原子配置指定は始状態があらわに指定されているならば終状態に，終状態があらわに指定されているならば始状態に対応するようになっています。また，以前のバージョンでは初期中間レプリカの作成方法の指定は必須設定でしたが，2020.01以降は“始状態と終状態の間の線形補間”によって中間レプリカを作成する場合をデフォルト値とし，この場合の指定は非必須となりました。

NEB法の精度などの設定

NEBの精度などの設定をmultiple_replicaブロックのaccuracyブロックにおいて行うことができます。

    multiple_replica{
      accuracy{
        neb_time_integral = fire
        neb_convergence_condition = 3
        neb_convergence_threshold = 1.0e-3
      }
    }

neb_time_integralによってNEB法が利用する最適化手法を選択します。steepest_descent, quench, cg, fireから選択できます。デフォルト値はfireです。fireがうまく行かない場合，cgやquench法が推奨されます。neb_convergence_conditionでNEBの収束判定条件を設定します。1がエネルギー差，2が系の原子間力，3がNEB力，4が遷移状態の原子間力，5が系の経路に垂直な原子間力です。デフォルト値は1です。

neb_convergence_thresholdで閾値を設定します。これは単位を指定することはできないので，原子単位で指定します。そのデフォルト値はneb_convergence_conditionが1の場合は10-6 hartree, それ以外の場合は10-3 hartree/bohrです。

FIRE法を利用する場合，パラメーターの詳細を設定することも可能となっています。その設定は，multiple_replicaブロックではなくstructure_evolutionブロックの下のfireブロックにおいて行います。その詳細は別項(4.4.1.2節)を参照してください。

始状態・終状態としてnfdynm.dataファイルを利用する方法

まず，multiple_replicaブロックのstructureブロックにおいて以下のような設定を施します。

    multiple_replica{
      structure{
        number_of_replicas = 6
        endpoint_images = file
        frame_end0 = 0
        frame_end1 = 1
      }
    }

number_of_repliasによって中間レプリカの数を指定します。始状態と終状態は，endpoint_images = fileとするとnfdynm.dataファイルから読み込むことができます。frame_end0, frame_end1でnfdynm.data中のフレーム番号を指定します。フレーム番号は1始まりであり，0以下の数値を指定すると最後のフレームを採用するようになります。frame_end0, frame_end1のデフォルト値は-1です。

つぎに，file_names.dataファイルにおいて以下のように目的のnfdynm.dataファイルを指定します。

    &fnames
    ...

    /
    &nebfiles
    F_IMAGE(0) = ‘end0/nfdynm.data’
    F_IMAGE(-1) = ‘end1/nfdynm.data’
    /

nebfilesセクションにおいてファイル名を指定します。識別子F_IMAGE(0)によって始状態の，F_IMAGE(-1)によって終状態のnfdynm.dataファイルを指定します。

CI-NEBの切り替え

CI-NEB法は以下の要領で設定します。

    multiple_replica{
      constraint{
        ci_neb = on
        ci_thres = 1e-2
        ci_index = 0
      }
    }

multiple_replicaブロックの下のconstraintブロックにおいてCI-NEBの設定を行います。ci_neb=onとするとCI-NEBが有効になります。ci_thresで指定した値よりも収束判定条件として採用している量が小さい場合に通常のNEBからCI-NEBに切り替わります。この値のデフォルト値は，通常の収束判定条件の2倍です。CI-NEBに切り替わっていない場合通常の収束判定は無視されるので，CI-NEBに切り替わる前に誤って収束したとみなされることはありません。ci_indexに2から中間レプリカ数までの値を指定すると，エネルギーが最も高いレプリカではなくci_indexに対応するレプリカがCI-NEBのターゲットとなります。

nfdynm.dataファイルを反応経路に見立てて初期レプリカ列にする方法

nfdynm.dataファイルを反応経路に見立てて初期レプリカ列として採用することができます。この機能には，nfnebdynm.dataというファイルにNEB計算中のnfdynm.dataファイルの履歴が記録されるので，任意の反応経路を抽出し，NEBの初期経路にする，といった使い方が考えられます。途中から破綻してしまった計算をうまく行っていた段階まで戻って最初から計算したい場合や，何らかの事情でリスタート計算に必要なデータが出力されなかった場合に最後の反応経路を初期レプリカ列に採用したい場合などに利用できます。

この機能を利用するためには，まずは以下の設定を入力パラメーターファイルで行います。

    multiple_replica{
      structure{
        sw_path_from_dynm = on
      }
    }

さらに，file_names.dataにおいて以下の指定を行います。

    &fnames
    ...
     /
    &nebfiles
    F_PATH = ‘foo/nfdynm.data’
    /

nebfilesセクションのF_PATH識別子で対象のnfdynm.dataファイルを指定します。なお，number_of_replicas+2 (+2は始状態・終状態の分)とnfdynm.dataファイルのフレーム数が一致している必要がある点には注意が必要です。

始状態と終状態のエネルギーを指定する方法

始状態と終状態のエネルギー計算は，デフォルトの振る舞いとしてはNEBステップ1回目に限り実行されます。しかし多くの場合このエネルギーは既知なので，入力において指定することによってこのエネルギー計算を回避することができるようになっています。以下のように記述します。

    multiple_replica{
      structure{
        end0_energy = -120.1 hartree
        end1_energy = -120.3 hartree
      }
    }

end0_energyに始状態の，end1_energyに終状態のエネルギーを指定します。

### 計算の実行方法

NEBは「レプリカ並列」に対応しています。以下のように起動します。

    % mpirun -n NP phase ne=NE nk=NK nr=NR

ここで，NPはMPIプロセスの数，NRは並列で計算するレプリカの数，NE, NKはPHASEと同様バンドおよび\(\mathbf{k}\)点並列の数です。ただし，NP = NR x NE x NKという関係が成立している必要があります。

### 計算結果の出力

NEBシミュレーションを実行すると，通常のPHASEの計算と比較して多くのファイルが得られます。 まず，ログファイル(output000)や継続計算に利用されるファイル(continue.dataファイルなど)は すべてレプリカ毎に出力されます。識別のため，それぞれのファイルの末尾に“_rxxx”という文字列がたされます。 さらにNEB固有の以下のファイルが得られます。

- output_neb_pxxx

NEB計算のログファイルです。xxxにはMPIプロセスの番号が割り振られます。NEB計算に関するログが出力されます。

- nfnebenf.data

NEB計算のエネルギーやNEB力などが記録されたファイルです。以下のような形式で出力されます。

    #step   image  image_distance  energy   force_org  force_neb  force_normal
       1    1    0.0000000000E+00   -0.4399458479E+02    0.1112676571E-01    0.1112676571E-01    0.0000000000E+00
       1    2    0.1323772380E+01   -0.4397221867E+02    0.5212041989E-01    0.4899393390E-01    0.4899393390E-01
       1    3    0.2640972887E+01   -0.4393533860E+02    0.5368141337E-01    0.5023308254E-01    0.5023308254E-01
       1    4    0.3958252743E+01   -0.4389613534E+02    0.4830449879E-01    0.4474348402E-01    0.4474348402E-01
       1    5    0.5277489255E+01   -0.4389237657E+02    0.4486782793E-01    0.4486782793E-01    0.4486782793E-01
       1    6    0.6594794555E+01   -0.4396965451E+02    0.8881334200E-01    0.8881334200E-01    0.8881334200E-01
       1    7    0.7911999993E+01   -0.4404244254E+02    0.5849229655E-01    0.5849229655E-01    0.5849229655E-01
       1    8    0.9229437211E+01   -0.4405831588E+02    0.2414216682E-01    0.2414216682E-01    0.0000000000E+00
       2    1    0.0000000000E+00   -0.4399458479E+02    0.1112676571E-01    0.1112676571E-01    0.0000000000E+00
       2    2    0.1356841287E+01   -0.4398451885E+02    0.4270600251E-01    0.4018848625E-01    0.4018734489E-01
       2    3    0.2677587331E+01   -0.4394948430E+02    0.5479419750E-01    0.5096369018E-01    0.5096445426E-01
       2    4    0.4004269114E+01   -0.4390739111E+02    0.5004508819E-01    0.4463448973E-01    0.4464878761E-01
       2    5    0.5328036512E+01   -0.4389409127E+02    0.4291037894E-01    0.4291037894E-01    0.4291037894E-01
       2    6    0.6642907129E+01   -0.4397034020E+02    0.8879366098E-01    0.8879366098E-01    0.8879366098E-01
       2    7    0.7959713712E+01   -0.4404290631E+02    0.5713917408E-01    0.5713917408E-01    0.5713917408E-01
       2    8    0.9278358213E+01   -0.4405831588E+02    0.2414216682E-01    0.2414216682E-01    0.0000000000E+00
       3    1    0.0000000000E+00   -0.4399458479E+02    0.1112676571E-01    0.1112676571E-01    0.0000000000E+00
       3    2    0.1356624500E+01   -0.4399408010E+02    0.1114085905E-01    0.1114085905E-01    0.1114085905E-01
       3    3    0.2730952540E+01   -0.4397302719E+02    0.5096325231E-01    0.4680553493E-01    0.4683808222E-01
       3    4    0.4090362450E+01   -0.4392669466E+02    0.5272530274E-01    0.4351975945E-01    0.4355359239E-01
       3    5    0.5418808773E+01   -0.4389735067E+02    0.3886543373E-01    0.3886543373E-01    0.3886543373E-01
       3    6    0.6726370673E+01   -0.4397144829E+02    0.8809362538E-01    0.8809362538E-01    0.8809362538E-01
       3    7    0.8041492838E+01   -0.4404354368E+02    0.5543086596E-01    0.5543086596E-01    0.5543086596E-01
                                                            .......
                                                            .......

各行に1つのレプリカに関するエネルギーや力の情報が出力されます。1列目がNEBステップ数，2列目がレプリカのID, 3列目が0番目のレプリカからの“距離”, 4列目がレプリカのエネルギー，5列目がレプリカに働く力の最大値，6列目がNEB力の最大値，7列目がレプリカに働く力の最大値を経路に射影した力（NEB力の計算に利用される力）の最大値に対応します。

- nfnebdynm.data

座標データの履歴が記録されます。通常のPHASEの計算で得られるnfdynm.dataファイルと比較すると簡略化された形式で出力されます。具体的には以下のような形式で出力されます。

    #step  image  atom  cps
       0    1    1        0.0000000000        0.0000000000        0.0000000000
       0    1    2        5.2000000098        5.2000000098        0.0000000000
       0    1    3        2.6000000049        2.6000000049        2.6000000049
       0    1    4        7.8000000147        7.8000000147        2.6000000049
       0    1    5        0.0000000000        5.2000000098        5.2000000098
       0    1    6        5.2000000098        0.0000000000        5.2000000098
       0    1    7        2.6000000049        7.8000000147        7.8000000147
       0    1    8        7.8000000147        2.6000000049        7.8000000147
       0    1    9        0.0000000000        0.0000000000       10.4000000197
       0    1   10        5.2000000098        5.2000000098       10.4000000197
       0    1   11        2.6000000049        2.6000000049       13.0000000246
       0    1   12        3.1080442326        2.0700339938       20.7869859136
       0    1   13        2.0700340645        3.1080442772       20.7869859136
       0    2    1        0.0000000000        0.0000000000        0.0000000000
       0    2    2        5.2000000098        5.2000000098        0.0000000000
       0    2    3        2.6000000049        2.6000000049        2.6000000049
       0    2    4        7.8000000147        7.8000000147        2.6000000049
       0    2    5        0.0000000000        5.2000000098        5.2000000098
       0    2    6        5.2000000098        0.0000000000        5.2000000098
       0    2    7        2.6000000049        7.8000000147        7.8000000147
       0    2    8        7.8000000147        2.6000000049        7.8000000147
       0    2    9        0.0000000000        0.0000000000       10.4000000197
       0    2   10        5.2000000098        5.2000000098       10.4000000197
       0    2   11        2.6000000049        2.6000000049       13.0000000246
       0    2   12        3.2652054480        1.9060914168       19.8836995566
       0    2   13        1.9060915098        3.2652055024       19.8836994729

各行が，あるNEBステップ・あるレプリカ・ある原子の座標データに対応します。1列目がNEBステップ，2列目がレプリカのID, 3列目がレプリカ内における原子のID, 4, 5, 6列目が原子座標です。座標は，ボーア単位，カルテシアン座標で出力されます。

nfefn.dataファイルとnfdynm.dataファイルは通常のPHASEの計算においてはそれぞれエネルギーおよび座標値の履歴が記録されるファイルですが， NEB計算の場合は最新のレプリカ列のエネルギーおよび座標データが記録されたファイルです。nfefn.dataファイルにはnfnebenfに記録されたデータの最後の NEBステップのデータが記録されます。nfdynm.dataファイルは，PHASEの通常の形式で記録されますが，通常の計算では構造最適化や分子動力学シミュレーションの 履歴となるところがレプリカ列になります。

### 計算例：シリコン表面に水素分子が解離吸着する反応

シリコン表面に水素分子が解離吸着する反応の例題の入力ファイルは， `samples/dynamics/neb/Si_H2` 以下にあります。

ここで紹介する例題は，シリコン表面に水素分子が解離吸着する反応をシミュレートします。始状態は表面と表面から十分離れた場所にある水素分子から成る系，始状態は表面のシリコン原子に水素分子が解離し，吸着した系です。始状態と終状態の構造をそれぞれ 図 5.68 と 図 5.69 に示します。 ただし，あくまで例題ですので，通常は実行する始状態，終状態の構造最適化は実行していません。

本例題の始状態

本例題の終状態

入力ファイル

controlブロックにおいて，全体的な計算条件の指定を行います。

    Control{
        condition = initial   ! {initial|continuation|automatic}
        cpumax = 1 day ! {sec|min|hour|day}
        max_iteration = 10000000
        multiple_replica_mode = ON
        multiple_replica_max_iteration = 2000
    }

multiple_replica_modeにONを指定することにより，NEBの計算が実行されます。また，NEBの繰り返し計算の上限回数をmultiple_replica_max_iteration 変数によって2000としています。

multiple_replicaブロックの下のstructureブロックにおいてレプリカの指定を実行しています。 以下のようになります。

    multiple_replica{
        ....
        structure{
            number_of_replicas = 6
            replicas{
                #tag replica_number  howtogive_coordinates   end0  end1
                1            proportional              0      -1 ! 0: end0, -1:end1
                2            proportional              0      -1
                3            proportional              0      -1
                4            proportional              0      -1
                5            proportional              0      -1
                6            proportional              0      -1
            }
            endpoint_images = directin ! {no or nothing | file | directin}
            howtogive_coordinates = from_endpoint_images
            atom_list_end0{
                coordinate_system = cartesian ! {internal|cartesian}
                atoms{
                #units angstrom
                #tag element rx ry rz
                Si    0.000000000000      0.000000000000      0.000000000000
                ...
                ...
                }
            }
            atom_list_end1{
                coordinate_system = cartesian ! {internal|cartesian}
                atoms{
                #units angstrom
                #tag element rx  ry  rz
                Si    0.000000000000      0.000000000000      0.000000000000
                ...
                ...
                }
            }
        }
        ....
    }

number_of_replicasに6と指定していますが，この指定によってレプリカ数を合計6としています。 replicasブロックにおいて実際にどのようにレプリカの座標を作るかを指定しています。この例では， すべて始状態・終状態の線形補完によって作る，という設定になります。 atom_list_end0およびatom_list_end1ブロックには始状態・終状態の座標値を指定しています。 この指定は，前記の通り通常のPHASEの座標指定と変わるところはありません。

    multiple_replica{
         ...
         accuracy{
                  dt = 40 au_time
                  neb_time_integral = quench
                  penalty_function = off
                  neb_convergence_condition = 3
                  neb_convergence_threshold = 5.0e-04
         }
    }

計算結果

本例題を実行すると得られる結果を紹介します。

図 5.70 に，本例題を実行すると得られる，NEBの繰り返し計算とNEB力の最大値の関係を示します。はじめのうちは大きな 力が働いていますが，計算が進行するにつれて小さくなっていき，41回の繰り返し計算の後収束判定を満たして計算が終了しています。

図 5.71 に，本例題を実行すると得られる各イメージとエネルギーの関係を示します。 この図より，遷移状態は4番目のレプリカであり，始状態から見ると障壁エネルギーが約1.08 eVであることが分かります。

NEB力の履歴

最終的に得られる反応経路と各レプリカのエネルギーの関係

図 5.72 に，遷移状態における原子配置を示します。この図から明らかなように，本例題では「水素分子が解離，そして吸着する」直前の構造が遷移状態です。

遷移状態における原子配置

### バージョン2020.01以上の機能を活用した計算例

バージョン2020.01以降新たに機能が加わっています。本節では白金(111)面における酸素原子の拡散を例に，これらの機能を活用して作成した入力と計算例を紹介します。

問題

Pt(111)面のfcc hollowサイトからhcp hollowサイトへ拡散する過程をNEB法で解析します。 サンプルデータは `samples/dynamics/neb/Pt111` 以下のサブディレクトリーにあります。面心立方格子の(111)面のhollowサイトには，二層下に原子が存在するサイト(通称fccサイト)と存在しないサイト(通称hcpサイト)が存在し，いずれも安定に原子が吸着できるサイトです。本例題では，酸素原子がPt(111)面のfcc hollowサイトからhcp hollowサイトへ拡散する過程をNEB法で解析します。fccが始状態(fccサイトに酸素原子が吸着した状態)の最適化計算を行ったディレクトリー，hcpが終状態(hcpサイトに酸素原子が吸着した状態)の最適化計算を行ったディレクトリー，fcc_hcpがfccサイトからhcpサイトへ酸素原子が拡散するNEB計算の入力ファイルが置かれたディレクトリーです。

始状態および終状態は 図 5.73 に示す通りです。NEB最適化手法は，比較のためFIRE法，CG法，quench法を採用しました。いずれの方法を使っても結果はほぼ同じものが得られることは確認できています。収束判定条件は，最大NEB力1×10-3 hartree/bohrとしました。また，CI-NEB法を有効にし，切り替えの閾値はデフォルト値を採用しました。

本例題の始状態（左図）と終状態（右）

入力ファイル

controlブロックにおいて，全体的な計算条件の指定を行います。

    Control{
        condition = initial   ! {initial|continuation|automatic}
        cpumax = 1 day ! {sec|min|hour|day}
        max_iteration = 10000000
        multiple_replica_mode = ON
    }

multiple_replica_modeにONを指定することにより，NEBの計算が実行されます。また，NEBの繰り返し計算の上限回数をmultiple_replica_max_iteration 変数によって2000としています。

multiple_replicaブロックの下のaccuracyブロックにおいてNEBの最適化の方法や収束判定条件を指定します。

    multiple_replica{
      ...
      accuracy{
         neb_time_integral = fire
         neb_convergence_condition = 3
         neb_convergence_threshold = 1.0e-03
      }
    }

multiple_replicaブロックの下のstructureブロックにおいてレプリカの指定を実行しています。 以下のようになります。

    multiple_replica{
         ....
      structure{
        number_of_replicas = 5
        endpoint_images = file
        end0_energy = -1308.2190366480
        end1_energy = -1308.2355763153
      }
    }

number_of_replicasに5と指定していますが，この指定によって中間レプリカ数を合計5としています。 endpoint_images = fileとし，nfdynm.dataファイルから始状態と終状態を読み込むことを指定しています。frameに関する情報は設定していないため，デフォルトの振る舞い（最後のフレーム）が採用されます。end0_energyとend1_energyにそれぞれ始状態と終状態のエネルギーが指定されています。この指定により，NEB iterationの1回目に限り実施される始状態と終状態のエネルギー計算を省略することができます。

multiple_replicaブロックの下のconstraintブロックにおいて，CI-NEBを有効にすることができます。

    multiple_replica{
      constraint{
        ci_neb = on
      }
    }

ci_nebがonと設定されていても，まずは通常のNEBが実行されます。収束判定条件が閾値以下になったあかつきにCI-NEBが有効になります。閾値のデフォルト値は，収束判定条件の値の2倍です。

最後に，file_names.dataファイルにおいて始状態と終状態のnfdynm.dataファイルの位置を指定します。

    ...

    &nebfiles
    F_IMAGE(0) = '../fcc/nfdynm.data'
    F_IMAGE(-1) = '../hcp/nfdynm.data'
    /

&nebfilesセクションにおいてNEB法で利用する始状態と終状態の読み込み先のnfdynm.dataファイルを指定します。ファイルポインターF_IMAGE(0)で始状態の，F_IMAGE(-1)で終状態の座標データファイルを指定します。この例では，1階層上のfccというディレクトリーの下のnfdynm.dataファイルを始状態，1階層上のhcpというディレクトリーの下のnfdynm.dataファイルを終状態として利用することになります。

計算結果

NEB力の履歴および得られた反応経路のエネルギ－を 図 5.74 に示しました。CG法，FIRE法はそれぞれ20回および32回のNEBステップで収束解を得ることができましたが，quench法は100回以上NEBを行っても収束判定条件を満たすことはできませんでした。

NEB力の履歴（左）と反応座標とエネルギーの関係（右）

### 使用における注意点

- レプリカ並列

NEB法は「レプリカ並列」に対応しています。レプリカ並列機能を使用するためには，引数に通常の ne=NE nk=NKに加え，並列したいレプリカ数をNRとするとnr=NRを加えます。 MPIプロセス数はNE x NK x NRと等しい必要があります。 たとえば，以下のようなコマンドになります。

    % mpirun -n N phase ne=NE nk=NK nr=NR

- 計算の停止と継続計算

NEB法は計算の停止と継続計算に対応していますが，通常の計算とは異なる手続きが必要です。

- 計算のストップ

入力データのmulti_replica_max_iteration，またはnfnebstop.dataに記述されたNEBのiteration数でNEB計算は終了します。また，各イメージの電子状態計算において，入力データのmax_iteration, cpumax, nfstop.dataファイルの設定によっても計算は終了します。いずれの場合でも，停止した箇所からリスタートすることが可能です。

計算ストップ時における通常のPHASEとの相違点を挙げます。PHASEでは，nfstop.dataファイルによって終了した場合，nfstop.dataファイルは空ファイルとなります。他方NEB計算では，あるイメージをnfstop.dataによって終了した場合，nfstop.dataはただちには空ファイルとはならず，ほかのイメージの計算を行います。NEB計算終了処理においてはじめてnfstop.dataファイルを空ファイルとします。

- 計算のリスタート

PHASEと同様，入力データにおいて，conditionの値をcontinuationとすることによってリスタート計算を行います。

    Control{
        condition = continuation
        ...
        ...
    }

リスタート時に利用するファイルは下記のファイルです。

・NEB計算: neb_continue.data

・電子状態計算: 各レプリカのPHASE用リスタートファイル;

neb_continue.data, continue.data_r*, continue_bin.data_r*, zaj.data_r*, nfchgt.data_r*

### 参考文献

Mills94

  7. Mills and H. Jónsson, ``Quantum and Thermal Effects in H2 Dissociative Adsorption: Evaluation of Free Energy Barriers in Multidimensional Quantum Systems'' Phys. Rev. Lett. 72 (1994) p. 1124.

Henkelman00

  2. 7. Henkelman, B. P. Uberuaga and H. Jónsson, ``A climbing image nudged elastic band method for finding saddle points and minimum energy paths'' J. Chem. Phys. 113 (2000) p. 9901.

## Dimer 法

### 機能の概要

Dimer法 [Henkelman99] とは，2つのレプリカが作るdimerを回転・並進させながらポテンシャルエネルギー表面の鞍点を探索する計算手法です。

Dimer法では，ある中心の座標 \(R\) から距離 \(\Delta R\) はなれた二つのレプリカの座標でdimerを構成します。Dimerの方向の単位ベクトルを \(N\) とすると，二つのレプリカの座標 \(R_1, R_2\) は以下のように記述することができます。

()\[\begin{split}R_1 = R+\Delta R N \\ R_2 = R - \Delta R N\end{split}\]

レプリカ1, 2のエネルギーと原子間力をそれぞれ \(E_1 , F_1 , E_2 , F_2\) と記述し，さらにdimerの中心のエネルギーと原子間力をそれぞれ \(E_0 , F_R\) dimerそのもののエネルギーは \(E = E_1+E_2\) , \(F_R\) は単純に \(\frac{1}{2} \left( F_1 + F_2 \right)\) とします。Dimerの向きの曲率は次のように近似することができます。

()\[C = \frac{\left(F_1-F_2\right) \cdot N}{2\Delta R} = \frac{E-2E_0}{\Delta R^2}\]

(5.69) 式より \(E_0\) は次のように計算することができます。

()\[E_0 = \frac{E}{2} + \frac{\Delta R}{4} \left( F_1-F_2 \right) \cdot N\]

Dimerの回転は，「回転力」 \(F^\perp = F_1^\perp - F_2^\perp\) にそって行われます。\(F^\perp\) に水平な単位ベクトルを \(\Theta\) とすると，レプリカ1, 2に対する回転操作は次のように記述することができます。

()\[R_{1/2}^\ast = R \pm{\left( N \cos{\theta} + \Theta \sin{\theta} \right)\Delta R}\]

最適な回転角 \(\theta\) はまず微小な角度 \(d \theta\) によるトライアル回転によって得られた原子間力から決めます。\(d \theta\) 回転した結果得られた レプリカ1, 2の原子間力 \(F_1^\ast, F_2^\ast\) また \(F^\ast = F_1^\ast - F_2^\ast\) を定義し，さらに \(F=F^\perp \cdot \Theta\) と \(F\) の数値微分 \(F^\prime \neq \frac{F^\ast \cdot \Theta^\ast - F \cdot \Theta}{d\theta}\) を用いると最適な回転角 \(\Delta \theta\) は以下のように求められます。

()\[\Delta \theta = - \frac{1}{2} \arctan{\frac{2F}{F^\prime}}\]

このように決まった \(\Delta \theta\) と (5.71) 式を用いてdimerに回転を施します。

Dimerを回転したあと鞍点に向かってdimerを並進します。並進は，以下のような原子間力を用いて行います。

()\[\begin{split}F^\perp = \begin{cases} -F^\parallel & C>0 \\ F-2F^\parallel & C<0> \end{cases}\end{split}\]

並進はquenched MDによって行います。トライアル回転後と他移転後各レプリカについてエネルギー，原子間力の計算を行うので，1回のdimer iterationにつき4回のSCF計算を実施します。

### 入力パラメータ

Dimer法を有効にするためには，以下のような設定を施します。

    Control{
        condition = initial   ! {initial|continuation|automatic}
        cpumax = 1 day ! {sec|min|hour|day}
        max_iteration = 10000000
        multiple_replica_mode = ON
        multiple_replica_method = dimer
        multiple_replica_max_iteration = 2000
    }

NEBと同じように，controlブロックにおいてmultiple_replica_mode = onとします。さらに，multiple_replica_method = dimerを指定するとdimer法が用いられるようになります。multiple_replica_max_iterationの意味はNEBの場合と同様です。

Dimer法の詳細設定もNEBと同じようにmultiple_replicaブロックにおいて行います。以下のような設定を施すことができます。

    multiple_replica{
        accuracy{
            dt = 20 au_time
            dimer_convergence_threshold = 5.0e-04
        }
        dimer{
             delta_r = 0.01 angstrom
            delta_theta = 0.001
        }
        structure{
            endpoint_images = directin ! {no or nothing | file | directin}
            howtogive_coordinates = from_endpoint_images
            atom_list_end0{
                coordinate_system = cartesian ! {internal|cartesian}
                atoms{
                #tag element rx ry rz
          Si    0.000000000    0.000000000    0.000000000
          Si    5.200000010    5.200000010    0.000000000
          ...
               }
           }
           atom_list_end1{
                    coordinate_system = cartesian ! {internal|cartesian}
               atoms{
               #tag element rx  ry  rz
          Si    0.000000000    0.000000000    0.000000000
          Si    5.200000010    5.200000010    0.000000000
          ...
          ...
               }
           }
        }
    }

multiple_replicaのaccuracyブロックにおいてdimer法の精度に関わる設定を行うことができます。dtでquench法の時間刻みを指定することができます。dimer_convergence_thresholdによって収束判定条件を設定することができます。 dimerブロックのdelta_r, delta_thetaによってそれぞれ \(\Delta R, d\theta\) の値を設定することができます。\(\Delta R\) のデフォルト値は0.01 Å \(d\theta\) のデフォルト値は0.001 radianです。初期dimerはNEBの始点・終点と同じ方法 で指定した2つのレプリカをもとに作成されます。すなわち，NEBの始点に相当する座標を \(R_1\) 終点に相当する座標を \(R_2\) とすると，\(\frac{\left(R_1+R_2\right)}{2}\) がダイマー中心，\(\frac{\left(R_1-R_2\right)}{\left|R_1-R_2\right|}\) がベクトル \(N\) に相当します。

### 出力ファイル

結果はnfefn.dataおよびnfdynm.dataファイルに記録されます。nfefn.dataファイルの内容は，典型的には下記のようになります。

    1      -43.925344990434660        0.0353683091
    2      -43.926190890438960        0.0336994667
    3      -43.927411726085005        0.0330083334
    ...
    ...

1カラム目がdimer iterationの回数，2カラム目がダイマー中心のエネルギー，3カラム目が並進力です。nfdynm.dataファイルには，通常のnfdynm.dataファイルと同じ形式でダイマー中心の座標データがdimer iterationごとに出力されます。

### 計算例1: Si上の水素分子解離

NEB法の例題にも付属するSi上での水素分子解離の過程をdimer法によって解析します。入力データは `samples/dynamics/dimer/h-Si` 以下にあります。 用いた初期ダイマーはNEBで得られたレプリカ列のうち遷移状態の前後2つのレプリカを抽出して作成しました。その他Dimer法に関わる計算条件は以下の通り。

設定値 | 値
\(\Delta R\) | 0.01
\(d \theta\) | 0.001 radian
収束判定条件 | 5e-4

Dimer法のエネルギーおよび最大並進力を 図 5.75 に示します。もともと遷移状態に近いところから計算を始めているため，比較的スムーズな収束が得られています。

Dimer法の履歴

表 5.29 に得られた遷移状態をCI-NEB法の結果を比較しました。表中のzとは水素分子のz座標のことです。 Dimer法とCI-NEB法の結果はほぼ一致しました。zの値が異なりますが，これはこの問題がzに対して鈍感であるからと考えられます。

CI-NEB法との比較
| CI-NEB | dimer
energy (Ha) | -43.9380 | -43.9381
z (Bohr) | 16.711 | 16.748

### 計算例2: Ptにおける酸素原子の拡散

NEB法の例題にも付属するPt(111)面における酸素原子拡散の問題をdimer法で計算してみます。入力データは `samples/dynamics/dymer/Pt111` 以下にあります。 初期ダイマーはNEBの始状態・終状態をもとに作成しました。その他のdimer法の条件はSi上の水素分子の場合と全く同様です。

Dimer法の履歴

表 5.30 に得られた遷移状態をCI-NEB法の結果を比較しました。表中のx, y, zは酸素原子のx, y, z座標です。完全に一致するわけではありませんが，CI-NEB法との差は0.01 bohr程度で両者はよく一致しています。

CI-NEB法との比較
| CI-NEB | dimer
energy (Ha) | -1308.214122 | -1308.214122
x (Bohr) | 20.19726 | 20.21692
y (Bohr) | 11.66089 | 11.67224
y (Bohr) | 12.64020 | 12.63675

### 参考文献

Henkelman99

  Graeme Henkelman and Hannes Jónsson “A dimer method for finding saddle points on high dimensional potential surfaces using only first derivatives”, JOURNAL OF CHEMICAL PHYSICS 111 7010-7022 (1999).

## 拘束条件付きダイナミクスとBlue Moon 法による自由エネルギー解析

### 機能の概要

化学反応経路を探索する手法として，ボンド長やボンド角などの化学反応を特徴づける 「反応座標」を導入し，想定した反応経路上でその値を逐次変化させながら 反応座標を拘束した構造最適化や分子動力学シミュレーションを実施する，という手法が あります。単純な構造最適化の場合絶対零度における反応経路が得られ，有限温度の 分子動力学シミュレーションを実施すると自由エネルギー差が得られます。ここでは， PHASEを利用して拘束条件付きダイナミクスを追跡する方法を説明します。

### 入力パラメータ

本機能と関連あるタグの一覧を表に示します。

拘束条件付きダイナミクスに関連のあるタグの一覧
第1 ブロック識別子 | 第2，第3ブロ ック識別子 | タグ識別子 | 説明
--- | --- | --- | ---
control |  |  |
|  | driver | ダイナ ミクスの種類を 選択する変数。 拘束条件付き ダイナミクスの 場合constrain tsを指定する。
structure |  |  | 原子座 標データの指定 を行うブロック
| constrainablexx |  | 拘束条件を定義 するブロック。 xxには拘束 条件を識別する ための整数を1 はじまりで指定
|  | type | 拘束条件の “種類”の指定． bond_length, bond_angle, dihedral_angle bond_length_diff, bond_angle_diff, dist ance_from_pos, plane, center_of_mass, coordination_number
|  | atomx | 拘束条件が関わ る原子を指定す る。xは整数で ，たとえばtype = bond_len gthの場合2原子 が拘束に関わる のでatom1とato m2で指定する。
|  | mobile | 拘束条件 が“可動化否か” を指定する。on とすると可動， offとす ると不動。デフ ォルト値はoff
|  | monitor | 指定の拘束 条件を“監視”す るかどうかを指 定する真偽値。 デフ ォルト値はoff
| reaction_coordinate |  | 指 定の拘束条件が “反応座標”とし たい場合に作成 するブロック。
|  | sw_reaction_coordinate | on の場合反応座標 とみなされる。
|  | init_value | 反応経路の 初期値を対応す る単位で指定。
|  | final_value | 反応経路の 最終値を対応す る単位で指定。
|  | increment | final_valu e,init_valueの 刻み幅を指定。
| plane |  | 面内拘束 における面の法 線ベクトルを指 定するブロック
|  | normx,normy,normz | 法線ベクト ルのx,y,z成分
| distance_from_pos |  | 場所の指定 を行うブロック
|  | posx,posy,posz | 指定したい場 所のx,y,z成分
| coordination_number |  | 配位数指定 を行うブロック
|  | kappa_inv | 配位数定義式の \(\kappa\) の逆数を長 さの単位で指定
|  | kappa | 配位数定義式の \(\kappa\) 1/bohr単位で 指定
|  | rcut | 配位数定義式 の \(r_c\) の値を長 さの単位で指定
| center_of_mass |  | 重心を変化 させる方向を指 定するブロック
|  | directionx | 指定した い方向のx成分
|  | directiony | 指定した い方向のy成分
|  | directionz | 指定した い方向のz成分
structure_evolution |  |  | 原子ダイ ナミクスの設定 を行うブロック
|  | method | 原子ダ イナミクスの方 法を指定する。 拘 束条件付きダイ ナミクスの場合 quench,damp, velocity_verlet temperature_control のみ利用可能。

拘束条件付きダイナミクスを実行するには，まず以下の要領でconditionブロックの下でdriver変数を指定します。

    condition{
      ...
      driver=constraints
      ...
    }

次に，以下のようにstructureブロックの下にconstrainablexxブロックを作成します。ここでxxは整数です。

    structure{
        ...
        ...
        constrainable1{
           type=bond_length
           atom1=1
           atom2=2
           mobile = off
           monitor = off
           reaction_coordinate{
              sw_reaction_coordinate=on
              init_value = 2.4 angstrom
              increment  = 0.1 angstrom
              final_value = 8.0 angstrom
           }
           plane{
               normx=1
               normy=0
               normz=0
           }
           coordination_number{
               kappa = 5.0
               rc     = 2.0 angstrom
           }
        }
        ...
        ...
    }

拘束条件はいくつでも指定可能ですが，たとえばconstrainable1, constrainable2, constrainable4という3つのconstrainablexxブロックが存在する場合，constrainable4ブロックは入力解釈の対象にはなりません。また，互いに相いれない拘束条件を定義してしまうと，拘束条件を課すための収束計算が破たんしてしまう場合がありますので注意が必要です。 constrainablexxブロックの下では，以下の変数/ブロックを指定することができます。

type変数 |  | 拘束条件の“種類”を指 定します。以下のいず れかの値をとります。
| bond_length | 2原子間の の距離を拘束します。
| bond_angle | 3原子の成すボ ンド角を拘束します。
| dihedral_angle | 4原子の 2面角を拘束します。
| bond_length_diff | 2原子間の距 離の差を拘束します。
| bond_angle_diff | 3原子が成す角 度の差を拘束します。
| distance_from_pos | 指定の場所から の距離を拘束します。
| plane | 面内に指定 の原子を拘束します。
| center_of_mass | 指定の原子群 の重心を拘束します。
| coordination_number | 配位数を 拘束します。配位数の 決め方は後述します。
atomx 変数 |  | 指定 の拘束条件が関わる原 子を指定します。xは 数字であり，たとえば 2原子間の距離の場合 は2つの原子が拘束に 関わるので，atom1と atom2に対応する原子 の番号を指定します。 typeが coordination_number の場合，配位数 を計算する中心の原子 の番号を指定します。
mobile 変数 |  | 指定の拘束条 件が“可動か否か”を指 定するためのスイッチ です。offとすると拘 束され，onとすると拘 束はされません。デフ ォルト値はoffです。
monitor 変数 |  | 指定の拘束条件 を“監視”（値を算出し ，ログファイルに出力 ）するか否かを指定す るスイッチです。デフ ォルト値はoffです。
reaction_coordinate ブロック |  | 指定 の拘束条件が，“反応 座標(逐次値を変化さ せられる)”である場合 に作成するブロックで す。以下の変数を指定 することができます。
| sw_reaction_coordinate | onの際，反応 座標とみなされます。
| init_value | 反応経路 の初期値を，対応する 単位で指定します。指 定がない場合，入力の 原子配置から求められ る値が採用されます。 この値と，入力の 原子配置から求められ る値が異なる場合，入 力の原子配置が修正さ れたのちに計算が実行 されます。このため， 一回目の(拘束力も 含む)原子に働く力の 最大値が見掛け上非常 に大きな値となること がありますが，これは 正常な振る舞いです。
| final_value | 反応 経路の最終値を対応す る単位で指定します。
| increment | final_val ueとinit_valueの間の 刻み幅を指定します。
|  | 反応座標を 逐次変化させる場合, 以下 のケースは特殊である ので注意が必要です.
| typeがplaneの場合 | この場合，変化す るのは面の原点です. 原 点の座標値は，指定の 法線ベクトルと原子の 座標値からプログラム が自動的に決めますが ，反応座標の変化とし ては，法線ベクトルの 方向に原点が変化する ，という振る舞いにな ります。init_value, final_value, i ncrementは，この原点 の移動量を指定してく ださい。なお，この場 合のinit_valueのデフ ォルト値は0ですが， 通常明示的に指定する 必要はないはずです。
| typeが center_of_massの場合 | この場合，重心を ，指定の方向に移動さ せます。init_value, final_value, incrementは，こ の移動量を指定してく ださい。なお，この場 合のinit_valueのデフ ォルト値は0ですが， 通常明示的に指定する 必要はないはずです。
planeブロック |  |
| normx | 法線ベクトルの \(x\)座標。
| normy | 法線ベクトルの \(y\)座標。
| normz | 法線ベクトルの \(z\)座標。
distance_from_posブロック |  | typeとして distance_from_posを 採用する場合の，場所 の指定を行うブロック です。次の変数を指定 することができます。
| posx | 指 定したい場所の， \(x\) 座標を長さ の単位で指定します。
| posy | 指 定したい場所の， \(y\) 座標を長さ の単位で指定します。
| posz | 指 定したい場所の， \(z\) 座標を長さ の単位で指定します。
coordination_numberブロック |  | 配位数拘束の 定義式における \(\kappa,r_c\) の 値を指定するブロック です。次の変数を指定 することができます。
| kappa_inv | \(\kappa\) の値を，長さ の単位で指定します。
| kappa | \(\kappa\) の 値を，1/bohr単位で指 定します。kappa_inv よりも優先されます。
| rcut | \(r_c\) の値を，長さ の単位で指定します。
center_of_massブロック |  | typeとしてcenter_of_ma ssを採用し，かつ反応 座標を変化させる場合 ，「変化させる方向」 をここで指定します。
| directionx | 変化させ る方向の\(x\) 座標を指定します。
| directiony | 変化させ る方向の\(y\) 座標を指定します。
| directionz | 変化させ る方向の\(z\) 座標を指定します。

配位数の決め方

type = coordination_numberの場合，配位数を拘束します。ここで \(j\) 番目の原子の配位数は以下の式によって評価します。

\[\begin{split}\sigma = \sum_{i \neq j} S\left( \left| \mathbf{r}_i - \mathbf{r}_j \right| \right), \\ S\left(r\right) = \frac{1}{\exp \left[ \kappa \left(r-r_c\right)\right]}.\end{split}\]

\(\kappa, r_c\) はパラメーターであり，first coordination shellでほどよく0に近づくように決定します。

拘束条件の指定の次は，採用するダイナミクスのアルゴリズムを指定します。通常のPHASEの入力と同様，structure_evolutionブロックの下で行います。

    structure_evolution{
        method=quench
        dt=40
        ...
    }

ここで，methodとしてはquench, damp, velocity_verlet, temperature_controlを利用することができます。拘束条件を課している場合，gdiis, cgなどには現バージョンでは未対応なのでご注意ください。また，dampはdamped molecular dynamics法による構造最適化を実施する場合に指定します。この手法は，多くの場合単純なquenched MDよりは大きな時間刻み(dt)を採用することができ，速く収束させることのできる手法です。

次に、反応座標の変化の指定方法について説明します。

- 複数の反応座標を逐次変化させる方法

複数の反応座標を逐次変化させる場合のプログラムの振る舞いを説明します。たとえば以下のように入力で指定した場合について説明します。

    structure{
        ....
        ....
        constrainable1{
          mobile = off
          monitor = on
          type = dihedral_angle
          atom1 = 2
          atom2 = 4
          atom3 = 3
          atom4 = 1
          reaction_coordinate{
            sw_reaction_coordinate = on
            init_value = -179 degree
            final_value = -1 degree
            increment = 5 degree
          }
        }
        constrainable2{
          type=bond_length
          monitor=on
          atom1=3
          atom2=4
          reaction_coordinate{
            sw_reaction_coordinate=on
            init_value = 1.2 angstrom
            final_value = 1.6 angstrom
            increment = 0.05 angstrom
          }
        }
        ....
        ....
    }

まず，constrainable1ブロックにおいて2面角を-179°から-1°まで5°刻みで変化させるように指定しています。 さらに，constrainable2ブロックにおいてはボンド長を1.2 Åから1.6 Åまで0.05 Å刻みで変化させるように指定をしています。このような入力を記述した場合， まずボンド長を1.2 Åに固定した状態で2面角を-179°から-1°まで変化させて計算が実行されます。-1°の計算が終了したら，次はボンド長を1.25 Åに変化させ，今度は-1°から-179°まで2面角を変化させる計算を実行します。このような変化のさせ方を採用することによって，隣り合う反応座標の組の間で原子配置が 極端に変化することを防いでいます。

以上のような方針で検討する反応座標が決まりますので，合計すると検討する反応座標の数は反応座標\(\alpha\)において検討する反応座標の数を\(n_{\alpha}\)とすると\(\prod_{\alpha}^{}n_{\alpha}\)となります。これよりもきめ細やかに反応座標の組を指定するには，次に説明する「反応座標の変化の仕方をファイルを介して指定する」機能を利用します。

- ファイルから反応座標の変化の仕方を指定する方法

拘束条件の変化のさせ方は上述のreaction_coordinateブロックにおいて指定しますが，この方法の場合は等間隔の指定です。特に前述の，複数の反応座標を変化させる計算においては，反応座標\(\alpha\)において検討する反応座標の数を\(n_{\alpha}\)とすると\(\prod_{\alpha}^{}n_{\alpha}\)個の反応座標を検討することになり，計算時間が膨大になることがあります。このような制限が問題となる場合に，「反応座標（の組）」をファイルから指定することが可能となっています。

まず，検討したい拘束条件をconstrainablexxブロックにおいて通常通り指定します。次に，structureブロックの下に以下の変数を定義します。

    structure{
      ....
      reac_coord_generation = via_file
      ....
    }

最後に，作業ディレクトリーにreac_coords.dataというファイル名のファイルを作成し，次のような内容を記述します。

     1       -1.9373154697        2.2676711906
     2       -1.7627825445        2.2676711906
     3       -1.5882496193        2.2676711906
     4       -1.4137166941        2.2676711906
     5       -1.2391837689        2.2676711906
     6       -1.0646508437        2.2676711906
     7       -0.8901179185        2.2676711906
     8       -0.7155849933        2.2676711906
     9       -0.7155849933        2.3621574902
    10       -0.8901179185        2.3621574902
    11       -1.0646508437        2.3621574902
    12       -1.2391837689        2.3621574902
    13       -1.4137166941        2.3621574902
    14       -1.5882496193        2.3621574902
    15       -1.7627825445        2.3621574902
    16       -1.9373154697        2.3621574902
    17       -1.9373154697        2.4566437898
    18       -1.7627825445        2.4566437898
    19       -1.5882496193        2.4566437898
    20       -1.4137166941        2.4566437898
    21       -1.2391837689        2.4566437898
    22       -1.0646508437        2.4566437898
    23       -0.8901179185        2.4566437898
    24       -0.7155849933        2.4566437898
              ......
              ......
              ......

各行が1つの反応座標の組に相当します。行の1列目にはその反応座標の組を識別するための番号を整数で入力します。2列目以降は，定義した拘束条件の順番で反応座標の値を入力します。 この例では2種類の反応座標を検討していることになります。1つ目の反応座標の組では1番目の拘束条件として“-1.9373154697”という値，2番目の拘束条件として“2.26711906”という値を 指定することになります。単位は，PHASEのデフォルトの単位を利用して指定するようにしてください。長さならばbohr単位, 角度ならradian単位です。

### 計算の実行方法

拘束条件付きダイナミクスは，「反応座標を逐次変化させて計算する」ケースにおいては原子配置に対する並列計算に対応しています。PHASEを以下のように起動してください。

    % mpirun -np NP phase ne=NE nk=NK nr=NR

ここで，NPがMPIプロセス数，NEがバンド並列数，NKが\(\mathbf{k}\)点並列数，NRが原子配置並列数であり，NP = NE x NK x NRという関係が成立している必要があります。 この機能を利用する場合，継続計算の処理がプログラム内で若干変化するので，継続計算間でnrを指定したりしなかったりするとエラーとなる点にご注意ください。 nrは1でも構わないので，原子配置並列を継続計算のあるタイミングで無効にする場合，NRを1とすれば目的の動作を達成することができます。

### 計算結果の出力

出力ファイルは，「反応座標を逐次変化させる」機能を利用していない場合は通常のPHASEの出力と 同様です。すなわち，file_names.dataファイルにおいてF_ENF識別子によって指定される ファイルに各ステップにおけるエネルギーや原子に働く力の最大値が，F_DYNM識別子によって 指定されるファイルに各ステップにおける原子配置や各原子に働く力が出力されます。 ただし，「原子に働く力の最大値」は，拘束条件を課すために必要な「拘束力」も含む点に 注意が必要です。

他方，「反応座標を逐次変化させる」計算を実行している場合，次のようなファイル群が出力されます(ここで，F_ENF識別子によって指定されるファイルのファイル名をnfefn.data, F_DYNM識別子によって指定されるファイルのファイル名をnfdynm.dataとします)。

nfefn.data.reacxx | xx 番目の反応座標の，各ステップにお けるエネルギーおよび原子に働く力 の最大値のデータが出力されます。
--- | ---
nfefn.data.converged (構造最適化の場合のみ) | 各反応座標において，反応座 標の値そのものと，収束したエネル ギーおよび原子に働く力の最大値が 出力されます。反応座標とエネルギ ーの関係をプロットすることによっ て，「反応経路」と「エネルギー」 の関係を解析することができます。
nfdynm.data.reacxx | xx番目の反応 座標の，各ステップにおける原子配 置や原子に働く力が出力されます。
nfdynm.data.converged (構造最適化の場合のみ) | 各反 応座標において，構造最適化が収束 した後の原子配置が出力されます。
nfbluemoon.data.reacxx (分子動 力学シミュレーションの場合のみ) | xx番 目の反応座標の，自由エネルギー差 を算出するために必要なラグランジ ュの未定乗数の値が記録されます。

さらに，継続計算ファイルや波動関数・電荷密度ファイルなどは反応座標ごとに出力されます。

### Blue Moon法による自由エネルギーの計算

機能の概要

拘束条件付きの分子動力学シミュレーションが発生する統計集合(blue moon ensemble)のデータを利用すると，検討した反応座標の経路上における自由エネルギーの変化を算出することができます [Sprik98] 。

反応座標が\(\xi_{1}\)から\(\xi_{2}\)へ変化する場合の自由エネルギー差は，次のように計算することが可能です。

\[W\left( \xi_{1} \right) - W\left( \xi_{2}) \right) = \int_{\xi_{2}}^{\xi_{1}}d\xi\frac{\partial W}{\partial\xi}.\]

ここで自由エネルギーの反応座標微分，\(\left\langle \frac{\partial W}{\partial\xi} \right\rangle_{\xi}\)はmean forceと呼ばれる物理量であり，ハミルトニアンの反応座標微分と次のような関係があります。

\[\frac{\partial W}{\partial\xi} = \left\langle \frac{\partial H}{\partial\xi} \right\rangle_{\xi}^{\text{cond}}.\]

ここで\(\left\langle \cdots \right\rangle^{\text{cond}}\)とは「条件付き統計平均」です。拘束条件付き分子動力学シミュレーションの統計平均と条件付き統計平均は単純には結びつきませんが，拘束条件付き分子動力学を遂行する際に計算するラグランジュの未定乗数\(\lambda\)を利用して以下のように計算することができます。

\[\frac{\partial W}{\partial\xi} = - \frac{\left\langle \left| \Xi \right|^{- 1/2}\lambda \right\rangle}{\left\langle \left| \Xi \right|^{- 1/2} \right\rangle}\]
\[\Xi = \sum_{i}^{}\frac{1}{m_{i}}\frac{\partial\xi}{\partial{\overrightarrow{r}}_{i}}\frac{\partial\xi}{\partial{\overrightarrow{r}}_{i}}\]

上式には，厳密にはより複雑な補正項がつきますが，実用上は問題ないとされています。

PHASEによる拘束条件付き分子動力学シミュレーションの結果から自由エネルギー差を計算するには, PHASEパッケージに付属しているbluemoonプログラムを利用します。

現バージョンでは，bluemoonプログラムは反応座標が1つの場合のみに対応しています。

bluemoonプログラムのコンパイル

bluemoonプログラムのソースコードは，PHASEインストールディレクトリーのsrc_bmディレクトリーに納められています。bluemoonプログラムはFortran90コンパイラーとCコンパイラーを必要とします。Fortran90コンパイラーを環境変数F90に，Cコンパイラーを環境変数CCに設定し，makeコマンドを発行すればコンパイルすることができます。以下はお使いのシステムがbashで，Fortranコンパイラーのコマンドがf90，Cコンパイラーのコマンドがccの場合の例です。

    % cd phase0_2020.01
    % cd src_bm
    % export F90=f90
    % export CC=cc
    % make
    % make install

環境変数F90とCCの指定がない場合，gfortranとgccがデフォルト値として利用されます。 コンパイルが終了すると，bluemoonという名前の小さなプログラムが作成されます。 % make installとすると phase0_2020.01/binディレクトリーの下にbluemoonを移すことができます。

bluemoonプログラムの入力パラメータ

bluemoonプログラムの入力ファイルは，PHASEのそれと同等です。nfinp.dataファイルにthermodynamic_integrationブロックを作成し，計算条件を入力します。たとえば以下のようになります。

    thermodynamic_integration{
      nsteps=2000
      nequib=1000
      istart_reac_coords=1
      nreac_coords=14
      nsample=10
      smooth=off
      basedir=.
    }

thermodynamic_integrationブロックでは以下の指定を行うことができます。

拘束条件付きダイナミクスに関連のあるタグの一覧
nsteps | 各反応座標における分子動力学シミュレーションの 総ステップ数を指定します。デフォルト値は2000で すが，実施した計算に合わせて変更してください。
nequib | nstepsの内，平衡化のため捨てる ステップ数を指定します。nstepsよりも小さく，熱 平衡に至ったと考えられる値を指定してください。
istart_reac_coords | 最初に検討する反 応座標のIDを入力します。デフォルト値は1です。
nreac_coords | 最後に検討する反応座標の数を指定します。
nsample | 統計誤差を見積もる場合に シミュレーションを何分割するかを指定します。
smooth | onとすると，三次のス プライン関数によって計算結果を滑らかにします。
basedir | 結果を出力するディレクトリーを指定しま す。デフォルト値はカレントディレクトリーです。

bluemoonプログラムの実行方法

以上のような入力を作成したら，次のようにbluemoonを走らせます。

    % bluemoon inputfile

引数で指定するinputfileは入力ファイルのファイル名です。指定がない場合，nfinp.dataという文字列が採用されます。

計算結果の出力

計算が終了すると，次のファイルが作成されます。

- potential_of_mean_force.data

自由エネルギーの計算結果が出力されます。以下のような形式で出力されます。

    #value, potetial of mean force in Hartree, eV, kcal/mol, kJ/mol
    2.4566437898 -0.0215821952 0.0003443042 -0.5872816633
    0.0093689992 -13.5430301648 0.2160541460 -56.6640534911 0.9039707906
    2.2676711910 -0.0224669448 0.0003796767 -0.6113569350
    0.0103315334 -14.0982188431 0.2382507016 -58.9869635475 0.9968412043
    2.0786985910 -0.0226882285 0.0004435350 -0.6173783747
    0.0120692073 -14.2370764737 0.2783223931 -59.5679440305 1.1645012069
                                                    ............
                                                    ............
                                                    ............

各行が1つの反応座標のデータに相当します。1列目が反応座標の値，2列目，3列目がハートリー単位，4列目，5列目が電子ボルト単位，6行目と7行目がkcal/mol単位，8行目と9行目がkJ/mol単位での自由エネルギーとその統計誤差の結果に対応します。

- ean_force_raw.data

検討した反応座標から得られるmean forceの計算結果が出力されます。次のような形式で出力されます。

    2.4566437898        0.0066082098        0.0188118786
    2.2676711910        0.0034758686        0.0099291734
    2.0786985910       -0.0009537509        0.0028573953
    1.8897259920       -0.0074922663        0.0213420952
    1.7007533930       -0.0098143395        0.0279585555
    1.5117807940       -0.0157974842        0.0449758051
    1.3228081950       -0.0161451965        0.0459534340
                        ............
                        ............
                        ............

potential_of_mean_force.dataファイルと同様に，各行が1つの反応座標のデータに相当します。1列目が反応座標の値，2列目がmean forceの値(単位：hartree/対応する反応座標の単位)，3列目が統計誤差に相当します。

- mean_force_smoothed.data

三次のスプライン関数によって自由エネルギー計算を滑らかにする場合mean forceを滑らかにしたあとに(20)式の積分を実施しますが，その滑らかにしたmean forceの計算結果が出力されます。 そのデータ形式は，mean_force_raw.dataファイルから統計誤差の列を除いたものになります。

### 計算例：H2O2およびH2S2分子の回転障壁の解析

拘束条件付き構造最適化計算の例として，H2O2およびH2S2分子の回転障壁の解析例を紹介します。 H2O2, H2S2は 図 5.77 で示す分子構造を有する単純な分子です。HOOH (HSSH)が成す2面角の回転ポテンシャルは，H原子同士の相互作用とH原子とO(S)原子の孤立原子対との相互作用が競合し，W型ポテンシャルになることが知られています。2面角を拘束した構造最適化を複数の2面角において実施することにより，このような振る舞いが得られるかどうかを確認します。

H2O2およびH2S2分子の分子構造

この例題の入力ファイルは， `samples/dynamics/constraints` ディレクトリー以下， `H2O2` および `H2S2` ディレクトリーにあります。まず，structureブロックの下には以下の記述があります。

    structure{
        constrainable1{
          type = dihedral_angle
          atom1 = 2
          atom2 = 4
          atom3 = 3
          atom4 = 1
          reaction_coordinate{
            sw_reaction_coordinate = on
            init_value = 9 degree
            final_value = 179 degree
            increment = 10 degree
          }
        }
        ...
        ...
    }

constrainable1ブロックを作成し，その下で拘束条件の指定を行っています。この例題では拘束条件は 一つのみ課しますが，互いに相いれる拘束条件であるならばいくつでも定義することが可能です。 今は2面角の拘束を実施するので，type変数としてはdihedral_angleを指定しています。 また，2面角を定義するために必要な4つの原子の番号をatom1からatom4変数によって指定しています。 さらに，reaction_coordinateブロックを作成し，この拘束条件を逐次変化させる指定を行います。 sw_reaction_coordinateをon, init_valueとfinal_valueをそれぞれ9 degreeと179 degree, incrementを10 degreeとしていますが，このような指定によって，9°から179°まで，10°刻みで 2面角を変化させて構造最適化を行います。

図 5.78 に，2面角と最適化の結果得られたエネルギーの関係を示します。図 5.78 には，実験結果 [Pelz93] も併せて実線で表示しています。一見して明らかなように，計算結果と実験結果はよい一致が得られています（おおよそ1 kcal/mol程度の違い）。

H2O2とH2S2の大きな違いは2点あります。1点目は，安定な2面角の値です。H2O2は4面体の角度である109.5°に近い値が安定であるのに対し，H2S2は90°付近が安定な2面角です。2点目はtrans障壁エネルギ( 図 5.78 では180°付近の障壁エネルギー）の高さです。H2O2と比較すると，H2S2のtrans障壁ははるかに大きく，実験的には約6倍の値が得られています。いずれの点も本計算によって再現されており，妥当な結果が得られているものと考えられます。

H2O2およびH2S2分子の2面角とエネルギーの関係

### 使用における注意点

拘束条件付きダイナミクスは，全ての擬ポテンシャルと組み合わせて利用することができます。継続計算にも対応しています。また，反応座標に対する並列を実行することができます。 反応座標に対して並列計算を行う場合，NEB法の場合と同様以下のようなコマンドを利用します。

    % mpirun -n NP phase ne=NE nk=NK nr=NR

### 参考文献

Sprik98

  Michiel Sprik and Giovanni Ciccotti, Journal of Chemical Physics 109 (1998) p. 7737.

Pelz93

  7. Pelz, K. Yamada, and G. Winnewisser, Journal of Molecular Spectroscopy 159, (1993) p. 507.

## Meta-dynamics 法

### 機能の概要

Meta-dynamics法 [Laio02] , [Iannuzzi03] は，化学反応などの障壁エネルギーの存在する過程を効率よく解析するための手法です。Meta-dynamics法においては，\(S_{\alpha}\left( r \right)\) という“集団変数”を導入します。ここでいう集団変数とは，具体的には対象とする系の原子座標から定義可能な反応座標（ボンド長やボンド角などの内部座標や配位数など）を複数集めたものです。各集団変数には，仮想的な“粒子”が割り当てられるます。この，“仮想的な粒子の運動”のことをMeta-dynamicsとよびます。Meta-dynamicsのアルゴリズムをうまく設計することによって，効率よく（検討している集団変数が作る）自由エネルギー表面を探索することができると考えられます。ここでは，PHASEに実装されたMeta-dynamics法の利用方法を説明します。

Meta-dynamics法では，計算の履歴に依存するバイアスポテンシャル\(V\left( t,s \right)\)をある間隔（通常数十から数百MDステップ）で足しこんでいきます。このような方針を採用することによって，自由エネルギー空間において一度訪れた点に訪れづらくする効果が発揮されます。十分長い時間シミュレーションを行うと\(V\left( t,s \right)\)が自由エネルギー空間を埋め尽くしてしまい，反応は自由に起こることができるようになります。この状態に至る\(V\left( t,s \right)\)（に-1を掛けた量）がすなわち自由エネルギーであるとみなすことができます。

Meta-dynamics法によるシミュレーションの模式的な様子を 図 5.79 に示します。この図では，まずシミュレーションは1の数字が割り当てられた谷から始まります。2のバイアスを足し，さらに3のバイアスを足すと新しい局所極小（図中で最も左側の谷）に至ります。さらに4, 5, 6とバイアスポテンシャルを足すともっともエネルギーの低い谷（図中で最も右側の谷）へ至ることができます。最後に7のバイアスを足し，さらに8のバイアスポテンシャルまで足すと，系は集団変数の空間を自由に行き来できるようになります。この時点でのバイアスポテンシャルに-1を掛けると，それは自由エネルギーと見做すことができることが分かります。

Meta-dynamicsシミュレーションの模式図

Meta-dynamics法の特徴として，反応座標と関連付けられた複数の動力学変数の動力学を追跡する点が挙げられます。この考え方を導入することによって，複数の反応座標を検討することが容易となり，また動力学変数自身が“もっともらしい”反応経路を探索してくれる効果が期待できます。また，blue moon法の場合複数の反応座標を取り扱うことは（原理上は可能ではありますが）難しいのに対し，meta dynamics法においては比較的容易です。したがって，反応座標が複数ある場合や，反応経路が自明でない場合などにおいて有効な方法であると考えられます。バイアスポテンシャル導入の方針の違いにより，自由エネルギー表面を粗く，すばやく探索することも，きめ細かく，精度よく探索することも可能です。 Meta-dynamics法シミュレーションは，あらかじめ決められた間隔でバイアスポテンシャルを足しながら進行していきます。この際にバイアスポテンシャルを構築するには，時刻0から現在までのデータをすべて利用して和を取る必要があるので，Meta-dynamics法は\(O\left( t^{2} \right)\) の計算手法となります（ただし，第一原理計算で利用するかぎりこの点が制約になることはないでしょう）。

Meta-dynamics法のハミルトニアンは，具体的には，次のように記述されます。

\[H_{\text{meta}} = H_{\text{MD}} + \sum_{\alpha}^{}\frac{1}{2}\mu_{\alpha}{\dot{s}}_{\alpha}^{2} + \sum_{\alpha}^{}\frac{1}{2}k_{\alpha}\left( S_{\alpha}\left( \mathbf{r} \right) - s_{\alpha} \right)^{2} + V\left( t,s \right),\]
\[V\left( t,s \right) = \sum_{t_{i} < t}^{}w{\exp\ }\left\lbrack - \sum_{\alpha}^{}\frac{\left( s_{\alpha}\left( t \right) - s\left( t_{i} \right) \right)^{2}}{2\Delta s_{\alpha}^{2}} \right\rbrack\]

ここで，\(\alpha\)は集団変数に含まれる各変数を識別する変数，\(\mu_{\alpha}\)と\(s_{\alpha}\)はそれぞれ仮想的な粒子の質量と座標，\(S_{\alpha}\left( \mathbf{r} \right)\)は対象としているシステムから定義される「集団変数」，\(k_{\alpha}\)は仮想的な粒子の座標と集団変数を結びつける「ばね定数」，\(V\left( t,s \right)\)がバイアスポテンシャルです。足しこんでいったバイアスポテンシャルを記録しておくと，そこから自由エネルギーを見積もることも可能です。このようなハミルトニアンから得られる動力学は，次のようにまとめることができます。

- 系は，集団変数を通して仮想的な粒子の座標値に緩く拘束される。

- 仮想的な粒子の座標は，バイアスポテンシャルの効果によって，すでに訪れた点には再訪づらい。

仮想的な粒子の座標の運動と系の運動の特徴的なタイムスケールが異なれば（仮想的な粒子の方が長いタイムスケールであれば），系の運動は仮想的な粒子の運動の影響をそれほどは受けないので局所的には正しく系の運動を追跡し，かつゆるやかに集団変数の張る空間を探索することが可能となります。仮想的な粒子の質量は，上記の原理より集団変数の固有振動モードが系よりも遅くなるように設定します。

Meta-dynamics法は，仮想粒子の動力学を追跡するのではなく，系に直接バイアスポテンシャルを足しこんでいくことによって実現する手法もあります [Laio05] 。このような方針を採用すると，仮想的な粒子の質量やそれと集団変数を結びつけるばね定数の定義が不要となり，よりシンプルに実行することが可能となります。

### 入力パラメータ

本機能と関連あるタグの一覧を次の表に示します。

メタダイナミクスに関連のあるタグの一覧

拘束条件付きダイナミクスに関連のあるタグの一覧
第1 ブロック識別子 | 第2，第3ブロ ック識別子 | タグ識別子 | 説明
--- | --- | --- | ---
control |  |  |
|  | driver | ダイナ ミクスの種類を 選択する変数。 拘束条件付きダ イナミクスの場 合meta_dynamicsを指定する。
meta_dynamics |  |  | メタダイ ナミクスの設定 を行うブロック
|  | meta_dynamics_type | メ タダイナミクス の“種類”の指定 bias_and_fict itious,bias_only, bias_generation のいずれか デフォルト 値はbias_only.
|  | max_bias_update | 最大 バイアス更新回 数を指定する。 デ フォルト値は- 1(負の数値の場 合，この条件で は停止しないこ とを意味する).
|  | extensive_output | onとすると通常は不要な 出力も得られる
|  | output_per_rank | onとするとレプリカ並列時に 各ランクごとに 出力が得られる
| collective_variable |  | 集団変数の指定を 行うブロック。
|  | type | 集団変数の“種類 ”の指定。拘束 条件付きダイナ ミクスと同じ。 bond_length, bond_angle, dihedral_angle bond_length_diff, bo nd_angle_diff, dist ance_from_pos, plane, center_of_mass, coordination_numbe
|  | atomx | 拘束条件が 関わる原子を指 定する。xは整 数で，たとえば type = bond_lengthの場合2原子 が拘束に関わる のでatom1とato m2で指定する。
|  | k | 仮想粒子のバネ 定数を指定する
|  | delta_s | バイアスポテン シャルの幅，\(\Delta s\)を指定する
|  | smin | バイアスポ テンシャル出力 の最小値を指定
|  | smax | バイアスポ テンシャル出力 の最大値を指定
|  | ds | バイアスポ テンシャル出力 の刻み幅を指定
|  | co ntrol_velocity | onにした場 合，仮想粒子の 速度を制御する
|  | mass_thermo | 仮想粒子の速 度を制御する場 合の熱浴の質量
|  | target_KE | 仮想粒子の速 度を制御する場 合のターゲット 運動エネルギー
| plane |  | 面内拘束 における面の法 線ベクトルを指 定するブロック
|  | nor mx,normy,normz | 法線ベクト ルのx,y,z成分
| distance_from_pos |  | 場所の指定 を行うブロック
|  | posx,posy,posz | 指定したい場 所のx,y,z成分
| coordination_number |  | 配位数指定 を行うブロック
|  | kappa_inv | 配位数定義式の の逆数を長 さの単位で指定
|  | kappa | 配位数定 義式の \(\kappa\) を1/bohr 単位で指定
|  | rcut | 配位数定義式の \(r_c\) の値を長 さの単位で指定
| center_of_mass |  | 重心を変化 させる方向を指 定するブロック
|  | directionx | 指定した い方向のx成分
|  | directiony | 指定した い方向のy成分
|  | directionz | 指定した い方向のz成分
| bias_potential |  | バイアスポテ ンシャルの設定 を行うブロック
|  | height | 一度に足す バイアスポテン シャルの高さを
|  |  | エネルギ ーの単位で指定
|  | update_frequency | バイアス ポテンシャルを 足す頻度を指定 た とえば10とする と，10MDステッ プに1回バイア スポテンシャル が更新される。 デフ ォルト値は20。
|  | output_frequency | meta_dynamics_t ypeがbias_gene rationの場合に ，バイアスポテ ンシャル構築を 何回に1回行う かを指定する。 デ フォルト値は10
| continuation_strategy |  | レプリカ並 列計算時におけ る継続計算の方 針を設定する。
|  | randomize_velocity | onと すると速度は継 続せず乱数で決 まるようになる
|  | scale_velocity | onと すると継続時下 記の velocity_scaling_factor に 応じて速度がス ケールされる。
|  | velocity_ scaling_factor | 読み込 んだ速度をスケ ールする値。デ フォルト値は1
|  | configuration_from_input | onとする と，継続計算フ ァイルではなく 入力ファイルか ら座標データを 読み込む。デフ ォルト値はoff

Meta-dynamics法の入力パラメータの指定について説明します。

Meta-dynamics法の計算は，以下の指定を行います。

- Meta-dynamics法を有効に指定する

- Meta-dynamicsの振る舞いを指定する（ダイナミクス追跡モード，バイアスポテンシャル更新回数，出力形式など）

- 温度一定のMDシミュレーションの設定を行う

- 集団変数の定義を行う（集団変数に含める反応座標の情報を集団変数の数だけ定義）

- バイアスポテンシャルの設定を行う（バイアスポテンシャルの高さ，幅，更新頻度など）

- レプリカ並列計算を実行する場合，その設定。

- Meta-dynamics法を有効に指定する

Meta-dynamics法の機能を有効にするには，controlブロックにおいて以下の指定を行います

    control{
        driver = meta_dynamics
    }

この指定により，PHASEの通常の原子ダイナミクスコードではなく，Meta-dynamics計算用のメイン・プログラムが呼ばれます。

- Meta-dynamicsの振る舞いの設定

Meta-dynamicsの全体的な振る舞いの設定方法を説明します。この設定は，入力ファイルの最上位にmeta_dynamicsブロックを作成し，さらに以下のような変数・ブロックを定義することによって行います。

    meta_dynamics{
      meta_dynamics_type = bias_only
      max_bias_update = -1
      extensive_output=on
      output_per_rank=on
      output_cvar_every_step=off
      continuation_strategy{
        randomize_velocity=on
        scale_velocity=off
        velocity_scaling_factor=0.7
        configuration_from_input=off
        ...
        ...
      }

meta_dynamicsブロックでは，以下の変数/ブロックの設定を行うことができます。

拘束条件付きダイナミクスに関連のあるタグの一覧
meta_dynamics_type変数 |  | bias_and_fictitious, bias_only, bias_generationのい ずれかを指定します。 bias_and_fictitious とすると仮想粒子の動 力学を考慮したメタダ イナミクスを， bias_only とするとバイアス ポテンシャルのみを有 効にしたメタダイナミ クスを実行することが できます。bias_gene rationとした場合Meta dynamicsは実行され ず，作業ディレクトリ ーに存在するファイル からバイアスポテンシ ャルの構築および出力 のみが実行されます。
max_bias_update変数 |  | 最大何回バイアスポテ ンシャルを更新するか を指定します。負の値 を指定すると，バイア スポテンシャルの更新 回数では計算は停止し ません。これがデフォ ルトの振る舞いです。
output_per_rank変数 |  | onとする と，レプリカ並列計算 実行時に出力が各ラン クごとに得られます。
extensive_output変数 |  | onとすると，仮想粒 子の速度や仮想粒子に 働く力など，通常は不 要な出力も得られます
continuation_strategyブロック |  | レプ リカ並列計算実行時に おける継続計算の方針 の設定を行います。レ プリカ並列計算時には ，並列数を変化させた 場合に以前の計算を厳 密に再現することはで きないので，ここでど のような方針で継続す るのか決定する必要が あります。このブロッ クでは，以下の設定を 行うことができます。
| randomize_velocity | onと すると，継続計算実行 時に速度を継続せず， 乱数で割り振ります。 デフォルト値はoff。
| scale_velocity | onとすると，読 みこんだ速度をつぎに 説明するvelocity_sc aling_factorの値に応 じてスケールします。 デフォルト値はoff。
| velocity_scaling_factor | 読 み込んだ速度にここで 指定した値をかけます 。デフォルト値は1。
| configuration_from_inpu | onとすると，継 続計算ファイルではな く入力ファイルから座 標データを読み込む。 デフォルト値はoff。

- 集団変数の定義

集団変数とは，“反応座標”を複数まとめたものです。この指定は，meta_dynamicsブロック以下において行います。典型的な例は下記の通りです。

    meta_dynamics{
      ....
      ....
      collective_variable{
        mass=1000
        k=100
        delta_s = 0.08
        control_velocity=on
        mass_thermo = 50
        target_KE = 0.1
      }
      collective_variable1{
         type=bond_length
         atom1=5
         atom2=4
         delta_s=0.05 angstrom
         smin=1 angstrom
         smax=5 angstrom
         ds = 0.1 angstrom
       }
      ....
      ....
    }

まず，meta_dynamicsブロックの下にcollective_variableブロックを作成します。collective_variableブロックには全集団変数に共通の設定を行います。後に説明する集団変数個別の設定に記述がない項目のみここでの設定が反映されます。

次に，集団変数を定義したい数だけcollective_variablexxブロックにおいて定義します。ここでxxは集団変数のIDです。任意の数の集団変数を定義することが可能ですが，1から連続的に変化する整数を指定する必要があります。たとえば，collective_variable1, collective_variable2, collective_variable4の3つのcollective_variablexxブロックがあった場合，collective_variable1とcollective_variable2のみ解釈されます。

collective_variableおよびcollective_variablexxブロックは，拘束条件付きダイナミクスの設定の際に設定する拘束条件と同様の変数を定義することが可能となっています。具体的には，以下の変数を定義することが可能です。

拘束条件付きダイナミクスに関連のあるタグの一覧
type 変数 |  | 集団変数の“種類”を指 定します。 以下のいず れかの値をとります。
| bond_length | 2原子間の距離 を集団変数とします。
| bond_angle | 3原子の成すボンド角 を集団変数とします。
| dihedral_angle | 4原子の2面角 を集団変数とします。
| bond_length_diff | 2原子間の距離の差 を集団変数とします。
| plane | ある原 子の指定の面内での位 置集団変数とします。
| center_of_mass | 指 定の原子群の重心を位 置集団変数とします。
| coordination_number | 配位数を位 置集団変数とします。
| distance_from_pos | ある場所からの距離 を集団変数とします。
atomx 変数 |  | 指定 の集団変数が関わる原 子を指定します。xは 数字であり，たとえば 2原子間の距離の場合 は2つの原子が拘束に 関わるので，atom1と atom2に対応する原子 の番号を指定します。 typeが coordination_number の場合，配位数 を計算する中心の原子 の番号を指定します。
planeブロック |  | 面内拘束 の場合の，拘束したい 面の法線ベクトルを指 定するためのブロック です。次の変数を指定 することができます。
| normx | 法 線ベクトルのx座標。
| normy | 法 線ベクトルのy座標。
| normz | 法 線ベクトルのz座標。
coordin ation_numberブロック |  | 配位数の設定
| kappa_inv | \(1/\kappa\) の 値を，長さ の単位で指定します。
| kappa | \(\kappa\)の 値を，1/bohr単位で指 定します。kappa_inv よりも優先されます。
| rcut | \(r_c\) の値を長さ の単位で指定します。
mass変数 |  | 仮想粒子の質量を指 定します。meta_dynamics_typeが bias_and_fictitious の場合のみ 意味のある指定です。
k変数 |  | 仮想粒子と 集団変数の結びつきを 決める，バネ定数を指 定します。meta_dyna mics_typeが bias_and_fictitiousの 場合のみ 意味のある指定です。
delta_s変数 |  | \(\delta s_{\alpha}\) の値を 指定します。
smin変数 |  | バイアスポ テンシャル出力の際の 最小値を指定します。
smax変数 |  | バイアスポ テンシャル出力の際の 最大値を指定します。
ds変数 |  | バイアスポテン シャル出力の際の刻 み幅を指定します。
control_velocity変数 |  | onにした 場合，仮想粒子のダイ ナミクスを追跡する際 に熱浴を付与すること によってその速度を制 御します。meta_dynamics_typeが bias_and_fictitious の場合のみ 意味のある指定です。
mass_thermo変数 |  | control_velocityが onの場合の，熱浴の 質量を指定します。
target_KE変数 |  | control_velocity がonの場合 の，目的とする仮想粒 子の温度を指定する。

- バイアスポテンシャルの設定

バイアスポテンシャルの設定は，meta_dynamicsブロックの下にbias_potentialブロックを作成して行います。以下に典型的な例を示します。

    bias_potential{
      height = 0.02 eV
      update_frequency=20
      output_frequency=100
    }

bias_potentialブロックにおいて定義可能な変数は下記の通りです。

拘束条件付きダイナミクスに関連のあるタグの一覧
height変数 | 一度に足すバイアスポ テンシャルの高さをエネルギーの単位で指定しま す。 一度に足すバイアスポテンシャルの幅は，各 集団変数固有の量であるのでbias_potentialブロ ックではなく集団変数固有の設定を行うcollect ive_variablexxブロック以下で行います。
output_frequency変数 | meta_dynamics_typeがbias_generat ionの場合のみ意味のある指定です。何回に1回バ イアスポテンシャルを出力するかを指定します。
update_frequency | バイアスポテンシャルの 更新頻度を指定します。デフォルト値は20です。

- レプリカ並列計算の設定

初期速度を変化させる

特に指定がない場合，初期座標はすべてのレプリカで共通で，初期速度の乱数のみ異なる，という条件で計算がなされます。位相空間上異なる点から始めるので，座標が同じでも各レプリカはいずれ異なる軌跡をとるようになります。ただし，当然のことながら最初のうちは（座標値は）ほぼ同じ軌跡となります。

初期の座標値をランクごとに明示的に指定する

入力ファイルにおいて，レプリカごとに異なる座標データを指定することも可能です。この設定は，atomsxxブロック（ここでxxはMPIランクの数字）を作成し，そこで座標値を設定することによって行います。たとえば，ランク0が担当するレプリカとランク1が担当するレプリカにそれぞれ異なる座標値を与えるには，次のような記述を行います。

    structure{
        atom_list{
            ....
            atoms0{
                #units angstrom
                #default weight = 1, element = Si, mobile = 1
                #tag element rx ry rz mobile weight
                C 5.0157363043        5.6563796505        5.8043454319 1 1
                C 4.7499007526        4.2727134018        5.7364572058 1 1
                ...
                ...
            }
            atoms1{
                #units angstrom
                #default weight = 1, element = Si, mobile = 1
                #tag element rx ry rz mobile weight
                C       4.5897384578    5.5998560107    5.7723226564 1 1
                C       5.1658344359    4.3217914066    5.6857269157 1 1
                ...
                ...
            }
        }
    }

### 計算の実行方法

Meta-dynamics法を実行するには，通常のPHASEによる計算と同様に以下のコマンドを発行します。

    mpirun -n NP phase ne=NE nk=NK nr=NR

ここでNPはMPIプロセス数，NEはバンド並列数，NKはk点並列数，NRはレプリカ並列数です。NP=NE×NK×NRという関係が成立している必要があります。ne, nk, nrはいずれも省略可能（デフォルト値は1 すべて無指定の場合NE=NP）です。

通常Meta dynamics実行時に得られるバイアスポテンシャルの出力は「直近に得られたバイアスポテンシャル」のみですが，バイアスポテンシャルをポスト処理的に計算し，それを出力させることもできます。この機能を利用するには，入力ファイルのmeta_dynamicsブロックのmeta_dynamics_type変数にbias_generationという文字列を指定します。この時，meta_dynamicsブロックの下のbias_potentialブロックにおいて定義される，bias_output_frequency変数に指定された回数に1回出力を行います。たとえば，bias_output_frequencyが10, バイアスの総更新回数が100だった場合，10回目，20回目，30回目，... 100回目の更新時のバイアスポテンシャルがそれぞれ独立したファイルに出力されます。そのファイル名は，“bias_potential.dataxx”となります。ここでxxが対応する更新回数です。この設定を行ったあと，Meta-dynamics解析を行ったディレクトリーにおいてPHASEを実行します。ファイルを読み込みバイアスポテンシャルを構築するのみなので，通常並列で実行する必要はありません。

### 計算結果の出力

Meta dynamicsシミュレーションを行う場合，標準よりも多くのファイルが出力されます。以下に，各々について簡単に説明します。

- curr_bias_potential.dataファイル

“現在の”バイアスポテンシャルが記録されたファイルです。次のような形式で出力されます。

    1.2000000000       -3.1400000000        0.0000000000
    1.3000000000       -3.1400000000        0.0000000000
    1.4000000000       -3.1400000000        0.0000000000
    1.5000000000       -3.1400000000        0.0000000000
    1.6000000000       -3.1400000000        0.0000000000
    1.7000000000       -3.1400000000        0.0000000000
                         ....
                         ....

    1.2000000000       -3.0400000000        0.0000000000
    1.3000000000       -3.0400000000        0.0000000000
    1.4000000000       -3.0400000000        0.0000000000
    1.5000000000       -3.0400000000        0.0000000000
    1.6000000000       -3.0400000000        0.0000000000
    1.7000000000       -3.0400000000        0.0000000000
                         ....
                         ....

各行が“集団変数の組”に相当します。定義している数だけ集団変数が記録されたあと，その“集団変数の組”におけるバイアスポテンシャルの値が出力されます。

- bias_potential.dataxxファイル

バイアスポテンシャルを作成するのみのモードを利用した場合に得られる，更新回数に応じたバイアスポテンシャルのデータが出力されるファイルです。ファイル名のxxがバイアスポテンシャル更新回数に相当します。そのファイル形式は，curr_bias_potential.dataと同様です。

- nfdynm.data_at_biasファイル

バイアスポテンシャル更新時における座標データが出力されるファイルです。PHASEの標準座標データ出力形式である，F_DYNM形式で出力されます。

- nfefn.data_at_biasファイル

バイアスポテンシャル更新時におけるエネルギーの値が出力されるファイルです。PHASEの標準的なエネルギーデータ出力形である，F_ENF形式で出力されます。

- collective_variables.dataファイル

バイアスポテンシャル更新時における集団変数の値が出力されるファイルです。次のような形式で出力されます。

     2        1.6399047278        0.0906233310
     3        1.6933783940        0.2327954221
     4        1.6487636847        0.0655806009
     5        1.7510381463       -0.1403803460
     6        1.7880912692       -0.2122517967
     7        1.7558411086       -0.2557274737
     8        1.7939362867       -0.0296094373
     9        1.7595919709        0.1959354384
    10        1.7773637731        0.3761827029
    11        1.7657919080        0.3998392061
    12        1.7604309483       -0.0107912799
    13        1.6218441177       -0.3366407543
                       ....
                       ....

各行がバイアスポテンシャル更新のタイミングに対応します。一列目がバイアスポテンシャルの更新回数であり，二列目以降定義順に対応する集団変数の値が出力されます。

- bias_potential_parameters.dataファイル

バイアスポテンシャルのパラメーターが出力されるファイルです。継続計算のタイミングでこのパラメーターを変化させた場合，それ以前のパラメーターの値が分からないとバイアスポテンシャルの構築ができないことから必要なファイルです。次のような形式で出力されます。

    2        0.0200000000        0.1000000000        0.1000000000
    3        0.0200000000        0.1000000000        0.1000000000
    4        0.0200000000        0.1000000000        0.1000000000
    5        0.0200000000        0.1000000000        0.1000000000
                      ....
                      ....

各行がバイアスポテンシャル更新のタイミングに対応します。一列目がバイアスポテンシャル更新回数であり，二列目が(23)式における\(w\)の値，3列以降が各集団変数の(23)式における\(\delta s_{\alpha}\)の値です。

### 計算例：炭化水素のエネルギー表面

概要

Meta dynamics法を利用した例として，炭化水素のエネルギー表面を調べた例を紹介します。具体的には，C4H6分子の電子環状反応を取り上げます。 入力データは `samples/dynamics/meta_dynamics/C4H6` にあります。 C4H6分子は，trans 1-3ブタジエン，cis 1-3 ブタジエン，シクロブテンの3種類の安定構造が知られています。シクロブテンは環状分子，trans 1-3ブタンジエンは平面状の分子ですが，cis 1-3ブタジエンは平面状にはならず，2面角を30°ほどひねった構造が安定な構造です(gauche配座)。その分子構造を 図 5.80 に示します。エネルギーは，高い順にシクロブテン，cis 1-3ブタジエン，trans 1-3ブタジエンであり，分子の反応としては，1-3 ブタジエンが閉環して環状化合物であるシクロブテンを生成する，あるいは逆にシクロブテンが開環し1-3ブタジエンが生成される反応（電子環状反応），また，2種類の1-3 ブタジエンの間のcis-trans反応が考えられます。閉環・開環反応は化学結合の切断を要することから大きな障壁エネルギーがあり，1 eV程度のオーダーであると考えられます。他方，cisからtransへの変化はそこまでの障壁はなく，100 meV程度のオーダーであると考えられます。 特に，環状反応においては，1-3ブタジエンとシクロブテンとでは2重結合の数が異なり，電子状態としては全く異なるものであるため，古典的なポテンシャルで取り扱うのは一般に難しいと言えます。この点をPHASEで正しく扱えるかどうかを確認します。

C4H6分子の分子構造

初期の原子配置は， 図 5.81 で示すシクロブテンを採用します。この初期構造は，PHASEによって最適化したものです。

C4H6分子の分子構造

入力パラメータ

Meta dynamics法を有効に指定します。これは，controlブロックの下のdriver変数にmeta_dynamicsを指定することによって行います。

    condition{
        driver = meta_dynamics
        ....
    }

次に集団変数を定義します。その方針は様々ですが，ここでは以下を採用します。

1. 図 5.81 の原子1と原子2の距離。パラメーターds, delta_sはそれぞれ0.1 Åと0.05 Å

2. 図 5.81 の，原子1-4-3-2の作る二面角。パラメーターds, delta_sはそれぞれ10°と5°

この設定は，meta_dynamicsブロックの下で以下のように実現します。

    meta_dynamics{
    ....
    ....
      collective_variable1{
         type=bond_length
         atom1=5
         atom2=4
         delta_s=0.05 angstrom
    !for bpot output
         smin=1 angstrom
         smax=5 angstrom
         ds = 0.1 angstrom
       }
       collective_variable2{
         type=dihedral_angle
         atom1=5
         atom2=3
         atom3=2
         atom4=4
         delta_s = 5 degree
    !for bpot output
         smin = -180 degree
         smax = +180 degree
         ds = 10 degree
       }
    }

バイアスポテンシャルの高さは0.02 eV(0.46 kcal/mol)とします。バイアスポテンシャルの更新頻度は，20 MDステップに一度とします。この設定は，meta_dynamicsブロックの下にbias_potentialブロックを作成し，heightパラメーターで指定することによって行います。

    meta_dynamics{
        ....
        ....
        bias_potential{
            update_frequency = 20
            height=0.02 eV
        }
    }

バイアスポテンシャルを更新する回数は任意ですが，信頼できる自由エネルギー表面を得るためには相当数の更新回数が必要です。

計算結果

本シミュレーションによって得られる計算結果を解説します。まず， 図 5.82 にバイアスポテンシャルを18,140回程度更新した結果得られたエネルギー表面の等高線図を示します。

C4H6分子の自由エネルギー表面

図 5.82 より，ここで得られたエネルギーの等高線図には4つの安定点があることが理解できます。すなわち，原子間距離が約1.5 Å程度で角度がほぼ0 radianの点，原子間距離が3.3 Å程度で角度が0 radian，原子間距離が3.7 Å程度で角度が\(\pm\)3 radian程度の2つの点です。これらは，それぞれシクロブテン，cis 1-3ブタジエン，trans 1-3ブタジエンに相当します．絶対零度の計算の場合，cisではなくgauche 配座となりますが，300KのMeta dynamicsシミュレーションではcisとgaucheの明確な区別がつけられる結果は得られませんでした．得られたシクロブテンとtrans 1-3ブタジエンのエネルギー差は，16 kcal/mol程度，シクロブテンとcisブタジエンのエネルギー差は12kcal/mol程度となりました．いずれも，絶対零度の計算と比較するとより大きなエネルギー差です．

図 5.83 および 図 5.84 には，集団変数がバイアスポテンシャルの更新と共にどのように変化していったかを示しています．二面角が 図 5.83 ，炭素原子間距離が 図 5.84 の振る舞いです． 図 5.83 および 図 5.84 より，バイアスポテンシャルを約700回更新した時点で鞍点を超えてブタジエンに至っていることが理解できます．そこから18,000回程度の更新までは幅広くエネルギー表面を探索しています．図 5.80 らも分かるように，ここで考えている系はシクロブタンを除くと二面角に対して幅広い範囲の構造を取り得ます．そのため，この谷を埋め尽くすのに多くのバイアスポテンシャルの更新が必要となっています．18,000回程度のバイアスポテンシャル更新の結果，再びシクロブタンへ戻ったことが確認できた時点(図 5.80 )で計算を終了させました。

2面角とバイアスポテンシャル更新回数の関係

炭素原子間距離とバイアスポテンシャル更新回数の関係

図 5.85 (a)から(d)までに，Meta dynamicsシミュレーション中に実際に得られた原子配置のスナップショットを示しました。ここで示しているように，バイアスポテンシャルの効果によって様々な分子構造が実現していることが分かります。

Meta dynamicsシミュレーションによって得られた分子構造のスナップショット．(a) : バイアスポテンシャル2回更新 (b) バイアスポテンシャル690回更新 (c) バイアスポテンシャル1,500回更新 (d) バイアスポテンシャル18,070回更新

### 使用における注意点

Meta dynamics法は，すべての擬ポテンシャルと組み合わせて利用することができます。レプリカ並列を含めた並列計算も行うことができます。 ただし，意味のある結果を得るためには膨大な計算量を費やす必要があります。 レプリカ並列を行う場合，継続計算のタイミングでレプリカ並列数を変化させる場合，対応するレプリカの継続計算ファイルが存在しない場合があります。この場合は近くのランクの継続計算データを読み込み，さらにcontinuation_strategyで設定した指針に従って初期レプリカを作成します。

### 参考文献

Laio02

  1. Laio and M. Parrinello, Proceedings of the National Academy of Sciences 99, (2002) p. 12562.

Iannuzzi03

  13. Iannuzzi, A. Laio and M. Parrinello, Physical Review Letters 90, (2003) p. 238302.

Laio05

  1. Laio, A. Rodriguez-Fortea, F. L. Gervasio, Ceccarelli and M. Parrinello, J. Phys. Chem. B 109, (2005) p. 6714.

# 時間依存密度汎関数法計算（TDDFT）

## 実時間処理型の時間依存密度汎関数理論（RTTDDFT）による光学スペクトル計算

### 機能の概要

実時間TDDFT法に基づいて、次式の時間依存一電子方程式を解くことにより、与えられた初期一電子波動関数に対する電子ダイナミクス・シミュレーションを行う。

\[i\hbar \frac{\partial}{\partial t} \phi_n^{\mathbf{k}} \left( \mathbf{r},t\right) = H\left(t\right) \phi_n^{\mathbf{k}} \left( \mathbf{r},t\right)\]

波数ベクトルkとバンド番号nを指標とする一電子波動関数を\(\phi_{n}^{\mathbf{k}}\)で、\(\phi_{n}^{k}\)\(\phi_{n}^{k}\)有効ハミルトニアンをHで表す。時間依存一電子方程式の形式的解から、一電子波動関数の時間発展は以下のように表される。

\[\phi_n^{\mathbf{k}}\left(\mathbf{r},t+\Delta t\right) = \exp \left(-\frac{i}{\hbar} \int_t^{t+\Delta t} dt' H\left(t'\right)\right) \phi_n^{\mathbf{k}} \left(\mathbf{r},t\right)\]

右辺の時間発展演算子は、時間積分部および指数関数部に対して近似を施して数値計算され、それぞれ様々な近似方法が提案されている。時間積分部は時間間隔∆tが十分に小さければ次式のように近似できる。

\[\phi_n^{\mathbf{k}} \left(\mathbf{r}, t+\Delta t\right) \cong \exp \left( -\frac{i}{\hbar} \Delta t H\left(t\right) \right) \phi_n^{\mathbf{k}} \left(\mathbf{r},t\right)\]

さらに、指数関数部に対する近似としてテイラー展開法が使用される。

\[\phi_n^{\mathbf{k}} \left(\mathbf{r}, t+\Delta t\right) = \sum_{N=0}^{\infty} \frac{1}{N!} \left(-\frac{i}{\hbar} \delta t H\left(t\right) \right)^N\]

この近似法の場合、時間間隔∆tと展開最大次数Nmaxが主要な入力パラメータであり、計算精度と実行時間の兼ね合いを考慮して最適値を設定する必要がある。

原理的には、各時間においてヘルマン・ファインマン力を計算し、その値に従って原子位置のダイナミクスを実行することも可能である。（ただし、本プログラムには実装されておらず、原子位置は固定した状態で電子ダイナミクス計算を行う。）

時間t=0-の初期一電子波動関数は、プログラムPHASEによって求められる基底状態の一電子波動関数を用いて作成するため、本機能実行前にDFT法による基底状態の計算を終えている必要がある。本プログラムでは、基底状態一電子波動関数φnk (r, t=0-)を以下のように位相シフトさせることができる。

\[\phi\left(\mathbf{r},t=0^+ \right) = e^{-i\varepsilon \mathbf{q} \cdot \mathbf{r}} \phi_n^{\mathbf{k}} \left(\mathbf{r}, t=0^- \right)\]

これは時間t=0+においてパルス電場を系に与えることに相当する。各時刻において双極子モーメントd(t)または電流密度J(t)を計算し、電子ダイナミクス・シミュレーション終了後に、これらの値を時間の関数から振動数へとフーリエ変換することによって、実験と直接比較可能な双極子強度・光吸収スペクトルなどの光学物性値が求められる。

### 入力パラメータ

以下の入力タグの例は、初期状態として「x方向へ大きさ0.01原子単位のデルタ関数型パルス電場」を系に与え、「時間刻み0.1原子単位時間/時間ステップで1,000時間ステップ（全シミュレーション時間100原子単位時間）」のRT-TDDFT計算を実行する場合です。ただし、DFT法による基底状態の計算が収束している場合のみRT-TDDFT計算が実行されます。

    postprocessing{
      rttddft{
        sw_rttddft = on
        time_step_delta = 0.1
        time_step_max = 1000
        ext_pulse_epsilon = 0.01
        ext_pulse_kx = 1.0
        ext_pulse_ky = 0.0
        ext_pulse_kz = 0.0
      }
    }

パラメータ | デフォルト値 | 説明
--- | --- | ---
sw_rttddft | OFF | ON　：　 RTTDDFT計算処理を実行する OFF　：　 RTTDDFT計算処理を行わない
time_step_delta | 0.1（原子単位時間） | 時間更新刻み 全シミュレー ション時間は、time_step_d elta×time_step_maxとなる。 経験的には0.05～0.1原 子単位時間の値が推奨される （ 1原子単位時間はおよそ0.024 fs） 大きなtime_step_del taを設定した場合には異常値 が出力されることがあり、そ の場合は値をより小さく設定 して再計算する必要がある。
time_step_max | 100（回） | 計算処理を 終了するまでの時間更新回数 ［計算途中にジョブを正 常終了させることはできない （nfstop機能は使用不可）］

初期状態生成［デルタ関数型パルス電場\(\mathbf{E}(t) = E_{0}\mathbf{e}\delta(t)\) ］に関するパラメータ

パラメータ | デフォルト値 | 説明
--- | --- | ---
ext_pulse_epsilon | 0.0d0 | 電場の大きさ\(E_{0}\)
ext_pulse_kx | 0.0d0 | 電場の向き\(\mathbf{e}\)
ext_pulse_ky | 0.0d0 | 電場の向き\(\mathbf{e}\)
ext_pulse_kz | 0.0d0 | 電場の向き\(\mathbf{e}\)

### 計算の実行方法

まずは、通常の SCF 計算を行います。この際は、sw_rttddft パラメータは off に設定しておきます。通常のSCF 計算が終了したら、sw_rttddft パラメータを on とし、さらに必要に応じて rttddft ブロックの各種パラメータを編集し、control ブロックの下の condition パラメータを continuation に設定します。このような設定を施したら、通常通り PHASE の計算を実行するとTDDFT 計算が実行されます。途中で終了した RT-TDDFT 計算は、初期電場の設定（ext_pulse_epsilon, ext_pulse_kx, ext_pulse_ky, ext_pulse_kz）をすべて 0 とし、condition=continuation としたままで PHASE を実行すれば行うことができます。

### 計算結果

計算結果は、ログファイルに記録されます。以下のように、双極子モーメントと電流密度が原子単位で記録されます。

    # time_step= 991 time= 0.9910E+02 au = 0.2397E+01 fs
    ...
    P= 0.0285381798 0.0002058360 0.0001702915
    J= -0.0133497494 0.0000068680 -0.0000030064

P=のあとの 3 つの数値が双極子モーメントの x, y, z 成分、J=のあとの 3 つの数値が電流密度の x, y, z 成分です。

計算終了後、時間空間から周波数空間にフーリエ変換することによってスペクトルをエネルギーの関数として得ることが可能です。このフーリエ変換を実行するプログラムのソースコードがsrc_spectrum の下にある spectrum.f90 です。このプログラム自体は、標準的な Fortran90 コンパイラーによってコンパイルすることが可能です。その利用方法は、以下の通りです（作業ディレクトリーとして、ft というディレクトリーを作成して実行する例）。 まず、以下のようにディレクトリーft を作成し、そのディレクトリーの下に電流密度の履歴を抽出した j.dataというファイルを作成します。

    % mkdir ft
    % cd ft
    % grep ”J=” ../output001 > j.data

j.data ファイルに、次のように 1 行目に time_step_delta と ext_pulse_epsilon を加え、さらに time_step_maxの値を 2 行目に加えます。

    0.1 0.01
    1001
    J= -0.2999128661 0.0000002015 -0.0000008972
    J= -0.2970981909 -0.0000022160 -0.0000000155
    …
    …

このファイルを作成したら、spectrum.f90 をコンパイルしたバイナリー（たとえば a.out）を実行します。結果

としては、以下のファイルが得られます。

出力ファイル名 | 説明
--- | ---
j.out | 電流密度と時間の関係、Jx(t) Jy(t) Jz(t)
p.out | 誘起された双極子モーメントと時間の関係、Px(t) Py(t) Pz(t)
pw.out | フーリエ変換された双極子モーメント、Re[Px(w)] Im[Px(w)]
abs.out | 双極子モーメント強度のスペクトル

### 例題

例として、ベンゼン分子（ 図 5.86 ）のRT-TDDFT計算例を紹介します。この例題の入力ファイルは `samples/tddft/rt_benzene` 以下にあります。

ベンゼン分子の原子配置

計算は、まずはSCF計算を実行し、ついでRT-TDDFTを有効にした継続計算を実行しました。RT-TDDFTのステップ数は11,000とし、時間刻みは0.1 au (約0.0024 fs)としました。さらに、得られた結果を5.5.1.4で説明した手続きによってフーリエ変換しました。得られる吸収スペクトル(abs.outの結果)は 図 5.87 で示す通りです。

本例題によって得られる吸収スペクトル

最初のピークが、約6.8 eVに表れています。通常のSCF計算によって得られるHOMO-LUMOギャップは約5.1 eVですが、この値よりも大きな値が吸収端として得られており、もっともらしい結果と考えられます。

### 使用上の注意

- ノルム保存型擬ポテンシャルを使用してください。ウルトラソフト型擬ポテンシャルには対応していません。

- 分子の重心がユニットセル中心に位置するように原子座標を設定し、分子が充分な真空領域に囲まれたユニットセルサイズを設定して下さい。（分子がセル境界をまたいで存在する場合には、双極子モーメントが正しく計算されません。）

- ksampling{ }タグ内で「base_reduction_for_GAMMA = off」と「base_symmetrization_for_GAMMA = off」を明示して下さい。

- symmetry{ }タグ内で「method = manual」と「sw_inversion = off」を明示して下さい。

- バルク系の計算には対応していません。