9. 原子ダイナミクス — PHASE/0 Manual 2025 ドキュメント

# 9. 原子ダイナミクス

## 9.1. 振動解析

### 9.1.1. 機能の概要

PHASEには格子振動の基準モードを計算する振動解析機能があります。まず、原子を平衡位置からわずかに変位させて力計算を行います。その力から力定数行列を計算し、それから動力学行列を計算します。動力学行列の固有値問題を解くことにより、基準振動の振動数と固有ベクトルを計算します。

\(i\)番目の原子の安定位置から変位を\(\mathbf{u}_{i}\)とします。 変位が微小で二次以上の項が無視できるとき、格子系の運動方程式は

(9.1)\[m_{i}{\ddot{u}}_{\text{iα}} = - \sum_{\text{jβ}}^{}\Phi_{i\alpha,j\beta}u_{\text{jβ}}\]

と書けます。\(\Phi_{i\alpha,j\beta}\)は力の定数で、原子変位に関する系のエネルギー\(E(\mathbf{u}_{1},\mathbf{u}_{2},\ldots)\)の二階微分として定義されています。

(9.2)\[\Phi_{i\alpha,j\beta} = \frac{\partial^{2}E}{\partial u_{\text{iα}}\partial u_{\text{jβ}}}\]

力の定数はヘルマン-ファインマン力を原子変位で微分することにより、 求めることができます。

(9.3)\[\Phi_{i\alpha,j\beta} = - \frac{\partial F_{\text{iα}}}{\partial u_{\text{jβ}}}\]

本プログラムでは、この微分は中央差分近似で行われます。変位パラメターを\(a\)とすると

(9.4)\[\frac{\partial F_{\text{iα}}}{\partial u_{\text{jβ}}} = \frac{F_{\text{iα}}|_{u_{\text{jβ}} = a} - F_{\text{iα}}|_{u_{\text{jβ}} = - a}}{2a}\]

と書けます。 力の定数には結晶の対称性による制約があり、これを満たすように力の定数を補正する必要があります。第一に、\(i,j\)原子が空間群の対称操作\(\{ R|\mathbf{T}\}\)で\(i^{'},j^{'}\)原子に移るとき、力定数テンソル\(\Phi_{i,j}\)は力定数テンソル\(\Phi_{i^{'},j^{'}}\)を回転行列Rで回転させたものに等しいです。つまり、

