5. 応用機能
5.1. 解析機能
5.1.1. ストレステンソル
5.1.1.1. 機能の概要
PHASEには、ストレステンソルを計算する機能があります。ストレステンソルを計算することにより、安定な格子定数や弾性定数を計算することができます。
5.1.1.2. 入力パラメータ
ストレステンソルを計算するには、入力パラメータファイルnfinp.dataにおいて、structure_evolutionブロックの下のstressブロックで、ストレステンソル計算を有効にする指定をします。
Si(立方晶)の入力パラメータファイルの例を以下に示します。計算例題は、 samples/elastic/Si/s0
以下にあります。
Control{
condition = initial
}
accuracy{
cutoff_wf = 20 rydberg
cutoff_cd = 80 rydberg
num_bands = 8
ksampling{
mesh{ nx = 10, ny = 10, nz = 10 }
}
}
structure{
unit_cell_type = primitive
unit_cell{
#units angstrom
a_vector = 0.000000 2.723515 2.723515
b_vector = 2.723515 0.000000 2.723515
c_vector = 2.723515 2.723515 0.000000
}
symmetry{
method = automatic
}
atom_list{
coordinate_system = internal
atoms{ #tag rx ry rz element
0.125 0.125 0.125 Si
-0.125 -0.125 -0.125 Si
}
}
element_list{
#tag element atomicnumber
Si 14
}
}
structure_evolution{
stress{
sw_stress=on
}
}
SCF 計算と同様に PHASE を実行します。
% mpirun ~/phase0_2021.01/bin/phase
計算が終了したら結果を確認します。
% grep -A3 'Total STRESS TENSOR' output000
STRESS TENSOR
0.0000004032 0.0000000000 0.0000000000
0.0000000000 0.0000004032 0.0000000000
0.0000000000 0.0000000000 0.0000004032
ストレステンソルは
の形式で出力されています。出力されている値の単位は [Hartree/Bohr3] です。 上の結果では入力データとしてわずかに格子定数を小さく取ってあるため、正の \(X_{x},Y_{y},Z_{z}\) が出力されています。
また、釣り合いの位置からの格子変形(\(\equiv e\))、スティフネス定数(\(\equiv c\))を用いると次のようなフックの法則が成り立ちます。
5.1.1.3. 弾性定数
ストレステンソルの計算結果から、弾性定数の計算を行う例を紹介します。弾性定数は、歪みのない結晶と歪みのある結晶のストレステンソルを利用すると、上述のフックの法則より計算することができます。ここでは、Si(立方晶)を例に説明します。この例題の入力ファイルは、 samples/elastic/Si
の s0
および sxx
の下にあります。 s0
が歪みのない結晶の入力データ、 sxx
がxx方向に歪みを与える場合の入力データです。
弾性定数を計算する場合、ストレステンソルの絶対値がなるべく小さくなる格子定数を利用することが望ましいです。 この例題は、ストレステンソルの各成分の絶対値が小さくなる、以下のような格子定数を採用しています。
unit_cell{
#units angstrom
a_vector = 0.000000 2.731958 2.731958
b_vector = 2.731958 0.000000 2.731958
c_vector = 2.731958 2.731958 0.000000
}
ディレクトリー samples/elastic/Si/s0
においてストレステンソルを計算すると以下のような結果が出力されます。
% grep -A3 'Total STRESS TENSOR' output000
Total STRESS TENSOR
0.0000000301 0.0000000000 0.0000000000
0.0000000000 0.0000000301 0.0000000000
0.0000000000 0.0000000000 0.0000000301
つぎに、ディレクトリsxxへ移ります。
% cd ../sxx
このディレクトリーに置かれている入力ファイルはs0のものとほぼ同じですが、以下の設定によって11方向(xx方向)に0.001という格子歪みを与えた計算を行うことになります。
structure{
...
...
strain{
sw_strained_cell = on
e11 = 0.001
}
}
structureブロックの下にstrainブロックを作成し、変数sw_strained_cellをonとすると格子歪みを与えて計算を行うことができます。さらに変数e11, e12, e13, e22, e23, e33で非ゼロとする歪み成分を指定します。このディレクトリで計算を行うと、以下のようなストレステンソルが得られます。
% grep -A3 'Total STRESS TENSOR' output000
Total STRESS TENSOR
-0.0000051660 0.0000000000 0.0000000000
0.0000000000 -0.0000018789 0.0000000000
0.0000000000 0.0000000000 -0.0000018789
この例題の弾性定数の計算には、ストレステンソルの対角成分を用います。この計算例題では、回転や剪断ひずみを与えていませんので、非対角項は0になっています。
得られたストレステンソルから、 スティフネス定数\(c_{11}\), \(c_{12}\)を次式から計算します。
今のケースでは\(e_{\text{xx}}\)以外は0なので、歪みのない系とある系の\(X_{x},\ Y_{y}\)の差を歪み量 (0.001)で除すれば\(c_{11}\)と\(c_{12}\)を計算することができます。結果は \(c_{11} = 5.196 \times 10^{-3} \ \mathrm{Hartree/Bohr}^3 = 153 \ \mathrm{GPa}, c_{12}=1.909 \times 10^{-3} \ \mathrm{Hartree/Bohr}^3 = 56.1 \ \mathrm{GPa}\) となります。
一方、弾性定数(ヤング率(\(\equiv Y\))・ポアソン比(\(\equiv P\))・体積弾性率(\(\equiv B\)))はスティフネス定数を用いて次のような式で書き表されます。 剛性率は \(Y/(2 + 2P)\) と書けます。
これにスティフネス定数\(c_{11}\), \(c_{12}\)を代入すれば Siの弾性定数は \(Y = 123 \ \mathrm{GPa}, P=0.268, B=88.4 \ \mathrm{GPa}\) と求まります。
より精度の高い弾性定数の計算を行ないたい場合、 cutoff_wf, cutoff_cdを大きめにとり、電子状態を充分に収束させる必要があり、計算時間のかかる計算になります。
5.1.1.4. ストレステンソルの補正
PHASE/0によるストレステンソルの計算は,精度が低い場合があります。原因は,“格子がひずむことによる平面波数の変化の効果”がとりいれられていないからです。この効果を取り入れることによって,ある程度補正を行うことが可能です。
方法1.
運動エネルギーの計算におけるGベクトルの高周波成分をスメアすることによって,“平面波数一定”の状況を“カットオフエネルギー一定”の状況に近づけることができます。 [Bernasconi95] では,運動エネルギーの高周波成分を以下のように置き換えることが提案されています。
PHASE/0では,上式を利用したストレステンソルの計算を行うことができます。以下のような設定を入力パラメーターファイルに記述します。
structure_evolution{
lattice{ sw_optimize_lattice = on }
stress{
sw_smear_KE = on
a = 15 rydberg
sigma = 0.1 rydberg
e0 = 35 rydberg
}
}
structure_evolutionの下にstressブロックを作成し,設定を行います。sw_smear_KE=onとするとこの機能が有効になります。a, sigma, e0には対応するパラメーターを指定します。
デフォルト値はa=0.375, ecut, sigma = 0.1 Rydberg, e0=ecut-1 Rydbergです。
方法2.(バージョン2019.01以上)
複数のカットオフエネルギーによる計算から誤差を見積もることができます。ターゲットカットオフエネルギーを \(E_{\mathrm c}\) ,変化量を \(\Delta E_{\mathrm c}\) 全エネルギーの変化量を \(\Delta E_{\mathrm t}\) とすると,ストレスの誤差 \(\sigma_{\mathrm e}\) は以下のように見積もることができます。
この補正をPHASE/0に計算させるには,以下のようにstressブロックにおいてsw_stress_correctionをonとします。
structure_evolution{
stress{
sw_stress = on
sw_stress_correction = on
}
}
ストレステンソルの補正は,カットオフエネルギーを変化させてストレステンソルを求めることによって計算します。どの程度カットオフエネルギーを変化させるかはdelta_ecutによって指定します。カットオフエネルギーをecut-delta_ecutとしたケースとecut+delta_ecutとしたケース,そしてecutそのもののケースのストレステンソル計算が行われ,その後補正が計算されます。なお,補正の計算前に計算が終了した場合継続できないので注意が必要です。補正値は以下のようにoutput000ファイルに記録されます。
!** Pulay stress : -0.000194696412156
補正が計算されたあと,入力パラメーターファイルに格子最適化の設定が行われている場合補正を組み込んだ状態で格子最適化計算が始まります。そうでない場合,以下の要領で補正の値を入力ファイルに書き込み,格子最適化などを行う設定にしたうえで再度計算を実行してください(補正が必要なのは対角要素のみ,また誤差が-0.0001auだったとして)。
structure_evolution{
lattice{
sw_optimize_lattice = on
external_stress{
s11 = -0.0001
s22 = -0.0001
s33 = -0.0001
}
}
}
※ バージョン 2019.01未満の場合補正は手動で計算する必要があります
検証
これらの補正を利用し,TiO2の格子定数を計算した結果を以下の表にまとめました。方法1.のパラメーターはデフォルト値,方法2.のは±5 Rydbergとしました。
a (bohr) |
c (bohr) |
|
---|---|---|
カットオフ36 Rydberg, EV曲線 |
8.8017 |
5.6355 |
カットオフ36 Rydberg, 補正なし |
8.6825 |
5.5862 |
カットオフ36 Rydberg, 方法 1. |
8.7593 |
5.6072 |
カットオフ36 Rydberg, 方法 2. |
8.8052 |
5.6200 |
カットオフ80 Rydberg, 補正なし |
8.7918 |
5.6158 |
方法1.2.とも改善しています。特に,方法2.を使うとEV曲線からもとめた格子定数とほぼ同じ格子定数が得られています。
- Bernasconi95
M.Bernasconi, G.L.Chiarotti, P.Focher,S.Scandolo,E.Tosatti,M.Parrinello Journal of Physics and Chemistry of Solids, 56 501-505 (1995).
5.1.2. 局所状態密度と部分電荷密度
5.1.2.1. 機能の概要
計算した電子状態を解析するため状態密度や電子密度を描きますが,複雑な物質になると 解析が困難になります。 原子領域の状態密度を求めることにより,結合状態の解析が可能となります。積層構造や界面構造の場合に層毎の状態密度を計算すると,積層による電子状態の変化の解析や界面状態の同定ができます。固有エネルギーがあるエネルギー範囲に収まる電子状態からなる部分電荷密度を計算すると,それらの電子状態の分布が明瞭に分かります。原子分割と層分割の局所状態密度と部分電荷密度の計算の仕方をBaO/Si(001)界面を例に説明します。
簡単のため,BaOの格子定数にSiと同じ格子定数(5.43Å)を用います。そして, 図 5.1 に示すように,BaO/Si(001)界面の原子構造は5層からなるシリコン層と6層からなるBaO層をOで繋げた構造にします。このBaO/Si(001)界面の計算例題は samples/dos_band/BaO_Si001
です。
入力パラメータの構造に関する部分は次のようになっています。
structure{
unit_cell_type=bravais
unit_cell{
!! a_Si=5.43 A, c-axis=5*a_Si
!! (c.f. a_BaO=5.52 A)
#units angstrom degree
a = 3.83958982184, b= 3.83958982184, c= 27.15
alpha=90.0, beta=90.0, gamma=90.0
}
symmetry{
tspace{
system = primitive
generators {
#tag rotation tx ty tz
E 0 0 0
C2z 0 0 0
}
}
sw_inversion = off
}
magnetic_state = para !{para|af|ferro}
atom_list{
coordinate_system = internal ! {cartesian|internal}
atoms{
#default mobile=no
#tag element rx ry rz num_layer
Ba 0.0000 0.5000 0.05 1
O 0.5000 0.0000 0.05 1
Ba 0.5000 0.0000 0.15 2
O 0.0000 0.5000 0.15 2
Ba 0.0000 0.5000 0.25 3
O 0.5000 0.0000 0.25 3
O 0.0000 0.5000 0.35 4
Si 0.0000 0.0000 0.40 5
Si 0.5000 0.0000 0.45 6
Si 0.5000 0.5000 0.50 7
Si 0.0000 0.5000 0.55 8
Si 0.0000 0.0000 0.60 9
O 0.5000 0.0000 0.65 10
Ba 0.5000 0.0000 0.75 11
O 0.0000 0.5000 0.75 11
Ba 0.0000 0.5000 0.85 12
O 0.5000 0.0000 0.85 12
Ba 0.5000 0.0000 0.95 13
O 0.0000 0.5000 0.95 13
}
}
element_list{ !#tag element atomicnumber zeta dev
Si 14 0.00 1.5
Ba 56 0.00 1.5
O 8 0.00 1.5
}
}
原子構造の緩和には時間がかかるので,mobileをnoに設定して構造緩和を行いません。
5.1.2.2. 原子分割局所状態密度
原子分割の局所状態密度を計算するにはタグPostprocessingの中にタグdosとタグldosを書きます。そして,タグdosの中の変数sw_dosをONにし,タグldosの中の変数sw_aldosをONにします(phase/0 2015.01以下のバージョンではではsw_dos=OFFでsw_aldos=ONに設定した場合、異常終了しますのでご注意下さい)。
Postprocessing{
dos{
sw_dos = ON
method = g
}
ldos{
sw_aldos = ON
aldos{
crtdst = 6.0 bohr
naldos_from = 1
naldos_to = 19
}
}
}
タグaldosの中の変数crtdstは単位格子を原子ごとにボロノイ多面体分割するときの臨界距離です。どの原子からもこの臨界距離以上離れている領域は真空領域とみなされます。真空領域の状態密度は,(原子の個数+1)番目の原子局所状態密度として表されます。 naldos_formとnaldos_toに原子分割局所状態密度を計算する最初の原子と最後の原子を指定します。これを指定しないと全原子について原子分割局所状態密度が計算されます。また,タグatomsの中で変数aldosをoffにした原子の局所状態密度は計算されません。変数aldosよりもnaldos_fromとnaldos_toの方が優先されます。
計算結果はdos.dataに出力されます。状態密度図を作成するには,付属のPerlスクリプトdos.plを使います。以下のようにすれば,dos_a001.eps,dos_a002.eps,...,dos_axxx.epsといったポストスクリプトファイルが作成されます。
% ../../../tools/bin/dos.pl dos.data -erange=-30,5 -dosrange=0,12 -mode=atom
BaO/Si(001)界面の原子分割局所状態密度を計算した結果を 図 5.1 に示します。 Si,Ba,Oの原子分割局所状態密度にそれぞれの原子の特徴を見ることができます。
図 5.1 BaO/Si(001)界面構造の原子分割の局所状態密度。上のパネル:Si層中央のSiの局所状態密度。中央のパネル:BaO層中央のBaの局所状態密度。下のパネル:BaO層中央のOの局所状態密度。
5.1.2.3. 層分割局所状態密度
層分割の局所状態密度を計算するにはタグPostprocessingの中にタグdosとタグldosを書きます。そして,タグdosの中の変数sw_dosをONにし,タグldosの中の変数sw_layerdosをONにします(原子分割局所状態密度の計算の場合と同様、phase/0 2015.01以下のバージョンでは,sw_dos=OFFでsw_layer=ONに設定した場合、異常終了しますのでご注意下さい)。
dos{
sw_dos = ON
method = g
}
ldos{
sw_layerdos = ON
layerdos{
slicing_way = by_atomic_positions !{regular_intervals|by_atomic_positions}
deltaz = 1.0 angstrom
normal_axis = 3
crtdst = 3.5 bohr
}
}
タグlayerdosの中の変数normal_axisでは層分割するときの層の法線方向を指定します。1がa軸で,2がb軸で,3がc軸を表します。変数slicing_wayにby_atomic_positionsを指定すると,原子位置によって局所状態密度を計算する層を定めることができます。この場合,atomsテーブルのnum_layerによって,原子が含まれる層の番号を指定します。先に示した,構造の入力部分では13個の層に各原子を割り当てています。変数slicing_wayにregular_intervalsを指定すると,ある領域を等間隔に分割して作成した各層について局所状態密度を計算します。その間隔は変数deltazに入力します。変数crtdstは層を作成する領域を決める臨界距離です。端の原子からこの臨界距離まで層を作成します。
層の範囲に関する下記のような記述がoutput000に出力されます。
!!ldos no, min, max
!!ldos 1 0.00000000 5.13060607
!!ldos 2 5.13060607 10.26121214
!!ldos 3 10.26121214 15.39181821
!!ldos 4 15.39181821 19.23977276
!!ldos 5 19.23977276 21.80507579
!!ldos 6 21.80507579 24.37037883
!!ldos 7 24.37037883 26.93568186
!!ldos 8 26.93568186 29.50098489
!!ldos 9 29.50098489 32.06628793
!!ldos 10 32.06628793 35.91424248
!!ldos 11 35.91424248 41.04484855
!!ldos 12 41.04484855 46.17545462
!!ldos 13 46.17545462 51.30606069
!!ldos 14 0.00000000 0.00000000
noは層の番号です。minとmaxは層の下端の位置と上端の位置を示します。最後の層は指定した以外の領域です。
計算結果はdos.dataに出力されます。状態密度図を作成するには,付属のPerlスクリプトdos.plを使います。以下のように実行すると,ポストスクリプトファイルdos_l001.eps,dos_l002.eps,...,dos_lxxx.epsが作成されます。
% ../../../tools/bin/dos.pl dos.data -erange=-20,5 -dosrange=0,20 -mode=layer
BaO/Si(001)界面の層分割局所状態密度を計算した結果を 図 5.2 に示します。
図 5.2 BaO/Si(001)界面構造の層分割局所状態密度。一番上のパネル:Si層の中央領域の局所状態密度。上から二番目のパネル:BaO/Si(001)界面のSi側の局所状態密度。中央のパネル:BaO/Si(001)界面の酸素あたりの局所状態密度。下から二番目のパネル:BaO/Si(001)界面のBaO側の局所状態密度。一番下のパネル:BaO層の中央領域の局所状態密度。
5.1.2.4. 部分電荷密度
部分電荷密度を計算するにはタグPostprocessingの中のタグchargeで指定します。タグchargeの中の変数sw_charge_rspaceとタグpartial_chargeの中の変数sw_partial_chargeをOnにします。また、この計算を行う場合には、sw_charge_rspaceもOnにしておく必要があります。
Postprocessing{
charge{
sw_charge_rspace = on
partial_charge {
sw_partial_charge = on
Erange_min = -0.45 eV
Erange_max = 0.45 eV
Erange_delta = 0.05 eV
partial_charge_filetype=separate !{individual,separate | integrated}
}
}
}
変数Erange_minとErange_maxにエネルギー領域の最大値と最小値を入力します。エネルギーは金属の場合フェルミレベルから測り,絶縁体の場合は価電子帯上端のエネルギーから測ります。変数Erange_deltaに入力した値の間隔のエネルギー窓を先のエネルギー領域に作成します。
出力ファイルoutput000には以下の様にエネルギー窓に関する出力があります(”!pc”で始まる行)。
!pc nEwindows = 20, nvb_windows = 10, ncb_windows = 10 <<m_ESoc_set_nEwindows_pc>>
!pc iw if_elec_state erange(hartree) erange(eV)
!pc (asis) (shifted) (shifted)
!pc 1 1 ( 0.094537 0.096374 ) ( -0.018375 -0.016537 ) ( -0.500000 -0.450000 )
!pc 2 1 ( 0.096374 0.098211 ) ( -0.016537 -0.014700 ) ( -0.450000 -0.400000 )
!pc 3 1 ( 0.098211 0.100049 ) ( -0.014700 -0.012862 ) ( -0.400000 -0.350000 )
!pc 4 1 ( 0.100049 0.101886 ) ( -0.012862 -0.011025 ) ( -0.350000 -0.300000 )
!pc 5 0 ( 0.101886 0.103724 ) ( -0.011025 -0.009187 ) ( -0.300000 -0.250000 )
!pc 6 1 ( 0.103724 0.105561 ) ( -0.009187 -0.007350 ) ( -0.250000 -0.200000 )
!pc 7 1 ( 0.105561 0.107399 ) ( -0.007350 -0.005512 ) ( -0.200000 -0.150000 )
!pc 8 0 ( 0.107399 0.109236 ) ( -0.005512 -0.003675 ) ( -0.150000 -0.100000 )
!pc 9 0 ( 0.109236 0.111074 ) ( -0.003675 -0.001837 ) ( -0.100000 -0.050000 )
!pc 10 1 ( 0.111074 0.112911 ) ( -0.001837 0.000000 ) ( -0.050000 0.000000 )
!pc 11 1 ( 0.112911 0.114749 ) ( 0.000000 0.001837 ) ( 0.000000 0.050000 )
!pc 12 0 ( 0.114749 0.116586 ) ( 0.001837 0.003675 ) ( 0.050000 0.100000 )
!pc 13 0 ( 0.116586 0.118424 ) ( 0.003675 0.005512 ) ( 0.100000 0.150000 )
!pc 14 0 ( 0.118424 0.120261 ) ( 0.005512 0.007350 ) ( 0.150000 0.200000 )
!pc 15 0 ( 0.120261 0.122099 ) ( 0.007350 0.009187 ) ( 0.200000 0.250000 )
!pc 16 1 ( 0.122099 0.123936 ) ( 0.009187 0.011025 ) ( 0.250000 0.300000 )
!pc 17 1 ( 0.123936 0.125773 ) ( 0.011025 0.012862 ) ( 0.300000 0.350000 )
!pc 18 0 ( 0.125773 0.127611 ) ( 0.012862 0.014700 ) ( 0.350000 0.400000 )
!pc 19 0 ( 0.127611 0.129448 ) ( 0.014700 0.016537 ) ( 0.400000 0.450000 )
!pc 20 0 ( 0.129448 0.131286 ) ( 0.016537 0.018375 ) ( 0.450000 0.500000 )
nEwindowsはエネルギー窓の総数です。nvb_windowsとncb_windowsはそれぞれ価電子状態と伝導電子状態を含むエネルギー窓の数です。この設定例では,Erange_min= -0.45 eV,Erange_max = 0.45 eV,Erange_delta = 0.05 eVなので,エネルギー窓の数は18個になるはずですが,実際には低エネルギー側および高エネルギー側にそれぞれErange_delta幅の袖領域を設けて出力するのでエネルギー窓の総数が20個になっていることに,ご注意下さい。iwはエネルギー窓の番号です。if_elec_stateはそのエネルギー窓に電子状態があるかどうかを示しています。この値が0の時は電子状態がなく,1の時には電子状態が存在します。列asisには原子単位でエネルギー窓の範囲が示されています。二つの列shiftedにはエネルギーの基準から測ったときのエネルギー窓の範囲が原子単位とeV単位で示されています。
変数partial_charge_filetypeにindividualまたはseparateを指定すると,各エネルギー窓ごとに計算された電荷密度が番号付けされたファイルに出力されます。 その際の名前の付け方は,スピン分極がない場合であれば,F_CHR = nfchr.cubeに対してnfchr.00xx.cube(xxには上の表のiwの値が入る)というようになります。スピン分極がある場合には,F_CHR = nfchr.cubeに対して,nfchr.up.00xx.cube,nfchr.down.00xx.cubeの二種類のファイルが生成されます。上の表でif_elec_stateが0になっているのは,その範囲に固有値がある状態がないことを示しています。その場合,cubeファイルは生成されません。
integratedを選択すると各電荷密度がひとつのファイルに追記され,各電荷密度データの先頭にはPARTIALCHARGEが記述され,終わりにはENDが記述されます。
BaO/Si(001)界面の部分電荷密度を計算した結果を 図 5.3 に示します。
図 5.3 BaO/Si(001)界面構造の部分電荷密度。(a)BaO/Si(001)界面構造のモデル図。(b)フェルミレベル直下(固有エネルギーが-0.05eVから0.0eVまで)の電子状態の部分電荷密度。(c)フェルミレベル直上(固有エネルギーが0.0eVから0.05eVまで)の電子状態の部分電荷密度。電子密度は\(\mathbf{1} \times \mathbf{10}^{- \mathbf{5}}\)から\(\mathbf{1} \times \mathbf{10}^{- \mathbf{3}}\)までが示されています。青い部分には電子が少なく,赤い分部には電子が多くなっています。
応用例:STM像の解析
部分電荷密度出力機能を利用すると,STM像を模擬することが可能です。解析したいバイアスポテンシャルに
対応したエネルギーウィンドウの部分電荷密度を,表面からある程度離れた平面に投影した像が計算上のSTM像です。以下,サンプルデータ( samples/stm_by_pcharge
以下)を利用して計算方法を具体的に説明します。
サンプルは,Si の(001)面に相当するデータです。通常のPHASE入力に、以下のように部分電荷密度出力の設定を加えています。
postprocessing{
charge{
sw_charge_rspace = on
filetype = cube
partial_charge{
sw_partial_charge = on
partial_charge_filetype = individual
Erange_min = 0 eV
Erange_max = 0 eV
Erange_delta = 1 eV
}
}
}
このように設定することによって,フェルミエネルギーからみて-1 eV から0 eVまでのデータと0 eV から1 eVのエネルギーウィンドウの部分電荷密度が出力されます。それぞれ,-1 V(占有状態)および1 V(非占有状態)のバイアスポテンシャルに対応したSTM像が得られます。この入力データを利用して計算を実施すると,nfchr.0001.cube (-1 eV から0 eV の電荷密度データファイル) とnfchr.0002.cube (0 eV から1 eV の電荷密度データファイル) が作成されます。それぞれ,表面から5 Å程度離れた地点でのコンター図を占有状態について 図 5.4 (a)に,非占有状態について 図 5.4 (b)に示します。

図 5.4 Si (100)面のSTM像,(a) 占有状態の像,(b)非占有状態の像。
5.1.2.5. ウルトラソフト型擬ポテンシャルを利用している場合の高速化
ウルトラソフト擬ポテンシャルを利用して局所状態密度計算する場合,非常に多くの計算時間がかかってしまうことがあります。これは欠損電荷の計算に時間がかかってしまうからなのですが,この計算を実空間で行うことによって高速化を実現することができます。欠損電荷の計算を実空間で行うには,以下のような設定を行います。
Postprocessing{
dos{
sw_dos = on
}
ldos{
sw_rspace = on
sw_aldos = on
sw_layerdos = on
aldos{
...
...
}
layerdos{
...
...
}
}
}
ldosブロックで変数sw_rspaceを定義し,その値をonとすれば欠損電荷の計算を実空間で行わせることができます。
5.1.3. 射影状態密度
PHASEには,軌道ごとに射影した状態密度を計算する機能もあります。ここでは,射影状態密度を計算する方法を紹介します。
5.1.3.1. 入力パラメータ
射影状態密度を計算するには,射影したい軌道の設定を以下のように指定します。
accuraccy{
...
projector_list{
projectors{
#tag no group radius l t
1 1 1.0 0 1
2 1 1.0 1 1
3 2 1.5 0 2
4 2 1.5 1 2
}
}
}
no に軌道の識別番号を指定します。省略可能です。groupには,“軌道グループ” を指定します。ひとまとめに扱いたい軌道には同じgroup値を指定します。radiusには軌道の半径をボーア単位で指定します。原子間距離の半分程度よりも小さな値が目安となります。デフォルト値は1 bohr です。l には,軌道角運動量を指定します。0 がs 軌道,1 がp 軌道,2 がd 軌道,3 がf 軌道に対応します。最後に,t に主量子数を指定します。ただし,この場合の主量子数とは擬ポテンシャルから見た場合の主量子数であり,ほとんどの場合1となります。擬ポテンシャルによっては角運動量が同じ軌道が2つ定義されている場合があります。2つのうちエネルギーの高い方を指定したい場合にt の値を2 としてください。
次に,定義した射影演算子を原子に割り当てます。これは,以下のように原子配置の定義において属性値proj_groupを追加して指定します。
structure{
atom_list{
atoms{
#tag element rx ry rz mobile proj_group
Fe1 0.0 0.0 0.14783 on 1
Fe2 0.0 0.0 0.35217 on 2
Fe1 0.0 0.0 0.85217 on 1
Fe2 0.0 0.0 0.64783 on 2
...
...
}
}
}
磁気量子数と軌道の性格の対応表
占有行
列の添え字
|
\(l = 0\) |
\(l = 1\) |
\(l = 2\) |
\(l = 3\) |
---|---|---|---|---|
1 |
\(s\) |
\(x\) |
\(3z^{2} - r^{2}\) |
\(z(5z^{2} - 3r^{2})\) |
2 |
\(y\) |
\(x^{2} - y^{2}\) |
\(x(5z^{2} - r^{2})\) |
|
3 |
\(z\) |
\(xy\) |
\(y(5z^{2} - r^{2})\) |
|
4 |
\(yz\) |
\(z(x^{2} - y^{2})\) |
||
5 |
\(zx\) |
\(xyz\) |
||
6 |
\(x(x^{2} - 3y^{2})\) |
|||
7 |
\(y(3x^{2} - y^{2})\) |
この例では,Fe1 にgroup が1 の軌道グループを,Fe2 にgroup が2の軌道グループを指定しています。異種元素間では異なる軌道グループを指定する必要があります。
postprocessingブロックにおいて射影演算子を計算するためのスイッチを有効にします。
postprocessing{
...
pdos{
sw_pdos = on
}
}
射影状態密度の計算方法は,postprocessing のdosブロックにおける指定に従います。
5.1.3.2. 計算結果の出力
PDOS: ia= 2 l= 1 m= 1 t= 1
No. E(hr.) dos(hr.) E(eV) dos(eV) sum
6 -1.95781 0.0000000000 -56.762838 0.0000000000 0.0000000000
16 -1.95681 0.0000000000 -56.735626 0.0000000000 0.0000000000
26 -1.95581 0.0000000000 -56.708415 0.0000000000 0.0000000000
36 -1.95481 0.0000000000 -56.681204 0.0000000000 0.0000000000
46 -1.95381 0.0085366260 -56.653992 0.0003137151 0.0000002437
56 -1.95281 0.0176460501 -56.626781 0.0006484801 0.0000254127
PDOS: という文字列から始まる行が,射影状態密度データの始まりをあらわします。ia=の後に対応する原子のID が, l=のあとに対応する軌道角運動量が,m=のあとに対応する磁気量子数が,t=のあとに対応する主量子数が出力されます。それ以降の行は,通常の状態密度データと同じです。磁気量子数と軌道の性格の対応は,表に示しています。
射影状態密度データを含んだdos.data の処理には,dos.pl に-mode=projected オプションをつけて実行します。
% dos.pl dos.data -mode=projected -color -with_fermi
実行すると、EPS 形式のファイルdos_aAAAlLmMtT.eps が出力されます。AAA は原子のID, L は軌道角運動量,M は磁気量子数,T は主量子数に対応した数字です。また, -data=yes オプションを利用すると,軌道ごとに分割された状態密度データファイルを得ることができます。そのファイル名は,EPS ファイルの拡張子をdata に変更したものとなります。
5.1.3.3. 計算例:BaTiO3 結晶の射影状態密度
BaTiO3
結晶の射影状態密度を計算した例です。
この例題は samples/dos_band/pdos/BaTiO3
以下にあります。
BaTiO3 はペロブスカイト構造をとる結晶です。厳密には正方晶ですが,立方晶に非常に近い結晶構造です。この例では,結晶構造を以下のように指定し,立方晶として設定しています。
structure{
atom_list{
atoms{
#units angstrom
#tag element rx ry rz proj_group
Ba 0.00 0.00 0.00
O 0.50 0.50 0.00 2
O 0.50 0.00 0.50 2
O 0.00 0.50 0.50 2
Ti 0.50 0.50 0.50 1
}
}
unit_cell{
#units angstrom
a_vector = 4 0.00 0.00
b_vector = 0.00 4 0.00
c_vector = 0.00 0.00 4
}
}
射影する軌道は,以下のように指定します。
accuracy{
projector_list{
projectors{
#tag no group radius l
1 1 1.0 2
2 2 1.0 1
}
}
}
グループ1 はl が2(d 軌道),グループ2 はl が1(p 軌道) であり,それぞれTi とO に割り当てています。最後に,postprocessing ブロックにおいて射影状態密度を計算する機能を有効にしています。
postprocessing{
dos{
sw_dos = on
method = tetrahedral
}
pdos{
sw_pdos = on
}
}
状態密度計算はtetrahedral 法を利用しています。したがって,k 点サンプリングはmesh 法,smearingはtetrahedral 法を指定しています。
BaTiO3 結晶の全状態密度を 図 5.5 に,Ti のd 軌道に射影した状態密度を 図 5.6 に示します。
図 5.5 BaTiO3 結晶の全状態密度
図 5.6 Ti のd 軌道の射影状態密度
5.1.4. 射影バンド構造(バージョン2020.01以降)
5.1.4.1. 機能の概要
射影状態密度 (PDOS) を求めるとき、SCFにおける各波動関数に対してprojectorで指定した原子軌道への射影を行います。同様の処理をバンド計算で得られた各波動関数に対して行うことにより、その射影成分を出力することができます。軌道射影バンド計算では、各波動関数に対して原子軌道への射影を行い、その(重み)成分をファイルに出力します。このとき、原子軌道の球面調和関数部分は空間に固定されたもので、化学結合の方向には依りません。化学結合の方向を考慮するには、軌道占有行列を対角化し、その固有ベクトルを係数とした原子軌道の線形結合を用います。ただし、軌道占有行列はバンド計算では得られないため、事前にSCF計算を行っておく必要があります。
対角化して得られた原子軌道を使用するか否かは、ユーザー指定のスイッチにより切り替えることができます。可視化については band.pl と同様に、gnuplot の描画機能を用いるperlスクリプトが付属します。このスクリプトを用いると、射影した軌道の成分を、明暗などによりバンド分散上にマップすることができます。
5.1.4.2. 使い方
入力パラメーター
SCF 計算
占有行列を計算し、ファイルに出力するには、orbital_population ブロック内で、sw_write_orb_dens_mat_file = on とします。これ以外には、PDOSと同様に、射影する軌道の指定を行います。
占有行列をファイルに出力するための入力 (軌道射影バンドの前処理)
accuracy{
projector_list{
projectors{
#tag group radius l
1 2.5 2
}
}
}
structure{
atom_list{
atoms{
#tag element rx ry rz proj_group
Ni1 0.000 0.000 0.000 1
}
}
}
postprocessing{
orbital_population{
sw_write_orb_dens_mat_file = on
}
}
バンド計算
軌道射影バンドの計算は固定電荷モードで行います。各波動関数の軌道射影成分をファイルに出力するには、wf_orb_projectionブロック内で sw_calc_wf_orb_projection = on とします。この時、占有行列を対角化して得られた軌道を使用するには、さらにorbital_populationブロック内で sw_diagonalize_population = on を指定します。
軌道射影バンド計算の入力例
accuracy{
projector_list{
projectors{
#tag group radius l
1 2.5 2
}
}
}
structure{
atom_list{
atoms{
#tag element rx ry rz proj_group key
Ni1 0.000 0.000 0.000 1 1
}
}
}
postprocessing{
orbital_population{
sw_diagonalize_population = on
}
wf_orb_projection{
sw_calc_wf_orb_projection = on
}
}
出力
SCF計算
F_PORB_DENS_MATで指定したファイル (デフォルト名:porb_density_matrix.data ) に、占有行列がバイナリ形式で出力されます。
バンド計算
F_WFK_ORB_PROJ で指定したファイル (デフォルト名:wfn_orb_proj.data ) に、各波動関数の軌道射影成分がテキスト形式で出力されます。key は、表 5‑2のkey値が対応する。また、score_bond は、軌道が広がる方向に原子が存在するか否かを判定した値です。ここで、m番目の軌道のscore_bondは、
で定義します。例えば、8面体サイトの中央原子のd軌道では、score_bond値 が 0 の軌道がt2g に対応します。
PBAND計算の出力例
# Orbital Projection for bands
num_kpoints = 88
num_bands = 40
nspin = 2
num of orbitals = 16
population_diag_mode = 1
# Orbital Info.
iorb ia l m' tau element key score_bond
1 1 2 1 1 Ni1 1 3.00000
2 1 2 2 1 Ni1 1 3.00000
(中略)
=================
ik = 1 ( -0.00000000 0.50000000 0.50000000 )
1 1 2 1 1 : iorb, ia, l, m', tau
0.0000000000 0.0291274666 0.0000000292 0.6901602135
(後略)
スクリプトの利用による可視化
band-orbital-proj.pl を用いると、gnuplotを用いて可視化したファイルが生成されます。以下にその使用法を示します。このスクリプトは、ユーザーが指定した条件を満たす軌道射影成分を合計して、ファイルplot_band_orbproj.datに出力します。同時に生成されるplot_band_orbproj.gnu は gnuplot 用のファイルです。
band-orbital-proj.plの引数
band-orbital-proj.pl EnergyDataFile KpointFile OrbProjFile
-erange=Emin,Emax -einc=dE -with_fermi
-atom_range=amin,amax -il=L -im=M -tau=TAU
-element=X -key=I -score_range=scmin,scmax
-cbrange=Cbmin,Cbmax -circle_radius=SIZE -window_width=SIZE
-color -print_format={eps,png} -outfile=AAA
EnergyDataFile はバンド固有値ファイル、KpointFile はk点を生成するために使用したファイル、OrbProjFile は上述の軌道射影成分を格納したファイルです。これらの3ファイルの指定は必須です。
オプション |
意味 |
デフォルト値 |
---|---|---|
-erange=Emin,Emax |
プロットするエネル ギー領域を指定する。 |
なし |
-einc=dE |
図の縦軸の increment を指定する。 |
なし |
-with_fermi |
フェルミエネルギー ( 0.0 eV )の位置に線を引く。 |
なし |
-atom_range=amin,amax |
全軌道射影成分の うち、原子のインデッ クスがaminからamaxま での成分を取り出す。 |
全原子 |
-il=L |
全軌道射影成分 のうち、軌道量子数が Lの成分を取り出す。 |
全軌道量子数 |
-im=M |
全軌道射影成分 のうち、磁気量子数が Mの成分を取り出す。 |
全磁気量指数 |
-tau=TAU |
全軌道射影成 分のうち、主量子数が T AUの成分を取り出す。 |
全主量子数 |
-element=X - |
全軌道射影成分のうち 、原子タイプ名がXで ある成分を取り出す。 |
全原子タイプ |
-key=I |
全軌道射影 成分のうち、key値が Iの成分を取り出す。 |
全key |
-score_range=scmin,scmax |
全軌道射影成 分のうち、score_bond 値がscminからscmaxま での成分を取り出す。 |
制限なし |
-cbrange=Cbmin,Cbmax |
プロットするカラ ーレンジを指定する。 |
なし |
-circle_radius=SIZE |
プロットするデー タの半径を指定する。 |
0.02 |
-window_width=SIZE |
プロットするWindow のサイズを指定する。 |
0.50 |
-color |
カラー出力を行う。 |
NO |
-print_format={eps,png} |
eps あるいは png 出力のいず れを行うか指定する。 |
eps |
-outfile=AAA |
可視化したファイル 名をAAAに指定する。 |
epsファイルの時は orbital _projected_band.eps, png ファイルの時は orbita l_projected_band.png |
以下に、band-orbital-proj.plの使用例を示します。この例では、key値1、il=2 (d軌道)、score_bond値が 0 から1の軌道射影成分を合計し、plot_band_orbproj.datに出力します。さらに、gnuplotを通して png ファイル orbital_projected_band.pngを生成します。なお、nfenergy.data はバンド固有値ファイル、bandkpt.in はk点を生成するために使用したファイル、wfn_orb_proj.dataは軌道射影成分を出力したファイルです。
band-orbital-proj.plの使用例
band-orbital-proj.pl nfenergy.data bandkpt.in wfn_orb_proj.data
-key=1 -il=2 -score_range=0,1 -color -print_format=png
5.1.4.3. 例題
射影バンド構造の計算例を紹介します。入力(と出力の一部)は samples/dos_band/PBAND
以下にあります。
MoS2 / WS2
図 5.7 (左) に、MoS2 / WS2 の構造を示します。また、用いた計算条件を 表 5.2 に示します。格子定数は、事前に最適化して得られた値a = 3.232 Å, c = 12.417 Åを使用しました。
また、PBAND計算のために、MoS2 及びWS2のユニットにそれぞれkey 値1, 2 を与え、射影軌道を 表 5.3 のように指定しましたた。表 5.4 に、postprocessingブロック内で使用したワードを示します。 最後に、 図 5.7 にブリルアンゾーン及び対称点を示します。
波動関数カットオフ [Ry] |
25 |
電荷密度カットオフ [Ry] |
225 |
k点サンプリング |
SCF計算 Monk (6×6×1) |
交換相関相互作用 |
GGAPBE |
擬ポテンシャル |
Mo_ggapbe_paw_02.pp, W_ggapbe_paw_01.pp, S_ggapbe_paw_03.pp |
原子タイプ |
射影した軌道 (プロジェクタのカットオフ) |
---|---|
Mo |
s軌道 (2.0 bohr), p軌道 (2.0 bohr), d軌道 (2.4bohr) |
W |
s軌道 (2.0 bohr), p軌道 (2.0 bohr), d軌道 (2.4bohr) |
S |
s軌道 (1.6 bohr), p軌道 (1.8 bohr) |
SCF計算 |
なし |
バンド計算 |
wf_orb_projection{ sw_calc_wf_orb_projection = on } |

図 5.7 (左)MoS2 / WS2 構造。(右)ブリルアンゾーン及び対称点。
図 5.8 図 5.9 に MoS2 及び WS2ユニットに対するPBAND を示します。ここでは、s, p, d 軌道全成分を合計して表示しています。表 5.5 に、図 5.8 に使用したコマンドを示します。

図 5.8 MoS2構造のPBAND

図 5.9 WS2構造のPBAND
band-orbital-proj.pl nfenergy.data bandkpt.in wfn_orb_proj.data -key=1 -with_fermi -erange=-5,5 -einc=1 -cbrange=0.00,0.01 -color -print_format=png -outfile=Key1.png |
NiO
表 5.6 に用いた計算条件を示します。なお、原子配置や格子定数、k点座標は既存のサンプルに記載の値を流用しました。 表 5.7 に、postprocessingブロック内で使用したワードを示します。 図 5.10 図 5.11 に、Ni 3d 軌道の t2g 及び eg 成分のプロットを示します。
波動関数カットオフ [Ry] |
25 |
電荷密度カットオフ [Ry] |
225 |
k点サンプリング |
SCF計算:Monk (4×4×4) |
交換相関相互作用 |
GGAPBE+U ( Ueff = 5.0eV on Ni 3d, プロジェクタカットオフ:2.5 bohr ) |
擬ポテンシャル |
Ni_ggapbe_paw_01.pp, O_ggapbe_paw_02.pp |
SCF計算 |
orbital_population{ sw_write_orb_dens_mat_file = on } |
バンド計算 |
orbital_population{ sw_diagonalize_population = on } wf_orb_projection{ sw_calc_wf_orb_projection = on } |

図 5.10 NiO のPBAND。Ni d 軌道 t2g。左右はそれぞれ、アップ及ぶダウンスピン成分に対応する。

図 5.11 NiO のPBAND。Ni d 軌道 eg。左右はそれぞれ、アップ及ぶダウンスピン成分に対応する。
t2g |
band-orbital-proj.pl nfenergy.data bandkpt.in wfn_orb_proj.data -atom_range=1,2 -il=2 -score_range=0,1 -erange=-4,6 -color -print_format=png -outfile=band_t2g.png |
eg |
band-orbital-proj.pl nfenergy.data bandkpt.in wfn_orb_proj.data -atom_range=1,2 -il=2 -score_range=2,4 -erange=-4,6 -color -print_format=png -outfile=band_eg.png |
5.1.5. ワニエ関数
5.1.5.1. 機能の概要
電子状態は結晶全体に広がったブロッホ波と呼ばれる波として表されます。ブロッホ波をk空間に関してフーリ エ変換することにより得られる局在した関数をワニエ関数と呼びます。ワニエ関数の中心位置は電子分布の平均 位置を表すため,その和から結晶の分極を容易に知ることができます。また,ワニエ関数の2乗は電子の分布を 表すため,化学結合に関する知見が得られます。 一般にワニエ関数は一意に定まりません。ワニエ関数の広がりが最小になるように変換することにより得られ る,一意に定まる関数を最大局在ワニエ関数といいます。
最大局在ワニエ関数はワニエ関数の広がりを表す汎関数(広がり汎関数)を最小にするようにブロッホ波をユ ニタリー変換して求めます。広がり汎関数はユニタリー変換行列の関数で,広がり汎関数をユニタリー変換行列 に関して微分して得られる行列はワニエ関数の広がりを狭めるユニタリー変換の方向になっています。この方向 にわずかにユニタリー変換していくことで,ワニエ関数の広がりを最小にすることができます。
5.1.5.2. 計算例:Siの最大局在ワニエ関数
最大局在ワニエ関数を計算するには,PostprocessingでWannier 関数を計算することを指定します。
Postprocessing{
wannier{
sw_wannier = ON
eps_grad = 1.d-3
dt = 1.d-4
max_iteration = 1000
filetype = cube
}
}
汎関数の勾配の大きさがeps_grad 以下になったら計算は終了します。dt は最急降下法の仮想的な時間刻みです。 繰り返しがmax_iteration を超えたら計算は停止します。ワニエ関数の出力ファイルはGauusian cube形式に指定します。ワニエ関数のファイルの拡張子がcube になるように,以下のよう にfile_names.data にファイルポインタF_WANNIER を記述します。
&fnames
F_INP = './nfinput.data'
F_POT(1) = './Si_ldapw91_nc_01.pp'
F_WANNIER = './nfwannier.cube'
/
この機能は\(\Gamma\)点のみの計算でしか使用できません。
ksampling{
method = gamma
}
また,並列計算には対応していません。並列計算で収束した結果を得ている場合は,非並列の継続処理としてワニエ関数の計算をしてください。
Si のワニエ関数の計算例題は、 samples/wannier/Si8
です。計算を実行すると,ワニエ関数の出力として、nfwannier.00001.cube
といったファイルが16 個出力されます。それらの一つを可視化した結果を 図 5.12 に示します。最大ワニエ関数はSi-Si
結合間に局在していることがわかります。これは,Si
結晶の結合が共有結合であることを示しています。

図 5.12 Si 結晶(a)とGaAs 結晶(b)の最大局在ワニエ関数
期待しない局所極小に収束してしまうことがありますが,sw_random_wannier をON にしてランダムな状態から計算を始めることでこの問題が解決できることがあります。
Postprocessing{
wannier{
...
sw_randomize = ON
...
}
}
また,収束が不十分な状態で計算が終了しているようでしたら,sw_continue をON にして計算を継続してください。
Postprocessing{
wannier{
...
sw_continue = ON
...
}
}
5.1.5.3. Wannier90を用いたワニエ関数解析
機能の概要
Wannier90プログラム(http://www.wannier.org/) と連携することによってワニエ関数を出力することも可能です。Wannier90プログラムと連携することによって,PHASEに組み込まれたワニエ関数解析機能では実施することのできない,以下の計算を行うことが可能です。
Γ点だけでなく,一般のk点サンプリングでワニエ関数を出力することが可能
ワニエ補間により,バンド構造を得ることが可能
ワニエ補間により,フェルミ面や逆空間における等エネルギー面の描画が可能
ここでは,PHASEをWannier90と連携させて上記のような計算を行う方法を説明します。本機能を利用する場合は,上述のウェブサイトからWannier90プログラムを入手し,コンパイル作業を行っておいてください。
計算方法
Wannier90と連携して解析を行うには,以下のような処理を行います。Wannier90の入力ファイル作成方法は,Wannier90のユーザーマニュアルを参照してください。
Wannier90の入力データを作成します。ファイル名はseedname.winとします。seednameは任意の文字列で,系の名前などを指定します。
Wannier90を,以下のように“プリプロセスモード”で実行します。
% wannier90.x -pp seedname
この作業によって,Wannier90が必要とするデータの情報を記録したファイルが作成されます。このファイルの情報をもとにPHASEの入力ファイルを作成します。
PHASEの入力パラメータファイルを作成します。格子定数やk点サンプリングをWannier90の入力に合わせて編集します。その具体例は例題において紹介します。さらに,postprocessingブロックに以下を追記します。
postprocessing{
wannier{
seedname = "seedname"
sw_wannier90 = on
nb_wan90 = wannier90で利用するバンド数
}
}
変数seednameに上述のseednameを二重引用符で指定します。sw_wannier90をonとすることによってWannier90が必要とするファイルを出力することができます。nb_wan90には,Wannier90で利用するバンド数を指定します。PHASEのバンド数以下の数値にする必要があります。
PHASEを通常通り実行します。その結果,Wannier90が必要とする行列要素データや固有値データの記録されたファイルが得られます。ただし,Wannier90が利用するデータの出力は非並列計算で行う必要があるので,並列計算をしたい場合はひとまずsw_wannier90をoffとして計算を収束させたあとにsw_wannier90をonとし,非並列の継続計算でWannier90用の出力を行います。
Wannier90を実行します。
% wannier90.x seedname
その結果,Wannier90のログ出力やワニエ関数データのほか,Wannier基底のタイトバインディングハミルトニアンデータなどが得られます。seedname.winの設定によっては,そのほかバンド構造やフェルミ面を構築するために必要なデータ,1次元伝導解析の結果なども得られます。
ワニエ補間
wan_interpプログラムは,ワニエ補間を行ってバンド構造やフェルミ面の計算を行うプログラムです。そのソースコードは,src_wan_interp以下にあります。コンパイルするにはこのディレクトリーへ移り,コンパイル用のシェルスクリプト,make.sh中のFortran90コンパイラーとLAPACKライブラリーの設定を行ったあとmake.shを実行してください。なお,ワニエ補間によるバンド構造やフェルミ面の計算は,Wannier90本体によって実施することも可能です。その方法は,Wannier90のユーザーマニュアルを参照してください。Wannier90によって行う場合は,band.plによるバンド構造図の作成やPHASE-Viewerによるフェルミ面の描画などは行えません。
wan_interpプログラムは,以下のファイルを必要とします。
seedname_hr.datファイル:Wannier90プログラムによって出力される,ワニエ基底のタイトバインディングハミルトニアンデータです。
seedname.nnkpファイル:Wannier90が必要とするデータを作成するために必要な情報が記録されたファイルです。Wannier90を“プリプロセスモード”で実行すると得られるファイルです。
kpoint.dataファイル:計算したいk点の情報が記録されたファイル。データフォーマットは,PHASEの標準のkpoint.dataファイルのフォーマットです。その作成方法は,バンド構造図の場合はバンド計算の項を,フェルミ面の場合はPHASE-Viewerユーザーマニュアルの逆空間ビューアーの項を参照してください。
nfefermi.dataファイル:フェルミエネルギーの値が記録されたファイルです。PHASEから出力されますので,wan_interpプログラムを実行するディレクトリーにコピーしておいてください。
fs.dataファイル(フェルミ面の場合):PHASE-Viewerがフェルミ面を描画する際に利用する補助データが記録されたファイルです。PHASE-Viewerの手続きによってフェルミ面用のk点データファイルを作成した場合自動的に作成されます。
以上のファイルを揃えたら,つぎの要領で実行します。
% wan_interp seedname
計算例題
具体例として,GaAs結晶のケースを説明します。この例題の入力ファイルは, samples/wan90/GaAs
以下にあります。
ワニエ関数の出力
まず,Wannier90を以下のように実行します。
% wannier90.x –pp gaa
この操作によって,必要な情報がgaas.nnkpというファイルに出力されます。このファイルの記述をもとにPHASEの入力ファイルを作成します。
まず,gaas.nnkpファイルには次のような書式で単位胞の情報がÅ単位で記述されます。
begin real_lattice
0.0000000 2.8265001 2.8265001
2.8265001 0.0000000 2.8265001
2.8265001 2.8265001 0.0000000
end real_lattice
この指定に従い,PHASEの入力パラメーターファイルの単位胞の指定は以下のようになっています。
structure{
unit_cell{
#units angstrom
a=5.653, b=5.653, c=5.653
alpha=90, beta=90, gamma=90
}
symmetry{
tspace{
lattice_system = facecentered
}
}
}
この例では,ブラベー格子を利用して単位胞の指定を行っています。GaAsは面心立方格子なので,lattice_systemパラメーターにfacecenteredが指定されています。
また,gaas.nnkpにおいてはk点サンプリングの方法が次のように指定されています。
begin kpoints
64
0.00000000 0.00000000 0.00000000
0.00000000 0.00000000 0.25000000
0.00000000 0.00000000 0.50000000
0.00000000 0.00000000 0.75000000
0.00000000 0.25000000 0.00000000
0.00000000 0.25000000 0.25000000
0.00000000 0.25000000 0.50000000
…
…
end kpoints
この通りに指定するため,PHASEの入力ファイルにおいては以下のようにk点サンプリングを“直接指定モード”を利用して指定しています。
accuracy{
ksampling{
method = directin
kpoints{
#tag kx ky kz denom weight
0 0 0 4 1
0 0 1 4 1
0 0 2 4 1
0 0 3 4 1
0 1 0 4 1
0 1 1 4 1
0 1 2 4 1
…
…
}
}
}
“method=directin”によってサンプルするk点を直接指定することが可能です。kpointsテーブルにおいて,kx, ky, kz, denom,weightによってk点を指定します。k点の座標は(kx/denom, ky/denom, kz/denom),その重みがweightです。
Postprocessingブロックでは,Wannier90用の出力を行う設定が施されています。
postprocessing{
wannier{
seedname = "gaas"
sw_wannier90 = ON
nb_wan90 = 8
}
}
Wannier90用の出力は非並列計算で行う必要があるので,並列計算をしたい場合はひとまずsw_wannier90をoffとして計算を収束させたあとにsw_wannier90をonとし,継続計算で非並列の計算を行い,Wannier90用の出力を行います。
PHASEを実行し,Wannier90用のデータが得られたら,Wannier90を-ppをつけずに行します。
% wannier90.x gaas
Wannier90による計算が終了すると,gaas_00001.xsf, gaas_00002.xsf,… などのファイルが作成されますが,これはXCrysDenプログラム(http://www.xcrysden.org/)を利用して可視化することのできるワニエ関数データです。XCrysDenプログラムを利用すればワニエ関数を可視化することができますが,PHASE-Viewerによって可視化を行う場合はGaussian cube形式に変換する必要があります。この作業は,PHASEパッケージに含まれるconv.pyというPythonスクリプトを利用することによって実現することができます。図 5.13 に,本例題によって得られるワニエ関数をXCrysDenで可視化した図を示します。

図 5.13 GaAsのワニエ関数
ワニエ補間
Wannier90には,計算したワニエ関数を基底にタイトバインディングハミルトニアンを構築する機能が備わっており,この機能を利用することによって通常の方法よりも少ない計算量でバンド構造やフェルミ面,等エネルギー面などの描画などを行うことが可能です。この作業は,wan_interpプログラムを利用して行います。この例では,GaAsの伝導体下端付近の等エネルギー面を描画する方法を紹介します。
等エネルギー面の描画に必要なデータを計算するためには,PHASE-Viewerの“逆空間ビューアー”を利用します。その方法はPHASE-Viewerユーザーマニュアルを参照してください。“逆空間ビューアー”によってkpoint.dataファイルが作成されるので,このファイルと,ワニエ関数計算によって得られたgaas.nnkpファイル,gaas_hr.datファイルのほか,PHASEによって得られたnfefermi.dataファイルを一つのディレクトリーにまとめ,そのディレクトリーにおいてwan_interpプログラムを実行します。
% wan_interp gaas
すると,ワニエ補間によってkpoint.dataファイルに記録されたk点の固有値データが計算され,nfenergy.dataというファイルに記録されます。得られたファイルを,“逆空間ビューアー”によってkpoint.dataファイルを作成したディレクトリーにコピーします。以上の作業で等エネルギー面を描画するための準備は完了です。得られた伝導体下端付近の等エネルギー面をPHASE-Viewerで可視化した図 図 5.14 に示します。

図 5.14 GaAs結晶の伝導体下端の等エネルギー面
使用上の注意
ワニエ関数出力は,非並列計算で行う必要があります。並列計算を行う場合はひとまずsw_wannier90をoffとして計算を収束させたあとにsw_wannier90をonとし,非並列の継続計算でWannier90用の出力を行ってください。
本機能で利用できる擬ポテンシャルは,ノルム保存型のみです。
5.1.6. XPS解析
5.1.6.1. 機能の概要
X線光電子分光(X-ray Photoemission Spectroscopy, XPS)解析の擬ポテンシャル法による第一原理計算は、内殻正孔(Core Hole)を含む原子の擬ポテンシャルを用いて、内殻準位シフト(Core Level Shift, CLS)を計算します。
内殻準位シフト
内殻準位とは原子の深い電子準位のことであり,化学結合には寄与しないくらい原子に 強く局在したものです。 例えばシリコン原子の場合,14個の電子は\((1s)^{2}(2s)^{2}(2p)^{6}(3s)^{2}(3p)^{2}\) のように5個の準位を占有しますが,この中で\(1s\),\(2s\),\(2p\)が内殻準位です。相対論的なシリコン原子の電子準位をCIAOでGGA計算すると
Energy levels [All-electron]
Element ---> Si
-----------------------------------------------------------------------
symm j Energy (Ha) Energy (eV) nocc focc
-----------------------------------------------------------------------
1s 1/2 -65.6258330748 -1785.7697073691 2 2.00000
2s 1/2 -5.1250077353 -139.4585506190 2 2.00000
2p 1/2 -3.5260321902 -95.9482139488 2 2.00000
2p 3/2 -3.5022484901 -95.3010265676 4 4.00000
3s 1/2 -0.3967820153 -10.7969875601 2 2.00000
3p 1/2 -0.1503011244 -4.0899015276 2 2.00000
3p 3/2 -0.1491437813 -4.0584086215 4 0.00000
-----------------------------------------------------------------------
Total number of electrons 14.00000
-----------------------------------------------------------------------
となり、内殻準位は化学結合の目安である数eVより圧倒的に深いことがわかります。 そのため内殻準位の波動関数は隣接した原子と重なりを持たず,エネルギー分散 の無い離散準位を生じます。
シリコン原子の内殻準位を観測する手段として 100~130 eVの軟X線領域の単色光を照射し,放出される光電子の運動エネルギーを測定する実験方法があります [Landemark92] 。 ちなみに,エネルギー可変の単色光は加速器のアンジュレータから放射されたシンクロトロン放射光を用います。 上記のSi原子の電子準位を参考にすれば,この方法では\(2p\)準位から放出される光電子に着目していることがわかります。 \(2p\)準位はスピン軌道相互作用のために\(2p_{3/2}\)と\(2p_{1/2}\)に\(0.64\) eV程度分裂します。
光電子放出の理論からよく知られているように,照射光のエネルギーを\(\text{hν}\)とすれば放出される光電子の運動エネルギー\(E_{\text{kin}}\)は
(5.1)\[E_{\text{kin}} = h\nu - W - (E_{F} - E_{c})\]
となります。 ここで,\(W\)は仕事関数,\(E_{F}\)はFermi準位,\(E_{c}\)は内殻準位です。 一般に結晶表面では電子のしみ出しによる電気二重層が形成されるため, 内殻電子の感じるポテンシャルは表面から外側になればなるほど浅くなります。そのため,内殻準位も表面では浅くなります。この関係を模式的に示したのが 図 5.15 です。 その他,化学結合にともない原子のポテンシャルが上下するので, 内殻準位はこれに連動した効果も受ける。 この2つの効果のため内殻エネルギー準位\(E_{c}\)は原子により異なる値をとります。 内殻準位シフトの実験では,表面から十分内部に入ったバルク位置 の原子による内殻準位を基準にして表面付近の化学結合が異なる原子の内殻準位の エネルギーの差を測定することにより,表面付近の原子の化学結合状態や構造を推定します。
図 5.15 光電子放出過程のエネルギープロファイル:図の右側が結晶表面,左側がバルクである。Fermi準位\(\mathbf{E}_{\mathbf{F}}\)は一定であるのに対して,内殻準位\(\mathbf{E}_{\mathbf{c}}\)は原子により異なり,表面付近ではバルクにくらべて内殻準位が浅くなる。
さて,内殻準位シフトを第一原理計算するためには,(5.1) によれば 個々の原子の内殻準位\(E_{c}\)を計算します。 このエネルギー値\(E_{c}\)は内殻電子も扱う全電子計算を行えば直ちに得られますが, 価電子のみを扱う擬ポテンシャル法からは得られません。 この理由から,擬ポテンシャル法では計算できないと思われますが,この問題を見事に解決したのがSchefflerのグループ [Pehlke93] です。 Schefflerらは 図 5.16 に示したように, 始状態(initial state)と終状態(final state)の違いに着目しています。
図 5.16 光電子放出過程の始状態と終状態:(I)はバルク位置の原子による光電子放出,(II)は表面付近の原子による光電子放出を表している。始状態(initial state)では,入射光(\(\mathbf{\text{hν}}\))と結晶が存在するのみなので(I)と(II)は同じ状態である。終状態(final state)では,放出された光電子の運動エネルギー\(\mathbf{E}_{\mathbf{\text{kin}}}\)と内殻正孔(赤丸)1個をもった結晶の全エネルギー\(\mathbf{E}_{\mathbf{\text{tot}}}\)は(I)と(II)で異なるが,和\(\mathbf{E}_{\mathbf{\text{kin}}} + \mathbf{E}_{\mathbf{\text{tot}}}\)は等しい。
図 5.16 では,光電子が放出される原子の位置が異なる2つの場合 を示しています。(I)は原子がバルク位置にある場合,(II)は原子が表面付近にある場合です。 始状態では,考えている系には入射光(\(\text{hν}\))と結晶が存在するのみなので(I)と(II)は同じ状態です。 一方,終状態では,系には放出された光電子(運動エネルギー\(E_{\text{kin}}\))と 内殻正孔(赤丸)が残された結晶(全エネルギー\(E_{\text{tot}}\))が存在します。 内殻正孔とは,光電子が放出される前に占有していた内殻準位に残された電子のぬけがらです。 (I)と(II)では\(E_{\text{kin}}\)と\(E_{\text{tot}}\)はそれぞれ異なるが, 始状態が同一ということから,終状態の系の全エネルギーも同じ値にならなければ ならないという次の重要な関係式が導かれます。
内殻準位シフト\(\Delta E_{\text{kin}}\)を次式で定義します。
ゆえに,(5.2) を用いれば
(5.4)\[\Delta E_{\text{kin}} \equiv E_{\text{tot}}(\rm{I}) - E_{\text{tot}}(\rm{II}) = - \Delta E_{\text{tot}}\]
が得られます。 (5.2) の右辺は擬ポテンシャル法でも計算することができます。 Schefflerら [Pehlke93] はこの考えに基づきSi(100)表面の表面内殻準位シフトを 擬ポテンシャル法で計算し,Landemarkらの実験結果 [Landemark92] を理論的に説明しています。 内殻準位\(E_{c}\)と結晶の全エネルギー\(E_{\text{tot}}\)との関係は,(5.1) により
(5.5)\[\Delta E_{\text{kin}} = \Delta E_{c}\]
が成り立つので,(5.4) と比較して
(5.6)\[\Delta E_{c} = - \Delta E_{\text{tot}} (6)\]
が導かれます。
図 5.17 内殻光電子放出のスペクトル
実験的に得られる情報を模式的に表すと 図 5.17 に示したようなスペクトルです。 ここでは,電子間クーロン相互作用によるオージェ過程は考えません。 横軸は光電子の運動エネルギー\(E_{\text{kin}}\),縦軸は光電子数(強度)です。 また,横軸は内殻準位の結合エネルギー\(E_{\text{bind}}\)とみることもできて,この場合は左側ほど結合が強くなっています。 結晶バルクからの光電子スペクトルは赤色で示したように\(E_{\text{kin}}(I)\)に唯一のピークをもちます。 これに対して,結晶表面付近からの光電子スペクトルは青色で示したようにいくつかの ピーク\(E_{\text{kin}}(II)\)に分かれます。 各ピークの強度はそのピークに関係した原子数の比から定まります。 電気二重層の効果のためピーク位置は通常右側にずれます。 光電子は結晶内部の非弾性散乱でエネルギーを失うので,バルクのピークは結晶表面から せいぜい数nm程度の深さの原子によるものであることを注意してください。 計算できるものは,バルク位置からピーク位置のずれと 各ピークの相対的な強度です。
内殻正孔を含む原子の擬ポテンシャル
第一原理擬ポテンシャルバンド計算法では,内殻電子状態を凍結させ,価電子状態を 自己無撞着に計算します。そのためバンド計算の段階では内殻に正孔を生じさせることができません。そのかわり内殻正孔を含む擬ポテンシャルを作成することは可能です。 Schefflerら [Pehlke93] は,光電子放出時に生成された内殻正孔はまわりの電子によりすみやかに遮蔽(screening)されるものと仮定しました。しかし,格子を変形させるだけの 時間はないとしています。また,電子はドープされた不純物から無尽蔵に補給される,すなわちFermi面は不純物準位にピンニングされる,と考えて電気的に中性が保たれているものとしています。これらの仮定により計算されたスペクトルは実験結果とよく一致しています。
以上の考え方に従えば,内殻正孔を含む原子の擬ポテンシャルを次のように作成します。 例えば\(2p\)準位に内殻正孔を含むシリコン原子の場合,
14個の電子からなる\((1s)^{2}(2s)^{2}(2p)^{6}(3s)^{2}(3p)^{2}\)の電子配置の 中性シリコン原子において,\(2p\)準位の電子1個を\(3p\)準位に移動して \((1s)^{2}(2s)^{2}(2p)^{5}(3s)^{2}(3p)^{3}\)とした励起状態の中性シリコン原子を考える
その原子の全電子計算を自己無撞着におこなう
価電子として\((3s)^{2}(3p)^{3}\)の5個の電子をはがしてイオン化する
このようにして,内殻正孔を有し5価にイオン化したシリコン原子の擬ポテンシャルができる
とします。 これは 図 5.18 の2つの終状態(final state)のうち 右側のscreened hole(遮蔽正孔)に対応します。
スカラー相対論での擬ポテンシャル計算では,内殻準位のスピン軌道分裂は考慮せず 縮重度に対して重み平均をとったものを内殻準位とします。 内殻準位のシフト量の計算では,この仮定により結果は変わりません。
図 5.18 Si原子の電子配置:左図は基底状態の電子配置,右図は内殻正孔が生じた場合の終状態の電子配置である。
5.1.6.2. 計算の実行方法
内殻正孔を含む原子の擬ポテンシャルを用いて内殻準位シフトを バンド計算します。
バンド計算は次のように行います。
シリコン表面の座標を作成し,通常のシリコン擬ポテンシャルを用いて 各原子に力が働かなくなるまで十分に格子緩和させる
その座標を用いて,原子1個を内殻正孔を含む擬ポテンシャルに置き換えて 全エネルギーを計算する
すべての原子に対して順番に置き換えて全エネルギーを計算する
バルク位置の原子を決めて,これを基準にして他の配置の全エネルギーの差をとり,運動エネルギーのシフト量を計算する
強度を含めたスペクトルとして表示する
5.1.6.3. 計算例:Si(100)表面
Si(100)表面のモデル
まずはじめに,Si(100) \(p(2 \times 2)\)再構成表面のモデルを作成します。 Si(100)表面はダングリングボンド数を減らすためダイマー構造をとり, それらのダイマーは列方向に交互に傾くこと(バックリング)で安定化することが知られています。 この時,バックリングに連動してダイマーの低い方から高い方に電子が移動します。 実験的にはSi(100) \(c(4 \times 2)\)構造が安定となるが,計算ではバックリングの性質が 似通った\(p(2 \times 2)\)構造を扱います。この方が計算量を減らせるからです。 この仮定はSchefflerら [Pehlke93] と同様です。
図 5.19 Si(100)表面のモデル:表面平行方向の周期は\(\mathbf{2} \times \mathbf{2}\)(左図),深さ方向は8層(右図)のモデルを採用する。8層めと9層目の中間に反転中心を考えているので,実際の計算では全部で16層64原子のスラブモデルとして扱う。単位胞の等価でない各原子に\(\mathbf{1}\mathbf{u}\),\(\mathbf{1}\mathbf{d}\),\(\mathbf{2}\),\(\mathbf{3}\mathbf{u}\),\(\mathbf{3}\mathbf{d}\),などのラベルをつける。
出発点の表面モデルは安定構造となってなければならず,十分に格子緩和します。原子に働く力の最大値を\(5 \times 10^{- 4}\)程度以下に抑えるのに長時間を要しました。 図 5.19 は格子緩和されたされた後の安定構造を表示しています。 計算条件は(原子単位), 擬ポテンシャル:Si_ggapbe_nc_01.pp, 交換相関ポテンシャル:GGA-PBE, カットオフエネルギー:\(k_{c}(wf) = 3.5\), \(k_{c}(chg) = 7.0\), ユニットセル:\(a_{1} = 14.6816015290\),\(a_{2} = 14.6816015290\),\(a_{3} = 60.0000000000\), \(k\)点:\(4 \times 4 \times 1\),です。 その結果,緩和された座標と力は以下のようになります。
x y z fx fy fz
1 11.654665468 7.340800747 19.731672033 -0.000108 0.000000 0.000136
2 10.943522273 0.000000002 18.308554343 -0.000156 0.000000 -0.000260
3 7.408260709 7.340800738 18.308043049 0.000156 0.000000 -0.000288
4 6.696493833 -0.000000008 19.730653256 0.000095 0.000000 0.000136
5 12.644826676 10.798805752 16.929970763 -0.000186 -0.000125 -0.000051
6 12.644826664 3.882795799 16.929970692 -0.000187 0.000125 -0.000052
7 5.707073513 11.223532172 16.928492210 0.000184 0.000135 -0.000066
8 5.707073576 3.458069376 16.928492250 0.000184 -0.000135 -0.000066
9 9.176755229 11.011875138 14.003484695 0.000002 -0.000042 -0.000291
10 9.176755074 3.669726457 14.003484706 0.000002 0.000042 -0.000291
11 1.834472402 11.011012299 14.542706201 -0.000005 -0.000002 0.000195
12 1.834472400 3.670589245 14.542706195 -0.000005 0.000002 0.000196
13 9.235196168 7.340800802 11.460786586 0.000018 0.000000 -0.000178
14 9.118076207 0.000000001 11.459447663 -0.000002 0.000000 -0.000198
15 1.882358440 7.340800774 11.863174990 0.000085 0.000000 0.000607
16 1.785205792 -0.000000009 11.863763387 -0.000075 0.000000 0.000566
17 12.980433730 7.340800764 9.066215802 0.000364 0.000000 -0.000060
18 12.895937822 0.000000005 9.076888750 0.000103 0.000000 -0.000067
19 5.455961640 7.340800779 9.081857152 -0.000145 0.000000 -0.000096
20 5.370066620 -0.000000012 9.069872950 -0.000307 0.000000 0.000025
21 12.895952884 11.013570694 6.478028955 0.000077 -0.000071 0.000099
22 12.895952919 3.668030852 6.478029019 0.000078 0.000071 0.000099
23 5.455699091 11.008682705 6.484530647 -0.000072 0.000047 0.000112
24 5.455699061 3.672918843 6.484530696 -0.000072 -0.000047 0.000112
25 9.172291984 11.011379982 3.920759253 -0.000013 -0.000002 0.000122
26 9.172291976 3.670221565 3.920759374 -0.000013 0.000002 0.000122
27 1.838705787 11.010982242 3.857185244 0.000014 0.000000 -0.000054
28 1.838705789 3.670619311 3.857185195 0.000014 0.000000 -0.000053
29 9.176000956 7.340800765 1.297682500 -0.000017 0.000000 0.002104
30 9.176000956 0.0 1.297682500 0.000472 0.000000 0.002118
31 1.835200191 7.340800765 1.297682500 -0.000774 0.000000 -0.002772
32 1.835200191 0.0 1.297682500 0.000325 0.000000 -0.002761
ここでは,反転対称を考えて半分の32原子の結果を示しています。 第8層の4個の原子(29番~32番)は結晶がつぶれないように固定したので力が発生しています。
表面内殻準位シフトの計算
次に,表面内殻準位シフト(Surface Core Level Shift, SCLS)の計算を行います。 格子緩和された表面モデルの原子位置を固定したまま,シリコン原子を順に 内殻正孔を含む擬ポテンシャルに置き換えて全エネルギーを計算します。
この結果を図 5‑18に示します。 縦軸は光電子の運動エネルギー(単位はeV)のバルクからのずれです。 この場合,バルクを\(3_{u}\)位置の原子にとっています。 光電子は結晶内部で非弾性散乱されるので,あまり深い位置の原子からの 光電子は実験的に観測されません。観測されるのは表面から数nmといわれています。 このため,バルクを\(3_{u}\)位置としたことは正当であると考えられます。 その他,\(3_{u}\)と\(3_{d}\)の中間にとる方法も考えられるが,図 5.19 を参考にすれば\(3_{u}\)はダイマー列の外側,\(3_{d}\)はダイマー列の内側にあるので \(3_{d}\)からの放出強度は実験的には抑えられることが考えられるので,ここでは\(3_{u}\)を バルクとしました。
図 5.20 によればscreenedとunscreenedの決定的な違いは 第1層めのdownのピーク位置です。 両者のちがいは電子数がunscreenedの方がscreenedより少ないことです。 そのためunscreenedではdown位置のシリコン原子が電子により遮蔽されません。 screenedでは遮蔽されるので,このちがいのためにdownのピーク位置が異なったと考えられます。
図 5.20 SCLSの運動エネルギー:それぞれ青丸はunscreened,赤丸はscreenedの内殻正孔擬ポテンシャルを用いた結果である。赤丸はSchefflerと同じ方法である。縦軸は光電子の運動エネルギー(単位はeV)のバルクからのずれである。この場合,バルクを\(\mathbf{3}_{\mathbf{u}}\)位置の原子にとっている。
Schefflerらの論文 [Pehlke93] にある結果と比較するために,図 5.21 に表面から3層までの原子によるSCLSを表示します。 縦軸は強度であり,各強度は原子数の比をとっています。 上から順に,unscreened,screenedの各計算値,実験値を示しています。 実験値はLandemarkら [Landemark92] によるものです。
図 5.21 SCLSの強度:縦軸はSCLSの強度であり,各強度は原子数の比をとっている。上から順に,unscreened,screenedの各計算値,実験値を表示した。実験値はLandemarkら [Landemark92] によるものである。実験に合うのはscreenedである。XPS用の内殻正孔擬ポテンシャルはscreenedで作成しなければならない。
図 5.21 の計算結果は実験結果 [Landemark92] をよく再現し, また,Schefflerらの論文の結果 [Pehlke93] に一致しています。 実験に合うのはscreenedであることがわかります。 このため,XPS用の内殻正孔擬ポテンシャルはscreenedで作成しなければなりません。
5.1.6.4. 参考文献
- Landemark92(1,2,3,4,5)
“Core-level spectroscopy of the clean Si(001) surface: Charge transfer within asymmetric dimers of the \(2 \times 1\) and \(c(4 \times 2)\) reconstructions”, E. Landemark, C.J. Karlsson, Y.-C. Chao, and R.I.G. Uhrberg, Phys. Rev. Lett. 69, 1588 (1992).
- Pehlke93(1,2,3,4,5,6)
“Evidence for site-sensitive screening of core holes at the Si and Ge (001) surface”, E. Pehlke and M. Scheffler, Phys. Rev. Lett. 71, 2338 (1993).
5.1.7. 仕事関数
5.1.7.1. 機能の概要
PHASEを利用して,仕事関数を評価することが可能です。ここでは,仕事関数を計算する方法を説明します。
第一原理計算の枠組み内における仕事関数とは,真空準位とフェルミエネルギーとの差です。真空準位は,表面のSCF計算を実施し,表面から十分に離れた箇所での局所ポテンシャルを利用して算出することができます。
5.1.7.2. 入力パラメータ
仕事関数を計算するためには,表面のモデルを準備する必要があります。対象としたい系の,対象としたい面
方位をもつ表面モデルを用意します。さらに,入力データのpostprocessingブロックにworkfunc ブロックを作成し,設定を行います。
postprocessing{
workfunc{
sw_workfunc = on
sw_add_xc_to_vloc = off
}
}
各変数は以下の意味をもちます。
sw_workfunc |
仕事関数の計算に必要なデータを出 力するためのスイッチです。 出力させたい場合にonとします。 |
sw_add_xc_to_vloc |
局所ポテンシャルを出力する際に,交換相関相互作用を含めるかどうかを指定します。交換相関相互作用は表面から十分離れた場所において0 になると考えられるので,局所ポテンシャルに含めなくても正しい仕事関数が得られることが期待できます。デフォルト値はonですが,offにしておくことによってより少ない真空層で収束した仕事関数を得ることが可能です。 |
このような設定を行ったら,通常通りPHASE を実行します。計算が収束した後に,必要な局所ポテンシャル
データなどが出力されます。すでに収束した計算に対する継続計算として実行することも可能です。
5.1.7.3. 計算の実行方法
計算が終了した段階では,局所ポテンシャルのデータが逆空間のデータとして保存されます。仕事関数を得るた
めには,逆空間のデータを実空間へ逆フーリエ変換し,表面内で平均を計算しその結果を出力する必要がありま
す。このような処理を行うプログラムがworkfuncです。このプログラムのソースコードはsrc_workfuncディレクトリーにあります。コンパイルするためには,Fortran90コンパイラーが必要です。workfuncをコンパイルするには,たとえば以下のようなコマンドを実行します。
% cd src_workfunc
% export F90=ifort
% make
環境変数F90にFortran90コンパイラーを指定します。環境変数F90のデフォルト値はgfortranです。
以下のように利用します。
% workfunc -z ZAXIS
ZAXIS に,表面に垂直とみなす軸" を指定します。a軸の場合1, b軸の場合2, c軸の場合は3 を指定します。
指定しない場合のデフォルト値は3 です。
5.1.7.4. 計算結果の出力
workfunc の処理が終了すると,nfvlcr.cube とnfvlcr_av.data の2 種類のファイルが生成されます。nfvlcr.cube ファイルは,実空間の局所ポテンシャルデータを持つGaussian Cube 形式のデータファイルです。nfvlcr_av.data には表面に垂直な距離と面内で平均した局所ポテンシャルのデータが記録されています。以下のようなデータ形式となっています。
# Fermi energy (eV) -0.37838
# distance along the z-axis(Angstrom) averaged local potential (eV)
0.104167 -0.218799E+01
0.208333 -0.250195E+01
0.312500 -0.331223E+01
0.416667 -0.427665E+01
0.520833 -0.495695E+01
0.625000 -0.496651E+01
0.729167 -0.425552E+01
.....
.....
.....
ファイルの1 行目にフェルミエネルギーがeV 単位で記録されています。3 行目以降が実際のデータです。1 列目にÅ単位で表面に垂直な距離が,2 列目に対応する局所ポテンシャルの面内平均eV 単位で記録されます。局所ポテンシャルは,表面からある程度離れた地点においてはほぼ一定値となります。この時の値とフェルミエネルギーとの差が仕事関数に相当します。
nfvlcr_av.dataファイルから局所ポテンシャルがフラットになる領域を推定し,フェルミエネルギーとの 差を計算することによって仕事関数をもとめるPerl スクリプトがworkfunc.pl です。以下のように利用します。
% workfunc.pl nfvlcr_av.data OPTIONS
実行すると,計算された仕事関数の値が標準出力に出力されます。また,workfunc.eps という,局所ポテンシャルと表面に垂直な距離の関係をグラフ化したEPS ファイルも作成されます。
5.1.7.5. 計算例:アルミニウムの仕事関数
アルミニウムの仕事関数の計算例を紹介します。サンプルデータは, samples/surface/workfunc/Al
です。
利用する系は,Al (111) 7 層の表面モデルです。表面に垂直な軸はc 軸とします。c 軸の長さは,50 Å としました。アルミニウム(111) 面はほとんど再構成しないので,構造最適化は施しませんでした。原点を中心に,反転対称性が存在するようにモデルを作成しました。また,交換相関相互作用は局所ポテンシャルに含めない設定で計算を行いました。アルミニウムの表面モデルを 図 5.22 に示します。

図 5.22 Al(111)面7層モデル
PHASE によるSCF 計算が終了したのちにworkfunc プログラムによってnfvlcr_av.data ファイルを作成し,さらにworkfunc.pl スクリプトを利用して得られた局所ポテンシャルと表面に垂直な距離の関係を 図 5.23 に示します。仕事関数は,4.05 eV と計算されました。この値は実測値である4.08 eVと近い結果となっています。

図 5.23 表面に垂直な距離と局所ポテンシャルの関係
5.1.8. 陽電子寿命解析
5.1.8.1. 機能の概要
電子の反粒子である陽電子は、電子と同じ質量を持ち、正の電荷を持ちます。陽電子は電子と対消滅し、\(\gamma\)線を放出します。この陽電子消滅の現象を利用して、結晶の品質や、欠陥の研究が可能です。 ここで、陽電子消滅実験から有用な情報を引き出すのに、第一原理計算に基づいて陽電子寿命を予測し、実験結果と比較することが重要です。PHASEには、完全結晶における陽電子寿命を予測する機能があります。
陽電子寿命解析、以下の手順で計算を行います。
はじめに 通常の電子状態計算(バンド計算)を実行します。PHASEには、擬ポテンシャル・平面波法が実装されているので、この手法に基づいて計算を行います。バンド計算により、価電子の電荷密度 \(\rho_{v}\)が得られます。全電子の電荷密度は次式で与えられます。
(5.7)\[\rho_{e} = \rho_{v} + \rho_{c}\]ここで、\(\rho_{c}\)は、コア 電子の電荷密度です。CIAOで作成し公開されている擬ポテンシャル のデータファイルには、自由な原子におけるコア電子の電荷密度の 情報が含まれています。このデータを読み込み (5.7) を評価します。
陽電子波 動関数\(\psi_{+}\)は次式で与えられます(原子単位)。
(5.8)\[\left\lbrack - \frac{1}{2}\Delta - \int_{}^{}d\overrightarrow{r^{'}}\frac{\rho_{e}\left( \overrightarrow{r^{'}} \right) - \rho_{n}\left( \overrightarrow{r^{'}} \right)}{\left| \overrightarrow{r} - \overrightarrow{r^{'}} \right|} + \mu_{c}\left( \rho\left( \overrightarrow{r} \right) \right) \right\rbrack\psi_{+}\left( \overrightarrow{r} \right) = \varepsilon\psi_{+}\left( \text{cr} \right)\]ここで、\(\mu_{c}\) は、電子・陽電子相関に由来する ポテンシャルエネルギーであり、\(\rho_{n}\)は、原子核 の点電荷を表します。いま、陽電子は固体中に1個しかないと仮定す るので、最も安定な固有状態のみを求めればよいことになります。 したがって、陽電子の固有状態はブリルアンゾーン中の\(\Gamma\)点に属します。この波動関数を平面波によって展開します。
(5.9)\[\psi_{+} = \sum_{\overrightarrow{G}} C_{\overrightarrow{G}} \exp \left( i\overrightarrow{G} \cdot \overrightarrow{r} \right)\]ここで、逆格子周期ベクトル\(\overrightarrow{G}\)の和を有限に抑えるため、平面波の運動エネルギーの上限を設定します。
陽電子密度を求めます。
(5.10)\[\rho_{p}\left( \overrightarrow{r} \right) = \left| \psi_{+} \right|^{2}\]電子及び陽電子の 電荷密度を用いて、下記の式を評価し、陽電子寿命を計算します。
(5.11)\[\frac{1}{\tau} = \pi r_{e}^{2}c\int_{}^{}dr\rho_{e}\left( r\right)\rho_{p}\left( r \right)\Gamma\left( \rho_{e} \right)\]ここで、\(r_{e}\) は、電子 の古典半径、\(c\)は光速を表します。\(\Gamma\) は、増大因子であり、電子・陽電子間の相関に由来するものです。PHASEでは、上式の評価において、下記の近似を用いています。
(5.12)\[\rho_{e}\Gamma\left( \rho_{e} \right) \cong \rho_{v}\Gamma\left( \rho_{v} \right) + \rho_{c}\Gamma\left( \rho_{c} \right)\]この近似が成り立つためには、 価電子とコア電子の分布の重なりが小さいことが条件となります。
本計算では、電子・陽電子間の相関に対して、局所密度近似を用いています。すなわち、相関ポテンシャルと増大因子は、均一な電子ガス中に陽電子が1個ある場合に計算された結果をもとに、電子密度の関数として与えられます。増大因子に関しては、次式が提案されています [Puska95] 。
ここで、\(\frac{4\pi}{3}r_{s}^{3} = 1/\rho_{e}\)です。また、ギャップのある系、すなわち誘電体においては、金属よりも電子のスクリーニング効果が小さいため、次の補正を行う事を推奨します [Puska91] , [Nakamoto08] 。
ここで、\(\varepsilon_{\text{ele}}\)は電子系誘電率です。その値が実験により測定されていない場合には、UVSORにより、密度汎関数理論に基づいて評価することができます。計算手法の詳細については、 [Nakamoto08] を参照ください。
5.1.8.2. 入力パラメータ
Si結晶中における陽電子寿命の計算を例とします。
計算例題は、 samples/positron/Si
です。
Si結晶中における陽電寿命計算の入力パラメータファイルにおいて、陽電子計算に関する部分のみを説明します。
Controlタグで陽電子寿命計算を有効に設定
Control{
positron = BULK
}
Controlタグ中に positron=BULK と宣言すると、 通常の電子状態計算(バンド計算)を行った後に、陽電子寿命計算を行います。
accuracy タグで陽電子寿命計算のオプションを指定
accuracy{
cutoff_pwf = 50.00 rydberg
positron_convergence{
num_extra_bands = 8
delta_eigenvalue = 1.d-8 rydberg
succession = 6
num_max_iteration = 32000
dtim = 0.01
epsilon_ele = 12
}
}
cutoff_pwf = 50.00 rydberg |
これは、陽電子の波動関数を 展開する際の[ (5.9) 参照]カットオフエネルギーです。 |
positron_convergence{} |
このタグの中 で、陽電子波動関数を反復計算によ って求める、すなわち (5.8) を解く 、際に、どのように収束解を得よう とするのか、その指定を行います。 |
num_extra_bands = 8 |
陽電子の固有状態 は、基底状態1個のみを計算すれば 充分です。しかし、反復計算で収束 解を得るには、それ以外に、基底状 態よりもエネルギーの高い状態の波 動関数も計算する必要があり、その 個数を指定します。なお、求める波 動関数は全てブリルアンゾーン中の \(\Gamma\)点に属します。 |
delta_eigenvalue = 1.d-8 rydberg |
5.の説明参照 |
succession = 6 |
反復計算において、前回と今回の 物理量(7.参照)が4.で与えられた 範囲内で一致し、5.で指定された回 数だけ連続して、この条件を満たせ ば、計算は収束したとみなします。 |
num_max_iteration = 32000 |
計算は、この数繰り返すと 、収束していなくても終了します。 |
dtim = 0.01 |
繰り返し計算において、次の波動関 数をどれだけ大きく変化させるかの 尺度であり、dtimが大きいほど収束 が早くなります。しかし、あまり大 きいと収束解が得られなくなり、こ の値が小さいほど、安定に収束解が 得られますが、小さくするほど収束 が遅くなります。したがって、この 値は計算する系により、ユーザーが 最適な値を探すことを推奨します。 |
epsilon_ele = 12 |
epsilon_eleは、ギャップのある系に 対して、LDAの電子系誘電率補正を 行う際に用いるtagです。=の後には 、誘電率(Siの場合12)を用います 。もし、誘電率の補正を行わないの であれば(たとえば、金属の計算を 行う場合)、8.の行は削除します。 |
5.1.8.3. 計算結果の出力
陽電子寿命予測計算を行うと、output000フィルと3個のcube fileが出力されます。
ログ出力ファイル output000
このファイルの最初の部分は、Siの電子バンドの計算に関するものです。電子のバンド計算が終わり、電子の電荷密度が得られた後、陽電子の計算が行われます。
出力における“--- initial positron energy eigen values ---”からが陽電子計算に関するものです。繰り返し計算により、陽電子の波動関数が決定されます。下記の 出力は、繰り返し計算のはじめにおいて、固有値が、14.6379(eV)であることを示しています。extra bandsはそれよりもエネルギーの 高い固有値(14.9628460558-15.0292289699)を表します。繰り返し計算の2回目では、固有値が、 0.0021898139(eV) となっています。
--- initial positron energy eigen values ---
=== positron eigen values ===
14.6378982055
-- extra_bands --
14.9628460558 14.6842242625 14.9879179620 15.2755174303
14.8070539395 14.6061318397 14.8086346971 15.0292289699
=== positron eigen values ===
0.0021898139
-- extra_bands --
0.0892687578 0.1056325893 0.2037689630 0.2140559068
0.3115605599 0.3359746459 0.3540270556 0.4738130045
ファイルの下の方には、次のような出力があります。
***************************************************
positron lifetime(ps) 220.184723312044
core rate 3.79328791767622 %
これは、陽電子の固有値を求める計算が収束し、陽電子の寿命が220psと計算されたことを示しています。core rateは、全消滅速度に対するコア電子の消滅速度の割合を示します。
Cubeファイル
計算が終了すると、電子の電荷分布、陽電子の電荷分布、電子・陽電子ペアの分布が、ファイルelectron.cube、positron.cube、ep_pair.cubeに出力されます。これらのファイルはGaussian cube 形式であり、可視化できます。 図 5‑22にSi結晶における計算結果を示します。価電子は主として、結合領域に存在し、陽電子は、隙間領域に存在することが分かります。陽電子の波動関数が広がり運動エネルギーが低下した方がエネルギー的に有利であることから、一般に陽電子は隙間領域に存在する傾向があります。電子・陽電子対分布を 図 5.24 (c)に示します。この分布が高いところで、陽電子が大きな確率で消滅することになります。
図 5.24 Si結晶中の価電子分布(a)、陽電子分布(b)、電子・陽電子対分布(c)
5.1.8.4. 使用上の注意
陽電子寿命の計算における注意点です。
擬ポテンシャルの選択
元素によっては、セミコア状態を持つものがあります。ここで、セミコア状態とは、コア電子の内、軌道が空間的に広がり、コア電子の分布と価電子の分布との重なりが無視できない場合のことです。この場合、セミコア電子を価電子として取り扱い、擬ポテンシャルを作成することが望まれます。公開されている擬ポテンシャルには、元素によっては、このようにして作成されたものがあり、その際はこれを利用することを推奨します。もし、そのような擬ポテンシャルが作成されていなければ、CIAOを用いて作成することもできます。
カットオフエネルギーの選択
Si結晶のバンド計算において、電子波動関数、電荷密度、陽電子波動関数に対するカットオフエネルギーを以下のように指定します。
accuracy{
cutoff_wf = 50.00 rydberg ! cke_wf
cutoff_cd = 200.00 rydberg ! cke_cd
cutoff_pwf = 50.00 rydberg
}
これらの値を変化させて、計算された寿命が十分収束していることを確かめる必要があります。
出力
陽電子の波動関数は、電子の波動関数と同様、繰り返し計算によって求められます。各繰り返しにおいてoutput000ファイルには、次のような出力があります(ここでは、繰り返しの最後における出力を表示しています)。
=== positron eigen values ===
-0.5674635596
-- extra_bands --
-0.0490686179 -0.0460091253 -0.0446118499 -0.0275856742
-0.0102856694 0.0069403602 0.0274419414 0.2284487012
lifetime: 220.180365487100 220.179503204077
ここで、計算終了近くで、陽電子の固有値(positron eigen value)が十分収束していることを確かめます。サンプルでの出力(output000)では、
-0.5674635596
-0.5674635638
などとなっており、十分収束していることが分かります。 また、上記の出力で220.180365487100, 220.179503204077といった数値がありますが、これは、繰り返し計算において、 前回計算された、寿命と今回計算された寿命を示しており、繰り返し計算により、寿命の値が収束に近づいている事を示唆しています。
通常の電子のバンド計算が十分収束しており、かつ使用上の注意の事項を確認できれば、計算は十分考慮されたものであると考えてよいでしょう。
5.1.8.5. 参考文献
- Puska95
Puska, A. P. Seitsonen, and R. M. Nieminen, ``Electron-positron Car-Parrinello Methods: Self-consistent Treatment of Charge Densities and Ionic Rel axations'', Phys. Rev. B 52 (1995) p. 10947.
- Puska91
Puska, ``Ab-initio Calculations of Positron Annihilation Rates in Solids'', J. Phys. Condens. Matter 3 (1991) p. 3455.
- Nakamoto08(1,2)
Nakamoto, M. Saito, T. Yamasaki, M. Okamoto, T. Hamada, and T. Ohno, ``Two-Component Density Functional Calculations on Positron Lifetimes for Band-Gap Crystals'', Jpn. J. Appl. Phys. 47 (2008) p. 2213.
5.1.9. ボルン有効電荷
5.1.9.1. 概要
平面波基底を採用する第一原理計算において,原子の電荷を一意に求めることは簡単なことではありません。ボルン有効電荷はベリー位相理論に基づいて計算されるものであり,電荷を決めるための最良の方法と考えられます。その基本的な考え方は,“原子が微小に変位した場合に発生する分極”を変位量で割ることによって電荷を求めることができる,というものです。分極も変位も3方向あり得るので,ボルン有効電荷は2階のテンソルとなります。なお,ボルン有効電荷の計算はギャップのある系でのみ計算することが可能な点にご注意ください。
5.1.9.2. ボルン有効電荷の計算の流れ
ボルン有効電荷は,次のような表式によって計算します。
ここでは \(Z_{\rm ion}\) イオンの電荷,はi番目の格子ベクトルのα成分,はi番目の逆格子ベクトルに沿ったベリー位相,は変位のβ成分です。ベリー位相の原子変位に対する微分は,差分近似から計算します。このことから,3通りの変位に対して3つの逆格子ベクトルのベリー位相を計算する必要があり,ボルン電荷を計算するためには考慮する原子数の9倍のベリー位相計算が必要になることが分かります(実際には変位しないケースも必要なので,必要なベリー位相計算は原子数×9 + 3 です)。また,ベリー位相の計算はekcalの固定電荷計算によって行うので,さらに固定電荷計算用の電荷を作成するSCF計算をベリー位相計算に先立って行う必要があります。この一連の計算を行うために,PHASE/0に付属するberry.plというPerlスクリプトを利用します。
計算は,PHASE/0に付属するberry.plというPerlスクリプトを利用して行います。berry.plは,binディレクトリーの下にあります。ボルン有効電荷の場合,berry.plは以下のような流れで計算を行います。
対象とする原子すべてのSCF計算を行う。
対象とする原子すべてを3方向変位させた計算を行う。
1., 2.で得られた電荷密度を入力とした固定電荷計算によって,ベリー位相計算を3つの逆格子ベクトルに対して行う。
3. で得られたベリー位相データを結合し, () を利用してボルン有効電荷を計算する。
入力として必要なのは,SCF計算およびベリー位相計算の入力の元となるテンプレート入力ファイルと,berry.plの動作を制御するコントロールファイルです。
5.1.9.3. 入力データ
概要
ボルン有効電荷の計算は,複数回のPHASEによるSCF計算と,ekcalによるベリー位相計算が必要となります。PHASE/0には,これらの計算を正しい手順で実行するberry.plというPerlスクリプトが付属しています。berry.plを実行するためには,SCF計算およびベリー位相計算用のテンプレートとなる入力ファイルと,berry.plの振る舞いを制御するコントロールファイルを作成する必要があります。
SCF計算およびベリー位相計算用テンプレート入力データの作成
ボルン有効電荷の計算を行うため,“テンプレート入力データ”を作成します。作成するテンプレート入力は,SCF計算用とベリー位相計算用のテンプレート入力です。それぞれについてberry.plを実行するディレクトリーの下にディレクトリーを作成し,その下にSCF計算用の入力データと固定電荷計算用の入力データを作成します。SCF計算はPHASE, 固定電荷計算は2次元版の場合はPHASEもしくはekcal, 3次元版の場合はPHASEプログラムを利用します。作成する入力データは通常の計算と同じですが,以下のような点に留意して入力を作成してください。
座標データは,構造最適化や格子最適化がなされたものを採用してください。
構造最適化などが行われない設定にしてください。
計算は,実行ディレクトリーの一階層下において行われます。すなわち,テンプレート入力が置かれるディレクトリーと同じ階層で行われます。この点に留意してfile_names.dataにおける擬ポテンシャルの指定を行ってください。
通常,固定電荷計算用の入力のfile_names.dataファイルにおいてはファイルポインターF_CHGTを利用してSCF計算によって得られたF_CHGTファイル(電荷密度ファイル)を指定します。ボルン有効電荷計算においては実際に参照するSCF計算はberry.plが動的に決めるので,この部分を正しく指定する必要はありません(指定があっても,berry.plによって書き換えられてしまいます)。
固定電荷計算でPHASEを利用する場合以下のような設定をしてください。この設定を施すことによって,固定電荷計算は“k点を一点ずつ処理する”モードで動作します。ベリー位相計算はこのモードでないと正しく計算できません。
control{
condition = fixed_charge
fixed_charge_option{
kparallel = one_by_one
}
}
ベリー位相計算のk点サンプリングは,berry.plのコントロールファイルにおけるmesh1, mesh2, mesh3パラメーターによって決まるので,ekcalの入力パラメーターファイルにおけるksamplingブロックの設定は無視されます。
berry.pl用のコントロールファイルの作成
berry.plの振る舞いは,コントロールファイルを介して指定します。ボルン有効電荷計算の場合,典型的には以下のような内容になります(#で始まる文はコメント文)。コントロールファイルのファイル名はberry.pl実行時に指定する仕様となっているので,任意のものを採用してください。
#overall control
property = zeff
cpumax = 1000
#directories under which the template files reside
template_scf = scf
template_berry = berry
#parameters for the berry-phase calculation
atom_list = 1 3
displacement = 0.1
mesh1 = 6 6 15
mesh2 = 6 6 15
mesh3 = 6 6 15
#execution control
np = 4
ndir = 2
ne = 1
nk = 2
ne_b = 2
scf_command = mpiexec –np NP phase ne=NE nk=NK
berry_command = mpiexec –np NP ekcal ne=NE_B
#unit cell info, optional
a_vector = 5.01 0.0 0.0
b_vector = 0.0 5.01 0.0
c_vector = 0.0 0.0 5.01
この例からわかるように,パラメータ1つにつき1行を利用し,“キーワード=値”という形式でパラメータを指定します。ボルン有効電荷計算の場合に考慮する必要のあるキーワードとその説明を以下に記します。
キーワード |
説明 |
---|---|
property |
どのような計算を行うかを指定します。zeff, piezo, strfrcのいずれかです。zeffを指定するとボルン有効電荷用のベリー位相計算が行われます。デフォルト値はzeffなので,ボルン電荷計算の場合未指定でも構いません。 |
cpumax |
計算の最大時間を秒の単位で指定します。ここで指定した時間よりも経過時間が長い場合,計算はすみやかに終了します。0以下の値を指定すると, この条件では計算は終了しません。デフォルト値は-1。 |
stopcheck |
計算停止条件を満たしているかどうかをチェックする間隔を秒の単位で指定します。デフォルト値は10。 |
length_unit |
コントロールファイル中に利用される長さの単位を指定します。bohr, angstrom, nmのいずれかを指定します。デフォルト値はbohr。 |
template_scf |
SCF計算用のテンプレートディレクトリーのディレクトリ名を指定します。デフォルト値はtemplate_scf。 |
template_berry |
ベリー位相計算用のテンプレートディレクトリのディレク トリ名を指定します。デフォルト値はtemplate_berry。 |
atom_list |
変位させる原子のIDを,空白区切りで指定します。 |
displacement |
原子の変位量を指定します。property = zeffの場合に指定します。デフォルト値は0.1 bohr。 |
mesh1 |
1番目の逆格子ベクトルに沿ったベリー位相計算のメッシュパラメーターを空白区切りで n1 n2 J のように指定します。property = zeff および piezoの場合必須の指定です。 |
mesh2 |
2番目の逆格子ベクトルに沿ったベリー位相計算のメッシュパラメーターを空白区切りで n1 n2 J のように指定します。property = zeff および piezo の場合必須の指定です。 |
mesh3 |
3番目の逆格子ベクトルに沿ったベリー位相計算のメッシュパラメーターを空白区切りで n1 n2 J のように指定します。property = zeff および piezo の場合必須の指定です。 |
np |
MPIプロセス数を指定します。デフォルト値は1。 |
ndir |
ディレクトリー並列数を指定します。デフォルト値は1。 |
ne |
バンド並列数を指定します。デフォルト値は1。 |
nk |
k点並列数を指定します。デフォルト値は1。 |
ng |
(三次元版のみ)G点並列数を指定します。デフォルト値は1。 |
ne_b |
ベリー位相計算時に おけるバンド並列数を指定します。デフォルト値は1。 |
ng_b |
(三次元版のみ)ベリー位相計算時にお けるG並列数を指定します。デフォルト値は1。 |
scf_command |
SCF計算の実行方法を指定します。たとえば, scf_command = mpirun –np NP phase ne=NE nk=NK (2D版) scf_command = mpirun -np NP phase ne=NE nk=NK ng=NG (3D版) などと指定します。NP, NE, NK, NGは,計算実行時に上述のnp, ne, nk, ngに置き換わります。ただし,ディレクトリ並列の数によっ ては“あまり”が発生することがあり,その場合はne=NE nk=NKng=NGは省略されて計算が投入されます。デフォルト値はmpirun phaseですが,利用して いる環境に合わせて適切な指定をする必要があります。 |
berry_command |
ベリー位相計算の実行方法を指定します。たとえば, berry_command = mpirun –np NP ekcal ne=NE_B (2D版) berry_command = mpirun -np NP phase ne=NE_B ng=NG_B (3D版) などと指定します。NE_Bは上述のne_bに,NG_Bはng_bに置き換わります。デフォルト値はmpirun ekcalです,利用している環境に合わせて適切な指定をする必要があります。 |
a_vector |
a軸の三成分を空白区切りで指定します。必須ではありませんが,指定しておくとベリー位相計算のメッシュパラメーターの参照値を算出します。 |
b_vector |
b軸の三成分を空白区切りで指定します。必須ではありませんが,指定しておくとベリー位相計算のメッシュパラメーターの参照値を算出します。 |
c_vector |
c軸の三成分を空白区切りで指定します。必須ではありませんが,指定しておくとベリー位相計算のメッシュパラメーターの参照値を算出します。 |
注意点
mesh1, mesh2, mesh3パラメーターについて
ベリー位相の計算においては,対象としたい逆格子ベクトル \({\mathbf b}_i\) に垂直な面の面積分と,\({\mathbf b}_i\) に沿った線積分が実行されます。この積分のメッシュは,コントロールファイルのmesh1, mesh2, mesh3パラメーターを利用して行います。i番目の逆格子ベクトルに対し,meshi = n1 n2 Jと空白区切りでメッシュを指定します。ここで面積分のメッシュがn1 n2,線積分のメッシュがJです。
\({\mathbf b}_i\) 以外の2つの逆格子ベクトルを \({\mathbf b}_j\) とすると \({\mathbf b}_j\) を \({\mathbf b}_i\) に垂直な面に射影したベクトル,\({\mathbf b}_j - \left| \mathbf{b}_j \right| \cos \theta_{ji} \frac{\mathbf{b}_i}{\left| \mathbf{b}_i \right|}\) ,が面積分のメッシュの見積もりの基準となるので,その長さから決めます。線積分のパラメータは,\(\mathbf{b}_i\) の長さをもとに決定します。コントロールファイルにa_vector, b_vector, c_vectorの指定を行っておくと,この長さの計算(bohr-1単位)とそこから見積もられる参考のメッシュパラメーターが以下のように標準出力に出力されます(あくまで参照値であり,得られる結果の妥当性を保証するものではありません)。
|b_para1|, |b_para2| and |b_perp| (in bohr^-1 units)
for reciprocal vector no. 1 : 0.172224346323159, 0.107572987734313, 0.198867545420854
for reciprocal vector no. 2 : 0.172224346322494, 0.107572987734313, 0.198867545421622
for reciprocal vector no. 3 : 0.198867545420854, 0.198867545421622, 0.107572987734313
reference value for mesh parameters n1, n2 and J
for reciprocal vector no. 1 : 8, 5, 19
for reciprocal vector no. 2 : 8, 5, 19
for reciprocal vector no. 3 : 9, 9, 10
並列計算について
並列計算の設定について注意すべき点を挙げます。berry.plによる計算は,通常のバンド,k点による並列(3D版の場合さらにG点並列)に加え,複数のディレクトリにまたがって並列計算を行う“ディレクトリ並列”によって行われます。したがって,ディレクトリ並列数(パラメーターndir)を2以上にする場合,SCF計算の場合はnp=ne×nkではなくnp=ndir×ne×nk (3D版の場合np=ne x nk x ngではなくnp=ndir x ne x nk x ng)となるように,ベリー位相計算の場合はnp=ne_bではなくnp=ne_b×ndir(3D版の場合np=ne_b x ng_bではなくnp=ne_b x ng_b x ndir)となるように並列数を調整してください。SCF計算とベリー位相計算とでバンド並列数が異なるのは,ベリー位相計算はk点並列に未対応のためです。また,ディレクトリー並列数を2以上にする場合,以下の要領でScaLAPACKを無効にしてください。
wavefunction_solver{
submat{
scalapack{
sw_scalapack = off
}
}
}
3D版について
バージョン2019.02から,3D版でもベリー位相計算が実行できるようになりました。3D版でベリー位相計算を行うには,固定電荷計算にekcalではなくphaseを使います。また,以下のような設定を施すようにしてください。
control{
fixed_charge_option{
kparallel = one_by_one
}
}
5.1.9.4. berry.plの実行
berry.plを引数なしで実行すると,以下のようなメッセージが得られます。
% berry.pl
Usage : berry.pl control [OPTIONS]
第一引数にコントロールファイルのファイル名を指定し,さらに必要に応じてオプションを指定して制御する仕組みになっています。
以下のようなコマンドを実行すると,コントロールファイルの解釈と解析のみ行います。
% berry.pl control –-mode=analyze
以下のようなコマンドを実行すると,コントロールファイルの解釈と解析のあと,計算用のディレクトリを作成します。
% berry.pl control --mode=gendir
以下のようなコマンドを実行すると,コントロールファイルの解釈と解析のあと,計算用のディレクトリを作成し,さらに計算を実行します。
% berry.pl control --mode=exec
--mode オプションのデフォルト値はgendir です。また,
% berry.pl --clean
とすると,berry.plが作成したディレクトリーなどを一括削除することができます。
実行すると,以下のようなログを出力しながらPHASEもしくはekcalによる計算が進行します。
berry.pl : script to calculate the berry phase for the PHASE System
Copyright (c) 2012-2013, IIS, The University of Tokyo
script start time : Tue Mar 21 18:12:13 2017
-- parsing the control file –
…
…
-- generating directories --
number of SCF directories : 7
number of berry directories : 21
-- doing SCF calculations --
running [mpiexec -n 4 $HOME/phase0/binN/phase ne=2 nk=2] under the
following directories
scf_a0
time spent in this calculation : 9 (s), total time : 9 (s)
…
…
まずコントロールファイルの中身が読み込まれ,その内容が出力されます。ついで,計算に必要なディレクトリーが作成されます。その後SCF計算が必要な回数だけ行われ,さらにベリー位相計算が必要な回数だけ行われます。実行中のコマンドと計算中のディレクトリーは,以下のような形式で出力されます。
running [mpiexec -n 4 $HOME/phase0/bin/phase ne=2 nk=2] under the following directories
scf_a0
作成される計算用ディレクトリーは,以下のようなものです。
ディレクトリー名 |
説明 |
---|---|
scf_a0 |
参照用の,原子を変位させない系の SCF計算が行われるディレクトリー。 |
scf_aaid_uuid |
aid番目の原子を,uidの方向に変位させた系のSCF 計算が行われるディレクトリー。aidは1始まりであり,テンプレ ート入力データに記述した原子配置 の順序に対応する。uidは1, 2, 3のい ずれかの値をとり,それぞれx, y, z方向に相当する。 |
berry_a0_ggid |
参照用の,原子を変位させない系 における,gid方向の逆格子 ベクトルのベリー位相計算が行われ るディレクトリー。gidは1, 2, 3のい ずれかの値をとり,それぞれ1番目, 2番目, 3 番目の逆格子ベクトルに相当する。 |
berry_ aaid_uuid_ggid |
aid番目の原子を,uidの方向に 変位させた系における,gid方向の逆格子ベクトルのベリー位相 計算が行われるディレクトリー。aidは1始まりであり,テンプレ ート入力データに記述した原子配置 の順序に対応する。uidは1, 2, 3のい ずれかの値をとり,それぞれx, y, z 方向に相当する。gidは1, 2, 3のい ずれかの値をとり,それぞれ1番目, 2番目, 3 番目の逆格子ベクトルに相当する。 |
ボルン有効電荷計算の場合,ベリー位相計算のあとにボルン有効電荷計算用のPHASE計算が行われます。この計算は,zeffディレクトリーにおいて行われます。この計算は非並列で行われ,通常数秒から数十秒程度で終了します。
5.1.9.5. 計算結果
計算が最後まで実行されると,以下のようなログが得られます。
--- Calculated effective charges ---
[ 2.98266 0.00512 -0.00454 ]
Zeff( 2) = [ 0.00001 3.62664 -0.32666 ]
[ -0.00010 0.27925 3.42264 ]
...
...
--- Symmetrized effective charges ---
[ 2.98266 0.00000 -0.00000 ]
Zsym( 2) = [ 0.00000 3.62664 -0.32666 ]
[ 0.00000 0.27925 3.42264 ]
...
...
--- Effective charges of all atoms ---
[ 3.46565 -0.27885 -0.28289 ]
Zeff( 1) = [ -0.27885 3.14366 0.16333 ]
[ 0.24184 -0.13963 3.42264 ]
...
...
--- Averaged effective charges ---
[ 0.00151 -0.00000 0.00000 ]
Zave = [ 0.00000 0.00151 -0.00000 ]
[ 0.00000 0.00000 -0.00587 ]
...
...
--- Corrected effective charges ---
[ 3.46414 -0.27885 -0.28289 ]
Zeff( 1) = [ -0.27885 3.14215 0.16333 ]
[ 0.24184 -0.13963 3.42850 ]
...
...
--- Calculated effective charges --- 以下に,計算された生のボルン電荷テンソルが,計算対象となった原子数分出力されます。次に, --- Symmetrized effective charges --- 以下に対称化を施したボルン有効電荷テンソルが出力されます。その次に, --- Effective charges of all atoms --- 以下に,あらわに計算しなかった原子のボルン有効電荷も含めた結果が出力されます。あらわに計算しなかった原子のボルン有効電荷テンソルは,対称性を利用して計算されます。 --- Averaged effective charges ---には全原子で平均したボルン有効電荷テンソルが出力されます。全原子で平均したボルン有効電荷はすべての要素がゼロになるはずなので,この総和則を満たすように補正したボルン有効電荷テンソルが--- Corrected effective charges ---以下に出力されます。
基本的には,--- Corrected effective charges --- 以下の結果が最もよい結果となります。ただし,対称性の与え方が適切でない場合,またはあらわに計算した原子の数が中途半端な場合に「あらわに計算しなかった原子のボルン有効電荷を,対称性を利用して計算する」ことができなくなってしまうことがあります。このような場合は,--- Calculated effective charges --- 以下の結果を利用するようにしてください。
5.1.9.6. 例題
AlNのボルン有効電荷を計算する例を紹介します。
入力データ
入力データは,PHASEによるSCF計算用のテンプレート入力,ekcalによるベリー位相計算によるテンプレート入力,そしてberry.pl用のコントロールファイルから成ります。
PHASEによるSCF計算用のテンプレート入力は, samples/dielectric/lattice/born_revised/AlN/born/template_scf
の下にあります。この入力に特殊な設定はありませんが,構造最適化がなされないよう原子のmobile属性値はすべてoffと設定されています。また,対称性を自動的に処理する機能を有効にしています。
ekcalによるベリー位相計算のテンプレート入力は, samples/dielectric/lattice/born_revised/AlN/born/template_berry
の下にあります。この入力も,通常の固定電荷計算の入力と全く同じです。
berry.plのコントロールファイルは, samples/dielectric/lattice/born_revised/AlN/born/control
です。その内容は以下の通り。
property=zeff
atom_list = 1 3
mesh1 = 6 6 15
mesh2 = 6 6 15
mesh3 = 6 6 15
scf_command = mpiexec -n NP $HOME/phase0/bin/phase ne=NE nk=NK
berry_command = mpiexec -n NP $HOME/phase0/bin/ekcal ne=NE_B
np = 1
ndir = 1
ne = 1
nk = 1
ne_b = 1
property = zeffとすることによって,ボルン有効電荷を計算することを指定しています。atom_listに13 とすることによって対象とする原子を指定しています。1番目の原子はAl, 3番目の原子はNです。AlNは計4つの原子から成る結晶ですが,2番目と4番目の原子のボルン有効電荷は対称性から求まるので計算の対象にはしていません。mesh1 mesh2, mesh3によって逆格子ベクトルのメッシュを指定しています。この例では,すべての逆格子ベクトルに対してn1 = n2 = 6, J = 15としています。scf_command, berry_commandによってPHASEおよびekcalの実行方法を指定しています。ここは,計算に利用する環境に合わせて適宜修正する必要があります。np, ndir, ne, nk, ne_bによって並列のさせ方を指定することができます。この例では,すべて1, すなわち非並列で計算を行う指定となっています。
計算の実行
以下の要領で,berry.plを実行することができます。
% berry.pl control --mode=exec
計算時間は利用するCPUやコンパイラーなどに大きく依存します。Intel Core i7-2600@3.40 GHzのCPUを搭載したマシンで実行したところ,ボルン有効電荷が得られるまで1,760秒かかりました。
計算結果
この計算によって得られた各原子のボルン有効電荷テンソルは,下記の通りです。
[ 2.50916 0.00000 -0.00000 ]
Zeff( 1) = [ 0.00000 2.50916 0.00000 ]
[ 0.00000 0.00000 2.64124 ]
[ 2.50916 0.00000 -0.00000 ]
Zeff( 2) = [ 0.00000 2.50916 -0.00000 ]
[ 0.00000 0.00000 2.64124 ]
[ -2.50916 -0.00000 0.00000 ]
Zeff( 3) = [ -0.00000 -2.50916 -0.00000 ]
[ 0.00000 -0.00000 -2.64124 ]
[ -2.50916 -0.00000 0.00000 ]
Zeff( 4) = [ -0.00000 -2.50916 -0.00000 ]
[ 0.00000 -0.00000 -2.64124 ]
1番目と2番目の原子がAl, 3番目と4番目の原子がNです。
5.1.9.7. berry.plを使わずにボルン有効電荷を計算する方法
ボルン有効電荷の計算は,berry.plを利用せずとも行うことはできます。その手続きを説明します。
SCF計算
ボルン有効電荷を計算するためには,対象としたい原子を変位させたSCF計算を実行する必要があります。また,原子を変位させていないSCF計算も実行しておく必要があります。まずは変位させないSCF計算を通常通りに行います。ついで,対象とする原子ごとにその位置をx, y, z方向に微小量(たとえば0.1 bohr)変位させた計算を行います。変位させる計算を行うためには,入力パラメーターファイルのatom_listブロック以下に定義できるdisplacementブロックを利用すると便利です。
structure{
…
…
atom_list{
…
…
displacement{
sw_displace_atom = on
displaced_atom = 1
ux = 0.1
uy = 0
uz = 0
}
}
}
sw_displace_atom = onとすると原子を変位させます。displaced_atomによって変位させる原子を指定します。ux, uy, uzによって変位のx,y,zの値を長さの指定します。
以上の入力が作成できたら,通常通りPHASEを必要な回数実行します。
ベリー位相計算
SCF計算のあとに,ベリー位相計算を行います。前節で行ったすべてのSCF計算をもとに,固定電荷計算の入力を作成します。各々のSCF計算について,3方向の逆格子ベクトルのベリー位相計算用入力を作成します。ベリー位相計算を実行するには,入力パラメーターファイルに以下のように最上位にberry_phaseブロックを作成し,設定を行います。
berry_phase{
sw_berry_phase = on
g_index = 1
mesh{ n1 = 3, n2 = 3, J = 5 }
}
sw_berry_phase = onとするとベリー位相計算が有効になります。g_indexによって対象とする逆格子ベクトルを指定します。meshブロックを作成し,n1, n2, Jによってメッシュパラメーターを指定します。このほか,SCF計算に対応するdisplacementブロックを作成しておくことと,file_names.dataにおいて対応するSCF計算のディレクトリーの下の電荷密度データを指すようにすることなどを忘れないようにしてください。
以上の入力が作成できたら,通常通りekcalを必要な回数実行します。
ボルン有効電荷の計算
最後にボルン有効電荷を計算します。以下の手続きを踏みます。
ボルン有効電荷計算用のディレクトリーを作成します(たとえば,zeff)。
ベリー位相データファイルberry.dataをすべて連結し,ファイルの先頭にその数を指定します。たとえば,21のベリー位相計算を行ったならばファイルの先頭に21と記述します。
ボルン有効電荷計算用のディレクトリーに,SCF計算用の入力ファイルと2.で得たberry.dataファイルをコピーします。
コピーした入力ファイルからdisplacementブロックを削除し,以下を挿入します。 ボルン有効電荷の計算においてSCF計算を行う必要はないので,controlブロックにおいてmax_iteration = 0とします。postprocessing以下の設定が,ボルン有効電荷を計算するための指示です。
control{
condition = initial
max_iteration = 0
}
postprocessing{
polarization{
sw_bp_property = on
property = effective_charge
}
}
PHASEを非並列で実行します。結果は,outputxxxファイルに,5.1.9.5 章 節で説明する形式で出力されます。
5.1.10. BoltzTraPを利用した解析(バージョン2019.01以上)
BoltzTraP [Madsen06] , [Madsen18] とは,Boltzman理論を利用し,バンド構造から輸送係数などを計算するプログラムです。必要な情報は結晶の対称性とバンドエネルギーです。BoltzTraPを利用すると,温度および化学ポテンシャルの関数として以下のような量を求めることができます。
ゼーベック係数
伝導度(緩和時間で割った値が出力される)
ホール係数
熱伝導率(電子からの寄与分のみ;緩和時間で割った値が出力される)
電子比熱
磁化率
ここでは,PHASE/0が計算するバンド構造からBoltzTraPを利用する方法を説明します。BoltzTraPにはその使い方が大きく異なるバージョン1.とバージョン2.がありますが,PHASE/0はどちらのバージョンにも対応しています。
5.1.10.1. 入力ファイル
BoltzTraPが必要とするファイルを出力するには,入力パラメーターファイルのPostprocessingブロックにおいてboltztrapブロックを作成し,設定を施します。
Postprocessing{
boltztrap{
sw_boltztrap = on
version = 2
prefix = CoSb3
header = "CoSb3 calculated by PHASE/0"
}
}
boltztrapで定義できるタグは下記の通り。
タグ名 |
説明 |
---|---|
sw_boltztrap |
Boltz TraPで利用できるデータファイルを出力するかどうかを指 定するスイッチ。 onとするとデータファイルを出力する。 |
version |
BoltzTraPのバージョンを指定する整数。1もしくは2を指定する。デフォルト値は1. |
prefix |
BoltzTraP用データファイルの接頭辞を指定する文字列。デフォルト値は実行ディレクトリー名。 |
header |
BoltzTraP用データファイルのヘッダーを指定する文字列。デフォルト値はprefixと同じ値。 |
5.1.10.2. PHASE/0の実行
PHASE/0の実行は通常通り行います。計算機能の制限などは特にありません。構造最適化,格子最適化が収束するとBoltzTraPで必要なデータファイルが出力されます。SCF計算でも固定電荷計算でもBoltzTraPによる計算は可能ですが,BoltzTraPの解析はk点数に対する収束性が悪い場合があり,k点数を変えながら収束を確かめる,という手続きを踏む必要があります。そのため,固定電荷計算を活用することを推奨します。
5.1.10.3. BoltzTraPの実行
ここでは,BoltzTraPによる解析を実施する方法を簡単に説明します。詳細はBoltzTraPのマニュアル,チュートリアルをご覧ください。なお,ここでの説明はBoltzTraPのインストールは終了していることを前提としています。
バージョン1.
バージョン1.を実行するために必要なファイルはprefix.intrans, prefix.struct, prefix.energyの3つです。この3つのファイルはいずれもPHASE/0から出力されますが,prefix.intransファイルはBoltzTraPの動作を制御する“入力ファイル”なので実行したい解析に応じてユーザーが編集する必要があります。prefix.intransの内容は,典型的には下記のようになっています。なお,行頭の数値は説明用なので,実際には記述しないでください。
1: GENE # Format of DOS
2: 0 0 0 0.0 # iskip idebug setgap shiftgap
3: 0.17267 0.0005 0.4 58 # Fermilevel (Ry), energygrid, …
4: CALC # CALC (calculate expansion coeff), NOCALC
5: 5 # lpfac, number of latt-points per k-point
6: BOLTZ # run mode (only BOLTZ is supported)
7: .15 # (efcut) energy range of chemical potential
8: 800. 50. # Tmax, temperature grid
9: -1. # energyrange of bands
10: TETRA
11: 0 0 0 0 0 # For scattering model undocumented
12: 2 # number of
13: 1E20 -1E20 # fixed doping levels in cm-3
この入力の#以降はコメントとなっています。また,ファイルは固定形式なので,記述された数値や文字列を削除してしまうとエラーになります。
重要と思われる(変更する機会が比較的多い)設定値について説明します。2行目後半2つの数値は,バンドギャップのシフトを行うかどうかを指定します。3つめの数値に1を指定するとバンドギャップの補正が行われます。4つめの数値にシフト量をRydberg単位で指定します。7行目は,考慮する化学ポテンシャルの幅をRydberg単位で指定します。8行目は,考慮する温度を指定します。まず最高温度を指定し,次いで温度の刻み幅を指定します。0Kから最高温度まで,温度の刻み幅で分割した温度について計算がなされます。12行目,13行目では考慮するドーピングレベルを指定します。まず12行目でドーピングレベルの数を指定し,さらに13行目でドーピング濃度をcm-3単位でドーピングレベル数分指定します。なお,ドーピングを考慮するといっても特別な計算が別途行われるわけではありません。ドーピングレベルに応じた化学ポテンシャルによってデータを並べ替え,結果を出力してくれるという計算機能です。
prefix.intransファイルを望みのものに変更したら,以下の要領でBoltzTraPを実行します。PATH_TO_BOLTZTRAPはBoltzTraPをインストールしたディレクトリーに読み替えてください。
%PATH_TO_BOLTZTRAP/src/x_trans BoltzTraP
(スピン軌道を考慮していない場合)
%PATH_TO_BOLTZTRAP/src/x_trans BoltzTraP -so
(スピン軌道を考慮している場合)
なお,BoltzTraPの計算結果はk点数をある程度多くしないと収束しません。結果が収束しているかどうか,k点数を変えた計算を行い確認することが推奨されます。BoltzTraPのマニュアルによると,目安として\(\frac{16 \times 10^{6}}{V}\ (V\mathrm{は単位胞の体積})\) 程度のk点を取ることが推奨されています。
BoltzTraPによる計算が終了すると,下記のようないろいろなファイルが結果として出力されます。
ファイル名 |
説明 |
---|---|
prefix.outtrace |
ログファイル |
prefix.trace |
各種テンソルのtraceが出力される |
prefix.condtens |
伝導テンソルの全要素が出力される |
prefix.halltens |
ホ ール係数テンソルの全要素が出力される |
prefix.trace_fixdoping, prefix.condtens_fixdoping, prefix.halltens_fixdoping |
ドーピング を考慮している場合に,prefix.xx の内容を濃度 に合わせて加工したデータが出力される |
これらのファイルの形式については,BoltzTraPのマニュアルを参照してください。
バージョン2.
BoltzTraPバージョン2はPythonのモジュール群であり,Pythonスクリプトの中で利用できるように設計されていますが,btp2というフロントエンドとなるコマンドも用意されています。btp2コマンドに様々な副コマンドやオプションを渡すことによってBoltzTraPバージョン2.による計算を行うことができます。ここでは,このコマンドの使い方について説明します。
btp2を実行するために必要なファイルはprefix.energyとprefix.structureファイルです。これらのファイルが置かれたディレクトリーをprefixとすると,prefixの親ディレクトリーにおいて以下の要領で“フーリエ補間”を行います。
% btp2 interpolate -m 5 prefix
interpolateは“フーリエ補間を行う”ことをbtp2に伝える副コマンド,-m 5はk点1点あたり5点の補間を行う,というオプションです。これによってinterpolation.bt2というファイルが作成されます。この補間の結果が記録されたファイルを入力として様々な解析が行えるようになっています。たとえば,ある温度範囲で輸送係数の計算を行いたい場合以下のようなコマンドを利用します。
% btp2 integrate interpolation.bt2 300:500:1
integrateは“輸送係数の計算を行う”ことをbtp2に伝える副コマンドです。そのあとに作成した補間の結果ファイルinterpolation.bt2を渡し,さらに温度範囲を最低温度:最高温度:温度の刻み幅という形式指定しています。 得られるファイルなどについては,BoltzTraPのバージョン1.と違いはありません。
5.1.10.4. 計算例
体心立方CoSb3結晶のゼーベック係数の計算例を紹介します。CoSb3の原子配置は 図 5.25 に示すとおり。

図 5.25 CoSb3の結晶構造(体心立方構造)
なお,この例題の入力ファイルは samples/BoltzTraP/CoSb3
以下に置かれています。
まずSCFディレクトリーにある入力ファイルを用いて通常のSCF計算を行います。このSCF計算においてはk点サンプリングは4×4×4のMonkhorst-Packメッシュを採用しています。つづいて,fc_5x5x5, fc_10x10x10, fc_20x20x20, fc_30x30x30ディレクトリーにおいてk点メッシュを変更した固定電荷の計算を行います。固定電荷計算の入力ファイルには,以下のようにBoltTraPが読み込める形式の固有値データなどが出力されるような設定が施されています。
postprocessing{
boltztrap{
sw_boltztrap = on
version = 1
header = "CoSb3 ksamp 10x10x10 bands 96"
}
}
ekcalもしくはphaseによる固定電荷計算を行うと,以下の3つのファイルが得られるはずです(fc_5x5x5ディレクトリーの場合)
fc_5x5x5.energy fc_5x5x5.struct, fc_5x5x5.intrans
*.energy, *.structファイルは固有エネルギーと座標データが記録されているファイルですが,通常編集する必要はありません。*.intransはBoltTraPの入力ファイルなので目的によっては編集する必要があるかもしれませんが,編集せずともBoltzTraPによる基本的な計算は行うことができるようになっています。
BoltzTraPは以下の要領で実行できます (BoltzTraPの実行ファイルであるx_transにパスが通っていると仮定)。
$ x_trans BoltzTraP
これによって,ディレクトリー名を接頭辞としてもつ多くのファイルが出力されます。ゼーベック係数などの輸送係数の計算結果が出力されるのが*.traceファイルです。たとえば,fc_5x5x5の場合その内容は下記のようになります。
# Ef[Ry] T [K] N DOS(Ef) S s/t R_H kappa0 ...
0.02274 50.0000 34.92246648 0.45246722E+03 -0.16967269E-04 0.94428193E+20 0.15114046E-08 ...
0.02274 100.0000 34.89576852 0.46772674E+03 -0.82371993E-05 0.95266319E+20 0.11470114E-08 ...
0.02274 150.0000 34.86708620 0.47412414E+03 -0.53033332E-05 0.94512268E+20 0.10363499E-08 ...
0.02274 200.0000 34.83810551 0.47509694E+03 -0.38465950E-05 0.94664477E+20 0.93685045E-09 ...
0.02274 250.0000 34.80983692 0.47363201E+03 -0.18452224E-05 0.95321416E+20 0.85951902E-09 ...
...
...
結果は,同じ化学ポテンシャルのデータがセットで出力されます。ゼーベック係数は5カラム目のデータです。300Kにおけるゼーベック係数を,k点サンプリングを変化させながら計算した結果を 図 5.26 に図示します。この結果から,5×5×5のケースはそのほかの場合と比較し明らかに異なる傾向を示しているため,不十分なk点サンプリングであるといえます。10×10×10, 20×20×20, 30×30×30はおおよそ一致していますが,10×10×10のケースではたとえば化学ポテンシャルが0.25から0.3 Rydbergの領域で異なっているように見えます。20×20×20, 30×30×30はほぼ見分けがつきません。したがって,この例では20×20×20のサンプリングでほぼ収束した結果が得られていると考えられます。

図 5.26 CoSb3の300Kにおけるゼーベック係数
5.1.10.5. 参考文献
- Madsen06
Georg K.H.Madsen and David J.Singh, “BoltzTraP. A code for calculating band-structure dependent quantities”, Computer Physics Communications 175, 67, (2006)URL: https://www.imc.tuwien.ac.at/forschungsbereich_theoretische_chemie/forschungsgruppen/prof_dr_gkh_madsen_theoretical_materials_chemistry/boltztrap/
- Madsen18
Georg K.H.Madsen, JesúsCarrete, and Matthieu J.Verstraete, “BoltzTraP2, a program for interpolating band structures and calculating semi-classical transport coefficients”, Computer Physics Communications 231, 140, (2018) URL: https://www.imc.tuwien.ac.at/index.php?id=21094
5.1.11. ベーダ―解析向け電荷密度ファイルの出力 (バージョン2019.02以上)
5.1.11.1. 概要
PHASE/0における実空間における電荷密度出力機能では、通常価電子部分のみが出力されますが、ベーダ―解析では、内殻電子の寄与も考慮することにより、解析精度を上げることが出来ます。そこで、CUBE形式ファイルの出力の際に、内殻電子の寄与を加える機能が搭載されています。
5.1.11.2. ベーダ―解析について
ベーダ―解析とは,CUBE形式のファイルから各原子に割り当てる電子数を求める解析手法です。PHASE/0にベーダ―解析を行う機能そのものは備わっていませんが,ベーダ―解析はbaderプログラム
http://theory.cm.utexas.edu/henkelman/code/bader/
をダウンロードし,コンパイルすることによって簡単に行うことができます。詳しくはbaderプログラムのドキュメントなどを参照してください。
5.1.11.3. 処理内容
価電子密度及び内殻電子密度を、それぞれ \(\rho_{\rm v}(\mathbf{r})\) 及び \(\rho_{\rm c}(\mathbf{r})\) とします。CUBEファイルに出力する全電子密度は、両者の合計です。さて、\(\rho_{\rm c}(\mathbf{r})\) は、サイトIにある原子種 \(\alpha\) の内殻電子密度 \(\rho_{\rm c}^{\alpha} (\mathbf{r}-\mathbf{R}_I)\) を足し合わせたものである。
ここで、は球対称であり、擬ポテンシャルファイル中に出力されています。これを読みこみ、以下の処理をします。
逆格子空間で処理する場合
を価電子密度 \(\rho_{\rm v} (\mathbf{G})\) に加えた \(\rho_{\rm tot} (\mathbf{G})\) を計算し、フーリエ変換により \(\rho_{\rm tot} (\mathbf{r})\) を求める。
実空間で処理する場合
まず、にフーリエ変換を施しを得る。次に、実空間のメッシュ点 jで
を計算し、 \(\rho_{\rm v} (\mathbf{r}_j)\) に加えて \(\rho_{\rm tot} (\mathbf{r}_j)\) を得る。これを全てのメッシュ点に対して行えばよい。なお、内殻電子密度は原子核近傍に局在しているので、メッシュ点 jは、原子位置 \(\mathbf{R}_I\) から適当な距離 rcut以内にあるものを選ぶ。
5.1.11.4. 入力
filetype = cube 及びsw_add_corecharge_rspace = on とすると、(擬ポテンシャルから読み込んだ) 内殻電子密度を加えた全電子密度分布が、CUBE ファイルとして出力されます。また、eval_corecharge_on_Gspace =on (off) のとき、逆格子空間 (実空間) で内殻電子密度を価電子密度に加えます。
postprocessing{
charge{
sw_charge_rspace = on
filetype = cube
sw_add_corecharge_rspace = on ( デフォルト:off )
eval_corecharge_on_Gspace = off ( デフォルト:off )
}
}
5.1.11.5. 出力
出力ファイル名は、価電子密度のCUBEファイル名を元に “_ae” を加えた名称です。例えば、価電子密度CUBEファイル名が “nfchr.data” の場合、全電子密度CUBEファイルは ”nfchr_ae.data” となります。
5.1.11.6. 計算例
GaNの計算例
GaNの例を紹介します。入力ファイルは samples/Bader/GaN
以下にあります。
格子定数や原子位置はあらかじめ最適化したものを採用しました。
bader プログラムを用いる際、以下の評価法1-3を試しました。結果を 表 5.9 に示す。
評価法1: bader nfchr.data ( 価電子密度を利用、従来法 )
評価法2: bader nfchr_ae.data ( 全電荷密度を利用)
評価法3: bader nchr.data -ref nfchr_ae.data
(切断する位置は全電荷密度で決定、積分は価電子密度を利用)
Ga |
N |
評価 |
|
Elk |
|||
plot3dのメッシュ:160×160×250 |
|||
※ |
1.34, 1.59 |
-1.55 |
|
PHASE/0 |
eval_corecharge_on_Gspace = off |
||
cutoff_cd = 270Ry (CD_FFTメッシュ:32×32×108) |
|||
評価法1 |
1.51 |
-1.51 |
○ |
※2 |
3.15 |
-1.44 |
× |
3 |
1.47 |
-1.47 |
○ |
cutoff_cd = 2700Ry (CD_FFTメッシュ:108×108×180) |
|||
評価法1 |
1.58 |
-1.58 |
○ |
※2 |
0.78 |
-1.51 |
× |
3 |
1.51 |
-1.51 |
○ |
cutoff_cd = 6150Ry (CD_FFTメッシュ:160×160×250) |
|||
評価法1 |
1.58 |
-1.58 |
○ |
※2 |
1.58 |
-1.52 |
○ |
3 |
1.51 |
-1.51 |
○ |
PHASE/0 |
eval_corecharge_on_Gspace = on |
||
cutoff_cd = 270Ry (CD_FFTメッシュ:32×32×108) |
|||
評価法1 |
1.51 |
-1.51 |
○ |
2 |
1.35, 1.36 |
-1.36, -1.35 |
× |
3 |
1.28 |
-1.28 |
× |
cutoff_cd = 2700Ry (CD_FFTメッシュ:108×108×180) |
|||
評価法1 |
1.58 |
-1.58 |
○ |
2 |
1.22 |
-1.22 |
× |
3 |
1.22 |
-1.22 |
× |
cutoff_cd = 6150Ry (CD_FFTメッシュ:160×160×250) |
|||
評価法1 |
1.58 |
-1.58 |
○ |
2 |
1.21 |
-1.21 |
× |
3 |
1.21 |
-1.21 |
× |
※電荷密度の積分値が全電荷と一致しない点に注意。
eval_corecharge_on_Gspace = onの場合、全電子密度の積分値がメッシュサイズによらず整数値になるものの、原子近傍に微少な電荷(ごみ)が現れてしまい、bader がこれを検知するため精度が悪いようです。
一方、eval_corecharge_on_Gspace = offの場合、かなりcutoff_cdを上げないと、全電子密度の積分値は、全電荷と一致しません。しかし、評価法3を用いることで、それなりの精度でベーダ―電荷が求められることがわかりました。
4H-SiCの計算例
4H-SiCの例を紹介します。入力ファイルは samples/Bader/4H-SiC
以下にあります。
格子定数や原子位置はあらかじめ最適化したものを採用しました。
GaNの場合と同様、bader プログラムを用いる際、以下の評価法1-3を試しました。結果を 表 5.10 に示します。
評価法1: bader nfchr.data ( 価電子密度を利用、従来法 )
評価法2: bader nfchr_ae.data ( 全電荷密度を利用 )
評価法3: bader nchr.data -ref nfchr_ae.data
(切断する位置は全電荷密度で決定、積分は価電子密度を利用)
Si |
C |
評価 |
|
---|---|---|---|
Elk |
|||
plot3dのメッシュ:150×150×480 |
|||
※ |
2.66 |
-2.70, -2.69 |
|
PHASE/0 |
eval_corecharge_on_Gspace = off |
||
cutoff_cd = 270Ry (CD_FFTメッシュ:32×32×108) |
|||
評価法1 |
4.00 |
-4.00 |
× |
※2 |
-4.27, 2.88 |
-2.66, -2.55 |
× |
3 |
2.56, 2.58 |
-2.58, -2.56 |
○ |
cutoff_cd = 2700Ry (CD_FFTメッシュ:100×100×320) |
|||
評価法1 |
4.00 |
-4.00 |
× |
※2 |
2.59, 2.67 |
-2.68, -2.67 |
○ |
3 |
2.65, 2.66 |
-2.66, -2.65 |
○ |
cutoff_cd = 6150Ry (CD_FFTメッシュ:150×150×480) |
|||
評価法1 |
4.00 |
-4.00 |
× |
※2 |
2.66, 2.68 |
-2.69, -2.68 |
○ |
3 |
2.66, 2.67 |
-2.67, -2.66 |
○ |
PHASE/0 |
eval_corecharge_on_Gspace = on |
||
cutoff_cd = 270Ry (CD_FFTメッシュ:32×32×108) |
|||
評価法1 |
4.00 |
-4.00 |
× |
2 |
0.94, 1.03 |
-0.92, -1.03 |
× |
3 |
0.89, 1.06 |
-0.94, -1.01 |
× |
cutoff_cd = 2700Ry (CD_FFTメッシュ:100×100×320) |
|||
評価法1 |
4.00 |
-4.00 |
× |
2 |
1.18, 1.24 |
-1.22, -1.19 |
× |
3 |
1.18, 1.24 |
-1.22, -1.19 |
× |
cutoff_cd = 6150Ry (CD_FFTメッシュ:150×150×480) |
|||
評価法1 |
4.00 |
-4.00 |
× |
2 |
1.20, 1.24 |
1.21, 1.23 |
× |
3 |
1.20, 1.24 |
1.21, 1.23 |
× |
※電荷密度の積分値が全電荷と一致しない点に注意。
GaNの場合と同様に、eval_corecharge_on_Gspace = onの場合、全電子密度の積分値がメッシュサイズによらず整数値になるものの、原子近傍に微少な電荷(ごみ)が現れてしまい、bader がこれを検知するため精度が悪いようです。
一方、eval_corecharge_on_Gspace = offの場合、かなりcutoff_cdを上げないと、全電子密度の積分値は、全電荷と一致しません。しかし、評価法3を用いることで、それなりの精度でベーダ―電荷が求められています。また、GaNの場合と異なり、価電子密度のみを用いる評価法1は期待される結果を出力しておらず、注意が必要です。
5.1.12. band-unfolding計算機能(2020.01以降)
5.1.12.1. 概要
Band-unfolding計算機能とは、「基本格子の逆格子ベクトルのBZ内の対称点を結ぶ k点で、スーパーセルのバンド計算を行い、バンド計算終了後、各波動関数のGベクトル成分のうち、基本格子の逆格子ベクトルの周期をもつ成分を取り出すフィルターをかけ、その (重み)成分をファイルに出力する」機能です。可視化については band.pl と同様に、gnuplot の描画機能を用いるようなperlスクリプトが付属します。
各k点で波動関数 \(\psi_{nk\sigma}\) (バンドn、スピン \(\sigma\) )が得られた後、スペクトル強度
を計算し、ファイルに出力します。ここで、Gprは、基本格子の逆格子ベクトルが作るGベクトルです。なお、非ノルム保存擬ポテンシャルの場合には、
となります。ここで、 \(\beta_{\tau l m}^I\) は、原子I、主量子数 \(\tau\) 、方位量子数 \(l\) 、磁気量子数 \(m\) におけるプロジェクタです。また、 \(q_{\tau l m, \tau' l' m'}^I\) は補償電荷です。
5.1.12.2. 入力ファイル
band-unfolding計算機能を利用するには、reference_cell ブロックで、基本格子ベクトルを指定します。また、band_unfoldingブロック内で sw_band_unfolding = on とします。なお、k点座標は、スーパーセルではなく基本格子のBZ の対称点を結ぶ線上に生成しておく必要があります。
control{
condition = fixed_charge
}
accuracy{
ksampling{
method = file
}
}
structure{
reference_cell{
#units angstrom
a_vector = 0.0000 2.1798 2.1798
b_vector = 2.1798 0.0000 2.1798
c_vector = 2.1798 2.1798 0.0000
}
}
postprocessing{
band_unfolding{
sw_band_unfolding = on
}
}
5.1.12.3. 出力ファイル
スペクトル強度がF_BAND_SPECTR_WGHTで指定したファイル (デフォルト:nfband_spectr_wght.data ) に出力される。の最小・最大値は0及び1である。
num_kpoints = 141
num_bands = 32
nspin = 1
ik = 1 ( 0.00000000 0.50000000 0.50000000 )
0.0000000000 0.3333333226 0.6331196968 0.0335469806
0.2340754547 0.3217382137 0.4441863316 0.1846990206
…
(後略)
5.1.12.4. band-unfold.plスクリプトの利用
band-unfold.pl を用いると、gnuplotを用いて可視化するためのファイルが生成されます。以下にスクリプト使用法を示します。このスクリプトは、スペクトル強度 ( plot_band_energy.dat ) あるいはスペクトル関数 ( plot_band_energy.map ) を出力ます。同時に生成されるplot_band_unfolding.gnu は gnuplot 用のファイルです。ここで、スペクトル強度は、 (5.19) 或いは (5.20) で定義されます。スペクトル関数は、
で得るものとします。
(スペクトル強度をplotする場合)
band-unfold.pl EnergyDataFile KpointFile SpectralWeightFile
-erange=Emin,Emax -einc=dE -window_width=SIZE
-with_dispersion -with_fermi -circle_radius=SIZE
-color -print_format={eps,png} -outfile=AAA
(スペクトル関数をplotする場合)
band-unfold.pl EnergyDataFile KpointFile SpectralWeightFile
-spectral_func
-erange=Emin,Emax -einc=dE -window_width=SIZE
-ndiv=VAL -sigma=VAL -line_width=VAL-cbrange=Cbmin,Cbmax
-color -print_format={eps,png} -outfile=AAA
EnergyDataFile はバンド固有値ファイル、KpointFile はk点を生成するために使用したファイル、SpectralWeightFile は上述のスペクトル強度を格納したファイルです。これらの3ファイルの指定は必須です。
オプション |
意味 |
デフォルト値 |
---|---|---|
-erange=Emin,Emax |
プロットするエネル ギー領域を指定する。 |
なし |
-einc=dE - |
図の縦軸の increment を指定する。 |
なし |
-window_width=SIZE |
プロットするWindo wのサイズを指定する。 |
0.50 |
-color |
カラー出力を行う。 |
NO |
-p rint_format={eps,png} |
eps あるいは png 出力のいず れを行うか指定する。 |
eps |
-outfile=AAA |
可視化したファイ ル名をAAAに指定する。 |
epsファイルの時は unfolded_band.eps, png ファイルの時は unfolded_band.png |
スペクトル強度のみ |
||
-with_dispersion |
スペ クトル強度のみならず 、計算したすべてのバ ンドをプロットする。 |
なし |
-with_fermi |
フェルミエネルギー ( 0.0 eV )の位置に線を引く。 |
なし |
-circle_radius=SIZE |
スペクトル強度1.0 ( 最大値)に対応するデー タ点(円で表示)の半径 |
0.2 |
スペクトル関数のみ |
||
-spectral_func |
スペク トル関数を出力する。 |
なし |
-ndiv=VAL |
表示する エネルギー範囲内で、 スペクトル関数を計算 するエネルギーの点数 (均等分割)。 |
400 |
-sigma=VAL |
スペク トル関数をGaussianで 滑らかにする際の偏差 |
0.05 |
-line_width=VAL |
スペクトル関数をプロ ットする際の線の太さ |
4 |
-cbrange=Cbmin,Cbmax |
プロットするカラ ーレンジを指定する。 |
なし |
以下に、band-unfold.plの使用例を示します。この例では、スペクトル強度を出力し、gnuplot を通じて eps ファイルunfolded_band.epsを生成します。なお、nfenergy.data はバンド固有値ファイル、bandkpt.in はk点を生成するために使用したファイル、nfband_spectr_wght.dataはスペクトル強度を出力したファイルです。
band-unfold.pl nfenergy.data bandkpt.in nfband_spectr_wght.data -with_fermi -color
5.1.12.5. 例題
Band-unfolding機能の利用例を紹介します。入力(と一部出力)は samples/dos_band/Unfold
以下のサブディレクトリーにあります。
Teドープ 2H-MoS2
図 5.27 (左上)に2H-MoS2 の基本格子を示します。この系を ab 面内に2倍した構造や、さらに2個のS原子をTe原子に置換した構造を考えます。用いた計算条件は以下のとおりです。
2H-MoS2 の基本格子及びスーパーセルの計算における条件
波動関数カットオフ [Ry] |
25 |
---|---|
電荷密度カットオフ [Ry] |
225 |
k点サンプリング |
SCF計算:Monk (4×4×1)あるいは(2×2×1) |
交換相関相互作用 |
PBE+D2 |
擬ポテンシャル |
Mo_ggapbe_paw_02.pp, S_ggapbe_paw_03.pp, Te_ggapbe_paw_02.pp |
図 5.27 (左下)に2H-MoS2 基本格子のブリルアンゾーン及び対称点、(右)にバンド分散を示します。 図 5.28 に、単位胞をab面内方向にそれぞれ2倍したスーパーセルに対する、アンフォールドしたバンド分散を示します。灰色の細線は全バンドの分散に対応し、各赤丸の半径はスペクトル強度に対応します。 図 5.29 に、2個のS原子をTe原子に置換した構造に対する、アンフォールドしたバンド分散を示します。半径の異なる赤丸が多々見られるのは、Teの導入による周期の乱れを反映しています。

図 5.27 (左上) 2H-MoS2基本格子の構造。(左下)ブリルアンゾーン及び対称点。(右)バンド分散。

図 5.28 (左上) 図 5.27 を面内方向に2倍拡げたスーパーセル。 (左下) 基本格子のブリルアンゾーン及び対称点。(右)アンフォールドしたバンド分散。

図 5.29 (左上)図 5‑26の2個のS原子をTeに置換したスーパーセル。 (左下) 基本格子のブリルアンゾーン及び対称点。(右)アンフォールドしたバンド分散。
図 5.30 に、 図 5.29 と同じ系に対するスペクトル関数を示します。なお、スペクトル関数は
で定義しています。

最後に、作図に使用したコマンドを示します。
図 5.28 図 5.29 図 5.30 の生成に使用したコマンド
スペクトル強度のプロット |
---|
band-unfold.pl nfenergy.data bandkpt.in nfband_spectr_wght.data -with_fermi -color -erange=-6,4 -print_format=png -with_dispersion |
スペクトル関数のプロット |
band-unfold.pl -spectral_func nfenergy.data bandkpt.in nfband_spectr_wght.data -with_fermi -color -erange=-6,4 -print_format=png |
GeドープSi
図 5.31 (左)に、Siブラベー格子内の8原子のうち、2原子をGe原子に置換した構造を示します。 この構造に対して、Si 2原子から成る基本格子のブリルアンゾーンを考え、対応するバンド分散を計算します。 計算条件は以下のとおりです。なお、格子定数 ( a = 5.543 Å)及び原子配置は、事前に最適化を行った値を使用しました。
GeドープSiの計算における条件
波動関数カットオフ [Ry] |
25 |
電荷密度カットオフ [Ry] |
225 |
k点サンプリング |
SCF計算:Monk (4×4×4) |
交換相関相互作用 |
PAW-PBE |
擬ポテンシャル |
Si_ggapbe_paw_02.pp, Ge_ggapbe_paw_02.pp |
図 5.31 (右)に、アンフォールドしたバンド分散を示します。 灰色の細線は全バンドの分散に対応し、各赤丸の半径はスペクトル強度に対応します。
図 5.31 作成に使用したコマンド
band-unfold.pl nfenergy.data bandkpt_fcc_xglux.in nfband_spectr_wght.data -with_fermi -print_format=png -color

図 5.31 (左) GeドープSiの構造。(右)アンフォールドしたバンド。
5.1.13. 原子周囲局所ポテンシャル出力機能(2021.02以降)
5.1.13.1. 機能の概要
本機能を用いることによって原子周囲の局所ポテンシャルの平均値を評価することが可能です。
局所ポテンシャルを \(V\left(r\right)\), 原子A中心の球対称な重み関数をfとすると、原子Aの周囲の局所ポテンシャル平均値は、
であらわされます。関数fとしては、積分半径 \(r_c\) 内でのみ有限の値を持つ関数
が考えられます。ここで\(\Omega=\frac{4\pi r_c^3}{3}\) です。さて、PHASE/0では、局所ポテンシャルは
のように表現されるので (5.22) (5.23) を (5.21) に代入するとつぎのような表式が得られます。
(5.24) 式を用いて原子周囲の局所ポテンシャルの平均値を求めることができます。
5.1.13.2. 入力パラメーターファイル
局所ポテンシャル平均値を計算するには、以下のような入力を作成します。
postprocessing{
potential_average{
sw_calc_pot_avg = on ! { on |off }, default : off
sw_add_xc_pot = on ! { on | off }, default : off
cutoff_radius = 2.0 bohr ! default : 2.0
}
}
sw_calc_pot_avg = on を指定すると、原子近傍の局所ポテンシャルの平均値を計算します。sw_add_xc_pot = on の場合、局所ポテンシャルに交換・相関ポテンシャルを含めるようにします。原子を中心とした空間積分の積分半径は、cutoff_radius で指定します。
5.1.13.3. 出力ファイル
局所ポテンシャル平均値は、potential_on_atoms.dataに出力されます。
# Potential on atoms
# id pot (eV)
1 -19.343121
2 -19.539243
(後略)
第1列及び第2列は、それぞれ原子のインデックス、局所ポテンシャルの平均値 (単位:eV)に対応します。
5.1.13.4. 計算例: Al-Graphene-Al系
Al-Graphene-Al系を用いた計算例を紹介します。入力ファイルは samples/local_pot_av/Al-Graphene-Al
以下にあります。
Al-Graphene-Al系の原子配置は、 図 5.32 に示す通りです。

図 5.32 Al-Graphene-Al系の原子配置。茶及び水色の球は、それぞれ C及びAl原子に対応する。C原子のインデックスは、左端から順につけるものとする。
その他の計算条件は以下のとおりです。
計算条件 |
値 |
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k点サンプリング |
monk (1x36x1, \(\Gamma\) -centered) |
交換相関相互作用 |
GGAPBE, PAW |
SCF収束条件 [Ha/atom] |
1.0E-8 |
計算結果を以下に示します。青線及び赤線は、それぞれ積分半径1.0及び2.0 の結果に対応します。また、四角 (丸) は、交換相関ポテンシャルを含まない (含む) 計算に対応します。プロファイルは、積分半径や交換相関ポテンシャルの有無に、あまり依存しないことが分かります。

図 5.33 Al-Graphene-Al 系の局所ポテンシャル平均値のプロファイル。左端のC原子のポテンシャルがエネルギーの原点です。
5.2. 原子ダイナミクス
5.2.1. 振動解析
5.2.1.1. 機能の概要
PHASEには格子振動の基準モードを計算する振動解析機能があります。まず、原子を平衡位置からわずかに変位させて力計算を行います。その力から力定数行列を計算し、それから動力学行列を計算します。動力学行列の固有値問題を解くことにより,基準振動の振動数と固有ベクトルを計算します。
\(i\)番目の原子の安定位置から変位を\(\mathbf{u}_{i}\)とします。 変位が微小で二次以上の項が無視できるとき,格子系の運動方程式は
と書けます。\(\Phi_{i\alpha,j\beta}\)は力の定数で,原子変位に関する系のエネルギー\(E(\mathbf{u}_{1},\mathbf{u}_{2},\ldots)\)の二階微分として定義されています。
力の定数はヘルマン-ファインマン力を原子変位で微分することにより, 求めることができます。
本プログラムでは,この微分は中央差分近似で行われます。変位パラメターを\(a\)とすると
と書けます。 力の定数には結晶の対称性による制約があり,これを満たすように力の定数を補正する必要があります。第一に,\(i,j\)原子が空間群の対称操作\(\{ R|\mathbf{T}\}\)で\(i^{'},j^{'}\)原子に移るとき,力定数テンソル\(\Phi_{i,j}\)は力定数テンソル\(\Phi_{i^{'},j^{'}}\)を回転行列Rで回転させたものに等しいです。つまり,
ならば,
でなければなりません。 第二に,力定数テンソル\(\Phi_{i,j}\)の成分\(\text{αβ}\)を原子の番号\(j\)すべてにわたり足し合わせると,ゼロになります。つまり,
です。 第三に,力定数行列は対称でなければなりません。つまり,
です。 換算変位\(w_{\text{iα}} = u_{\text{iα}}\sqrt{m_{i}}\)と 動力学行列\(D_{i\alpha,j\beta} = \Phi_{i\alpha,j\beta}/\sqrt{m_{i}m_{j}}\)を用いて, 格子系の運動方程式 (5.25) を
と書き換えます。この方程式を解くために, \(w_{\text{iα}} = Q\xi_{\text{iα}}e^{i\omega t + \delta}\) という解を仮定します。
これは固有値が\(\omega^{2}\)で,固有ベクトルが\(\xi_{\text{iα}}\)となる, 行列\(D_{i\alpha,j\beta}\)の固有値問題です。振動解析機能ではこの固有値問題を解き,格子振動の基準モードを求めます。
5.2.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倍になるので注意してください。
5.2.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) Ha = omega_ev(m) eV; nu= omega_nu(m) cm^-1
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に設定することで,出力された力を読み込み,振動解析をやり直すことができます。元素の質量を変更することは問題ありませんが,力計算に関連する変数は変更してはなりません。
5.2.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の原子が存在する振動解析の場合は対称性を考慮しないようにしてください。
5.2.1.5. 原子間力をファイルから読み込む方法(バージョン2020.01以降)
原子間力が計算済みの場合(force.dataファイルが存在し,原子間力データが記録されている場合),計算開始前にファイルから読み込み,その原子間力の計算をスキップさせることが可能となりました(2020.01以降この動作が規定の振る舞い)あえて原子間力を新たに計算し直したい場合は,以下の設定を施します。
phonon{
sw_read_force_pre = off
}
phononブロックの下のsw_read_force_preによって可能な場合はファイルから原子間力を読み込むかどうかを設定します。このパラメーターのデフォルト値はonなので,offとすることによってこの振る舞いを抑制し,原子間力を計算し直すことができます。
5.2.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
xctype = ggapbe
initial_wavefunctions = matrix_diagon
matrix_diagon {
cutoff_wf = 5.0 rydberg
}
ksampling{
method = gamma
}
scf_convergence{
delta_total_energy = 1.e-10
succession = 3
num_max_iteration = 300
}
force_convergence{
max_force = 1.e-4
}
initial_charge_density = Gauss
}
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{
!#default mobile=on
!#tag rx ry rz element
-1.45 0.000 1.123 H
1.45 0.000 1.123 H
0.0 0.0 0.0 O
}
}
element_list{ #units atomic_mass
#tag element atomicnumber zeta dev
H 1 1.00 0.5
O 8 0.17 1.0 }
}
wf_solver{
solvers {
!#tag sol till_n dts dte itr var prec cmix submat
msd 5 0.1 0.1 1 tanh on 1 on
lm+msd 10 0.1 0.4 50 tanh on 1 on
rmm2p -1 0.4 0.4 1 tanh on 2 on
}
rmm {
edelta_change_to_rmm = 1.d-6
}
lineminimization {
dt_lower_critical = 0.1
dt_upper_critical = 3.0
}
}
charge_mixing{
mixing_methods {
!#tag id method rmxs rmxe itr var prec istr nbxmix update
1 broyden2 0.3 0.3 1 linear on 5 10 RENEW
2 simple 0.2 0.5 100 linear on * * *
}
}
structure_evolution{
method = cg
}
file_names.dataにはelement_listと同じ順番でポテンシャルファイルH_ggapbe_nc_01.ppとO_ggapbe_us_02.ppを指定します。この入力を使用して得た水分子の構造を 図 5.34 に示します。
図 5.34 水分子の構造
振動解析
構造最適化後に振動解析を行うには,入力の原子座標を最適化した座標に換えて,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
この例題の水分子の基準モードの振動数を 図 5.35 に示します。
図 5.35 水分子の振動モードの振動数
基準振動の固有ベクトルの図を作成するための拡張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が生成されます。
この例題の水分子の基準モードの固有ベクトルを 図 5.36 に示します。生成された振動モードの拡張trajectory形式のファイルmode_7.tr2,mode_8.tr2,mode_9.tr2を可視化したものです。

図 5.36 水分子の振動モードの固有ベクトル
5.2.1.7. 計算例:シリコン結晶(Si2)
入力パラメータ
シリコン結晶の振動解析の例題です。計算例題は、 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というタイトル行の次の行にはモード数と原子数があらわされています。これ以降には各振動モードの既約表現を先頭行として,次行に振動数があらわされ,その次の行から固有ベクトルがあらわされています。固有ベクトルは原子の番号の後にその原子に帰属するベクトルの3成分があらわされています。
振動数レベル図
振動解析の出力ファイルmode.dataの振動数のデータから振動数レベル図を作成します。 以下のように、ツールfreq.plを実行すると、Postscript形式の振動数レベル図freq.epsが出力されます。
% freq.pl mode.data
シリコン結晶の振動解析の振動レベル図を 図 5.37 に示します。この図から振動数が517 cm-1であるモードがあることが分かります。 このモードの既約表現はT2gであるので,同じ振動数のモードが三重に縮重しています。T2gモードがラマン活性である場合,図中の規約表現の右側にRが表示されます。赤外活性である場合にはIRと表示されます。
図 5.37 バルクSiの領域中心フォノンモードの振動数
振動モードの可視化
振動解析の出力ファイル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を可視化すると, 図 5.38 のように固有ベクトルが矢印で示されます。 図 5.38 に示されているセルは,出力されたgrid.mol2ファイルを読み込ことで表示できます。また,出力された拡張Trajectory形式から、原子の振動を可視化することができます。
図 5.38 バルクSiの領域中心フォノンモードの固有ベクトル
5.2.1.8. 計算例:銅 (100)面に吸着したエチレン分子の振動解析
Cu(100)面にエチレン分子を配置した系の振動解析を実施しました。サンプルデータは samples/phonon/Cu100_C2H4
の下にあります。まずはCu(100)面にエチレン分子を吸着させ,通常の構造最適化を実施しました。
結果得られた原子配置は 図 5.39 に示す通り。

図 5.39 Cu (100)面にC2H4分子を吸着させた系。
分子のみを考慮するケース(サンプルデータが置かれたディレクトリーはmolonly),分子と表面第一層まで考慮するケース(サンプルデータが置かれたディレクトリーはph1),分子と表面第二層まで考慮するケース(サンプルデータが置かれたディレクトリーはph2),そしてすべての原子を考慮する(サンプルデータが置かれたディレクトリーはphall)振動解析を実施しました。比較のため,孤立分子の振動解析も行いました。得られた振動数の上位5つを 表 5.13 に報告します。
分子のみ |
分子+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の誤差となっており,これは同じ結果が得られているといってもよい精度です。
5.2.2. フォノンバンド計算
5.2.2.1. 機能の概要
PHASEには, \(\Gamma\) 点だけでなく一般のk点における格子振動解析を行い、フォノンの状態密度やバンド構造を計算する機能があります。 文献 [Parlinski97] のアルゴリズムに従って計算します。
5.2.2.2. 利用方法
基本的な入力パラメータ
この機能を利用するためには, \(\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_vib rational_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 によって得られたボルン有効電荷を利用することが望ましいです。
計算の実行
入力データが準備できたら,通常通り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 点メッシュです。
出力ファイル
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}}\)と記述されるので,フォノンのエネルギーを代入し整理すると以下の結果が得られます。
ヘルムホルツの自由エネルギーは\(F_{\text{vib}} = \sum_{k}^{}{- k_{B}T\log Q_{k}}\)と記述できるので,以下のように記述されます。
振動による平均の内部エネルギーは\(U_{\text{vib}} = \frac{1}{Q_{k}}\sum_{n}^{}{U_{\text{kn}}\exp\left( - \frac{U_{\text{kn}}}{k_{B}T} \right)}\)と記述できるので,以下のように記述することができます。
エントロピーは,\(F_{\text{vib}}\)および\(U_{\text{vib}}\)から\(\left( U_{\text{vib}} - F_{\text{vib}} \right)/T\) と計算することができます。定積比熱は内部エネルギーの温度に関する偏微分で与えられるので,以下のように計算することができます。
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.

図 5.40 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 |
比熱の目盛を指定します。 |
5.2.2.3. 例題
シリコン結晶
最も簡単な例の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 用の入力ファイルを指定していますが,この指定がない場合はバンド図に特殊点を表す縦線などは描画されなくなります。結果は次に示す図のようになります。

図 5.41 シリコン結晶のフォノンバンド
フォノンの状態密度の計算に必要な入力データは, 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
この結果得られるフォノン状態密度図は次に示す通りです。

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

図 5.43 ヨウ化カリウムの結晶構造
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分裂によって考慮しない場合は縮退している状態が分裂しています。

図 5.44 KI 結晶のフォノンバンド。赤線がLO-TO分裂を考慮せずに計算した結果,青線がLO-TO 分裂を考慮して計算した結果。
スズの温度誘起相転移
最後に,フォノン自由エネルギー解析の簡単な適用例としてスズの温度誘起相転移の例を紹介します。この例題の入力ファイルは, samples/phonon_band/Sn/a-Sn
(αスズ)および samples/phband/Sn/b-Sn
(βスズ)にあります。
スズには,αスズとβスズと呼ばれる同素体があります。αスズはダイヤモンド構造,βスズはその名の通りβスズ構造をとります。その結晶構造を, 図 5.45 に示します。

図 5.45 αスズ(左図)とβスズ(右図)の結晶構造
βスズ構造はダイヤモンド構造を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列目にフォノンの自由エネルギーが記録されます。これは単位胞あたりの値なので,上述の全エネルギーの単位胞あたりのエネルギーを加え,温度の関数としてプロットすると 図 5.46 のような結果が得られます。

図 5.46 αスズとβスズの自由エネルギーと温度の関係。赤線がαスズ,緑線がβスズに対応する。
図 5.36 においてαスズの曲線(赤線)とβスズの曲線(緑線)が交差する温度が転位温度と考えられます。この計算ではおおよそ510 Kとなりました。実際には290 Kなので相転移温度が高く評価されてしまいましたが,このような計算によって温度誘起の構造相転移を説明できることはお分かりいただけたと思います。
5.2.2.4. 使用上の注意
一般の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 はもとの対称性を保つような指定の仕方をしてください。異なる対称性の場合,意味のある計算は行われません。
5.2.2.5. 参考文献
- Parlinski97
Parlinski, Z. Q. Li and Y. Kawazoe, Physical Review Letters vol. 78 pp. 4063 (1997)
5.2.3. 分子動力学法シミュレーション
5.2.3.1. 機能の概要
PHASEは、原子に働く力を利用して分子動力学法シミュレーションを行うことが可能です。 エネルギー一定,温度一定,圧力一定の分子動力学シミュレーションなどが実行できます。
5.2.3.2. 入力パラメータ
分子動力学法シミュレーション機能と関連あるタグの一覧を表に示します。
分子動力学法シミュレーション機能に関連のあるタグの一覧
第1 ブロック識別子 |
第2,第3 ブロック識別子 |
タグ識別子 |
説明 |
---|---|---|---|
struc ture_evolution |
原子座標データ の更新方法を指 定するブロック |
||
method |
原子座標 の更新方法を指 定する。分子動 力学シミュレー ションの場合, v elocity_verlet (エ ネルギー一定の 分子動力学シミ ュレーション) tempe rature_control (温度一定の 分子動力学シミ ュレーション) pr essure_control (エネルギ ー・圧力一定の 分子動力学シミ ュレーション) temperature_pr essure_control (温 度・圧力一定の 分子動力学シミ ュレーション) |
||
dt |
時間刻 みを指定する。 デフ ォルト値は100 au (約2.4 fs) |
||
tempe rature_control |
温 度制御の設定を 行うブロック。 |
||
method |
温度 制御の方法を指 定する。nose_ hooverかveloci ty_scalingのい ずれか。nose_ hooverの場合は Nose-Hoover熱 浴による温度制 御が,velocity _scalingの場合 は温度スケーリ ングによる温度 制御が行われる 。デフォルト値 はnose_hoover. |
||
sw_r ead_velocities |
原子の初期速 度を,PHASE/0 に自動生成させ るのではなく手 動で入力する場 合にこのパラメ ータをonとしま す。デフォルト 値はoffです。 |
||
set_in itial_velocity |
原子 の初期速度をプ ログラムが自動 的に設定するか どうかを指定す るスイッチ。デ フォルト値はon |
||
sw_sh ift_velocities |
全 運動量がゼロに なるよう,MDス テップごとに速 度をシフトする かどうかを指定 するスイッチで す。デフォルト 値はoffです。 |
||
thermostat |
熱浴の設定を 行うブロック。 表形式データ。 |
||
temp |
温 度を指定する。 |
||
qmass |
熱浴の質 量を指定する。 |
||
tdamp |
熱浴の 質量を直接指定 するのではなく 、その周期を時 間の単位で指定 する。qmassに よる指定の方が 優先される。な お、qmassもtda mpも指定がない 場合,tdamp=5 0×dtに相当する 周期の質量がデ フォルト値とし て採用される。 |
||
pr essure_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_veloci ties=onの場合) に各原子の速度 のx,y,z値を原 子単位で入力す る。入力が省略 される場合,0 とみなされる。 |
||
element_list |
元素情 報を指定する。 表形式データ。 |
||
mass |
対応する元素の 質量を指定する 。デフォルト値 は原子単位であ ることに注意。 |
5.2.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計算の回数です。三列目は,系の内部エネルギー, 四列目は系の運動エネルギーです。五列目は系の内部エネルギーと運動エネルギーを足した値であり,エネルギー一定の分子動力学シミュレーションにおける保存量です。
5.2.3.4. 使用方法:エネルギー一定の分子動力学シミュレーション
エネルギー一定の分子動力学シミュレーションの入力パラメータ例です。
計算例題は、 samples/dynamics/molecular_dynamics/NVE
です。
accuracy{
cutoff_wf = 9.00 rydberg
cutoff_cd = 36.00 rydberg
num_bands = 8
xctype = ldapw91
force_convergence{
max_force = 1.0e-8 Hartree/Bohr
}
initial_wavefunctions = matrix_diagon
ksampling{
mesh{
nx = 4
ny = 4
nz = 4
}
}
scf_convergence{
delta_total_energy = 1e-12 Hartree
succession = 3
}
}
...
...
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)方向にお互いから離れるように少しだけずらしています。
手法の選択
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になるよう初期速度が設定されます。
計算結果の例
この計算例の計算結果の内部エネルギー,運動エネルギー,全エネルギーを 図 5.47 に示します。
図 5.47 内部エネルギー,運動エネルギー,全エネルギーと時間の関係。
5.2.3.5. 使用方法:温度一定の分子動力学シミュレーション
温度一定の分子動力学シミュレーションの入力パラメータ例です。
計算例題は、 samples/dynamics/molecular_dynamics/NVT
です。
熱浴の設定
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の周期が実現するように熱浴の質量が設定されます。
熱浴の割り当て
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を設定していますが, 各原子が異なる熱浴に関連付けられていても問題ありません。
熱浴の“段数”の設定 (バージョン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法です。
“温度プロファイル”の設定 (バージョン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の温度が使い続けられる仕様になっています。
ランジュバン熱浴の設定(バージョン2021.02以上)
ランジュバン熱浴の運動方程式は次の様に定義することができます。
\(\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万ステップの分子動力学シミュレーションを実施しました。
図 5.48 にシミュレーションの結果得られた運動エネルギーの履歴を示しました。この図から明らかなように,ランジュバン熱浴によるシミュレーションではターゲット温度に相当する運動エネルギー(図中の黒い水平線)に はやい段階で達しています。また,能勢フーバー熱浴の結果と比較すると運動エネルギーの振幅も小さい傾向です。結晶の計算の場合ランダムな作用による減衰が少ないため決定論的な能勢フーバー熱浴を用いると人工的な振動が減衰しにくい傾向がありますが, ランジュバン熱浴の場合はそもそもがランダム力を付与しているため,「ランダムな作用による減衰」が発生しやすい影響が現れた結果と考えられます。
図 5.48 運動エネルギーの履歴。赤:ランジュバン熱浴,緑:能勢フーバー熱浴。
図 5.49 には運動エネルギーの分布を示します。カノニカルアンサンブルの場合,運動エネルギーはマクスウェルボルツマン分布に従うはずです。運動エネルギーのマクスウェルボルツマン分布は以下のように記述することができます。
比較のため, (5.36) 式の分布も 図 5.49 にプロットしました。一見して明らかなように,ランジュバン熱浴の方がマクスウェルボルツマン分布によく従う分布となっています。 これもやはりランダム力を取り入れているがゆえのモードの減衰が要因と考えられます。
図 5.49 運動エネルギー分布。赤丸:ランジュバン熱浴,緑丸:能勢フーバー熱浴,黒線:マクスウェルボルツマン分布
なお,現バージョンにおいては後述の圧力一定の分子動力学シミュレーションにランジュバン熱浴を用いることはできません。
5.2.3.6. 使用方法:温度・圧力一定の分子動力学シミュレーション
PHASE/0は, [Souza97] , [Hernandez01] などの文献において解説されている手法によって圧力一定の分子動力学シミュレーションを行うことができます。
入力パラメーターファイルの書き方
まず,温度一定の分子動力学シミュレーションと同様の手続きで入力パラメーターファイルを作成します。通常の温度一定の場合との違いは,圧力も一定であること,また圧力浴の設定が必要なことの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
}
}
設定方法の詳細は,下記の通り。
- MD手法の選び方 | methodにtemperature_pressure_controlもしくはpressure_temperature_controlを指定すると温度-圧力一定の分子動力学シミュレーション,すなわちNPT分子動力学シミュレーションを実行することができます。pressure_controlとすると圧力一定の分子動力学シミュレーション,すなわちNPH分子動力学シミュレーションを実行することができます。
- 温度制御の設定 | 温度制御は,NVTの場合と同様temperature_controlブロックにおいて行います。ただし,NVTシミュレーションでは複数の熱浴を定義することが可能であるのに対し,NPTシミュレーションの場合に定義できる熱浴は一つのみである点に注意してください。また,上記の例ではコメントアウトされていますが,method = velocity_scalingと指定することによって速度スケーリングによる温度制御を利用することもできます。Nosé-Poincaréの熱浴で温度制御を行うことが理想的ですが,安定に運動方程式が時間発展できない場合は速度スケーリングを利用してください。指定がなければNosé-Poincaré熱浴が採用されます。
- 圧力制御の設定 | 圧力制御は,pressure_controlブロックを作成し,その下で設定します。pressureに目的の圧力を指定します。圧力の単位のデフォルト値は原子単位ですが,GPaなどを利用することもできます。mass_baroには熱浴の質量を指定します。デフォルト値は1であり,単位の指定はできません。目安としては,熱浴の周期(単位胞の体積変化の周期)が100 MDステップ相当程度の時間になるように決めるとよいでしょう。
- 計量テンソルに対する拘束条件の設定 | mxyパラメーターによって,計量テンソルの変化に対して拘束条件を課すことができます。たとえばm11 = offとすると11成分(a軸・a軸)が変化しなくなり,m12 = onならば12成分(a軸・b軸)および21成分(b軸・a軸)が変化しなくなります。このパラメーターのデフォルト値はすべてonなので,特に指定がなければ計量テンソルのすべての成分が変化します。
NPTシミュレーション結果で得られる主な出力ファイルは,エネルギーなどの履歴を記録したnfefn.dataファイル,座標データの履歴を記録したnfdynm.dataファイル,計量テンソルの履歴を記録したnfmetric.dataファイル,そして格子定数の履歴を記録したnflatconst.dataファイルである。それぞれについて説明する。
nfefn.dataファイル
エネルギーなどの履歴を記録したファイルであり,構造最適化やNVTのMDシミュレーションの場合も得られます。NPTシミュレーションの場合,以下のような出力が得られます。なお,紙幅の都合で1行を改行して表示しています。
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です。
5.2.3.7. 分子動力学シミュレーションにまつわるその他の設定
速度スケーリングによる温度制御の分子動力学シミュレーション
Nos\(\acute{e}\)-Hooverの熱浴ではなく,原子の速度を温度が合うようにスケールし直すことによって温度を制御することも可能です。このような計算は,temperature_controlブロックの下のmethod変数をvelocity_scalingとすることによって実現することができます。
structure_evolution{
...
temperature_control{
method = velocity_scaling
...
}
}
速度は,目的の温度に合うよう毎MDステップスケールされます。
全運動量がゼロになるよう速度をシフトする方法
分子動力学シミュレーションにおいて理論上全運動量は保存します(ゼロになる)が,実際は数値誤差によりゼロとはならず,系全体が並進してしまう場合があります。これを防ぐには,以下のように変数sw_shift_velocitiesの値をonとし,MD計算中全運動量がゼロとなるようにします。
structure_evolution{
...
temperature_control{
...
sw_shift_velocities = on
}
}
原子の初期速度を手動で指定する方法
原子の初期速度は通常ランダムな正規分布が得られ,対応する温度が設定した温度で,全運動量が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
}
}
原子を領域に閉じ込める方法 (バージョン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 ! エネルギーを加える
eps = 0.001 !ポテンシャルの深さ
sigma = 1.5 !距離のスケール
}
}
xは1から始まります。xを2, 3, …とすることによって任意の数の領域を定義することができます。regionxブロックにおいて以下の変数を設定することによって領域を定義します。
変数名 |
説明 |
---|---|
region_group |
“領域のグループ”を整数で指定します。この値が同じ 領域はひとかたまりの“グループ”として扱われます。後述 の原子配置テーブルの属性値region_groupにこの数値を指 定することによって領域グループと原子を紐づけます。デ フォルト値はregionxブロックのxの値です。 |
type |
領域の種類を指定します。 cylinder (円筒型)もしくはbox (直方体型)とします。デフォルト値はboxです。 |
radius |
円筒の半径を指定します。デフォルト値は6.5 b ohrです。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に設定します。 |
eps |
ポテンシャル\(\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以降領域に割り当てられている原子のリストが出力されるので,想定通り領域が設定できているかどうかを確認することができます。
5.2.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.418 \times 10^{- 17}\)という値を掛ければ「秒」に変換することが可能です。たとえば100 a.u.という時間は2.418 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
Hernández, Journal of Chemical Physics, 115 (2001) pp. 10282-10290.
- Nose91
Nos\(\acute{e}\),Progress of Theoretical Physics Supplement No 103,1991,pp.1-46.
5.3. 高精度な電子状態の計算
5.3.1. DFT+U 法
5.3.1.1. 機能の概要
PHASEは、密度汎関数理論に基づき、ほとんどの物質の電子状態を高精度に計算することができますが,強相関電子系に対しては不正確な電子状態を与えることがあります。この原因として、密度汎関数法を適用する際に導入した局所密度近似の限界が知られています。この欠点を補う手段として、PHASEはLDA+U法またはDFT+U法を実装しています。これは、局在電子間の斥力相互作用をオンサイトクーロン相互作用として取り込む手法です。
DFT+U法にはいくつかの方法がありますが,PHASEでは単純化された回転不変モデルを採用しています [Liechtenstein95] 。このモデルでは、DFT+Uのエネルギー汎関数(\(E_{\text{DFT} + U}\))は、局所密度近似のエネルギー汎関数(\(E_{\text{DFT}}\))と ”+U”による補正エネルギー項の和として表されます。(後者の補正項は、ハバード補正項とも呼ばれます。) また、ハバード補正項は、各サイトにて計算された占有行列 \(\rho\) の関数です。
ここで、I、m(m’)、及び \(\sigma\) は、原子サイト、磁気量子数、及びスピン指標に対応します。\(U_{\text{eff}}\)は、有効的クーロン相互作用の大きさです。
占有行列は、局在軌道 (原子軌道)に電子波動関数 を射影することにより計算します。
ここで,\(k\) 及び \(n\)は、それぞれ波数ベクトル及びバンド指標です。また、\(f_{\text{kn}}^{\sigma}\)は電子状態\(\text{knσ}\)の占有数です。
ハバード補正は、局在した軌道の縮退したエネルギー準位の分裂をもたらします。特に、軌道が完全に占有 (非占有)の場合、そのエネルギー準位は\(\frac{U_{\text{eff}}}{2}\) だけ低下(上昇)します。なお、\(U_{\text{eff}}\)の値は、実験に一致するように取るか、或いは文献値をもとに決めます。
図 5.50 ハバード補正による軌道エネルギーの変化
バージョン2020.01以降:
Around Mean Field (AMF) として、文献 [Petukhov03] の手法が利用できます。この定式化では、軌道角運動量の軌道にDFT+Uを適用する場合、ハバードエネルギーは
で表されます。ここで、 \(\rho_{m,m'}^{\sigma}\) はDFT+U法で評価する占有行列です。また、ハバードポテンシャルは、
です。
5.3.1.2. 入力パラメータ
DFT+U法を使用するには、以下の手順が必要です。始めに、accuracy ブロック内にhubbardブロックとprojector_listブロックを書き加えます。前者では有効クーロン相互作用エネルギーの値(ueff)を指定します。なお、sw_hubbard =on は、ハバード補正を行うことを宣言するために記述します。後者では、占有行列の計算で使用する原子軌道の有効半径を指定します。noはプロジェクター番号,groupはプロジェクターのグループ番号,radiusは有効原子半径,lは方位量子数です。hubbardブロックで指定したプロジェクター番号は、projector_listブロックで指定したプロジェクター番号に対応することにご留意ください。
accuracy{
...
hubbard{
sw_hubbard = on
projectors{
#units eV
#tag no ueff
1 10.0
}
}
projector_list{
projectors{
#tag no group radius l
1 1 2.75 2
}
}
...
}
次に、structure ブロックにて、ハバード補正を適用する原子を指定します。proj_group で指定する番号は、accuracyブロックで定義したプロジェクター番号に対応しています。ハバード補正を行わない原子には、proj_group として0を割り当てます。なお、異種元素に対して、同一のproj_group 値を割り当てることは出来ません。
structure{
...
atom_list{
coordinate_system = internal
atoms{
!#default mobile=no
!#tag rx ry rz element proj_group
0.0 0.0 0.0 Sr 0
0.5 0.5 0.5 Ti 1
0.0 0.5 0.5 O 0
0.5 0.0 0.5 O 0
0.5 0.5 0.0 O 0
}
}
...
}
DFT+U法による計算は、しばしば局所極小へ電子状態が収束してしまいます。異なる波動関数ソルバーや電荷密度ミキサーによる計算を複数回行い、このような状況に陥っていないことを確認することを推奨します。
初期の占有行列の設定が不適切な場合,収束しづらかったり局所極小の電子状態へ至ってしまう場合があります。このようなことを避けるため,占有行列データファイル(後述のoccmat.dataファイル)を介して初期占有行列を手動で指定することも可能です。occmat.dataファイルを用意し,入力パラメータファイルに以下のような記述を行います。
accuracy{
...
hubbard{
initial_occmat = file
}
...
}
occmat.dataファイルの書き方については,次節で説明します。
バージョン2020.01以降:
DFT+U (AMF) 計算機能を利用するには、hubbard ブロックで、dftu_type = AMFと指定します。
AMFによるDFT+U計算の入力例
accuracy{
hubbard{
sw_hubbard = on
dftu_type = AMF
}
}
5.3.1.3. 計算結果の出力
phaseを実行します。
全エネルギーの出力とその成分の出力のあとにハバードエネルギー(HE)とハバードポテンシャルエネルギー(HP)が追加で出力されます。
TOTAL ENERGY FOR 2 -TH ITER= -79.756461901287 edel = 0.482992D+01
KI= 45.2522902 HA= 125.6089055 XC= -43.2979227 LO= -147.0597534
NL= 19.3280980 EW= -92.0686823 PC= 12.2272681 EN= 0.0000000
HE= 0.2533348 HP= 0.6709743
また、ハバード補正を行った原子上の占有行列の各要素が出力されます。isはスピンの番号,iaは原子の番号,lは方位量子数を意味します。なお、占有行列の次元は (2l+1) x (2l+1)です。この行列の (m,m’) 成分は、磁気量子数 m及びm’ ( 1 <= m,m’ <= 2l+1 ) の原子軌道間における占有行列の要素に対応します。なお、各軌道の性格は、表5.1 に表記しています。Printoutブロックでiprihubbardを2以上に設定している場合、占有行列を対角化することにより得られる、各原子軌道の占有数が出力されます。占有数は":"の左側に、対応する固有ベクトルは右側に表示されます。
Occupation Mattrix: is,ia,l= 1 2 2
0.583 0.000 0.000 0.000 0.000
0.000 0.583 0.000 0.000 0.000
0.000 0.000 0.529 0.000 0.000
0.000 0.000 0.000 0.529 0.000
0.000 0.000 0.000 0.000 0.529
Diagonalizing Occupation Mattrix: is,ia,l= 1 2 2
0.529: 0.000 0.000 0.000 -1.000 0.000
0.529: 0.000 0.000 1.000 0.000 0.000
0.529: 0.000 0.000 0.000 0.000 1.000
0.583: 0.000 1.000 0.000 0.000 0.000
0.583: -1.000 0.000 0.000 0.000 0.000
Occmat.data というファイルには、計算が終了する直前の SCF iteration における占有行列の要素が出力されます。
16 : num_om
…….
1 3 1 3 1 : is, ia, iproj; it, l
0.17441054E+01 -0.20464246E-02 -0.99899010E-03
-0.20464246E-02 0.17539484E+01 -0.39442624E-02
-0.99899010E-03 -0.39442624E-02 0.17529809E+01
1 4 1 3 1 : is, ia, iproj; it, l
0.17365161E+01 -0.12145064E-01 -0.11970673E-01
-0.12145064E-01 0.17903944E+01 -0.85524320E-02
-0.11970673E-01 -0.85524320E-02 0.17856965E+01
……
1行目のnum_omは、生成された占有行列の数を意味します。2行目以降は、ハバード補正を行った原子における占有行列の要素が出力されます。isはスピンの番号,iaは原子の番号,iprojはプロジェクター番号、itは原子種の番号、lは方位量子数を意味します。出力される占有行列の数は、num_omに一致しています。
占有行列\(n^{\sigma,i,p}\)は\(2l + 1\)行\(2l + 1\)列の行列形式で記述します。
行列の添え字は磁気量子数を表します。各方位量子数\(l\)での添え字と軌道の性格との対応を表 5‑28に示します。 occmat.dataは計算を継続する場合や,占有行列の初期値を与える場合必要となります
占有行外の添え字 |
\(l=0\) |
\(l=1\) |
\(l=2\) |
\(l=3\) |
1 |
\(s\) |
\(x\) |
\(3z^2-r^2\) |
\(z(5z^2-3r^2)\) |
2 |
\(y\) |
\(x^2-y^2\) |
\(x(5z^2-3r^2)\) |
|
3 |
\(z\) |
\(xy\) |
\(y(5z^2-3r^2)\) |
|
4 |
\(yz\) |
\(z(x^2-y^2)\) |
||
5 |
\(zx\) |
\(xyz\) |
||
6 |
\(x(x^2-3y^2)\) |
|||
6 |
\(y(3x^2-y^2)\) |
5.3.1.4. 計算例
立方晶SrTiO3
立方晶SrTiO3の計算例です。
samples/DFT+U/SrTiO3/cubic+u
(\(U_{\text{eff}}\)は、Ti 3d軌道に対して10 eV )samples/DFT+U/SrTiO3/cubic
(\(U_{\text{eff}}\)は0 eV )
これらの計算結果を 図 5.51 に示します。
図 5.51 SrTiO3の状態密度
立方晶LaVO3
立方晶LaVO3の計算例です。
samples/DFT+U/LaVO3/cubic+u
(\(U_{\text{eff}}\)はLa 4f 軌道に対して20 eV )samples/DFT+U/LaVO3/cubic
(\(U_{\text{eff}}\)は0 eV )
\(U_{\text{eff}}\)が0 eVのときは,4f軌道によるバンドはフェルミレベルの上1.5eV上に現れますが、\(U_{\text{eff}}\)を20eVとすると8eV下に現れます。
斜方晶LaVO3
斜方晶LaVO3の計算例です。
samples/DFT+U/LaVO3/orthrombic+u
(\(U_{\text{eff}}\)は、V 3d軌道は 5 eV、La 4f 軌道は20 eV )samples/DFT+U/LaVO3/orthrombic
(\(U_{\text{eff}}\)は0 eV)
DFT+U計算ではV原子上の磁気モーメントが反強磁性的に配列します。
立方晶FeO
立方晶FeOの計算例です。この計算例は、occmat.data ファイル内の数字を占有行列の初期値として利用するものです。
code:samples/DFT+U/FeO/gga+u (\(U_{\text{eff}}\)は Fe 3d軌道に対して5 eV )
code:samples/DFT+U/FeO/gga (\(U_{\text{eff}}\)は0 eV )
アップスピンに対しては占有行列の対角要素が1、ダウンスピンに対しては \(3z^2-r^2\) 軌道以外の対角要素が0に設定されています。\(U_{\text{eff}}\)が0 eVでは \(3z^2-r^2\) 軌道の性格を持つdバンドがフェルミレベルより上に現れますが、ハバード補正では下に現れます。また、ハバード補正によりバンドギャップが開きます。
DFT+U(AMF)の計算例(バージョン2020.01以降)
NiO
表 5.15 に用いた計算条件、 表 5.16 にバンドギャップ及びNi原子の磁気モーメントのU依存性を示します。格子定数及び原子位置は、既存のサンプルの値を使用しました。AMF は、full localized limit (FLL)の場合に比べて、バンドギャップ及び磁気モーメントのU依存性が穏やかであることがわかります。
波動関数カットオフ [Ry] |
30 |
電荷密度カットオフ [Ry] |
270 |
k点サンプリング |
Monk (4×4×4) |
交換相関相互作用 |
PAW-PBE+U ( DFT+U on Ni 3d, プロジェクタカットオフ:2.5 bohr ) |
擬ポテンシャル |
Ni_ggapbe_paw_01.pp, O_ggapbe_paw_02.pp |
Gap [eV] |
スピン磁気モーメント |
|||
---|---|---|---|---|
Ueff [eV] |
FLL |
AMF |
FLL |
AMF |
0.0 |
0.962 |
0.962 |
1.355 |
1.355 |
1.0 |
1.561 |
1.478 |
1.457 |
1.444 |
2.0 |
2.033 |
1.881 |
1.527 |
1.514 |
3.0 |
2.470 |
2.247 |
1.581 |
1.571 |
4.0 |
2.852 |
2.610 |
1.626 |
1.618 |
5.0 |
3.221 |
2.978 |
1.666 |
1.659 |
6.0 |
3.584 |
3.351 |
1.703 |
1.693 |
FeAl
FeAl は、格子定数 a = 2.91 Åのcubic 結晶 (単位胞内にFe及びAlが1原子ずつ)です [Makhlouf94] 表 5.17 に用いた計算条件、 表 5.18 にバンドギャップ及びFe原子の磁気モーメントのU依存性を示します。 FLLでは磁気モーメントが単調に増加するが、AMFではU=5.0 eV程度まで減少します。
波動関数カットオフ [Ry] |
25 |
電荷密度カットオフ [Ry] |
225 |
k点サンプリング |
Monk (8×8×8) |
交換相関相互作用 |
PAW-PBE+U ( DFT+U on Fe 3d, プロジェクタカットオフ:2.3 bohr ) |
擬ポテンシャル |
Fe_ggapbe_paw_02.pp, Al_ggapbe_paw_01.pp |
Gap [eV] |
スピン磁気モーメント |
|||
---|---|---|---|---|
Ueff [eV] |
FLL |
AMF |
FLL |
AMF |
0.0 |
0.0 |
0.0 |
1.043 |
1.043 |
1.0 |
0.0 |
0.0 |
1.092 |
1.034 |
2.0 |
0.0 |
0.0 |
1.145 |
1.023 |
3.0 |
0.0 |
0.0 |
1.206 |
1.008 |
4.0 |
0.0 |
0.0 |
2.745 |
0.459 |
5.0 |
0.0 |
0.0 |
2.817 |
0.456 |
6.0 |
0.0 |
0.0 |
2.865 |
0.486 |
- Liechtenstein95
Liechtenstein, V. I. Anisimov, and J. Zaanen Phys. Rev. B 52 R5467 (1995).
- Petukhov03
Petukhov, I. I. Mazin, L. Chioncel, and A. I. Lichtenstein, Phys. Rev. B 65, 153106 (2003).
- Makhlouf94
Makhlouf, T. Nakamura, and M. Shiga, J. Magn. Magn. Mater. 135, 257 (1994).
5.3.2. ハイブリッド汎関数
5.3.2.1. 機能の概要
局所密度近似(local density approximation=LDA)を改善する手法には一般勾配近似(generalized gradientapproxiation=GGA)のほかに、Hartree-Fock交換汎関数を一定量取り入れるハイブリッド汎関数法があります。PHASE/0では、PBE0 [Perdew96] [Emzerhof97] [Emzerhof99] [Adamo99] とHSE06 [Heyd03] [Heyd04a] [Heyd04b] [Heyd06] の二種類の汎関数が使えます。
厳密交換エネルギー(Hartree-Fock交換エネルギー)\(E_{x}^{\text{exact}}\)は、{\(k\)、\(\nu\)、\(\sigma\)}で指定される{サンプリングk点、バンド、スピン状態}の波動関数\(\psi_{\text{kνσ}}(\mathbf{r})\) を用いて
(5.37)\[\begin{split}E_{x}^{\text{exact}} &= - \frac{1}{2}\sum_{\sigma}^{}{\sum_{k\nu,k^{'}\nu^{'}}^{\text{occ}}{\int_{}^{}d}}\mathbf{r}_{1}d\mathbf{r}_{2} \\ &\left\lbrack \frac{\psi_{\text{k} \nu \sigma}^{*}\left( \mathbf{r}_{1} \right)\psi_{k^{'}\nu^{'}\sigma}\left( \mathbf{r}_{1} \right)\psi_{k^{'}\nu^{'}\sigma}^{*}\left( \mathbf{r}_{2} \right)\psi_{\text{k} \nu \sigma}\left( \mathbf{r}_{2} \right)}{\left| \mathbf{r}_{1} - \mathbf{r}_{2}\right|} + \sum_{\text{ij}}^{}\frac{Q_{\text{ij}}\left(\mathbf{r}_{1} - \mathbf{r}_{2} \right)\left\langle \psi_{\text{k} \nu \sigma} \middle| \beta_{i} \right\rangle\left\langle \beta_{j} \middle| \psi_{k^{'}\nu^{'}\sigma} \right\rangle}{|\mathbf{r}_{1} - \mathbf{r}_{2}|} \right\rbrack\end{split}\]
で与えられます。ここで、\(\nu 、\nu'\)に関する和は占有状態に限られます。また、2行目の\(Q_{\text{ij}}\)を含む項は欠損電荷に由来し、ウルトラソフト擬ポテンシャル利用時に現れます。
PBE0汎関数は\(\alpha\)をパラメータとして
(5.38)\[E_{\text{xc}}^{\text{PBE0}} = \alpha E_{x}^{\text{exact}} + (1 - \alpha)E_{x}^{\text{PBE}} + E_{c}^{\text{PBE}}\]
と定義されます [Perdew96] [Emzerhof97] [Emzerhof99] [Adamo99] 。ここで、\(E_{x}^{\text{PBE}}\)はPBE交換汎関数で、\(E_{c}^{\text{PBE}}\)はPBE相関汎関数です。 \(\alpha = \frac{1}{4}\)がよく使われる値です。ハイブリッド汎関数には、このほかに交換汎関数\(E_{x}^{\text{exact}}\)をスクリーニングして加えるHSE汎関数\(E_{\text{xc}}^{\text{HSE}}\)があります。これは、
(5.39)\[E_{\text{xc}}^{\text{HSE}} = \alpha E_{x}^{exact,SR}\left( \omega \right) + (1 - \alpha)E_{x}^{PBE,SR}\left( \omega \right) + {E_{x}^{PBE,LR}\left( \omega \right) + E}_{c}^{\text{PBE}}\]
の形式で表されます [Heyd03] [Heyd04a] [Heyd04b] [Heyd06] 。\(\omega\)は短距離相互作用が働く範囲を制御する調整パラメータで、\(\omega = 0\)で\(E_{\text{xc}}^{\text{PBE0}}\)に等しく、\(\omega \rightarrow \infty\)で漸近的に\(E_{\text{xc}}^{\text{PBE}}\)に近づきます。HSE06汎関数を利用すると、分子の場合はセルサイズ、結晶の場合はk点分割数に対する収束性が、PBE0汎関数を利用する場合に比較してよくなります。つまり同じ収束性を得るための計算負荷が相対的に小さくなります。計算精度を保ちながら計算負荷を節約できる値として、\(\omega\) には0.1(Bohr-1)程度の値がよく使われます。
5.3.2.2. 入力パラメータ
基本的な設定
Hybrid汎関数で電子状態計算を行うには、以下のように指定します。
accuracy{
ksampling{
method = gamma
base_reduction_for_GAMMA = OFF
base_symmetrization_for_GAMMA = OFF
}
xctype = ggapbe
hybrid_functional{
sw_hybrid_functional = ON
functional_type = HSE06
alpha = 0.25
omega = 0.106
}
}
この例の場合は、HSE06汎関数を指定したことになります。HSE06のほか、PBE0、HFを指定することが可能です。例では、sampling k点はΓ点(method=gamma)を指定していますが、ほかに格子状sampling(method=mesh)あるいはMonkhorst-Packによるスペシャルk点sampling(method=monk)を指定することもできます。パラメータalphaは(2)、(3)式に現れる厳密交換相互作用の混合率 \(\alpha\)で、デフォルトの値は0.25です。Omegaは(3)式に現れる遮蔽パラメータ\(\omega\)で、デフォルト値は0.106 bohr-1です。
相関相互作用を取り除いて、Hartree-Fock計算を行う場合は以下のように設定します。
accuracy{
hybrid_functional{
sw_hybrid_functional = ON
functional_type = HF
}
}
ただし、Hartee-Fock計算の収束はPBE0と比べても著しく遅くなります。
PBE汎関数を使って収束させた波動関数と電荷密度がある場合、これをhybrid汎関数計算の初期波動関数と初期電荷とすることができます。そのための入力例を次に示します。必須ではありませんが、ハイブリッド汎関数法は通常のGGAよりもはるかに多くの計算時間がかかるので、このように設定し少しでも収束回数を減らすことを推奨します。
accuracy{
initial_wavefunctions = file
initial_charge_density = file
}
このように計算を遂行する場合、計算に先だってPBE汎関数計算の波動関数ファイル(zaj.data)と電荷密度ファイル(nfchgt.data)を作業ディレクトリに必ずコピーします。
ハイブリッド汎関数法は、バンドおよび k 点の 2 重ループの処理があります。このうち、内側の k 点に関するループは計算精度にさほど影響がない場合があります。そこで、この内側の k 点ループを“間引く”ことによって計算量を減らす機能が PHASE には備わっています。この機能を利用するには、以下のように記述します。
accuracy{
ksampling{
method = mesh
mesh{
nx = 4
ny = 4
nz = 4
}
}
hybrid_functional{
reduction_factor{
f1 = 2
f2 = 2
f3 = 2
}
}
}
変数 f1, f2, f3 によって nx, ny, nz をそれぞれ何分の一にするかを指定します。この例では、それぞれの方向の内側ループのメッシュ数が 1/2 になります。f1, f2, f3として対応するnx, ny, nzよりも大きい値を指定した場合正しく動作しないのでご注意ください。
3軸並列版において並列化軸を入れ替える方法
3軸並列版でハイブリッド汎関数法を利用する場合、通常の計算と異なる並列化軸を採用することによって大幅な高速化が達成できます。この機能を利用する場合、以下のように設定します。
accuracy{
hybrid_functional{
sw_change_axis = on
}
}
この設定は、次に説明する高速化の設定を3軸並列版で利用する場合有効にする必要があります。
メッシュ調整による高速化
※ 以下の機能は2軸並列版と3軸並列版においてsw_change_axis = onとした場合においてのみ利用可能です
ウルトラソフト擬ポテンシャルを利用する場合、ハイブリッド汎関数計算の演算時間のほとんどがウルトラソフト擬ポテンシャル特有の電荷密度構成(欠損電荷密度。(1)式中の\(Q_{\text{ij}}\))に由来する処理に費やされます。ハイブリッド汎関数計算においては、欠損電荷の高周波数成分(Gの大きい成分)を省くことによって、計算精度に大きな影響を及ぼさずに高速化することが可能です。PHASE/0でこの機能を利用するには、変数charge_meshを利用します。
accuracy{
hybrid_functional{
charge_mesh = fine
}
}
変数charge_meshには、exact, fine, moderate, coarseのいずれかを指定します。exactを指定すると欠損電荷のすべての波数成分を考慮します。fine, moderate, coarseの順に考慮する成分が少なくなります。charge_meshのデフォルト値はmoderateです。
※ 以下の機能は3軸並列版においてsw_change_axis = onとした場合においてのみ利用可能です
波動関数のFFTメッシュを削減することも可能です。程度にもよりますが,このメッシュもやはりある程度は削減しても計算精度に大きな影響を及ぼしません。この機能を利用するには,以下のような設定を施します。
accuracy{
...
hybrid_functional{
sw_change_axis = on
cutoff_wf_for_exx = 9 rydberg
}
}
accuracyブロックの下のhybrid_functionalブロックにcutoff_wf_for_exxを定義し,そこに採用したいカットオフエネルギーを指定します。ここで指定できるのは通常のカットオフエネルギー以下の値であり,それを超える値を指定した場合通常のカットオフエネルギーで置き換わります。cutoff_wf_for_exxのデフォルト値は通常のカットオフエネルギーと同じ値です。波動関数のFFTは,特にノルム保存型の擬ポテンシャルを採用している場合は計算時間のかなりの割合を占めることになりますので,この設定によって演算量を減らすことは有用です。参考のため,サンプルのSi結晶の場合にcutoff_wf_for_exxを通常のカットオフエネルギーの半分の値にした場合の全エネルギーと計算時間を報告します(時間は,通常のカットオフエネルギーの場合を1としています)。
cutoff_wf_for_exx = cutoff_wf |
cutoff_wf_for_exx = cutoff_wf/2 |
|
---|---|---|
全エネルギー (ha) |
-7.8457557283 |
-7.8457499896 |
計算時間 |
1 |
0.34 |
実空間法による高速化
※ 以下の機能は2軸並列版と3軸並列版においてsw_change_axis = onとした場合においてのみ利用可能です
ウルトラソフト擬ポテンシャルを利用している場合,欠損電荷に由来する処理を実空間で行うことによって高速化することも可能です。それには、次のように設定します。
accuracy{
hybrid_functional{
sw_rspace = on
}
}
通常,ハイブリッド汎関数法における欠損電荷の処理はO(N4)の時間がかかりますが,実空間法を利用することによってこの時間をO(N3)にすることができるので, ある程度大きな系では必須の指定となります。上述のcharge_meshパラメータは、逆空間の場合と同じ様に利用することが可能です。
sw_rspace = onの場合に,処理を行列-行列積の形に変形し,Level3 BLASによって処理させることができます。この機能は,以下の要領で利用します。
accuracy{
hybrid_functional{
sw_rspace = on
sw_rspace_dgemm = on
}
}
この設定によってさらなる高速化が実現できる場合があります。
5.3.2.3. 計算例
水素分子
水素分子のPBE計算、PBE0計算、Hartree-Fock計算の計算例題は、 samples/hybrid/H2
以下のディレクトリPBE、PBE0、HFです。go_h2.shを実行すると、これらの計算を順番に実行します。これらの結果とGausian03の結果との比較を 図 5.52 に示します。
図 5.52 PBE汎関数法,PBE0汎関数法,Hartree-Fock法による水素分子のHOMO準位とLUMO準位のエネルギーがGaussian03(G03)の結果と比較して示されている。
水分子
水分子のPBE計算、PBE0計算例題は、 samples/hybrid/H2O
以下のディレクトリのPBE、PBE0です。go_h2o.shを実行すると、これらの計算を順番に実行します。これらの結果とGausian03の結果との比較を 図 5.53 に示します。
図 5.53 PBE汎関数法,PBE0汎関数法による水分子のエネルギー準位がGaussian03(G03)の結果と比較して示されている。
シリコン結晶
シリコン結晶の状態密度の計算を、PBE, PBE0, HSE06で実行する例題が samples/hybrid/Si
以下にあります。計算を実行すると得られる状態密度図を 図 5.54 に、得られるバンドギャップを 表 5.19 に示します。
図 5.54 PBE, PBE0, HSE06汎関数によって得られたSi結晶の状態密度
汎関数 |
バンドギャップ (eV) |
---|---|
PBE |
0.7 |
PBE0 |
1.9 |
HSE06 |
1.3 |
samples/hybrid/Si_k10
は、k点メッシュを10×10×10とした例題です。非常に時間のかかる計算ですが、より精密な状態密度図が得られます。
5.3.2.4. ハイブリッド汎関数法によるバンド計算(バージョン2019.02以降)
バージョン2019.02より,ハイブリッド汎関数法を利用したバンド計算が行えるようになりました。バンド計算においては通常SCF計算によって得られた電荷密度データを固定電荷として変化させずに固有値計算を行います。ハイブリッド汎関数法の場合,固定電荷に加え“固定波動関数”のデータと“ハイブリッド汎関数法”のデータが必要です。前者は通常のSCF計算によって得られる波動関数データです。後者は入力パラメーターファイルに以下の設定を施すことによって出力させることができます。
accuracy{
hybrid_functional{
....
....
sw_output_hybrid_info = on
}
}
sw_output_hybrid_infoをonとすると必要な情報がF_HYBRIDINFOファイルに出力されます。sw_output_hybrid_infoのデフォルト値はhybrid_functionalブロックが存在する場合はon, そうでない場合はoffです。F_HYBRIDINFOはfile_names.dataファイルのポインターであり、そのデフォルト値は./nfhybridinfo.dataです。
SCF計算はハイブリッド計算でも通常のPBE計算でもよいです。バンド計算を行うためには、通常のバンド計算の入力にハイブリッド汎関数計算の設定を施し、さらにfile_names.dataファイルを以下のように記述します(SCF計算が行われたディレクトリーを1階層上のscfというディレクトリーだったとして)。
&fnames
F_CHGT = ‘../scf/nfchgt.data’
F_SCF_ZAJ = ‘../scf/zaj.data’
F_HYBRIDINFO = ‘../scf/nfhybridinfo.data’
/
赤字で示したエントリーが通常のバンド計算と異なる部分です。ファイルポインターF_SCF_ZAJによってSCF計算によって得られた波動関数ファイルのファイル名を指定しています。これは「固定波動関数」として使われるものです。F_HYBRIDINFOにはハイブリッド汎関数法の様々な情報が記録されています。両方ともバンド計算中は純粋に入力として利用され、その内容がバンド計算の前後で変化することはありません。SiおよびCのハイブリッド汎関数法によるバンド構造計算の入力ファイルが samples/hybrid/Si/band_hse06
および samples/hybrid/C/band_hse06
にあります。
5.3.2.5. 使用における注意点
ハイブリッド汎関数法は反転対称性を利用する高速化機能が使えません。反転対称性を有する系であってもsw_inversionパラメータをonとすると計算が破綻しますので、この設定はしないでください。
5.3.2.6. 参考文献
- Perdew96(1,2)
Perdew, M. Emzerhof, and K. Burke, J. Chem. Phys. 105 (1996) 9982.
- Emzerhof97(1,2)
Emzerhof, J. P. Perdew, and K. Burke, Int J. Quantum Chem. 64 (1997) 285.
- Emzerhof99(1,2)
Emzerhof and G. E. Scuseria, J. Chem. Phys. 110 (1999) 5029.
- Adamo99(1,2)
Adamo and V. Barone, J. Chem. Phys. 110 (1999) 6158.
- Heyd03(1,2)
Heyd, G. E. Scuseria, and M. Ernzerhof, J. Chem. Phys. 118 (2003) 8207.
- Heyd04a(1,2)
Heyd and G. E. Scuseria, J. Chem. Phys. 120 (2004) 7274.
- Heyd04b(1,2)
Heyd and G. E. Scuseria, J. Chem. Phys. 121 (2004) 1187.
- Heyd06(1,2)
Heyd, G. E. Scuseria and M. Ernzerhof, J. Chem. Phys. 124 (2006) 219906.
5.3.3. SC-DFT法
5.3.3.1. 機能の概要
ハイブリッド汎関数法とは密度汎関数理論の交換相関相互作用に厳密交換相互作用を混合する計算手法ですが,その混合の仕方については様々な方法が提案されています。最も素朴な手法はPBE0と呼ばれる手法です。PBE0法では,一定の値αで厳密交換相互作用を混合します。通常適用されるαの値は0.25ですが,これを系に応じた最適な割合を第一原理的に導く手法がSC-DFT法で [Skone14] 。 SC-DFT法は,誘電率と混合比を結び付け,得られる誘電率と混合比が自己無撞着になるまで繰り返し計算を行うという計算手法になっています。
5.3.3.2. 理論
ハイブリッド汎関数法においては,最も単純なPBE0法の場合以下のように交換相互作用を計算します。
ここで \(E_{\rm PBE}^x\) はGGA-PBEの交換相互作用, \(E_{\rm exact}^x\) は厳密交換相互作用です。 (5.40) のパラメーター \(\alpha\) の妥当な値は自明ではなく,また系によって異なると考えられます。 このパラメーターを,以下のように近似するのがSC-DFT法です。
\(\varepsilon\) は誘電率です。SC-DFT法では,自己無撞着な \(\alpha\) と \(\varepsilon\) をもとめるために繰り返し計算を行います。すなわち,初期 \(\alpha\) を設定し,誘電率を計算します。得られた誘電率から (5.41) を利用して \(\varepsilon\) を求め,最初の \(\alpha\) と同じ結果ならば収束したとみなし得られた \(\alpha\) を最適なものとします。収束していない場合は得られた \(\alpha\) を使って誘電率計算を再実行します。このような手続きを, \(\alpha\) が収束するまで繰り返します。
5.3.3.3. 使い方
SC-DFT法を利用するためには,以下のようにcontrolブロックにおいて変数driverの値をsc_dftとします。
control{
driver = sc_dft
}
SC-DFTの収束判定条件は,以下のように設定します。
accuracy{
sc_dft{
delta_epsilon = 0.01
}
}
delta_epsilonのデフォルト値は0.01です。
SC-DFT計算は誘電率計算を行いますが,デフォルトの設定で問題ないのであればそのための設定は必要ありません。デフォルトの設定を変更する場合はepsilonブロックを挿入し,そこで設定を行います。ただし,SC-DFT法の場合photonブロックにおいてpolar, Poyntingベクトルの値はゼロにする必要があります。すなわち,以下のように設定する必要があります。
epsilon{
...
photon{
poynting{
ux = 0.0,uy = 0.0, uz = 0.0
}
polar{
px = 0.0, py = 0.0, pz = 0.0
}
}
}
誘電関数計算は,四面体法によって行われます。そのため,以下のようにk点サンプリングを四面体法が利用できるように設定する必要があります。
accuracy{
ksampling{
method = mesh
...
}
smearing{
method = tetrahedral
}
}
このように設定しないと不正な誘電率が得られてしまいます。 また,ハイブリッド汎関数法による計算を行いますが,これは前節で説明したように設定してください。ただし,functional_typeには何も指定しないか,PBE0を指定するようにしてください。 計算の実行は,通常通り行います。通常の計算と違い収束する度に新しい計算が行われます。混合比はログファイルに記録されます。以下の要領でその値を調べることができます。
$ grep alpha_exx output000
!!** alpha_exx = 0.1425
!!** alpha_exx = 0.1208
!!** alpha_exx = 0.1113
!!** alpha_exx = 0.1081
!!** alpha_exx = 0.1080
また,nfefn.dataファイルには以下のように各SC-DFTステップにおけるエネルギーの履歴が記録されます。
iter_scdft, iter_ion, iter_total, etotal, forcmx
1 1 9 -7.8461877466 0.0000000000
2 1 12 -7.8443931212 0.0000000000
3 1 15 -7.8437399027 0.0000000000
4 1 18 -7.8434571365 0.0000000000
5 1 21 -7.8433616238 0.0000000000
ハイブリッド汎関数法は計算時間が膨大になりえるので,継続計算をする必要がでてくる場合もあるでしょう。継続計算を行うにあたって,特別なことを考慮する必要はありません。通常通りcontrolブロックのcondition を continuationもしくはautomaticとした上でPHASE/0を再実行してください。
5.3.3.4. 計算例
Si結晶にSC-DFT法を適用した例を紹介します。入力データ samples/hybrid/scdft/Si
以下にあります。
Si結晶は,通常のPBE計算の場合バンドギャップが0.6 eV程度と過小評価されることが知られています。また,PBE0 ( \(\alpha=0.25\) )を用いると1.94 eV程度と過大評価されます。
まず, 図 5.55 に混合比と誘電率の履歴を報告します。図から明らかなように,SC-DFT iteration 4回目ではやくも収束しています。Si結晶に限らず,SC-DFT法の収束は速い場合が多いようです。得られた \(\alpha\) の値は0.108, 対応する誘電率は9.26です。

図 5.55 Si結晶に対してSC-DFT法を適用した例。左図:\(\alpha\) の値の履歴,右図:誘電率の履歴。
つぎに,得られた \(\alpha\) を利用して,状態密度の計算を行ってみました。結果を 図 5.56 に報告します。比較のためPBEで求めた場合とで求めた場合の結果も同時にプロットしました。

図 5.56 Si結晶の状態密度
この状態密度より得られるバンドギャップは1.23 eVです。これは,実測値の1.17 eVに極めて近い値であるといえます。
5.3.3.5. 参考文献
- Skone14
Jonathan H. Skone, 1 Marco Govoni, and Giulia Galli, “Self-consistent hybrid functional for condensed systems”, Phys. Rev. B 89 (2014) 195112.
5.3.4. ファンデルワールス相互作用(非局所相関項)
5.3.4.1. 機能の概要
非局所相関項を第一原理的に計算する手法(van der Waals density functional (vdW-DF))を利用した計算機能について説明します.PHASEでも採用されている一般化された密度勾配近似:Generalized Gradient Approximation (GGA)では非局所相関項が考慮されていないために,例えば積層グラファイトの層間凝集エネルギーなどを正確に計算することができません.本節で取り上げる計算機能はGGAのこの欠点を補うために用意されたもので,これを用いることでvan der Waals相互作用が大きく寄与する系の全エネルギーや電子状態もより正確に計算できるようになります.また,このvdWDFは第一原理的な手法を利用していて経験的なパラメータ等を用いていないので,任意の形状の系に対して簡単に適用することができます.
5.3.4.2. 非局所相関項を含めた全エネルギー計算
理論概要
基本理論
プログラムvdW.F90では非局所相関項\(E_{c}^{\text{nl}}\)を計算します.この\(E_{c}^{\text{nl}}\)に,GGAで得られる交換項\(E_{x}^{\text{GGA}}\)とLDAから得られる交換項\(E_{c}^{\text{LDA}}\)を足し合わせることで「非局所相関項も考慮した交換相関項」を導出します.すなわち,交換相関エネルギー\(E_{\text{xc}}\)は
(5.42)\[E_{\text{xc}} = E_{x}^{\text{GGA}} + E_{c}^{\text{LDA}} + E_{c}^{\text{nl}}\]
となります.このうち右辺第3項の計算が最も困難で,vdWではDionら [Dion06] によって開発された理論手法に習って数値計算されます.この理論手法では非局所相関項を
(5.43)\[E_{c}^{\text{nl}} = \frac{1}{2}\int_{}^{}d\mathbf{r}_{i}\mathbf{r}_{k}\rho\left( \mathbf{r}_{i} \right)\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\rho\left( \mathbf{r}_{k} \right)\]
として計算します.被積分関数に位置変数が2つ(\(\mathbf{r}_{i}\)と\(\mathbf{r}_{k}\))あるこの式では,GGAやLDAと違って,離れた位置にある電荷密度同士(\(\rho\left( \mathbf{r}_{i} \right)\)と\(\rho\left( \mathbf{r}_{k} \right)\) )の相互作用も考慮しています.2変数関数\(\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\)は
(5.44)\[\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right) = \frac{2}{\pi^{2}}\int_{0}^{\infty}d\text{adb}a^{2}b^{2}\text{WT}\]
のように書けます.ここで,
(5.45)\[W\left( a,b \right) = \frac{2}{a^{3}b^{3}}\left\lbrack \left( 3 - a^{2} \right)b{\cos\ }b{\sin\ }a+ \left( 3 - b^{3} \right)a{\cos\ }a{\sin\ }b \right. + \left. \ \left( a^{2} - b^{2} - 3 \right){\sin\ }a{\sin\ }b - 3ab{\cos\ }a{\cos\ }b \right\rbrack\]
です.また,
\[T\left\lbrack x_{i}\left( a \right),x_{i}\left( b \right),x_{k}\left( a \right),x_{k}\left( b \right)\right\rbrack = \frac{1}{2}\left\lbrack \frac{1}{x_{i}\left( a \right) + x_{i}\left( b \right)} + \frac{1}{x_{k}\left( a \right) + x_{k}\left( b \right)} \right\rbrack\]\[\times \left\lbrack \frac{1}{\left( x_{i}\left(a \right) + x_{k}\left( a \right) \right)\left( x_{i}\left( b \right) + x_{k}\left( b \right) \right)} \right.\](5.46)\[+ \left. \ \frac{1}{\left( x_{i}\left( a \right) + x_{k}\left( b \right) \right)\left( x_{i}\left(b \right) + x_{k}\left( a \right) \right)} \right\rbrack\]
と定義されます.さらに各変数は
\[x_{j}\left( a \right) = \frac{a^{2}}{2} \times \frac{1}{1 - \text{exp}\left( - \frac{4\pi a^{2}}{9d_{j}^{2}} \right)},\]\[d_{j} = \left| \mathbf{r}_{i} - \mathbf{r}_{k} \right|q_{0}\left( \mathbf{r}_{j} \right),\]\[q_{0}\left( \mathbf{r}_{j} \right) =- \frac{4\pi}{3}\epsilon_{\text{xc}}^{\text{LDA}}\rho\left( \mathbf{r}_{j} \right) - \frac{Z_{\text{ab}}}{9}\left\{ \frac{\nabla\rho\left( \mathbf{r}_{j} \right)}{2k_{F}\left( \mathbf{r}_{j} \right)\rho\left( \mathbf{r}_{j}\right)} \right\}^{2}k_{F}\left( \mathbf{r}_{j} \right),\](5.47)\[k_{F}^{3}\left( \mathbf{r}_{j}\right) = 3\pi^{2}\rho\left( \mathbf{r}_{j} \right) \left( j = i \text{ or } k \right)\]
となっており,これからわかるように電荷密度分布を唯一の入力情報とした汎関数となるように設計されています.ここで (5.47) の定数Zab = -0.8491 は第一原理的に決定された係数で、 vdwdf version 1で採用されています。vdwdf version 2 では、この値を2.2倍した値が用いられます。局所密度近似による交換相関エネルギー密度\(\epsilon_{\text{xc}}^{\text{LDA}}\)はO. Gunnarsson et al[Gunnarsson76] によるものを用いています.これら一連の式はplasmon-pole modelをもとに設計されたものであり,そのためvan der Waals相互作用に代表される非局所相関項を含む全エネルギーが比較的低計算コストで非経験的に得られるようになっています.
さらに効率的に数値計算を行うために,(5.43) の2変数関数\(\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\)を計算するアルゴリズムが変更されました.この2変数関数\(\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\)は直接にはdiとdjにしか依存しないため, di=D(1+δ),dj=D(1-δ)と新たに定義された2変数D,δを用いて\(\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\)を\(\phi\left( D,\delta \right)\)として予め計算された数値セットを用意するようにしました.これによって用意したグリッド点数に応じて (5.44) の2重積分を逐一行う必要がなくなるため数値計算量が大幅に削減されています.
特異点周辺の数値積分
(5.47) で変数\(a = 0\)でかつ\(\mathbf{r}_{i} = \mathbf{r}_{k}\)の場合は数値計算によって\(x_{j}\left( a \right)\)を決定するのは困難です.このため (5.43) の数値積分も特異点を含むことになるため,難しくなります.そこで\(\left| \mathbf{r}_{i} - \mathbf{r}_{k} \right| \ll 1\)の領域では電荷密度を\(\rho\left( \mathbf{r}_{i} \right) = \rho\left( \mathbf{r}_{k} \right)\)と仮定して\(\mathbf{r}_{k}\)積分の外に出すことにします.これによって (5.43) のうち,\(\mathbf{r}_{i}\)を中心にした微少半径\(\eta_{i}\)の球内での\(\mathbf{r}_{k}\)積分を
\[\frac{1}{2}\int_{\eta_{i}}^{}d\mathbf{r}_{k}\rho\left(\mathbf{r}_{i} \right)\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\rho\left( \mathbf{r}_{k} \right) \cong\frac{1}{2}\frac{4\pi\eta_{i}^{3}}{3}\rho^{2}\left( \mathbf{r}_{i} \right)\int_{\eta_{i}}^{}d\mathbf{r}_{k}\phi\left( \mathbf{r}_{i},\mathbf{r}_{k}\text{ht} \right)\]\[= \frac{1}{2}\frac{4\pi\eta_{i}^{3}}{3}\rho^{2}\left( \mathbf{r}_{i} \right) \times 4\pi\int_{0}^{\eta_{i}}dr_{\text{ik}}\phi\left( d_{i},d_{k} \right)\](5.48)\[= \frac{1}{2}\frac{4\pi\eta_{i}^{3}}{3}\rho^{2}\left( \mathbf{r}_{i} \right) \times 4\pi\int_{0}^{\eta_{i}q_{0}}d\text{Dϕ}\left( D \right)\frac{D^{2}}{q_{0}^{3}}\]
と単純にすることができます.ただし,\(r_{\text{ik}} = \left| \mathbf{r}_{i} - \mathbf{r}_{k} \right|\)としています.ここで2行目から3行目へは,\(D \equiv q_{0}\mathbf{r}_{\text{ik}}\left( = d_{i} = d_{k} \right)\)を定義して変数変換を用いています.3行目の被積分関数は特異点を含まないため,これで数値積分を実行することができます.
無限周期系への拡張
本手法では電荷密度分布情報を実空間表記で入力し,そのまま計算を進めていくためにこのままでは有限サイズの計算対象に向いた手法となっています.逆に無限周期系を計算するには十分に\(\mathbf{r}_{i}\)と\(\mathbf{r}_{k}\)が離れた場合まで (5.43) の数値積分を行わなくてはならず,非常に計算効率が悪くなります.特にvan der Waals相互作用は遠距離においてもその寄与はなだらかにしか減衰しません.そこで漸近関数を用いることで,本手法をこの無限周期系にも対応できるようにしました.(5.43) の被積分関数にある2変数関数\(\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\)は\(\mathbf{r}_{i}\)と\(\mathbf{r}_{k}\)が十分に離れた場合には
\[\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right) \rightarrow - \frac{12\left( \frac{4\pi}{9} \right)^{3}}{d_{i}^{2}d_{k}^{2}\left( d_{i}^{2} + d_{k}^{2} \right)}\]\[= - \frac{C}{r_{\text{ik}}^{6}} \times \frac{1}{q_{0}^{2}\left( r_{i} \right)q_{0}^{2}\left( r_{k} \right)\left( q_{0}^{2}\left(r_{i} \right) + q_{0}^{2}\left( r_{k} \right) \right)}\](5.49)\[= - \frac{C}{r_{\text{ik}}^{6}} \times \psi\left\lbrack \rho\left( \mathbf{r}_{i}\right)\rho\left( \mathbf{r}_{k} \right) \right\rbrack\]
のような漸近関数に近似できることがその定義からわかります.ただし\(C = 12\left( 4\pi/9 \right)^{3}\).この漸近関数には (5.44) のような積分演算が含まれていないため非常に簡単に数値計算が行えるという利点があります. この式の3行目のうち‘×’の前の分数は\(\mathbf{r}_{k}\)の増加に応じて単純に減衰していく漸近項で,これに対して‘×’の後ろの\(\psi\left\lbrack \rho\left( \mathbf{r}_{i} \right),\rho\left( \mathbf{r}_{k} \right) \right\rbrack\)は式(8)からわかるように直接的には電荷密度しか変数を持たないため,周期系物質においては周期的な項となっています.このことを考慮すると,式(2)のうち,\(\mathbf{r}_{i}\)と\(\mathbf{r}_{k}\)が十分に離れた場合\((r_{\text{ik}} > \eta\))には次のように積分を単純化できます.すなわち
\[\frac{1}{2}\int_{r_{\text{ik}} > \eta}^{}d\mathbf{r}_{i}d\mathbf{r}_{k}\rho\left( \mathbf{r}_{i} \right)\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\rho\left( \mathbf{r}_{k} \right) \cong \frac{1}{2}dv^{2}\sum_{\overset{\mathbf{r}_{i} \in}{\text{unitcell}}}^{}{\sum_{\overset{\mathbf{r}_{k} \in}{\left( r_{\text{ik}} > \eta \right)}}^{}\rho}\left( \mathbf{r}_{i} \right)\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} \right)\rho\left( \mathbf{r}_{k} \right)\]\[= \frac{1}{2}dv^{2}\sum_{\overset{\mathbf{r}_{i},\mathbf{r}_{k} \in}{\text{unitcell}}}^{}{\sum_{\overset{\mathbf{t}_{\text{xyz}} \in}{\left( \left| \mathbf{r}_{k} + \mathbf{t}_{\text{xyz}} - \mathbf{r}_{i} \right| > \eta \right)}}^{}\rho}\left( \mathbf{r}_{i} \right)\phi\left( \mathbf{r}_{i},\mathbf{r}_{k} + \mathbf{t}_{\text{xyz}} \right)\rho\left( \mathbf{r}_{k} + \mathbf{t}_{\text{xyz}} \right)\](5.50)\[= -\frac{C}{2}dv^{2}\sum_{\overset{\mathbf{r}_{i},\mathbf{r}_{k} \in}{\text{unitcell}}}^{}\rho\left( \mathbf{r}_{i} \right)\psi\left\lbrack \rho\left( \mathbf{r}_{i} \right),\rho\left( \mathbf{r}_{k} \right) \right\rbrack\rho\left( \mathbf{r}_{k} \right)\sum_{|\mathbf{r}_{k} +\mathbf{t}_{\text{xyz}} - \mathbf{r}_{i}| > \eta\ }^{\mathbf{t}_{\text{xyz}} \in}\frac{1}{r_{\text{xyz}}^{6}}\]
と関数を分けることができます.ここで\(\text{dv}\)は数値計算を行う際のグリッド点に囲まれる最小直方体体積で,\(\mathbf{t}_{\text{xyz}}\)は格子点同士を結ぶ結晶ベクトルです.この式3行目の総和のうち左側は\(\mathbf{r}_{i}\)と\(\mathbf{r}_{k}\)の範囲がユニットセル内に限定されているので,計算コストは限定的です.一方,右側は\(1/r_{\text{xyz}}^{6}\)が実質無視できるほど小さくなるまで広範囲に渡って総和することになります.しかし,そもそも関数型が非常に単純な上に,電荷密度分布\(\rho\left( \mathbf{r} \right)\)とは無関係で,グリッド点の空間配置のみによって決まる値なので予め求めておけばよいものです.
以上のように漸近関数を使ってさらに式(12)のように積分順序を工夫することによって,実質無限遠の寄与まで効率よく考慮することができ,これによって本手法を無限周期系にも適用できるようにしています.
3次スプライン補間と畳み込み積分を利用した高速化
Dionらによるもともとの手法では,空間の2重積分を直接行うため膨大な演算量が必要とされます。そこで,Román-PérezとSolerによって ,スプライン補間と畳み込み積分を利用したより高速なアルゴリズムが開発されました [Roman09] PHASE/0はこの方法によって実際の計算を行います。
この方法では,まずカーネル関数を3次のスプライン補間によって展開します。
(5.51)\[\phi\left(d,d'\right) = \phi\left(q\left| \mathbf{r}-\mathbf{r}'\right|, q'\left|\mathbf{r}-\mathbf{r}'\right|\right) = \sum_{\alpha\beta}\left(q_{\alpha}\left|\mathbf{r}-\mathbf{r}'\right|,q_{\beta}\left|\mathbf{r}-\mathbf{r}'\right|\right)p_{\alpha}\left(q\right)p_{\beta}\left(q'\right).\]
\(\theta_\alpha \left(\mathbf{r}\right)\equiv p_{\alpha}(q)\rho(\mathbf{r})\) を導入すると,2重積分は以下のように畳み込み積分に変形することができます。
(5.52)\[\begin{split}E_{c}^{\rm nl} = \frac{1}{2} \iint d\mathbf{r}d\mathbf{r}' \theta_{\alpha}\left(\mathbf{r}\right) \theta_{\beta}\left(\mathbf{r}'\right)\phi_{\alpha\beta}\left(\left|\mathbf{r}-\mathbf{r}'\right|\right) \\ = \frac{\Omega}{2} \sum_{\alpha} \sum_{\mathbf{G}} \theta_{\alpha}^{*}\left( \mathbf{G} \right) \theta_{\beta} \left(\mathbf{G}\right) \phi_{\alpha\beta} \left(\left|\mathbf{G}\right|\right), \\ \theta_{\alpha} \left(\mathbf{G}\right) = \int d\mathbf{r} \theta_{\alpha} \left(\mathbf{r}\right) \exp \left[ -i \mathbf{G} \cdot \mathbf{r} \right], \\ \phi_{\alpha\beta} \left( \left|\mathbf{G}\right|\right) = \frac{4\pi}{\left|\mathbf{G}\right|} \int r \phi_{\alpha\beta} \left(r\right) \sin \left[ \left|\mathbf{G}\right| r \right] dr.\end{split}\]
このように変形すると,上式から分かるように高速フーリエ変換を利用して処理できるようになり,大幅な高速化が達成できます。
SCF計算に組み込む場合,通常通りエネルギーを電子密度で汎関数微分します。
(5.53)\[\begin{split}v_{\rm c}^{\rm nl} \left(\mathbf{r}\right) = \sum_{\alpha} \left( u_{\alpha} \left(\mathbf{r}\right) \frac{\delta \theta_{\alpha} \left(\mathbf{r}\right)}{\delta \rho \left( \mathbf{r}\right)} + \sum_{\mathbf{r}'} u_{\alpha} \left(\mathbf{r}'\right) \frac{\delta \theta_{\alpha} \left(\mathbf{r}'\right)}{\delta \left|\nabla\rho\left(\mathbf{r}'\right)\right|} \frac{\delta \left|\rho\left(\mathbf{r}'\right)\right|}{\delta \rho\left(\mathbf{r}\right)} \right), \\ u_{\alpha} = \sum_{\beta} \sum_{\mathbf{r}'} \theta_{\beta}^{*} \left(\mathbf{r}'\right) \phi_{\alpha\beta} \left(\left|\mathbf{r}-\mathbf{r}'\right|\right).\end{split}\]
\(u_{\alpha} \left(\mathbf{r}\right)\) も畳み込み積分になっているので,逆空間で計算し,逆FFTを行うことによって計算することが可能です。
アルゴリズム
非局所相関項(van der Waals項)を含めた全エネルギー計算は,交換相互作用はGGA, 局所的な相関相互作用はLDA, そして非局所的な相関相互作用はここまで説明したvdWDF理論を利用して行われます。計算方法としては,この計算をすべてセルフコンシステントに行う方法と,交換相互作用はGGA, 相関相互作用はLDAを採用した変則的な汎関数を利用して収束解を得たあとにポスト処理的にvdWDF効果を取り込む,という方法があります。PHASE/0では前者を“SCF版”,後者を“ワンショット版”と呼んでいます。ワンショット版は最後に1度vdWの処理を行うのみなので,SCF版と比較すると高速です。エネルギーを求めることのみが目的の場合ワンショット版でも多くの場合十分な精度が得られます。ただし,vdWエネルギー由来の原子間力も計算したい場合はSCF版を採用する必要があります。
なお、上記の交換相互作用として、いくつかのGGA汎関数が考えられています。さらに、これとZabの値 (vdwdfのバージョン) の組み合わせにより、複数のvdWDF汎関数が提案されています。PHASE/0で使用可能な vdWDFの一覧を以下に示します。
名称 |
vdwdf のバージョン |
交換相互作用 |
---|---|---|
vdwdf |
1 |
revpbe |
vdwdf2 |
2 |
pw86r |
vdwdf-c09x |
1 |
c09x |
vdwdf2-c09x |
2 |
c09x |
vdwdf-optpbe |
1 |
optpbe |
vdwdf2-b86r |
2 |
b86r |
vdwdf-cx |
1 |
lvpw86r |
使用方法
利用の前提として,GGAPBE汎関数に対応した擬ポテンシャルファイルを用意する必要があります(公開擬ポテンシャルは,ほぼすべてGGAPBEに対応しています)。その上で,以下のような設定を行います。
accuracy{
xctype = vdwdf2 ! vdwdf, vdwdf2, … ,vdwdf-cxが選択可能。
vdwdf{
mode = scf
}
}
accuracyブロックの下のxctype変数に、使用する vdWDF汎関数名を指定します。さらに,vdwdfブロックの下の変数modeにSCF版を利用する場合はscfを,ワンショット版を利用する場合はoneshotを指定します。変数modeのデフォルト値はoneshotです。ただし、xctype = vdwdf 以外はワンショット計算には非対応です。
出力
結果は,通常の計算と変わりません。nfefn.dataファイルにはエネルギーの履歴が,nfdynm.dataファイルには原子座標の履歴が記録されます。ワンショット版を利用している場合は,output000ファイルに記録される途中のエネルギーとnfefn.dataファイルで報告されるエネルギーが異なる点には注意が必要です。ワンショット版の場合,途中に記録されるエネルギーは交換相互作用にGGA, 相関相互作用にLDAを利用した変則的な汎関数による結果だからです。ワンショット版の場合,計算収束し,vdWDFの計算が終わったあと,以下のように結果がoutput000ファイルに報告されます。
vdW energy : 0.0668443126 hartree
--> total energy : -22.8808219651 hartree
nfefn.dataファイルに記録されるエネルギー値は,vdWDFのエネルギーも含んだエネルギー値です。
5.3.4.3. 計算例1:積層グラファイトの全エネルギー計算
はじめに
ここでは実際に本ルーチン(vdW)を用いたvdW-DF計算の例を挙げます.計算対象はGGAやLDAでは正確に計算できない典型例である,積層グラファイト(A-B stacking)の全エネルギーの層間距離依存性としました.通常のGGAの範囲内でこの系の全エネルギー曲線を計算するとエネルギー的に安定な平衡点は現れず,結果的に各グラファイト層は互いに無限遠まで離散するという解釈になってしまいます.本来は適当な層間距離でエネルギー的に明確な安定点が存在するため,GGAによるこの解釈は定性的に間違っています.これは,非局所的な相互作用であるvan der Waals相互作用をGGAが全く考慮できていないことに主な要因があり,本計算機能を利用することでこの間違いが修正されることを確認します.
計算条件
本計算では,実験値や他の理論計算の報告例が豊富にあるA-B stacking型の積層グラファイトを対象にしました.ユニットセル内に8個(2層分)の炭素原子を含みます.グラファイトの積層方向にz軸をとってセルサイズは4.3×2.5×z(=x×y×z[Å3])とし,zを5から12[Å]まで変化させながら各z値での全エネルギーを計算させました.この計算を通常のGGAとvdW-DF計算 ( xctype=vdwdf、mode=oneshot ) の2通りで行い,それぞれから得られる全エネルギー曲線を比較します.vdW-DF計算には入力情報として電荷密度分布\(\rho^{\text{GGAx}}\left( \mathbf{r} \right)\)が必要になりますが,このグリッド密度はGGA計算時に設定したcutoff値に依存しており,ここでは32×18×40(to 96)個のグリッドを採用しています.なお,グリッド点数は整数であるため,z軸の変化に伴って不連続に変化することになります.つまり,結果のエネルギー曲線が不自然に変化する場合はこの不連続性が原因であるため,必要に応じてPHASEのinputfileのcutoff値を上げることでなめらかになります.また,vdWは非局所的な計算になるためGGAよりは大きな計算コストが必要となります.
計算結果
下図は上記条件で計算した積層グラファイト(A-B stacking)の全エネルギーの層間距離依存性を示したものです.赤線は通常のGGAによる結果を,緑線はvdWによるvdW-DF計算の結果をそれぞれ示しています.また,青点は実験 [Benedict98] [Baskin55] による平衡点とそのときの凝集エネルギー(青線は誤差)を,同様に紫点は別の理論計算 [Rydberg03] によるものです.GGA計算では全く平衡点が確認できないのに対して,vdW-DF計算ではかなり実験値の近くで極小点を迎えているのが確認できます.

図 5.57 積層グラファイトの全エネルギーの層間距離依存性.GGA(赤線)とGGA + vdW(緑線)による比較
5.3.4.4. 計算例2:積層2H-MoS2の全エネルギー計算
層状物質である 2H-MoS2 (単位胞6原子) の全エネルギー計算を、c 軸方向の格子長をパラメーターにして行います。a、b軸の格子長は 3.1612 Åで固定します。また、mode=scf により SCF計算を行い、構造最適化を行います。結果は、以下に示すように、xctype = vdwdf よりも vdwdf2-c09x の方が、実験の格子長 12.2985 Åに近い c 軸長でエネルギーが最小となっています。

図 5.58 積層2H-MoS2 の全エネルギーのc 軸長依存性
5.3.4.5. 制限事項
部分電荷補正がある計算や、PAW の計算には注意してください。内殻電子による補正項が vdwDF に完全対応していないためです。ただし、定性的には大きな影響は与えません。
5.3.4.6. 参考文献
- Dion06
Dion, H. Rydberg, E. Schröder, D. C. Langreth, and B. I. Lundqvist: Phys. Rev. Lett. 92 (2004) 246401: Erratum, ibid, 95 (2005) 109902.
- Gunnarsson76
Gunnarsson and B. I. Lundqvist: Phys. Rev. B 13 (1976) 4274.
- Roman09
Guillermo Román-Pérez and José M. Soler, Phys. Rev. Lett. 103 0 (2009).
- Benedict98
Benedict, N. G. Chopra, M. L. Cohen, A. Zettl, S. G. Louie, and V. H. Crespi: Chem. Phys. Lett. 286 (1998) 490.
- Baskin55
Baskin and L. Mayer: Phys. Rev. 100, (1955) 544.
- Rydberg03
Rydberg, M. Dion, N. Jacobson, E. Schröder, P. Hyldgaard, S. I. Simak, D. C. Langreth, and B. I. Lundqvist: Phys. Rev. Lett. 91 (2003) 126402.
- Thonhauser07
Thonhauser, Valentino R. Cooper, Shen Li, Aaron Puzder, Per Hyldgaard, and David C. Langreth: Phys. Rev. B 76, 125112 (2007).
5.3.5. ファンデルワールス相互作用補正機能
5.3.5.1. 機能の概要
Williamsの方法 [Williams06]
\[\begin{split}E_{\rm vdw} = \sum_{ij} \frac{C_6^{ij}}{R_{ij}^6} f\left( R_{ij}\right) \\ f\left(R\right) = \left( 1-\exp \left[ -d\left(\frac{R_ij}{R_{0}^{ij}}\right)^7\right]\right)^4 \\ C_{6}^{ij} = -S_C \times \frac{2C_6^iC_6^jp_ip_j}{p_i^2C_6^i+p_j^2C_6^j}, R_0^{ij} = S_R \times \frac{\left(R_0^{ii}\right)^3 + \left(R_0^{jj}\right)^3}{\left(R_0^{ii}\right)^2 + \left(R_0^{jj}\right)^2}, R_0^{ii} = 2 \times R_0^i\end{split}\]
パラメータ
vdw radius 20.0 bohr
scaling factor \(S_C\) 0.8095 (PHASE), \(S_R\) 0.80 文献 PBE \(S_C\) 0.85 \(S_R\) 0.80
damping factor \(d\) 3.0
polarizabilities A 3 |
vde coef C6 Hartree*bohr 6 |
vdw radius |
polarizabilities A 3 |
vde coef C6 Hartree*bohr 6 |
vdw radius |
||
H |
0.38 |
2.831179918 |
1.17 |
NTE |
0.964 |
20.89758657 |
1.50 |
F |
0.296 |
3.94987377 |
NTR2 |
1.030 |
23.080 |
1.50 |
|
Cl |
2.315 |
3.94987377 |
NPI2 |
1.090 |
25.125 |
1.50 |
|
Br |
3.013 |
128.2756865 |
NDI |
0.956 |
20.63799109 |
1.50 |
|
I |
5.415 |
309.0603852 |
OTE |
0.637 |
11.86370812 |
1.40 |
|
CTE |
1.061 |
22.67403316 |
1.70 |
OTR4 |
0.569 |
10.01566303 |
1.40 |
CTR |
1.352 |
32.61525204 |
1.70 |
OPI2 |
0.274 |
3.346856941 |
1.40 |
CAR |
1.352 |
49.790/Sc |
1.70 |
STE |
3.000 |
121.2531939 |
1.80 |
CBR |
1.896 |
54.16430826 |
1.70 |
STR4 |
3.729 |
168.0350502 |
1.80 |
CDI |
1.283 |
30.15058105 |
1.70 |
SPI2 |
2.700 |
103.5277919 |
1.80 |
PTE |
1.538 |
42.11289383 |
1.80 |
Grimme (DFT-D2)の方法 [Grimme06]
\[\begin{split}E_{\rm disp} = -s_6 \sum_{ij} \frac{C_6^{ij}}{R_{ij}^6} f \left(R_{ij}\right) \\ f\left(R\right) = \frac{1}{1+ \exp \left[ -d \left( \frac{R_{ij}}{R_0^{ij}} -1\right)\right]} \\ C_6^{ij} = \sqrt{C_6^i C_6^j}, R_0^{ij} = R_0^i + R_0^j\end{split}\]
パラメータ
vdw radius 30.0A
scaling factor 0.75, damping factor 20.0
C6 Jnm6/mol |
R0 A |
C6 Jnm6/mol |
R0 A |
||
---|---|---|---|---|---|
H |
0.14 |
1.001 |
K |
10.80 |
1.485 |
He |
0.08 |
1.012 |
Ca |
10.80 |
1.474 |
Li |
1.61 |
0.825 |
Sc-Zn |
10.80 |
1.562 |
Be |
1.61 |
1.408 |
Ga |
16.99 |
1.650 |
B |
3.13 |
1.485 |
Ge |
17.10 |
1.727 |
C |
1.75 |
1.452 |
As |
16.37 |
1.760 |
N |
1.23 |
1.397 |
Se |
12.64 |
1.771 |
O |
0.70 |
1.342 |
Br |
12.47 |
1.749 |
F |
0.75 |
1.287 |
Kr |
12.01 |
1.727 |
Ne |
0.63 |
1.243 |
Rb |
24.67 |
1.628 |
Na |
5.71 |
1.144 |
Sr |
24.67 |
1.606 |
Mg |
5.71 |
1.364 |
Y-Cd |
24.67 |
1.639 |
Al |
10.79 |
1.716 |
In |
37.32 |
1.672 |
Si |
9.23 |
1.716 |
Sn |
38.71 |
1.804 |
P |
7.84 |
1.705 |
Sb |
38.44 |
1.881 |
S |
5.57 |
1.683 |
Te |
31.74 |
1.892 |
Cl |
5.07 |
1.639 |
I |
31.50 |
1.892 |
Ar |
4.61 |
1.595 |
Xe |
29.99 |
1.881 |
1 J/mol = 3.8088e-7 hartree, 1 bohr = 0.5291772480 A
Grimme (DFT-D3)の方法 (バージョン2019.01以上)
DFT-D2法のほか,DFT-D3法 [Grimme10] も利用できます
DFT-D3は,DFT-D2の改良版です。\(\frac{1}{r^{8}}\)に比例する項があることやパラメーターが配位数に依存する点などがDFT-D2と異なる点であり,特に後者の改良によって原子の局所構造の違いを相互作用に反映させることができるようになっています。
DFT-D3法を利用するためには,DFT-D2機能と同じようにまずcontrolブロックにおいてsw_vdw_correctionの値をonにします。
Control{
sw_vdw_correction = on
}
さらに,accuracyブロックにおいてvdw_methodとしてdftd3を指定すればよい。
accuracy{
vdw_method = dftd3
}
DFT-D2法やWilliamsの方法と違い,ファンデルワールス相互作用のために別途元素を定義する必要はありません。
また,パラメーターファイルが置いてある場所をfile_names.dataのF_DFTD3PARで指定します。
&fnames
F_INP = ‘./nfinp.data’
…
F_DFTD3PAR = ‘./dftd3par.data’
/
F_DFTD3PARのデフォルト値は./dftd3par.dataです。dftd3par.dataファイルは,PHASE/0インストールディレクトリーの下の以下の場所にあります。
samples/vdw_correction/dftd3
5.3.5.2. 入力パラメータ
タグ |
値 |
備考 |
|
---|---|---|---|
Control |
sw _vdw_correction |
||
Accuracy |
vdw_method |
williams grimme or dft-d2 |
デフォルト |
vdw_radius |
20 bohr 30 A (Grimme DFT-D2) |
||
vdw _scaling_factor |
0.805 (Williams) 0.75 (Grimme DFT-D2) |
||
vdw_s caling_factor_r |
0.8 (Williams) |
||
vdw _damping_factor |
3.0 (Williams) 20.0 (Grimme DFT-D2) |
||
Structure |
atom_list |
||
atoms |
#tag vdw でvd w補正における元 素のtypeを指定 |
||
vdw_list |
vdw補正におけ る各元素異に対 するパラメータ |
Williams #tag type c6 r0 p Grimme #tag type c6 r0 |
|
赤字は、vDW補正機能を用いる場合の必須の入力項目
vdW補正の各元素のパラメータの指定
Williams法、Grimme(DFT-D2)法の各元素のパラメータをプログラム内で持ち、デフォルト値としている。
vdw_listのtypeは、atom_listで指定したvdwのtypeと対応している必要がある。
Williams法
vdw_list{
#tag type c6 r0 p
H 2.831179918 1.17 0.387
CTE 22.67403316 1.70 1.061
}
Grimme(DFT-D2)法
vdw_list{
#tag type c6 r0
H 0.14 1.001
C 1.75 1.452
}
入力パラメータ例
vdW補正関連の入力データ例を以下に示す。
Methane Dimer Williams法
Control{
sw_vdw_correction = ON
}
accuracy{
vdw_method = williams
vdw_radius = 20.0
vdw_scaling_factor = 0.8095
vdw_scaling_factor_r = 0.8
vdw_damping_factor = 3.0
}
structure{
atom_list{
coordinate_system = cartesian ! {cartesian
atoms{
#units angstrom
#default mobile=on
#tag element rx ry rz vdw
C 0 0 0 CTE
H 0 1.093 0 H
H 1.030490282 -0.364333333 0 H
H -0.515245141 -0.364333333 0.892430763 H
H -0.515245141 -0.364333333 -0.892430763 H
C 0 -3.7 0 CTE
H 0 -4.793 0 H
H -1.030490282 -3.335666667 0 H
H 0.515245141 -3.335666667 -0.892430763 H
H 0.515245141 -3.335666667 0.892430763 H
}
}
vdw_list{
#tag type c6 r0 p
H 2.831179918 1.17 0.387
CTE 22.67403316 1.70 1.061
}
}
Methane Dimer Grimme(DFT-D2)法
Control{
sw_vdw_correction = ON
}
accuracy{
vdw_method = grimme
vdw_radius = 30.0
vdw_scaling_factor = 0.75
vdw_damping_factor = 20.0
}
structure{
atom_list{
coordinate_system = cartesian !
atoms{
#units angstrom
#default mobile=on
#tag element rx ry rz vdw
C 0 0 0 C
H 0 1.093 0 H
H 1.030490282 -0.364333333 0 H
H -0.515245141 -0.364333333 0.892430763 H
H -0.515245141 -0.364333333 -0.892430763 H
C 0 -3.7 0 C
H 0 -4.793 0 H
H -1.030490282 -3.335666667 0 H
H 0.515245141 -3.335666667 -0.892430763 H
H 0.515245141 -3.335666667 0.892430763 H
}
}
vdw_list{
#tag type c6 r0
H 0.14 1.001
C 1.75 1.452
}
}
5.3.5.3. 計算例
samples/vdw_correction/Water_Dimer
(Williams, Grimme(DFT-D2))samples/vdw_correction/Methane_Dimer
(Williams, Grimme(DFT-D2))samples/vdw_correction/Ethane_Dimer
(Williams, Grimme(DFT-D2))samples/vdw_correction/ATstack
(Williams)
5.3.5.4. 参考文献
- Williams06
R.W. Williams, et al.: Chemical Physics 327 (2006) 54-62
- Grimme06
Grimme, J. Comp. Chem. 27, 1787 (2006).
- Grimme10
Stefan Grimme, Jens Antony, Stephan Ehrlich, and Helge Krieg, “A consistent and accurate ab initio parametrization of density functional dispersion correction (DFT-D) for the 94 elements H-Pu” The Journal of Chemical Physics, 132, 154104 (2010).
5.3.6. 有効遮蔽体法(ESM法)
5.3.6.1. 機能の概要
ESM (Effective Screening Medium)法 [Otani06] [Hamada09] とは、表面モデルを精度よく扱うための計算手法です。PHASEは基底関数として平面波を利用するプログラムなので、厳密には周期系のみ取り扱うことが可能です。表面モデルを扱う場合、表面に垂直な方向に“真空層”を設けることによって表面を模擬した系の計算を行います。このような方法の場合、たとえば分極した表面などは正しく扱えないので特殊な補正を施す必要があります。ESM法は、実効的な遮蔽物(effective screening medium)を真空領域に設定することによって半無限におよぶ表面領域を有限の真空領域で扱うことを可能とする方法です。ここでは、PHASEに組み込まれたESM法の利用方法を説明します。
5.3.6.2. 入力パラメータ
まずは、通常のPHASE計算と同様の入力パラメータファイルを準備します。この際、原子配置の定義の仕方に注意が必要です。ESMプログラムは、系が以下の図のように定義されていることを仮定しています。

図 5.59 ESM法において仮定している原子配置の定義方法の模式図
系は、2方向(aおよびb軸方向)に周期的、1方向(c軸方向)に非周期系であることを仮定しています。c軸の値が0になる場所に系の中心が位置するように必要に応じて系をシフトし、プラスマイナス両側に真空層を設けます。さらに、系の中心から距離z1(入力パラメータファイルによって指定する)離れた場所にESMが置かれます。
accuracyブロックにesmブロックを作成し、ESM用の設定を施します。典型的には、以下のとおり。
...
...
accuracy{
esm{
sw_esm = on
bc = pe1
electric_field = 0.001
}
...
...
}
...
...
esmブロックの下では、以下の変数を定義することが可能です。
sw_esm |
ESM法を利用するかどうかを指定するスイッチ。 onを指定するとESM法を利用します。デフォルト値はoff |
z1 |
ESMの位置を指定します。指定がない場合,単 位胞の境界にESMが置かれます(すなわち,z1=c/2)。 |
bc |
境界条件(boundary condition)を指定します。BARE, PE1, PE2のいずれかを指 定します。BAREは両側のESMが真空(誘電率1)、PE1は 両側のESMが金属(誘電率∞)PE2はESMの片側が真空、も う片側が金属という境界条件です。デフォルト値はBARE |
electric_field |
有限電場を指定したい場合に 、その量を原子単位で指定します。この指定は、bcがP E1であった場合のみに意味をもちます。それ以外の場合 、計算中参照されません。電場の単位は、hartree/bohr です(約51.4 V/Å)。 |
add_elec |
電子 を追加/削除したい場合に追加/削除したい電子数を実数 で指定します。削除したい場合は負の数を指定します。 |
z_wall |
原子が真空 層のある領域からはみでないように“壁”を設ける場合に 、その“ある領域”の指定を実数で行います。このパラメ ータの指定があった場合にこの機能が有効となります。 |
bar_width |
“壁”ポテンシャ ルを設ける場合に、その幅を長さの単位で指定します。 |
bar_height |
“壁”ポテンシャルを設け る場合に、その高さをエネルギーの単位で指定します。 |
5.3.6.3. 計算の実行
計算の実行は、通常のPHASEの計算通り行います。並列の方法や擬ポテンシャルの制限などは特にありません。利用できる計算機能にも特に制約はありません。
5.3.6.4. 計算例
水分子
ESM法適用例として、単純な水分子の計算結果を紹介します。この例題の入力ファイルは、 samples/surface/esm/H2O
以下にあります。水分子は、単体で双極子モーメントをもっているので、水分子は通常の周期系の計算の場合全エネルギーに有限の誤差が発生します。ESM法は、1つの方向については無限の計算を行うことになるので、正しい全エネルギーが得られると考えられます。
このようなことを確認するため、以下のような計算を実施します。
水分子単体の、周期系における全エネルギー計算
水分子単体の、ESM法による全エネルギー計算
水分子を互い違いに配置した系の、周期系における全エネルギー計算

図 5.60 H2O分子を互い違いに配置した系。
のように水分子を互い違いに配置した系を用意することによって、双極子モーメントを打ち消すことが可能です。したがって、3.の計算によって得られた全エネルギーの半分の値は、2. の計算と結果が一致するはずです。ここでは、このような結果が得られるかどうかを確認します。
計算された全エネルギーの結果は、以下に示します。
全エネルギー (hartree/ H2O) |
参照値との差 (hartree/H2O) |
|
---|---|---|
1.の計算 |
-17.1855148193 |
-1.8927504×10-3 |
2.の計算 |
-17.1836307637 |
8.6948×10-6 |
3.の計算 |
-17.1836220689 |
0 |
表から明らかなように、ESM法による計算と3. の計算の結果は非常に近く、“無限の系の計算”がESM法によって実現できていることがわかります。
電場を印加した計算例
ESM法を利用すると、c軸方向に電場を印加した計算を実施することが可能です。ここでは、簡単な例によってその利用方法を説明します。この例題の入力ファイルは samples/surface/esm/Al111
以下にあります。
採用した系は、仕事関数の計算例でも利用したAl(111)の系です。以下のような設定によってESMを利用します。
accuracy{
esm{
sw_esm = on
bc = pe1
electric_field = 0.001
}
}
電場を印加するには、パラメータbcとしてpe1を指定する必要がある点に注意してください。また、電場の影響をみるために局所ポテンシャルを出力するので、仕事関数に関する設定も有効にしてあります。
postprocessing{
workfunc{
sw_workfunc = on
}
}
電場の大きさは、-0.001, 0, +0.001(単位は原子単位)と変化させて計算を行いました(0のケースは通常の計算とほぼ同じです)。最後に、この系には反転対称性がありますが、電場を印加すると反転対称性は損なわれるのでsw_inversionパラメータは指定していません。
以上の設定のもと、通常通りPHASEを実行します。各ケース計算が終了したら、workfuncプログラムを利用してポスト処理を実施します。この処理の結果得られる局所ポテンシャルの、電場を印加する場合としない場合の差と表面に垂直な軸方向の距離の関係を 図 5.61 に示します。この図においては、距離のちょうど半分の地点が系の境、すなわち 図 5.61 の±c/2の地点になっています。
図 5.61 ローカルポテンシャルの差分と表面に垂直な距離との関係。
図から明らかなように、電場を印加することによって真空領域の局所ポテンシャルにかたむきが発生しています。また、金属域においてはフラットとなっています。これは、電場は真空域で発生し、金属中では発生していないことを表わしています。
5.3.6.5. 使用における注意点
ESM法を利用する場合、コンパイルの際にフーリエ変換ライブラリーとしてFFTWを利用する必要があります。
原子配置の指定においては、反転対称の位置の原子は直接指定するようにし、weightパラメータはつねに1としてください。
電場を印加する場合c軸方向の対称性はあったとしても損なわれるので、そのような対称性は無効にするようにしてください。また、sw_inversionパラメータをonにはしないでください。
5.3.6.6. 参考文献
- Otani06(1,2)
Otani and O. Sugino, “First-principles calculations of charged surfaces and interfaces: A plane-wave nonrepeated slab approach”, Physical Review B 73, 115407 (2006).
- Hamada09(1,2)
Hamada, M. Otani, O. Sugino and Y. Morikawa, “Green’s function method for elimination of the spurious multipole interaction in the surface/interface slab model”, Physical Review B 80, 165411 (2009).
5.3.6.7. ライセンス
PHASEのESM機能は、EsmPackライブラリーを通じて実現されています。EsmPackライブラリーは、産業技術総合研究所からMITライセンスで公開されている、ESM法を実現するための汎用のライブラリーです。以下のライセンス条項をご理解いただいた上でご利用ください。また、本機能を利用して論文発表などを行う場合、必ず文献 [Otani06] [Hamada09] を参考文献に含めてください。
Copyright (c) 2012, Minoru Otani <minoru.otani@aist.go.jp>
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
5.3.7. Dipole補正
Dipole補正機能とは,系が荷電状態の場合にその影響を打ち消すdipoleを配置することによって補正し,正しい全エネルギーを求めたり,電場を印加した計算を行うことができる機能です。Dipoleの大きさはセルフコンシステントに決まるので,ユーザーが適切なdipoleの大きさを勘案する必要はありません。また,原子間力計算においても考慮されるので,構造最適化に利用することも可能となっています。
5.3.7.1. 入力パラメーターファイルの書き方
Dipole補正機能を有効にするには,入力パラメーターファイルのcontrolブロックにおいて以下のような記述を行います。
control{
sw_dipole_correction = on
}
この指定によって,dipole補正機能が有効になります。さらに,accuracyのdipoleブロックにおいて,dipole補正機能の詳細設定を行います。
accuracy{
…
…
dipole_correction{
direction = 3
amix = 1
vacuum{
rz = -0.5
}
elec_field{
ez = 0.0
}
}
}
dipole_correctionの下のvacuumブロックでdipoleを配置する位置を,elec_fieldブロックで外部電場を設定することができます。dipole_correctionブロックにおいて利用できるパラメーターは次の表に示す通りです。
パラメーター名 |
説明 |
---|---|
direction |
双極子の向きを指定します。1がa軸方向 ,2がb軸方向,3がc軸方向に対応します。 |
amix |
双極子のミクシングパラメーターです。0よりも大 きく,1以下の値を指定します。デフォルト値は1です。 |
vacuum |
双極子位置を指定するブロックです。双極子 の位置は,単位胞の長さを1とする単位で指定します。 |
rx |
双極子の,a軸方向の位置です。direction = 1の場合に設定します。双極子は,真空に配置します。 |
ry |
双極子の,b軸方向の位置です。direction = 2の場合に設定します。双極子は,真空に配置します。 |
rz |
双極子の,c軸方向の位置です。direction = 3の場合に設定します。双極子は,真空に配置します。 |
elec_field |
印加したい外部電場を指定するブロックです。 |
ex |
電場の,a軸方向の値です。direction = 1の場合に設定します。 |
ey |
電場の,b軸方向の値です。direction = 2の場合に設定します。 |
ez |
電場の,c軸方向の値です。direction = 3の場合に設定します。 |
Dipoleの位置の指定方法には制限があるので,注意して指定する必要があります。双極子の向きをz方向とすると,「rz+0.5の位置に系の中心が位置するように」,そして「周期境界条件は考慮せずに」指定します。たとえば, 図 5.62 のように単位胞の中心に系を置く場合,rz = 0とします。周期境界条件下ではrz = 1としてもよさそうですが,このような指定は不正となります。

図 5.62 Dipole補正を有効にする表面系の模式図
また,dipole補正機能と直接は関係ありませんが,下記のような設定を行うことによって局所ポテンシャルを出力することができます。この設定を施した上で仕事関数を求める際の手続きを踏むことによって,真空層の方向と局所ポテンシャルの関係を解析することが可能です。
postprocessing{
workfunc{
sw_workfunc = on
}
}
5.3.7.2. ログファイルの見方
Dipole補正を有効にした状態で計算を実行すると,outputxxxファイルに以下のようにdipoleの履歴がSCFステップごとに出力されます。
Dipole: rmin,rmax,idir = -0.50000000 0.50000000 3
Dipole: Total = -0.22795296 = -0.5795 Debye = -1.9326x10^-30 Cm
Dipole: Ion = -38.10003241
Dipole: Elec = -37.87207945
Dipole: mix dipole and field with amix_dip= 1.00000000
Dipole: (NOW) dipole,field = -0.00776990 0.00000000
Dipole: (OLD) dipole,field = -0.00776992 0.00000000
Dipole: (NEW) dipole,field = -0.00776990 0.00000000
Dipole: Edip(ion),Eext(ion)= 0.01230 0.00000
Dipole: potential jump (dip and ext)= -0.09764 0.00000
Dipole: Totalで報告されている値はdipoleの大きさそのものです。Dipole: (NOW), Dipole (OLD), Dipole (NEW)で報告されている値はそれぞれ現ステップのdipoleの値,1ステップ前のdipoleの値,ミクシングの結果得られたdipole値に相当しますが,SCFに足しこめるポテンシャルになるよう体積などで規格化された量となっているため値の大きさはDipole: Totalのそれと異なります。
5.3.7.3. 計算例
Dipole補正を利用した計算例として,ESMと同様水分子の例と電場を印加した計算例を挙げます。
水分子
ESM 5.3.6 章 の例 と同じセッティングで,Dipole補正を利用した全エネルギー計算を行ってみました。
入力データは samples/surface/dipole/H2O
以下にあります。
この例において,Dipoleは以下のように設定しています。
control{
sw_dipole = on
}
accuracy{
…
dipole_correction{
amix = 1
direction = 3
vacuum{
rz = -0.5
}
}
}
…
単位胞の一番下に水分子を配置しているので,vacuumブロックの変数rzの値は-0.5となっています。
結果は次の表に示す通りです(水分子の配向を少し変えたので,ESMの例と全く同じではありません)。
表 5‑34 水分子の結果の比較
補正なし |
補正あり |
esm |
ref |
|
---|---|---|---|---|
エネルギー(ha) |
-17.201981 |
-17.201719 |
-17.2017015 |
-17.201773 |
差 (ha) |
-0.000208 |
0.000054 |
0.000072 |
― |
ESMの場合と同様,補正しない場合と比較してより参照値に近いエネルギーを得ることができました。
図 5.63 に,c軸方向と局所ポテンシャルの関係を補正なし,補正あり,ESM法の場合についてプロットしました。この図においては,c軸が0および16Å近辺の位置に水分子が配置されています。補正なしの場合,真空層においても局所ポテンシャルが傾きを持っています。これは,周期的に並んだ水分子がクーロン相互作用によって相互作用していることを意味しています。他方,Dipole補正の場合とESM法の場合は真空のちょうど中心において局所ポテンシャルに飛びが現れています。両手法の場合水分子はお互いに相互作用を持たず,その影響を真空層の中心あたりで吸収していることを意味しています。
図 5.63 真空層と局所ポテンシャルの関係
電場を印加した計算
やはりESM 5.3.6 章 の例と同じセッティングで,Dipole補正機能を利用して電場を印加した計算を行ってみました。入力データは samples/surface/dipole/Al
以下にあります。
その設定は,以下のようになっています。
control{
sw_dipole = on
}
accuracy{
…
dipole_correction{
amix = 1
direction = 3
vacuum{
rz = -0.5
}
electric_field{
ez = 0.001
}
}
}
…
postprocessing{
workfunc{
sw_workfunc = on
}
}
以上の設定で,通常通りPHASEを実行し,終了後workfuncプログラムを利用してポスト処理を実施します。この処理の結果得られる局所ポテンシャルの,電場を印加する場合としない場合の差と表面に垂直な軸方向の距離の関係を 図 5.64 に示します。
図 5.64 ローカルポテンシャルの差分と表面に垂直な距離との関係。
ESMの場合と同様,ポテンシャルの差分は,真空域においては傾きがあり,金属中においてはフラットになりました。これは金属中では電位差が発生していないことを表しており,基本的な電磁気学の知見と合う結果となっています。
5.3.8. PBEsol汎関数(バージョン2019.02以降)
5.3.8.1. 概要
PBE汎関数は格子定数を過大評価する傾向にあり、バンド構造やフォノン振動数の実験結果との乖離をまねく場合があります。PBEsol汎関数 [Perdew08] は、PBE汎関数を結晶向けに最適化した汎関数で、格子定数が実験値に近くなり、バンド構造が改善することが知られています。
PBEsol汎関数では、交換エネルギー及び相関エネルギーは、それぞれ
(5.54)\[\begin{split}E_{x}^{\rm PBEsol} \left[n\right] = \int d\mathbf{r}e_{x}^{\rm unif} \left(n\left(\mathbf{r}\right)\right) F_x^{\rm PBEsol} \left(s\left(\mathbf{r}\right)\right), \\ s = \frac{\left|\nabla n\right|}{2k_F n}, k_F = \left(3\pi^2 n\right)^{1/3} \\ F_x^{\rm PBEsol} \left(s\right) = 1+\mu s^2\end{split}\]
及び
(5.55)\[\begin{split}E_c^{\rm PBEsol} \left[n\right] = \int d\mathbf{r} n\left(\mathbf{r}\right) \left\{ e_c^{\rm unif} \left(n\left(\mathbf{r}\right)\right) + \beta t^2 \right\}, \\ t = \frac{\left|\nabla \right|}{2k_{TF}n}, k_{TF} = \sqrt{\frac{4k_F}{\pi}}\end{split}\]
で与えられます。ここで、 \(\mu=10 /81\) 及び \(\beta=0.046\) です。
5.3.8.2. 入力
xctypeとして pbesol を指定します。擬ポテンシャルは通常の PBE のものを使用することができます。
accuracy{
xctype = pbesol
}
擬ポテンシャルは通常のPBEのものを利用してください。
5.3.8.3. 出力
標準出力 (output000) に、以下のような表示がされます。
!PP xctype = pbesol ps_xctype0 = ggapbe
この例では、読み込んだ擬ポテンシャルは PBEであるが、計算は PBEsol で行うことを意味しています。これ以外に、PBEsol特有の出力はありません。
5.3.8.4. 計算例
samples/pbesol
ディレクトリー以下のサブディレクトリーに,transition metal dichalcogenide
(TMDC)の計算の入力ファイルが置かれています。この中には,PBEのほかPBEsolを使う例があります。例題で得られる格子定数を次の表に掲載します。単位はÅです。
Table 5‑1 TMDCの格子定数。単位はÅ.
MoS2 |
MoSe2 |
WS2 |
WSe2 |
|
---|---|---|---|---|
PBE |
3.196 (+0.035) |
3.374 (+0.089) |
3.189 (+0.036) |
3.339 (+0.051) |
PBEsol |
3.149 (-0.012) |
3.293 (+0.008) |
3.146 (-0.007) |
3.289 (+0.001) |
実測値 |
3.161 |
3.285 |
3.153 |
3.288 |
おおむねPBEsolの方が実測値に近い結果が得られることが確認できました。
5.3.8.5. 参考文献
- Perdew08
J.P. Perdew et al, Phys. Rev. Lett. 100 (2008) 136406.
5.3.9. meta-gga(バージョン2019.02以降)
5.3.9.1. 概要
modified Becke Johnson 交換ポテンシャルは、以下の式で与えられます [Tran09] [Koller12]
(5.56)\[\begin{split}v_{x, \sigma}^{\rm mBJ} \left(\mathbf{r}\right) = c v_{x, \sigma}^{\rm BR}\left(\mathbf{r}\right)+\left(3c-2\right) \frac{1}{\pi}\sqrt{\frac{5}{6}}\sqrt{\frac{t_{\sigma}\left(\mathbf{r}\right)}{\rho_{\sigma} \left(\mathbf{r}\right)}}, \\ c = \alpha + \beta \sqrt{g}, \\ g = \frac{1}{V_{\rm cell}} \frac{1}{2} \int_{\rm cell} d\mathbf{r}' \left(\frac{\left|\rho_{\uparrow}\left(\mathbf{r}'\right)\right|}{\rho_{\uparrow}\left(\mathbf{r}'\right)} + \frac{\left|\rho_{\downarrow}\left(\mathbf{r}'\right)\right|}{\rho_{\downarrow} \left(\mathbf{r}'\right)} \right)\end{split}\]
ここで、 \(\rho_{\sigma} \left(\mathbf{r}\right)\) 及び \(t_{\sigma} \left(\mathbf{r}\right)\) は、それぞれ座標における電子密度、及び運動エネルギー密度で、
(5.57)\[\begin{split}\rho_{\sigma} \left(\mathbf{r}\right) = \sum_{nk}^{\rm occ} \left|\psi_{nk\sigma} \left(\mathbf{r}\right)\right|^2, \\ t_{\sigma} = \frac{1}{2} \sum_{nk}^{\rm occ} \left| \nabla \psi_{nk\sigma} \right|^2\end{split}\]
により定義されます。また、 \(\alpha=-0.012\) , \(\beta=1.023\) は定数です。
なお、上記で登場したは、
(5.58)\[\begin{split}v_{x, \sigma}^{\rm BR} \left( \mathbf{r}\right) = - \frac{1}{b_{\sigma} \left(\mathbf{r}\right)} \left[ 1-e^{-x_{\sigma}\left(\mathbf{r}\right)} - \frac{1}{2} x_{\sigma} \left(\mathbf{r}\right) e^{-x_{\sigma}\left(\mathbf{r}\right)a} \right], \\ b_{\sigma} = \frac{x_{\sigma}\left(\mathbf{r}\right)}{2\pi^{1/3}} \left(\frac{e^{-x_{\sigma}\left(\mathbf{r}\right)}}{\rho_{\sigma}\left(\mathbf{r}\right)}\right)^{1/3}\end{split}\]
で定義されます。ここで、 \(x_{\sigma}\) は以下の非線形方程式の解です。
(5.59)\[\begin{split}\frac{x_{\sigma}e^{-2x_{\sigma}/3}}{x_{\sigma}-2} = \frac{2}{3} \pi^{2/3} \frac{\rho_{\sigma}^{5/3}}{Q_{\sigma}}, \\ Q_{\sigma} = \frac{1}{6} \left( \Delta \rho_{\sigma} - 2 D_{\sigma}\right), \\ D_{\sigma} = 2t_{\sigma} - \frac{1}{4} \frac{\left| \nabla \rho_{\sigma}\right|^2}{\rho_{\sigma}}\end{split}\]
なお、 (5.59) の解は数値的に解いても得られますが、計算速度の観点から Proynovら [Proynov08] の近似解を使用します。
5.3.9.2. 入力
SCF 計算
modified Becke Johnson 交換ポテンシャルを利用するには、
accuracy{
xctype = "tb09"
}
と記入します。 (5.56) のc値はSCF計算で決定しますが、ある値に固定したい場合には、以下のようにします。
accuracy{
xctype = "tb09"
metagga{
val_c_tb09 = 1.20d0
}
} |
電荷密度と運動エネルギー密度を同時に混合するには、sw_mix_charge_with_ekindens = onとします。 デフォルト値は off です。
Charge_mixing{
sw_mix_charge_with_ekindens = on
mixing_methods{
!#tag no method rmxs rmxe itr var prec istr nbmix update
1 pulay 0.40 0.40 40 \* on 3 20 RENEW
}
}
バンド計算
通常の計算と同様に、condition = fixed_charge を指定します。
control{
condition = fixed_charge
}
ここで、電荷密度及び運動エネルギー密度は、ファイルから読み込む必要があるので、両ファイル名を file_names.data に指定します。
&fnames
F_CHGT = '../scf/nfchgt.data'
F_EKINDENS = '../scf/ekindens_bin.data'
/
k点、xctype、収束条件の指定は SCF計算と同様です。
5.3.9.3. 出力
バンド固有値は、通常のDFT計算と同じく、F_ENERG (デフォルトファイル名:nfenergy.data ) に出力されます。なお、運動エネルギー密度は、電荷密度F_CHGTと同様に、バイナリ―形式で F_EKINDENS ( デフォルトファイル名:ekindens_bin.data )に出力されます。
5.3.9.4. 計算例
Meta-ggaを活用した計算例が samples/meta_gga
以下のサブディレクトリーに置かれています。ここでは,SiとGeの計算例を紹介します。
Siの計算結果
xctype |
a [Å] |
gap [eV] |
---|---|---|
PBEsol |
5.445 |
0.582 |
TB09 |
同上 |
1.149 |
cf. 実験値 |
5.431a |
1.17b |
ref. [Atdaev87] , b) ref. [Tran09]
図 5.65 mBJ交換相互作用による状態密度及びバンド分散 ( Si, diamond )
Geの計算結果
xctype |
a [Å] |
gap [eV] |
---|---|---|
PBEsol |
5.733 |
0.000 |
TB09 |
同上 |
0.496 |
TB09 (格子定数:実験値) |
5.6512 |
0.638 |
cf. 実験値 |
5.6512a |
0.74b |

図 5.66 mBJ交換相互作用によるバンド分散 ( Ge, diamond )
5.3.9.5. 参考文献
- Tran09(1,2,3)
Tran and P. Blaha, Phys. Rev. Lett. 102 (2009) 226401, and references therein.
- Koller12
Koller, F. Tran, and P. Blaha, Phys. Rev. B 85 (2012) 155109, and references therein.
- Proynov08
Proynov, Z. Gan, and J. Kong, Chem. Phys. Lett. 455 (2008) 103.
- Atdaev87
Atdaev, V. F. Grin, E. A. Salkov, and V. G. Chalaya, Inorg. Mater. 23 (1987) 1835.
- Oadri83
Oadri, E. F. Skelton, A. W. Webb, J. Appl. Phys. 64 (1983) 3609.
5.3.10. Open core法(バージョン2020.01以降)
5.3.10.1. 概要
通常,擬ポテンシャル法では閉殻系である内殻電子のスピン分極は考慮しません。Opencore法 [Miyake14] では,内殻電子が閉殻系の場合にこのスピン分極を取り入れた計算を行います。ただし,価電子ではないためその電荷密度やスピン分極は固定します。この効果は,PCCがある場合の交換相互作用や,PAWの交換相互作用項を通じて取り入れられます。f電子をもつ磁性材料の計算でしばしば用いられる手法です。
5.3.10.2. 計算理論
通常、PCCが無い場合スピン分極がある系の交換相関相互作用ポテンシャルは
(5.60)\[V_{\rm XC} \left(\rho_{\rm V}^{\uparrow} \rho_{\rm V}^{\downarrow}\right)\]
のように、アップ及びダウンスピンの価電子密度 (それぞれ \(\rho_{\rm V}^{\uparrow}\) 及び \(\rho_{\rm V}^{\downarrow}\) の関数として扱われます。また、PCCがある場合には、
(5.61)\[V_{\rm XC} \left( \rho_{\rm V}^{\uparrow} + \rho_{\rm PC}, \rho_{\rm V}^{\downarrow} + \rho_{\rm PC} \right)\]
のように、(スピンによらない)Parital Coreの密度 \(\rho_{\rm PC}\) を、価電子スピン密度に加えて処理されています。これに対し、opencore法は \(\rho_{\rm PC}\) がスピンに依存しても良い方法ですが、スピン依存擬ポテンシャルを作る必要があります。その詳細についてはCIAOのマニュアルをご覧ください。
5.3.10.3. 入力パラメーター
opencore 機能を使用するには、
accuracy{
sw_opencore = on
}
と記入します。計算自体は通常のPHASE/0の計算と同様に実行してください。
5.3.10.4. 例題

図 5.67 立方晶NdFe12の結晶構造
立方晶NdFe12 を例に
opencoreの検証を行いました。格子定数及び内部座標は文献値を使用しました。計算条件は以下のとおりです。対応する入出力ファイルは samples/opencore
以下のサブディレクトリーにあります。
格子定数[Å] |
|
---|---|
a |
8.533 |
c |
4.681 |
内部座標 |
|
Nd (2a) |
( 0.0000, 0.0000, 0.0000 ) |
Fe (8f) |
( 0.2500, 0.2500, 0.2500 ) |
Fe (8i) |
( 0.3594, 0.0000, 0.0000 ) |
Fe (8j) |
( 0.2676, 0.5000, 0.0000 ) |
波動関数カットオフ [Ry] |
25 |
---|---|
電荷密度カットオフ [Ry] |
225 |
k点サンプリング |
Monk (6×6×6) |
交換相関相互作用 |
paw = on |
擬ポテンシャル |
(オリジナル)Nd_ggapbe_paw_01.pp, (新) Nd_ggapbe_paw_015_4f_core.gncpp2, Fe_ggapbe_paw_02.pp |
オリジナルの擬ポテンシャルはNd4f電子を価電子として含みます。同擬ポテンシャルを結晶に適用する場合、4f電子間の強いクーロン斥力を考慮するために、DFT+U法を用いることが多いです。ここでは、Ueffの値として 0 と 6 eVの2ケースについて SCF計算を行いました。
一方、新しい擬ポテンシャルでは、4f電子をコアとして扱っています。opencoreあり・なしの2ケースについて SCF計算を行いました。
表 5.25 に各サイトの磁気モーメントを示します。オリジナルの擬ポテンシャルで Ueff = 6 eVとした結果と、新しい擬ポテンシャルの計算結果が近いことが分かります。特に、opencore法の場合には、Ueff=6 eVと極めて近い結果が得られています。
表 5.26 にSCFまでのiteration 数を示します。新しい擬ポテンシャルを用いた計算では、4f電子を含まない分、早く収束することが分かります。
擬ポ テンシャル 及び備考 |
オリジナル, U eff = 0 eV |
オリジナル, U eff = 6 eV |
新, opencoreなし |
新, opencoreあり |
---|---|---|---|---|
Nd (2a) |
-0.243 |
-3.502 |
※-3.391 |
※-3.499 |
Fe (8f) |
1.898 |
1.905 |
1.888 |
1.903 |
Fe (8i) |
2.603 |
2.599 |
2.595 |
2.602 |
Fe (8j) |
2.381 |
2.405 |
2.386 |
2.396 |
※4f電子のスピン -3を加えた値
擬ポ テンシャル 及び備考 |
オリジナル, U eff = 0 eV |
オリジナル, U eff = 6 eV |
新, opencoreなし |
新, opencoreあり |
---|---|---|---|---|
iteration 数 |
223 |
69 |
33 |
34 |
5.3.10.5. 参考文献
- Miyake14
Miyake, K. Terakura, Y. Harashima, H. Kino, and S. Ishibashi, J. Phys. Soc. Jpn. 83 (2014) 043702.
- Fukazawa17
Fukazawa, H. Akai, Y. Harashima, and T. Miyake, J. Appl. Phys. 12 (2017) 053901.
5.4. 化学反応の解析
5.4.1. NEB 法
5.4.1.1. 機能の概要
Nudged Elastic Band (NEB)法 [Mills94] およびClimbing Image (CI) NEB法 [Henkelman00] は,反応経路における始状態と終状態の間の最小エネルギー経路と鞍点を求める方法です。
NEB法およびCI-NEB法を用いた反応経路計算においては,始状態の原子配置(\({\overrightarrow{R}}_{0}\))および終状態の原子配置(\({\overrightarrow{R}}_{N}\))が既知であるとして,始状態と終状態の間の中間状態(\({\overrightarrow{R}}_{i},\ \ i = 2 \sim N - 1\))の原子配置やエネルギーなどを,隣接する状態(イメージ)間がばねによって結ばれているという拘束条件の下で構造最適化計算を行います。ここで\({\overrightarrow{R}}_{i}\)は,各イメージにおける3\(M\)次元(\(M\)は原子数)の座標です。NEB法およびCI-NEB法の中間状態における初期原子配置は始状態と終状態から任意に決定することが可能ですが,始状態と終状態をイメージで等分割し決める方法が多くの場合採用されます。
NEB法
通常のNEB法においては,各イメージの作用力は次のように与えられます。
ここで,\({\overrightarrow{F}}_{i}^{s}|_{\parallel}\)は隣接するイメージ間のバネによる作用力の接線方向の成分であり,以下のように求められます。
ここで\(k\)はバネ定数です。\(\widehat{\tau}\)は接線方向の単位ベクトルであり,次のように計算します。
(5.62) 式の\(\nabla E\left( {\overrightarrow{R}}_{i} \right)|_{\bot}\)は,第一原理計算などによって得られる,原子に働く力の接線に垂直な成分であり,以下のように求められます。
CI-NEB法
CI-NEB法は,通常のNEB法に対して最もエネルギーの高いイメージにおける作用力の計算方法を改良した方法です。CI-NEB法計算では,通常のNEB法を用いて反応経路計算をある程度進めた後に最も高いエネルギーのイメージ(\({\overrightarrow{R}}_{i,\max}\))を決定し,\({\overrightarrow{R}}_{i,\max}\)に働く作用力を次のように計算します。
バネ定数の計算方法
最少遷移エネルギーを求める反応経路計算においては,鞍点付近の計算精度を高くすることが好ましいと考えられます。このことから,鞍点付近でイメージの密度を高くし,接線の傾きを高い精度で求める必要があります。特に,反応経路全体と比較してポテンシャル障壁の領域が極めて狭い場合には,ポテンシャル障壁近傍のイメージ密度を高くすることにより高精度の計算を効率よく行うことが可能となります。 最少エネルギー経路において鞍点付近にイメージを密に分布させる方法として,鞍点付近のバネ定数\(k\)を大きくする方法が考えられています。NEB法およびCI-NEB法における作用力は,バネによる作用力とエネルギー計算によって得られた作用力の線形結合で表わさせれるので,イメージ間のバネ定数は異なる値を選択することが可能です。バネ定数の設定方法としては,以下のエネルギーの線形関数が提唱されています。
ここで,\(k_{\max}\)はバネ定数の最大値,\(\Delta k\)はバネ定数の最大値と最小値の差です。\(E_{i}\)は\(i\)番目のバネで結ばれた2つのイメージのうち高いエネルギーのイメージのエネルギー,\(E_{\max}\)は全イメージ中最も高いエネルギー,\(E_{\text{ref}}\)は始状態と終状態のうち,高い方のエネルギーです。この\(E_{\text{ref}}\)の値の設定によって,反応経路における始状態付近と終状態付近のイメージ密度が等しくなります。
5.4.1.2. 入力パラメータ
入力パラメータの指定
NEB法に関連する,入力データのタグおよびその説明を以下に示します。
第1ブロック |
第 2第3ブロック |
タグ識別子 |
説明 |
---|---|---|---|
Control |
|||
multiple_replica_mode |
NEB計算の実行 ON,OFF |
||
multiple_replica_max_iteration |
NEB iteration数 |
||
multiple_replica |
|||
method |
反応経路計算手法 nudged_elast ic_band_method |
||
accuracy |
|||
dt |
NEB計算における原子 座標更新の \(\Delta t\) |
||
neb_time_integral |
時間積分法 quench, ste epest_descent, cg, fireから 選択できる(cg, fireはバージョ ン2020.01以降) デフ ォルト値は,20 20.01以前はste epest_descent, 2020 .01以降はfire. |
||
penalty_function |
ペナルティ関数 ON,OFF |
||
neb_converg ence_condition |
NEB収束判定法(後述) |
||
neb_converg ence_threshold |
NEB収束判定値 |
||
constraint |
|||
ci_neb |
CI-NEB ON, OFF |
||
sp_k_init |
バネ定数(初期値) |
||
sp_k_min |
バネ定数(最小値) |
||
sp_k_max |
バネ定数(最大値) |
||
sp_k_variable |
バネ定数の固定,変動 OFF固定,ON変動 |
||
structure |
|||
number_of_replicas |
レプリカ数 |
||
replica |
レプリカ情報 |
||
endpoint_images |
両端のイメ ージの指定方法 directin, file |
||
atom_list_end0 |
両端のイメー ジの原子リスト |
||
atom_list_end1 |
両端のイメー ジの原子リスト |
||
structure |
|||
symmetry |
|||
method |
対称性の与え方 |
NEB法の入力パラメータの指定について説明します。
NEB法の計算は,以下の指定を行います。
NEB法の機能を有効にする
NEB用の収束判定の設定を行う
結晶の対称性を設定する
レプリカ列両端のレプリカの座標データを設定する
レプリカの中間レプリカの座標データを設定する
各々について,以下に説明をします。
NEB機能を有効にする。
PHASEにNEB法による計算を実行することを伝えるため,以下のようにcontrolブロックの下でmultiple_replica_mode変数をonとします。
control{
multiple_replica_mode = on
}
収束判定
収束判定条件は,multiple_replicaブロックの下のaccuracyブロックの変数neb_convergence_conditionで設定します。
multiple_replica{
accuracy{
neb_convergence_condition = energy_e
}
}
neb_convergence_conditionには,数値または文字列を指定することができます。次の表に,設定できる条件を示します。
収束判定条件設定のパラメータ
数値 |
文字列 |
説明 |
---|---|---|
1 |
energy_e |
dE \(<\)threshold |
2 |
phase_force |
PHASEの力の 最大値\(<\)threshold |
3 |
neb_force |
NEB計算で補正した力の 最大値\(<\)threshold |
4 |
force_at_transition_state |
最大エネ ルギーイメージのPHASEの力の 最大値\(<\)threshold |
5 |
phase_force_normal |
PHA SEの,経路に垂直な成分の力の 最大値\(<\)threshold |
結晶の対称性を指定する
バージョン2020.01未満:対称性に自動探索(structure{symmetry{method = automatic}})を設定すると,両端のレプリカのいずれかあるいは両方に、中間のレプリカよりも高い対称性が見つかった場合に,正常に計算が進まなくなります。マニュアル設定にして,必要ならば生成元を与えることによって(4.2.1.2参照)、全レプリカの対称性を揃えて下さい。
バージョン2020.01以上:対称性に自動探索(structure{symmetry{method = automatic}})を設定すると,始状態,終状態を含むすべてのレプリカいに共通する対称性のみが適用されるように動作します。
両端のレプリカの指定:入力で直接指定する方法
両端のレプリカの原子座標を入力において直接指定するには,以下のような記述を行います。
multiple_replica{
....
....
structure{
....
....
endpoint_images = directin
atom_list_end0{
coordinate_system = cartesian ! {internal
atoms{
#units angstrom
#tag element rx ry rz
Si 0.000000000000 0.000000000000 0.000000000000
Si 2.751721694800 2.751721694800 0.000000000000
....
....
}
}
atom_list_end1{
coordinate_system = cartesian ! {internal
atoms{
#units angstrom
#tag element rx ry rz
Si 0.000000000000 0.000000000000 0.000000000000
Si 2.751721694800 2.751721694800 0.000000000000
....
....
}
}
....
....
}
....
....
変数endpoint_imagesにdirectinという文字列を指定し, さらに atom_list_end0ブロックに始状態の,atom_list_end1に終状態のレプリカの座標値を通常のPHASEのatom_listブロックにおける指定と同じように指定します.
両端のレプリカの指定:両端のレプリカの原子座標をファイルから指定する方法
両端のイメージの原子座標をファイルで指定する場合は,入力データのendpoint_imagesの値をfileとし,file_names.dataにイメージのファイル名を設定します。 その際,file_names.dataファイル中ではF_IMAGE(-1)およびF_IMAGE(0)というファイルポインターを利用します。以下は、入力データとfile_names.dataの記述例です。
入力データの記述例
multiple_replica{
...
...
structure{
endpoint_images = file
}
...
...
}
file_names.dataファイルの記述例
&fnames
...
...
/
&nebfiles
F_IMAGE(0) = './endpoint0.data'
F_IMAGE(-1) = './endpoint1.data'
...
...
/
また,原子座標データファイル(上記の例ではendpoint0.dataやendpoint1.dataというファイル名)は,次のような形式で記述します。
coordinate_system=cartesian
#units angstrom
Si 0.000000000000 0.000000000000 0.000000000000
Si 2.751721694800 2.751721694800 0.000000000000
Si 1.375860847400 1.375860847400 1.375860847400
Si 4.127582542200 4.127582542200 1.375860847400
Si 0.000000000000 2.751721694800 2.751721694800
Si 2.751721694800 0.000000000000 2.751721694800
Si 1.375860847400 4.127582542200 4.127582542200
Si 4.127582542200 1.375860847400 4.127582542200
Si 0.000000000000 0.000000000000 5.503443389600
Si 2.751721694800 2.751721694800 5.503443389600
Si 1.375860847400 1.375860847400 6.879304237000
H 1.644706293661 1.095414892118 11.000000000000
H 1.095414929519 1.644706317263 11.000000000000
中間レプリカの指定:中間レプリカの原子座標を両端の原子座標の線形補間で指定する方法(proportional)
中間レプリカの原子座標を両端の原子座標の線形補間で指定する場合は、replicaタグ内のhowtogive_coordinatesをproportinalとします。入力データの記述例を以下に示します。
multiple_replica{
structure{
number_of_replicas = 6
replicas{
#tag replica_number howtogive_coordinates end0 end1
1 proportional 0 -1 ! 0: end0, -1:end1
2 proportional 0 -1
3 proportional 0 -1
4 proportional 0 -1
5 proportional 0 -1
6 proportional 0 -1
}
}
}
中間レプリカの指定:中間レプリカの原子座標をファイルから指定する方法(file)
中間イメージをファイルで指定する場合は,replicaタグ内のhowtogive_coordinatesをfileとし,対応する原子座標ファイルはfile_names.dataファイルで指定します。 入力データとfile_names.dataファイルの記述例を以下に示します。
入力データの記述例
multiple_replica{
...
...
structure{
number_of_replicas = 3
replicas{
#tag replica_number howtogive_coordinates end0 end1
1 file 0 -1 ! 0: end0, -1:end1
2 file 0 -1
3 file 0 -1
}
}
}
file_names.dataの記述例
&fnames
...
...
/
&nebfiles
F_IMAGE(0) = './endpoint0.data'
F_IMAGE(-1) = './endpoint1.data'
F_IMAGE(1) = './image1.data'
F_IMAGE(2) = './image2.data'
F_IMAGE(3) = './image3.data'
/
原子座標データを指定するファイルの書式は,両端イメージの場合と同じです。
入力パラメータの例を以下に示します。
Control{
condition = initial ! {initial|continuation|automatic}
cpumax = 1 day ! {sec|min|hour|day}
max_iteration = 10000000
multiple_replica_mode = ON
multiple_replica_max_iteration = 2000
}
accuracy{
cutoff_wf = 10.00 rydberg
cutoff_cd = 40.00 rydberg
num_bands = 28
ksampling{
method = monk ! {mesh|file|directin|gamma}
mesh{ nx = 2, ny = 2, nz = 1 }
}
smearing{
method = parabolic ! {parabolic|tetrahedral}
width = 0.001 hartree
}
xctype = ggapbe
scf_convergence{
delta_total_energy = 0.5e-7 hartree
succession = 2 !default value = 3
}
initial_wavefunctions = matrix_diagon !{random_numbers|matrix_diagion}
matrix_diagon{
cutoff_wf = 3.00 hartree
}
}
structure{
unit_cell_type = primitive
unit_cell{
a_vector = 10.400 0.000 0.000
b_vector = 0.000 10.400 0.000
c_vector = 0.000 0.000 30.200
}
symmetry{
method = manual
sw_inversion = off
}
atom_list{
coordinate_system = cartesian ! {cartesian|internal}
atoms{
#units angstrom
#tag element rx ry rz mobile
Si 0.000000000000 0.000000000000 0.000000000000 0
Si 2.751721694800 2.751721694800 0.000000000000 0
Si 1.375860847400 1.375860847400 1.375860847400 0
Si 4.127582542200 4.127582542200 1.375860847400 0
Si 0.000000000000 2.751721694800 2.751721694800 0
Si 2.751721694800 0.000000000000 2.751721694800 0
Si 1.375860847400 4.127582542200 4.127582542200 0
Si 4.127582542200 1.375860847400 4.127582542200 0
Si 0.000000000000 0.000000000000 5.503443389600 0
Si 2.751721694800 2.751721694800 5.503443389600 0
Si 1.375860847400 1.375860847400 6.879304237000 0
H 1.644706293661 1.095414892118 11.000000000000 1
H 1.095414929519 1.644706317263 11.000000000000 1
}
}
element_list{
#tag element atomicnumber mass zeta dev
#units atomic_mass
Si 14 28.085
H 1 1.008
}
}
multiple_replica{
method = nudged_elastic_band_method
accuracy{
dt = 40 au_time
neb_time_integral = quench
penalty_function = off
neb_convergence_condition = 3
neb_convergence_threshold = 5.0e-04
}
constraint{
ci_neb = OFF
sp_k_init = 0.03
sp_k_min = 0.03
sp_k_max = 0.03
sp_k_variable = OFF
}
structure{
number_of_replicas = 6
replicas{
#tag replica_number howtogive_coordinates end0 end1
1 proportional 0 -1 ! 0: end0, -1:end1
2 proportional 0 -1
3 proportional 0 -1
4 proportional 0 -1
5 proportional 0 -1
6 proportional 0 -1
}
endpoint_images = directin ! {no or nothing | file | directin}
howtogive_coordinates = from_endpoint_images
atom_list_end0{
coordinate_system = cartesian ! {internal|cartesian}
atoms{
#units angstrom
#tag element rx ry rz
Si 0.000000000000 0.000000000000 0.000000000000
Si 2.751721694800 2.751721694800 0.000000000000
Si 1.375860847400 1.375860847400 1.375860847400
Si 4.127582542200 4.127582542200 1.375860847400
Si 0.000000000000 2.751721694800 2.751721694800
Si 2.751721694800 0.000000000000 2.751721694800
Si 1.375860847400 4.127582542200 4.127582542200
Si 4.127582542200 1.375860847400 4.127582542200
Si 0.000000000000 0.000000000000 5.503443389600
Si 2.751721694800 2.751721694800 5.503443389600
Si 1.375860847400 1.375860847400 6.879304237000
H 1.644706293661 1.095414892118 11.000000000000
H 1.095414929519 1.644706317263 11.000000000000
}
}
atom_list_end1{
coordinate_system = cartesian ! {internal|cartesian}
atoms{
#units angstrom
#tag element rx ry rz
Si 0.000000000000 0.000000000000 0.000000000000
Si 2.751721694800 2.751721694800 0.000000000000
Si 1.375860847400 1.375860847400 1.375860847400
Si 4.127582542200 4.127582542200 1.375860847400
Si 0.000000000000 2.751721694800 2.751721694800
Si 2.751721694800 0.000000000000 2.751721694800
Si 1.375860847400 4.127582542200 4.127582542200
Si 4.127582542200 1.375860847400 4.127582542200
Si 0.000000000000 0.000000000000 5.503443389600
Si 2.751721694800 2.751721694800 5.503443389600
Si 1.375860847400 1.375860847400 6.879304237000
H 2.22686927 0.48813212 7.65400988
H 0.48813224 2.22686933 7.65400957
}
}
}
}
wavefunction_solver{
solvers{
#tag sol till_n dts dte itr var prec cmix submat
lmMSD -1 0.2 0.2 1 linear on 1 on
}
}
charge_mixing{
mixing_methods{
#tag no method rmxs rmxe itr var prec istr nbmix update
1 broyden2 0.10 0.10 1 linear on 1 0 RENEW
}
}
printoutlevel{
base=1
}
NEB関連ファイルの指定
NEB関連のファイルは,file_names.dataで設定します。次のように記述します。
&fnames
F_INP='./nfinp.data'
F_POT(1)='./Si_ggapbe_nc_01.pp'
...
...
/
&nebfiles
F_IMAGE(0) = './endpoint0.data'
F_IMAGE(-1) = './endpoint1.data'
F_NEB_OUT = './output_neb'
F_NEB_ENF = './nfnebenf.data'
F_NEB_DYNM = './nfnebdynm.data'
/
ファイル読み込みのnamelistとして,&nebfilesを利用している点にご注意ください。
&nebfilesで利用できるファイルポインターを,次の表に示します。
ファイル名変数 |
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 |
原子 座標出力ファイル |
5.4.1.3. 入力パラメーター指定(バージョン2020.01以上)
NEB法は,2020.01以上のバージョンにおいて入力形式の簡略化と機能拡張がほどこされています(バージョン2020.01未満の指定方法も依然として利用できます)。具体的には以下の通り。
最適化手法の拡充:従来から利用できた最急降下法とquench法に加え,fire法とcg法が使えるようになりました。新しいデフォルトの最適化手法はfire法です。
CI-NEB切り替え:CI-NEB法はNEB法の初期の段階で適用すると破綻してしまう場合があるので,通常のNEB法をしばらく実施してからCI-NEBに遷移する,という使い方が一般的です。このような使い方は,これまではいったん計算を終了し,継続計算のタイミングで行うというやり方でしか実現できませんでした。バージョン2020.01以降,ある閾値を満たした場合に遷移するという方法も利用できるようになりました。NEB法ではエネルギーやNEB力など複数の収束判定条件を利用できるようになっていますが,CI-NEBの切り替えの判定条件はNEB自体の判定条件と同じです。閾値はユーザーが指定することができますが,デフォルト値は通常のNEBの収束判定条件から動的に決まります。
対称性:始状態,終状態には存在しても中間レプリカには存在しない対称性がある場合があり,2020.01未満のバージョンでは中間レプリカが対称性チェックを満たせず,異常終了してしまいます。そこで,2020.01以降は始状態・終状態ふくめすべてのレプリカに共通する対称性のみ考慮するという動作に改良されました。中間レプリカが対称性を持つことはあまりないですが,表面モデルにおける反転対称性などは持つ場合があります。
nfdynm.dataファイルからの座標値の読み込み:始状態・終状態をnfdynm.dataファイルから読み込めるようになりました。また,nfdynm.dataファイルの座標履歴を反応座標に見立てて読み込むことも可能です。
必須設定の削減:2020.01未満のバージョンにおいては,原子配置を三カ所で定義する必要がありました。2020.01以上のバージョンにおいては,始状態・終状態の原子座標のデフォルト値を通常の座標指定のそれになっています。そのため,通常の原子配置指定は始状態があらわに指定されているならば終状態に,終状態があらわに指定されているならば始状態に対応するようになっています。また,以前のバージョンでは初期中間レプリカの作成方法の指定は必須設定でしたが,2020.01以降は“始状態と終状態の間の線形補間”によって中間レプリカを作成する場合をデフォルト値とし,この場合の指定は非必須となりました。
NEB法の精度などの設定
NEBの精度などの設定をmultiple_replicaブロックのaccuracyブロックにおいて行うことができます。
multiple_replica{
accuracy{
neb_time_integral = fire
neb_convergence_condition = 3
neb_convergence_threshold = 1.0e-3
}
}
neb_time_integralによってNEB法が利用する最適化手法を選択します。steepest_descent, quench, cg, fireから選択できます。デフォルト値はfireです。fireがうまく行かない場合,cgやquench法が推奨されます。neb_convergence_conditionでNEBの収束判定条件を設定します。1がエネルギー差,2が系の原子間力,3がNEB力,4が遷移状態の原子間力,5が系の経路に垂直な原子間力です。デフォルト値は1です。
neb_convergence_thresholdで閾値を設定します。これは単位を指定することはできないので,原子単位で指定します。そのデフォルト値はneb_convergence_conditionが1の場合は10-6 hartree, それ以外の場合は10-3 hartree/bohrです。
FIRE法を利用する場合,パラメーターの詳細を設定することも可能となっています。その設定は,multiple_replicaブロックではなくstructure_evolutionブロックの下のfireブロックにおいて行います。その詳細は別項(4.4.1.2節)を参照してください。
始状態・終状態としてnfdynm.dataファイルを利用する方法
まず,multiple_replicaブロックのstructureブロックにおいて以下のような設定を施します。
multiple_replica{
structure{
number_of_replicas = 6
endpoint_images = file
frame_end0 = 0
frame_end1 = 1
}
}
number_of_repliasによって中間レプリカの数を指定します。始状態と終状態は,endpoint_images = fileとするとnfdynm.dataファイルから読み込むことができます。frame_end0, frame_end1でnfdynm.data中のフレーム番号を指定します。フレーム番号は1始まりであり,0以下の数値を指定すると最後のフレームを採用するようになります。frame_end0, frame_end1のデフォルト値は-1です。
つぎに,file_names.dataファイルにおいて以下のように目的のnfdynm.dataファイルを指定します。
&fnames
...
/
&nebfiles
F_IMAGE(0) = ‘end0/nfdynm.data’
F_IMAGE(-1) = ‘end1/nfdynm.data’
/
nebfilesセクションにおいてファイル名を指定します。識別子F_IMAGE(0)によって始状態の,F_IMAGE(-1)によって終状態のnfdynm.dataファイルを指定します。
CI-NEBの切り替え
CI-NEB法は以下の要領で設定します。
multiple_replica{
constraint{
ci_neb = on
ci_thres = 1e-2
ci_index = 0
}
}
multiple_replicaブロックの下のconstraintブロックにおいてCI-NEBの設定を行います。ci_neb=onとするとCI-NEBが有効になります。ci_thresで指定した値よりも収束判定条件として採用している量が小さい場合に通常のNEBからCI-NEBに切り替わります。この値のデフォルト値は,通常の収束判定条件の2倍です。CI-NEBに切り替わっていない場合通常の収束判定は無視されるので,CI-NEBに切り替わる前に誤って収束したとみなされることはありません。ci_indexに2から中間レプリカ数までの値を指定すると,エネルギーが最も高いレプリカではなくci_indexに対応するレプリカがCI-NEBのターゲットとなります。
nfdynm.dataファイルを反応経路に見立てて初期レプリカ列にする方法
nfdynm.dataファイルを反応経路に見立てて初期レプリカ列として採用することができます。この機能には,nfnebdynm.dataというファイルにNEB計算中のnfdynm.dataファイルの履歴が記録されるので,任意の反応経路を抽出し,NEBの初期経路にする,といった使い方が考えられます。途中から破綻してしまった計算をうまく行っていた段階まで戻って最初から計算したい場合や,何らかの事情でリスタート計算に必要なデータが出力されなかった場合に最後の反応経路を初期レプリカ列に採用したい場合などに利用できます。
この機能を利用するためには,まずは以下の設定を入力パラメーターファイルで行います。
multiple_replica{
structure{
sw_path_from_dynm = on
}
}
さらに,file_names.dataにおいて以下の指定を行います。
&fnames
...
/
&nebfiles
F_PATH = ‘foo/nfdynm.data’
/
nebfilesセクションのF_PATH識別子で対象のnfdynm.dataファイルを指定します。なお,number_of_replicas+2 (+2は始状態・終状態の分)とnfdynm.dataファイルのフレーム数が一致している必要がある点には注意が必要です。
始状態と終状態のエネルギーを指定する方法
始状態と終状態のエネルギー計算は,デフォルトの振る舞いとしてはNEBステップ1回目に限り実行されます。しかし多くの場合このエネルギーは既知なので,入力において指定することによってこのエネルギー計算を回避することができるようになっています。以下のように記述します。
multiple_replica{
structure{
end0_energy = -120.1 hartree
end1_energy = -120.3 hartree
}
}
end0_energyに始状態の,end1_energyに終状態のエネルギーを指定します。
5.4.1.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という関係が成立している必要があります。
5.4.1.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ファイルと比較すると簡略化された形式で出力されます。具体的には以下のような形式で出力されます。
#step image atom cps
0 1 1 0.0000000000 0.0000000000 0.0000000000
0 1 2 5.2000000098 5.2000000098 0.0000000000
0 1 3 2.6000000049 2.6000000049 2.6000000049
0 1 4 7.8000000147 7.8000000147 2.6000000049
0 1 5 0.0000000000 5.2000000098 5.2000000098
0 1 6 5.2000000098 0.0000000000 5.2000000098
0 1 7 2.6000000049 7.8000000147 7.8000000147
0 1 8 7.8000000147 2.6000000049 7.8000000147
0 1 9 0.0000000000 0.0000000000 10.4000000197
0 1 10 5.2000000098 5.2000000098 10.4000000197
0 1 11 2.6000000049 2.6000000049 13.0000000246
0 1 12 3.1080442326 2.0700339938 20.7869859136
0 1 13 2.0700340645 3.1080442772 20.7869859136
0 2 1 0.0000000000 0.0000000000 0.0000000000
0 2 2 5.2000000098 5.2000000098 0.0000000000
0 2 3 2.6000000049 2.6000000049 2.6000000049
0 2 4 7.8000000147 7.8000000147 2.6000000049
0 2 5 0.0000000000 5.2000000098 5.2000000098
0 2 6 5.2000000098 0.0000000000 5.2000000098
0 2 7 2.6000000049 7.8000000147 7.8000000147
0 2 8 7.8000000147 2.6000000049 7.8000000147
0 2 9 0.0000000000 0.0000000000 10.4000000197
0 2 10 5.2000000098 5.2000000098 10.4000000197
0 2 11 2.6000000049 2.6000000049 13.0000000246
0 2 12 3.2652054480 1.9060914168 19.8836995566
0 2 13 1.9060915098 3.2652055024 19.8836994729
各行が,あるNEBステップ・あるレプリカ・ある原子の座標データに対応します。1列目がNEBステップ,2列目がレプリカのID, 3列目がレプリカ内における原子のID, 4, 5, 6列目が原子座標です。座標は,ボーア単位,カルテシアン座標で出力されます。
nfefn.dataファイルとnfdynm.dataファイルは通常のPHASEの計算においてはそれぞれエネルギーおよび座標値の履歴が記録されるファイルですが, NEB計算の場合は最新のレプリカ列のエネルギーおよび座標データが記録されたファイルです。nfefn.dataファイルにはnfnebenfに記録されたデータの最後の NEBステップのデータが記録されます。nfdynm.dataファイルは,PHASEの通常の形式で記録されますが,通常の計算では構造最適化や分子動力学シミュレーションの 履歴となるところがレプリカ列になります。
5.4.1.6. 計算例:シリコン表面に水素分子が解離吸着する反応
シリコン表面に水素分子が解離吸着する反応の例題の入力ファイルは, samples/dynamics/neb/Si_H2
以下にあります。
ここで紹介する例題は,シリコン表面に水素分子が解離吸着する反応をシミュレートします。始状態は表面と表面から十分離れた場所にある水素分子から成る系,始状態は表面のシリコン原子に水素分子が解離し,吸着した系です。始状態と終状態の構造をそれぞれ 図 5.68 と 図 5.69 に示します。 ただし,あくまで例題ですので,通常は実行する始状態,終状態の構造最適化は実行していません。

図 5.68 本例題の始状態

図 5.69 本例題の終状態
入力ファイル
controlブロックにおいて,全体的な計算条件の指定を行います。
Control{
condition = initial ! {initial|continuation|automatic}
cpumax = 1 day ! {sec|min|hour|day}
max_iteration = 10000000
multiple_replica_mode = ON
multiple_replica_max_iteration = 2000
}
multiple_replica_modeにONを指定することにより,NEBの計算が実行されます。また,NEBの繰り返し計算の上限回数をmultiple_replica_max_iteration 変数によって2000としています。
multiple_replicaブロックの下のstructureブロックにおいてレプリカの指定を実行しています。 以下のようになります。
multiple_replica{
....
structure{
number_of_replicas = 6
replicas{
#tag replica_number howtogive_coordinates end0 end1
1 proportional 0 -1 ! 0: end0, -1:end1
2 proportional 0 -1
3 proportional 0 -1
4 proportional 0 -1
5 proportional 0 -1
6 proportional 0 -1
}
endpoint_images = directin ! {no or nothing | file | directin}
howtogive_coordinates = from_endpoint_images
atom_list_end0{
coordinate_system = cartesian ! {internal|cartesian}
atoms{
#units angstrom
#tag element rx ry rz
Si 0.000000000000 0.000000000000 0.000000000000
...
...
}
}
atom_list_end1{
coordinate_system = cartesian ! {internal|cartesian}
atoms{
#units angstrom
#tag element rx ry rz
Si 0.000000000000 0.000000000000 0.000000000000
...
...
}
}
}
....
}
number_of_replicasに6と指定していますが,この指定によってレプリカ数を合計6としています。 replicasブロックにおいて実際にどのようにレプリカの座標を作るかを指定しています。この例では, すべて始状態・終状態の線形補完によって作る,という設定になります。 atom_list_end0およびatom_list_end1ブロックには始状態・終状態の座標値を指定しています。 この指定は,前記の通り通常のPHASEの座標指定と変わるところはありません。
multiple_replica{
...
accuracy{
dt = 40 au_time
neb_time_integral = quench
penalty_function = off
neb_convergence_condition = 3
neb_convergence_threshold = 5.0e-04
}
}
計算結果
本例題を実行すると得られる結果を紹介します。
図 5.70 に,本例題を実行すると得られる,NEBの繰り返し計算とNEB力の最大値の関係を示します。はじめのうちは大きな 力が働いていますが,計算が進行するにつれて小さくなっていき,41回の繰り返し計算の後収束判定を満たして計算が終了しています。
図 5.71 に,本例題を実行すると得られる各イメージとエネルギーの関係を示します。 この図より,遷移状態は4番目のレプリカであり,始状態から見ると障壁エネルギーが約1.08 eVであることが分かります。
図 5.70 NEB力の履歴
図 5.71 最終的に得られる反応経路と各レプリカのエネルギーの関係
図 5.72 に,遷移状態における原子配置を示します。この図から明らかなように,本例題では「水素分子が解離,そして吸着する」直前の構造が遷移状態です。

図 5.72 遷移状態における原子配置
5.4.1.7. バージョン2020.01以上の機能を活用した計算例
バージョン2020.01以降新たに機能が加わっています。本節では白金(111)面における酸素原子の拡散を例に,これらの機能を活用して作成した入力と計算例を紹介します。
問題
Pt(111)面のfcc hollowサイトからhcp hollowサイトへ拡散する過程をNEB法で解析します。
サンプルデータは samples/dynamics/neb/Pt111
以下のサブディレクトリーにあります。面心立方格子の(111)面のhollowサイトには,二層下に原子が存在するサイト(通称fccサイト)と存在しないサイト(通称hcpサイト)が存在し,いずれも安定に原子が吸着できるサイトです。本例題では,酸素原子がPt(111)面のfcc
hollowサイトからhcp
hollowサイトへ拡散する過程をNEB法で解析します。fccが始状態(fccサイトに酸素原子が吸着した状態)の最適化計算を行ったディレクトリー,hcpが終状態(hcpサイトに酸素原子が吸着した状態)の最適化計算を行ったディレクトリー,fcc_hcpがfccサイトからhcpサイトへ酸素原子が拡散するNEB計算の入力ファイルが置かれたディレクトリーです。
始状態および終状態は 図 5.73 に示す通りです。NEB最適化手法は,比較のためFIRE法,CG法,quench法を採用しました。いずれの方法を使っても結果はほぼ同じものが得られることは確認できています。収束判定条件は,最大NEB力1×10-3 hartree/bohrとしました。また,CI-NEB法を有効にし,切り替えの閾値はデフォルト値を採用しました。
図 5.73 本例題の始状態(左図)と終状態(右)
入力ファイル
controlブロックにおいて,全体的な計算条件の指定を行います。
Control{
condition = initial ! {initial|continuation|automatic}
cpumax = 1 day ! {sec|min|hour|day}
max_iteration = 10000000
multiple_replica_mode = ON
}
multiple_replica_modeにONを指定することにより,NEBの計算が実行されます。また,NEBの繰り返し計算の上限回数をmultiple_replica_max_iteration 変数によって2000としています。
multiple_replicaブロックの下のaccuracyブロックにおいてNEBの最適化の方法や収束判定条件を指定します。
multiple_replica{
...
accuracy{
neb_time_integral = fire
neb_convergence_condition = 3
neb_convergence_threshold = 1.0e-03
}
}
multiple_replicaブロックの下のstructureブロックにおいてレプリカの指定を実行しています。 以下のようになります。
multiple_replica{
....
structure{
number_of_replicas = 5
endpoint_images = file
end0_energy = -1308.2190366480
end1_energy = -1308.2355763153
}
}
number_of_replicasに5と指定していますが,この指定によって中間レプリカ数を合計5としています。 endpoint_images = fileとし,nfdynm.dataファイルから始状態と終状態を読み込むことを指定しています。frameに関する情報は設定していないため,デフォルトの振る舞い(最後のフレーム)が採用されます。end0_energyとend1_energyにそれぞれ始状態と終状態のエネルギーが指定されています。この指定により,NEB iterationの1回目に限り実施される始状態と終状態のエネルギー計算を省略することができます。
multiple_replicaブロックの下のconstraintブロックにおいて,CI-NEBを有効にすることができます。
multiple_replica{
constraint{
ci_neb = on
}
}
ci_nebがonと設定されていても,まずは通常のNEBが実行されます。収束判定条件が閾値以下になったあかつきにCI-NEBが有効になります。閾値のデフォルト値は,収束判定条件の値の2倍です。
最後に,file_names.dataファイルにおいて始状態と終状態のnfdynm.dataファイルの位置を指定します。
...
&nebfiles
F_IMAGE(0) = '../fcc/nfdynm.data'
F_IMAGE(-1) = '../hcp/nfdynm.data'
/
&nebfilesセクションにおいてNEB法で利用する始状態と終状態の読み込み先のnfdynm.dataファイルを指定します。ファイルポインターF_IMAGE(0)で始状態の,F_IMAGE(-1)で終状態の座標データファイルを指定します。この例では,1階層上のfccというディレクトリーの下のnfdynm.dataファイルを始状態,1階層上のhcpというディレクトリーの下のnfdynm.dataファイルを終状態として利用することになります。
計算結果
NEB力の履歴および得られた反応経路のエネルギ-を 図 5.74 に示しました。CG法,FIRE法はそれぞれ20回および32回のNEBステップで収束解を得ることができましたが,quench法は100回以上NEBを行っても収束判定条件を満たすことはできませんでした。
図 5.74 NEB力の履歴(左)と反応座標とエネルギーの関係(右)
5.4.1.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とすることによってリスタート計算を行います。
Control{
condition = continuation
...
...
}
リスタート時に利用するファイルは下記のファイルです。
・NEB計算: neb_continue.data
・電子状態計算: 各レプリカのPHASE用リスタートファイル;
neb_continue.data, continue.data_r*, continue_bin.data_r*, zaj.data_r*, nfchgt.data_r*
5.4.1.9. 参考文献
- Mills94
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
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.
5.4.2. Dimer 法
5.4.2.1. 機能の概要
Dimer法 [Henkelman99] とは,2つのレプリカが作るdimerを回転・並進させながらポテンシャルエネルギー表面の鞍点を探索する計算手法です。
Dimer法では,ある中心の座標 \(R\) から距離 \(\Delta R\) はなれた二つのレプリカの座標でdimerを構成します。Dimerの方向の単位ベクトルを \(N\) とすると,二つのレプリカの座標 \(R_1, R_2\) は以下のように記述することができます。
レプリカ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の向きの曲率は次のように近似することができます。
(5.69) 式より \(E_0\) は次のように計算することができます。
Dimerの回転は,「回転力」 \(F^\perp = F_1^\perp - F_2^\perp\) にそって行われます。\(F^\perp\) に水平な単位ベクトルを \(\Theta\) とすると,レプリカ1, 2に対する回転操作は次のように記述することができます。
最適な回転角 \(\theta\) はまず微小な角度 \(d \theta\) によるトライアル回転によって得られた原子間力から決めます。\(d \theta\) 回転した結果得られた レプリカ1, 2の原子間力 \(F_1^\ast, F_2^\ast\) また \(F^\ast = F_1^\ast - F_2^\ast\) を定義し,さらに \(F=F^\perp \cdot \Theta\) と \(F\) の数値微分 \(F^\prime \neq \frac{F^\ast \cdot \Theta^\ast - F \cdot \Theta}{d\theta}\) を用いると最適な回転角 \(\Delta \theta\) は以下のように求められます。
このように決まった \(\Delta \theta\) と (5.71) 式を用いてdimerに回転を施します。
Dimerを回転したあと鞍点に向かってdimerを並進します。並進は,以下のような原子間力を用いて行います。
並進はquenched MDによって行います。トライアル回転後と他移転後各レプリカについてエネルギー,原子間力の計算を行うので,1回のdimer iterationにつき4回のSCF計算を実施します。
5.4.2.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
multiple_replica_max_iteration = 2000
}
NEBと同じように,controlブロックにおいてmultiple_replica_mode = onとします。さらに,multiple_replica_method = dimerを指定するとdimer法が用いられるようになります。multiple_replica_max_iterationの意味はNEBの場合と同様です。
Dimer法の詳細設定もNEBと同じようにmultiple_replicaブロックにおいて行います。以下のような設定を施すことができます。
multiple_replica{
accuracy{
dt = 20 au_time
dimer_convergence_threshold = 5.0e-04
}
dimer{
delta_r = 0.01 angstrom
delta_theta = 0.001
}
structure{
endpoint_images = directin ! {no or nothing | file | directin}
howtogive_coordinates = from_endpoint_images
atom_list_end0{
coordinate_system = cartesian ! {internal|cartesian}
atoms{
#tag element rx ry rz
Si 0.000000000 0.000000000 0.000000000
Si 5.200000010 5.200000010 0.000000000
...
}
}
atom_list_end1{
coordinate_system = cartesian ! {internal|cartesian}
atoms{
#tag element rx ry rz
Si 0.000000000 0.000000000 0.000000000
Si 5.200000010 5.200000010 0.000000000
...
...
}
}
}
}
multiple_replicaのaccuracyブロックにおいてdimer法の精度に関わる設定を行うことができます。dtでquench法の時間刻みを指定することができます。dimer_convergence_thresholdによって収束判定条件を設定することができます。 dimerブロックのdelta_r, delta_thetaによってそれぞれ \(\Delta R, d\theta\) の値を設定することができます。\(\Delta R\) のデフォルト値は0.01 Å \(d\theta\) のデフォルト値は0.001 radianです。初期dimerはNEBの始点・終点と同じ方法 で指定した2つのレプリカをもとに作成されます。すなわち,NEBの始点に相当する座標を \(R_1\) 終点に相当する座標を \(R_2\) とすると,\(\frac{\left(R_1+R_2\right)}{2}\) がダイマー中心,\(\frac{\left(R_1-R_2\right)}{\left|R_1-R_2\right|}\) がベクトル \(N\) に相当します。
5.4.2.3. 出力ファイル
結果は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ごとに出力されます。
5.4.2.4. 計算例1: Si上の水素分子解離
NEB法の例題にも付属するSi上での水素分子解離の過程をdimer法によって解析します。入力データは samples/dynamics/dimer/h-Si
以下にあります。
用いた初期ダイマーはNEBで得られたレプリカ列のうち遷移状態の前後2つのレプリカを抽出して作成しました。その他Dimer法に関わる計算条件は以下の通り。
設定値 |
値 |
\(\Delta R\) |
0.01 |
\(d \theta\) |
0.001 radian |
収束判定条件 |
5e-4 |
Dimer法のエネルギーおよび最大並進力を 図 5.75 に示します。もともと遷移状態に近いところから計算を始めているため,比較的スムーズな収束が得られています。
図 5.75 Dimer法の履歴
表 5.29 に得られた遷移状態をCI-NEB法の結果を比較しました。表中のzとは水素分子のz座標のことです。 Dimer法とCI-NEB法の結果はほぼ一致しました。zの値が異なりますが,これはこの問題がzに対して鈍感であるからと考えられます。
CI-NEB |
dimer |
|
energy (Ha) |
-43.9380 |
-43.9381 |
z (Bohr) |
16.711 |
16.748 |
5.4.2.5. 計算例2: Ptにおける酸素原子の拡散
NEB法の例題にも付属するPt(111)面における酸素原子拡散の問題をdimer法で計算してみます。入力データは samples/dynamics/dymer/Pt111
以下にあります。
初期ダイマーはNEBの始状態・終状態をもとに作成しました。その他のdimer法の条件はSi上の水素分子の場合と全く同様です。
図 5.76 Dimer法の履歴
表 5.30 に得られた遷移状態をCI-NEB法の結果を比較しました。表中のx, y, zは酸素原子のx, y, z座標です。完全に一致するわけではありませんが,CI-NEB法との差は0.01 bohr程度で両者はよく一致しています。
CI-NEB |
dimer |
|
energy (Ha) |
-1308.214122 |
-1308.214122 |
x (Bohr) |
20.19726 |
20.21692 |
y (Bohr) |
11.66089 |
11.67224 |
y (Bohr) |
12.64020 |
12.63675 |
5.4.2.6. 参考文献
- 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).
5.4.3. 拘束条件付きダイナミクスとBlue Moon 法による自由エネルギー解析
5.4.3.1. 機能の概要
化学反応経路を探索する手法として,ボンド長やボンド角などの化学反応を特徴づける 「反応座標」を導入し,想定した反応経路上でその値を逐次変化させながら 反応座標を拘束した構造最適化や分子動力学シミュレーションを実施する,という手法が あります。単純な構造最適化の場合絶対零度における反応経路が得られ,有限温度の 分子動力学シミュレーションを実施すると自由エネルギー差が得られます。ここでは, PHASEを利用して拘束条件付きダイナミクスを追跡する方法を説明します。
5.4.3.2. 入力パラメータ
本機能と関連あるタグの一覧を表に示します。
第1 ブロック識別子 |
第2,第3ブロ ック識別子 |
タグ識別子 |
説明 |
---|---|---|---|
control |
|||
driver |
ダイナ ミクスの種類を 選択する変数。 拘束条件付き ダイナミクスの 場合constrain tsを指定する。 |
||
structure |
原子座 標データの指定 を行うブロック |
||
constrainablexx |
拘束条件を定義 するブロック。 xxには拘束 条件を識別する ための整数を1 はじまりで指定 |
||
type |
拘束条件の “種類”の指定. bond_length, bond_angle, dihedral_angle bond_length_diff, bond_angle_diff, dist ance_from_pos, plane, center_of_mass, coordination_number |
||
atomx |
拘束条件が関わ る原子を指定す る。xは整数で ,たとえばtype = bond_len gthの場合2原子 が拘束に関わる のでatom1とato m2で指定する。 |
||
mobile |
拘束条件 が“可動化否か” を指定する。on とすると可動, offとす ると不動。デフ ォルト値はoff |
||
monitor |
指定の拘束 条件を“監視”す るかどうかを指 定する真偽値。 デフ ォルト値はoff |
||
reaction_coordinate |
指 定の拘束条件が “反応座標”とし たい場合に作成 するブロック。 |
||
sw_reaction_coordinate |
on の場合反応座標 とみなされる。 |
||
init_value |
反応経路の 初期値を対応す る単位で指定。 |
||
final_value |
反応経路の 最終値を対応す る単位で指定。 |
||
increment |
final_valu e,init_valueの 刻み幅を指定。 |
||
plane |
面内拘束 における面の法 線ベクトルを指 定するブロック |
||
normx,normy,normz |
法線ベクト ルのx,y,z成分 |
||
distance_from_pos |
場所の指定 を行うブロック |
||
posx,posy,posz |
指定したい場 所のx,y,z成分 |
||
coordination_number |
配位数指定 を行うブロック |
||
kappa_inv |
配位数定義式の \(\kappa\) の逆数を長 さの単位で指定 |
||
kappa |
配位数定義式の \(\kappa\) 1/bohr単位で 指定 |
||
rcut |
配位数定義式 の \(r_c\) の値を長 さの単位で指定 |
||
center_of_mass |
重心を変化 させる方向を指 定するブロック |
||
directionx |
指定した い方向のx成分 |
||
directiony |
指定した い方向のy成分 |
||
directionz |
指定した い方向のz成分 |
||
structure_evolution |
原子ダイ ナミクスの設定 を行うブロック |
||
method |
原子ダ イナミクスの方 法を指定する。 拘 束条件付きダイ ナミクスの場合 quench,damp, velocity_verlet temperature_control のみ利用可能。 |
拘束条件付きダイナミクスを実行するには,まず以下の要領でconditionブロックの下でdriver変数を指定します。
condition{
...
driver=constraints
...
}
次に,以下のようにstructureブロックの下にconstrainablexxブロックを作成します。ここでxxは整数です。
structure{
...
...
constrainable1{
type=bond_length
atom1=1
atom2=2
mobile = off
monitor = off
reaction_coordinate{
sw_reaction_coordinate=on
init_value = 2.4 angstrom
increment = 0.1 angstrom
final_value = 8.0 angstrom
}
plane{
normx=1
normy=0
normz=0
}
coordination_number{
kappa = 5.0
rc = 2.0 angstrom
}
}
...
...
}
拘束条件はいくつでも指定可能ですが,たとえばconstrainable1, constrainable2, constrainable4という3つのconstrainablexxブロックが存在する場合,constrainable4ブロックは入力解釈の対象にはなりません。また,互いに相いれない拘束条件を定義してしまうと,拘束条件を課すための収束計算が破たんしてしまう場合がありますので注意が必要です。 constrainablexxブロックの下では,以下の変数/ブロックを指定することができます。
type変数 |
拘束条件の“種類”を指 定します。以下のいず れかの値をとります。 |
|
bond_length |
2原子間の の距離を拘束します。 |
|
bond_angle |
3原子の成すボ ンド角を拘束します。 |
|
dihedral_angle |
4原子の 2面角を拘束します。 |
|
bond_length_diff |
2原子間の距 離の差を拘束します。 |
|
bond_angle_diff |
3原子が成す角 度の差を拘束します。 |
|
distance_from_pos |
指定の場所から の距離を拘束します。 |
|
plane |
面内に指定 の原子を拘束します。 |
|
center_of_mass |
指定の原子群 の重心を拘束します。 |
|
coordination_number |
配位数を 拘束します。配位数の 決め方は後述します。 |
|
atomx 変数 |
指定 の拘束条件が関わる原 子を指定します。xは 数字であり,たとえば 2原子間の距離の場合 は2つの原子が拘束に 関わるので,atom1と atom2に対応する原子 の番号を指定します。 typeが coordination_number の場合,配位数 を計算する中心の原子 の番号を指定します。 |
|
mobile 変数 |
指定の拘束条 件が“可動か否か”を指 定するためのスイッチ です。offとすると拘 束され,onとすると拘 束はされません。デフ ォルト値はoffです。 |
|
monitor 変数 |
指定の拘束条件 を“監視”(値を算出し ,ログファイルに出力 )するか否かを指定す るスイッチです。デフ ォルト値はoffです。 |
|
reaction_coordinate ブロック |
指定 の拘束条件が,“反応 座標(逐次値を変化さ せられる)”である場合 に作成するブロックで す。以下の変数を指定 することができます。 |
|
sw_reaction_coordinate |
onの際,反応 座標とみなされます。 |
|
init_value |
反応経路 の初期値を,対応する 単位で指定します。指 定がない場合,入力の 原子配置から求められ る値が採用されます。 この値と,入力の 原子配置から求められ る値が異なる場合,入 力の原子配置が修正さ れたのちに計算が実行 されます。このため, 一回目の(拘束力も 含む)原子に働く力の 最大値が見掛け上非常 に大きな値となること がありますが,これは 正常な振る舞いです。 |
|
final_value |
反応 経路の最終値を対応す る単位で指定します。 |
|
increment |
final_val ueとinit_valueの間の 刻み幅を指定します。 |
|
反応座標を 逐次変化させる場合, 以下 のケースは特殊である ので注意が必要です. |
||
typeがplaneの場合 |
この場合,変化す るのは面の原点です. 原 点の座標値は,指定の 法線ベクトルと原子の 座標値からプログラム が自動的に決めますが ,反応座標の変化とし ては,法線ベクトルの 方向に原点が変化する ,という振る舞いにな ります。init_value, final_value, i ncrementは,この原点 の移動量を指定してく ださい。なお,この場 合のinit_valueのデフ ォルト値は0ですが, 通常明示的に指定する 必要はないはずです。 |
|
typeが center_of_massの場合 |
この場合,重心を ,指定の方向に移動さ せます。init_value, final_value, incrementは,こ の移動量を指定してく ださい。なお,この場 合のinit_valueのデフ ォルト値は0ですが, 通常明示的に指定する 必要はないはずです。 |
|
planeブロック |
||
normx |
法線ベクトルの \(x\)座標。 |
|
normy |
法線ベクトルの \(y\)座標。 |
|
normz |
法線ベクトルの \(z\)座標。 |
|
distance_from_posブロック |
typeとして distance_from_posを 採用する場合の,場所 の指定を行うブロック です。次の変数を指定 することができます。 |
|
posx |
指 定したい場所の, \(x\) 座標を長さ の単位で指定します。 |
|
posy |
指 定したい場所の, \(y\) 座標を長さ の単位で指定します。 |
|
posz |
指 定したい場所の, \(z\) 座標を長さ の単位で指定します。 |
|
coordination_numberブロック |
配位数拘束の 定義式における \(\kappa,r_c\) の 値を指定するブロック です。次の変数を指定 することができます。 |
|
kappa_inv |
\(\kappa\) の値を,長さ の単位で指定します。 |
|
kappa |
\(\kappa\) の 値を,1/bohr単位で指 定します。kappa_inv よりも優先されます。 |
|
rcut |
\(r_c\) の値を,長さ の単位で指定します。 |
|
center_of_massブロック |
typeとしてcenter_of_ma ssを採用し,かつ反応 座標を変化させる場合 ,「変化させる方向」 をここで指定します。 |
|
directionx |
変化させ る方向の\(x\) 座標を指定します。 |
|
directiony |
変化させ る方向の\(y\) 座標を指定します。 |
|
directionz |
変化させ る方向の\(z\) 座標を指定します。 |
配位数の決め方
type = coordination_numberの場合,配位数を拘束します。ここで \(j\) 番目の原子の配位数は以下の式によって評価します。
\(\kappa, r_c\) はパラメーターであり,first coordination shellでほどよく0に近づくように決定します。
拘束条件の指定の次は,採用するダイナミクスのアルゴリズムを指定します。通常のPHASEの入力と同様,structure_evolutionブロックの下で行います。
structure_evolution{
method=quench
dt=40
...
}
ここで,methodとしてはquench, damp, velocity_verlet, temperature_controlを利用することができます。拘束条件を課している場合,gdiis, cgなどには現バージョンでは未対応なのでご注意ください。また,dampはdamped molecular dynamics法による構造最適化を実施する場合に指定します。この手法は,多くの場合単純なquenched MDよりは大きな時間刻み(dt)を採用することができ,速く収束させることのできる手法です。
次に、反応座標の変化の指定方法について説明します。
複数の反応座標を逐次変化させる方法
複数の反応座標を逐次変化させる場合のプログラムの振る舞いを説明します。たとえば以下のように入力で指定した場合について説明します。
structure{
....
....
constrainable1{
mobile = off
monitor = on
type = dihedral_angle
atom1 = 2
atom2 = 4
atom3 = 3
atom4 = 1
reaction_coordinate{
sw_reaction_coordinate = on
init_value = -179 degree
final_value = -1 degree
increment = 5 degree
}
}
constrainable2{
type=bond_length
monitor=on
atom1=3
atom2=4
reaction_coordinate{
sw_reaction_coordinate=on
init_value = 1.2 angstrom
final_value = 1.6 angstrom
increment = 0.05 angstrom
}
}
....
....
}
まず,constrainable1ブロックにおいて2面角を-179°から-1°まで5°刻みで変化させるように指定しています。 さらに,constrainable2ブロックにおいてはボンド長を1.2 Åから1.6 Åまで0.05 Å刻みで変化させるように指定をしています。このような入力を記述した場合, まずボンド長を1.2 Åに固定した状態で2面角を-179°から-1°まで変化させて計算が実行されます。-1°の計算が終了したら,次はボンド長を1.25 Åに変化させ,今度は-1°から-179°まで2面角を変化させる計算を実行します。このような変化のさせ方を採用することによって,隣り合う反応座標の組の間で原子配置が 極端に変化することを防いでいます。
以上のような方針で検討する反応座標が決まりますので,合計すると検討する反応座標の数は反応座標\(\alpha\)において検討する反応座標の数を\(n_{\alpha}\)とすると\(\prod_{\alpha}^{}n_{\alpha}\)となります。これよりもきめ細やかに反応座標の組を指定するには,次に説明する「反応座標の変化の仕方をファイルを介して指定する」機能を利用します。
ファイルから反応座標の変化の仕方を指定する方法
拘束条件の変化のさせ方は上述のreaction_coordinateブロックにおいて指定しますが,この方法の場合は等間隔の指定です。特に前述の,複数の反応座標を変化させる計算においては,反応座標\(\alpha\)において検討する反応座標の数を\(n_{\alpha}\)とすると\(\prod_{\alpha}^{}n_{\alpha}\)個の反応座標を検討することになり,計算時間が膨大になることがあります。このような制限が問題となる場合に,「反応座標(の組)」をファイルから指定することが可能となっています。
まず,検討したい拘束条件をconstrainablexxブロックにおいて通常通り指定します。次に,structureブロックの下に以下の変数を定義します。
structure{
....
reac_coord_generation = via_file
....
}
最後に,作業ディレクトリーにreac_coords.dataというファイル名のファイルを作成し,次のような内容を記述します。
1 -1.9373154697 2.2676711906
2 -1.7627825445 2.2676711906
3 -1.5882496193 2.2676711906
4 -1.4137166941 2.2676711906
5 -1.2391837689 2.2676711906
6 -1.0646508437 2.2676711906
7 -0.8901179185 2.2676711906
8 -0.7155849933 2.2676711906
9 -0.7155849933 2.3621574902
10 -0.8901179185 2.3621574902
11 -1.0646508437 2.3621574902
12 -1.2391837689 2.3621574902
13 -1.4137166941 2.3621574902
14 -1.5882496193 2.3621574902
15 -1.7627825445 2.3621574902
16 -1.9373154697 2.3621574902
17 -1.9373154697 2.4566437898
18 -1.7627825445 2.4566437898
19 -1.5882496193 2.4566437898
20 -1.4137166941 2.4566437898
21 -1.2391837689 2.4566437898
22 -1.0646508437 2.4566437898
23 -0.8901179185 2.4566437898
24 -0.7155849933 2.4566437898
......
......
......
各行が1つの反応座標の組に相当します。行の1列目にはその反応座標の組を識別するための番号を整数で入力します。2列目以降は,定義した拘束条件の順番で反応座標の値を入力します。 この例では2種類の反応座標を検討していることになります。1つ目の反応座標の組では1番目の拘束条件として“-1.9373154697”という値,2番目の拘束条件として“2.26711906”という値を 指定することになります。単位は,PHASEのデフォルトの単位を利用して指定するようにしてください。長さならばbohr単位, 角度ならradian単位です。
5.4.3.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とすれば目的の動作を達成することができます。
5.4.3.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番 目の反応座標の,自由エネルギー差 を算出するために必要なラグランジ ュの未定乗数の値が記録されます。 |
さらに,継続計算ファイルや波動関数・電荷密度ファイルなどは反応座標ごとに出力されます。
5.4.3.5. Blue Moon法による自由エネルギーの計算
機能の概要
拘束条件付きの分子動力学シミュレーションが発生する統計集合(blue moon ensemble)のデータを利用すると,検討した反応座標の経路上における自由エネルギーの変化を算出することができます [Sprik98] 。
反応座標が\(\xi_{1}\)から\(\xi_{2}\)へ変化する場合の自由エネルギー差は,次のように計算することが可能です。
ここで自由エネルギーの反応座標微分,\(\left\langle \frac{\partial W}{\partial\xi} \right\rangle_{\xi}\)はmean forceと呼ばれる物理量であり,ハミルトニアンの反応座標微分と次のような関係があります。
ここで\(\left\langle \cdots \right\rangle^{\text{cond}}\)とは「条件付き統計平均」です。拘束条件付き分子動力学シミュレーションの統計平均と条件付き統計平均は単純には結びつきませんが,拘束条件付き分子動力学を遂行する際に計算するラグランジュの未定乗数\(\lambda\)を利用して以下のように計算することができます。
上式には,厳密にはより複雑な補正項がつきますが,実用上は問題ないとされています。
PHASEによる拘束条件付き分子動力学シミュレーションの結果から自由エネルギー差を計算するには, PHASEパッケージに付属しているbluemoonプログラムを利用します。
現バージョンでは,bluemoonプログラムは反応座標が1つの場合のみに対応しています。
bluemoonプログラムのコンパイル
bluemoonプログラムのソースコードは,PHASEインストールディレクトリーのsrc_bmディレクトリーに納められています。bluemoonプログラムはFortran90コンパイラーとCコンパイラーを必要とします。Fortran90コンパイラーを環境変数F90に,Cコンパイラーを環境変数CCに設定し,makeコマンドを発行すればコンパイルすることができます。以下はお使いのシステムがbashで,Fortranコンパイラーのコマンドがf90,Cコンパイラーのコマンドがccの場合の例です。
% cd phase0_2020.01
% cd src_bm
% export F90=f90
% export CC=cc
% make
% make install
環境変数F90とCCの指定がない場合,gfortranとgccがデフォルト値として利用されます。 コンパイルが終了すると,bluemoonという名前の小さなプログラムが作成されます。 % make installとすると phase0_2020.01/binディレクトリーの下にbluemoonを移すことができます。
bluemoonプログラムの入力パラメータ
bluemoonプログラムの入力ファイルは,PHASEのそれと同等です。nfinp.dataファイルにthermodynamic_integrationブロックを作成し,計算条件を入力します。たとえば以下のようになります。
thermodynamic_integration{
nsteps=2000
nequib=1000
istart_reac_coords=1
nreac_coords=14
nsample=10
smooth=off
basedir=.
}
thermodynamic_integrationブロックでは以下の指定を行うことができます。
nsteps |
各反応座標における分子動力学シミュレーションの 総ステップ数を指定します。デフォルト値は2000で すが,実施した計算に合わせて変更してください。 |
nequib |
nstepsの内,平衡化のため捨てる ステップ数を指定します。nstepsよりも小さく,熱 平衡に至ったと考えられる値を指定してください。 |
istart_reac_coords |
最初に検討する反 応座標のIDを入力します。デフォルト値は1です。 |
nreac_coords |
最後に検討する反応座標の数を指定します。 |
nsample |
統計誤差を見積もる場合に シミュレーションを何分割するかを指定します。 |
smooth |
onとすると,三次のス プライン関数によって計算結果を滑らかにします。 |
basedir |
結果を出力するディレクトリーを指定しま す。デフォルト値はカレントディレクトリーです。 |
bluemoonプログラムの実行方法
以上のような入力を作成したら,次のようにbluemoonを走らせます。
% bluemoon inputfile
引数で指定するinputfileは入力ファイルのファイル名です。指定がない場合,nfinp.dataという文字列が採用されます。
計算結果の出力
計算が終了すると,次のファイルが作成されます。
potential_of_mean_force.data
自由エネルギーの計算結果が出力されます。以下のような形式で出力されます。
#value, potetial of mean force in Hartree, eV, kcal/mol, kJ/mol
2.4566437898 -0.0215821952 0.0003443042 -0.5872816633
0.0093689992 -13.5430301648 0.2160541460 -56.6640534911 0.9039707906
2.2676711910 -0.0224669448 0.0003796767 -0.6113569350
0.0103315334 -14.0982188431 0.2382507016 -58.9869635475 0.9968412043
2.0786985910 -0.0226882285 0.0004435350 -0.6173783747
0.0120692073 -14.2370764737 0.2783223931 -59.5679440305 1.1645012069
............
............
............
各行が1つの反応座標のデータに相当します。1列目が反応座標の値,2列目,3列目がハートリー単位,4列目,5列目が電子ボルト単位,6行目と7行目がkcal/mol単位,8行目と9行目がkJ/mol単位での自由エネルギーとその統計誤差の結果に対応します。
ean_force_raw.data
検討した反応座標から得られるmean forceの計算結果が出力されます。次のような形式で出力されます。
2.4566437898 0.0066082098 0.0188118786
2.2676711910 0.0034758686 0.0099291734
2.0786985910 -0.0009537509 0.0028573953
1.8897259920 -0.0074922663 0.0213420952
1.7007533930 -0.0098143395 0.0279585555
1.5117807940 -0.0157974842 0.0449758051
1.3228081950 -0.0161451965 0.0459534340
............
............
............
potential_of_mean_force.dataファイルと同様に,各行が1つの反応座標のデータに相当します。1列目が反応座標の値,2列目がmean forceの値(単位:hartree/対応する反応座標の単位),3列目が統計誤差に相当します。
mean_force_smoothed.data
三次のスプライン関数によって自由エネルギー計算を滑らかにする場合mean forceを滑らかにしたあとに(20)式の積分を実施しますが,その滑らかにしたmean forceの計算結果が出力されます。 そのデータ形式は,mean_force_raw.dataファイルから統計誤差の列を除いたものになります。
5.4.3.6. 計算例:H2O2およびH2S2分子の回転障壁の解析
拘束条件付き構造最適化計算の例として,H2O2およびH2S2分子の回転障壁の解析例を紹介します。 H2O2, H2S2は 図 5.77 で示す分子構造を有する単純な分子です。HOOH (HSSH)が成す2面角の回転ポテンシャルは,H原子同士の相互作用とH原子とO(S)原子の孤立原子対との相互作用が競合し,W型ポテンシャルになることが知られています。2面角を拘束した構造最適化を複数の2面角において実施することにより,このような振る舞いが得られるかどうかを確認します。

図 5.77 H2O2およびH2S2分子の分子構造
この例題の入力ファイルは, samples/dynamics/constraints
ディレクトリー以下, H2O2
および H2S2
ディレクトリーにあります。まず,structureブロックの下には以下の記述があります。
structure{
constrainable1{
type = dihedral_angle
atom1 = 2
atom2 = 4
atom3 = 3
atom4 = 1
reaction_coordinate{
sw_reaction_coordinate = on
init_value = 9 degree
final_value = 179 degree
increment = 10 degree
}
}
...
...
}
constrainable1ブロックを作成し,その下で拘束条件の指定を行っています。この例題では拘束条件は 一つのみ課しますが,互いに相いれる拘束条件であるならばいくつでも定義することが可能です。 今は2面角の拘束を実施するので,type変数としてはdihedral_angleを指定しています。 また,2面角を定義するために必要な4つの原子の番号をatom1からatom4変数によって指定しています。 さらに,reaction_coordinateブロックを作成し,この拘束条件を逐次変化させる指定を行います。 sw_reaction_coordinateをon, init_valueとfinal_valueをそれぞれ9 degreeと179 degree, incrementを10 degreeとしていますが,このような指定によって,9°から179°まで,10°刻みで 2面角を変化させて構造最適化を行います。
図 5.78 に,2面角と最適化の結果得られたエネルギーの関係を示します。図 5.78 には,実験結果 [Pelz93] も併せて実線で表示しています。一見して明らかなように,計算結果と実験結果はよい一致が得られています(おおよそ1 kcal/mol程度の違い)。
H2O2とH2S2の大きな違いは2点あります。1点目は,安定な2面角の値です。H2O2は4面体の角度である109.5°に近い値が安定であるのに対し,H2S2は90°付近が安定な2面角です。2点目はtrans障壁エネルギ( 図 5.78 では180°付近の障壁エネルギー)の高さです。H2O2と比較すると,H2S2のtrans障壁ははるかに大きく,実験的には約6倍の値が得られています。いずれの点も本計算によって再現されており,妥当な結果が得られているものと考えられます。
図 5.78 H2O2およびH2S2分子の2面角とエネルギーの関係
5.4.3.7. 使用における注意点
拘束条件付きダイナミクスは,全ての擬ポテンシャルと組み合わせて利用することができます。継続計算にも対応しています。また,反応座標に対する並列を実行することができます。 反応座標に対して並列計算を行う場合,NEB法の場合と同様以下のようなコマンドを利用します。
% mpirun -n NP phase ne=NE nk=NK nr=NR
5.4.3.8. 参考文献
5.4.4. Meta-dynamics 法
5.4.4.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法によるシミュレーションの模式的な様子を 図 5.79 に示します。この図では,まずシミュレーションは1の数字が割り当てられた谷から始まります。2のバイアスを足し,さらに3のバイアスを足すと新しい局所極小(図中で最も左側の谷)に至ります。さらに4, 5, 6とバイアスポテンシャルを足すともっともエネルギーの低い谷(図中で最も右側の谷)へ至ることができます。最後に7のバイアスを足し,さらに8のバイアスポテンシャルまで足すと,系は集団変数の空間を自由に行き来できるようになります。この時点でのバイアスポテンシャルに-1を掛けると,それは自由エネルギーと見做すことができることが分かります。

図 5.79 Meta-dynamicsシミュレーションの模式図
Meta-dynamics法の特徴として,反応座標と関連付けられた複数の動力学変数の動力学を追跡する点が挙げられます。この考え方を導入することによって,複数の反応座標を検討することが容易となり,また動力学変数自身が“もっともらしい”反応経路を探索してくれる効果が期待できます。また,blue moon法の場合複数の反応座標を取り扱うことは(原理上は可能ではありますが)難しいのに対し,meta dynamics法においては比較的容易です。したがって,反応座標が複数ある場合や,反応経路が自明でない場合などにおいて有効な方法であると考えられます。バイアスポテンシャル導入の方針の違いにより,自由エネルギー表面を粗く,すばやく探索することも,きめ細かく,精度よく探索することも可能です。 Meta-dynamics法シミュレーションは,あらかじめ決められた間隔でバイアスポテンシャルを足しながら進行していきます。この際にバイアスポテンシャルを構築するには,時刻0から現在までのデータをすべて利用して和を取る必要があるので,Meta-dynamics法は\(O\left( t^{2} \right)\) の計算手法となります(ただし,第一原理計算で利用するかぎりこの点が制約になることはないでしょう)。
Meta-dynamics法のハミルトニアンは,具体的には,次のように記述されます。
ここで,\(\alpha\)は集団変数に含まれる各変数を識別する変数,\(\mu_{\alpha}\)と\(s_{\alpha}\)はそれぞれ仮想的な粒子の質量と座標,\(S_{\alpha}\left( \mathbf{r} \right)\)は対象としているシステムから定義される「集団変数」,\(k_{\alpha}\)は仮想的な粒子の座標と集団変数を結びつける「ばね定数」,\(V\left( t,s \right)\)がバイアスポテンシャルです。足しこんでいったバイアスポテンシャルを記録しておくと,そこから自由エネルギーを見積もることも可能です。このようなハミルトニアンから得られる動力学は,次のようにまとめることができます。
系は,集団変数を通して仮想的な粒子の座標値に緩く拘束される。
仮想的な粒子の座標は,バイアスポテンシャルの効果によって,すでに訪れた点には再訪づらい。
仮想的な粒子の座標の運動と系の運動の特徴的なタイムスケールが異なれば(仮想的な粒子の方が長いタイムスケールであれば),系の運動は仮想的な粒子の運動の影響をそれほどは受けないので局所的には正しく系の運動を追跡し,かつゆるやかに集団変数の張る空間を探索することが可能となります。仮想的な粒子の質量は,上記の原理より集団変数の固有振動モードが系よりも遅くなるように設定します。
Meta-dynamics法は,仮想粒子の動力学を追跡するのではなく,系に直接バイアスポテンシャルを足しこんでいくことによって実現する手法もあります [Laio05] 。このような方針を採用すると,仮想的な粒子の質量やそれと集団変数を結びつけるばね定数の定義が不要となり,よりシンプルに実行することが可能となります。
5.4.4.2. 入力パラメータ
本機能と関連あるタグの一覧を次の表に示します。
メタダイナミクスに関連のあるタグの一覧
第1 ブロック識別子 |
第2,第3ブロ ック識別子 |
タグ識別子 |
説明 |
---|---|---|---|
control |
|||
driver |
ダイナ ミクスの種類を 選択する変数。 拘束条件付きダ イナミクスの場 合meta_dynamicsを指定する。 |
||
meta_dynamics |
メタダイ ナミクスの設定 を行うブロック |
||
meta_dynamics_type |
メ タダイナミクス の“種類”の指定 bias_and_fict itious,bias_only, bias_generation のいずれか デフォルト 値はbias_only. |
||
max_bias_update |
最大 バイアス更新回 数を指定する。 デ フォルト値は- 1(負の数値の場 合,この条件で は停止しないこ とを意味する). |
||
extensive_output |
onとすると通常は不要な 出力も得られる |
||
output_per_rank |
onとするとレプリカ並列時に 各ランクごとに 出力が得られる |
||
collective_variable |
集団変数の指定を 行うブロック。 |
||
type |
集団変数の“種類 ”の指定。拘束 条件付きダイナ ミクスと同じ。 bond_length, bond_angle, dihedral_angle bond_length_diff, bo nd_angle_diff, dist ance_from_pos, plane, center_of_mass, coordination_numbe |
||
atomx |
拘束条件が 関わる原子を指 定する。xは整 数で,たとえば type = bond_lengthの場合2原子 が拘束に関わる のでatom1とato m2で指定する。 |
||
k |
仮想粒子のバネ 定数を指定する |
||
delta_s |
バイアスポテン シャルの幅,\(\Delta s\)を指定する |
||
smin |
バイアスポ テンシャル出力 の最小値を指定 |
||
smax |
バイアスポ テンシャル出力 の最大値を指定 |
||
ds |
バイアスポ テンシャル出力 の刻み幅を指定 |
||
co ntrol_velocity |
onにした場 合,仮想粒子の 速度を制御する |
||
mass_thermo |
仮想粒子の速 度を制御する場 合の熱浴の質量 |
||
target_KE |
仮想粒子の速 度を制御する場 合のターゲット 運動エネルギー |
||
plane |
面内拘束 における面の法 線ベクトルを指 定するブロック |
||
nor mx,normy,normz |
法線ベクト ルのx,y,z成分 |
||
distance_from_pos |
場所の指定 を行うブロック |
||
posx,posy,posz |
指定したい場 所のx,y,z成分 |
||
coordination_number |
配位数指定 を行うブロック |
||
kappa_inv |
配位数定義式の の逆数を長 さの単位で指定 |
||
kappa |
配位数定 義式の \(\kappa\) を1/bohr 単位で指定 |
||
rcut |
配位数定義式の \(r_c\) の値を長 さの単位で指定 |
||
center_of_mass |
重心を変化 させる方向を指 定するブロック |
||
directionx |
指定した い方向のx成分 |
||
directiony |
指定した い方向のy成分 |
||
directionz |
指定した い方向のz成分 |
||
bias_potential |
バイアスポテ ンシャルの設定 を行うブロック |
||
height |
一度に足す バイアスポテン シャルの高さを |
||
エネルギ ーの単位で指定 |
|||
update_frequency |
バイアス ポテンシャルを 足す頻度を指定 た とえば10とする と,10MDステッ プに1回バイア スポテンシャル が更新される。 デフ ォルト値は20。 |
||
output_frequency |
meta_dynamics_t ypeがbias_gene rationの場合に ,バイアスポテ ンシャル構築を 何回に1回行う かを指定する。 デ フォルト値は10 |
||
continuation_strategy |
レプリカ並 列計算時におけ る継続計算の方 針を設定する。 |
||
randomize_velocity |
onと すると速度は継 続せず乱数で決 まるようになる |
||
scale_velocity |
onと すると継続時下 記の velocity_scaling_factor に 応じて速度がス ケールされる。 |
||
velocity_ scaling_factor |
読み込 んだ速度をスケ ールする値。デ フォルト値は1 |
||
configuration_from_input |
onとする と,継続計算フ ァイルではなく 入力ファイルか ら座標データを 読み込む。デフ ォルト値はoff |
Meta-dynamics法の入力パラメータの指定について説明します。
Meta-dynamics法の計算は,以下の指定を行います。
Meta-dynamics法を有効に指定する
Meta-dynamicsの振る舞いを指定する(ダイナミクス追跡モード,バイアスポテンシャル更新回数,出力形式など)
温度一定のMDシミュレーションの設定を行う
集団変数の定義を行う(集団変数に含める反応座標の情報を集団変数の数だけ定義)
バイアスポテンシャルの設定を行う(バイアスポテンシャルの高さ,幅,更新頻度など)
レプリカ並列計算を実行する場合,その設定。
Meta-dynamics法を有効に指定する
Meta-dynamics法の機能を有効にするには,controlブロックにおいて以下の指定を行います
control{
driver = meta_dynamics
}
この指定により,PHASEの通常の原子ダイナミクスコードではなく,Meta-dynamics計算用のメイン・プログラムが呼ばれます。
Meta-dynamicsの振る舞いの設定
Meta-dynamicsの全体的な振る舞いの設定方法を説明します。この設定は,入力ファイルの最上位にmeta_dynamicsブロックを作成し,さらに以下のような変数・ブロックを定義することによって行います。
meta_dynamics{
meta_dynamics_type = bias_only
max_bias_update = -1
extensive_output=on
output_per_rank=on
output_cvar_every_step=off
continuation_strategy{
randomize_velocity=on
scale_velocity=off
velocity_scaling_factor=0.7
configuration_from_input=off
...
...
}
meta_dynamicsブロックでは,以下の変数/ブロックの設定を行うことができます。
meta_dynamics_type変数 |
bias_and_fictitious, bias_only, bias_generationのい ずれかを指定します。 bias_and_fictitious とすると仮想粒子の動 力学を考慮したメタダ イナミクスを, bias_only とするとバイアス ポテンシャルのみを有 効にしたメタダイナミ クスを実行することが できます。bias_gene rationとした場合Meta dynamicsは実行され ず,作業ディレクトリ ーに存在するファイル からバイアスポテンシ ャルの構築および出力 のみが実行されます。 |
|
max_bias_update変数 |
最大何回バイアスポテ ンシャルを更新するか を指定します。負の値 を指定すると,バイア スポテンシャルの更新 回数では計算は停止し ません。これがデフォ ルトの振る舞いです。 |
|
output_per_rank変数 |
onとする と,レプリカ並列計算 実行時に出力が各ラン クごとに得られます。 |
|
extensive_output変数 |
onとすると,仮想粒 子の速度や仮想粒子に 働く力など,通常は不 要な出力も得られます |
|
continuation_strategyブロック |
レプ リカ並列計算実行時に おける継続計算の方針 の設定を行います。レ プリカ並列計算時には ,並列数を変化させた 場合に以前の計算を厳 密に再現することはで きないので,ここでど のような方針で継続す るのか決定する必要が あります。このブロッ クでは,以下の設定を 行うことができます。 |
|
randomize_velocity |
onと すると,継続計算実行 時に速度を継続せず, 乱数で割り振ります。 デフォルト値はoff。 |
|
scale_velocity |
onとすると,読 みこんだ速度をつぎに 説明するvelocity_sc aling_factorの値に応 じてスケールします。 デフォルト値はoff。 |
|
velocity_scaling_factor |
読 み込んだ速度にここで 指定した値をかけます 。デフォルト値は1。 |
|
configuration_from_inpu |
onとすると,継 続計算ファイルではな く入力ファイルから座 標データを読み込む。 デフォルト値はoff。 |
集団変数の定義
集団変数とは,“反応座標”を複数まとめたものです。この指定は,meta_dynamicsブロック以下において行います。典型的な例は下記の通りです。
meta_dynamics{
....
....
collective_variable{
mass=1000
k=100
delta_s = 0.08
control_velocity=on
mass_thermo = 50
target_KE = 0.1
}
collective_variable1{
type=bond_length
atom1=5
atom2=4
delta_s=0.05 angstrom
smin=1 angstrom
smax=5 angstrom
ds = 0.1 angstrom
}
....
....
}
まず,meta_dynamicsブロックの下にcollective_variableブロックを作成します。collective_variableブロックには全集団変数に共通の設定を行います。後に説明する集団変数個別の設定に記述がない項目のみここでの設定が反映されます。
次に,集団変数を定義したい数だけcollective_variablexxブロックにおいて定義します。ここでxxは集団変数のIDです。任意の数の集団変数を定義することが可能ですが,1から連続的に変化する整数を指定する必要があります。たとえば,collective_variable1, collective_variable2, collective_variable4の3つのcollective_variablexxブロックがあった場合,collective_variable1とcollective_variable2のみ解釈されます。
collective_variableおよびcollective_variablexxブロックは,拘束条件付きダイナミクスの設定の際に設定する拘束条件と同様の変数を定義することが可能となっています。具体的には,以下の変数を定義することが可能です。
type 変数 |
集団変数の“種類”を指 定します。 以下のいず れかの値をとります。 |
|
bond_length |
2原子間の距離 を集団変数とします。 |
|
bond_angle |
3原子の成すボンド角 を集団変数とします。 |
|
dihedral_angle |
4原子の2面角 を集団変数とします。 |
|
bond_length_diff |
2原子間の距離の差 を集団変数とします。 |
|
plane |
ある原 子の指定の面内での位 置集団変数とします。 |
|
center_of_mass |
指 定の原子群の重心を位 置集団変数とします。 |
|
coordination_number |
配位数を位 置集団変数とします。 |
|
distance_from_pos |
ある場所からの距離 を集団変数とします。 |
|
atomx 変数 |
指定 の集団変数が関わる原 子を指定します。xは 数字であり,たとえば 2原子間の距離の場合 は2つの原子が拘束に 関わるので,atom1と atom2に対応する原子 の番号を指定します。 typeが coordination_number の場合,配位数 を計算する中心の原子 の番号を指定します。 |
|
planeブロック |
面内拘束 の場合の,拘束したい 面の法線ベクトルを指 定するためのブロック です。次の変数を指定 することができます。 |
|
normx |
法 線ベクトルのx座標。 |
|
normy |
法 線ベクトルのy座標。 |
|
normz |
法 線ベクトルのz座標。 |
|
coordin ation_numberブロック |
配位数の設定 |
|
kappa_inv |
\(1/\kappa\) の 値を,長さ の単位で指定します。 |
|
kappa |
\(\kappa\)の 値を,1/bohr単位で指 定します。kappa_inv よりも優先されます。 |
|
rcut |
\(r_c\) の値を長さ の単位で指定します。 |
|
mass変数 |
仮想粒子の質量を指 定します。meta_dynamics_typeが bias_and_fictitious の場合のみ 意味のある指定です。 |
|
k変数 |
仮想粒子と 集団変数の結びつきを 決める,バネ定数を指 定します。meta_dyna mics_typeが bias_and_fictitiousの 場合のみ 意味のある指定です。 |
|
delta_s変数 |
\(\delta s_{\alpha}\) の値を 指定します。 |
|
smin変数 |
バイアスポ テンシャル出力の際の 最小値を指定します。 |
|
smax変数 |
バイアスポ テンシャル出力の際の 最大値を指定します。 |
|
ds変数 |
バイアスポテン シャル出力の際の刻 み幅を指定します。 |
|
control_velocity変数 |
onにした 場合,仮想粒子のダイ ナミクスを追跡する際 に熱浴を付与すること によってその速度を制 御します。meta_dynamics_typeが bias_and_fictitious の場合のみ 意味のある指定です。 |
|
mass_thermo変数 |
control_velocityが onの場合の,熱浴の 質量を指定します。 |
|
target_KE変数 |
control_velocity がonの場合 の,目的とする仮想粒 子の温度を指定する。 |
バイアスポテンシャルの設定
バイアスポテンシャルの設定は,meta_dynamicsブロックの下にbias_potentialブロックを作成して行います。以下に典型的な例を示します。
bias_potential{
height = 0.02 eV
update_frequency=20
output_frequency=100
}
bias_potentialブロックにおいて定義可能な変数は下記の通りです。
height変数 |
一度に足すバイアスポ テンシャルの高さをエネルギーの単位で指定しま す。 一度に足すバイアスポテンシャルの幅は,各 集団変数固有の量であるのでbias_potentialブロ ックではなく集団変数固有の設定を行うcollect ive_variablexxブロック以下で行います。 |
output_frequency変数 |
meta_dynamics_typeがbias_generat ionの場合のみ意味のある指定です。何回に1回バ イアスポテンシャルを出力するかを指定します。 |
update_frequency |
バイアスポテンシャルの 更新頻度を指定します。デフォルト値は20です。 |
レプリカ並列計算の設定
初期速度を変化させる
特に指定がない場合,初期座標はすべてのレプリカで共通で,初期速度の乱数のみ異なる,という条件で計算がなされます。位相空間上異なる点から始めるので,座標が同じでも各レプリカはいずれ異なる軌跡をとるようになります。ただし,当然のことながら最初のうちは(座標値は)ほぼ同じ軌跡となります。
初期の座標値をランクごとに明示的に指定する
入力ファイルにおいて,レプリカごとに異なる座標データを指定することも可能です。この設定は,atomsxxブロック(ここでxxはMPIランクの数字)を作成し,そこで座標値を設定することによって行います。たとえば,ランク0が担当するレプリカとランク1が担当するレプリカにそれぞれ異なる座標値を与えるには,次のような記述を行います。
structure{
atom_list{
....
atoms0{
#units angstrom
#default weight = 1, element = Si, mobile = 1
#tag element rx ry rz mobile weight
C 5.0157363043 5.6563796505 5.8043454319 1 1
C 4.7499007526 4.2727134018 5.7364572058 1 1
...
...
}
atoms1{
#units angstrom
#default weight = 1, element = Si, mobile = 1
#tag element rx ry rz mobile weight
C 4.5897384578 5.5998560107 5.7723226564 1 1
C 5.1658344359 4.3217914066 5.6857269157 1 1
...
...
}
}
}
5.4.4.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はいずれも省略可能(デフォルト値は1 すべて無指定の場合NE=NP)です。
通常Meta dynamics実行時に得られるバイアスポテンシャルの出力は「直近に得られたバイアスポテンシャル」のみですが,バイアスポテンシャルをポスト処理的に計算し,それを出力させることもできます。この機能を利用するには,入力ファイルのmeta_dynamicsブロックのmeta_dynamics_type変数にbias_generationという文字列を指定します。この時,meta_dynamicsブロックの下のbias_potentialブロックにおいて定義される,bias_output_frequency変数に指定された回数に1回出力を行います。たとえば,bias_output_frequencyが10, バイアスの総更新回数が100だった場合,10回目,20回目,30回目,... 100回目の更新時のバイアスポテンシャルがそれぞれ独立したファイルに出力されます。そのファイル名は,“bias_potential.dataxx”となります。ここでxxが対応する更新回数です。この設定を行ったあと,Meta-dynamics解析を行ったディレクトリーにおいてPHASEを実行します。ファイルを読み込みバイアスポテンシャルを構築するのみなので,通常並列で実行する必要はありません。
5.4.4.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}\)の値です。
5.4.4.5. 計算例:炭化水素のエネルギー表面
概要
Meta dynamics法を利用した例として,炭化水素のエネルギー表面を調べた例を紹介します。具体的には,C4H6分子の電子環状反応を取り上げます。
入力データは samples/dynamics/meta_dynamics/C4H6
にあります。
C4H6分子は,trans 1-3ブタジエン,cis 1-3 ブタジエン,シクロブテンの3種類の安定構造が知られています。シクロブテンは環状分子,trans 1-3ブタンジエンは平面状の分子ですが,cis 1-3ブタジエンは平面状にはならず,2面角を30°ほどひねった構造が安定な構造です(gauche配座)。その分子構造を 図 5.80 に示します。エネルギーは,高い順にシクロブテン,cis
1-3ブタジエン,trans 1-3ブタジエンであり,分子の反応としては,1-3 ブタジエンが閉環して環状化合物であるシクロブテンを生成する,あるいは逆にシクロブテンが開環し1-3ブタジエンが生成される反応(電子環状反応),また,2種類の1-3 ブタジエンの間のcis-trans反応が考えられます。閉環・開環反応は化学結合の切断を要することから大きな障壁エネルギーがあり,1 eV程度のオーダーであると考えられます。他方,cisからtransへの変化はそこまでの障壁はなく,100 meV程度のオーダーであると考えられます。
特に,環状反応においては,1-3ブタジエンとシクロブテンとでは2重結合の数が異なり,電子状態としては全く異なるものであるため,古典的なポテンシャルで取り扱うのは一般に難しいと言えます。この点をPHASEで正しく扱えるかどうかを確認します。

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

図 5.81 C4H6分子の分子構造
入力パラメータ
Meta dynamics法を有効に指定します。これは,controlブロックの下のdriver変数にmeta_dynamicsを指定することによって行います。
condition{
driver = meta_dynamics
....
}
次に集団変数を定義します。その方針は様々ですが,ここでは以下を採用します。
図 5.81 の原子1と原子2の距離。パラメーターds, delta_sはそれぞれ0.1 Åと0.05 Å
図 5.81 の,原子1-4-3-2の作る二面角。パラメーターds, delta_sはそれぞれ10°と5°
この設定は,meta_dynamicsブロックの下で以下のように実現します。
meta_dynamics{
....
....
collective_variable1{
type=bond_length
atom1=5
atom2=4
delta_s=0.05 angstrom
!for bpot output
smin=1 angstrom
smax=5 angstrom
ds = 0.1 angstrom
}
collective_variable2{
type=dihedral_angle
atom1=5
atom2=3
atom3=2
atom4=4
delta_s = 5 degree
!for bpot output
smin = -180 degree
smax = +180 degree
ds = 10 degree
}
}
バイアスポテンシャルの高さは0.02 eV(0.46 kcal/mol)とします。バイアスポテンシャルの更新頻度は,20 MDステップに一度とします。この設定は,meta_dynamicsブロックの下にbias_potentialブロックを作成し,heightパラメーターで指定することによって行います。
meta_dynamics{
....
....
bias_potential{
update_frequency = 20
height=0.02 eV
}
}
バイアスポテンシャルを更新する回数は任意ですが,信頼できる自由エネルギー表面を得るためには相当数の更新回数が必要です。
計算結果
本シミュレーションによって得られる計算結果を解説します。まず, 図 5.82 にバイアスポテンシャルを18,140回程度更新した結果得られたエネルギー表面の等高線図を示します。
図 5.82 C4H6分子の自由エネルギー表面
図 5.82 より,ここで得られたエネルギーの等高線図には4つの安定点があることが理解できます。すなわち,原子間距離が約1.5 Å程度で角度がほぼ0 radianの点,原子間距離が3.3 Å程度で角度が0 radian,原子間距離が3.7 Å程度で角度が\(\pm\)3 radian程度の2つの点です。これらは,それぞれシクロブテン,cis 1-3ブタジエン,trans 1-3ブタジエンに相当します.絶対零度の計算の場合,cisではなくgauche 配座となりますが,300KのMeta dynamicsシミュレーションではcisとgaucheの明確な区別がつけられる結果は得られませんでした.得られたシクロブテンとtrans 1-3ブタジエンのエネルギー差は,16 kcal/mol程度,シクロブテンとcisブタジエンのエネルギー差は12kcal/mol程度となりました.いずれも,絶対零度の計算と比較するとより大きなエネルギー差です.
図 5.83 および 図 5.84 には,集団変数がバイアスポテンシャルの更新と共にどのように変化していったかを示しています.二面角が 図 5.83 ,炭素原子間距離が 図 5.84 の振る舞いです. 図 5.83 および 図 5.84 より,バイアスポテンシャルを約700回更新した時点で鞍点を超えてブタジエンに至っていることが理解できます.そこから18,000回程度の更新までは幅広くエネルギー表面を探索しています.図 5.80 らも分かるように,ここで考えている系はシクロブタンを除くと二面角に対して幅広い範囲の構造を取り得ます.そのため,この谷を埋め尽くすのに多くのバイアスポテンシャルの更新が必要となっています.18,000回程度のバイアスポテンシャル更新の結果,再びシクロブタンへ戻ったことが確認できた時点(図 5.80 )で計算を終了させました。
図 5.83 2面角とバイアスポテンシャル更新回数の関係
図 5.84 炭素原子間距離とバイアスポテンシャル更新回数の関係
図 5.85 (a)から(d)までに,Meta dynamicsシミュレーション中に実際に得られた原子配置のスナップショットを示しました。ここで示しているように,バイアスポテンシャルの効果によって様々な分子構造が実現していることが分かります。

図 5.85 Meta dynamicsシミュレーションによって得られた分子構造のスナップショット.(a) : バイアスポテンシャル2回更新 (b) バイアスポテンシャル690回更新 (c) バイアスポテンシャル1,500回更新 (d) バイアスポテンシャル18,070回更新
5.4.4.6. 使用における注意点
Meta dynamics法は,すべての擬ポテンシャルと組み合わせて利用することができます。レプリカ並列を含めた並列計算も行うことができます。 ただし,意味のある結果を得るためには膨大な計算量を費やす必要があります。 レプリカ並列を行う場合,継続計算のタイミングでレプリカ並列数を変化させる場合,対応するレプリカの継続計算ファイルが存在しない場合があります。この場合は近くのランクの継続計算データを読み込み,さらにcontinuation_strategyで設定した指針に従って初期レプリカを作成します。
5.4.4.7. 参考文献
- Laio02
Laio and M. Parrinello, Proceedings of the National Academy of Sciences 99, (2002) p. 12562.
- Iannuzzi03
Iannuzzi, A. Laio and M. Parrinello, Physical Review Letters 90, (2003) p. 238302.
- Laio05
Laio, A. Rodriguez-Fortea, F. L. Gervasio, Ceccarelli and M. Parrinello, J. Phys. Chem. B 109, (2005) p. 6714.
5.5. 時間依存密度汎関数法計算(TDDFT)
5.5.1. 実時間処理型の時間依存密度汎関数理論(RTTDDFT)による光学スペクトル計算
5.5.1.1. 機能の概要
実時間TDDFT法に基づいて、次式の時間依存一電子方程式を解くことにより、与えられた初期一電子波動関数に対する電子ダイナミクス・シミュレーションを行う。
波数ベクトルkとバンド番号nを指標とする一電子波動関数を\(\phi_{n}^{\mathbf{k}}\)で、\(\phi_{n}^{k}\)\(\phi_{n}^{k}\)有効ハミルトニアンをHで表す。時間依存一電子方程式の形式的解から、一電子波動関数の時間発展は以下のように表される。
右辺の時間発展演算子は、時間積分部および指数関数部に対して近似を施して数値計算され、それぞれ様々な近似方法が提案されている。時間積分部は時間間隔∆tが十分に小さければ次式のように近似できる。
さらに、指数関数部に対する近似としてテイラー展開法が使用される。
この近似法の場合、時間間隔∆tと展開最大次数Nmaxが主要な入力パラメータであり、計算精度と実行時間の兼ね合いを考慮して最適値を設定する必要がある。
原理的には、各時間においてヘルマン・ファインマン力を計算し、その値に従って原子位置のダイナミクスを実行することも可能である。(ただし、本プログラムには実装されておらず、原子位置は固定した状態で電子ダイナミクス計算を行う。)
時間t=0-の初期一電子波動関数は、プログラムPHASEによって求められる基底状態の一電子波動関数を用いて作成するため、本機能実行前にDFT法による基底状態の計算を終えている必要がある。本プログラムでは、基底状態一電子波動関数φnk (r, t=0-)を以下のように位相シフトさせることができる。
これは時間t=0+においてパルス電場を系に与えることに相当する。各時刻において双極子モーメントd(t)または電流密度J(t)を計算し、電子ダイナミクス・シミュレーション終了後に、これらの値を時間の関数から振動数へとフーリエ変換することによって、実験と直接比較可能な双極子強度・光吸収スペクトルなどの光学物性値が求められる。
5.5.1.2. 入力パラメータ
以下の入力タグの例は、初期状態として「x方向へ大きさ0.01原子単位のデルタ関数型パルス電場」を系に与え、「時間刻み0.1原子単位時間/時間ステップで1,000時間ステップ(全シミュレーション時間100原子単位時間)」のRT-TDDFT計算を実行する場合です。ただし、DFT法による基底状態の計算が収束している場合のみRT-TDDFT計算が実行されます。
postprocessing{
rttddft{
sw_rttddft = on
time_step_delta = 0.1
time_step_max = 1000
ext_pulse_epsilon = 0.01
ext_pulse_kx = 1.0
ext_pulse_ky = 0.0
ext_pulse_kz = 0.0
}
}
パラメータ |
デフォルト値 |
説明 |
---|---|---|
sw_rttddft |
OFF |
ON : RTTDDFT計算処理を実行する OFF : RTTDDFT計算処理を行わない |
time_step_delta |
0.1(原子単位時間) |
時間更新刻み 全シミュレー ション時間は、time_step_d elta×time_step_maxとなる。 経験的には0.05~0.1原 子単位時間の値が推奨される ( 1原子単位時間はおよそ0.024 fs) 大きなtime_step_del taを設定した場合には異常値 が出力されることがあり、そ の場合は値をより小さく設定 して再計算する必要がある。 |
time_step_max |
100(回) |
計算処理を 終了するまでの時間更新回数 [計算途中にジョブを正 常終了させることはできない (nfstop機能は使用不可)] |
初期状態生成[デルタ関数型パルス電場\(\mathbf{E}(t) = E_{0}\mathbf{e}\delta(t)\) ]に関するパラメータ
パラメータ |
デフォルト値 |
説明 |
---|---|---|
ext_pulse_epsilon |
0.0d0 |
電場の大きさ\(E_{0}\) |
ext_pulse_kx |
0.0d0 |
電場の向き\(\mathbf{e}\) |
ext_pulse_ky |
0.0d0 |
電場の向き\(\mathbf{e}\) |
ext_pulse_kz |
0.0d0 |
電場の向き\(\mathbf{e}\) |
5.5.1.3. 計算の実行方法
まずは、通常の SCF 計算を行います。この際は、sw_rttddft パラメータは off に設定しておきます。通常のSCF 計算が終了したら、sw_rttddft パラメータを on とし、さらに必要に応じて rttddft ブロックの各種パラメータを編集し、control ブロックの下の condition パラメータを continuation に設定します。このような設定を施したら、通常通り PHASE の計算を実行するとTDDFT 計算が実行されます。途中で終了した RT-TDDFT 計算は、初期電場の設定(ext_pulse_epsilon, ext_pulse_kx, ext_pulse_ky, ext_pulse_kz)をすべて 0 とし、condition=continuation としたままで PHASE を実行すれば行うことができます。
5.5.1.4. 計算結果
計算結果は、ログファイルに記録されます。以下のように、双極子モーメントと電流密度が原子単位で記録されます。
# time_step= 991 time= 0.9910E+02 au = 0.2397E+01 fs
...
P= 0.0285381798 0.0002058360 0.0001702915
J= -0.0133497494 0.0000068680 -0.0000030064
P=のあとの 3 つの数値が双極子モーメントの x, y, z 成分、J=のあとの 3 つの数値が電流密度の x, y, z 成分です。
計算終了後、時間空間から周波数空間にフーリエ変換することによってスペクトルをエネルギーの関数として得ることが可能です。このフーリエ変換を実行するプログラムのソースコードがsrc_spectrum の下にある spectrum.f90 です。このプログラム自体は、標準的な Fortran90 コンパイラーによってコンパイルすることが可能です。その利用方法は、以下の通りです(作業ディレクトリーとして、ft というディレクトリーを作成して実行する例)。 まず、以下のようにディレクトリーft を作成し、そのディレクトリーの下に電流密度の履歴を抽出した j.dataというファイルを作成します。
% mkdir ft
% cd ft
% grep ”J=” ../output001 > j.data
j.data ファイルに、次のように 1 行目に time_step_delta と ext_pulse_epsilon を加え、さらに time_step_maxの値を 2 行目に加えます。
0.1 0.01
1001
J= -0.2999128661 0.0000002015 -0.0000008972
J= -0.2970981909 -0.0000022160 -0.0000000155
…
…
このファイルを作成したら、spectrum.f90 をコンパイルしたバイナリー(たとえば a.out)を実行します。結果
としては、以下のファイルが得られます。
出力ファイル名 |
説明 |
---|---|
j.out |
電流密度と時間の関係、Jx(t) Jy(t) Jz(t) |
p.out |
誘起された双極子モーメントと時間の関係、Px(t) Py(t) Pz(t) |
pw.out |
フーリエ変換された双極子モーメント、Re[Px(w)] Im[Px(w)] |
abs.out |
双極子モーメント強度のスペクトル |
5.5.1.5. 例題
例として、ベンゼン分子( 図 5.86 )のRT-TDDFT計算例を紹介します。この例題の入力ファイルは samples/tddft/rt_benzene
以下にあります。

図 5.86 ベンゼン分子の原子配置
計算は、まずはSCF計算を実行し、ついでRT-TDDFTを有効にした継続計算を実行しました。RT-TDDFTのステップ数は11,000とし、時間刻みは0.1 au (約0.0024 fs)としました。さらに、得られた結果を5.5.1.4で説明した手続きによってフーリエ変換しました。得られる吸収スペクトル(abs.outの結果)は 図 5.87 で示す通りです。
図 5.87 本例題によって得られる吸収スペクトル
最初のピークが、約6.8 eVに表れています。通常のSCF計算によって得られるHOMO-LUMOギャップは約5.1 eVですが、この値よりも大きな値が吸収端として得られており、もっともらしい結果と考えられます。
5.5.1.6. 使用上の注意
ノルム保存型擬ポテンシャルを使用してください。ウルトラソフト型擬ポテンシャルには対応していません。
分子の重心がユニットセル中心に位置するように原子座標を設定し、分子が充分な真空領域に囲まれたユニットセルサイズを設定して下さい。(分子がセル境界をまたいで存在する場合には、双極子モーメントが正しく計算されません。)
ksampling{ }タグ内で「base_reduction_for_GAMMA = off」と「base_symmetrization_for_GAMMA = off」を明示して下さい。
symmetry{ }タグ内で「method = manual」と「sw_inversion = off」を明示して下さい。
バルク系の計算には対応していません。
5.6. 構造最適化
5.6.1. ストレステンソルを利用したユニットセル最適化機能
PHASE/0には,ストレステンソルを利用して単位胞を最適化する機能が備わっています。ここでは,この機能の使い方の説明を行います。
5.6.1.1. 入力パラメータ
まずは,通常通り入力パラメータファイルを記述します。セルを変形させたあとに座標の緩和を行いたい場合は通常通り原子座標最適化用のパラメータを設定すればセルの変形→力が収束していない場合は原子座標の最適化,という動作をするようになります。さらに,単位胞最適化用の,以下のような設定を加えます。
structure_evolution{
lattice{
sw_optimize_lattice = on
}
}
変数sw_optimize_latticeをonとすると本機能を利用することができます。latticeブロックには,以下の変数を定義することが可能です。
sw_optimize_lattice |
単位胞最適化機能を有効に する場合onとします。 デフォルト値はoff です。なお,このスイッチがonの場合 はsw_stressは自動的にonになります。 |
sw_uniform |
単位胞を一様に変化させたい 場合にonとします。デフォルト値はoff です。このパラメータがonの場合,スト レステンソルの対角要素の平均値によっ て体積を変化させるように動作します。 |
sw_rebuild_pws |
単位胞を変 形させた後に平面波基底を作り直すかど うかを指定します。デフォルト値はon, つまり格子が変 形する度に平面波を作り直します。Off とすることによって電子状態計算の収束 性を向上させることができますが,格子 が変形しても同じ平面波セットを利用し ている,ということは厳密にはカットオ フエネルギーが微妙に変化している,と いうことに相当する点に注意が必要です 。また,このパラメータをoffとすると 継続計算ができなくなってしまいます。 |
method |
最適化の手法を選択します。bfgs, quench, sdのいずれかを 指定します。デフォルト値はbfgsです。 |
delta_stress |
me thodがquenchかsdの場合の更新の刻み幅 を指定します。デフォルト値は1です。 |
max_stress |
収束判定に利用する ,ストレステンソルの最大値を圧力の単 位で指定します。デフォルト値は1.e-6 ha rtree/bohr3です。sw_unifo rmがonの場合はストレステンソルの対角 要素の平均が収束判定に採用されます。 |
sw_optimize_coordinates_once |
原子配置の最適化は1回目の格子の 更新時のみ行いたい場合にonとします。 |
sw_fix_length_a |
onとするとa軸 の長さを固定して格子を最適化します。 |
sw_fix_length_b |
onとするとb軸 の長さを固定して格子を最適化します。 |
sw_fix_length_c |
onとするとc軸 の長さを固定して格子を最適化します。 |
sw_fix_angle_alpha |
onとすると格子 定数αを固定して格子を最適化します。 |
sw_fix_angle_beta |
onとすると格子 定数βを固定して格子を最適化します。 |
sw_fix_angle_gamma |
onとすると格子 定数γを固定して格子を最適化します。 |
5.6.1.2. バージョン2019.01未満の場合の注意点
ストレステンソルのカットオフエネルギーに対する収束性はかなり悪い場合があります。ストレスミニマムと全エネルギーのミニマムが一致しない場合,おそらくカットオフが不十分であることが要因と思われます。このようなケースに遭遇したら,ストレステンソルとカットオフエネルギーの関係をしらべていただくことを推奨します。
5.6.1.3. ストレステンソル補正(バージョン2019.01以降)
ストレステンソルの計算精度は低い場合が多いので,補正する設定を施すことが推奨されます。
structure_evolution{
stress{
sw_stress_correction = on
}
}
5.6.1.4. 電荷密度および波動関数の再利用(バージョン2019.02以降)
格子最適化を行う場合,格子が変形するたびに電荷密度や波動関数のメッシュは変化します。そのため,2019.02未満のバージョンにおいては波動関数や電荷密度は格子が変形するたびに作り直す振る舞いがデフォルトの振る舞いでしたが,バージョン2019.02以降より新しいメッシュに補間して古い電荷密度および波動関数データを割り当てる動作がデフォルトの振る舞いとなりました。この変更により,SCF計算の収束に要する回数を大幅に減らすことができるようになりました。この動作を抑制したい場合は以下のような設定を行います。
structure_evolution {
lattice {
sw_optimize_lattice = on
sw_interpolate_charge = off
sw_interpolate_wfs = off
}
}
5.6.1.5. 計算結果の出力
結果はoutput000ファイル,nfefn.dataファイル,nfdynm.dataファイルに記録されます。
output000ファイルには,ストレステンソルが記録されます。以下のコマンドによってその情報を抽出することができます。
% grep –A3 ‘STRESS TENSOR$’ output000
STRESS TENSOR
0.0002326236 0.0000000000 0.0000000000
0.0000000000 0.0002326236 0.0000000000
0.0000000000 0.0000000000 0.0002142790
--
STRESS TENSOR
0.0002272841 0.0000000000 0.0000000000
0.0000000000 0.0002272841 0.0000000000
0.0000000000 0.0000000000 0.0002077216
...
...
通常の計算の場合ストレステンソルが1組出力されるのみですが,本機能を利用している場合はストレステンソルの履歴が出力されます。
nfefn.dataファイルには,通常通り全エネルギーや原子に働く力の最大値のほか,ストレステンソルの最大値(sw_uniformがonの場合は対角要素の平均値)が記録されます。たとえば,以下のような出力が得られます。
iter_unitcell, iter_ion, iter_total, etotal, forcmx, stressmx
1 1 18 -181.4043211413 0.0020128619
1 2 27 -181.4043355689 0.0015666906
1 3 36 -181.4043464493 0.0011267018
1 4 44 -181.4043509953 0.0008837770
1 5 53 -181.4043582176 0.0000137026 0.0002326236
2 1 73 -181.4044226903 0.0000645338 0.0002272841
nfdynm.dataファイルも通常のものとほぼ同じですが,通常の計算の場合は一度しか出力されないヘッダーが,セルベクトルが変形される度に出力されます。
#
# a_vector = 8.6795114819 0.0000000000 0.0000000000
# b_vector = 0.0000000000 8.6795114819 0.0000000000
# c_vector = 0.0000000000 0.0000000000 5.5916992108
# ntyp = 2 natm = 6
# (natm->type) 2 2 1 1 1 1
# (speciesname) 1 : O
# (speciesname) 2 : Ti
#
cps and forc at (iter_ion, iter_total = 1 18 )
1 0.000000000 0.000000000 0.000000000 0.000000 0.000000 0.000000
2 4.339755741 4.339755741 2.795849605 0.000000 0.000000 0.000000
3 2.643779197 2.643779197 0.000000000 -0.001423 -0.001423 0.000000
4 6.983534938 1.695976544 2.795849605 -0.001423 0.001423 0.000000
……
……
#
# a_vector = 8.7672856463 0.0000000000 0.0000000000
# b_vector = 0.0000000000 8.7672856463 0.0000000000
# c_vector = 0.0000000000 0.0000000000 5.6429940606
# ntyp = 2 natm = 6
# (natm->type) 2 2 1 1 1 1
# (speciesname) 1 : O
# (speciesname) 2 : T
#
cps and forc at (iter_ion, iter_total = 1 111 )
1 0.000000000 0.000000000 0.000000000 0.000000 0.000000 0.000000
2 4.383642823 4.383642823 2.821497030 0.000000 0.000000 0.000000
3 2.663907294 2.663907294 0.000000000 0.001773 0.001773 0.000000
4 7.047550117 1.719735530 2.821497030 0.001773 -0.001773 0.000000
5 1.719735530 7.047550117 2.821497030 -0.001773 0.001773 0.000000
6 -2.663907294 -2.663907294 0.000000000 -0.001773 -0.001773 0.000000
……
……
5.6.1.6. 計算例:ルチル型TiO2 (ストレス補正なし)
ルチル型TiO 2 の格子最適化を行った例を紹介します。入力データは samples/unitcel_optimization/TiO2
以下にあります。
入力パラメータファイルには,以下のような設定を施しました。
カットオフエネルギーは80 Rydberg
擬ポテンシャルはポータルサイトにおいて公開されているTi_ggapbe_us_02.ppとO_ggapbe_us_02.pp
原子座標の最適化を施す設定;手法はBFGS法,収束判定となる力の最大値は2e-4
初期原子配置および格子定数は,無機材料データベースAtomWork(http://crystdb.nims.go.jp/)に登録されていたルチル型TiO2のデータを採用
波動関数ソルバー,電荷密度ミキサーは指定せず,デフォルト設定を採用。
採用したカットオフエネルギーは80 Rydbergと比較的大きなものですが,後述のようにTiO2の場合はこれくらい必要であると考えられます。
nfefn.dataファイルの内容は,以下のようになりました。
iter_unitcell, iter_ion, iter_total, etotal, forcmx, stressmx
1 1 18 -181.4043211413 0.0020128619
1 2 27 -181.4043355689 0.0015666906
1 3 36 -181.4043464493 0.0011267018
1 4 44 -181.4043509953 0.0008837770
1 5 53 -181.4043582176 0.0000137026 0.0002326236
2 1 73 -181.4044226903 0.0000645338 0.0002272841
3 1 92 -181.4044839579 0.0001241955 0.0002222588
4 1 111 -181.4056948858 0.0025074070 0.0002222588
4 2 120 -181.4057176163 0.0020195652 0.0002222588
4 3 130 -181.4057600852 0.0000156213 0.0000444895
……
……
9 1 248 -181.4058191217 0.0001647915 0.0000332105
10 1 268 -181.4058328662 0.0000709369 0.0000119789
11 1 287 -181.4058349707 0.0000268520 0.0000015502
12 1 306 -181.4058351835 0.0000244918 0.0000006790
まずは,原子座標の最適化が5回実施されています。その間ストレステンソルは未計算なので,6列目は空欄になっています。5回目で原子に働く力の最大値が閾値より小さくなったので,セルを変形させたのちに計算が進行しています。この際に,単位胞最適化の更新回数を表す1列目の数値が2になっていることがわかります。また,6列目にストレステンソルの最大値が記録されています。2回目と3回目の更新時はセルを変形させても原子に働く力の最大値は閾値以下だったので原子座標の最適化は実施されませんでしたが,4回目セルベクトル更新時にはそうではなかったので原子座標の最適化が行われています。このようにセルの最適化と必要に応じた原子座標の最適化が行われつつ計算が進行し,セルの更新回数が12回となったところでストレステンソルの最大値が閾値以下となったので計算は収束したとみなされ終了しています。単位胞最適化収束の履歴を,図にまとめました。

図 5.88 単位胞最適化の履歴。赤線:全エネルギー,緑線:ストレステンソルの最大成分。
安定な格子定数は,nfdynm.dataファイルに記録された最後のセルベクトル更新の情報からもとめることができます。この例の場合,a=8.7934 bohr, c=5.6164 bohrと得られました。
ストレステンソルとカットオフエネルギー
ストレステンソルは,全エネルギーや原子間力と比較してカットオフエネルギーに対して収束しづらい傾向があります。例として,ルチル型TiO2の,実測値の格子定数で計算したストレステンソルとカットオフエネルギーの関係を図にプロットしました。

図 5.89 ルチル型TiO2の場合の,ストレステンソルとカットオフエネルギーの関係
図からわかるように,カットオフ50 Rydberg程度の場合ストレステンソルの符号が間違ってしまっています。このケースでは,ある程度収束したストレステンソルを得るためには,最低でも80 Rydberg程度以上のカットオフエネルギーが必要であることが示唆されます。
5.6.1.7. 計算例:ルチル型TiO2 (ストレス補正あり,バージョン2019.01以降)
5.6.1.6 章 で行った最適化を,ストレス補正を有効にして実行してみます。
入力データは samples/unitcell_optimization/TiO2_with_correction
にあります。
入力パラメータファイルには,以下のような設定を施しました。 計算条件は下記の通り。
カットオフエネルギーは36 Rydberg
ストレス補正は有効 (structure_evolutionブロックの下のstressブロックにおいてsw_stress_correction = onと設定)
擬ポテンシャルはポータルサイトにおいて公開されているTi_ggapbe_us_02.ppとO_ggapbe_us_02.pp
原子座標の最適化を施す設定;手法はBFGS法,収束判定となる力の最大値は2e-4
初期原子配置および格子定数は,無機材料データベースAtomWork(http://crystdb.nims.go.jp/)に登録されていたルチル型TiO2のデータを採用
波動関数ソルバー,電荷密度ミキサーは指定せず,デフォルト設定を採用。
結果得られる単位胞最適化収束の履歴を次の図に示します。比較的低いカットオフ(36 Rydberg)を採用しているにも関わらずスムーズな最適化が行えました。結果得られる格子定数は,a = 8.806 bohr, c = 5.619 bohrとなりました。
図 5.90 単位胞最適化の履歴。赤線:全エネルギー,緑線:ストレステンソルの最大成分。
5.7. ノンコリニア系の計算、スピン軌道相互作用計算
5.7.1. ノンコリニア系の計算
5.7.1.1. 機能の概要
通常の計算では、局所的な磁気モーメントの大きさは、アップ・ダウンスピン電子密度の差で表現され、その向きについては規定されません。向きまで表現するためには、1つの波動関数がアップ及びダウンスピン成分をもつようにする、すなわち2成分スピノールで表す必要があります。
これに対応して電荷密度は
のように、スピン指標に関して2x2行列となります。また、局所的な電荷密度及び磁気モーメントは、
となります。
5.7.1.2. 入力パラメータ
ノンコリニア系の計算、すなわち2成分スピノールでの計算を行うには、structureブロックに “magnetic_state = noncollinear “ と記します。また、各原子種の局所磁気モーメントの方向の初期値を、”mdx mdy mdz” に指定します。特に指定しない場合は、z 方向を向くと判断します。局所磁気モーメントの方向の初期値は、”theta phi” (単位:degree) でも指定可能です。
structure{
...
magnetic_state = noncollinear
element_list{
#units atomic_mass
#tag element atomicnumber zeta deviation mdx mdy mdz
O 8 0.166666 1.5 0.0 0.0 1.0
}
...
}
5.7.1.3. 計算結果の出力
標準出力には、以下のような磁気モーメントに関する情報が出力されます。Tot, Mx, My, Mzは、それぞれ、局所的な電荷密度及び磁気モーメントを単位胞内で足し合わせた値です。これ以外は通常の計算による出力と共通です。
!OLD Chg \*\* Tot: 40.00000000 Mx: 0.00073742 My: 0.00000000 Mz: 16.17742289
!NEW Chg \*\* Tot: 40.00000000 Mx: 0.00075559 My: 0.00000000 Mz:
5.7.2. スピン軌道相互作用計算
5.7.2.1. 機能の概要
2成分スピノールが重要になるのは、スピン軌道相互作用を考慮する場合です。スピン軌道相互作用は、
で表されます。ここで、は原子核周りの球対称なポテンシャルです。このHamiltonianは、波動関数のアップ及びダウンスピン成分の間に相互作用を働かせるため、5.8.1 で説明した2成分スピノールが必要になります。
5.7.2.2. 入力パラメータ
スピン軌道相互作用を利用するには、accuracyブロック内のspin_orbitブロックに “mode = pawpot “ と記します。これ以外は、ノンコリニア系の計算と同様です。
accuracy{
…
spinorbit{
mode = pawpot
}
…
}
5.7.2.3. 計算結果の出力
スピン軌道相互作用によるエネルギーは、標準出力にESpinOrb_old, new で表示されます。
なお、これらの値は、コンパイル時にCPPFLAGに -DUSE_ESPINORB をつけた場合にのみ計算されます。
TOTAL ENERGY FOR 53 -TH ITER= -41.454944288742 edel = -0.170628D-08 : SOLVER = SUBMAT + RMM3
KI= 13.204535394898 HA= 32.283599969986 XC= -6.801519951682 LO=
NL= 7.597059454569 EW= 5.402894293900 PC= 0.000000000000 EN=
PHYSICALLY CORRECT ENERGY = -41.454944288742
EOHXC_PAW= -0.4786729 HA_PAW= 0.0218350
XC_PAW_AE= -15.6619733 XC_PAW_PS= -5.6000049
!XC_PAW_AE-XC_PAW_PS= -10.0619684
ESpinOrb_old= -0.0000308 ESpinOrb_now= -0.0000293
5.7.2.4. 計算例:O2分子、Pt2分子
計算例は、 samples/spin_orbit
以下のサブディレクトリーにあります。これらの例では、分子をx軸方向に配置し、磁気モーメントの向き(
theta )による全エネルギーの違いを計算します。
図 5.91 スピン軌道相互作用計算の計算例の分子配置
O2分子
samples/spin_orbit/O2/Theta_0
samples/spin_orbit/O2/Theta_90
前者の方が、1原子あたり 0.108 meV 安定です。
Pt2分子
samples/spin_orbit/Pt2/Theta_0
samples/spin_orbit/Pt2/Theta_90
後者の方が、1原子あたり 17.215 meV 安定です。
5.7.2.5. Si 結晶のバンド
スピン軌道相互作用を考慮したバンド計算は、通常のコリニア計算と同じ手順で行います。まず、scf 計算を行い (phase)、得られた電荷密度のもとでバンド計算 (ekcal) を行います。
例として、Si diamond
結晶のバンド計算を示します。scf及びband計算ともに、以下のキーワードを用います
( samples/spin_orbit/Si_band/soc_on
フォルダ参照 )。
accuracy{
paw = on
spinorbit{
mode = pawpot
}
}
structure{
magnetic_state = noncollinear
}
図 5.92 左図は上記入力により得られたバンド構造で、右図はスピン軌道相互作用を考慮しないバンド構造です。スピン軌道相互作用によりgamma 点の縮退が解けていることが分かります。

図 5.92 スピン軌道相互作用を考慮したバンド構造(左)としないバンド構造(右)
5.7.2.6. 使用上の注意
スピン軌道相互作用を用いてエネルギー比較を行う場合、対称操作をEのみにされることをお勧めします。
smearing においてmethod = parabolic のみが使用可能です。
5.8. ELNES / XANES解析機能
5.8.1. はじめに
EELSは電子が試料を透過する際のエネルギー損失を測定し、XAFSは試料にX線を照射した際に現れるスペクトルを測定する実験手法です。ここでは、電子線あるいはX線により、内殻電子が非占有状態に遷移する現象を対象とします。また、広範なエネルギー領域の中で、特に、吸収端付近のスペクトル構造を計算するものとします。この狭いエネルギー領域では、EELS は ELNES、XAFS は XANES と呼ばれています。
ELNESとXANESの二重微分散乱断面積は、双極子近似のもとで、以下のように表されます。
ここで \(|i>\) \(|f>\) は始状態 (基底状態) と終状態(ある原子の内殻電子が飛び出し、非占有状態に遷移した状態)、qは非弾性散乱時における波数の変化、eは入射X線の偏光ベクトルである。したがって、XANESの計算は、ELNES計算にてqを eと読み替えます。内殻軌道から状態n, kで指定される伝導バンドへの遷移確率は、 [Gao08] に従い、
で与えられるものとします。ここで 右辺第1項は、波動関数の soft part の寄与、第2項は擬ポテンシャルを用いたことによる補正項です。 \(|\phi_i>\) は原子軌道iの全電子波動関数、\(\tilde{\phi}_i\) は原子軌道iの擬波動関数である。
また、吸収端のエネルギーは、基底状態と内殻電子励起状態の全エネルギー差で与えられるものとします。
5.8.2. 準備:擬ポテンシャル
公開されている擬ポテンシャルには、内殻軌道に関する情報が含まれていません。このため、ELNES・XANES の計算を行うためには、擬ポテンシャルをあらためて作成する必要があります。作成すべき擬ポテンシャルは、
基底状態の擬ポテンシャル
内殻に空孔を入れた状態の擬ポテンシャル
です。例えば、LiF 結晶の Li 原子のK 端のスペクトルを計算する場合には、
Li原子の基底状態の擬ポテンシャル
Li原子の1s軌道に空孔を入れた擬ポテンシャル
F原子の基底状態の擬ポテンシャル
を作成します。なお、いずれの擬ポテンシャル作成においても、CIAOの入力ファイルに、
sw_write_core_to_valence 1
を記入する必要があります。なお、上記は”sw_with_dipole_cor2val 1”でも結構です。キーワードについてはCIAO のマニュアルを参照してください。
5.8.3. 計算の流れ
計算は以下の順で行います。
基底状態 (A) のSCF計算
内殻電子励起状態 (B) のSCF計算
内殻電子励起状態 (B) のスペクトル計算
①と②で得られた(A)と(B)の全エネルギー差をスペクトルの吸収端エネルギーとし、③の計算に反映します。
なお、実行コマンドは、①及び②のSCF計算は phase、③のスペクトル計算は epsmain を使用します。
5.8.4. 基底状態 (A) のSCF 計算
5.8.4.1. 入力
吸収端のエネルギーを計算するために、入力パラメータに以下のキーワードを設定します。
accuracy{
paw = on
}
Postprocessing{
CoreLevels{
sw_calc_core_energy = on
}
}
なお、file_names.data の F_POT に、5.8.2で作成した擬ポテンシャルファイル名を指定します。通常の、内殻軌道情報を含まない擬ポテンシャルを指定した場合には、該当原子の内殻電子の寄与を考慮せずにエネルギー計算が行われます。
&fnames
F_INP = './nfinp1.data'
F_POT(1) = '../pp/Li_ggapbe_paw_02_no_corehole.pp'
F_POT(2) = '../pp/F_ggapbe_paw_02_no_corehole.pp'
/
5.8.4.2. 出力
core_energy.data の最終行に、内殻電子と価電子の寄与を合わせた全エネルギー値が出力されます。core_energy.data以外のファイルに出力したい場合には、file_names.data でF_CORE_ENERGY_OUTにファイル名を指定します。
# Etotal (Core+Valence)
-3437.92292869603
5.8.5. 内殻電子励起状態 (B) のSCF 計算
5.8.5.1. 入力
基底状態の計算と同じキーワードを用います。その他の注意事項として、内殻電子を励起する原子には、別の原子種を割り当てる必要があります。また、励起原子は単位胞に 1 原子のみとする。以下の例では、励起原子は Li2 です。
structure{
atom_list{
atoms{
#tag element rx ry rz mobile
Li2 0.0000000000 0.0000000000 0.0000000000
F1 0.2500000000 0.0000000000 0.0000000000
…
(中略)
…
Li1 0.7500000000 0.5000000000 0.7500000000
F1 1.0000000000 0.5000000000 0.7500000000
}
}
element_list{
#units atomic_mass
#tag element atomicnumber zeta deviation
Li1 3 0.00 1.5
Li2 3 0.00 1.5
F1 9 0.00 1.5
}
}
Li2 には、内殻電子を励起させて作成した擬ポテンシャルを割り当てる。内殻電子励起状態 (B) のSCF 計算の file_names.dataの記述例です。
&fnames
F_INP = './nfinp1.data'
F_POT(1) = '../pp/Li_ggapbe_paw_02_no_corehole.pp'
F_POT(2) = '../pp/Li_ggapbe_paw_02_1s_corehole.pp'
F_POT(3) = '../pp/F_ggapbe_paw_02_no_corehole.pp'
/
5.8.5.2. 出力
基底状態の計算と同様に、core_energy.data の最終行に、内殻電子と価電子の寄与を合わせた全エネルギー値が出力されます。
5.8.6. 内殻電子励起状態 (B) のスペクトル計算
5.8.6.1. 入力
スペクトル計算の入力では、control ブロックにてcondition = fixed_charge を指定します。
control{
condition = fixed_charge
use_additional_projector=on
}
また、structure ブロックは、基底状態の計算と同様に記述します。
epsilon ブロックでは、スペクトルに関するパラメータ指定を行う。sw_corelevel_spectrum は、内殻軌道からの励起スペクトル計算を行うためのスイッチで、onと指定します。probe ブロック内のatom_id には、励起させる原子の番号を指定します。上記のLi2 は1番目の原子であるため、atom_id = 1 としています。また、orbital には、擬ポテンシャル作成時に空孔を入れた軌道を指定します。この例では orbital に 1s を指定しており、Li K端におけるスペクトルが計算されます。
fermi_energy ブロックでread_efermi = on とし、efermiには、内殻電子励起状態 (B)のSCF計算の nfefermi.data 記載の値を指定します。
energy ブロックには、吸収端を基準にして観察したいエネルギー領域を指定する。low, high, step は、それぞれ、エネルギー領域の下端、上端、及び間隔に対応する。単位は hartree です。
XANESの計算の入力パラメータは、EELS の際は photonを eels と書き換えます。なお、内部の処理は共通であるため、どちらのキーワードを用いても結果は変わりません。
epsilon {
sw_epsilon = on
sw_corelevel_spectrum = on
probe{
atom_id = 1
orbital = 1s
}
fermi_energy{
read_efermi = on
efermi = 0.21930399
}
photon{
energy{
low = -0.10, high = 2.0, step = 0.002
}
}
transition_moment{
type = ks ! {l
symmetry =on
}
BZ_integration {
method = g !{parabolic(p)
width = 1.0 eV
}
}
最後に、file_names.data では、基底状態 (A)及び内殻電子励起状態 (B) の全エネルギー値出力ファイル名を、F_CORE_ENERGY_INITIAL 及びF_CORE_ENERGY_FINAL に指定します。また、F_CHGT 及び F_CNTN_BIN_PAWに、内殻電子励起状態 (B)の電荷密度ファイルを指定ます。
&fnames
F_INP = './nfinp1.data'
F_POT(1) = '../pp/Li_ggapbe_paw_02_no_corehole.pp'
F_POT(2) = '../pp/Li_ggapbe_paw_02_1s_corehole.pp'
F_POT(3) = '../pp/F_ggapbe_paw_02_no_corehole.pp'
F_CHGT = '../scf_excited/nfchgt.data'
F_CNTN_BIN_PAW = '../scf_excited/continue_bin_paw.data'
F_CORE_ENERGY_INITIAL = '../scf_ground/core_energy.data'
F_CORE_ENERGY_FINAL = '../scf_excited/core_energy.data'
/
5.8.6.2. 出力
スペクトルの出力ファイル名はeps.data である。以下に出力例を示す。3行目のエネルギー値は、吸収端エネルギーにe_lowを加えた値です。spectrum はスペクトル強度、すなわち誘電関数の虚部 に対応します。
# Spectrum data
# Energy[eV] Spectrum
0.6018296869E+02 0.7167942086E-06
0.6023739146E+02 0.1031555487E-05
0.6029181423E+02 0.1478755242E-05
…
5.8.7. 計算事例
5.8.7.1. LiF 結晶の Li 原子K端のスペクトル
例題として、LiF 結晶の Li 原子K端の XANES
スペクトルを示します。計算事例は、 samples/XANES/LiF
です。計算は、
基底状態 (A) のSCF計算 ( フォルダ名:scf_ground )
内殻電子励起状態 (B) のSCF計算 ( フォルダ名:scf_excited )
内殻電子励起状態 (B) のスペクトル計算 ( フォルダ名:eps_excited )
の順で行います。
スペクトル計算はk 点数を増やして行うことを推奨します。

図 5.93 (左) LiF結晶。(右)スペクトル
5.8.8. 四重極子成分 (バージョン2019.02以降)
5.8.8.1. 概要
XANESのスペクトル計算では、始状態iと終状態fの間の遷移モーメントを計算します。一般に、四極子成分は弱いことが多いですが、双極子極子遷移が禁止されているエネルギー領域に明瞭なピークを生じることがあります。この四重極成分の計算をPHASE/0で実行する方法を説明します。
5.8.8.2. 計算理論
遷移モーメントの計算
四重極まで含めた、始状態iと終状態fの間の遷移モーメントは
で表されます [Gougoussis09] 。\(\psi_i\) 及び \(\psi_f\) は、それぞれ始状態i及び終状態fの波動関数、\(\hat{\mathbf{\varepsilon}}\) 及び \(k\) は入射光の偏光ベクトル及び波数ベクトルです。\(D\) の第1項が双極子、第2項が四重極子成分に対応します。
ただし、PAW法では、波動関数が規格直交化されないため、は以下のように書き替えられます。
ここで、 \(\beta_{\mathbf{R},l'm'\tau'}^v\) 及び \(\beta_{\mathbf{R},nlm}^c\) は、それぞれ価電子及び内殻電子軌道へのプロジェクタです。また、 \(\phi_{\mathbf{R},l'm'\tau'}^v\) 及び \(\tilde{\phi}_{\mathbf{R},l'm'\tau'}^v\) は、それぞれ価電子軌道の全電子及び擬波動関数です。同様に、 \(\phi_{\mathbf{R},nlm}^c\) 及び \(\tilde{\phi}_{\mathbf{R},nlm}^c\) は、それぞれ内殻電子軌道の全電子及び擬波動関数です。
なお、XANESの計算は、始状態iとして、原子位置 (R0) 及び内殻電子軌道 (n,l) を指定して行います。さらに、この軌道は原子近傍に局在していることを考えると、結局、
を計算すればよいことがわかります [Gougoussis09] 。
スペクトル強度の計算
スペクトル強度は、
で与えられます [Cabaret10] 。ここで、 \(E_i\) 及び \(E_f\) は、始状態及び終状態の全エネルギー、 \(\hbar \omega\) は入射光のエネルギーです。(5.76) を用いれば、双極子及び四重極子成分は、それぞれ
となります。なお、E1及びE2は電気双極子、四重極子成分という意味です。
5.8.8.3. 入力
内殻電子励起前後の SCF 計算は済んでいるものとします。四重極子計算機能を利用するには、以下のような入力を作成します。影を付けた箇所が、本機能特有の項目です。sw_local_approx_trans_moment=on とすると、双極子成分に加えて四重極子成分を計算します。wave_vector では、入射光の波数ベクトルの方向を指定します。
四重極子成分を計算するための入力例
epsilon{
sw_epsilon = on
sw_corelevel_spectrum = on
sw_local_approx_trans_moment = on
probe{
atom_id = 2
orbital = 1s
}
photon{
polarization{
ux = 1, uy = 0, uz = 0
}
wave_vector{
kx = 0, ky = 0, kz = 1
}
energy_range{
e_low= -0.10, e_high=2.0, e_step=0.002
}
}
BZ_integration {
method = g !{parabolic(p)
width = 0.2 eV
}
fermi_energy{
read_efermi = on
efermi = 0.17409189
}
}
なお、fermi__energy ブロックは無くてもかまいませんが、このときは、必ず、内殻電子励起状態のSCF計算時に生成されたフェルミ準位ファイル名を file_names.data 内に明記する必要があります。
fermi_energy ブロックを用いない場合の file_names.dataの例
&fnames
(中略)
F_EFERMI = '../scf-final/nfefermi.data'
(中略)
/
5.8.8.4. 出力
双極子及び四重極子成分のスペクトルは、それぞれ、eps_E1_E1.data及びeps_E2_E2.data に出力されます。
eps_E1_E1.data の出力例
# Core level spectrum ( dipole-dipole )
# atom: 2, orbital: n = 1, l = 0
#
# Energy [eV] spectrum
#
(中略)
0.4968388438E+04 0.8211847200E-07
0.4968442860E+04 0.9903378493E-07
0.4968497283E+04 0.1147357290E-06
(後略)
eps_E2_E2.data の出力例
# Core level spectrum ( quadrupole-quadrupole )
# atom: 2, orbital: n = 1, l = 0
#
# Energy [eV] spectrum
#
(中略)
0.5008878978E+04 0.1286045986E-09
0.5008933400E+04 0.1328488558E-09
0.5008987823E+04 0.1279594782E-09
(後略)
5.8.8.5. 計算例
SrTiO3結晶の計算例を紹介します。入力ファイルは samples/XANES/SrTiO3
にあります。
まず、単位胞 (5原子) の格子定数を、k点: Monk(8×8×8) で最適化しa=3.923Åを得ましたた。これを各結晶軸方向に3倍したスーパーセル (135原子、a=11.769Å) を作成し、1つのTi原子の擬ポテンシャルを1sに内殻正孔を持つものに置き換えました。計算条件は以下の通。
cutoff_wf |
25 Ry |
cutoff_cd |
225 Ry |
k点サンプリング |
SCF: Monk (2×2×2) XANES: Monk (4×4×4) |
汎関数 |
PAW, GGAPBE |
擬ポテンシャル |
Sr_ggapbe_paw_02.pp Ti_ggapbe_paw_002_nocorehole.gncpp2 Ti_ggapbe_paw_005_1s_corehole.gncpp2 O_ggapbe_paw_02.pp |
スペクトルのブロードニング |
Gaussian, width = 0.5 eV |
また、偏光ベクトル、波数ベクトルの組み合わせとして、以下の2つを試しました。四重極子遷移において、aはt2g, bはeg 軌道成分をプローブします。
a |
b |
|
---|---|---|
偏光ベクトルEの方向 |
[100] |
[110] |
波数ベクトルkの方向 |
[010] |
[1-10] |
結果を以下に示します。 SrTiO3のd軌道は、t2gの方がeg軌道よりもエネルギーが低いため、四重極子遷移で最初にピークが現れるのは t2g 軌道をプローブするa の場合でです ( 図 5.94 参照)。図 5.95 は、吸収端近傍の拡大図です。
図 5.94 SrTiO3 のXANESスペクトル
図 5.95 SrTiO3 のXANESスペクトル拡大図。
5.8.9. 文献
- Gao08
-P. Gao, C. J. Pickard, M. C. Payne, J. Zhu, and J. Yuan, Phys. Rev. B 77 (2008) 115122.
- Gougoussis09(1,2)
Gougoussis, M. Calandra, A. P. Seitsonen, and F. Mauri, Phys. Rev. B 80 (2009) 075102.
- Cabaret10
Cabaret, A. Bordage, A. Juhin, M. Arfaoui, and E. Gaudry, Phys. Chem. Chem. Phys. 12 (2010) 5619.
5.9. 化学ポテンシャル一定のシミュレーション
5.9.1. 概要
PHASE/0による通常のシミュレーションでは,電子数一定の計算を行います。これに対し,化学ポテンシャル(フェルミエネルギー)を一定とし,構造最適化や分子動力学シミュレーション,NEB計算などを行う [Bonnet12] ことができる機能(constant-mu法)もPHASE/0には備わっています。この場合,電子数はシミュレーション中変化します。
5.9.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計算 の際に,終点のレプリカに与える電荷を指定します。 |
なお,本計算機能を使って(ジョブ1とする)得られた(中性でない)電荷を外部電荷としてあたえて通常の計算を行う(ジョブ2とする)場合,(ジョブ1において)与えたmuの値とは異なるフェルミエネルギーが(ジョブ2において)得られます。逆に,外部電荷を与えて通常の計算を行って(ジョブ3とする)得られたフェルミエネルギーをmuに指定して(ジョブ4によって)最適化を行うと,得られる電荷はもとの(ジョブ3における)外部電荷とは異なる電荷となります。このようにつじつまの合わない結果が得られるのは,中性でない電荷を与える場合は初期電荷の与え方が中性の場合と異なるので,エネルギーの原点が変化するためです。つじつまの合った結果を得るためには,外部電荷を与えた計算について以下のような設定を加え,初期電荷の計算方法を合わせるようにしてください。
accuracy{
...
sw_add_qex_to_initial_charge = off
...
}
5.9.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
...
...
5.9.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を実行すれば化学ポテンシャル一定の第一原理分子動力学シミュレーションを行うことが可能です。その結果,たとえば 図 5.96 に示すように電荷がシミュレーション中時々刻々と変化します。
図 5.96 分子動力学シミュレーション中の電荷の変化。
5.9.5. 使用上の注意
本計算機能は,すべての機能と組み合わせて利用することが可能ですが,本計算機能を利用すると電荷中性ではない計算を行うことになる点には注意が必要です。有効遮蔽体法(ESM法。5.3.6 章 参照)で境界条件をpe1(両側のESMが金属)とすると,隣り合う単位胞の相互作用の影響を取り除くこともできます。
5.9.6. 参考文献
- Bonnet12
Bonnet, T. Morishita, O. Sugino, and M. Otani, “First-Principles Molecular Dynamics at a Constant Electrode Potential”, Physical Review Letters 109 266101 (2012).
5.10. 有限電場計算機能 (バージョン2019.02以降)
5.10.1. 概要
有限電場計算機能とは,一様有限電場下において分極と電場のエネルギーを通常のエネルギーに加えた“エンタルピー”を極小化する計算機能です。この計算機能によって,印可した電場に対する応答としての巨視的な分極を求めることができます。得られた分極から誘電率を計算することや,有限電場下での原子に働く力よりボルン有効電荷を得ることも可能となっています。
5.10.2. 計算理論
一様有限電場下の計算は, [Souza02] において提案されている処方箋に従って行われます。一様電場下におけるエンタルピーを,以下のように定義します。
\(E_{\rm KS}\) が通常のコーン・シャムハミルトニアンから得られる全エネルギー,\(\Omega\) が単位胞の体積,\(\mathbf{P}_{\rm mac}\) が巨視的な電気分極,\(\mathbf{E}\) が一様有限電場です。\(\mathbf{P}_{\rm mac}\) はベリー位相分極理論から計算することができます。\(\mathbf{E}\) は入力パラメーターです。このエンタルピーを極小化するために必要な微分は下記のように計算できます。
\(\ket{u_{n\mathbf{k}}}\) が周期的な波動関数です。\(\mathbf{k}_+, \mathbf{k}_-\) は,逆格子ベクトルをbiとするとそれぞれk+bi/Ni , k-bi/Niです\(S_{mn}\left( \mathbf{k},\mathbf{k}' \right)\) は波動関数の重なりであり,\(\Braket{u_{m\mathbf{k}} | u_{n\mathbf{k}'}}\) と表すことができます。
このようにして計算された勾配を利用してエンタルピーを最適化すると,一様電場下での巨視的な分極 \(\mathbf{P}_{\rm mac}\) を計算することができます。この量から,さらに様々な誘電応答解析を実施することも可能です。たとえば,電場を印可した状態の分極から差分によって誘電率を得ることが可能です(微弱な電場 \(\delta E\) を与えた際に発生する分極 \(\delta P\) から,誘電率は \(\varepsilon = 1+4\pi \frac{\delta P}{\delta E}\) と計算することができる)。あるいは,有限電場下での原子に働く力から \(eZ = \frac{\delta F}{\delta E}\) という関係を用いてボルン電荷を得ることも可能です。
5.10.3. 入力
一様有限電場下の計算をPHASE/0で実行するには,controlブロックの下でsw_fef = onとすることによって一様有限電場機能を利用することを指定し,さらにaccuracyブロックの下のfefブロックの下のelectric_filedブロックにおいて電場を入力します。具体的には以下のように指定します。
control{
sw_fef = on
}
...
...
accuracy{
fef{
electric_field{
ex = 1e-5
ey = 1e-5
ez = 1e-5
}
}
}
...
...
変数ex, ey, ezによって電場のx, y, z成分を指定します。また,有限電場法を利用する場合はk点サンプリング手法に制限があります。以下のようにkshiftパラメーターをすべて0と設定してください(methodは無指定もしくはmonkとする)
ksampling{
kshift{ k1=0, k2=0, k3=0 }
}
5.10.4. 計算ソルバーについて
有限電場法においては利用可能な計算ソルバーに本質的な制限があります。これは,有限電場法は非周期的な項 ( \(\mathbf{P}_{\rm mac} \cdot \mathbf{E}\) )を追加するため,波動関数がハミルトニアンの固有状態ではなくなってしまうことに起因します。自由にユニタリ変換することができないため,たとえば部分空間対角化は利用できません(したがって部分空間対角化が必須であるDavidson系ソルバーはすべて利用不可です)。検証の結果「部分空間対角化を伴わないCG法」が最も収束の速い手法であることが分かったので,有限電場計算機能利用時はこのソルバーがデフォルトになります。
5.10.5. 出力
PHASEを実行すると,ログファイル(output000ファイル)には以下の要領で各SCFイテレーションにおける電気分極の情報が出力されます。
BP = 0.006502276 0.006502276 0.006502276
Pel = 0.000078647 0.000078647 0.000078647
Pion = 0.000000000 0.000000000 0.000000000
Pmac = 0.000078647 0.000078647 0.000078647
BP = の後にベリー位相が,Pelの後に分極の電子からの寄与が,Pionのあとに分極のイオンからの寄与が,Pmacに電子とイオンの分極の合計が出力されます。単位はすべて原子単位です。得られた分極から,誘電率やボルン電荷を以下の要領で計算することができます。
誘電率 \(\varepsilon = 1+4\pi \frac{\delta P}{\delta E}\)
ボルン電荷 \(eZ = \frac{\delta F}{\delta E}\)
5.10.6. 計算例
AlP結晶の計算を有限電場法および従来法で行いました。その入力ファイルは samples/FEF/AlP
にあります。8原子の系を採用しました。計算結果を以下にまとめます。
計算結果
物性値 |
計算結果 |
---|---|
電子分極 |
0.000050916 |
誘電率(有限電場法) |
7.40 |
誘電率(従来法) |
7.40 |
ボルン電荷(有限電場法) |
Al : 2.25, P : -2.27 |
ボルン電荷(従来法) |
Al : 2.227, P : -2.227 |
従来法とよく一致する結果が得られました。ボルン電荷の方も従来法とよく一致しています。有限電場法のボルン電荷の和がゼロになっていないのは,数値誤差によるものと考えられます。
5.10.7. 注意点
有限電場機能を利用する場合,まずは通常のSCF計算を実施し,収束した波動関数と電荷密度を得ておくことが推奨されます。したがって,計算の手続きは以下のようになります。
対象としたい系のSCF計算を行う。
有限電場計算用のディレクトリーを作成し,そこに1. で利用した入力ファイルと得られた波動関数データと電荷密度データをコピーする(ファイル名はそれぞれzaj.dataとnfchgt.data)
入力パラメーターファイルに有限電場計算用の入力の設定をほどこし,さらに初期波動関数・初期電荷密度はファイルから読み込むように設定する。具体的には下記のような記述を行う。
分極を収束させるためにはSCF計算の収束判定として通常よりも厳しいものを採用する必要があることが多いです。Pelの収束具合を確かめながら必要な収束判定条件を決めていくことが推奨されます。上述のようにinitial_wavefunctionsとinitial_charge_densityをfileに設定しておけばそれまでの計算の結果を読み込んで動作するので,それまで行った計算は無駄にはなりません。
原子間力の計算結果からボルン電荷を得ることができますが,この機能はノルム保存擬ポテンシャルのみ対応しています。ウルトラソフト擬ポテンシャルの場合に得られる原子間力は不正確なので利用しないでください。
5.10.8. 参考文献
- Souza02
Souza, J. Íñiguez and D. Vanderbilt, “First-Principles Approach to Insulators in Finite Electric Fields” Physical Review Letters vol. 89 (2002) pp. 117602 1-4.
5.11. 帯電欠損状態の評価 (バージョン2021.01以降)
5.11.1. 概要
PHASE/0 では、電荷非中性状態を計算する際、周期的境界条件によるエネルギー発散を抑えるために一様な背景電荷を考慮して処理しています。この処理により、全エネルギーは周期的境界条件による背景電荷間の相互作用を含んだ値となります。このため、例えば、帯電した原子欠損などを含む半導体の生成エネルギーは、実際の値とは異なるものとなります。これを補正する手法として、近年、FNV 法 [Freysoldt09] が注目されており、対応するプログラム( sxdefectalign , CoFFEE など) がいくつか公開されています。PHASE/0 2021年版以降、これらのプログラムに対するインターフェースが配備され、CUBE ファイル形式で出力することができるようになりました。また、これらのプログラムを利用せずに補正量を評価する仕組みも実装されています。さらに、異なる荷電状態間の生成エネルギーを比較した図を描画するためのPythonスクリプトが付属します。
5.11.2. 理論
電荷qをもつ欠陥 (D) の生成エネルギーは
で書けます。 \(E_{\rm DFT}^{\rm D, q}\) および \(E_{\rm DFT}^{\rm bulk}\) はDFT計算における全エネルギー値で、前者は帯電欠陥、後者は非帯電・無欠陥の完全結晶 (Pristine) に対応します。 \(n_i\) は完全結晶からの元素iの原子数の増減、 \(\mu_i\) はその化学ポテンシャルです。 \(E_{\rm VBM}\) は完全結晶の価電子帯上端のエネルギー、 \(E_{\rm corr}^q\) は帯電量に依存する補正項です。
5.11.2.1. FNV法
FNV法では、 \(E_{\rm corr}^{q}\) を2つの寄与に分けて考えます [Freysoldt09] 。
第1項は、孤立した点電荷qの静電エネルギーと、一様な背景電荷を加えて周期的境界条件を課した際の静電エネルギーの差です。
この値は、スーパーセルのサイズ・誘電率から、DFT計算とは無関係に決定されます。一方、第2項は、potential alignment 補正項で、静電ポテンシャルの差
を、欠陥から十分に離れた位置で評価した値です。ここで、 \(V_{\rm PC}^q\) は、静電エネルギー に対応する静電ポテンシャルです。
5.11.2.2. 外部解析プログラム
sxdefectalign、CoFFEEなどの解析プログラムは、以下の入力を要求します。
結果の位置情報
誘電率の値
\(V_{\rm DFT}^{D,q} \left( \mathbf{r} \right)\) や \(V_{\rm DFT}^{\rm bulk}\) の空間分布。たとえばCUBE形式。
出力されるのは以下の情報です。
\(E_{\rm PC}^q\) の値
\(\Delta V \left( \mathbf{r} \right)\) の値。各格子ベクトル方向に対するプロット。他の格子ベクトル方向については面平均をする。欠陥からの距離に対して、原子位置近傍で平均した値を出力することもある。
既知の問題として、以下が挙げられます。
sxdefectalign では、欠陥からの距離に対するプロットが正常に出力されないことがある。
CoFFEE では、各格子ベクトル方向に対するプロットも、ユーザーが python スクリプトを、都度書く必要がある。また、欠陥からの距離に対するプロットは得られない。
CoFFEE では、 \(E_{\rm PC}^q\) の値は、セルサイズを変えて複数計算し、fitting の結果として得る。このため、ユーザーの手間が多い。
5.11.2.3. extended FNV 法
Kumagaiら [Kumagai14] のextended FNV法では、 \(E_{\rm PC}^q\) は
で表されます。ここで、 \(\gamma\) は適当に選んだ収束パラメータです。また、 \(\varepsilon\) は誘電率テンソル、 \(\Omega\) は系の体積です。一方、ポテンシャル \(V_{\rm PC}^q\) は、
で表されます。ここで、 \(\mathbf{R}_d\) は欠陥の位置です。
\(V_{\rm far}\) の評価に関しては、以下の手順をとります。まず、各原子サイトにおける \(\Delta V\left( \mathbf{r} \right)\) を計算します。このうち、欠陥からの距離 \(R_{WS}\) より遠方にあるデータを平均し、 \(\Delta V_{\rm far}\) とします。なお、 \(R_{WS}\) は、欠陥間の最短距離の半分とします。 (5.85) , (5.86) による計算を用いることによってsxdefectalign, CoFFEEなどを用いずとも(自動的に) \(E_{\rm corr}^q\) の評価が可能です。
5.11.3. 使い方
5.11.3.1. 外部解析プログラムの使用
sxdefectalign や CoFFEE に受け渡す静電ポテンシャルを CUBE 形式で出力するには、入力パラメーターファイルを以下のように設定します。
postprocessing{
electrostatic_potential{
sw_write_electrostatic_pot = on
unit = Rydberg ! { Rydberg | Hartree | eV }
}
}
単位系は unit で指定し、Rydberg、Hartree、eV の選択が可能です。default 値は eV です。
結果はelectrostatic_pot.cubeファイルに出力されます。ヘッダー部に単位系が表示され、以降、各軸方向の分割数、メッシュの刻み幅、各メッシュ点における値と続きます。
Calculated by phase
Local+Hartree potential in Rydberg
215 0.0000 0.0000 0.0000
180 0.180912 0.000000 0.000000
180 0.000000 0.180912 0.000000
180 0.000000 0.000000 0.180912
33 33.000000 2.396007 2.396052 2.396080
(後略)
帯電欠陥、及び完全結晶の静電ポテンシャルを出力しておくようにします(sxdefectalignを利用する場合には、unitは Rydberg にしておく必要があります。)。以下に、これらのCUBEファイルを用いたsxdefectalign の実行例を示します。
sxdefectalign --charge 3 --eps 12.88
--vdef ../electrostatic_pot.cube --vref ../bulk/electrostatic_pot.cube
--center 0.0,0.0,0.0 --relative
--ecut 270 --qe > Log
系の帯電量を q としたとき、charge には -q を渡します。eps には誘電率の値を指定します。vdef及びvrefには、帯電欠陥及びバルクにおける静電ポテンシャルファイルを、それぞれ指定します。center には欠陥位置の内部座標を与えます。ecut には nfinp.data で指定した cutoff_cd を Ry 単位で渡します。
sxdefectalignのLog ファイルの末尾には、以下のような出力がされます。
Defect correction (eV): 0.828347 (incl. screening & alignment)
ここで表示されているのは、 値 ( 式 (5.83) 参照 )であり、potential alignment の寄与は含まれていません。
Logファイル以外には、 vline-eV-an.dat ( n=0, 1, 2 )
及び vAtoms.dat
が出力されます。前者は、式 (5.84) の各結晶軸方向に対する、ポテンシャルの1次元プロファイルを出力したものです。一方、後者は、各原子の欠陥位置からの距離、及び原子上でのポテンシャルの値を出力したものです。ただし、 vAtoms.dat
は正常に出力されないことが多々あるようです。
5.11.3.2. extended FNV 法
まず帯電なし・欠陥なしの bulk の計算を行います。入力パラメーターファイルは以下のように設定します。
postprocessing{
electrostatic_potential{
sw_write_electrostatic_pot = on
}
}
結果はelecpot_bin.data ファイルが出力されます。静電ポテンシャルのG空間での値をバイナリ形式で出力しているため、外部ソフトと連携することはできません。ファイル名は、F_ELECPOT_BINにより変更できます。
&fnames
F_ELECPOT_BIN = './elecpot_bin.data'
/
ついで帯電欠陥の計算を行います。入力パラメーターファイルは以下のように設定します。
postprocessing{
electrostatic_potential{
sw_write_electrostatic_pot = on
}
charged_defect{
correction{
sw_calc_extfnv_correction = on ! default : off
dielectric_constant{
exx = 12.88
eyy = 12.88
ezz = 12.88
}
position{
x = 0.0, y = 0.0, z = 0.0
}
}
}
}
charged_defect ブロック内の correction ブロックで、sw_calc_extfnv_correction = on を設定します。また、dielectric_constat ブロック内で誘電率テンソルの値、position ブロック内で欠陥の内部座標を指定します。欠損以外の場合には、内部座標ではなく、原子番号( atom_id )による指定も可能です (例:atom_id= 2 )。 さらに、参照する bulk の静電ポテンシャルファイル名をF_ELECPOT_BIN_REF で指定します。
&fnames
F_ELECPOT_BIN_REF = '../bulk/elecpot_bin.data'
F_ELECPOT_BIN = './elecpot_bin.data'
/
結果はdefect_pot_correction.direction_n ( n=1,2,3, )、defect_pot_correction.atomsに出力されます。前者は、式 (5.84) の各結晶軸方向に対する、ポテンシャルの1次元プロファイルを出力したものです。一方、後者は、各原子の欠陥位置からの距離、及び原子上でのポテンシャルの値を出力したものです。
以下に、defect_pot_correction.direction_1 の出力例を示します。
# dist. (Ang), pot_diff, Vpc, pot_diff -Vpc (eV)
0.00000 -0.13205 -0.03907 -0.09299
0.09573 -0.13743 -0.03902 -0.09841
(後略)
第2列及び第3列は、それぞれ式 (5.84) の \(V_{\rm DFT}^{D,q} \left( \mathbf{r} \right) - V_{\rm DFT}^{\rm bulk} \left( \mathbf{r} \right)\) 及び \(V_{\rm PC}^q \left( \mathbf{r} \right)\) に対応します。第4列は \(\Delta V \left( \mathbf{r} \right)\) に対応します。なお、符号については、電子の電荷が負であることを考慮しています。
以下に、defect_pot_correction.atoms の出力例を示します。
# no., dist. (Ang), pot_diff, Vpc, pot_diff -Vpc (eV)
1 2.1961 -0.0550653932 -0.2936706923 0.2386052991
2 3.9534 -0.1647261198 -0.1693351641 0.0046090443
(中略)
# Correction energy (eV): 0.7827480523
なお、最終行に表示されている “Correction energy” は、生成エネルギー図作成に必要な \(E_{\rm corr}^q\) です。
5.11.3.3. 生成エネルギー図の作成1
欠陥ごとの生成エネルギー図の作成方法を説明します。生成エネルギー図作成にはcalc_defect_formation_energy.pyスクリプトを用います。
平衡状態のとき、化学ポテンシャルは
を満たします。ここで、 \(\mu_{\rm Ga}^0\) 及び \(\mu_{\rm As}^0\) は、それぞれGa及びAs単体の1原子あたりのエネルギーです。また、 \(\mu_{\rm GaAs}^0\) は、GaAs 結晶の2原子あたりのエネルギーです。特に、Ga-rich 極限の場合は、
となり、As-rich 極限では
となります。これら化学ポテンシャルの情報は、以下で説明するcalc_defect_formation_energy.pyスクリプトの入力に記述する必要があるものです。
例えば、GaAs のスーパーセルの中にGa欠損を導入した計算を行い、帯電量 q =-3, -2, -1, 0 の計算結果が得られているとします。生成エネルギー図作成のために、以下のようなファイルを作成します。ファイル名に制限はありません。以下の例ではtmp1.in とします。
&VBM #(eV)
6.00887
&band_gap #(eV)
1.424
&Chemical_potentials #(Ha)
Ga -138.9838873703 # mu_GaAs_bulk -mu_As
As -87.9848825305
&Defects #elements, number ( negative==vacancy, positive==impurity )
Ga -1
&Host_supercell_energy #(Ha)
-7263.0006368270
&Defective_supercell_energy # charge_state(q) and energy (Ha)
-3 -7123.2688494462
-2 -7123.4909799361
-1 -7123.7111092854
0 -7123.9292947570
&Correction energy # charge_state(q) and energy (eV)
-3 1.1593520601
-2 0.6178614391
-1 0.2315198082
0 0.0
以下、用語の説明をします。
キーワード |
単位 |
意味 |
&VBM |
eV |
\(E_{\rm VBM}\) |
&band_gap |
eV |
バンドギャップ値 |
&Chemical_potentials |
Hartree |
化学ポテンシャル \(\mu_i\) 。系を構成する全元素について記述する。 |
&Defects |
導入した欠陥 |
|
&Host_supercell_energy |
Hartree |
|
&Defective_supercell_energy |
Hartree |
|
&Correction |
eV |
|
以下の要領でcalc_defect_formation_energy.pyスクリプトを実行します。
python3 calc_defect_formation_energy.py input
[-o OUTFILE]
[--emin EMIN] [--emax EMAX] [--de DE]
[--vmin VMIN] [--vmax VMAX]
[--image_format IMAGE_FORMAT]
括弧内は省略可能なオプションで、その意味は以下のとおりです。
引数 |
意味 |
デフォルト値 |
-o |
出力するファイルの名称 |
result |
--emin |
エネルギーEF の最小値 |
-1.0 |
--emax |
エネルギーEF の最大値 |
6.0 |
--de |
エネルギーEFの刻み幅 |
0.01 |
--vmin |
生成エネルギーの表示範囲の最小値 |
-5.0 |
--ymax |
生成エネルギーの表示範囲の最大値 |
5.0 |
--image_format |
可視化画像の形式 (png/eps) |
png |
実行例を以下に示します。
python3 calc_defect_formation_energy.py tmp1.in -o result1
上述のコマンドを実行した結果、生成されるファイルは result1.qdep、result1.min、result1.gnu、result1.png です。以下に、result1.qdep及びresult1.min の一部を示します。前者には、各帯電状態における生成エネルギーの、フェルミエネルギー依存性が出力されています。後者は、各フェルミエネルギー値における最小の生成エネルギー値が出力され、ファイル末尾に Charge Transition Level が追記されています。
result1.qdepファイルの内容
# Formation energy
# Ef (eV) q=-3 q=-2 q=-1 q=0
-1.00000 6.48430 4.90715 3.53961 2.37978
(後略)
result1.minファイルの内容
# Formation energy
# Ef (eV) min
-1.00000 2.37978
(中略)
6.00000 -14.51570
# Charge Transtion level [eV]
#-2/-3 0.57715
#-1/-2 0.36754
# 0/-1 0.15983
result1.gnu は可視化のための gnuplot 用ファイル、result1.png は gnuplot の出力です。
5.11.3.4. 生成エネルギー図の作成2
興味ある全ての欠陥構造について、 生成エネルギー図の作成1 の作業が終了しているものとします。ここでは、これらをまとめた図の作成を行うため、以下のようなファイルを作成します。ファイル名に制限はありません。以下の例ではgather1.in とします。
#
# title filename ( excluding ".min" )
#
&List
Vac_Ga Vacancy_Ga/result1
Vac_As Vacancy_As/result1
Ga_As Ga_for_As/resultaa
As_Ga As_for_Ga/resultaa
&band_gap #(eV)
1.424
以下、用語の説明をします。
ワード |
単位 |
意味 |
&List |
欠陥の名称、及び計算の出力( 生成エネルギー図の作成1 指定した outfile 名) |
|
&band_gap |
eV |
バンドギャップ値 |
以下の要領でplot_multiple_defect_formation_energy.pyスクリプトを実行します。
python3 plot_multiple_defect_formation_energy.py input
[-o OUTFILE]
[--emin EMIN] [--emax EMAX]
[--vmin VMIN] [--vmax VMAX]
[--image_format IMAGE_FORMAT]
[--keypos_h KEYPOS_H] [--keypos_v KEYPOS_V]
括弧内は省略可能なオプションで、その意味は以下のとおりです。なお、EMIN、EMAX値は、 生成エネルギー図の作成1 の指定と揃えた方がよいです。
引数 |
意味 |
デフォルト値 |
-o |
出力するファイルの名称 |
result_all |
--emin |
エネルギーEF の最小値 |
なし |
--emax |
エネルギーEF の最大値 |
なし |
--vmin |
生成エネルギーの表示範囲の最小値 |
なし |
--ymax |
生成エネルギーの表示範囲の最大値 |
なし |
--image_format |
可視化画像の形式 (png/eps) |
png |
--keypos_h |
凡例の水平位置 (left/center/right) |
right |
--keypos_v |
凡例の垂直位置 (top/center/bottom) |
top |
以下に実行例を示します。
python3 plot_multiple_defect_formation_energy.py gather1.in
実行するとresult_all.gnu 及び result_all.png が生成されます。前者は gnuplot 用ファイルで、後者はこれを可視化したものです。
5.11.4. 例題
5.11.4.1. 概要
GaAs 64 原子をホストとして、帯電欠陥の計算を行った例を紹介します。計算条件は以下の通りです。なお、GaAs の格子定数は、基本格子で最適化を行いました。補正エネルギーは、PHASE/0に実装されている extended FNV 法により評価しました。
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k 点サンプリング |
Monkhorst-Pack (2×2×2) |
交換相関相互作用 |
GGAPBE, PAW |
単位胞の1辺 [Å] |
11.48882 |
SCF 収束条件 |
[Ha/atom] 1.0E-8 |
力の収束条件 |
[Ha/bohr] 2.0E-4 |
擬ポテンシャル |
Ga_ggapbe_paw_02.pp, As_ggapbe_paw_02.pp |
(補正項の計算で使用する) |
誘電率 ※12.88 |
※ https://www.microwaves101.com/encyclopedias/gallium-arsenide
5.11.4.2. 例題のディレクトリー構成および計算のながれ
本例題は複数の計算を行い、その結果をとりまとめ、スクリプトで処理することによって結果が得られる仕組みになっています。ここではディレクトリーの構成と計算のながれについて説明します。
必要な入力ファイルはサンプルディレクトリーの下の samples/defectq
以下のサブディレクトリーに配置されています。以下のようなディレクトリー構成になっています。
defectq
以下には Preparation
ディレクトリーと GaAs_64_lattice_opt
ディレクトリーが存在します。
Preparationディレクトリー
GaAs_64_lattice_optディレクトリー
各種生成エネルギー計算の入力ファイルが格納されています。ベースとなる結晶は格子最適化によってもとまった格子定数から作成した64原子系です。GaAs_64_lattice_optディレクトリーは、さらに以下のようなサブディレクトリー群が存在します。
表 5.42 GaAs_64_lattice_opt以下のディレクトリー構成 ディレクトリー名
説明
Pristine
欠損のない結晶の入力ファイルが納められたディレクトリー。
Ga_for_As
AsをGaで置換した欠陥構造の入力ファイルが納められたディレクトリー。
As_for_Ga
GaをAsで置換した欠陥構造の入力ファイルが納められたディレクトリー。
As_interstitial_As4
Asが最近接原子となる位置に入り込んだAs interstitialの入力ファイルが納められたディレクトリー。
As_interstitial_Ga4
Gaが最近接原子となる位置に入り込んだAs interstitialの入力ファイルが納められたディレクトリー。
Ga_interstitial_As4
Asが最近接原子となる位置に入り込んだGa interstitialの入力ファイルが納められたディレクトリー。
Ga_interstitial_Ga4
Gaが最近接原子となる位置に入り込んだGa interstitialの入力ファイルが納められたディレクトリー。
それぞれのディレクトリーにはさらにq_ q ディレクトリーが存在します。ここで q は電荷をあらわす数値です。
Pristineの場合はq_0とq_0.2ディレクトリーが存在します。 \(E_{\rm VBM} = \frac{E\left( N \right) - E\left( N-\Delta N \right)}{\Delta N}\) (今の場合 \(\Delta N = 0.2\) )という関係から \(E_{\rm VBM}\) をもとめ、スクリプト入力の&VBMに記述します。またq_0のエネルギーをスクリプト入力の&Host_supercell_energyに記述します。
ほかの欠損に対応するディレクトリーでは、エネルギーの計算結果をスクリプト入力の&Defective_supercell_energyに記述します。また、q_0以外の計算ではextended FNV法による補正エネルギー \(E_{\rm corr}^q\) の計算がなされます。結果はdefect_pot_correction.atomsファイルの末尾に記録されるので、その計算値をスクリプト入力の&Correction に記述します (q=0の項には0を記述します)。
各欠損ディレクトリーにおいて calc_defect_formation_energy.py スクリプトの入力を作成し、実行することによって各欠損の生成エネルギー図を作成することができます。またすべての欠陥のデータを集約し 生成エネルギー図の作成2 の手続きをふむことによってすべての欠陥の結果をまとめた生成エネルギー図を作成することができます。
5.11.4.3. 補正エネルギー比較
以下に、Ga欠損 (q=-3) における補正エネルギーについて、sxdefectalign とPHASE/0実装のextentend FNV 法による評価の比較を示します。両者がおおよそ一致していることが分かります。
sxdefectalign |
PHASE/0 |
|
Epc |
1.24251 |
1.24272 |
dV |
-0.00731 |
-0.02779 |
Ecorr |
1.22058 |
1.15935 |
5.11.4.4. 生成エネルギー図の作成 1.
以下では、Ga欠損に対して、2つの極限における入力を作成し可視化します。以降、Ga-rich 極限及びAs-rich極限の入力を示します。
calc_defect_formation_energy.py 用の入力 ( Ga-rich 極限におけるGa欠損; samples/defectq/GaAs_64_lattice_opt/Vacancy_Ga/cond_Ga_rich.in
)
&VBM #(eV)
6.00887
&band_gap #(eV)
1.424
&Chemical_potentials #(Ha)
Ga -138.9586691142 #mu_Ga
As -88.0101007866 #mu_GaAs -mu_Ga
&Defects #elements, number ( negative==vacancy, positive==impurity )
Ga -1
&Host_supercell_energy #(Ha)
-7263.0006368270
&Defective_supercell_energy # charge_state(q) and energy (Ha)
-3 -7123.2688494462
-2 -7123.4909799361
-1 -7123.7111092854
0 -7123.9292947570
&Correction energy # charge_state(q) and energy (eV)
-3 1.1593520601
-2 0.6178614391
-1 0.2315198082
0 0.0
calc_defect_formation_energy.py 用の入力 ( As-rich 極限におけるGa欠損; samples/defectq/GaAs_64_lattice_opt/Vacancy_Ga/cond_As_rich.in
)
&VBM #(eV)
6.00887
&band_gap #(eV)
1.424
&Chemical_potentials #(Ha)
Ga -138.9838873703 # mu_GaAs_bulk -mu_As
As -87.9848825305 #mu_As
&Defects #elements, number ( negative==vacancy, positive==impurity )
Ga -1
&Host_supercell_energy #(Ha)
-7263.0006368270
&Defective_supercell_energy # charge_state(q) and energy (Ha)
-3 -7123.2688494462
-2 -7123.4909799361
-1 -7123.7111092854
0 -7123.9292947570
&Correction energy # charge_state(q) and energy (eV)
-3 1.1593520601
-2 0.6178614391
-1 0.2315198082
0 0.0
つぎのコマンドを実行すると、生成エネルギーの図 (result-Ga-rich.png及びresult-As-rich.png ) が出来ます。結果を 図 5.97, 図 5.98 に示します。
calc_defect_formation_energy.pyの実行 (Ga欠損)
python3 calc_defect_formation_energy.py
cond_Ga_rich.in -o result_Ga_rich --emin -0.5 --emax 2.0
python3 calc_defect_formation_energy.py
cond_As_rich.in -o result_As_rich --emin -0.5 --emax 2.0

図 5.97 Ga-rich limit (ファイル名:result-Ga-rich.png )

図 5.98 As-rich limit (ファイル名:result-As-rich.png )
5.11.4.5. 生成エネルギー図の作成 2.
以下で、種々の欠陥構造に対する生成エネルギーをまとめた図を作成します。Ga-rich 及びAs-rich 極限のファイルが、それぞれ、 samples/defectq/GaAs_64_lattice_opt
の下の gather_Ga_rich.in
及び gather_As_rich.in
にあります。後者は、つぎに紹介する入力のresult-Ga-rich を result-As-rich に置換したものです。 なお、欠陥の種類としては、文献 [Broberg18] 記載のものを選択しました。
gather_Ga_rich.inの内容
#
# title filename ( excluding ".min" )
#
&List
Vac_Ga Vacancy_Ga/result-Ga-rich
Vac_As Vacancy_As/result-Ga-rich
Ga_As Ga_for_As/result-Ga-rich
As_Ga As_for_Ga/result-Ga-rich
Ga_i_As4 Ga_interstitial_As4/result-Ga-rich
As_i_As4 As_interstitial_As4/result-Ga-rich
Ga_i_Ga4 Ga_interstitial_Ga4/result-Ga-rich
As_i_Ga4 As_interstitial_Ga4/result-Ga-rich
&band_gap #(eV)
1.424
つぎのコマンドを実行すると、生成エネルギーの図 (results-Ga-rich.png及びresults-As-rich.png) が出来ます。結果を 図 5.99 および 図 5.100 に示します。
python3 plot_multiple_defect_formation_energy.py
gather_Ga_rich.in -o results_Ga_rich --emin -0.2 --emax 2.0 --vmin -4.0 --vmax 5.0
--keypos_h left --keypos_v bottom
python3 plot_multiple_defect_formation_energy.py
gather_As_rich.in -o results_As_rich --emin -0.2 --emax 2.0 --vmin -4.0 --vmax 5.0
--keypos_h left --keypos_v bottom

図 5.99 Ga-rich limit (ファイル名:results-Ga-rich.png)

図 5.100 As-rich limit (ファイル名:results-As-rich.png)
文献 [Broberg18] と同様の生成エネルギー図が得られました (生成エネルギーの絶対値や Charge Transition Level は、完全には一致しません)。
- Freysoldt09(1,2)
C. Freysoldt, J. Neugebauer, and C. G. Van de Walle, Phys. Rev. Lett. 102 (2009) 016402.
- Kumagai14
Y. Kumagai and F. Oba, Phys. Rev. B 89 (2014) 195205.
- Broberg18(1,2)
D. Broberg, B. Medasani, N. Zimmermann, A. Canning, M. Haranczyk, M. Asta, and G. Hautier,, Comput. Phys. Commun. 226 (2018) 165.
5.12. 高精度な局所状態密度 (バージョン2021.01以降)
5.12.1. 概要
原子分割局所状態密度とは,空間を原子ごとの領域に分割し,その領域における電子状態密度をもとめる計算機能です。積算状態密度のフェルミエネルギーにおける値を調べることによって,対象原子の電子数をもとめるという用途に用いることも可能です。
原子分割局所状態密度は,波動関数および電荷密度の実空間におけるFFTメッシュを空間上で最も近い原子に割り当て,その寄与分を加算することによって計算します。このような方法の場合,実空間のFFTメッシュと原子位置の関係によって対称性から等価な原子間でも割り当たるメッシュ数などが異なり,結果が微妙に異なる場合があります。言い換えると,原子配置を単位胞に対してどのように定義するかによって計算結果が変化します。たとえば,対称性から等価なはずの原子の電子数が互いに異なる値となってしまう場合があります。この振る舞いを改善するため,2021年版以降電荷密度の割り当てを実空間FFTメッシュではなく原子中心メッシュに切り替えて評価する方法を用いることができます。このようにするとメッシュは常に同じように各原子に割り当てられるため,原子配置を単位胞に対してどう定義するかによって結果が左右されなくなります。原子中心メッシュは原子ごとに定義され,その値は実空間FFTメッシュ上の値の三次元線形補間によって求められます。
5.12.2. 使い方
原子中心メッシュによる局所状態密度計算の指定は,postprocessingブロックにおけるldosブロックにおいて行います。以下のような指定を行います。
postprocessing{
dos{
sw_dos = on
method = t
}
ldos{
sw_aldos = on
aldos{
sw_atom_centered_mesh = on
atom_centered_mesh_factor = 1
}
}
}
postprocessingブロックにdosブロックを作ると,全状態密度の設定を行うことができます。局所状態密度の計算の基本設定は全状態にならう形式になっているので,ここでの設定は局所状態密度にもあてはまります。ldosブロックにおいて局所状態密度計算の設定を,さらにその下のaldosブロックにおいて原子分割局所状態密度計算の設定を行います。aldosブロックにおいて新たに利用できるようになった設定項目は下記の通り。
sw_atom_centered_meshもしくはsw_ac_mesh : onとすることによって,原子分割局所状態密度計算のメッシュが実空間FFTメッシュから原子中心メッシュに切り替わります。デフォルト値はoff.
atom_centered_mesh_factorもしくはac_mesh_factor : 原子中心メッシュはデフォルトの振る舞いではその“濃さ”は実空間FFTメッシュと同じですが,ここで指定する係数分増やすことも可能です。たとえば2とすると,3方向のメッシュ数がそれぞれ2倍となります。その結果計算量は8倍となる点は注意が必要です。デフォルト値は1.
5.12.3. 例題
Si結晶およびグラファイトの例題がサンプルディレクトリーの samples/dos_band/aldos_by_acmesh
以下にあります。Si結晶の例題はディレクトリーSi2以下,グラファイトの例題はディレクトリーgraphite以下に配置されており,それぞれ acmesh
と fftmesh
フォルダーが存在し,前者が原子中心メッシュを用いた局所状態密度計算,後者がFFTメッシュを用いた局所状態密度計算の入力ファイルが格納されています。
いずれの結晶も,精度の高い結果が得られるよう比較的大きなカットオフエネルギー(80 Rydberg)を採用しています。また,精密な状態密度を得るため四面体法を用いる設定を施しています。すなわち,入力パラメーターファイルには以下のような設定が施されています。
accuracy{
cutoff_wf = 80 rydberg
...
ksampling{
method = mesh
...
}
smearing{
method = t
}
}
それぞれの最下層のディレクトリーにおいて計算を実行すると,SCF計算のあと状態密度の計算が行われ,結果がdos.dataファイルに記録されます。原子分割局所状態密度の計算結果は ALDOS num_atom = aid
という文字列からはじまる行以降に記録されます。ここで aid
は原子のIDで,各原子の入力ファイルにおける定義順に対応します。各原子の電子数はフェルミエネルギーにおける積算状態密度の値です。
dos.dataファイルは(スピンを考慮していない場合)4カラム目のデータがフェルミエネルギーを原点としたエネルギー,6カラム目が積算状態密度に対応するので,4カラム目が0となる行の6カラム目の値がその原子の電子数に対応することになります。たとえば以下のようなデータがdos.dataに記録されている場合,1番目の原子の電子数はおおよそ3.9803となります。
...
...
ALDOS num_atom = 1
No. E(hr.) dos(hr.) E(eV) dos(eV) sum
6 -0.33730 0.0000000000 -11.955933 0.0000000000 0.0000000000
16 -0.33630 0.0000000000 -11.928722 0.0000000000 0.0000000000
...
...
4366 0.09870 0.6019928210 -0.091764 0.0221228201 3.9797782305
4376 0.09970 0.2103606325 -0.064553 0.0077306078 3.9801773503
4386 0.10070 0.0555466368 -0.037342 0.0020413005 3.9802911964
4396 0.10170 0.0056133904 -0.010130 0.0002062882 3.9803167566
4406 0.10270 0.0000000000 0.017081 0.0000000000 3.9803179066
4416 0.10370 0.0000000000 0.044293 0.0000000000 3.9803179066
...
...
以下,この例題によって得られるSi結晶およびグラファイトのある原子の電子数を報告します。
Si, fftmesh |
Si, acmesh |
C, fftmesh |
C, acmesh |
3.9803 |
4.0000 |
4.0537 |
3.9992 |
いずれの例題もすべての原子は対称性から等価なため,電子数としては4という値が得られるはずです。 表の値から明らかなように,原子中心メッシュともにFFTメッシュの結果よりも正しい解に近い結果が得られています。
5.13. 高精度なXPS計算 (バージョン2021.01以降)
5.13.1. 概要
2020年版までのPHASE/0 では、XPS・XANES のピーク位置が実験値と異なることがありました。原因として、内殻電子の相対論的効果、スピン分裂効果が考えられます。前者については、CIAO を改変し相対論的効果を含む (DIRAC型の) 運動エネルギーを出力可能なようにしました。後者については、PHASE/0 のopencore 法を改変し、その効果を取り込めるようにしました。これによって、SiC、AlN、Li7Ti5O12 結晶の内殻軌道の結合エネルギーについて、従来法に比べて実験値との差が小さくなることなどを確認しています。
5.13.2. 理論
5.13.2.1. 相対論的運動エネルギー
Kohn-Sham 方程式は、
で表されます。 \(T\) 及び \(V\) はそれぞれ、運動エネルギー及びポテンシャル演算子、また \(\varepsilon_i\) 及び \(\psi_i\) は固有値・固有波動関数です。ここで、運動エネルギー演算子は、相対論的効果の取り入れ方により、いくつかの形状が提案されています [Lenthe96] 。
\(T^{\rm NR}\) は非相対論、 \(T^{\rm ZORA}\) はZORA (Zero Order Regular Approximation)、 \(T^{\rm DIRAC}\) はDirac相対論によるものです。ZORAの場合は、scalar relativistic 項とスピン軌道相互作用項に分解できます。
Dirac の場合、上式にて \(V\) を \(V-\varepsilon_i\) と読み替えればよく、
となります。 ただし、擬ポテンシャル作成時はscalar-relativisitic で解く必要があり、スピン軌道相互作用による効果は考慮されません。このため、CIAO が擬ポテンシャルファイルに出力する、内殻電子の運動エネルギーは scalar-relativisitic 項のみで評価します。
さて、内殻電子の運動エネルギーは
で表されます。上記は DIRAC の場合ですが、ZORA の場合も同様です。 最後に、CIAOではポテンシャルは球対称として扱うので、波動関数は動径方向成分のみをもちます。このため、運動エネルギー演算子は以下のように展開できます。
5.13.2.2. 内殻電子のスピン
CIAOでは、擬ポテンシャルはスピン中性で作成します。内殻電子についても同様であり、この時の内殻電子密度を \(\rho_{\rm core}\) とします。ここで、ある軌道 (n,l) におけるスピン占有数 \(f_{n,l}^{\uparrow}\) 及び \(f_{n,l}^{\downarrow}\) が変わり、 \(f_{n,l}^{\uparrow} \neq f_{n,l}^{\downarrow}\) になったとします。ただし、 \(f_{n,l}^{\uparrow} + f_{n,l}^{\downarrow}\) は擬ポテンシャル作成時と同じであるとします。このとき。各スピンの内殻電子密度は以下のように表されます。
ここで、
はスピン密度の差で、波動関数 \(\phi_{n,l}^{\rm AE}\) はスピン状態により不変と仮定しています。 このスピン密度変化により影響を受けるエネルギーは、交換相関相互作用 (XC) エネルギー
です。第1項は非PAW項、第2、3項はPAW由来の項です。なお、スピン密度の和は不変であるので、Hartreeポテンシャルは変更を受けません。よって、XC ポテンシャルのみ \(\Delta \rho \left( r \right)\) を考慮します。
5.13.2.3. XPSのピークエネルギーの計算方法
非金属の固体のXPSにおけるピークエネルギーは、以下の結合エネルギー \(E_{\rm B}\) に対応します [Ozaki17] 。
ここで、 \(N\) は系の電子数です。 \(\mu_0\) は系の化学ポテンシャルで、gapのある系では、価電子帯上端 (VBM) から伝導体下端 (CBM) まで取りえます。特に、真性半導体では、バンドギャップを \(E_g\) として、
となります。なお、VBMのエネルギー \(E_{\rm VBM}\) は
で計算できます。また、帯電状態を周期的境界条件で計算するので、その補正法の1つとして、式 (5.82) の ( q =1 ) を加えることもできます。
一方、系が金属の場合には、
となります。
なお、固体ではなく分子の場合は、
となります。
5.13.3. 使い方
5.13.3.1. 相対論的運動エネルギー
相対論的運動エネルギーを出力するためのCIAOの入力は下記の通り。
# PAW
sw_paw 1
# CORE ELECTRON INFO
sw_with_dipole_cor2val 1
method_ekin_core 1 ! default:0 (非相対論), 1:DIRAC, 2: ZORA
method_ekin_core 1 或いは 2 で、内殻電子の相対論的運動エネルギーを出力します。なお、”sw_with_dipole_cor2val 1” は、これまでと同様、内殻電子のXPS・XANES計算には必須です。
“method_ekin_core 1”の場合の3つのスイッチの設定は、以下の入力でも可能です。
sw_write_core_full 1
結果はgncpp2ファイル(擬ポテンシャルファイル)に出力されます。
CORE ENERGY CONTRIB
0.319190836204E+02 kin ! 内殻電子の運動エネルギー
-0.677766126155E+02 ion
0.697542582590E+01 hartr
5.13.3.2. 内殻電子のスピン
ある原子の内殻電子が励起された状態を考える場合、該当する軌道に正孔を入れた擬ポテンシャルを使う必要があります。例えば、1s軌道励起の場合は 1s 軌道に正孔、2p軌道励起の場合は2p軌道に正孔を入れます。 これらの原子は、内殻電子は開殻となるので、スピン自由度をもちます。内殻電子のスピンを扱うには、sw_opencore = on とします。デフォルトでは、式 (5.98) の全項でスピンを考慮しますが、sw_xc_opencore_ae_only = onとすると、第3項 (AE部分)のみ考慮します。 価電子が磁気モーメントをもつ磁性材料では、spin_orientation の指定により、内殻電子と (原子近傍の) 価電子の磁気モーメントの向きを、平行・半平行のいずれかに指定できます。ただし、SCF iteration で価電子の磁気モーメントが反転したりすると、内殻電子も追随するため、収束性が悪くなる場合があります。そこで、sw_fix_core_spin_pol = onとすると、初期磁気モーメントの向きに固定することが出来ます。
内殻電子のスピンを考慮するための入力例。
accuracy{
paw = on
core_electrons{
sw_opencore = on ! default :off
sw_xc_opencore_ae_only = on ! default :off
spin_orientation = anti_parallel ! anti_parallel or parallel (default)
sw_fix_core_spin_pol = on ! default: off
}
}
postprocessing{
corelevels{
sw_calc_core_energy = on ! XPS 計算に必要
}
}
また、s軌道以外から励起する場合には、内殻電子のスピン軌道相互作用により、XPSのピークが2つに分裂します。例えば、2p軌道の場合には、2p1/2と2p3/2 に分裂します。この場合、以下のようにすると、両者の全エネルギー値を計算することが出来ます。
内殻電子準位のスピン軌道分裂を考慮するための入力例。
postprocessing{
corelevels{
sw_calc_core_energy = on
corehole{
atom_id = 1 ! 励起する原子
orbital = 2p ! 励起する軌道
}
}
}
(内殻電子のエネルギーを含む) 系の全エネルギーは、core_energy.data に出力されます。sw_calc_core_energy = onとした場合には、core_energy.data 末尾に、スピン軌道分裂したエネルギー値が追記されます。 (5.99) (5.102) (5.104) などの結合ネルギーの計算における \(E_{\rm final}\) や \(E_{\rm initial}\) はここに記録された値を利用します。
core_energy.dataの出力例
# Etotal (Core+Valence)
-18558.3245482622
# Etotal (Core+Valence+Soc_corehole)
# J = 3/2: -18558.3331659845
# J = 1/2: -18558.3073128174
5.13.4. 例題
例題の計算結果を紹介します。XPSの例題は samples/XPS
ディレクトリーに配置されています。用いる擬ポテンシャルは 相対論的運動エネルギー において説明したsw_write_core_full の値を1として作成した擬ポテンシャルで、それぞれの例題のpseudoサブディレクトリーに配置されています。
5.13.4.1. 4H-SiC結晶 (C 1s)
4H-SiC結晶の例は samples/XPS/4H-SiC
以下に配置されています。そのディレクトリー構成は下記の通りです。
第一階層 |
第二階層 |
説明 |
Final |
終状態の入力ファイル |
|
q_0_no_opencore |
中性・内殻スピンなし |
|
q_0_with_opencore |
中性・内殻スピンあり |
|
q_1_no_opencore |
電荷+1・内殻スピンなし |
|
q_1_with_opencore |
電荷+1・内殻スピンあり |
|
Initial |
初期状態の入力ファイル |
|
q_0 |
中性 |
|
q_0.2 |
電荷+0.2 |
|
q_0.5 |
電荷+0.5 |
|
q_1 |
電荷+1 |
計算条件は以下のとおりです。なお、スーパーセルの格子定数は、自動最適化により得られた値 ( a = 3.108 Å、c= 10.170 Å )を \(3 \times 3 \times 3\) 倍しました。
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k 点サンプリング |
Monkhorst-Pack 2×2×2 |
交換相関相互作用 |
GGAPBE, PAW |
SCF 収束条件 [Ha/atom] |
1.0E-8 |
内殻電子のスピン |
sw_xc_opencore_ae_only = on |
CIAOの入力 |
sw_write_core_full 1 |
(補正項計算で使用する)誘電率 |
※9.76 (ab面内), 10.32 (c軸) |
※https://onlinelibrary.wiley.com/doi/pdf/10.1002/9781118313534.app3
計算結果は以下の通りです。
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
\(E_{\rm final} (N-1) - E_{\rm initial} (N)\) |
279.258 |
272.309 |
\(E_{\rm corr}^1\) |
0.237 |
0.237 |
\(E_{\rm VBM}\) ( \(\Delta N=0.2\)) |
9.307 |
|
\(E_g\) |
2.435 |
|
\(E_{\rm B}\) |
289.975 |
283.026 |
実験値 |
283 +/- 0.8 a) |
a) http://www.xpsfitting.com/2012/01/silicon.html
内殻電子のスピンを考慮することにより、実験値に近い結合エネルギーが得られています。 なお、式 (5.103) を用いた場合、 \(E_{\rm B}\) は以下のようになりました。
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
|
290.815 |
283.864 |
5.13.4.2. w-AlN 結晶 (N 1s)
w-AlN結晶 (N 1s) の例は samples/XPS/w-AlN
以下に配置されています。そのディレクトリー構成は下記の通りです。
第一階層 |
第二階層 |
説明 |
Final_N1s |
終状態の入力ファイル |
|
q_0_no_opencore |
中性・内殻スピンなし |
|
q_0_with_opencore |
中性・内殻スピンあり |
|
q_1_no_opencore |
電荷+1・内殻スピンなし |
|
q_1_with_opencore |
電荷+1・内殻スピンあり |
|
Initial |
初期状態の入力ファイル |
|
q_0 |
中性 |
|
q_0.2 |
電荷+0.2 |
|
q_0.5 |
電荷+0.5 |
|
q_1 |
電荷+1 |
計算条件は以下のとおりです。なお、スーパーセルの格子定数は、自動最適化により得られた値 ( a = 3.140 Å、c= 5.040 Å ) \(3 \times 3 \times 2\) 倍しました。
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k 点サンプリング |
Monkhorst-Pack 2×2×2 |
交換相関相互作用 |
GGAPBE, PAW |
SCF 収束条件 [Ha/atom] |
1.0E-8 |
内殻電子のスピン |
sw_xc_opencore_ae_only = on |
CIAOの入力 |
sw_write_core_full 1 |
(補正項計算で使用する)誘電率 |
※8.23 (ab面内), 9.74 (c軸) |
※https://materialsproject.org/materials/mp-661/
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
\(E_{\rm final} (N-1) - E_{\rm initial} (N)\) |
395.772 |
387.703 |
\(E_{\rm corr}^1\) |
0.310 |
0.310 |
\(E_{\rm VBM}\) ( \(\Delta N=0.2\)) |
6.735 |
|
\(E_g\) |
4.404 |
|
\(E_{\rm B}\) |
405.019 |
396.550 |
実験値 |
397.4 a) |
a) [Mahmood03]
内殻電子のスピンを考慮することにより、実験値に近い結合エネルギーが得られています。 なお、式 (5.103) を用いた場合、 \(E_{\rm B}\) は以下のようになりました。
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
|
406.976 |
398.889 |
5.13.4.3. w-AlN 結晶 (Al 2p3/2)
w-AlN結晶 (Al 2p3/2) の例は samples/XPS/w-AlN
以下に配置されています。そのディレクトリー構成は下記の通りです。
第一階層 |
第二階層 |
説明 |
Final_Al2p |
終状態の入力ファイル |
|
q_0_no_opencore |
中性・内殻スピンなし |
|
q_0_with_opencore |
中性・内殻スピンあり |
|
q_1_no_opencore |
電荷+1・内殻スピンなし |
|
q_1_with_opencore |
電荷+1・内殻スピンあり |
|
Initial |
初期状態の入力ファイル |
|
q_0 |
中性 |
|
q_0.2 |
電荷+0.2 |
|
q_0.5 |
電荷+0.5 |
|
q_1 |
電荷+1 |
計算条件は以下のとおりです。なお、スーパーセルの格子定数は、自動最適化により得られた値 ( a = 3.140 Å、c= 5.040 Å ) \(3 \times 3 \times 2\) 倍しました。
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k 点サンプリング |
Monkhorst-Pack 2×2×2 |
交換相関相互作用 |
GGAPBE, PAW |
SCF 収束条件 [Ha/atom] |
1.0E-8 |
内殻電子のスピン |
sw_xc_opencore_ae_only = on |
CIAOの入力 |
sw_write_core_full 1 |
(補正項計算で使用する)誘電率 |
※8.23 (ab面内), 9.74 (c軸) |
※https://materialsproject.org/materials/mp-661/
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
\(E_{\rm final} (N-1) - E_{\rm initial} (N)\) |
64.980 |
64.212 |
\(E_{\rm corr}^1\) |
0.327 |
0.327 |
\(E_{\rm VBM}\) ( \(\Delta N=0.2\)) |
6.735 |
|
\(E_g\) |
4.404 |
|
\(E_{\rm B}\) |
74.244 |
73.476 |
実験値 |
73.3 a) |
a) [Mahmood03]
内殻電子のスピンを考慮することにより、実験値に近い結合エネルギーが得られています。 なお、式 (5.103) を用いた場合、 \(E_{\rm B}\) は以下のようになりました。
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
|
76.221 |
75.446 |
5.13.4.4. fcc Pt結晶 (Pt 4f)
fcc PtN結晶 (Pt 4f) の例は samples/XPS/Pt
以下に配置されています。そのディレクトリー構成は下記の通りです。
第一階層 |
第二階層 |
説明 |
Final |
終状態の入力ファイル |
|
q_0_no_opencore |
中性・内殻スピンなし |
|
q_0_with_opencore |
中性・内殻スピンあり |
|
Initial |
初期状態の入力ファイル |
|
q_0 |
中性 |
計算条件は以下のとおりです。なお、スーパーセルの格子定数は、自動最適化により得られた値 ( a = 3.963 Å )を \(2 \times 2 \times 2\) 倍しました。
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k 点サンプリング |
Monkhorst-Pack 2×2×2 |
交換相関相互作用 |
GGAPBE, PAW |
SCF 収束条件 [Ha/atom] |
1.0E-8 |
内殻電子のスピン |
sw_xc_opencore_ae_only = on |
CIAOの入力 |
sw_write_core_full 1 |
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
\(E_{\rm B}\) |
70.673 |
70.380 |
実験値 |
71 a) |
a) http://techdb.podzone.net/xps/index.cgi?element=Pt
内殻電子のスピン考慮なし |
内殻電子のスピン考慮あり |
|
\(E_{\rm B}\) |
74.333 |
74.040 |
実験値 |
71 a) |
a) http://techdb.podzone.net/xps/index.cgi?element=Pt
なお、CIAOにおいて内殻電子の運動エネルギーを非相対論で評価した擬ポテンシャルを用いた場合、4f 軌道の結合エネルギー ( 4f7/2 と 4f5/2 の重みつき平均 ) は 83.052 eV となり、実験値と離れてしまいます。
5.13.4.5. O 2 分子 (O 1s)
第一階層 |
説明 |
final_spin_antiparallel |
終状態・スピン反平行 |
final_spin_parallel |
終状態・スピン平行 |
initial |
始状態 |
計算条件は以下のとおりです。
平面波カットオフ [Ry] |
30.0 |
電荷密度カットオフ [Ry] |
270.0 |
k 点サンプリング |
|
交換相関相互作用 |
GGAPBE, PAW |
単位胞の1辺 [Å] |
14.0 |
SCF 収束条件 [Ha/atom] |
1.0E-8 |
内殻電子のスピン |
sw_xc_opencore_ae_only = on |
CIAOの入力 |
sw_write_core_full 1 |
(補正後計算で使用する)誘電率 |
※1.00 |
※真空中
S=1/2 |
S=3/2 |
|
spin orientationの指定 |
anti parallel |
parallel |
|
542.000 |
541.297 |
|
1.436 |
1.439 |
|
543.436 |
542.736 |
実験値 a) |
544.2 |
543.1 |
a) https://t-ozaki.issp.u-tokyo.ac.jp/vps_pao_core2019/O/index.html and references therein.
2つのスピン状態とも、実験値に近い値が得られました。
5.14. 機械学習によるニューラルネットワークポテンシャルの作成 (バージョン2021.01以降)
5.14.1. 概要
ニューラルネットワークポテンシャルとは,凝縮系のポテンシャルエネルギー表面を近似することのできる学習モデルです [Behler07] 。その学習は,PHASE/0などの第一原理計算の結果を教師データとして行われます。PHASE/0には,ænet [Artrith16] や n2p2 [Singraber19] などのソフトウェアと連携し,ニューラルネットワークポテンシャルを作成することができる機能が備わっています。
5.14.2. 使い方
5.14.2.1. 教師データの作成
以下に説明するような手続きによって,n2p2およびænetの教師データとして用いることのできるデータを出力することができます。
入力パラメーターファイルに以下のような設定を施します。
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で利用できる形式,allを指定するとXSFとn2p2形式双方が出力されます。frequencyによってサンプリングの頻度を指定します。このパラメーターのデフォルト値は100です。ファイル名のデフォルト値は,n2p2がinput.data, XSFがnfdynm xxxxx .xsfです。ここで xxxxx はMDステップ数です。n2p2は学習データが一つのファイルに記録されるのに対し,ænetはスナップショット1つにつき1つのXSFが必要です。
file_names.dataファイルにおいては,n2p2およびXSF形式のファイルのファイル名を指定することができます。デフォルト値はそれぞれinput.dataおよびnfdynm xxxxx .xsfです。
ファイルポインター |
説明 |
---|---|
F_N2P2 |
n2p2の教師データの出力先。デフォルト値はinput.data |
F_XSF |
ænetの教師データの出力先。ここで指定した文字列の 拡張子に相当する部分の直前にMDのイテレーション数が 付加されたファイル名が採用される。 デフォルト値はnfdynm.xsf |
5.14.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という収束判定条件が採用されます。
5.14.2.3. 教師データの形式
教師データのファイル形式について説明します。
input.n2p2ファイル
input.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 ... endbeginとendの間に1つのデータが記録されます。commentから始まる行でコメントを記述できます。latticeから始まる行で格子ベクトルの指定を行います。atomから始まる行で原子の情報を記述します。2カラム目から4カラム目に原子のxyz座標を指定し,5カラム目に元素名を指定します。6, 7カラム目は未使用領域ですが,適当な数値を記述する必要があります。8カラム目から10カラム目で原子間力を指定します。原子間力は学習に直接利用されるわけではありませんが,結果得られる機械学習ポテンシャルから得られる原子間力との差を評価し,誤差を推測する,という使われ方がなされる場合があります。energyから始まる行でエネルギーを指定します。chargeから始まる行で系の総電荷を指定します。ただしcharge指定による情報は現バージョンのn2p2では利用されないようです。利用される単位は単位はエネルギーがeV, 距離がÅ, 原子間力がeV/Åです。
n2p2の入力として利用するには,データはinput.dataというファイルに記録されている必要があります。複数のディレクトリーにまたがって行った計算の結果を活用したい場合,これらをcatコマンドとリダイレクトなどを利用して一つのファイルにまとめる必要があります。
$ cat A/input.data > input.data $ cat B/input.data >> input.data $ cat C/input.data >> 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/Åです。
5.14.3. ニューラルネットワークポテンシャル作成例
ここでは,\(\alpha\) Quartz結晶を例に,ニューラルネットワークポテンシャルの作成方法について説明します。
5.14.3.1. 用いた結晶
六方晶の \(\alpha\) Quartz結晶を直方晶に取り直し,さらに a 軸と c 軸をそれぞれ2倍とするスーパーセルを作成しました。合計72原子の系です。その初期配置は 図 5.101 に示す通り。

図 5.101 72原子 \(\alpha\) Quartz結晶
5.14.3.2. 第一原理計算
図 5.101 の結晶を初期構造として,温度500K, 800K, 1200Kで定温の第一原理計算分子動力学シミュレーションを実施しました。入力ファイルと教師データのアーカイブはサンプルディレクトリーの下のnnp/SiO2/fpmd以下のサブディレクトリーにあります。温度以外の主要な計算条件は下記の通り。
計算条件 |
値 |
カットオフエネルギー |
25 Rydberg |
|
|
収束判定条件 |
1e-9 hartree |
サンプリング頻度 |
10 MDステップに一度 |
総MDステップ数 |
10000 |
教師データ出力 |
XSF形式 |
このシミュレーションにおいてはサンプリング頻度が10 MDステップに一度と比較的高いため,収束判定条件を切り替える機能は用いていません。
5.14.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に組み込んでください。
5.14.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
)にコピーします。
5.14.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など)のファイルに出力されます。
5.14.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
...
...
図 5.102 にpredict.xで計算したエネルギーと第一原理計算によって得られたエネルギーをプロットした図を示します。この図では,完全な学習ができていた場合はすべての点が斜め45度の直線にのります。学習が完璧であることはないので直線からのバラつきはあるものの,直線からの乖離は原子あたりおおむね1 meV以下であり,よく学習できていることが分かります。
図 5.102 第一原理計算とニューラルネットワークポテンシャルによって得られるエネルギーの比較
5.14.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で用いられる形式で準備します。
図 5.103 に,ニューラルネットワークポテンシャルとPHASE/0による500Kおよび800Kにおける \(\alpha\) Quartzの分子動力学シミュレーションのトラジェクトリーから得られた二体分布関数および結合角分布関数を比較した結果を示します。図 5.103 より,得られたニューラルネットワークポテンシャルは第一原理計算の結果をよく再現するものであることが分かります。
図 5.103 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.