\[R\mathbf{r}_{i} + \mathbf{T} = \mathbf{r}_{i^{'}}\]
(9.5)\[R\mathbf{r}_{j} + \mathbf{T} = \mathbf{r}_{j^{'}}\]

ならば、

(9.6)\[\Phi_{i,j} = R^{T}\Phi_{i^{'},j^{'}}R\]

でなければなりません。 第二に、力定数テンソル\(\Phi_{i,j}\)の成分\(\text{αβ}\)を原子の番号\(j\)すべてにわたり足し合わせると、ゼロになります。つまり、

(9.7)\[\sum_{j}^{}\Phi_{i\alpha,j\beta} = 0\]

です。 第三に、力定数行列は対称でなければなりません。つまり、

(9.8)\[\Phi_{i\alpha,j\beta} = \Phi_{j\beta,i\alpha}\]

です。 換算変位\(w_{\text{iα}} = u_{\text{iα}}\sqrt{m_{i}}\)と 動力学行列\(D_{i\alpha,j\beta} = \Phi_{i\alpha,j\beta}/\sqrt{m_{i}m_{j}}\)を用いて、 格子系の運動方程式 (9.1) を

(9.9)\[{\ddot{w}}_{\text{iα}} = - \sum_{\text{jβ}}^{}D_{i\alpha,j\beta}w_{\text{jβ}}\]

と書き換えます。この方程式を解くために、 \(w_{\text{iα}} = Q\xi_{\text{iα}}e^{i\omega t + \delta}\) という解を仮定します。

(9.10)\[\omega^{2}\xi_{\text{iα}} = \sum_{\text{jβ}}^{}D_{i\alpha,j\beta}\xi_{\text{jβ}}\]

これは固有値が\(\omega^{2}\)で、固有ベクトルが\(\xi_{\text{iα}}\)となる、 行列\(D_{i\alpha,j\beta}\)の固有値問題です。振動解析機能ではこの固有値問題を解き、格子振動の基準モードを求めます。

### 9.1.2. 入力パラメータ

振動解析を行うには、まず原子が平衡位置にあることが必要です。平衡状態にないと動力学行列の固有値が負になり、振動数が純虚数のソフトモードが現れます。平衡位置の原子座標は、構造最適化機能を用いて計算します。構造最適化計算が終了したら、nfdynm.dataの最後に記述されている最適構造での入力パラメータファイルを作成します。

振動解析の設定は、Phononブロックで指定します。

    Phonon{
       sw_phonon = on
       sw_calc_force = on
       sw_vibrational_modes = on
       displacement = 0.05
    }

振動解析の入力変数を以下に示します。

振動解析に関係する変数の説明

変数名またはタグ名 | デフォルト値 | 説明
--- | --- | ---
sw_phonon | OFF | 格子振動解析を有効にする かどうかのスイッチです。
sw_calc_force | OFF | 振動解析のための力計算を行う かどうかのスイッチです。 ON：格子振動解析のための力計算を行い ます。(計算した力はforc e.dataに出力されます。） OFF：sw_vibrational_modes =ONならファイル"F_FORCE"から力 のデータを読み込みます。
displacement | 0.1 | 原子変位パラメーター。
sw_vibrational_modes | OFF | 格子振動解析を行うかどうかのスイッチです。 ON：格子振動解析が行われ、mode.dataファイ ルに結果が出力されます。 OFF：格子振動解析は行われません。
norder | 1 | 差分次数を変更するパラメターです。
sw_polynomial_fit | OFF | ON：多項式フィットで力の微分を求めます。 OFF：差分で力の微分を求めます。

- 原子座標と対称性の入力

原子座標は反転対称があってもすべて入力する必要があります。すなわち、原子座標のweight属性値による省略は利用できません。また、sw_inversionはOFFとする必要があります。振動モードの分類と入力座標の対称性チェックに系の空間群を使用するので、結晶構造またはその空間群をsymmetryブロックで正しく指定します。ただし、対称性自動判定機能を利用することも可能です。

- 元素の質量の指定

元素の質量はelement_listブロックの変数massで指定する。原子単位(a.u.)ではなく、原子質量単位(amu)で入力するには、#units atomic_massを#tag行の上に挿入する。

- 原子変位の選択

原子変位はPhononブロックのdisplacementで設定します。通常、原子変位は0.1 a.u.以下にとると良いです。振動数の原子変位依存性を調べて、希望する振動数の収束が得られる原子変位に設定します。norderを2に設定することで、差分の次数を3から5に換えることができます。diplacementで設定した値をuとすれば、原子変位は-u,-u/2,u/2,uになります。sw_polynamial_fitをONにして多項式フィットにすれば、norderを2より大きく設定できます。そのときの原子変位は-u/norder,-u/(norder-1),...,u/(norder-1),u/norderです。norderを大きくすると微分精度はよくなりますが、力計算の回数が増えるので、計算時間はnorderが1の場合の2*norder倍になるので注意してください。

### 9.1.3. 計算結果の出力

振動解析結果は、振動解析結果ファイルmode.data、力のデータforce.dataに出力されます。

mode.dataには振動解析の結果が記述されます。まず最初に基本並進ベクトル\(\mathbf{a}_{i} = (a_{\text{ix}},a_{\text{iy}},a_{\text{iz}})\)が次の形式で記述されます。

    --- primitive lattice vectors ---
      a_1x a_1y a_1z
      a_2x a_2y a_2z
      a_3x a_3y a_3z

次に原子の数natmと各原子の座標\((x_{i},y_{i},z_{i})\)と質量\(m_{i}\)とラベルname(i)が次の形式記述されます。

    --- Equilibrium position and mass of each atom---
     Natom = natm
     do i=1,natm
        i  x(i)  y(i) z(i) m(i) name(i)
     end do

次に振動解析の結果が次の形式で記述されます。

    --- Vibrational modes ---
     Nmode= nmode; Natom= natm
     do m = 1,nmode
       n=   m  representation(m) acvtive(m)
       hbarW= omega_ha(m) ; om = omega_ev(m) ; nu= omega_nu(m)
       do i=1,natm
          i  vec(m,i,1) vec(m,i,2) vec(m,i,3)
       end do
     end do

representationは既約表現の配列です。active(m)はラマン活性なモードあれば Rになり、赤外活性なモードであればIRとなります。両活性であれば、IR&Rとなります。 サイレントモードの場合には何も表示されません。 vecは固有ベクトルの配列で、omega_haはHartree単位での振動数で、 omega_evは電子ボルト単位での振動数で、omega_nuは波数です。

力データファイルforce.dataには力の定数を計算するための力のデータが記述されます。その力データは次の形式で出力されます。

    num_force_data, norder, sw_ploynomial_fit
    do i = 1, num_force_data
       displaced_atom, displacement(1:3)
       do ia = 1, natm
          i, force_data(ia,1:3,i)
       end do
    end do

num_force_dataは力を計算する原子配置の数で、displaced_atomは変位した原子の番号で、配列displacementが原子の変位ベクトル\((u_{x},u_{y},u_{z})\)です。 norderは入力で指定したnorderの値が記述されます。sw_ploynomial_fitは入力のsw_ploynomial_fitがONのときに、ONを表す1が記述されます。OFFの場合には、0が記述されます。

sw_calc_forceをOFFに設定することで、出力された力を読み込み、振動解析をやり直すことができます。元素の質量を変更することは問題ありませんが、力計算に関連する変数は変更してはなりません。

### 9.1.4. 一部の原子のみ振動解析の対象とする方法（バージョン2020.01以降）

バージョン2020.01以降より、一部の原子のみを振動解析の対象とすることができるようになりました。本計算機能を用いると、たとえば表面に吸着した分子の振動解析を行う際分子と表面数層のみを考慮することによって必要な原子間力計算回数を減らすことが可能になります。

基本的には通常の振動解析と同様の設定を施せばこの計算機能を用いることができます。各原子のmobile属性値を、変位の対象にしたい場合onに、したくない場合offに設定します。

    structure{
      atom_list{
        atoms{
          #default mobile = on
          #tag element rx ry rz weight mobile
            Cu 0 0 0 1 off
            Cu 0 0.250000000015 0.090375000005 1 off
            Cu 0.250000000015 0 0.090375000005 1 off
            Cu 0.250000000015 0.250000000015 0 1 off
            Cu -0.00133991609598 -6.13618712873e-06 0.183172868018 on
            Cu 0.00243063003687 0.247502210432 0.274544823036 on
            Cu 0.248598303756 0.999991722423 0.274874965184 on
            Cu 0.249918873555 0.250806431959 0.18373526966 on
            Cu 0 0.500000000029 0 1 off
            ...
            ...
        }
      }
    }

通常mobile属性値のデフォルト値はoffですが、振動解析の場合はonがデフォルト値となります。なお、mobile属性がoffの原子が存在する振動解析の場合は対称性を考慮しないようにしてください。

### 9.1.5. 原子間力をファイルから読み込む方法（バージョン2020.01以降）

原子間力が計算済みの場合(force.dataファイルが存在し、原子間力データが記録されている場合)、計算開始前にファイルから読み込み、その原子間力の計算をスキップさせることが可能となりました（2020.01以降この動作が規定の振る舞い）あえて原子間力を新たに計算し直したい場合は、以下の設定を施します。

    phonon{
      sw_read_force_pre = off
    }

phononブロックの下のsw_read_force_preによって可能な場合はファイルから原子間力を読み込むかどうかを設定します。このパラメーターのデフォルト値はonなので、offとすることによってこの振る舞いを抑制し、原子間力を計算し直すことができます。

### 9.1.6. 計算例：水分子の振動解析

水分子の振動解析例を紹介します。入力データは `samples/phonon/H2O` 以下にあります。

構造最適化

振動解析を行うには原子が平衡状態になければなりませんので、振動解析を行うときと同じ条件で構造最適化を行います。平衡状態にないと動力学行列の固有値が負になり、振動数が純虚数のソフトモードが現れます。水分子の構造最適化の入力例を以下に示します。

    Control {
        condition = initial
        cpumax = 1 day ! maximum cpu time
        max_iteration = 6000
    }

    accuracy {
        cutoff_wf = 25.00 rydberg
        cutoff_cd = 225.00 rydberg
        num_bands = 8
        initial_wavefunctions = atomic_orbitals
        initial_charge_density = atomic_charge_density
        ksampling {
                method = gamma
        }
        scf_convergence {
                delta_total_energy = 1.e-10
                succession = 3
        }
        force_convergence {
                max_force = 1.e-4
        }
    }

    structure {
        unit_cell_type = primitive
        unit_cell {
                a_vector = 15.0 0.0 0.0
                b_vector = 0.0 15.0 0.0
                c_vector = 0.0 0.0 15.0
        }
        symmetry {
                tspace {
                        lattice_system = primitive
                        generators {
                        #tag rotation tx ty tz
                                C2z    0   0   0
                                IC2x   0   0   0
                        }
                }
                sw_inversion = off
        }

        magnetic_state = para

        atom_list {
                coordinate_system = cartesian
                atoms {
                #tag  rx             ry       rz          element
                        -1.442399231   0.000000000   1.126191510  H
                         1.442399231   0.000000000   1.126191510  H
                         0.000000000   0.000000000  -0.005814677  O
                }
        }
        element_list {
        #units atomic_mass
        #tag element  atomicnumber zeta  dev  mass
                H   1   1.00   0.5   1.00794
                O   8   0.17   1.0  15.9994 }
    }

    wavefunction_solver {
        solvers {
        #tag sol    till_n
                mddavidson   1
                rmm3        -1
        }
        rmm {
                edelta_change_to_rmm = 1.d-3
        }
    }

    charge_mixing {
        mixing_methods {
        #tag id method   rmxs
                 1  pulay   0.4
        }
    }

    printoutlevel {
        base = 1
    }

file_names.dataにはelement_listと同じ順番でポテンシャルファイルH_ggapbe_paw_nc_01m.ppとO_ggapbe_paw_us_02m.ppを指定します。この入力を使用して得た水分子の構造を 図 9.1 に示します。

図 9.1 水分子の構造

振動解析

構造最適化後に振動解析を行うには、入力の原子座標を最適化した座標に換えて、Phononブロックを加え、振動解析の設定をします。最適化原子座標は構造最適化計算の出力ファイルnfdynm.dataに記述されている最後のステップの原子座標です。

    atom_list{
         coordinate_system = cartesian
         atoms{
            !#tag  rx             ry       rz          element
                  -1.446816228    0.000    1.123327795 H
                   1.446816228    0.000    1.123327795 H
                   0.0            0.0      0.0         O
         }
    }

振動解析の設定はたとえば以下のようにします。原子変位は0.05とします。

    Phonon{
       sw_phonon = on
       sw_calc_force = on
       sw_vibrational_modes = on
       displacement = 0.05
    }

PHASEを実行します。

    % mpirun  ../../../bin/phase

PHASEを実行すると、振動解析結果のファイルmode.dataが出力されます。

振動数レベル図はツールfreq.plを使用して作成します。分子の場合には以下のように-molというオプションを付けてfreq.plを実行します。

    % freq.pl -mol mode.data

この例題の水分子の基準モードの振動数を 図 9.2 に示します。

図 9.2 水分子の振動モードの振動数

基準振動の固有ベクトルの図を作成するための拡張trajectory形式のファイルは、ツールanimate.plで作成します。原点の移動を指定したファイルcontrol.inpを用意します。control.inpは以下のように記述します。

    origin  7.5 7.5 7.5

ツールanimate.plを以下のように実行します。

    % animate.pl mode.data control.inp

基準振動の固有ベクトルの拡張trajectory形式のファイルmode_*.tr2が生成されます。

この例題の水分子の基準モードの固有ベクトルを 図 9.3 に示します。生成された振動モードの拡張trajectory形式のファイルmode_7.tr2,mode_8.tr2,mode_9.tr2を可視化したものです。

図 9.3 水分子の振動モードの固有ベクトル

### 9.1.7. 計算例：シリコン結晶(Si2)

#### 9.1.7.1. 入力パラメータ

シリコン結晶の振動解析の例題です。計算例題は、 `samples/phonon/Si2` です。

入力パラメータファイルnfinput.dataでは、element_listにシリコン原子の質量28.0855 amuが指定されています。質量の単位を原子質量単位とするため、#unitsの後にatomic_massを指定しています

    element_list{     #units atomic_mass
    　　　　　　　　　#tag element  atomicnumber mass
                                 Si       14     28.0855
            }

振動解析のパラメータをPhononブロックで指定します。

    Phonon{
       sw_phonon = on
       sw_calc_force = on
       displacement = 0.1
       sw_vibrational_modes = on
    }

sw_calc_forceとsw_vibrational_modesがともにONなので、振動解析のための力計算を行い、振動解析が行われます。

PHASEを実行します。

    % mpirun  ../../../bin/phase

計算が終了すると、出力ファイルmode.dataに振動解析の結果が出力されます。mode.dataの最初の部分は以下のようになっています。

    --- primitive lattice vectors ---
      0.0000000000   5.0875600000   5.0875600000
      5.0875600000   0.0000000000   5.0875600000
      5.0875600000   5.0875600000   0.0000000000
    --- Equilibrium position and mass of each atom---
    Natom=    2
       1   1.2718900000   1.2718900000   1.2718900000    51196.42133 Si
       2  -1.2718900000  -1.2718900000  -1.2718900000    51196.42133 Si
    --- Vibrational modes ---
    Nmode=    6 Natom=    2
    n=     1 T1u      hbarW =  0.00000000E+00 Ha =  0.00000000E+00 eV; nu=  0.00000000E+00 cm^-1
        1   0.0000000000  0.0000000000  0.7071067812
        2   0.0000000000  0.0000000000  0.7071067812

最初の二行目から三行目は基本並進ベクトルをあらわしています。六行目は原子数を表しています。その次の行からは、原子の番号、デカルト座標、質量、ラベルが一行にあらわされています。Vibrational modesというタイトル行の次の行にはモード数と原子数があらわされています。これ以降には各振動モードの既約表現を先頭行として、次行に振動数があらわされ、その次の行から固有ベクトルがあらわされています。固有ベクトルは原子の番号の後にその原子に帰属するベクトルの３成分があらわされています。

#### 9.1.7.2. 振動数レベル図

振動解析の出力ファイルmode.dataの振動数のデータから振動数レベル図を作成します。 以下のように、ツールfreq.plを実行すると、Postscript形式の振動数レベル図freq.epsが出力されます。

    % freq.pl mode.data

シリコン結晶の振動解析の振動レベル図を 図 9.4 に示します。この図から振動数が517 cm-1であるモードがあることが分かります。 このモードの既約表現はT2gであるので、同じ振動数のモードが三重に縮重しています。T2gモードがラマン活性である場合、図中の規約表現の右側にRが表示されます。赤外活性である場合にはIRと表示されます。

図 9.4 バルクSiの領域中心フォノンモードの振動数

#### 9.1.7.3. 振動モードの可視化

振動解析の出力ファイルmode.dataから拡張Trajectory形式のファイルを作成することにより、固有ベクトルを矢印表示したり、原子が振動するアニメーションとして振動モードを可視化したりできます。ツールanimate.plを使用して、振動解析の出力ファイルmode.dataから振動数の情報を取り出し、拡張Trajectory形式のファイル(拡張子:tr2)を作成します。

原点の移動とセルベクトルの変更を指定したファイルcontrol.inpを用意します。control.inpは以下のように記述します。

    origin  1.27189 1.27189 1.27189
    vector1 10.17512 0 0
    vector2 0 10.17512 0
    vector3 0 0 10.17512

ツールanimate.plを以下のように実行すると、拡張Trajectory形式のファイルがモードの数だけ出力されます。

    % animate.pl mode.data control.inp

この例題では切り出すセルをブラベー格子の単位胞にとり、セルの原点にシリコン原子がくるように設定しています。 たとえば、出力された拡張Trajectory形式のファイルmode_6.tr2を可視化すると、 図 9.5 のように固有ベクトルが矢印で示されます。 図 9.5 に示されているセルは、出力されたgrid.mol2ファイルを読み込ことで表示できます。また、出力された拡張Trajectory形式から、原子の振動を可視化することができます。

図 9.5 バルクSiの領域中心フォノンモードの固有ベクトル

### 9.1.8. 計算例：銅 (100)面に吸着したエチレン分子の振動解析

Cu(100)面にエチレン分子を配置した系の振動解析を実施しました。サンプルデータは `samples/phonon/Cu100_C2H4` の下にあります。まずはCu(100)面にエチレン分子を吸着させ、通常の構造最適化を実施しました。 結果得られた原子配置は 図 9.6 に示す通り。

図 9.6 Cu (100)面にC2H4分子を吸着させた系。

分子のみを考慮するケース(サンプルデータが置かれたディレクトリーはmolonly)、分子と表面第一層まで考慮するケース(サンプルデータが置かれたディレクトリーはph1)、分子と表面第二層まで考慮するケース(サンプルデータが置かれたディレクトリーはph2)、そしてすべての原子を考慮する(サンプルデータが置かれたディレクトリーはphall)振動解析を実施しました。比較のため、孤立分子の振動解析も行いました。得られた振動数の上位5つを 表 9.1 に報告します。

表 9.1 振動数top 5（単位：cm-1）
分子のみ | 分子+1層 | 分子+2層 | 全原子 | 孤立分子
--- | --- | --- | --- | ---
3041.4 | 3039.7 | 3039.4 | 3039.4 | 3057.8
3014.0 | 3012.2 | 3012.0 | 3012.0 | 3028.5
2946.3 | 2944.3 | 2944.1 | 2944.1 | 2973.7
2942.2 | 2940.1 | 2939.8 | 2939.8 | 2957.6
1475.9 | 1478.4 | 1478.7 | 1478.9 | 1618.1

分子のみ考慮する場合ではやくも3 cm-1以下の精度で振動数が計算できていることが分かります。1層取り込むとこれが0.5 cm-1以下となり、ほぼ収束していると考えてよいでしょう。2層取り込んだ結果は最大でも0.2 cm-1の誤差となっており、これは同じ結果が得られているといってもよい精度です。

## 9.2. フォノンバンド計算

### 9.2.1. 機能の概要

PHASEには、 \(\Gamma\) 点だけでなく一般のk点における格子振動解析を行い、フォノンの状態密度やバンド構造を計算する機能があります。 文献 [Parlinski97] のアルゴリズムに従って計算します。

### 9.2.2. 利用方法

#### 9.2.2.1. 基本的な入力パラメータ

この機能を利用するためには、 \(\Gamma\) 点の場合と同様phononブロックを作成し、設定を行います。典型的には、以下のようになります。

    phonon{
      sw_phonon = on
      sw_vibrational_modes = on
      sw_calc_force = on
      displacement = 0.1
      method = dos
      lattice{
        l1 = 2
        l2 = 2
        l3 = 2
      }
      dos{
        mesh{
          nx = 10
          ny = 10
          nz = 10
        }
      }
    }

基本的な入力パラメーターを以下に示します。

第1ブロック識別子 | 第2、第3ブロック識別子 | タグ識別子 | 説明
--- | --- | --- | ---
phonon |  |  | フォノン計算の設定を行うためのブロック
|  | sw_phonon | PHASEの 振動解析機能を 利用するかどうかを指定します。Γ点のみの場合と同様です。
|  | sw_vibrational_modes | 振動解析を行うかどうかを指定します。Γ点のみの場合と同様です。
|  | sw_calc_force | 力定数の計算を行うかどうかを指定します。Γ点のみの場合と同様です。
|  | displacement | 力定数の計算を行う際に、原子をどの程度移動させるかを指定します。Γ点のみの場合と同様です。デフォルト値は0.1 bohrです。
|  | method | “手法”を指定します。状態密度計算の場合はdos, バンド構造計算の場合はband を指定します。
| lattice |  | 一 般k点の振動解析は、スーパーセルの力定数を必要とします。そのスーパーセルの大きさを指定するブロックです。
|  | nx | a軸を何倍するかを指定します。
|  | ny | b軸を何倍するかを指定します。
|  | nz | c軸を何倍するかを指定します。
| dos |  | 状態密度の計算方法を指定するブロックです。
| mesh |  | 状態密度計算に利用するk 点のメッシュを指定するブロックです。
|  | nx | 1つめの逆格子ベクトルの分割数を指定します。
|  | ny | 2つめの逆格子ベクトルの分割数を指定します。
|  | nz | 3つめの逆格子ベクトルの分割数を指定します。

methodをbandと設定すると、フォノンバンドの計算になります。バンド構造の計算は、電子バンド構造と同様band_kpoint.plを利用して計算するk点の情報が記録されたkpoint.dataファイルを作成したあとに実行します。

バンド数およびk点分割数

フォノンバンド計算を行う場合、スーパーセルの作成が行われます。バンド数やk点分割数は、生成されたスーパーセルに合わせてPHASEが自動的に変更します。以下の注意が必要です。

- スーパーセルは、ブラベー格子に対して作成されます。通常のPHASE による計算の場合unit cell type がBravais の場合は基本格子に対してk 点を定義しますが、フォノンバンドの場合はブラベー格子に対して行うようにしてください。

- バンド数は、定義した原子にしたがって通常の計算と同じように決定してください。

イオン性結晶の場合の設定方法

イオン性結晶の場合、Γ点においてオプティカルモードの縦波と横波が異なった振動数を持ちます。この現象は、LO-TO 分裂と呼ばれます。この効果を取り入れる場合、入力ファイルにおいてさらに以下の指定を行う必要があります。

    phonon{
      sw_lo_to_splitting = on
      electronic_dielectric_constant{
        exx = 2.6
        eyy = 2.6
        ezz = 2.6
        exy = 0.0
        exz = 0.0
        eyz = 0.0
      }
    }

変数sw_lo_to_splitting をon とすることによってLO-TO 分裂を考慮した計算を行うことができます。electronic_dielectric_constantブロックには、電子系の誘電テンソルを指定します。electronic_dielectric_constantブロックの下のexx, eyy, ezz, exy, exz, eyz に対応する誘電テンソルの成分を指定します。誘電テンソルは、実測値もしくはUVSOR-Epsilon による計算値をご利用ください。原子の有効電荷も指定する必要があります。これは、作業ディレクトリーにeffchg.data ファイルを作成し、以下のように指定します。

    2
    1
    1.12 0.0 0.0
    0.0 1.12 0.0
    0.0 0.0 1.12
    2
    -1.12 0.0 0.0
    0.0 -1.12 0.0
    0.0 0.0 -1.12

ファイルの1 行目に原子数を記述します。2 行目以降に有効電荷の値を指定します。まず指定対象の原子のID を指定し、さらに有効電荷テンソルを指定します。有効電荷テンソルは、形式電荷を利用することもできますが、

UVSOR-Berry によって得られたボルン有効電荷を利用することが望ましいです。

#### 9.2.2.2. 計算の実行

入力データが準備できたら、通常通りPHASE を実行します。まずは、PHASE は入力の指定にしたがってスーパーセルを作成します。ログファイルには以下のように報告されます。

    natm_super,natm2_super= 64 64
    ia,cps(3),pos(3),ityp
    1 1.27189 1.27189 1.27189 0.06250 0.06250 0.06250 1
    2 8.90323 8.90323 8.90323 0.43750 0.43750 0.43750 1
    3 1.27189 6.35945 6.35945 0.06250 0.31250 0.31250 1
    4 8.90323 13.99079 13.99079 0.43750 0.68750 0.68750 1
    5 6.35945 1.27189 6.35945 0.31250 0.06250 0.31250 1
    6 13.99079 8.90323 13.99079 0.68750 0.43750 0.68750 1
    7 6.35945 6.35945 1.27189 0.31250 0.31250 0.06250 1
    8 13.99079 13.99079 8.90323 0.68750 0.68750 0.43750 1
    9 11.44701 1.27189 1.27189 0.56250 0.06250 0.06250 1
    10 19.07835 8.90323 8.90323 0.93750 0.43750 0.43750 1
    11 11.44701 6.35945 6.35945 0.56250 0.31250 0.31250 1
    12 19.07835 13.99079 13.99079 0.93750 0.68750 0.68750 1
    13 16.53457 1.27189 6.35945 0.81250 0.06250 0.31250 1
    ...
    ...

natm_super がスーパーセルの原子数です。cps は原子のカルテシアン座標、 pos はフラクショナル座標です。itypは原子の種類を識別する番号です。また, スーパーセルに合わせて変化したバンド数とk点のメッシュが次のように報告されます。

    num_bands will be changed.
    neg,meg= 192 192
    k-point mesh will be changed.
    mesh= 1 1 1

neg が新しいバンド数, mesh が新しいk 点メッシュです。

#### 9.2.2.3. 出力ファイル

mode.dataファイル

振動解析の結果はmode.data ファイルに記録されます。フォノンバンドの場合のmode.dataファイルは、たとえば以下のようになります。Γ点の場合と比較して、振動モードの記述の仕方が異なります。

    --- Vibrational modes ---
    Nmode= 6 Natom= 2 Nqvec 120
    iq= 1 q=( 0.00000, 0.00000, 0.00000) ( 0.00000, 0.00000, 0.00000)
    n= 1 T1u IR
    hbarW= 0.00000000E+00 Ha = 0.00000000E+00 eV; nu= 0.00000000E+00 cm^-1
    1 0.0000000000 0.7071067812 0.0000000000
    2 0.0000000000 0.7071067812 0.0000000000
    1 0.0000000000 0.0000000000 0.0000000000
    2 0.0000000000 0.0000000000 0.0000000000
    n= 2 T1u IR
    ...
    iq= 2 q=( 0.01875, 0.01875, 0.03750) ( 0.02316, 0.02316, 0.00000)
    n= 1 B2 IR&R
    hbarW= 0.63506708E-04 Ha = 0.17281054E-02 eV; nu= 0.13938112E+02 cm^-1
    1 0.4999599615 -0.4999599615 0.0000000000
    2 0.4999599615 -0.4999599615 0.0000000000
    1 0.0063274755 -0.0063274755 0.0000000000
    2 0.0063274755 -0.0063274755 0.0000000000
    n= 2 B1 IR&R
    ...

モードの数と原子数の後に、k点の数が示されます。各k 点の振動数モードの記述の前に, k 点の座標が部分座標とカルテシアン座標で示されます。振動モードの固有ベクトルは一般には複素数となるので, 固有ベクトルの実部の後に, 虚部が記述されます。なお、Γ点の場合と同様に振動の対称性および赤外ラマンの活性/不活性の判定が出力されますが、この情報はΓ点以外では意味がない点にご注意ください。

phdos.dataファイル

フォノンの状態密度はphdos.data ファイルに出力されます。その内容は、典型的には下記のようなものです。

    # Index Omega(mHa) Omega(eV) Omega(cm-1) DOS(States/Ha) DOS(States/eV) DOS(States/cm-1) IntDOS(States)
    0 -0.00050000 -0.00001361 -0.10973732 0.00000000  0.00000000 0.00000000 0.00000000
    1  0.00950000  0.00025851  2.08500903 0.00473815  0.17412390 0.00002159 0.00001500
    2  0.01950000  0.00053062  4.27975539 0.01996324  0.73363561 0.00009096 0.00012976
    3  0.02950000  0.00080274  6.47450174 0.04568839  1.67901746 0.00020817 0.00044927
    4  0.03950000  0.00107485  8.66924810 0.08191360  3.01026946 0.00037323 0.00107853
    5  0.04950000  0.00134696 10.86399446 0.24722290  9.08527497 0.00112643 0.00286860
    6  0.05950000  0.00161908 13.05874081 0.37130693 13.64527929 0.00169180 0.00591423
    7  0.06950000  0.00189119 15.25348717 0.49343689 18.13347292 0.00224826 0.01020273
    8  0.07950000  0.00216331 17.44823352 0.67844022 24.93222060 0.00309120 0.01602478
    ...................
    ...................

1 列目は状態密度のインデックス、2, 3, 4 列目がそれぞれmHa, eV, cm-1 単位のエネルギー、5, 6, 7 列目がそれぞれstates/Ha, states/eV, states/cm-1 単位での状態密度、8 列目が積算状態密度です。積算状態密度は、最も高エネルギーの状態においては原子数×3 になります。

解析用Perlスクリプト

フォノンバンド計算の結果解析用のPerl スクリプトがPHASE には備わっています。以下の3 種類のPerl スクリプトを利用して結果の解析を行うことができます。

phonon_dos.pl

フォノンの状態密度データから、「フォノン状態密度図」を作成するPerlスクリプトです。以下のように使用します。

    % phonon_dos.pl phdos.data OPTIONS

phdos.data が、PHASE が出力するフォノン状態密度データです。実行すると、phonon_dos.eps というEPS形式の画像ファイルが作成されます。下記のオプションを利用することができます。

--units=UNITS or -u UNITS | エネルギーの単位を指定します。mHa, meV, THz, cm-1のいずれかです。デフォルト値はcm-1です。
--width=WIDTH or -w WIDTH | 作成される図の幅を指定します。デフォルト値は1です。
--erange=[emin:emax] or -e [emin:emax] | エネルギーの範囲を指定します。
--drange=DRANGE or -d DRANGE | 状態密度の範囲を指定します。
--title=TITLE or -t TITLE | 図のタイトルを指定します。
--font=FONT or -f FONT | グラフに利用するフォントサイズを指定します。デフォルト値は18です。
--keep or -k | 中間のデータファイルを保持する場合、このオプションを有効にします。
--mono or -m | モノクログラフを描画したい場合にこのオプションを指定します。
--dinc=DINC | 状態密度の目盛を指定します。
--einc=EINC | エネルギーの目盛を指定します。

phonon_band.pl

フォノンバンドのデータから「フォノンバンド図」を作成するPerl スクリプトです。以下のように使用します。

    % phonon_band.pl mode.data OPTIONS

mode.data が、振動解析の結果が記録されたファイルです。実行すると、phonon_band.eps というEPS 形式の画像ファイルが作成されます。オプションには、下記のようなものがあります。

--control=CONTROL or -c CONTROL | band_kpoint.plファイルの入力ファイルを指定します。デフォルト値はbandkpt.inです。
--ptype=PTYPE or -p PTYPE | グラフ描画に利用するプロット種を指定します。lineを指定すると実線、circleを指定すると丸でフォノンバンドを描画します。デフォルト値はlineです。
--units=UNITS or -u UNITS | エネルギーの単位を指定します。mHa, meV, THz, cm-1のいずれかです。デフォルト値はcm-1 です。
--width=WIDTH or -w WIDTH | 作成される図の幅を指定します。デフォルト値は1です。
--erange=[emin:emax] or -e [emin:emax] | エネルギーの範囲を指定します。
--title=TITLE or -t TITLE | 図のタイトルを指定します。
--font=FONT or -f FONT | グラフに利用するフォントサイズを指定します。デフォルト値は18です。
--mono or -m | モノクログラフを描画したい場合にこのオプションを指定します。
--keep or -k | 中間のデータファイルを保持する場合、このオプションを有効にします。
--einc=EINC | エネルギーの目盛を指定します。

phonon_energy.pl

フォノンの状態密度から、振動に由来する内部エネルギーとヘルムホルツの自由エネルギーや比熱を計算するスクリプトです。振動に由来するヘルムホルツの自由エネルギーに通常のDFT計算で得られる全エネルギーを加えれば、有限温度における固体の自由エネルギーを計算することができ、温度誘起の相転移を解析することなども可能です。

波数kのフォノンのエネルギーは、その振動数\(\omega_{\mathbf{k}}\)を利用して\(\left( \frac{1}{2} + n \right)\hbar\omega_{k}\)と記述することができます。分配関数は\(Q_{k} = \sum_{n}^{}e^{\frac{- U_{\text{kn}}}{k_{B}T}}\)と記述されるので、フォノンのエネルギーを代入し整理すると以下の結果が得られます。

\[Q_{k} = \frac{\exp\left\lbrack - \frac{\hbar\omega_{k}}{2k_{B}T} \right\rbrack}{1 - \exp\left\lbrack - \frac{\hbar\omega_{k}}{k_{B}T} \right\rbrack}.\]

ヘルムホルツの自由エネルギーは\(F_{\text{vib}} = \sum_{k}^{}{- k_{B}T\log Q_{k}}\)と記述できるので、以下のように記述されます。

\[F_{\text{vib}} = \sum_{k}^{}\left\lbrack \frac{\hbar\omega_{k}}{2} + k_{B}T\log\left( 1 - \exp\left\lbrack - \frac{\hbar\omega_{k}}{k_{B}T} \right\rbrack \right) \right\rbrack.\]

振動による平均の内部エネルギーは\(U_{\text{vib}} = \frac{1}{Q_{k}}\sum_{n}^{}{U_{\text{kn}}\exp\left( - \frac{U_{\text{kn}}}{k_{B}T} \right)}\)と記述できるので、以下のように記述することができます。

\[U_{\text{vib}} = \sum_{k}^{}{\left\lbrack \frac{\hbar\omega_{k}}{2} + \frac{\hbar\omega_{k}}{\exp{\left\lbrack \frac{\hbar \omega}{k_{B}T} \right\rbrack - 1\ }} \right\rbrack.}\]

エントロピーは、\(F_{\text{vib}}\)および\(U_{\text{vib}}\)から\(\left( U_{\text{vib}} - F_{\text{vib}} \right)/T\) と計算することができます。定積比熱は内部エネルギーの温度に関する偏微分で与えられるので、以下のように計算することができます。

\[C_{v} = \frac{\partial U_{\text{vib}}}{\partial T} = k_{B}\left\lbrack \frac{\frac{\hbar\omega_{k}}{k_{B}T}\exp{\left( \frac{\hbar\omega_{k}}{2k_{B}T} \right)}}{\exp{\left( \frac{\hbar\omega_{k}}{k_{B}T} \right) - 1}} \right\rbrack^{2}.\]

phonon_energy.plを利用すると、以上のような計算を実行することが可能です。以下のように利用します。

    % phonon_energy.pl mode.data

この操作によって、以下の3つのファイルが作成されます。

phonon_energy.dataファイル 内部エネルギー、ヘルムホルツ自由エネルギー、エントロピー、比熱の計算結果が以下の形式で記録されているファイルです。

    # T (K) Internal Energy (eV) Free energy (eV) Entropy (eV/K) Cv (kB/atom)
    0 0.125434126153072 0.125434126153072 0 0 30 0.12552700746085 0.125409486111375 3.91737831580881e-06
    0.0820122071540538 60 0.126828216477476 0.124936822438767 3.15232339784872e-05
    0.435633166874193 90 0.130001095247047 0.123379006005857 7.35787693465625e-05
    0.787404251770626 120 0.134948880737123 0.120473935403623 0.000120624544445835 1.12444793146534
    .......
    .......
    .......

1列目に温度が、2列目以降からは内部エネルギーとヘルムホルツ自由エネルギーがeV単位で、エントロピーがeV/K単位で、原子あたりの比熱がkB単位で記述されます。

phonon_energy.eps ファイル 内部エネルギー、ヘルムホルツ自由エネルギー、エントロピーを温度の関数としてプロットしたEPSファイルです。

phonon_Cv.eps ファイル 比熱と温度の関係をプロットしたEPSファイルです。

Si結晶の場合に得られるphonon_energy.epsおよびphonon_Cv.epsの例を示します。phonon_energy.plスクリプトは、フォノン状態密度計算を実行した際に得られるmode.dataファイルを利用する必要がある点にご注意ください。フォノンバンド計算を実行した際に得られるmode.dataファイルを利用すると、以下のようなエラーが発生し途中で終了してしまいます。なお、得られるエネルギーは、入力で指定した原子数分となります。

    % phonon_energy.pl mode.data
    weight undefined for q-point no. 1 at /home/user/phase/bin/phonon_energy.pl line 131, <MD> line 4450.

図 9.7 phonon_energy.eps（左図）とphonon_Cv.eps（右図)の例

phonon_energy.plスクリプトのオプションは、下記の通りです。

--width=WIDTH or -w WIDTH | 作成される図の幅を指定します。デフォルト値は1です。
--trange=[tmin:tmax] or -t [tmin:tmax] | 温度の範囲を指定します。デフォルト値は0 Kから3000 Kです。
--nT=NT or -n NT | 温度の点の数を指定します。デフォルト値は100です。
--font=FONT or -f FONT | グラフに利用するフォントサイズを指定します。デフォルト値は18 です。
--mono or -m | モノクログラフを描画したい場合にこのオプションを指定します。
--tinc=TINC | 温度の目盛を指定します。
--einc=EINC | エネルギーの目盛を指定します。
--cinc=EINC | 比熱の目盛を指定します。

### 9.2.3. 例題

#### 9.2.3.1. シリコン結晶

最も簡単な例の1 つとして、シリコン結晶のフォノンバンドとフォノン状態密度の計算を実行した例を紹介します。 この例題の入力ファイルは、 `samples/phono_band/Si` 以下にあります。

まずはバンド計算を行います。 `samples/phonon_band/Si/band` 以下の入力ファイルを利用します。

band_kpoint.pl 用の入力ファイル、bandkpt.in の内容は、以下のようになっています。

    0.02
    -0.8333333 0.8333333 0.8333333
    0.8333333 -0.8333333 0.8333333
    0.8333333 0.8333333 -0.8333333
    0 0 0 1 # {/Symbol G}
    1 1 0 2 # X
    5 3 0 8 # U
    0 0 0 1 # {/Symbol G}
    1 0 0 2 # L

このbandkpt.in ファイルを利用して、以下のようにkpoint.data ファイルを作成します。

    % band_kpoint.pl bandkpt.in

入力の、原子配置の指定は以下のようになっています。

    structure{
      unit_cell_type = bravis
      unit_cell{
        a = 10.17512
        b = 10.17512
        c = 10.17512
        alpha = 90.0
        beta = 90.0
        gamma = 90.0
      }
      symmetry{
        tspace{
          lattice_system = facecentered
        }
        method = automatic
      }
      atom_list{
        coordinate_system = internal
        atoms{
          #tag element rx ry rz mobile
              Si 0.125 0.125 0.125 0
              Si 0.875 0.875 0.875 0
        }
      }
      element_list{
        #units atomic_mass
        #tag element atomicnumber mass
            Si 14 28.0855
      }
    }

unit_cell_type をbravais とし、lattice_system パラメータによってこの系がfacecentered, すなわち面心であることを指定しています。上述したように、通常のPHASE の計算ではこのような指定がなされている場合単位胞を基本格子に変換しますが、フォノンバンド計算ではそのようなことは行われません。次に、phonon ブロックを次のように記述しています。

    Phonon{
      sw_phonon = on
      sw_calc_force = on
      sw_vibrational_modes = on
      lattice{
        l1 = 2
        l2 = 2
        l3 = 2
      }
      method = band
    }

スーパーセルは、a, b, c 軸それぞれを2 倍とする設定を採用しています。以上の設定のもとPHASE を通常通り実行します。計算が終了すると、その結果がmode.data に記録されます。mode.data ファイルからフォノンバンド図を得るためには、以下の操作を行います。

    % phonon_band.pl mode.data --control=bandkpt.in

--control オプションでband kpoint.pl 用の入力ファイルを指定していますが、この指定がない場合はバンド図に特殊点を表す縦線などは描画されなくなります。結果は次に示す図のようになります。

図 9.8 シリコン結晶のフォノンバンド

フォノンの状態密度の計算に必要な入力データは、 `samples/phonon_band/Si/dos` 以下にあります（力定数は計算済みなので、bandディレクトリーの下にあるforce.dataファイルをコピーして利用すると力定数計算をスキップすることも可能ですが、この場合はsw_calc_forceパラメータをoffに設定してください）このサンプルの入力パラメータファイルには、以下のような記述がなされています。

    Phonon{
      sw_phonon = on
      sw_vibrational_modes = on
      lattice{
        l1 = 2
        l2 = 2
        l3 = 2
      }
      dos{
        mesh{
          nx = 10
          ny = 10
          nz = 10
        }
      }
      method = dos
    }

method = dos と指定することによって状態密度計算を行うことを指定しています。dos ブロックの下のmesh ブロックにおいて、状態密度計算で利用するメッシュを10×10×10 としています。入力をこのように編集し終えたらPHASE を実行します。フォノン状態密度の計算結果はphdos.data ファイルに記録されます。このデータをもとにphonon dos.pl スクリプトを利用してフォノン状態密度図を作成します。

    % phonon_dos.pl phdos.data

この結果得られるフォノン状態密度図は次に示す通りです。

図 9.9 シリコン結晶のフォノン状態密度。

#### 9.2.3.2. ヨウ化カリウム

ヨウ化カリウムはNaCl 型の結晶構造をもつ、イオン性の結晶です。 図 9.10 にその結晶構造を示します。ここでは、この結晶を例にLO-TO 分裂を考慮したフォノンバンド計算を紹介します。この例題の入力ファイルは、 `samples/phonon_band/KI` 以下にあります。

図 9.10 ヨウ化カリウムの結晶構造

LO-TO分裂を考慮した計算を行うためには、電子系の誘電テンソルと有効電荷が必要です。これらは以下のようにして得ました。

- 誘電テンソル：UVSOR-Epsilonを利用して計算しました。この際、2.2 eVのギャップ補正を施しました。結果は、xx, yy, zz方向がそれぞれ2.6となりました。

- 有効電荷：UVSOR-Berryを利用して、ボルン有効電荷テンソルの計算を行いました。結果は、カリウムの有効電荷が1.1262, ヨウ素の有効電荷が－1.1262となりました。

これらを設定し、sw_lo_to_splittingをonとする以外はシリコン結晶の場合と同じです。に、得られたフォノンバンドを示します。比較のため、LO-TO分裂を考慮せずに計算した結果も合わせて表示しています。赤線がLO-TO分裂を考慮せずに計算した結果、青線が考慮して計算した結果に対応します。この図から明らかなように、Γ点付近ではLO-TO分裂によって考慮しない場合は縮退している状態が分裂しています。

図 9.11 KI 結晶のフォノンバンド。赤線がLO-TO分裂を考慮せずに計算した結果、青線がLO-TO 分裂を考慮して計算した結果。

#### 9.2.3.3. スズの温度誘起相転移

最後に、フォノン自由エネルギー解析の簡単な適用例としてスズの温度誘起相転移の例を紹介します。この例題の入力ファイルは、 `samples/phonon_band/Sn/a-Sn` （αスズ）および `samples/phband/Sn/b-Sn` （βスズ）にあります。

スズには、αスズとβスズと呼ばれる同素体があります。αスズはダイヤモンド構造、βスズはその名の通りβスズ構造をとります。その結晶構造を、 図 9.12 に示します。

図 9.12 αスズ（左図）とβスズ（右図）の結晶構造

βスズ構造はダイヤモンド構造をc軸方向から押しつぶしたような結晶構造であり、体心正方晶を取ります。常温ではβスズが安定ですが、低温下ではαスズが安定になります。これは、結晶そのものの全エネルギーはαスズの方が低いが、温度上昇に伴うフォノンの自由エネルギーの低下はβスズの方が大きいためある温度で自由エネルギーはβスズの方が低くなり、相転移するからであると考えられます。このような現象を、フォノンの自由エネルギー計算と結晶の全エネルギー計算を組み合わせて確認していきます。

まずは、格子定数の最適化を行いました。ただし、βスズ構造のc/a比は0.54614と固定して最適化しました。結果は、次の表に示す通りです。

| 格子定数a (Å) | 格子定数 c (Å) | 全エネルギー (ha./cell)
--- | --- | --- | ---
αスズ | 6.6555 | 6.6555 | -136.147884
βスズ | 5.9184 | 3.2323 | -136.144694

この結果から明らかなように、全エネルギーはαスズの方が低いので、絶対零度ではαスズが安定であると考えられます。

続いて、得られた安定な格子定数のもとで振動解析を行いました。自由エネルギーを評価する場合に必要な計算は、状態密度のみです。αスズ、βスズに対してシリコンの場合と同様の設定をPhononブロックで行い、振動解析を実施しました。計算終了後に得られたmode.dataファイルを、phonon_energy.plスクリプトで処理します。

    % phonon_energy.pl mode.data

結果得られるphonon_energy.dataファイルの3列目にフォノンの自由エネルギーが記録されます。これは単位胞あたりの値なので、上述の全エネルギーの単位胞あたりのエネルギーを加え、温度の関数としてプロットすると 図 9.13 のような結果が得られます。

図 9.13 αスズとβスズの自由エネルギーと温度の関係。赤線がαスズ、緑線がβスズに対応する。

図 9.3 においてαスズの曲線（赤線）とβスズの曲線（緑線）が交差する温度が転位温度と考えられます。この計算ではおおよそ510 Kとなりました。実際には290 Kなので相転移温度が高く評価されてしまいましたが、このような計算によって温度誘起の構造相転移を説明できることはお分かりいただけたと思います。

### 9.2.4. フォノンバンドの原子群への射影（バージョン2022.01以降）

フォノンバンドを計算する際、特定の原子あるいは原子群の成分を抽出し可視化することができます。

#### 9.2.4.1. 入力ファイル

まず、入力パラメーターファイルに対象の原子群を検出するための縁となるkeyの値を原子に設定します。たとえば以下のように設定します。

    structure{
        atom_list{
            atoms{
                #default mobile=yes
                #tag element rx   ry   rz  key
                     Si  0.00 0.00 0.00  1
                     Si  0.25 0.25 0.25  2
            }
       }
    }

ついで、phononブロックにおいて次の設定を施します。

    phonon{
      ..
      use_qpoint_data_file = yes
    }

さらに、file_names.dataファイルにおいてファイルポインター `F_QPOINT` によってk点座標が記録されたファイルを指定します。

    &fnames
    F_QPOINT = './kpoint.data'
    /

この状態で通常通りフォノンバンドの計算を実行します。

#### 9.2.4.2. 可視化スクリプト

可視化にはphonon_band_atom_proj.pyを用います。

    usage: phonon_band_atom_proj.py [-h]
     [--atom_id [ATOM_ID [ATOM_ID ...]]]
                   [--element [ELEMENT [ELEMENT ...]]] [--key [KEY [KEY ...]]]
                   [--z_range Z_RANGE Z_RANGE]
                   [--mode_sym [MODE_SYM [MODE_SYM ...]]] [--neglect_mass]
                   [--disp_squared] [--e_range E_RANGE E_RANGE] [--e_inc E_INC]
                   [--unit UNIT] [--plot_style PLOT_STYLE]
                   [--circle_scale CIRCLE_SCALE] [--cb_range CB_RANGE CB_RANGE]
                   [--fig_format FIG_FORMAT] [--out_file OUT_FILE]
                   [--ref_file REF_FILE] [--ndiv_erange_map NDIV_ERANGE_MAP]
                   [--broadening_width_map BROADENING_WIDTH_MAP]
                   [--threshold THRESHOLD]
                   phonon_file  qpt_file

phonon_file 及びqpt_fileは、最低限実行に必要なファイルで、それぞれ `mode.data` 及び `bandqpt.in` に対応します。上記で括弧内は省略可能なオプションで、その意味は以下のとおりです。

引数 | 意味 | デフォルト値
--atom_id | 原子インデックスのリスト (任意の個数) | なし
--element | 元素のリスト (任意の個数) | なし
--key | key 値のリスト (任意の個数) | なし
--z_range | 原子座標のz成分の最小値、最大値 (単位：bohr) | なし
--proj_qdir | 縦波成分の比率を抽出する (バージョン2024.01以降) |
--e_range | 表示するエネルギー領域の 最小値、最大値 | なし
--e_inc | エネルギー領域のインクリメント | なし
--unit | エネルギーの単位 (meV, THz, cm-1) | cm-1
--plot_style | 重みを表現する手法の指定 (1,2,3) 1: 円の半径、2: 色、 3: 色及び円の半径 | 1
--circle_scale | 円の半径のスケール | 1.0
--cb_range | 重みの範囲の最小値、最大値 | なし
--fig_format | 可視化画像の形式 (png/eps) | eps
--out_file | (拡張子を除く)出力ファイル名 | atom_projected_phonon_band

以下に実行例を示します。key 及び atom_id 値は、連番の場合、”-“ でつなげることができます。 例えば、”1-3” は “1 2 3” と同義です。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --key 1-3 6  --element Si O --atom_id 11-13 17 20 21  --z_range 10.5  18.0
    --unit THz --e_range 0 1000
    --plot_style 3 --circle_scale 0.8 --cb_range 0.0 0.4　--out_file weight_phband

上記コマンドを実行すると、次に示すような形式で `weight_phband.dat` に各基準振動での重みの値が出力されます。 `out_file` 無指定の場合には、出力ファイル名は `atom_projected_phonon_band.dat` です。

    #      dq           freq[meV]        weight
         0.00000000    15.56924599     0.53087651
         0.01022875    15.50472679     0.49987256

拡張子 gnuのファイルは gnuplot 用のファイルです。このファイルをgnuplot で loadすると、png あるいは eps ファイルが生成されます。

#### 9.2.4.3. 例題

SiO2 (alpha quartz)

SiO2に適用した例を紹介します。入力ファイルは `samples/phonon_band/projected_pband/SiO2-bulk/phonon` 以下に配置されています。計算条件は次に示す通り。

平面波カットオフ [Ry] | 25.0
電荷密度カットオフ [Ry] | 225.0
k 点サンプリング | monk (4×4×4)
交換相関相互作用 | GGAPBE, PAW
SCF 収束条件 [Ha/atom] | 1.0E-8
displacement | 0.05
latticeの指定 | l1=2, l2=2, l3=2
擬ポテンシャル | Si_ggapbe_paw_nc_01m.pp O_ggapbe_paw_us_02.pp
格子定数 [Å, deg.] | a = 5.1059, b = 5.1059, c = 5.5842, alpha = 90, beta =90, gamma = 120

用いた `bandqpt.in` ファイルの内容は下記の通り。

    0.02
      0.6512  0.0000  0.0000
      0.3760  0.7519  0.0000
      0.0000  0.0000  0.5954
    0 0 1 2 # A
    0 0 0 1 # {/Symbol G}
    -1 -1 0 3 # K
    0 -1 0 2 # M
    0 0 0 1 # {/Symbol G}

可視化コマンドと得られる結果は下記の通り。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --element Si --fig_format png --unit meV --e_range 0 160
    --plot_style 2 --circle_scale 2

図 9.14 alpha quartz (ブラベー格子)の重み付きフォノンバンド。Si原子の寄与。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --element O --fig_format png --unit meV --e_range 0 160
    --plot_style 2 --circle_scale 2

図 9.15 alpha quartz (ブラベー格子)の重み付きフォノンバンド。O原子の寄与。

次に、SiO2 (0001)表面に適用した例を紹介します。入力ファイルは `samples/phonon_band/projected_pband/SiO2-surf/phonon_surf` 以下に配置されています。表面のOおよび裏面のSi原子はH原子で終端しました。計算条件は以下の通り。

平面波カットオフ [Ry] | 25.0
電荷密度カットオフ [Ry] | 225.0
k 点サンプリング | monk (4×4×1)
交換相関相互作用 | GGAPBE, PAW
SCF 収束条件 [Ha/atom] | 1.0E-8
displacement | 0.05
latticeの指定 | l1=2, l2=2, l3=1
擬ポテンシャル | Si_ggapbe_paw_nc_01m.pp O_ggapbe_paw_us_02.pp H_ggapbe_paw_nc_01m.pp
Si原子層 | 10 (表面のO原子及び裏面のSi原子を H原子で終端)
格子定数 [Å, deg.] (真空層を含む) | a = 5.1059, b = 5.1059, c = 35.0000, alpha = 90, beta =90, gamma = 120

用いた `bandqpt.in` ファイルの内容は下記の通り。

    0.01
      0.6512  0.0000  0.0000
      0.3760  0.7519  0.0000
      0.0000  0.0000  0.0739
    0 0 0 1 # {/Symbol G}
    -1 -1 0 3 # K
    0 -1 0 2 # M
    0 0 0 1 # {/Symbol G}

以下に、可視化コマンドと得られた図を示します。指定した z_range値は、表面あるいは裏面から3 Si原子層までにある全ての原子に対応します。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --z_range 26.0 36.0 --fig_format png --unit meV --e_range 0 160
    --plot_style 3 --circle_scale 0.8

図 9.16 alpha quartz (0001)表面の重み付きフォノンバンド。表面側成分。

    python3 phonon_band_atom_proj.py  mode.data  bandqpt.in
    --z_range 0.0 10.0 --fig_format png --unit meV --e_range 0 160
    --plot_style 3 --circle_scale 0.8

図 9.17 alpha quartz (0001)表面の重み付きフォノンバンド。裏面側成分。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --atom_id 31-34  --fig_format png --unit meV --e_range 0 160
    --plot_style 3 --circle_scale 0.8

図 9.18 alpha quartz (0001)表面の重み付きフォノンバンド。表面側H原子、およびそれに結合しているO原子の成分。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --atom_id 1 2 --fig_format png --unit meV --e_range 0 160
    --plot_style 3 --circle_scale 0.8

図 9.19 alpha quartz (0001)表面の重み付きフォノンバンド。裏面側H原子の成分。

Si結晶における縦波比率の可視化 (バージョン2024.01以降)

Si結晶の縦波成分の比率を可視化する例を紹介します。入力ファイルは `samples/phonon_band/projected_pband/Si2` 以下に配置されています。PHASE/0による計算を実行し、以下の要領で可視化スクリプトを実行します。

    phonon_band_atom_proj.py  mode.data  bandqpt.in --proj_qdir  --plot_style 3  --fig_format png

その結果、次に示す図のように縦波の比率を色と円の半径で表したプロットを得ることができます。赤く半径が大きい点ほど、縦波成分が多いことを意味します。

図 9.20 Si 結晶(2原子)のフォノンバンドにおける縦波成分の可視化

### 9.2.5. バルクのフォノンバンドの表面ブリルアンゾーンへの射影（バージョン2022.01以降）

バルクのフォノンバンドを表面ブリルアンゾーンに射影する方法を説明します。

#### 9.2.5.1. 入力

`band_kpoint.pl` を用いてk点座標データファイルを作成します。表面フォノンバンド用の `bandqpt.in` ファイルはたとえば以下のような内容になります。 （表面平行方向を、表面モデルと同じ形状に設定した） バルクのフォノンバンド計算でも、同じ入力ファイルを用います。

    0.02
      0.6076  0.0000  0.0000
      0.0000  0.8592  0.0000
      0.0000  0.0000  0.0831
    0 1 0 2 # Y
    0 0 0 1 # {/Symbol G}
    1 0 0 2 # X

band_kpoint.plを以下の要領で実行します

表面の場合

    band_kpoint.pl  bandqpt.in –outfile=qpoint.data

バルクの場合

    band_kpoint.pl  bandqpt.in –outfile=qpoint.data  –zdiv=N  -zshift=1

表面の場合との違いは、各(qx,qy) にて、[0,1] の範囲で N 等分した qz 値を出力する点です。zshift > 0 の場合には、qz を 0.5/N だけシフトします。

この状態で通常通りフォノンバンドの計算を実行します。

#### 9.2.5.2. 可視化スクリプト

可視化には前節同様phonon_band_atom_proj.pyを用います。ここではバルクのフォノンバンドの表面ブリルアンゾーンへ射影に特有のオプションを説明します。

引数 | 意味 | デフォルト値
--ref_file | バルクのmode.data | なし
--ndiv_erange_map | バルクのフォノンのスペクトルを計算するためのエネルギー軸の分割数 | なし
--broadening_width_map | バルクのフォノンのスペクトルをなまらせる幅(エネルギー軸の分解能を単位とする) | 5
--threshold | プロットする表面フォノンバンドの重みの閾値 | 0.01

以下に実行例を示します。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --key 1 2 3 --fig_format png
    --unit meV --e_range 0 200
    --ref_file mode.data.bulk  --threshold 0.85

--ref_file を用いた場合には、plot_style の指定は無効になります。

#### 9.2.5.3. 例題

H終端Si(110)表面に適用した例を紹介します。 バルクの入力ファイルは `samples/phonon_band/projected_pband/Si-bulk/phonon` に、表面の入力ファイルは `samples/phonon_band/projected_pband/Si-surf/phonon_surf` 以下に配置されています。

計算条件は下記の通り。

バルク

平面波カットオフ [Ry] | 25.0
電荷密度カットオフ [Ry] | 225.0
k 点サンプリング | monk (4×4×6)
交換相関相互作用 | GGAPBE, PAW
SCF 収束条件 [Ha/atom] | 1.0E-8
displacement | 0.05
latticeの指定 | l1=2, l2=2, l3=2
擬ポテンシャル | Si_ggapbe_paw_nc_01m.pp
格子定数 [Å,deg.] | a = 5.4726, b = 3.8697, c = 3.8697, alpha = 90, beta = 90, gamma = 90

表面

平面波カットオフ [Ry] | 25.0
電荷密度カットオフ [Ry] | 225.0
k 点サンプリング | monk (4×4×1)
交換相関相互作用 | GGAPBE, PAW
SCF 収束条件 [Ha/atom] | 1.0E-8
displacement | 0.05
latticeの指定 | l1=2, l2=2, l3=1
擬ポテンシャル | Si_ggapbe_paw_nc_01m.pp H_ggapbe_paw_nc_01m.pp
Si原子層 | 15
格子定数 [Å, deg.] (真空層含む) | a = 5.4726, b = 3.8697, c = 45.0000, alpha = 90, beta = 90, gamma = 90

用いた `bandqpt.in` ファイルは以下の通り。

    0.01
      0.6076  0.0000  0.0000
      0.0000  0.8592  0.0000
      0.0000  0.0000  0.0831
    0 1 0 2 # X
    0 0 0 1 # {/Symbol G}
    1 0 0 2 # X'

表面については通常通り `band_kpoint.pl` を実行しました。バルクに関しては以下のコマンドを用いました。

    band_kpoint.pl bandqpt.in --outfile=qpoint.data --zdiv=50 --zshift=1X

以下に、可視化コマンドと得られた図を示します。指定した key 値は、表面及び裏面の5原子層のSi、および吸着H原子に対応します。

    python3  phonon_band_atom_proj.py  mode.data  bandqpt.in
    --key 1-6 12-17 --fig_format png --unit meV
    --e_range 0 90 --ref_file  mode.data.bulk  --threshold 0.85
    --out_file atom_projected_phonon_band_with_ref_bulk
    ( 現在のフォルダは、表面のフォノン計算を行ったフォルダとする。mode.data.bulk は、別のフォルダにある bulk のmode.data を指す。)

図 9.21 H終端Si(110)表面のフォノンバンド (青線)。表面/裏面から5原子層のSi、および吸着H原子の成分をプロット。灰色の領域は、バルクのフォノンバンドを射影したものに対応する。

### 9.2.6. フォノンバンドアンフォールディング (バージョン2024.01以降)

フォノンバンドも、 電子バンドと同じようにアンフォールド(6.7 章 参照)することができます。フォノンバンドのアンフォールディングは、 [Zheng17] の方法を用いて行います。

#### 9.2.6.1. 入力ファイル

フォノンバンドアンフォールディングの機能を利用するには、phonon_band_unfoldingブロックで、sw_phonon_band_unfolding = onを指定します。また、電子バンドアンフォールディングと同じく、reference_cell ブロック内に、(基本格子等の) 射影したいセルの格子ベクトルを記入します。以下に入力例を示します。ハイライトしている部分が関係ある設定項目です。

     structure{
         unit_cell_type = bravais
         unit_cell{
             a = 10.17512,   b = 10.17512,    c = 10.17512
             alpha = 90.0,    beta = 90.0,     gamma = 90.0
         }
         reference_cell{
            a_vector =  0.00000       5.08756        5.08756
            b_vector =  5.08756       0.00000        5.08756
            c_vector =  5.08756       5.08756        0.00000
         }
     }
     Phonon{
         sw_phonon = on
         sw_vibrational_modes = on
         sw_calc_force = on
         displacement = 0.1

         method = band
         use_qpoint_data_file = yes

         phonon_band_unfolding{
            sw_phonon_band_unfolding = on
            ngx = 4,   ngy = 4,  ngz = 4          ! default 値は 4
         }
     }

ngx, ngy, ngz は、スーパーセルの逆格子ベクトルを単位としたときの、和をとるGベクトルの各方向の最大値です。qpoint.dataは、reference_cellに対応する bandqpt.in を用いて生成します。この仕様は、電子バンドアンフォールディングの場合と同じです。

#### 9.2.6.2. 出力ファイル

結果はmode.dataファイルに記録されます。フォノンバンドアンフォールディングの重みは、mode.data 内に “weight= ”として出力されます。

     --- supercell lattice vectors ---
      10.1751200000   0.0000000000   0.0000000000
       0.0000000000  10.1751200000   0.0000000000
       0.0000000000   0.0000000000  10.1751200000
     --- reference cell lattice vectors ---
       0.0000000000   5.0875600000   5.0875600000
       5.0875600000   0.0000000000   5.0875600000
       5.0875600000   5.0875600000   0.0000000000
     --- Equilibrium position and mass of each atom---
     Natom=    8
     (中略)
     --- Vibrational modes ---
     Nmode=   24 Natom=    8 Nqvec  136
     iq=    1 q=(   0.0000000000,   0.0000000000,   0.0000000000) (   0.0000000000,   0.0000000000,   0.0000000000)
     n=     1 T1u IR       weight= 0.99999995E+00
     hbarW= -0.14788702E-06 Ha = -0.40242108E-05 eV; nu= -0.32457453E-01 cm^-1
        1  -0.2040582657 -0.2040582615 -0.2040582515
        2  -0.2040582657 -0.2040582615 -0.2040582515

#### 9.2.6.3. 可視化スクリプト

可視化にはphonon_band_atom_proj.pyを利用します。バンドアンフォールディングの重みを抽出するには --unfolding オプションをつけて実行します。その他描画オプションなどについては 9.2.4 章 を参照してください。

#### 9.2.6.4. 例題

Si結晶 (8原子)

8原子からなるSi結晶のフォノンバンドを2原子のプリミティブセルにアンフォールドする例を紹介します。入力ファイルは `samples/phonon_band/PhononBandUnfolding/Si8` 以下にあります。主な計算条件は下記の通り。

表 9.2 Si 結晶 (8原子) のフォノンバンド計算条件
平面波カットオフ [Ry] | 20
電荷密度カットオフ [Ry] | 80
k 点サンプリング | monk (2×2×2)
バンド数 | 20
交換相関相互作用 | GGAPBE
擬ポテンシャル | Si_ggapbe_paw_nc_01m.pp
初期波動関数 | 無指定
初期電荷密度 | 無指定
スメアリング [eV] | 無指定
SCF 収束条件 [Ha/atom] | 無指定

基本格子 (2原子) セルにアンフォールディングした重みを可視化するために用いたコマンド及び可視化結果を示します。この図においては、水色の半径が大きい点ほど、アンフォールディングの重みが大きいことを意味します。

    phonon_band_atom_proj.py mode.data bandqpt.in --unfolding --plot_style 1 --fig_format png

Si6AlP結晶(8原子)

Si6AlP 結晶 (Si8原子中、2原子をAl及びP原子に置換)のフォノンバンドを2原子のプリミティブセルにアンフォールドする例を紹介します。入力ファイルは `samples/phonon_band/PhononBandUnfolding/Si6AlP` 以下にあります。なお、格子定数はSi 8原子の場合と同じとし、また原子座標はあらかじめ最適化したものを採用しました。その他主要な計算条件は下記の通り。

表 9.3 Si6AlP 結晶 (8原子) のフォノンバンド計算条件
平面波カットオフ [Ry] | 20
電荷密度カットオフ [Ry] | 80
k 点サンプリング | monk (2×2×2)
バンド数 | 20
交換相関相互作用 | GGAPBE
擬ポテンシャル | Si_ggapbe_paw_nc_01m.pp,Al_ggapbe_paw_nc_01m.pp,P_ggapbe_paw_nc_01m.pp
初期波動関数 | 無指定
初期電荷密度 | 無指定
スメアリング [eV] | 無指定
SCF 収束条件 [Ha/atom] | 無指定

bandqpt.inファイルはSi 8原子の場合と同じものを用いました。以下に、基本格子 (2原子) セルにアンフォールディングした重みを可視化するために用いたコマンド及び可視化結果を示します。

    phonon_band_atom_proj.py mode.data bandqpt.in --unfolding --plot_style 1 --fig_format png

### 9.2.7. 使用上の注意

- 一般のk 点における振動解析を実行するためには、スーパーセルに対する振動解析を行う必要があります。したがって、Γ点のみの場合と比較すると非常に多くの計算時間が必要です。

- フォノンバンド計算において最も計算量が多いのがスーパーセルに対する力の計算です。このデータは、1 度得られたら再利用することができます。たとえばフォノンの状態密度を計算したあとにフォノンバンドを計算する場合、または異なる対称線にそったフォノンバンドを計算する場合などは、以下のようにsw_calc_ forceパラメータをoff とすることによって力計算をやり直すことをさけることができます。なお、力計算の結果が保存されているファイルはforce.dataというファイルです。バンド計算と状態密度計算を異なるディレクトリで行う場合にsw_calc_force = offとする場合はこのファイルを当該ディレクトリにコピーして利用してください。

    phonon{
      sw_phonon = on
      sw_calc_force = off
    }

- 通常の計算の場合、入力で指定されたBravais格子はPrimitive 格子に変換されて計算が行われます。ところが、フォノンバンド計算の場合はこの変換は実施されず、Bravais 格子のままスーパーセルが作成され、計算が行われます。k点サンプリングメッシュを検討する際などに注意が必要です。

- スーパーセル構築のパラメータ、l1, l2, l3 はもとの対称性を保つような指定の仕方をしてください。異なる対称性の場合、意味のある計算は行われません。

参考文献

[Parlinski97]

K. Parlinski, Z. Q. Li and Y. Kawazoe, Physical Review Letters vol. 78 pp. 4063 (1997).

[Zheng17]

F. Zheng and P. Zhang, Comput. Phys. Comm. 210, 139 (2017).

## 9.3. 分子動力学法シミュレーション

### 9.3.1. 機能の概要

PHASEは、原子に働く力を利用して分子動力学法シミュレーションを行うことが可能です。 エネルギー一定、温度一定、圧力一定の分子動力学シミュレーションなどが実行できます。

### 9.3.2. 入力パラメータ

分子動力学法シミュレーション機能と関連あるタグの一覧を表に示します。

分子動力学法シミュレーション機能に関連のあるタグの一覧

第1 ブロック識別子 | 第2、第3 ブロック識別子 | タグ識別子 | 説明
--- | --- | --- | ---
structure_evolution |  |  | 原子座標データの更新方法を指定するブロック
|  | method | 原子座標の更新方法を指定する。分子動力学シミュレーションの場合、 velocity_verlet （エネルギー一定の分子動力学シミュレーション） temperature_control （温度一定の分子動力学シミュレーション） pressure_control (エネルギー・圧力一定の分子動力学シミュレーション) temperature_pressure_control (温度・圧力一定の分子動力学シミュレーション)
|  | dt | 時間刻みを指定する。 デフォルト値は100 au (約2.4 fs)
| temperature_control |  | 温度制御の設定を行うブロック。
| method |  | 温度制御の方法を指定する。nose_hooverかvelocity_scalingのいずれか。nose_hooverの場合はNosé-Hoover熱浴による温度制御が、velocity_scalingの場合は温度スケーリングによる温度制御が行われる。デフォルト値はnose_hoover.
| sw_read_velocities |  | 原子の初期速度を、PHASE/0に自動生成させるのではなく手動で入力する場合にこのパラメータをonとします。デフォルト値はoffです。
| set_initial_velocity |  | 原子の初期速度をプログラムが自動的に設定するかどうかを指定するスイッチ。デフォルト値はon
| sw_shift_velocities |  | 全運動量がゼロになるよう、MDステップごとに速度をシフトするかどうかを指定するスイッチです。デフォルト値はoffです。
| thermostat |  | 熱浴の設定を行うブロック。表形式データ。
|  | temp | 温度を指定する。
|  | qmass | 熱浴の質量を指定する。
|  | tdamp | 熱浴の質量を直接指定するのではなく、その周期を時間の単位で指定する。qmassによる指定の方が優先される。なお、qmassもtdampも指定がない場合、tdamp=50×dtに相当する周期の質量がデフォルト値として採用される。
| pressure_control |  | 圧力制御の設定を行うブロック。
| pressure |  | 目的の圧力を指定する。
| mass_baro |  | バーロスタットの質量を指定する。
| m11,m12,m13 m21,m22,m23 m31,m32,m33 |  | 格子の制御に拘束条件を加える。たとえば、m11 = offとすると11成分(a軸・a軸)が変化しなくなる。
structure | atom_list |  |
| atoms |  | 原子配置を指定するブロック。表形式データ。
|  | mobile | 原子が“可動”かどうかを指定する。可動にする場合onを指定する。
|  | thermo_group | 原子に熱浴を割り当てる。定義した順に、整数値で指定する。 デフォルト値は0 (熱浴に割り当てられていない状態)
|  | vx,vy,vz | 原子の初期速度を手動入力する場合(sw_read_velocities=onの場合)に各原子の速度のx,y,z値を原子単位で入力する。入力が省略される場合、0とみなされる。
| element_list |  | 元素情報を指定する。表形式データ。
|  | mass | 対応する元素の質量を指定する。デフォルト値は原子単位であることに注意。

### 9.3.3. 計算結果の出力

座標データはfile_names.dataファイルのF_DYNMによって指定されるファイルに各ステップでの座標値が出力されます。 その形式は、構造最適化の場合と同様です。

- 原子座標

原子座標は、構造緩和を行った場合と同様、file_names.data中のF_DYNM識別子によって指定されるファイル (既定のファイル名はnfdynm.data)に記述されます。入力においてprintoutlevelブロックの下のiprivelocity変数の値を2以上にしていた場合 (分子動力学シミュレーションの場合はデフォルト値)、各原子の速度のデータも出力されます。速度のデータは、力のデータのあとに原子単位で出力されます。

- 各ステップでのエネルギー

各ステップでのエネルギーは、file_names.data中のF_ENF識別子によって指定されるファイル (既定のファイル名はnfefn.data)に出力されます。サンプルによって得られる結果を以下に記します。

    iter_ion、iter_total、etotal、ekina、econst、forcmx
       1      18     -7.8953179624     0.0000042358    -7.8953179624     0.0186964345
       2      30     -7.8953851218     0.0000665502    -7.8953185716     0.0183575424
       3      43     -7.8955768901     0.0002565396    -7.8953203505     0.0173392067
       4      56     -7.8958649874     0.0005418445    -7.8953231430     0.0156398790
       5      69     -7.8962052587     0.0008785990    -7.8953266596     0.0132645441
       6      83     -7.8965425397     0.0012120826    -7.8953304571     0.0102355854
       7      97     -7.8968179539     0.0014840140    -7.8953339398     0.0066063151
       8     111     -7.8969784478     0.0016420281    -7.8953364197     0.0024736141
       9     125     -7.8969875377     0.0016502900    -7.8953372478     0.0020111576
      10     139     -7.8968352058     0.0014992046    -7.8953360011     0.0066379641
      11     153     -7.8965440599     0.0012113794    -7.8953326806     0.0111430822
                              ...............................
                              ...............................
                              ...............................

一列目は原子座標の更新回数、二列目は電子のSCF計算の回数です。三列目は、系の内部エネルギー、 四列目は系の運動エネルギーです。五列目は系の内部エネルギーと運動エネルギーを足した値であり、エネルギー一定の分子動力学シミュレーションにおける保存量です。

### 9.3.4. 使用方法：エネルギー一定の分子動力学シミュレーション

エネルギー一定の分子動力学シミュレーションの入力パラメータ例です。

計算例題は、 `samples/dynamics/molecular_dynamics/NVE` です。

    accuracy{
        cutoff_wf = 20.0 rydberg
        cutoff_cd = 80.0 rydberg
        num_bands = 8
        initial_wavefunctions = atomic_orbitals
        ksampling{
            mesh{
                nx = 4
                ny = 4
                nz = 4
            }
        }
        scf_convergence{
            delta_total_energy = 1e-10 Hartree
            succession = 1
        }
    }
    ...
    ...
    structure{
        unit_cell_type = primitive
        unit_cell{
            a_vector = 0.0000000000        5.1300000000        5.1300000000
            b_vector = 5.1300000000        0.0000000000        5.1300000000
            c_vector = 5.1300000000        5.1300000000        0.0000000000
        }
        atom_list{
            atoms{
                #tag element rx ry rz mobile
                 Si 0.130 0.130 0.130 yes
                 Si -0.130 -0.130 -0.130 yes
            }
        }
        element_list{
            #tag element atomicnumber
             Si 14
        }
    }
    ...
    ...
    structure_evolution{
        method = velocity_verlet
        dt = 100
    }
    ...
    ...

この入力は、シリコン結晶の入力を少し変更したものとなっています。 atomsでは、各原子の“mobile”変数を“yes”と設定しています。ここを“no”あるいは“0”と設定すると、その原子は 分子動力学シミュレーションを行っても動くことはありません。さらに座標値をあえて安定でない値にしています。 具体的には、Si結晶の二つの原子を(111)方向にお互いから離れるように少しだけずらしています。

#### 9.3.4.1. 手法の選択

structure_evolutionブロックでは、“method”変数を“velocity_verlet”としています。この選択によって小正準集合の分子動力学シミュレーションを行うことができます。また、各ステップでの更新量(変数dt)を、原子単位で“100”としてい 上で述べたようにこの値は \(2.418 \times 10^{-15}\) sに相当します。

初期速度の与え方

ここまで説明したサンプルの入力を利用すると、原子の初期速度は全て0と設定されます。 原子に初期速度を与える場合、下記のような入力を準備してください。

    structure_evolution{
        method = velocity_verlet
        dt  = 100
        temperature_control{
            thermostat{
                #tag temp
                     300
            }
        }
    }

ここで、“temp”変数で初期の温度をケルビン単位で設定します。原子の初期速度は、この温度になるように、 かつ正規乱数に従って、全運動量が0になるように設定されます。

原子ごとに異なる初期温度を設定することも可能です。この場合、まず下記のような入力を作成します。

    structure_evolution{
        method = velocity_verlet
        dt  = 100
        temperature_control{
            thermostat{!#tag temp
                             300
                             500
                             700
            }
        }
    }

次にatomsの各原子に、“thermo_group”という変数を設定します。

    structure{
        ...
        atom_list{
            atoms{
            !#tag rx ry rz  element mobile weight  thermo_group
       0.1159672611      0.1235205209      0.1215156388    Si   1   1  1
      -0.1329067626     -0.1264216714     -0.1225370484    Si   1   1  2
       0.1273740089      0.6305999369      0.6247606249    Si   1   1  3
                ...
                ...
            }
        }
        ...
    }

この例では一番目の原子が300Kに、二番目の原子が500Kに、 三番目の原子が700Kになるよう初期速度が設定されます。

#### 9.3.4.2. 計算結果の例

この計算例の計算結果の内部エネルギー、運動エネルギー、全エネルギーを 図 9.22 に示します。

図 9.22 内部エネルギー、運動エネルギー、全エネルギーと時間の関係。

### 9.3.5. 使用方法：温度一定の分子動力学シミュレーション

温度一定の分子動力学シミュレーションの入力パラメータ例です。

計算例題は、 `samples/dynamics/molecular_dynamics/NVT` です。

#### 9.3.5.1. 熱浴の設定

structure_evolutionブロックにtemperature_controlブロックを指定します。

    structure_evolution{
        method = temperature_control
        dt  = 50.0
        temperature_control{
            thermostat{
                #tag temp  qmass tdamp
                     300   5000 10000
            }
        }
    }

上記の入力例では、まず“method”変数をtemperature_controlとしています。この変数によって温度制御を行うように指定します。 ついで、“dt”変数を設定しています。これは、時間刻みの指定です。原子単位で入力します。例で示されている50.0という値は、 約1.2fsに相当します。

さらに、temperature_controlブロックで熱浴の設定を行っています。 “thermostat”ブロックで各熱浴のパラメタを設定します。“temp”パラメタによってその熱浴の目的とする温度(ケルビン単位)、 “qmass”パラメターによって熱浴の質量(原子単位)を設定します。“qmass”パラメータによって質量を直接指定するのではなく、“tdamp”パラメーター（時間の単位）によって熱浴の周期を指定し間接的に熱浴の質量を設定することも可能です。“qmass”と“tdamp”が両方設定されている場合、“qmass”が優先されます。また、いずれの指定もない場合50×dtの周期が実現するように熱浴の質量が設定されます。

#### 9.3.5.2. 熱浴の割り当て

structure ブロックの、atoms ブロックを設定する必要があります。設定例を以下に記します。

    structure{
         ...
        atom_list{
            num_atoms = 8
            cooordinate_system = internal
            atoms{
            !#tag rx ry rz  element mobile weight  thermo_group
       0.1159672611      0.1235205209      0.1215156388    Si   1   1  1
      -0.1329067626     -0.1264216714     -0.1225370484    Si   1   1  1
       0.1273740089      0.6305999369      0.6247606249    Si   1   1  1
      -0.1152089939     -0.6164829779     -0.6221565128    Si   1   1  1
       0.6299472943      0.1341313888      0.6253193197    Si   1   1  1
      -0.6305720382     -0.1290073650     -0.6187967685    Si   1   1  1
       0.6151271805      0.6206113965      0.1333834419    Si   1   1  1
      -0.6276524003     -0.6268549639     -0.1175099372    Si   1   1  1
            }
        }
        ...
    }

各原子に“thermo_group”パラメータを割り振っています。このパラメータに 熱浴の識別番号を設定します。なお、熱浴の識別番号は熱浴の定義順に割り振られます。また、他の属性値と同様、“#default” タグを利用することによってデフォルト値を設定することも可能です。ここの例では全ての原子に同じthermo_groupを設定していますが、 各原子が異なる熱浴に関連付けられていても問題ありません。

#### 9.3.5.3. 熱浴の“段数”の設定 (バージョン2019.01以降)

通常の熱浴をさらに熱浴で制御する、という計算手法がNosé-Hoover chain法です [Glenn92] 何段にもわたって再帰的に適用することも可能となっています。Nosé-Hoover chain法を用いることによって、より少ないステップ数で熱浴が平衡状態に至ることなどが期待できます。利用するためには、以下のようにtemperature_controlブロックにおいてnum_chain変数を使います。

    structure_evolution{
        method = temperature_control
        dt  = 50.0
        temperature_control{
          num_chain = 5
          thermostat{
              #tag temp  qmass tdamp
                   300   5000 10000
          }
        }
    }

理論的には各段数における熱浴の質量を別途設定することも可能ですが、最初の熱浴の質量以外結果にほとんど影響を与えないため、のこりの熱浴の質量としてはPHASE/0が最初の熱浴の質量から自動的に算出した値が採用されるようになっています。

num_chainのデフォルト値は1, すなわち通常のNosé-Hoover法です。

#### 9.3.5.4. “温度プロファイル”の設定 (バージョン2019.01以降)

シミュレーションの進行とともに入力パラメーターファイルの指定に応じてターゲット温度を変化させる分子動力学シミュレーションを行うことができます。変化のさせ方を“温度プロファイル”と呼びます。温度プロファイル機能を利用するためには、まずtemperature_controlブロックにおいてsw_temperature_profile = onとします。さらに、thermostatブロックにおいて温度プロファイルの設定を行います。温度プロファイル機能を利用していない場合thermostatブロックにおいて定義するテーブルの行は一つの熱浴を表しますが、利用している場合はテーブルの行は一つのプロファイルを表すことに注意が必要です。温度プロファイル機能を利用している場合にさらに複数の熱浴を定義するためには、属性値no (id, thermo_groupも可)によって切り分けます。具体的には、たとえば下記に示すようになります。

    structure_evolution{
      ...
      ...
      temperature_control{
        sw_temperature_profile = on
        thermostat{
          #tag no tempi tempf till_n tdamp
              1 8000 8000 3000 5000
              1 8000 300 7000 5000
              2 400 500 1000 5000
        }
      }
    }

上述のように属性値noによって熱浴を指定します。tempi, tempfはそれぞれ初期温度および終温度に対応する属性値です。till_nは、この温度プロファイルが適用されるステップ数です。属性値tdampによって熱浴の緩和時間を指定します。tdampのかわりに属性値qmassを使って熱浴の質量を直接指定することも可能です。以上より、この例ではthermostatテーブルの各行は次のように解釈されます。

- 1行目：1つ目の熱浴の温度を8000Kで3000ステップ適用する。

- 2行目：1つ目の熱浴の温度を8000Kから300Kまで7000ステップかけて降温する (プロファイル終了時点で総MDステップ数10000)。以降は300Kのまま進行する。

- 3行目：2つ目の熱浴の温度を400Kから500Kまで1000ステップかけて昇温する。以降は500Kのまま進行する。

なお、最後のプロファイルのtill_n以降は、そのプロファイルのtempfの温度が使い続けられる仕様になっています。

#### 9.3.5.5. ランジュバン熱浴の設定(バージョン2021.02以降)

ランジュバン熱浴の運動方程式は次の様に定義することができます。

(9.11)\[\begin{split}\dot{r}_i = p_i/m_i \\ \dot{p}_i = F_i - \gamma_i p_i + \sqrt{\frac{2m_i\gamma_ik_B T}{\Delta t}} R\left(t\right) \\ \left< R\left(t\right) \right> = 0, \left< R\left(t\right) R\left(t^\prime \right)\right> = \delta \left(t-t^\prime \right)\end{split}\]

\(\gamma_i\) は時間の逆数の単位を持つ量で、摩擦係数のような役割を果たします。これは、能勢フーバー熱浴の緩和時間（もしくは質量）に対応するものであり、デフォルト値が設定されていますが入力パラメーターファイルを通じて指定することもできます。\(R\left(t\right)\) はランダム力であり、原子に加えることによって最終的には所定の温度へ至るように動作します。 \(\left<R\left(r\right)\right>\) は分散1, 中心0の正規乱数によって評価します。

ランジュバン熱浴を利用するには、たとえば以下のように設定します。

    structure_evolution{
      method = velocity_verlet
      temperature_control{
        method = langevin
        thermostat{
          #tag temp tdamp
                   300   5000
        }
      }
    }

structure_evolutionにおいてmethodをvelocity_verletとし、temperature_controlブロックのmethodをlangevinに設定するとランジュバン熱浴を利用することができます。ランジュバン熱浴の摩擦係数 \(\gamma_i\) はこれまでの熱浴の緩和時間指定と同じ方法で行います。すなわち、緩和時間を直接もしくは熱浴の質量を通じて間接的に指定します。 熱浴に属する原子の指定方法などはこれまでの方法と同様です。

ランジュバン熱浴は統計力学を直接適用するような熱浴であり、能勢フーバー法と比較して統計力学的により尤もらしい集団の計算が実現できる場合があります。 例として、ダイヤモンドの結晶を用いてランジュバン熱浴と能勢フーバー熱浴双方で計算を行い、結果を比較してみました。

用いた系はダイアモンド64原子の系です。カットオフエネルギーは25 Rydberg, \(\textbf{k}\) 点サンプリングは \(\Gamma\) 点のみとしました。時間刻みは1 fsとし、緩和時間としてはデフォルト値(時間刻みの50倍)を採用しました。合計1万ステップの分子動力学シミュレーションを実施しました。

図 9.23 にシミュレーションの結果得られた運動エネルギーの履歴を示しました。この図から明らかなように、ランジュバン熱浴によるシミュレーションではターゲット温度に相当する運動エネルギー（図中の黒い水平線）に はやい段階で達しています。また、能勢フーバー熱浴の結果と比較すると運動エネルギーの振幅も小さい傾向です。結晶の計算の場合ランダムな作用による減衰が少ないため決定論的な能勢フーバー熱浴を用いると人工的な振動が減衰しにくい傾向がありますが、 ランジュバン熱浴の場合はそもそもがランダム力を付与しているため、「ランダムな作用による減衰」が発生しやすい影響が現れた結果と考えられます。

図 9.23 運動エネルギーの履歴。赤：ランジュバン熱浴、緑：能勢フーバー熱浴。

図 9.24 には運動エネルギーの分布を示します。カノニカルアンサンブルの場合、運動エネルギーはマクスウェルボルツマン分布に従うはずです。運動エネルギーのマクスウェルボルツマン分布は以下のように記述することができます。

(9.12)\[f\left(K\right) = \frac{2}{\pi} \frac{1}{\left(k_B T \right)^\frac{3}{2}} \sqrt{K} \exp{\left(-\frac{K}{k_B T}\right)}\]

比較のため、 (9.12) 式の分布も 図 9.24 にプロットしました。一見して明らかなように、ランジュバン熱浴の方がマクスウェルボルツマン分布によく従う分布となっています。 これもやはりランダム力を取り入れているがゆえのモードの減衰が要因と考えられます。

図 9.24 運動エネルギー分布。赤丸：ランジュバン熱浴、緑丸：能勢フーバー熱浴、黒線：マクスウェルボルツマン分布

### 9.3.6. 使用方法：温度・圧力一定の分子動力学シミュレーション

PHASE/0は、 [Souza97] , [Hernandez01] などの文献において解説されている手法によって圧力一定の分子動力学シミュレーションを行うことができます。

#### 9.3.6.1. 入力パラメーターファイルの書き方

まず、温度一定の分子動力学シミュレーションと同様の手続きで入力パラメーターファイルを作成します。通常の温度一定の場合との違いは、圧力も一定であること、また圧力浴の設定が必要なことの2点です。以下に例を示します。

    structure_evolution{
      method = temperature_pressure_control
      dt = 50.0
      temperature_control{
        num_thermostat = 1
        set_initial_velocity = on
        !!method = velocity_scaling
        thermostat{
          #tag temp qmass
                300 4000
        }
      }
      pressure_control{
        pressure = 0.0
        mass_baro = 1
        m11 = on
        m22 = on
        m33 = on
        m12 = on
        m13 = on
        m23 = on
        barostat{
          #units gpa
          #tag till_n pressi pressf
          10000 0 2
        }
      }
    }

設定方法の詳細は、下記の通り。

- MD手法の選び方: methodにtemperature_pressure_controlもしくはpressure_temperature_controlを指定すると温度－圧力一定の分子動力学シミュレーション、すなわちNPT分子動力学シミュレーションを実行することができます。pressure_controlとすると圧力一定の分子動力学シミュレーション、すなわちNPH分子動力学シミュレーションを実行することができます。

- 温度制御の設定: 温度制御は、NVTの場合と同様temperature_controlブロックにおいて行います。ただし、NVTシミュレーションでは複数の熱浴を定義することが可能であるのに対し、NPTシミュレーションの場合に定義できる熱浴は一つのみである点に注意してください。また、method = velocity_scalingと指定することによって速度スケーリングによる温度制御を、method = langevinと指定することによってランジュバン熱浴を利用することもできます。指定がなければNosé-Poincaré熱浴が採用されます。

- 圧力制御の設定:圧力制御は、pressure_controlブロックを作成し、その下で設定します。pressureに目的の圧力を指定します。圧力の単位のデフォルト値は原子単位ですが、GPaなどを利用することもできます。mass_baroには熱浴の質量を指定します。デフォルト値は1であり、単位の指定はできません。目安としては、熱浴の周期（単位胞の体積変化の周期）が100 MDステップ相当程度の時間になるように決めるとよいでしょう。

- pressure_controlブロックの下のmethodによって圧力制御の方法を選択することができます。method = volumeとすると単位胞の体積のみが変化し、セルベクトル間の角度は不変になります。method = lattice_vectorとするとセルベクトルを直接制御するようになります。method = metric_tensorとすると「計量テンソル」を介して単位胞を制御します。デフォルト値はmetric_tensorです。

- pressure_controlブロックの下にbarostatブロックを作成し、「圧力プロファイル」の設定を行うことができます。上述の例では10000ステップかけてターゲット圧力が0 GPaから2 GPaに変化します。このブロックがない場合「圧力プロファイル」は有効になりません。

- 計量テンソルに対する拘束条件の設定 : mxyパラメーターによって、計量テンソルの変化に対して拘束条件を課すことができます。たとえばm11 = offとすると11成分(a軸・a軸)が変化しなくなり、m12 = offならば12成分(a軸・b軸)および21成分(b軸・a軸)が変化しなくなります。このパラメーターのデフォルト値はすべてonなので、特に指定がなければ計量テンソルのすべての成分が変化します。

#### 9.3.6.2. 計算結果

NPTシミュレーション結果で得られる主な出力ファイルは、エネルギーなどの履歴を記録したnfefn.dataファイル、座標データの履歴を記録したnfdynm.dataファイル、計量テンソルの履歴を記録したnfmetric.dataファイル、そして格子定数の履歴を記録したnflatconst.dataファイルである。それぞれについて説明する。

nfefn.dataファイル

エネルギーなどの履歴を記録したファイルであり、構造最適化やNVTのMDシミュレーションの場合も得られます。NPTシミュレーションの場合、以下のような出力が得られます。

    iter_ion, iter_total, etotal, ekina, econst, pressure
     1  13 -31.8045273788 300.0000000000 0.0000000000 0.0209863336 -0.0000504658
     2  25 -31.8045248143 301.4440100456 0.0000586853 0.0211839341 -0.0000573770
     3  37 -31.8043935680 299.1271868912 0.0001085792 0.0214781523 -0.0000574428
     4  49 -31.8041402859 293.2700519011 0.0001476826 0.0218951630 -0.0000570036
     5  61 -31.8037768714 284.3267516440 0.0001733906 0.0224437768 -0.0000560637
     6  73 -31.8033194235 272.9264725662 0.0001832795 0.0231125156 -0.0000546420
     7  85 -31.8027870051 259.8057152864 0.0001752150 0.0238698884 -0.0000527691
     8  97 -31.8022003504 245.7426304561 0.0001475268 0.0246685850 -0.0000504870
     9 109 -31.8015806171 231.5028071591 0.0000992076 0.0270606007 -0.0000478460
    10 121 -31.8008921515 217.8018629938 0.0000862100 0.0294678421 -0.0000449028
    11 133 -31.8002640917 205.3149756742 0.0000004873 0.0315593847 -0.0000420615
    ...
    ...

一行が1タイムステップのデータに相当します。1列目が原子（単位胞）の更新回数、2列目がSCF計算の総更新回数、3列目が系のエネルギー（原子単位）、4列目が瞬間的な温度（ケルビン単位）、5列目がハミルトニアン（原子単位）、6列目が原子に働く力の最大値（原子単位）、7列目が瞬間的な圧力です（すべて原子単位）。ハミルトニアンは理想的には保存するはずですが、第一原理計算においてエネルギーに対する歪みテンソルの厳密な微分を求めることは困難なため、保存がよくない傾向にある点に注意してください。

nfdynm.dataファイル

基本的なファイルフォーマットは、通常のnfdynm.dataファイルと同じです。ただし、NPTシミュレーションの場合毎ステップ格子定数が変化するので、格子定数などが記述されるヘッダー部が毎ステップ書き込まれる点に違いがあります。

nfmetric.dataファイル

各ステップにおける計量テンソルが記録されるファイルです。典型的な内容は下記の通り。

    2
    105.8775163849 0.0064685429 -0.0017420207
    0.0064685429 105.8774556260 0.0027757249
    -0.0017420207 0.0027757249 105.8776712432
    3
    105.8648537936 0.0196786348 -0.0055233812
    0.0196786348 105.8644796107 0.0091955626
    -0.0055233812 0.0091955626 105.8652454083
    4
    105.8462013539 0.0389223098 -0.0123434716
    0.0389223098 105.8452005929 0.0190717120
    -0.0123434716 0.0190717120 105.8468474757

まずステップ数を表わす整数値が記録され、ついで3×3のテンソルが記録されます。なお、半ステップずれた数値解法を採用しているため、記録は2ステップ目からとなります。

nflatconst.dataファイル

各ステップにおける格子定数が記録されるファイルです。典型的な内容は下記の通り。なお、紙幅の都合で1行を改行して表示している

    2 10.2896800915 10.2896771391 10.2896876164 89.9984979129 90.0009426965 89.9964995371 1089.4462540511
    3 10.2890647677 10.2890465841 10.2890837983 89.9950232125 90.0029893382 89.9893495841 1089.2504025643
    4 10.2881583072 10.2881096705 10.2881897084 89.9896762432 90.0066816443 89.9789308011 1088.9605527024
    5 10.2869678503 10.2868710406 10.2870094050 89.9825817981 90.0125180935 89.9656805224 1088.5783846407
    6 10.2855038285 10.2853392827 10.2855504459 89.9738915620 90.0209385359 89.9500901373 1088.1067192172
    7 10.2837804786 10.2835276570 10.2838245727 89.9637869404 90.0323061920 89.9327006608 1087.5497224800
    8 10.2818163114 10.2814547573 10.2818483397 89.9524812878 90.0468878988 89.9140944258 1086.9130916478
    9 10.2796344063 10.2791449593 10.2796435437 89.9402204612 90.0648344761 89.8948814720 1086.2041781879

一行が1タイムステップのデータに相当します。1列目は単位胞の更新回数、2列目から7列目がそれぞれ格子定数, 最後の8列目が単位胞の体積です。長さの単位はBohr単位、角度の単位は度、体積の単位はBohr3です。

### 9.3.7. 分子動力学シミュレーションにまつわるその他の設定

#### 9.3.7.1. 速度スケーリングによる温度制御の分子動力学シミュレーション

Nosé-Hooverの熱浴ではなく、原子の速度を温度が合うようにスケールし直すことによって温度を制御することも可能です。このような計算は、temperature_controlブロックの下のmethod変数をvelocity_scalingとすることによって実現することができます。

    structure_evolution{
      ...
      temperature_control{
        method = velocity_scaling
        ...
      }
    }

速度は、目的の温度に合うよう毎MDステップスケールされます。

#### 9.3.7.2. 全運動量がゼロになるよう速度をシフトする方法

分子動力学シミュレーションにおいて理論上全運動量は保存します（ゼロになる）が、実際は数値誤差によりゼロとはならず、系全体が並進してしまう場合があります。これを防ぐには、以下のように変数sw_shift_velocitiesの値をonとし、MD計算中全運動量がゼロとなるようにします。

    structure_evolution{
      ...
      temperature_control{
        ...
        sw_shift_velocities = on
      }
    }

#### 9.3.7.3. 原子の初期速度を手動で指定する方法

原子の初期速度は通常ランダムな正規分布が得られ、対応する温度が設定した温度で、全運動量が0になるように自動的に決定されますが、手動で各原子に割り振ることも可能です。このような指定は、原子配置のvx, vy, vz属性値によって行います。また、設定した速度を上書きしてしまわないようtemperature_controlブロックの下においてsw_read_velocities = onを設定する必要があります。たとえば、以下のように設定します。

    structure{
         ...
        atom_list{
            atoms{
            !#tag rx ry rz  element mobile thermo_group vx vy vz
                0.11    0.12    0.11    Si   1 1 0.001 0.0014 0.0008
               -0.13   -0.13   -0.14    Si   1 1 -0.001 -0.002 0.0001
                0.12    0.63    0.62    Si   1 1 0.0003 -0.0005 -0.00028
                ...
                ...
            }
        }
        ...
    }
    ...
    structure_evolution{
      ...
      temperature_control{
        sw_read_velocities = on
      }
    }

なお、速度の単位のデフォルト値は原子単位です。

また、この方法で初期速度を指定した場合でも、デフォルトの設定では温度に合うよう、また全運動量が0になるよう速度はシフト・スケールされます。この動作を抑制したい場合、以下の要領で変数set_initial_velocityの値をoffとします。

    structure_evolution{
      ...
      temperature_control{
        sw_read_velocities = on
        set_initial_velocity = off
      }
    }

#### 9.3.7.4. 原子を領域に閉じ込める方法 (バージョン2019.01以降)

矩形領域および円筒領域に閉じ込めることができます。このような計算機能は、狭い領域に閉じ込められた系の振る舞いを調べたり、ESM法やdipole補正法などアルゴリズムの都合上真空層が必須である機能において真空層に原子が入ってこられなくする目的で利用することができます。

入力の記述

領域は、structureブロックのregionxブロックにおいて定義することができます。ここでxは領域の識別番号です。

    structure
      region1{
        region_group = 1
        type = cylinder
        radius = 3.5 angstrom !半径
        cylx = 5 angstrom
        cyly = 5 angstrom ! 円筒の中心位置
        orientation = 3 ! 円筒の向き
        cylzmin = -1000 ! 円筒の下端
        cylzmax = 1000 ! 円筒の上端
        sw_tally = on ! エネルギーを加える
        epsilon = 0.001 !ポテンシャルの深さ
        sigma = 1.5 !距離のスケール
      }
    }

xは1から始まります。xを2, 3, …とすることによって任意の数の領域を定義することができます。regionxブロックにおいて以下の変数を設定することによって領域を定義します。

変数名 | 説明
--- | ---
region_group | “領域のグループ”を整数で指定します。この値が同じ領域はひとかたまりの“グループ”として扱われます。後述の原子配置テーブルの属性値region_groupにこの数値を指定することによって領域グループと原子を紐づけます。デフォルト値はregionxブロックのxの値です。
type | 領域の種類を指定します。 cylinder (円筒型)もしくはbox (直方体型)とします。デフォルト値はboxです。
radius | 円筒の半径を指定します。デフォルト値は6.5bohrです。type=cylinderの場合のみ意味のある設定です。
cylx | 円筒の中心位置のx座標を指定します。デフォルト値はセルの境界です。type=cylinderの場合のみ意味のある設定です。
cyly | 円筒の中心位置のy座標を指定します。デフォルト値はセルの境界です。type=cylinderの場合のみ意味のある設定です。
orientation | 円筒の向きを指定します。1の場合x方向、2の場合y 方向、3の場合z方向に向きます。デフォルト値は3です。type=cylinderの場合のみ意味のある設定です。
cylzmin | 円筒の長さ方向の下限を指定します。デフォルト値は－10 10です。type=cylinderの場合のみ意味のある設定です。
cylzmax | 円筒の長さ方向の上限を指定します。デフォルト値は10 10です。type=cylinderの場合のみ意味のある設定です。
xmin | 直方体のx 方向の下限値を指定します。デフォルト値は－10 10です。type=boxの場合のみ意味のある設定です。
xmax | 直方体のx方向の上限値を指定します。 デフォルト値は10 10です。type=boxの場合のみ意味のある設定です。
ymin | 直方体のy 方向の下限値を指定します。デフォルト値は－1010です。type=boxの場合のみ意味のある設定です。
ymax | 直方体のy方向の上限値を指定します。デフォルト値は1010です。type=boxの場合のみ意味のある設定です。
zmin | 直方体のz 方向の下限値を指定します。 デフォルト値は－1010です。type=boxの場合のみ意味のある設定です。
zmax | 直方体のz方向の上限値を指定します。 デフォルト値は1010です。type=boxの場合のみ意味のある設定です。
sw_tally | 領域に起因するエネルギーを全エネルギーに加える場合この値をonに設定します。
epsilon | ポテンシャル\(\varepsilon\left( \frac{ \sigma}{r} \right)^{12}\)の\(\varepsilon\)の 値をエネルギーの単位で指定します。デフォルト値は1e-3 hartreeです。
sigma | ポテンシャル\(\varepsilon \left( \frac{\sigma}{r} \right)^{12}\)の \(\sigma\) の値を長さの単位で指定します。 デフォルト値は1 bohrです。

定義した領域は、そのregion_idを紐づけたい原子のregion_idに指定することによって割り当てることができます。たとえば、以下のように設定します。

    structure{
      …
      atom_list{
        coordinate_system = cartesian
        atoms{
          #default mobile=on,thermo_group=1
          #units angstrom
          #tag element rx ry rz region_group
                H 4.231707 4.904619 6.374683 1
                H 5.716594 4.994127 6.011627 1
                O 5.118193 4.883964 6.766158 1
                H 4.167342 5.876768 8.210465 2
                H 5.481543 5.259672 8.697061 2
                O 4.627457 5.590603 9.014168 2
                …
                …
        }
      }
    }

この例では、1番目、2番目、3番目の原子はregion_group=1のすべての領域に紐づけられ、4番目、5番目、6番目の原子はregion_group=2のすべての領域に紐づけられます。

計算の実行

計算は、通常の分子動力学シミュレーションと同じように実行することができます。入力パラメーターファイルが読み込まれると以下のように読み込んだ領域の情報が報告されます。

    !** region statistics
    !** num_regions = 1
    !** status for region no 1
    !** region type : CYLINDER
    !** orientation : 3 (1->x, 2->y, 3->z)
    !** radius : 6.6140409725
    !** cylx,cyly : 9.4486299607 9.4486299607
    !*cylzmin,cylzmax: -1.797693134862316E+308 1.797693134862316E+308
    !** sigma, epsilon : 1.0000000000 0.0010000000
    !** tally : F
    !** n target atoms : 36
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    21 22 23 24 25 26 27 28 29 30 31 32 33 37 38 39

特に、n target atoms以降領域に割り当てられている原子のリストが出力されるので、想定通り領域が設定できているかどうかを確認することができます。

#### 9.3.7.5. 水素との結合を凍結する方法 (バージョン2022.01以降)

水素（H）原子は非常に軽量なため、MD 計算を実行する際に大きく動いて計算が破綻してしまうことがありますが、H 原子そのものが結合を切断・再結合するような反応でない限りは、H 原子と結合している原子との距離を固定しても問題ないケースは多いと考えられます。そこで、H原子と他の原子(X)との距離H-Xを固定して計算することができるようになっています。

結合固定機能を利用するためには、 `structure` ブロックの下に `fix_bond` ブロックを作成し、設定を施します。

    structure{
      fix_bond{
        sw_fix_bond = on
      }
    }

`fix_bond` ブロックにおいては以下のような設定を施すことができます。

変数名 | 説明
target_element | 結合とみなす対象の元素名を指定します。デフォルト値はH
target_elementn | 結合とみなす対象のn番目の元素名を指定します。デフォルト値はなく、この指定がない場合はtarget_elementで指定した元素が用いられます。
bond_factor | 2原子が結合しているかどうかを判定するためのファクターです。2つの原子が(原子1の共有結合半径+原子2の共有結合半径)*bond_factor 以内の距離にある場合結合しているとみなされます。デフォルト値は1.2.
max_iter_fix_bond | SHAKE法、RATTLE法の繰り返し計算回数の上限値です。デフォルト値は1000.
thres_fix_bond | SHAKE法、RATTLE法の収束判定条件。デフォルト値は1.e-10.

計算を実行すると、検出した結合が以下の要領でログファイルに出力されます。意図した通りの結合が見つかっているかどうか確認することが推奨されます。

    !** number of bonds to be fixed during MD      48
    !** bond no        1 assc. atoms        2       1 bond length    2.05521
    !** bond no        2 assc. atoms        4       3 bond length    2.05523
    !** bond no        3 assc. atoms        6       5 bond length    2.05522
    !** bond no        4 assc. atoms        8       7 bond length    2.05521
    ...
    ...

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

- 分子動力学シミュレーション機能に特別な制約はありません。ウルトラソフトおよびPAW擬ポテンシャル、並列計算、継続計算に対応しています。 ただし、分子動力学シミュレーションにおいては原子の位置は熱揺らぎによって激しく振動するので、系が厳密な意味での対称性を持つことはありません。したがって、対称性関連の設定は施さないでください。

- 原子の質量は、通常の構造最適化においては直接系の性質を左右するものではありませんが、分子動力学シミュレーションの場合は意味のある量です。したがって、本機能を利用する場合は元素の正しい質量を指定する必要があります。PHASEにおける標準の質量の単位は、原子単位です。たとえば、陽子の質量は原子単位で1822.877333 です。

- 運動エネルギーはハートリー単位で記述されますが、 運動エネルギーと温度との間には\(E_{\text{kin}} = \frac{3}{2} \times N_{\text{atom}} \times k_{B}T\) という関係があります。ここで運動エネルギーを\(E_{\text{kin}}\)、原子数を\(N_{\text{atom}}\)、ボルツマン定数を\(k_{B}\)、 瞬間的な温度を\(T\)と記述しました。従って運動エネルギーから系の温度を知りたい場合、まず運動エネルギーを原子数で割り、 \(3.1578 \times 10^{5}\)という値を掛けて(ハートリー単位から\(k_{B}T\)単位への変換)、さらに\(\frac{3}{2}\)で割って下さい。

- 原子座標の更新回数は入力で指定した時間刻みの値(structure_evolutionブロック内のdtという変数で指定)を掛けること によって実時間での経過が分かります。時間の単位は入力で指定することが可能ですが、原子単位系を利用した場合(デフォルト) \(2.41888 \times 10^{- 17}\)という値を掛ければ「秒」に変換することが可能です。たとえば100 a.u.という時間は2.41888 fsに相当します。

- 温度一定の分子動力学シミュレーションにおける、熱浴の質量\(Q\)の値について注意点を挙げます。 小さすぎる\(Q\)を採用すると、系のダイナミックスに熱浴に起因する 人為的なモードが生じてしまい、また場合によっては計算が破綻してしまいます。他方大きすぎる\(Q\)を採用すると、系が熱平衡に達するのに 多くのステップ数を必要とするようになってしまいます。

  \(Q\)の値は、系の特徴的な振動の周期と熱浴の振動の周期がおおよそ同等か、熱浴の方が長くなるように選ぶとよいとされています。 熱浴の振動の周期と系の振動の周期の間の関係は、大雑把には次の式で評価できます [Nose91]

  \(\tau = \frac{2\pi}{\omega} = 2\pi\left( \frac{Q}{2gk_{B}T} \right)^{1/2}\)

  ここで\(\tau 、\omega\)はそれぞれ系の周期と周波数、\(g\)は系の自由度(3\(\times\)その熱浴に関連付けられている原子の数)、\(k_{B}\)は ボルツマン定数、\(T\)がその熱浴の温度です。例えば、\(\tau\)を0.05 ps、原子の数を8、温度を300 Kとして上式で\(Q\)の値を見積もると、原子単位でおおよそ4600程度となります。PHASE/0では、\(Q\)の値を直接指定することも、周期を介して間接的に指定することも可能となっています。質量の指定も周期の指定もない場合、周期が時間きざみdtのおおよそ50倍となる\(Q\)の値が採用されます。

参考文献

[Glenn92]

Glenn J. Martyna and Michael L. Klein, and Mark Tuckerman, “Nosé-Hoover chains: The canonical ensemble via continuous dynamics”, Journal of Chemical Physics 97 15 (1992).

[Souza97]

Ivo Souza and JoséLuís Martins, Phys. Rev. B 55 (1997) pp 8733-8742.

[Hernandez01]

E. Hernández, Journal of Chemical Physics, 115 (2001) pp. 10282-10290.

[Nose91]

S. Nosé, Progress of Theoretical Physics Supplement No 103、1991、pp.1-46.

## 9.4. NEB 法

### 9.4.1. 機能の概要

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

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

- NEB法

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

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

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

(9.14)\[{\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}\)は接線方向の単位ベクトルであり、次のように計算します。

(9.15)\[\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|}.\]

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

(9.16)\[\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}.\]

- Climbing-image (CI) NEB法

Climbing-image 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)\]
(9.17)\[= {\overrightarrow{F}}_{i,\max}|_{\bot} - {\overrightarrow{F}}_{i,\max}|_{\parallel}\]

通常のNEB法では遷移状態を正確に見つけることができないのに対し、CI-NEB法は最もエネルギーの高いイメージが収束判定の範囲内で遷移状態にあることに特長があります。

- バネ定数の計算方法

最少遷移エネルギーを求める反応経路計算においては、鞍点付近の計算精度を高くすることが好ましいと考えられます。このことから、鞍点付近でイメージの密度を高くし、接線の傾きを高い精度で求める必要があります。特に、反応経路全体と比較してポテンシャル障壁の領域が極めて狭い場合には、ポテンシャル障壁近傍のイメージ密度を高くすることにより高精度の計算を効率よく行うことが可能となります。 最少エネルギー経路において鞍点付近にイメージを密に分布させる方法として、鞍点付近のバネ定数\(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),\]
(9.18)\[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}}\)の値の設定によって、反応経路における始状態付近と終状態付近のイメージ密度が等しくなります。

- バネの垂直成分

連続するレプリカがなす角度が大きいと計算が安定しない場合があります。このような場合にバネによる作用力の垂直成分を少し加えることによって安定した計算が行えるようになります。この場合、以下の要領で3つのレプリカが成す角度によるペナルティ関数によって垂直成分を加えます。

(9.19)\[{\overrightarrow{F}}_{i} = {\overrightarrow{F}}_{i}^0 + f\left( \phi \right) \left( {\overrightarrow{F}}_{i}^{s} - {\overrightarrow{F_{i}^{s}}} \cdot \widehat{\tau} \widehat{\tau} \right)\]
(9.20)\[f\left( \phi \right) = \frac{1}{2} \left( 1 + \cos{\left( \pi \left( \cos{\phi} \right) \right)} \right)\]

ここで \({\overrightarrow{F}}_{i}^0\) がもとのNEB力、 \(\phi\) が3つのレプリカが成す角度です。ペナルティ関数は角度が90°の場合に1, 0°の場合は0になります。

### 9.4.2. 入力パラメータ

#### 9.4.2.1. 概要

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

表 9.4 NEBに関連する入力データ
第1ブロック | 第 2第3ブロック | タグ識別子 | 説明
--- | --- | --- | ---
Control |  |  |
|  | condition | 新規計算か継続計算かを指定initial (新規計算)もしくはcontinuation (継続計算) 通常の計算と違い、automaticは利用不可
|  | multiple_replica_mode | NEB計算の実行 ON,OFF
|  | multiple_replica_max_iteration | NEB iteration数
multiple_replica |  |  |
|  | method | 反応経路計算手法 nudged_elastic_band_method
| accuracy |  |
|  | dt | NEB計算における原子座標更新の\(\Delta t\)
|  | neb_time_integral | 時間積分法 quench, steepest_descent,cg, fireから選択できる(cg,fireはバージョン2020.01以降) デフォルト値は、2019.02以前はsteepest_descent, 2020.01以降はfire.
|  | penalty_function | ペナルティ関数 (9.20) ON,OFF
|  | neb_convergence_condition | NEB収束判定法(後述)
|  | neb_convergence_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用の収束判定の設定を行う

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

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

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

#### 9.4.2.2. NEB機能を有効にする

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

    control{
      multiple_replica_mode = on
    }

#### 9.4.2.3. 収束判定

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

    multiple_replica{
      accuracy{
        neb_convergence_condition = delta_e
      }
    }

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

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

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

neb_convergence_conditionのデフォルト値は 4 (force_at_transition_state) です。

#### 9.4.2.4. 結晶の対称性指定について

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

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

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

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

    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ブロックにおける指定と同じように指定します。

#### 9.4.2.6. 両端のレプリカの指定：両端のレプリカの原子座標をファイルから指定する方法 (バージョン2020.01以降)

まず、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ファイルを指定します。この例ではend0ディレクトリーの下のnfdynm.dataファイルが始状態、end1ディレクトリーの下のnfdynm.dataファイルが終状態に対応します。

#### 9.4.2.7. 両端のレプリカの指定：両端のレプリカの原子座標をファイルから指定する方法 (2019.02以前)

両端のイメージの原子座標をファイルで指定する場合は、入力データの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

#### 9.4.2.8. 中間レプリカの指定：中間レプリカの原子座標を両端の原子座標の線形補間で指定する方法(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
        }
      }
    }

これがデフォルトの振る舞いなので、すべての中間レプリカを線形補間で作成する場合replicasブロックは不要です。

#### 9.4.2.9. 中間レプリカの指定：中間レプリカの原子座標をファイルから指定する方法(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)  = '../end0/nfdynm.data'
    F_IMAGE(-1) = '../end1/nfdynm.data'
    F_IMAGE(1)  = './image1.data'
    F_IMAGE(2)  = './image2.data'
    F_IMAGE(3)  = './image3.data'
    /

原子座標データを指定するファイルの書式は 両端のレプリカの指定：両端のレプリカの原子座標をファイルから指定する方法 (2019.02以前) の形式と同じです。

#### 9.4.2.10. NEB関連ファイルの指定

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

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

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

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

表 9.5 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 | 原子座標出力ファイル

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

NEB法は、2020.01以降のバージョンにおいて入力形式の簡略化と機能拡張がほどこされています（バージョン2019.02以前の指定方法も一部をのぞき利用できます）。具体的には以下の通り。

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

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

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

- nfdynm.dataファイルからの座標値の読み込み：始状態・終状態をnfdynm.dataファイルから読み込めるようになりました（これに伴い、旧型式の座標データは廃止されました）ただしこの方法を用いる場合始状態・終状態両方とも適用されます。いずれかのみを選択的に従来の方法で指定することはできません。またnfdynm.dataファイルの座標履歴を反応座標に見立てて読み込むこともできるようになっています。

- 必須設定の削減：2019.02以前のバージョンにおいては、原子配置を三カ所で定義する必要がありました。2020.01以降のバージョンにおいては、始状態・終状態の原子座標のデフォルト値は通常の座標指定のそれになっています。そのため、通常の原子配置指定は始状態があらわに指定されているならば終状態に、終状態があらわに指定されているならば始状態に対応するようになっています（ただしnfdynm.dataファイルから読み込む場合は始状態・終状態いずれもnfdynm.dataファイルから読み込まれるため、その限りではありません）また、以前のバージョンでは初期中間レプリカの作成方法の指定は必須設定でしたが、2020.01以降は“始状態と終状態の間の線形補間”によって中間レプリカを作成する場合をデフォルト値とし、この場合の指定は非必須となりました。

#### 9.4.3.1. NEB法の精度などの設定

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

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

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

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

FIRE法を利用する場合、パラメーターの詳細を設定することも可能となっています。その設定は、multiple_replicaブロックではなくstructure_evolutionブロックの下のfireブロックにおいて行います。その詳細は FIRE法の詳細設定（バージョン2020.01以降） を参照してください。

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

始状態・終状態の指定にnfdynm.dataファイルを利用する方法は、両端のレプリカの指定：両端のレプリカの原子座標をファイルから指定する方法 (バージョン2020.01以降) において説明した通りです。

#### 9.4.3.3. 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 (off) とするとCI-NEBを有効(無効)にすることができます。ci_nebのデフォルト値はonです。ci_thresで指定した値よりも収束判定条件として採用している量が小さい場合に通常のNEBからCI-NEBに切り替わります。この値のデフォルト値は、通常の収束判定条件の2倍です。CI-NEBに切り替わっていない場合通常の収束判定は無視されるので、CI-NEBに切り替わる前に誤って収束したとみなされることはありません。ci_indexに2から中間レプリカ数までの値を指定すると、エネルギーが最も高いレプリカではなくci_indexに対応するレプリカがCI-NEBのターゲットとなります。

#### 9.4.3.4. 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ファイルのフレーム数が一致している必要がある点には注意が必要です。

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

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

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

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

### 9.4.4. 計算の実行方法

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 (三次元版の場合さらに x NG)という関係が成立している必要があります。

### 9.4.5. 計算結果の出力

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ファイルと同じ書式で出力されます。

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

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

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

ここで紹介する例題は、シリコン表面に水素分子が解離吸着する反応をシミュレートします。始状態は表面と表面から十分離れた場所にある水素分子から成る系、始状態は表面のシリコン原子に水素分子が解離し、吸着した系です。始状態と終状態の構造をそれぞれ 図 9.25 と 図 9.26 に示します。

ただし、計算機能を説明する例題として、以下の点を簡略化しています。

- 対称性が高い経路を通ると仮定して、対称性を利用しています。（結晶の対称性指定について 参照）

- 全ての基板原子は、バルク位置に固定されています。

図 9.25 本例題の始状態

図 9.26 本例題の終状態

#### 9.4.6.1. 入力ファイル

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ブロックにおいて収束判定条件などの設定を行っています。

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

dtによって時間刻みを40 au_timeに設定しています。neb_time_integralによって最適化手法としてquench法を採用しています。neb_convergence_conditionで収束判定の方法を指定しています。3はNEB力の最大値によって収束判定を行うことを意味します。neb_convergence_thresholdで収束判定の閾値を5e-04としています。この値の単位はneb_convergence_conditionの設定によって変わることに注意が必要です。今の場合は力なのでhartree/bohr単位です。

#### 9.4.6.2. 計算結果

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

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

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

図 9.27 NEB力の履歴

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

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

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

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

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

#### 9.4.7.1. 問題

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計算の入力ファイルが置かれたディレクトリーです。

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

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

#### 9.4.7.2. 入力ファイル

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ファイルを終状態として利用することになります。

#### 9.4.7.3. 計算結果

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

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

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

- レプリカ並列

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とすることによってリスタート計算を行います。 NEB法利用時は、automaticとしても継続計算になりません。

    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]

G. 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]

G. 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.

## 9.5. Dimer 法

### 9.5.1. 機能の概要

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

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

(9.21)\[\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の向きの曲率は次のように近似することができます。

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

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

(9.23)\[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に対する回転操作は次のように記述することができます。

(9.24)\[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\) は以下のように求められます。

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

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

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

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

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

### 9.5.2. 入力パラメータ

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
    }

NEBと同じように、controlブロックにおいてmultiple_replica_mode = onとします。さらに、multiple_replica_method = dimerを指定するとdimer法が用いられるようになります。

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\) に相当します。

### 9.5.3. 計算の実行方法

NEB法と同様dimer法は「レプリカ並列」に対応しています。

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

ただしNEB法と違いレプリカ数は常に2なので、レプリカ並列の最大並列数は2です。

### 9.5.4. 出力ファイル

結果は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ごとに出力されます。

### 9.5.5. 計算例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法のエネルギーおよび最大並進力を 図 9.32 に示します。もともと遷移状態に近いところから計算を始めているため、比較的スムーズな収束が得られています。

図 9.32 Dimer法の履歴

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

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

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

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

図 9.33 Dimer法の履歴

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

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

### 9.5.7. 制限事項

Dimer法は継続計算に対応していません。また、途中で打ち切られることも想定していないため、計算時間の上限に達したりするなど打ち切りの条件を満たした際の動作は不定です。

> 参考文献

[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).

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

### 9.6.1. 機能の概要

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

### 9.6.2. 入力パラメータ

#### 9.6.2.1. タグ一覧

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

表 9.8 拘束条件付きダイナミクスに関連のあるタグの一覧
第1 ブロック識別子 | 第2、第3ブロ ック識別子 | タグ識別子 | 説明
--- | --- | --- | ---
control |  |  |
|  | driver | ダイナミクスの種類を選択する変数。 拘束条件付きダイナミクスの場合constraintsを指定する。
structure |  |  | 原子座標データの指定を行うブロック
| constrainablexx |  | 拘束条件を定義するブロック。 xxには拘束条件を識別するための整数を1はじまりで指定
|  | type | 拘束条件の“種類”の指定。 bond_length, bond_angle, dihedral_angle bond_length_diff, bond_angle_diff, distance_from_pos, plane, center_of_mass, coordination_number, distance_from_ref
|  | atomx | 拘束条件が関わる原子を指定する。xは整数で、たとえばtype = bond_length の場合2原子が拘束に関わるのでatom1とatom2で指定する。
|  | mobile | 拘束条件が“可動か否か”を指定する。 onとすると可動、offとすると不動。デフォルト値はoff
|  | monitor | 指定の拘束条件を“監視”するかどうかを指定する真偽値。 デフォルト値はoff
| reaction_coordinate |  | 指定の拘束条件が“反応座標”としたい場合に作成するブロック。
|  | sw_reaction_coordinate | onの場合反応座標とみなされる。
|  | init_value | 反応経路の初期値を対応する単位で指定。
|  | final_value | 反応経路の最終値を対応する単位で指定。
|  | increment | final_value, 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 のみ利用可能。
|  | n_md_step | 各拘束条件（反応座標）値におけるMDステップ数

#### 9.6.2.2. driver変数の設定

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

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

#### 9.6.2.3. 拘束条件の設定

拘束条件を設定するには以下のように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 | 配位数を拘束します。配位数の決め方は後述します。
| distance_from_ref | 参照構造から距離を拘束します。
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_valueとinit_valueの間の刻み幅を指定します。
|  | 反応座標を逐次変化させる場合,以下のケースは特殊であるので注意が必要です.
| typeがplaneの場合 | この場合、変化するのは面の原点です.原点の座標値は、指定の法線ベクトルと原子の座標値からプログラムが自動的に決めますが、反応座標の変化としては、法線ベクトルの方向に原点が変化する、という振る舞いになります。init_value, final_value, incrementは、この原点の移動量を指定してください。なお、この場合の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_massを採用し、かつ反応座標を変化させる場合、「変化させる方向」をここで指定します。
| directionx | 変化させる方向の\(x\) 座標を指定します。
| directiony | 変化させる方向の\(y\) 座標を指定します。
| directionz | 変化させる方向の\(z\) 座標を指定します。
reference_structure |  | 参照構造を指定する ブロック

配位数の決め方

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に近づくように決定します。

参照構造からの距離を拘束する方法（バージョン2023.01以降）

参照構造からの距離を拘束することができます。この拘束条件を用いることによって、たとえば始状態を入力に指定し、終状態を参照構造とし、少しずつ近づけていくというシミュレーションを実行することができます。この機能を用いるにはtype変数にdistance_from_refを指定し、さらにreference_structureブロックに参照構造を指定します。

    structure{
        constrainable1{
          type = distance_from_ref
          reaction_coordinate{
            sw_reaction_coordinate = on
            final_value = 0.1 bohr
            increment = -0.2 bohr
          }
          reference_structure{
            coordinate_system = internal
            atoms{
            #tag    no rx    ry    rz
                  1 0.2943425771929825 0.4469155567738791 0.4539110432261209
                  9 0.45301117987329437 0.44621817768031197 0.2955079284113061
            }
          }
        }
      }

reference_structureの下のcoordinate_systemによって座標をデカルト座標で記述するか(cartesian)フラクショナル座標で記述するか(internal)を指定します。coordinate_systemのデフォルト値はinternalです。atomsブロックにおいて参照構造の座標を記述します。通常の座標の記述と違い、元素の指定は不要です（あっても無視されます）。noというカラムを設けると一部の原子のみ対象とすることができます。上述の例ではnoが1および9で、これは1番目の原子と9番目の原子のみ指定を行っていることになります。このように設定すると1番目と9番目の原子以外は等価な構造であるとみなされます。noカラムが存在しない場合はすべての原子をもとの座標データと同じ順序で記述する必要があります。

重心間の距離・角度・二面角を拘束する方法 (バージョン2023.01以降)

重心間の距離/角度/二面角を拘束することができます。この拘束条件を用いる場合type変数には通常通りbond_length, bond_angle, dihedral_angleを設定します。さらにatom1, atom2などの変数をブロックに変更し、対象となる原子群を設定します。たとえば以下のように設定します。

    constrainable1{
      type = bond_length
      atom1{
        #tag no
        1,2,4,5,13,34
      }
      atom2{
        #tag no
        7,8,9,10,12,36
      }
    }

通常の原子間の距離/角度/二面角の場合atom1 = 1 atom2 = 2 … という具合に原子の番号を直接指定しますが、原子群を指定する場合はatom1, atom2, … をブロックとし、表形式データを作成します。表形式データはnoという属性値一つだけを持ち、原子群を構成する原子の番号を指定します。原子群の場合はatom_group1, atom_group2, … などと指定することもできますが二つのスタイルを混在させる場合末尾の数値はユニークである必要があります。すなわち、atom1, atom_group2, …などと指定します。上述の例で示しているように、一行に一原子を指定するスタイルだけでなくカンマで区切るスタイルも利用することができます。通常通り1行に1つの番号を指定することもできます。

#### 9.6.2.4. ダイナミクスのアルゴリズムの指定

拘束条件の指定の次は、採用するダイナミクスのアルゴリズムを指定します。通常の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)を採用することができ、速く収束させることのできる手法です。

#### 9.6.2.5. 反応座標を変化させる指定

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

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

反応座標を逐次変化させる場合、constrainablexブロックの下にreaction_coordinateブロックを作成し、設定を行います。たとえば以下のように設定します。

    structure{
        ....
        ....
        constrainable1{
          type = bond_length
          atom1 = 1
          atom2 = 2
          reaction_coordinate{
            sw_reaction_coordinate = on
            init_value = 2.5 bohr
            final_value = 3.5 bohr
            increment = 0.1 bohr
          }
        }

sw_reaction_coordinate = on と設定すると反応座標を変化させます。変化のタイミングは、拘束条件付き最適化の場合処理中の拘束条件において収束が達成できたあと、拘束条件つき分子動力学シミュレーションの場合指定のステップ数を経たあとになります。init_valueは拘束条件の初期値です。指定がない場合入力座標から計算される値がそのまま採用されます。final_valueには最終的に到達する値を指定します。incrementにはinit_valueとfinal_valueの間の刻み幅を指定します。

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

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

    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単位です。

### 9.6.3. 計算の実行方法

拘束条件付きダイナミクスは、「反応座標を逐次変化させて計算する」ケースにおいては原子配置に対する並列計算に対応しています。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とすれば目的の動作を達成することができます。

### 9.6.4. 計算結果の出力

出力ファイルは、「反応座標を逐次変化させる」機能を利用していない場合は通常の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番目の反応座標の、自由エネルギー差を算出するために必要なラグランジュの未定乗数の値が記録されます。

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

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

#### 9.6.5.1. 機能の概要

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

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

(9.27)\[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と呼ばれる物理量であり、ハミルトニアンの反応座標微分と次のような関係があります。

(9.28)\[\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\)を利用して以下のように計算することができます。

(9.29)\[\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つの場合のみに対応しています。

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

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

    % cd phase0_2025
    % cd src_bm
    % export F90=f90
    % export CC=cc
    % make
    % make install

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

#### 9.6.5.3. 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ブロックでは以下の指定を行うことができます。

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

#### 9.6.5.4. bluemoonプログラムの実行方法

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

    % bluemoon inputfile

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

#### 9.6.5.5. 計算結果の出力

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

- 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単位での自由エネルギーとその統計誤差の結果に対応します。

- mean_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を滑らかにしたあとに (9.27) 式の積分を実施しますが、その滑らかにしたmean forceの計算結果が出力されます。 そのデータ形式は、mean_force_raw.dataファイルから統計誤差の列を除いたものになります。

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

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

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

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

     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 =    0 degree
            increment   =   10 degree
          }
        }
        ...
        ...
    }

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

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

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

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

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

拘束条件付きダイナミクスは、全ての擬ポテンシャルと組み合わせて利用することができます。継続計算にも対応しています。 ただし、温度プロファイルの設定とは組み合わせて利用できません。

また、反応座標に対する並列を実行することができます。 反応座標に対して並列計算を行う場合、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]

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

## 9.7. Meta-dynamics 法

### 9.7.1. 機能の概要

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

図 9.36 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] 。このような方針を採用すると、仮想的な粒子の質量やそれと集団変数を結びつけるばね定数の定義が不要となり、よりシンプルに実行することが可能となります。

### 9.7.2. 入力パラメータ

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

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

表 9.10 拘束条件付きダイナミクスに関連のあるタグの一覧
第1 ブロック識別子 | 第2、第3ブロ ック識別子 | タグ識別子 | 説明
--- | --- | --- | ---
control |  |  |
|  | driver | ダイナミクスの種類を選択する変数。 拘束条件付きダイナミクスの場合meta_dynamicsを指定する。
meta_dynamics |  |  | メタダイナミクスの設定を行うブロック
|  | meta_dynamics_type | メタダイナミクスの“種類”の指定 bias_and_fictitious,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, bond_angle_diff, distance_from_pos, plane, center_of_mass, coordination_numbe
|  | atomx | 拘束条件が関わる原子を指定する。xは整数で、たとえばtype = bond_lengthの場合2原子が拘束に関わるのでatom1とatom2で指定する。
|  | k | 仮想粒子のバネ定数を指定する
|  | delta_s | バイアスポテンシャルの幅、\(\Delta s\)を指定する
|  | smin | バイアスポテンシャル出力の最小値を指定
|  | smax | バイアスポテンシャル出力の最大値を指定
|  | ds | バイアスポテンシャル出力の刻み幅を指定
|  | control_velocity | onにした場合、仮想粒子の速度を制御する
|  | mass_thermo | 仮想粒子の速度を制御する場合の熱浴の質量
|  | target_KE | 仮想粒子の速度を制御する場合のターゲット運動エネルギー
| plane |  | 面内拘束における面の法線ベクトルを指定するブロック
|  | normx,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_typeがbias_generationの場合に、バイアスポテンシャル構築を何回に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ブロックでは、以下の変数/ブロックの設定を行うことができます。

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

表 9.12 拘束条件付きダイナミクスに関連のあるタグの一覧
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_dynamics_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ブロックにおいて定義可能な変数は下記の通りです。

表 9.13 拘束条件付きダイナミクスに関連のあるタグの一覧
height変数 | 一度に足すバイアスポテンシャルの高さをエネルギーの単位で指定します。 一度に足すバイアスポテンシャルの幅は、各集団変数固有の量であるのでbias_potentialブロックではなく集団変数固有の設定を行うcollective_variablexxブロック以下で行います。
output_frequency変数 | meta_dynamics_typeがbias_generationの場合のみ意味のある指定です。何回に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
                ...
                ...
            }
        }
    }

### 9.7.3. 計算の実行方法

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は省略可能であり、省略した場合nrは1, nr以外はPHASE/0の通常のデフォルト設定( 3.3.2.6 章 )が適用されます。

通常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を実行します。ファイルを読み込みバイアスポテンシャルを構築するのみなので、通常並列で実行する必要はありません。

### 9.7.4. 計算結果の出力

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}\)の値です。

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

#### 9.7.5.1. 概要

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配座)。その分子構造を 図 9.37 に示します。エネルギーは、高い順にシクロブテン、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で正しく扱えるかどうかを確認します。

図 9.37 C4H6分子の分子構造

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

図 9.38 C4H6分子の分子構造

#### 9.7.5.2. 入力パラメータ

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

    condition{
        driver = meta_dynamics
        ....
    }

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

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

2. 図 9.38 の、原子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
        }
    }

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

#### 9.7.5.3. 計算結果

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

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

図 9.39 より、ここで得られたエネルギーの等高線図には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程度となりました。いずれも、絶対零度の計算と比較するとより大きなエネルギー差です。

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

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

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

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

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

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

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

参考文献

[Laio02]

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

[Iannuzzi03]

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

[Laio05]

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

## 9.8. 化学ポテンシャル一定のシミュレーション

### 9.8.1. 概要

PHASE/0による通常のシミュレーションでは、電子数一定の計算を行います。これに対し、化学ポテンシャル（フェルミエネルギー）を一定とし、構造最適化や分子動力学シミュレーション、NEB計算などを行う [Bonnet12] ことができる機能（constant-mu法）もPHASE/0には備わっています。この場合、電子数はシミュレーション中変化します。

### 9.8.2. 入力パラメーター

化学ポテンシャル一定のシミュレーションを行うには、accuracyブロックの下にfcpブロックを作成し、次の例のように設定を行います。

    accuracy{
      ...
      fcp{
        sw_fcp = ON
        mu = -0.1
        relax_crit = 1.0d-5
      }
      ...
    }

fcpブロックにおいて定義可能なパラメータは下記の通りです。

sw_fcp | 化学ポテンシャル一定の計算を行うかどうかを指定するスイッチです。 行う場合にonとします。
--- | ---
mu | ターゲットとなる化学ポテンシャルの値をエネルギーの単位で指定します。事前に通常の計算で状態密度を計算しておき、フェルミエネルギー近辺のエネルギー固有値の分布や電子数などを調べておくと設定しやすいでしょう。
temperature | 化学ポテンシャルを制御するための"粒子浴"の温度を指定します。分子動力学シミュレーションの場合に意味のある設定です。
qmass | 化学ポテンシャルを制御するための"粒子浴"の質量を指定します。分子動力学シミュレーションの場合に意味のある設定です。
mass | 化学ポテンシャルを制御するための"電子の質量"を指定します。分子動力学シミュレーションの場合に意味のある設定です。
relax_crit | 構造最適化の際の収束判定条件を指定します。得られる化学ポテンシャルの値とターゲットの値の差の絶対値がここで指定する値よりも小さくなった場合に収束したと見なされます（これ以外に、通常の原子間力に関する収束判定条件も考慮されます）。
tot_charge_first | NEB計算の際に、始点のレプリカに与える電荷を指定します。
tot_charge_last | NEB計算の際に、終点のレプリカに与える電荷を指定します。

なお、本計算機能を使って（ジョブ１とする）得られた（中性でない）電荷を外部電荷としてあたえて通常の計算を行う（ジョブ２とする）場合、（ジョブ１において）与えたmuの値とは異なるフェルミエネルギーが（ジョブ２において）得られます。逆に、外部電荷を与えて通常の計算を行って（ジョブ３とする）得られたフェルミエネルギーをmuに指定して（ジョブ４によって）最適化を行うと、得られる電荷はもとの（ジョブ３における）外部電荷とは異なる電荷となります。このようにつじつまの合わない結果が得られるのは、中性でない電荷を与える場合は初期電荷の与え方が中性の場合と異なるので、エネルギーの原点が変化するためです。つじつまの合った結果を得るためには、外部電荷を与えた計算について以下のような設定を加え、初期電荷の計算方法を合わせるようにしてください。

    accuracy{
      ...
      sw_add_qex_to_initial_charge = off
      ...
    }

### 9.8.3. 計算の実行

通常の構造最適化もしくは分子動力学シミュレーションの設定に加え、化学ポテンシャル一定のシミュレーションの設定を施したら、通常通りPHASE/0を実行すれば計算を行うことができます。

計算中に電荷がどのように変化したかは、以下の要領で調べることができます。

    % grep 'Total Charge' output000
    FCP : Total Charge = 31.98942095
    FCP : Total Charge = 31.99795170
    FCP : Total Charge = 32.01254363
    FCP : Total Charge = 32.02605805
    FCP : Total Charge = 32.03237025
    FCP : Total Charge = 32.02886985
    FCP : Total Charge = 32.01742419
    FCP : Total Charge = 32.00372842
    FCP : Total Charge = 31.99503316
    ...
    ...

また、化学ポテンシャル（フェルミエネルギー）がどのように変化したかは、以下の要領で調べることができます。

    % grep 'Fermi Energy' output002
    FCP : Fermi Energy = 0.24621583
    FCP : Fermi Energy = 0.24679898
    FCP : Fermi Energy = 0.24700415
    FCP : Fermi Energy = 0.24674191
    FCP : Fermi Energy = 0.24618985
    ...
    ...

### 9.8.4. 例題

非常に単純な例題として、シリコン8原子の系の分子動力学シミュレーションを取り上げます。この例題の入力ファイルは、 `samples/dynamics/FCP/NVT_nose_hoover` にあります。

この例題の入力ファイルは、基本的には `samples/dynamics/molecular_dynamics/NVT` 以下にあるものと同等ですが、以下のように“化学ポテンシャル一定の分子動力学シミュレーション”を行うための設定が施されています。

    accuracy{
      ...
      fcp{
        sw_fcpopt = ON
        mu = 9.0e-3
        mass = 1000.0d0
        qmass = 4000
      }
      ...
    }

この入力ファイルを利用して、通常通りPHASE/0を実行すれば化学ポテンシャル一定の第一原理分子動力学シミュレーションを行うことが可能です。その結果、たとえば 図 9.43 に示すように電荷がシミュレーション中時々刻々と変化します。

図 9.43 分子動力学シミュレーション中の電荷の変化。

### 9.8.5. 使用上の注意

本計算機能は、すべての機能と組み合わせて利用することが可能ですが、本計算機能を利用すると電荷中性ではない計算を行うことになる点には注意が必要です。有効遮蔽体法（ESM法。7.7 章 参照）で境界条件をpe1（両側のESMが金属）とすると、隣り合う単位胞の相互作用の影響を取り除くこともできます。

参考文献

[Bonnet12]

N. Bonnet, T. Morishita, O. Sugino, and M. Otani, “First-Principles Molecular Dynamics at a Constant Electrode Potential”, Physical Review Letters 109 266101 (2012).

## 9.9. 剛体ダイナミクス (バージョン2022.01以降)

### 9.9.1. 概要

指定の原子群を「剛体」とみなし、構造緩和、MDなどを行う際剛体内部について内部の緩和は行わず、外部からの力に応じて原子団全体で応答するようにすることができます。

### 9.9.2. 使い方

#### 9.9.2.1. 入力

剛体計算機能を利用するためには、まずは `atoms` テーブルにおいて属性値 `rigid_body` を用いて原子を剛体に割り当てます。

    atom_list{
        atoms{
          #tag    element    rx    ry    rz    mobile rigid_body
                C  0.000681250  0.502399973  0.33460425   on 1
                C  0.504018645  0.000282432 -0.31959746   on 2
                O  0.000846341  0.502991932  0.60238033   on 1
                O  0.506466274  0.004949716 -0.59285598   on 2
                ...
        }
      }

`rigid_body` のデフォルト値は0であり、この場合その原子はどの剛体にも属さず通常通りの扱いとなります。1以上の値を指定すると剛体に属するようになります。数値自体は任意に割り当てることが可能です。同じ数値が指定された原子が共通の剛体に属することになります。

剛体ごとの振る舞いを設定するためには `rigid_body` ブロックおよび `rigid_bodyx` ブロックを用います。

    rigid_body{
      mobile=on
      dt_translation = 100
      dt_rotation    = 200
    }
    rigid_body1{
      mobilex      = off
      mobilerot    = off
      thermo_group = 2
    }

ここで `x` は剛体のIDであり、 `atoms` テーブルの属性値 `rigid_body` に指定する値です。 `rigid_body` ブロックで剛体全体に通用する設定を、 `rigid_bodyx` で剛体 `x` に適用したい設定を施します。 `rigid_body` , `rigid_bodyx` で利用できる変数は下記の通り。

変数名 | 説明
dt_rotation | 重心回りの回転の時間発展に用いる刻み幅。デフォルト値は通常の時間刻みと同じ値。
dt_translation | 重心の並進の時間発展に用いる刻み幅。デフォルト値は通常の時間刻みと同じ値。
mobile | 重心の並進の可動性をon/offで設定します。デフォルト値はon.
mobilex, mobiley, mobilez | 重心の並進のx, y, z方向の可動性をon/offで設定します。デフォルト値はon.
mobilerot | 重心回りの可動性をon/offで設定します。デフォルト値はon.
thermo_group | 重心に割り当てる熱浴を設定します。剛体は、速度スケーリングによって割り当てられた熱浴の温度にいたります。デフォルト値は1.

最適化計算の際、剛体の並進力と重心回りのトルクがともに閾値以下になった段階で収束したとみなされます。これらの閾値は以下のように設定します。

    accuracy{
      force_convergence{
        max_translational_force = 1e-3 hartree/bohr
      }
      torque_convergence{
        max_torque = 1e-3 hartree
      }
    }

`accuracy` ブロックの `force_convergence` ブロックにおいて変数 `max_translational_force` を用いて最大の並進力を指定します。単位は `hartree/bohr`, デフォルト値は 1e-3です。 `accuracy` ブロックの `torque_convergence` ブロックにおいて変数 `max_torque` を用いて最大のトルクを指定します。単位は `hartree`, デフォルト値は 1e-3です。 利用できる最適化手法はQuenched MD法のみです。

分子動力学シミュレーションは通常通り設定すれば実行することができます。

なお、最適化の場合も分子動力学シミュレーションの場合も、時間きざみは剛体全体の質量を考慮してきめるようにしてください。

#### 9.9.2.2. 出力

通常の計算と同様、座標データの履歴は `F_DYNM` ファイルに記録されます。 `F_ENF` ファイルには通常出力されるエネルギーや原子間力最大値のほか、重心の並進力の最大値、トルクの最大値が記録されます。ログファイルには以下の要領で読み込んだ剛体に関する情報が記録されるので、想定通りの剛体指定ができているかどうか確認することが推奨されます。

    !** rigid body no.     2 ID     2
    !** number of atoms defined in this rigid body     8
          2       4       6       7      10      11      14      15
    !** mass         109473.91903
    !** COM               5.44118             0.05616            -2.77364
    !** inertia         298097.06023        313978.40985        611375.59512
    !** quaternion              0.25970             0.65157            -0.28261
    !** initial rotation matrix
      0.70537  -0.70827  -0.02842
      0.03142  -0.00882   0.99947
     -0.70814  -0.70589   0.01603
     ...

### 9.9.3. 計算例

簡単な計算例として、尿素結晶による構造最適化や分子動力学シミュレーションを実施した例を紹介します。 例題の入力ファイルは `samples/dynamics/rigid_body/urear` 以下にあります(MDの適用例は `samples/dynamics/rigid_body/urea` 以下にあります) 尿素結晶とは次に示すような結晶構造を持つ分子性結晶です。

図 9.44 分子性結晶尿素の構造。

基本的な計算条件は下記の通り。

平面波カットオフ [Ry] | 30
電荷密度カットオフ [Ry] | 300
k点サンプリング | Monkhorst-Pack 2×2×2

剛体の最適化手法はquenched MDのみを利用することができます。構造最適化の履歴を 図 9.45 に示します。 iteration進行とともに順調にエネルギーが下がり、最大トルクおよび最大並進力も時折上昇しながらもトレンドとしてはiteration_ionicとともに下降しており、 想定通り最適化を行うことができています。

図 9.45 剛体ダイナミクスによる構造最適化の履歴。

## 9.10. 機械学習によるニューラルネットワークポテンシャルの作成 (バージョン2021.01以降)

### 9.10.1. 概要

ニューラルネットワークポテンシャルとは、凝縮系のポテンシャルエネルギー表面を近似することのできる学習モデルです [Behler07] 。その学習は、PHASE/0などの第一原理計算の結果を教師データとして行われます。PHASE/0には、ænet [Artrith16] や n2p2 [Singraber19] などのソフトウェアと連携し、ニューラルネットワークポテンシャルを作成することができる機能が備わっています。

注釈

2024.01版以降 deepmd [Wang18] の教師データも出力することができるようになりました。

### 9.10.2. 使い方

#### 9.10.2.1. 教師データの作成

以下に説明するような手続きによって、n2p2, ænetおよびdeepmdの教師データとして用いることのできるデータを出力することができます。

入力パラメーターファイルに以下のような設定を施します。

    structure_evolution{
      ...
      ...
      nnp_output{
        sw_nnp_output = on
        filetype = all
        frequency = 100
      }
    }

Structure_evolutionブロックにおいてnnp_outputブロックを作成し、機械学習ポテンシャル用出力の設定を行います。sw_nnp_output = onとすると機械学習ポテンシャル用出力が行われます。filetypeで出力するファイルの種類を指定することができます。XSFを指定するとænetで利用できるXSF形式、n2p2を指定するとn2p2で利用できる形式、deepmdを指定するとdeepmdで利用できる形式、allを指定すると対応しているすべての形式の教師データが出力されます。frequencyによってサンプリングの頻度を指定します。このパラメーターのデフォルト値は100です。ファイル名のデフォルト値は、n2p2がinput.data, XSFがnfdynm xxxxx .xsfです。ここで xxxxx はMDステップ数です。n2p2は学習データが一つのファイルに記録されるのに対し、ænetはスナップショット1つにつき1つのXSFが必要です。deepmdの場合、 `type.raw` `type_map.raw` というファイルに元素情報が出力され、さらに `set.000` というディレクトリーの下に教師データファイルが固定ファイル名で出力されます。

file_names.dataファイルにおいては、n2p2およびXSF形式のファイルのファイル名を指定することができます。デフォルト値はそれぞれnfdynm.n2p2およびnfdynm xxxxx .xsfです。deepmdの場合ファイル名は固定で変更することはできません。

ファイルポインター | 説明
--- | ---
F_N2P2 | n2p2の教師データの出力先。デフォルト値はnfdynm.n2p2
F_XSF | ænetの教師データの出力先。ここで指定した文字列の拡張子に相当する部分の直前にMDのイテレーション数が付加されたファイル名が採用される。デフォルト値はnfdynm.xsf

注釈

本機能は、温度一定の分子動力学計算（NVT）と組み合わせてご利用ください。 圧力一定の分子動力学計算（NPT）と組み合わせた場合は以下の機能制限があります。

- ænet用のXSFファイルは出力されません。

- n2p2用のファイルを出力する際には、frequench = 1に設定してください。

#### 9.10.2.2. サンプル時の収束判定条件の切り替え

教師データをサンプルする際、相関が強くなりすぎないようある程度間隔をあけて行うことが一般的ですが、サンプルするステップ以外のステップの重要性は低いと考えられます。そこで、サンプルするステップ以外は甘い収束判定で計算を行うことによって計算時間の短縮をはかることができます。このような処理を実現するには、以下のような設定を入力パラメーターファイルに施します。

    accuracy{
        ...
        scf_convergence{
            delta_total_energy = 1e-4 Hartree
            delta_total_energy_sampling = 1.e-9
            succession = 1
        }
    }

accuracyブロックのscf_convergenceブロックにおいてSCF計算の収束判定条件の設定は行われるが、ここでdelta_total_energy_samplingキーワードを使ってサンプリングの時のみに用いる収束判定条件を指定することができます。この例では、通常のSCF計算では1e-4 hartreeという収束判定条件が採用されますが、サンプリングステップの場合1e-9という収束判定条件が採用されます。

#### 9.10.2.3. 教師データの形式

教師データのファイル形式について説明します。

nfdynm.n2p2ファイル

> nfdynm.n2p2ファイルはn2p2プログラムで利用できる教師データ形式です。以下の形式で原子配置と対応するエネルギーが記録されます。

>     begin
>     comment iteration      100
>     lattice             5.6022996655             0.0000000000             0.0000000000
>     lattice             0.0000000000             9.7034676599             0.0000000000
>     lattice             0.0000000000             0.0000000000            14.7489157721
>     atom 5.054 4.636 1.407 Li 0.00 0.00 -0.141 -0.0743 0.1568
>     ...
>     energy -25706.79549229032
>     charge 0.0
>     end
>     begin
>     ...
>     end

> beginとendの間に1つのデータが記録されます。commentから始まる行でコメントを記述できます。latticeから始まる行で格子ベクトルの指定を行います。atomから始まる行で原子の情報を記述します。2カラム目から4カラム目に原子のxyz座標を指定し、5カラム目に元素名を指定します。6, 7カラム目は未使用領域ですが、適当な数値を記述する必要があります。8カラム目から10カラム目で原子間力を指定します。原子間力は学習に直接利用されるわけではありませんが、結果得られる機械学習ポテンシャルから得られる原子間力との差を評価し、誤差を推測する、という使われ方がなされる場合があります。energyから始まる行でエネルギーを指定します。chargeから始まる行で系の総電荷を指定します。ただしcharge指定による情報は現バージョンのn2p2では利用されないようです。利用される単位は単位はエネルギーがeV, 距離がÅ, 原子間力がeV/Åです。

> n2p2の入力として利用するには、データはinput.dataというファイルに記録されている必要があるのでnfdynm.n2p2をinput.dataとリネームします。複数のディレクトリーにまたがって行った計算の結果を活用したい場合、これらをcatコマンドとリダイレクトなどを利用して一つのファイルにまとめる必要があります。

>     $ cat A/nfdynm.n2p2 >  input.data
>     $ cat B/nfdynm.n2p2 >> input.data
>     $ cat C/nfdynm.n2p2 >> input.data
>     ...

xsf

> xsfは XCrysDen などにおいて標準的に用いられる座標データ形式です。ænetはこの形式を教師データ形式として採用しています。XSFにおいては、以下の形式で原子配置と対応するエネルギーが記録されます。

>     # total energy =         -25711.2660427032 eV
>     CRYSTAL
>     PRIMVEC
>                  5.6022996655             0.0000000000             0.0000000000
>                  0.0000000000             9.7034676599             0.0000000000
>                  0.0000000000             0.0000000000            14.7489157721
>     PRIMCOORD
>           84       1
>      Li  5.0229472700 5.0300845743 1.8014586046 -0.1368952902 -0.0902290564 -0.4716359333
>     ...

> #から始まる行はXSF形式ではコメント行とみなされますが、ænetは# total energyという文字列がある場合はエネルギーが指定される行とみなし、= の後の数値をエネルギー値として採用します。CRYSTAL行を記述することによってこのあと結晶のデータが記録されていることを指定します。PRIMVEC行を記述することによってこのあとの3行が a 軸、 b 軸、 c 軸の格子ベクトルに対応することを指定します。PRIMCOORDを記述することによって続く行が原子座標や原子間力の指定に利用されることを指定します。まずは原子数が指定されます。この例では84 1となっており、84原子系であることが指定されています。その次の1という数値はænetでは利用しない情報ですがXSF形式の様式を満たすために必要です。その次の行以降が原子の情報です。1カラム目が元素名、2カラム目から4カラム目が原子位置、5カラム目から7カラム目が原子間力です。単位はn2p2の場合と同様エネルギーがeV, 距離がÅ, 原子間力がeV/Åです。

deepmdの教師データファイル

> deepmdの教師データファイルはいくつかのファイルからなります。

> - `type.raw` : 各原子の原子種が記録されます。

> - `type_map.raw` : `type.raw` においては0からはじまる整数値で原子種を指定します。この数値と元素名のマッピングを定義するのがこのファイルです。

> - `set.000/energy.raw` : エネルギーの履歴がeV単位で記録されるファイルです。

> - `set.000/box.raw` : セルベクトルの履歴がÅ単位で記録されるファイルです。

> - `set.000/coord.raw` : 原子座標の履歴がÅ単位で記録されるファイルです。

> - `set.000/force.raw` : 原子間力の履歴がeV/Å単位で記録されるファイルです。

### 9.10.3. ニューラルネットワークポテンシャル作成例

ここでは、\(\alpha\) Quartz結晶を例に、ニューラルネットワークポテンシャルの作成方法について説明します。

#### 9.10.3.1. 用いた結晶

六方晶の \(\alpha\) Quartz結晶を直方晶に取り直し、さらに a 軸と c 軸をそれぞれ2倍とするスーパーセルを作成しました。合計72原子の系です。その初期配置は 図 9.46 に示す通り。

図 9.46 72原子 \(\alpha\) Quartz結晶

#### 9.10.3.2. 第一原理計算

図 9.46 の結晶を初期構造として、温度500K, 800K, 1200Kで定温の第一原理計算分子動力学シミュレーションを実施しました。入力ファイルと教師データのアーカイブはサンプルディレクトリーの下のnnp/SiO2/fpmd以下のサブディレクトリーにあります。温度以外の主要な計算条件は下記の通り。

表 9.14 第一原理分子動力学の主要な計算条件
計算条件 | 値
カットオフエネルギー | 25 Rydberg
k 点サンプリング | \(\Gamma\) 点のみ
収束判定条件 | 1e-9 hartree
サンプリング頻度 | 10 MDステップに一度
総MDステップ数 | 10000
教師データ出力 | XSF形式

このシミュレーションにおいてはサンプリング頻度が10 MDステップに一度と比較的高いため、収束判定条件を切り替える機能は用いていません。

#### 9.10.3.3. ニューラルネットワークポテンシャルの作成の準備

得られた教師データを用いてニューラルネットワークポテンシャルを作成する方法を説明します。用いるアプリケーションはænetです。ænetの詳細については ウェブサイトの情報 を参照してください

まずは、サンプルディレクトリーの下に教師データのアーカイブ（ファイル名xsf.tar.bz2）が配置されているので、それを解凍します。

    $ cd samples/nnp/SiO2/fpmd/500K
    $ tar -jxvf xsf.tar.bz2
    $ ...
    $ cd ../800K
    $ ...

成功すると、各ディレクトリーにファイル名がnfdynm xxxxx .xsfの1000個のxsfが作成されるはずです。

また、ænetのウェブサイトから最新版のアーカイブをダウンロードし、コンパイルしてください。成功すれば、ænetのインストールディレクトリーの下のbinディレクトリーにgenerate.x-*, train.x-*, predict.x-*の3つのバイナリーが作成されるはずです(ここで* はænetのバージョンやコンパイル環境を識別する文字列; 以降-*は省略)

最後に、古典分子動力学シミュレーターLAMMPS [Plimpton95] からænetで作れるニューラルネットワークポテンシャルを用いる場合、LAMMPSのænetインターフェース [Mori20] を 作者のウェブサイト からダウンロードし、指示に従ってLAMMPSに組み込んでください。

#### 9.10.3.4. 教師データの変換

教師データとしての原子配置は、必ずしも機械学習に適したものではないので、それを機械学習に適した形式（記述子）に変換する必要があります。このような変換を行うプログラムがgenerate.xです。 generate.xを実行するために必要な入力はgenerate.xの全体の振る舞いを制御するコントロールファイル (generate.in) と元素ごとの記述子の構築の仕方を指定するセットアップファイルです。サンプルデータは `samples/nnp/SiO2/aenet/generate` の下にあります。

generate.inファイルの内容は、典型的には下記のようになります。

    OUTPUT SiO.train

    TYPES
    2
    Si -107.171 | eV
    O  -434.109 | eV

    SETUPS
    Si  Si.fingerprint.stp
    O   O.fingerprint.stp

    FILES
    3000
    ../../fpmd/800K/nfdynm000772.xsf
    ../../fpmd/800K/nfdynm000038.xsf
    ...
    ...

- OUTPUTにgenerate.xの結果を出力するファイルを指定します。この例ではSiO.trainです。

- TYPESにおいて原子種の指定を行います。まず利用する元素数を指定し（この例では2）, 一行に1元素ずつ元素名と原子の参照エネルギーを指定します。この例では、シリコン結晶と酸素分子の1原子あたりのエネルギーを採用しました。

- SETUPSに元素ごとのセットアップファイルを `元素名 セットアップファイル` という形式で指定します。

- FILESにおいて教師データを指定します。まず教師データの数を指定し、1行に1ファイル教師データが記録されたファイルのパスを指定します。

セットアップファイルの内容は、典型的には下記のようになります。

    ATOM Si

    ENV 2
    Si
    O

    RMIN 0.85d0

    BASIS type=Chebyshev
    radial_Rc = 6.0  radial_N = 16 angular_Rc = 6.0  angular_N = 8

- ATOM 元素名とし、対象元素を指定します。

- ENV Nとし、その元素と相互作用し得る元素の数を指定します。さらに、具体的にどの元素が相互作用し得るかを1行につき1元素名という形式で指定します。

- RMINによって最小距離を指定します。

- BASISにおいて記述子の種類を指定します。type=ChebyshevとするとChebyshev展開を用いて記述子を構築します [Artrith17] この場合、後段のradial_Rcとradial_Nによって動径方向のカットオフ距離と分割数、angular_Rcとangular_Nによって角度方向のカットオフ距離と分割数を指定します。

generate.inファイルとセットアップファイルが準備できたら、generate.xを実行します。

    $ generate.x generate.in > generate.log

この処理の結果、generate.inにおいてOUTPUTキーワードで指定したファイルに結果が記録されます。このファイルを学習用のディレクトリー（今の例の場合 `samples/nnp/SiO2/aenet/train` ）にコピーします。

#### 9.10.3.5. ニューラルネットワークポテンシャルの学習

generate.xによって変換した座標データとエネルギーのセットを用いてtrain.xによる学習を行うことができます。そのコントロールファイル(train.in)は、典型的には以下のように記述します。

    TRAININGSET SiO.train
    TESTPERCENT 10
    ITERATIONS  5000

    MAXENERGY 1.0

    METHOD
    bfgs

     NETWORKS
     ! atom   network         hidden
     ! types  file-name       layers  nodes:activation
       Si    Si.10t-10t.nn    2      10:tanh 10:tanh
       O      O.10t-10t.nn    2      10:tanh 10:tanh

- TRAININGSETでgenerate.xによって作成されたファイルを指定します。

- TESTPERCENTで教師データの内学習ではなくテストに利用するパーセンテージを指定します。

- ITERATIONS 学習はiterativeに行われますが、そのiterationの最大回数を指定します。

- METHOD : 学習の手法を指定します。bfgsのほか、Levenberg-Marquardt法などを利用することができます。bfgs法は設定が必要なパラメーターが少なく、ロバストな最適化が可能なため推奨の方法です。

- NEWORKSにおいてベースとなるニューラルネットワークを指定します。1行につき1元素の指定を行います。まず元素名を記述し、つぎにニューラルネットワークの重みを記録するファイルを指定します。さらに隠れ層の数を指定し、最後に隠れ層の数分ノード数とactivation function (階段関数の近似)の形式を指定します。

train.xを以下の要領で実行します。

    $ mpiexec -n 8 train.x train.in > train.log

このコマンドはMPIを介して8並列で実行する例です。具体的なコマンドはシステムによって異なる可能性があります。

ログは標準出力に出力されるので、この例ではリダイレクトされtrain.logというファイルに出力されます。train.logには様々な情報が記録されます。学習がうまくいっているかどうかの確認は以下のようにTraining process以降のデータを参照するようにしてください。

    ----------------------------------------------------------------------
                               Training process
    ----------------------------------------------------------------------

    Weight optimization for 5000 epochs using the Limited Memory BFGS method.

    Sampling type               : sequential

           |------------TRAIN-----------|  |------------TEST------------|
    epoch             MAE          <RMSE>             MAE          <RMSE>
        0    2.055153E-01    2.392261E-01    2.059784E-01    2.414336E-01 <
        1    2.055153E-01    2.392261E-01    2.059784E-01    2.414336E-01 <
        2    1.338985E-01    1.499288E-01    1.358931E-01    1.509523E-01 <
        3    4.876623E-02    7.448498E-02    4.891127E-02    7.381589E-02 <
        4    3.806436E-02    5.418523E-02    3.679157E-02    5.251901E-02 <
       ...
       ...

特にTESTのMAE (mean absolute error), RMSE (root mean square error)の値に注目し、これが初期値に比べ小さくなっているepochを採用するようにしてください。

ネットワークの重みづけファイル（分子動力学シミュレーションなどにおいて利用するファイル）はtrain.inにおいて指定した文字列に、学習のiteration回数が付与されたファイル名(たとえばSi.10t-10t.nn-00100など)のファイルに出力されます。

#### 9.10.3.6. ニューラルネットワークポテンシャルの検証

ænet付属のプログラムpredict.xを用いることによって、作成したニューラルネットワークポテンシャルの検証を行うことができます。predict.xはxsfとニューラルネットワークポテンシャルの重みファイルを入力とし、エネルギーや原子間力の計算と構造最適化を行うことができます (predict.xでできることはこれだけなので、本格的な活用のためにはLAMMPSインターフェースなどを利用することが推奨されます)

predict.xのコントロールファイル (predict.in)は典型的には以下のようになります（このサンプル入力は `samples/nnp/SiO2/aenet/predict` 以下にあります）

    TYPES
    2
    Si
    O

    NETWORKS
      Si Si.10t-10t.nn
       O  O.10t-10t.nn

    FORCES

    FILES
    3000
    ../../fpmd/800K/nfdynm000772.xsf
    ../../fpmd/800K/nfdynm000038.xsf
    ...
    ...

- TYPESの次の行で原子種の数を指定します。それに続く行で元素名を記述します。

- NETWORKSに続く行で、元素名 ニューラルネットワークポテンシャルの重みファイル名 という形式でニューラルネットワークポテンシャルの重みファイルを指定します。

- 原子間力を計算する場合、FORCESというキーワードを記述します。

- FILESキーワードとそれに続く行において、generate.inと同じ形式で対象の原子配置を記述したXSFを指定することができます。この部分がない場合、対象の原子配置ファイルはpredict.x実行時に引数指定する。

predict.xはgenerate.x, train.xと同じように実行することができます。

    $ predict.x predict.in > predict.log

結果は標準出力に出力されるので、上述のコマンド例の場合predict.logファイルに記録されます。たとえば以下のような内容になります。

    ----------------------------------------------------------------------
                                 Parallel run
    ----------------------------------------------------------------------

    Number of processes : 1
    ...
    ...
    ...
    Cartesian atomic coordinates (input) and corresponding atomic forces:

             x             y             z             Fx           Fy            Fz
            (Ang)         (Ang)         (Ang)       (eV/Ang)      (eV/Ang)      (eV/Ang)
    --------------------------------------------------------------------------------------
    Si      9.649365      8.409237      9.994378      0.235924      0.525635     -1.368195
    Si      1.351787      1.864069      0.963064      2.655693      2.032425     -0.024373
    Si      1.296394      6.654412      2.411131      1.116420      0.752235      1.365680
    O       8.774874      1.120195      9.374453     -0.116155      1.088577     -0.440955
    ...
    ...

    Cohesive energy            :         -184.66378181 eV
    Total energy               :       -23593.99978181 eV
    Mean force (must be zero)  :     -0.000000      0.000000      0.000000
    ...
    ...

図 9.47 にpredict.xで計算したエネルギーと第一原理計算によって得られたエネルギーをプロットした図を示します。この図では、完全な学習ができていた場合はすべての点が斜め45度の直線にのります。学習が完璧であることはないので直線からのバラつきはあるものの、直線からの乖離は原子あたりおおむね1 meV以下であり、よく学習できていることが分かります。

図 9.47 第一原理計算とニューラルネットワークポテンシャルによって得られるエネルギーの比較

#### 9.10.3.7. ænetインターフェースを組み込んだLAMMPSの使い方

ニューラルネットワークポテンシャルを用いてLAMMPSによる計算を行うには、まず重みファイル(Si.10t-10t.nn-xxxxxなど)のファイルを実行ディレクトリーにコピーします。その際、ファイル名末尾の“-xxxxx”の部分は取り除いたファイル名にします。

LAMMPSの入力スクリプトは通常通り用意します。単位はmetal, atom_styleはatomicを用います。すなわち、以下のような指定は必須です。

    units metal
    atom_style atomic

ポテンシャル指定部分には以下のような文字列を指定します。

    pair_style      aenet
    pair_coeff      * * v00 Si O 10t-10t.nn Si O

- pair_style aenetによってænetのニューラルネットワークポテンシャルを利用することを指定します。

- pair_coeffによってニューラルネットワークの重みファイルと元素のマッピングを行います。

  - * *という文字列によってすべての元素間が対象であることを指定します。

  - v00によってænetプログラムが出力するファイルを利用することを指定します。

  - つづくSi O 10t-10t.nnはSi.10t-10t.nn, O.10t-10t.nnの2つのファイル指定の短縮形です。

  - 最後のSi Oは元素へのマッピングで、1つ目のファイルはSi, 2つ目のファイルはOに対応する重みファイルであることを意味します。

- 初期座標データファイルは、LAMMPSのatom_style atomicで用いられる形式で準備します。

図 9.48 に、ニューラルネットワークポテンシャルとPHASE/0による500Kおよび800Kにおける \(\alpha\) Quartzの分子動力学シミュレーションのトラジェクトリーから得られた二体分布関数および結合角分布関数を比較した結果を示します。図 9.48 より、得られたニューラルネットワークポテンシャルは第一原理計算の結果をよく再現するものであることが分かります。

図 9.48 500Kおよび800Kにおける二体分布関数と結合角分布関数の比較。赤線：PHASE/0による第一原理分子動力学シミュレーション、緑線：ニューラルネットワークポテンシャルによる古典分子動力学シミュレーション。

[Behler07]

J. Behler and M. Parrinello, Phys. Rev. Lett. 98, 146401 (2007)

[Artrith16]

N. Artrith and A. Urban, Comput. Mater. Sci. 114 (2016) 135-150.

[Singraber19]

Singraber, A.; Behler, J.; Dellago, C. J. Chem. Theory Comput. 15 (2019) 1827–1840.

[Plimpton95]

S. Plimpton, J. Comp. Phys. 117 (1995) 1-19.

[Mori20]

H. Mori and T. Ozaki, Physical Review Materials 4 (2020) 040601.

[Artrith17]

N. Artrith, A. Urban, and G. Ceder, Phys. Rev. B 96 (2017) 014112.

[Wang18]

Han Wang, Linfeng Zhang, Jiequn Han, and Weinan E. Computer Physics Communications 228 (2018): 178-184.

## 9.11. PIMDコードを用いた経路積分分子動力学シミュレーション (バージョン2022.01以降)

### 9.11.1. 概要

PIMDコード [Shiga25] [Shiga22] [Shiga01] [Shiga00] はその名の通りPIMD (経路積分分子動力学)をはじめとした様々なシミュレーションを行うことができる分子動力学シミュレーターです。その特徴の一つに様々な第一原理シミュレーションソフトウェアなどを原子間力やエネルギーを計算するエンジンとして利用できるところにありますが、PHASE/0もこのエンジンとして用いることができるようになっています。すなわち、「ライブラリー版」のPHASE/0をビルドし、PIMDのライブラリーディレクトリーに配置した上でPIMDをビルドすることによってPHASE/0をPIMDのエネルギー/原子間力エンジンとして用いることができるようになります。対応するPIMDのバージョンは2.6.0以降です。

### 9.11.2. ビルド方法

まずPHASE/0のライブラリー版を作成します。`src_phase` もしくは `src_phase_3d` ディレクトリーにおいて以下のコマンドを実行します。

    make libphase.a libesm.a

バージョン2.6.0以降のPIMDをダウンロードし、任意のディレクトリー（たとえば `pimd` ）に展開します。 `pimd/lib` に `phase0` というディレクトリーを作成し、そこに `libphase.a libesm.a` をコピーします。

    cd pimd/lib
    mkdir phase0
    cp $HOME/phase0_2025/src_phase_3d/libphase.a phase0/
    cp $HOME/phase0_2025/src_phase_3d/libesm.a phase0/

つぎに、PIMDのmakefileを編集します。makefileはPIMDインストールディレクトリーの下のsourceディレクトリーにあります。

    #     compile PIMD with PHASE/0
    # PHASE0 = -Dphase0
    PHASE0 =

この箇所を

    #     compile PIMD with PHASE/0
    PHASE0 = -Dphase0
    #PHASE0 =

のように編集し、 `make` コマンドを実行すればPIMDをビルドすることができます。コンパイラーやMPIライブラリーは `libphase.a`, `libesm.a` を作る際に利用したものを用いるようにしてください。

うまくいけばバイナリーファイル `pimd.mpi.x` が作成されます。 なお、シリアル実行版のバイナリーファイル `pimd.x` も作成されますが、これは PHASE/0をエンジンとして用いることはできません。

### 9.11.3. 使い方

PHASE/0の入力ファイルは通常通り用意します。原子配置についてはPHASE/0が配列などを確保する目的で必要ですが、実際の座標値はPIMDから渡されます。 したがって原子のならびや原子種はあっている必要がありますが、座標値や属性値はどのようなものでも問題ありません。

PIMDの入力ファイル (ファイル名 `input.dat` ) には以下のような設定を施します。

    <ipotential>
    PHASE0

    <phase0_proc>
    ne nk ng

`ne nk ng` にはそれぞれバンド並列数/k点並列数/G点並列数に相当する数値を入力してくだささい。2次元版を用いる場合 `ng` に相当する数値としては1を指定するようにしてください。 なお、各数値はPIMDによって各レプリカに割り当てられるMPI並列数が `ne nk ng` の積に等しくなるように決める必要があります。PIMDの詳細についてはPIMDのマニュアルを参照してください。

### 9.11.4. 計算例

PIMDを用いて六方晶氷の経路積分分子動力学シミュレーションを実行してみました。PIMDのポテンシャルとしてはPHASE/0を用いました。

サンプルの入力データは `samples/dynamics/PIMD/ice` 以下の `pbe` および `pbe_classical` 以下に配置されています。前者に経路積分分子動力学の入力、後者に古典分子動力学の入力が配置されています。PIMDの動作に必要なファイルの一つに `input_default.dat` というファイルがありますが、この例題に同梱されている `input_default.dat` ファイルはPIMDバージョン2.6.0のものです。そのため、2.6.0以外のバージョンのPIMDを用いる場合はそのままでは実行することができません。PIMDインストールディレクトリーの `examples` ディレクトリーの下にある `input_default.dat` ファイルを上書きコピーすれば実行することができます。

図 9.49 六方晶氷結晶の原子配置

計算条件は次に示す通りです。

カットオフエネルギー | 25 Rydberg
k点サンプリング | 2x2x2 Monkhorst-Packメッシュ
格子定数 | a=7.60357Å, c=7.142962Å
時間刻み | 0.25 fs
アンサンブル | NVTアンサンブル
温度 | 300K
ビーズ数 | 1 (通常の分子動力学シミュレーション) 16 (PIMD)

1000ステップほどMD/PIMDを実行した結果得られた二体分布関数を 図 9.50 に示します。 PIMDによるトラジェクトリーは通常の分子動力学シミュレーションによって得られるそれと大きく異なることがわかります。特に第一ピーク（水分子内の酸素原子と水素原子の結合）の振る舞いが大きく異なり、PIMDの場合はよりブロードなピークとなっています。これは水素の量子効果が効いているためと考えられます。

図 9.50 六方晶氷結晶の二体分布関数。赤線：PIMD, 緑線：古典MD

### 9.11.5. 注意事項

ライブラリー版PHASE/0はストレステンソル計算には対応していません。したがって、PIMDのNPT計算などに用いることはできません。

参考文献

[Shiga25]

M. Shiga, PIMD version 2.7.0 (2025).

[Shiga22]

M. Shiga, PIMD version 2.6.0 (2023).

[Shiga01]

M. Shiga, M. Tachikawa, S. Miura, J. Chem. Phys. 115, 9149-9159 (2001). "A unified scheme for ab initio molecular orbital theory and path integral molecular dynamics''

[Shiga00]

M. Shiga, M. Tachikawa, S. Miura, Chem. Phys. Lett. 332, 396-402 (2000). "Ab initio molecular orbital calculation considering the quantum mechanical effect of nuclei by path integral molecular dynamics''