応用機能

解析機能

ストレステンソル

機能の概要

PHASEには、ストレステンソルを計算する機能があります。ストレステンソルを計算することにより、安定な格子定数や弾性定数を計算することができます。

入力パラメータ

ストレステンソルを計算するには、入力パラメータファイル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

ストレステンソルは

\[\begin{split}\begin{pmatrix} X_{x} & X_{y} & X_{z} \\ Y_{x} & Y_{y} & Y_{z} \\ Z_{x} & Z_{y} & Z_{z} \\ \end{pmatrix}\end{split}\]

の形式で出力されています。出力されている値の単位は [Hartree/Bohr3] です。 上の結果では入力データとしてわずかに格子定数を小さく取ってあるため、正の \(X_{x},Y_{y},Z_{z}\) が出力されています。

また、釣り合いの位置からの格子変形(\(\equiv e\))、スティフネス定数(\(\equiv c\))を用いると次のようなフックの法則が成り立ちます。

\[\begin{split}\left. \ \begin{matrix} X_{x} = c_{11}e_{\text{xx}} + c_{12}e_{\text{yy}} + c_{12}e_{\text{zz}} \\ Y_{y} = c_{12}e_{\text{xx}} + c_{11}e_{\text{yy}} + c_{12}e_{\text{zz}} \\ Z_{z} = c_{12}e_{\text{xx}} + c_{12}e_{\text{yy}} + c_{11}e_{\text{zz}} \\ X_{y}( = Y_{x}) = c_{44}e_{\text{xy}} \\ Y_{z}( = Z_{y}) = c_{44}e_{\text{yz}} \\ Z_{x}( = X_{z}) = c_{44}e_{\text{zx}} \\ \end{matrix} \right\}\end{split}\]

弾性定数

ストレステンソルの計算結果から、弾性定数の計算を行う例を紹介します。弾性定数は、歪みのない結晶と歪みのある結晶のストレステンソルを利用すると、上述のフックの法則より計算することができます。ここでは、Si(立方晶)を例に説明します。この例題の入力ファイルは、 samples/elastic/Sis0 および 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}\)を次式から計算します。

\[\begin{split}\left. \ \begin{matrix} X_{x} = c_{11}e_{\text{xx}} + c_{12}e_{\text{yy}} + c_{12}e_{\text{zz}} \\ Y_{y} = c_{12}e_{\text{xx}} + c_{11}e_{\text{yy}} + c_{12}e_{\text{zz}} \\ Z_{z} = c_{12}e_{\text{xx}} + c_{12}e_{\text{yy}} + c_{11}e_{\text{zz}} \\ X_{y}( = Y_{x}) = c_{44}e_{\text{xy}} \\ Y_{z}( = Z_{y}) = c_{44}e_{\text{yz}} \\ Z_{x}( = X_{z}) = c_{44}e_{\text{zx}} \\ \end{matrix} \right\}\end{split}\]

今のケースでは\(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)\) と書けます。

\[\begin{split}\left. \ \begin{matrix} Y = \frac{c_{11}^{2} + c_{11}c_{12} - 2c_{12}^{2}}{c_{11} + c_{12}} \\ P = \left| \frac{c_{12}}{c_{11} + c_{12}} \right| \\ B = \frac{c_{11} + 2c_{12}}{3} \\ \end{matrix} \right\}\end{split}\]

これにスティフネス定数\(c_{11}\), \(c_{12}\)を代入すれば Siの弾性定数は \(Y = 123 \ \mathrm{GPa}, P=0.268, B=88.4 \ \mathrm{GPa}\) と求まります。

より精度の高い弾性定数の計算を行ないたい場合、 cutoff_wf, cutoff_cdを大きめにとり、電子状態を充分に収束させる必要があり、計算時間のかかる計算になります。

ストレステンソルの補正

PHASE/0によるストレステンソルの計算は,精度が低い場合があります。原因は,“格子がひずむことによる平面波数の変化の効果”がとりいれられていないからです。この効果を取り入れることによって,ある程度補正を行うことが可能です。

  • 方法1.

運動エネルギーの計算におけるGベクトルの高周波成分をスメアすることによって,“平面波数一定”の状況を“カットオフエネルギー一定”の状況に近づけることができます。 [Bernasconi95] では,運動エネルギーの高周波成分を以下のように置き換えることが提案されています。

\[G^2 \rightarrow G^2 + A \left[ 1 + \mathrm{erf}\left(\frac{\frac{1}{2}G^2-E_0}{\sigma}\right) \right]\]

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}\) は以下のように見積もることができます。

\[\sigma_{\mathrm e} = - \left( \frac{2 E_{\mathrm c}}{3V} \right) \times \left( \frac{\Delta E_{\mathrm t}}{\Delta E_{\mathrm c}} \right)\]

この補正を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).

局所状態密度と部分電荷密度

機能の概要

計算した電子状態を解析するため状態密度や電子密度を描きますが,複雑な物質になると 解析が困難になります。 原子領域の状態密度を求めることにより,結合状態の解析が可能となります。積層構造や界面構造の場合に層毎の状態密度を計算すると,積層による電子状態の変化の解析や界面状態の同定ができます。固有エネルギーがあるエネルギー範囲に収まる電子状態からなる部分電荷密度を計算すると,それらの電子状態の分布が明瞭に分かります。原子分割と層分割の局所状態密度と部分電荷密度の計算の仕方を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に設定して構造緩和を行いません。

原子分割局所状態密度

原子分割の局所状態密度を計算するにはタグ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の原子分割局所状態密度にそれぞれの原子の特徴を見ることができます。

../_images/image9.svg

BaO/Si(001)界面構造の原子分割の局所状態密度。上のパネル:Si層中央のSiの局所状態密度。中央のパネル:BaO層中央のBaの局所状態密度。下のパネル:BaO層中央のOの局所状態密度。

層分割局所状態密度

層分割の局所状態密度を計算するにはタグ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 に示します。

../_images/image10.svg

BaO/Si(001)界面構造の層分割局所状態密度。一番上のパネル:Si層の中央領域の局所状態密度。上から二番目のパネル:BaO/Si(001)界面のSi側の局所状態密度。中央のパネル:BaO/Si(001)界面の酸素あたりの局所状態密度。下から二番目のパネル:BaO/Si(001)界面のBaO側の局所状態密度。一番下のパネル:BaO層の中央領域の局所状態密度。

部分電荷密度

部分電荷密度を計算するにはタグ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 に示します。

../_images/image11.svg

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)に示します。

../_images/image12.png

Si (100)面のSTM像,(a) 占有状態の像,(b)非占有状態の像。

ウルトラソフト型擬ポテンシャルを利用している場合の高速化

ウルトラソフト擬ポテンシャルを利用して局所状態密度計算する場合,非常に多くの計算時間がかかってしまうことがあります。これは欠損電荷の計算に時間がかかってしまうからなのですが,この計算を実空間で行うことによって高速化を実現することができます。欠損電荷の計算を実空間で行うには,以下のような設定を行います。

Postprocessing{
  dos{
    sw_dos = on
  }
  ldos{
    sw_rspace = on
    sw_aldos = on
    sw_layerdos = on
    aldos{
      ...
      ...
    }
    layerdos{
      ...
      ...
    }
  }
}

ldosブロックで変数sw_rspaceを定義し,その値をonとすれば欠損電荷の計算を実空間で行わせることができます。

射影状態密度

PHASEには,軌道ごとに射影した状態密度を計算する機能もあります。ここでは,射影状態密度を計算する方法を紹介します。

入力パラメータ

射影状態密度を計算するには,射影したい軌道の設定を以下のように指定します。

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ブロックにおける指定に従います。

計算結果の出力

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 に変更したものとなります。

計算例: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 に示します。

../_images/image14.svg

BaTiO3 結晶の全状態密度

../_images/image15.svg

Ti のd 軌道の射影状態密度

射影バンド構造(バージョン2020.01以降)

機能の概要

射影状態密度 (PDOS) を求めるとき、SCFにおける各波動関数に対してprojectorで指定した原子軌道への射影を行います。同様の処理をバンド計算で得られた各波動関数に対して行うことにより、その射影成分を出力することができます。軌道射影バンド計算では、各波動関数に対して原子軌道への射影を行い、その(重み)成分をファイルに出力します。このとき、原子軌道の球面調和関数部分は空間に固定されたもので、化学結合の方向には依りません。化学結合の方向を考慮するには、軌道占有行列を対角化し、その固有ベクトルを係数とした原子軌道の線形結合を用います。ただし、軌道占有行列はバンド計算では得られないため、事前にSCF計算を行っておく必要があります。

 対角化して得られた原子軌道を使用するか否かは、ユーザー指定のスイッチにより切り替えることができます。可視化については band.pl と同様に、gnuplot の描画機能を用いるperlスクリプトが付属します。このスクリプトを用いると、射影した軌道の成分を、明暗などによりバンド分散上にマップすることができます。

使い方

入力パラメーター

  1. 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
  }
}
  1. バンド計算

 軌道射影バンドの計算は固定電荷モードで行います。各波動関数の軌道射影成分をファイルに出力するには、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
  }
}

出力

  1. SCF計算

F_PORB_DENS_MATで指定したファイル (デフォルト名:porb_density_matrix.data ) に、占有行列がバイナリ形式で出力されます。

  1. バンド計算

 F_WFK_ORB_PROJ で指定したファイル (デフォルト名:wfn_orb_proj.data ) に、各波動関数の軌道射影成分がテキスト形式で出力されます。key は、表 5‑2のkey値が対応する。また、score_bond は、軌道が広がる方向に原子が存在するか否かを判定した値です。ここで、m番目の軌道のscore_bondは、

\[{\rm score\_bond(m)} = \frac{1}{4\pi} \frac{1}{2l+1} \sum_{i}^{\rm neighbor} \left| \sum_{m=1}^{2l+1} c_{m'm}^l Y_{lm'} \left(\Theta_i, \phi_i \right) \right|^2\]

で定義します。例えば、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ファイルの指定は必須です。

band-orbital-proj.plのオプション

オプション

意味

デフォルト値

-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

例題

射影バンド構造の計算例を紹介します。入力(と出力の一部)は 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 にブリルアンゾーン及び対称点を示します。

MoS2/WS2 PBANDの計算条件

波動関数カットオフ [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

MoS2 / WS2 PBAND計算で使用した射影軌道

原子タイプ

射影した軌道 (プロジェクタのカットオフ)

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)

MoS2 / WS2 PBAND計算におけるpostprocessingブロックの指定

SCF計算

なし

バンド計算

wf_orb_projection{ sw_calc_wf_orb_projection = on }

../_images/image17.png

(左)MoS2 / WS2 構造。(右)ブリルアンゾーン及び対称点。

図 5.8 図 5.9 に MoS2 及び WS2ユニットに対するPBAND を示します。ここでは、s, p, d 軌道全成分を合計して表示しています。表 5.5 に、図 5.8 に使用したコマンドを示します。

../_images/image19.png

MoS2構造のPBAND

../_images/image20.png

WS2構造のPBAND

図 5.8 作成に使用したコマンド

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 成分のプロットを示します。

NiO PBANDの計算条件

波動関数カットオフ [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

NiO PBAND計算における postprocessing ブロックの指定

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

}

../_images/image21.png

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

../_images/image22.png

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

図 5.8 作成に使用したコマンド 図 5.10 図 5.11 作成に使用したコマンド

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

ワニエ関数

機能の概要

電子状態は結晶全体に広がったブロッホ波と呼ばれる波として表されます。ブロッホ波をk空間に関してフーリ エ変換することにより得られる局在した関数をワニエ関数と呼びます。ワニエ関数の中心位置は電子分布の平均 位置を表すため,その和から結晶の分極を容易に知ることができます。また,ワニエ関数の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 結晶の結合が共有結合であることを示しています。

../_images/image23.png

Si 結晶(a)とGaAs 結晶(b)の最大局在ワニエ関数

期待しない局所極小に収束してしまうことがありますが,sw_random_wannier をON にしてランダムな状態から計算を始めることでこの問題が解決できることがあります。

Postprocessing{
    wannier{
        ...
        sw_randomize = ON
        ...
    }
}

また,収束が不十分な状態で計算が終了しているようでしたら,sw_continue をON にして計算を継続してください。

Postprocessing{
    wannier{
        ...
        sw_continue = ON
        ...
    }
}

Wannier90を用いたワニエ関数解析

機能の概要

Wannier90プログラム(http://www.wannier.org/) と連携することによってワニエ関数を出力することも可能です。Wannier90プログラムと連携することによって,PHASEに組み込まれたワニエ関数解析機能では実施することのできない,以下の計算を行うことが可能です。

  • Γ点だけでなく,一般のk点サンプリングでワニエ関数を出力することが可能

  • ワニエ補間により,バンド構造を得ることが可能

  • ワニエ補間により,フェルミ面や逆空間における等エネルギー面の描画が可能

ここでは,PHASEをWannier90と連携させて上記のような計算を行う方法を説明します。本機能を利用する場合は,上述のウェブサイトからWannier90プログラムを入手し,コンパイル作業を行っておいてください。

計算方法

Wannier90と連携して解析を行うには,以下のような処理を行います。Wannier90の入力ファイル作成方法は,Wannier90のユーザーマニュアルを参照してください。

  1. Wannier90の入力データを作成します。ファイル名はseedname.winとします。seednameは任意の文字列で,系の名前などを指定します。

  2. Wannier90を,以下のように“プリプロセスモード”で実行します。

% wannier90.x -pp seedname

この作業によって,Wannier90が必要とするデータの情報を記録したファイルが作成されます。このファイルの情報をもとにPHASEの入力ファイルを作成します。

  1. PHASEの入力パラメータファイルを作成します。格子定数やk点サンプリングをWannier90の入力に合わせて編集します。その具体例は例題において紹介します。さらに,postprocessingブロックに以下を追記します。

postprocessing{
  wannier{
    seedname = "seedname"
    sw_wannier90 = on
    nb_wan90 = wannier90で利用するバンド数
  }
}

変数seednameに上述のseednameを二重引用符で指定します。sw_wannier90onとすることによってWannier90が必要とするファイルを出力することができます。nb_wan90には,Wannier90で利用するバンド数を指定します。PHASEのバンド数以下の数値にする必要があります。

  1. PHASEを通常通り実行します。その結果,Wannier90が必要とする行列要素データや固有値データの記録されたファイルが得られます。ただし,Wannier90が利用するデータの出力は非並列計算で行う必要があるので,並列計算をしたい場合はひとまずsw_wannier90をoffとして計算を収束させたあとにsw_wannier90をonとし,非並列の継続計算でWannier90用の出力を行います。

  2. 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で可視化した図を示します。

../_images/image24.png

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 に示します。

../_images/image25.png

GaAs結晶の伝導体下端の等エネルギー面

使用上の注意

  • ワニエ関数出力は,非並列計算で行う必要があります。並列計算を行う場合はひとまずsw_wannier90offとして計算を収束させたあとにsw_wannier90onとし,非並列の継続計算でWannier90用の出力を行ってください。

  • 本機能で利用できる擬ポテンシャルは,ノルム保存型のみです。

XPS解析

機能の概要

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}}\)

()\[E_{\text{kin}} = h\nu - W - (E_{F} - E_{c})\]

となります。 ここで,\(W\)は仕事関数,\(E_{F}\)はFermi準位,\(E_{c}\)は内殻準位です。 一般に結晶表面では電子のしみ出しによる電気二重層が形成されるため, 内殻電子の感じるポテンシャルは表面から外側になればなるほど浅くなります。そのため,内殻準位も表面では浅くなります。この関係を模式的に示したのが 図 5.15 です。 その他,化学結合にともない原子のポテンシャルが上下するので, 内殻準位はこれに連動した効果も受ける。 この2つの効果のため内殻エネルギー準位\(E_{c}\)は原子により異なる値をとります。 内殻準位シフトの実験では,表面から十分内部に入ったバルク位置 の原子による内殻準位を基準にして表面付近の化学結合が異なる原子の内殻準位の エネルギーの差を測定することにより,表面付近の原子の化学結合状態や構造を推定します。

../_images/image26.svg

光電子放出過程のエネルギープロファイル:図の右側が結晶表面,左側がバルクである。Fermi準位\(\mathbf{E}_{\mathbf{F}}\)は一定であるのに対して,内殻準位\(\mathbf{E}_{\mathbf{c}}\)は原子により異なり,表面付近ではバルクにくらべて内殻準位が浅くなる。

さて,内殻準位シフトを第一原理計算するためには,(5.1) によれば 個々の原子の内殻準位\(E_{c}\)を計算します。 このエネルギー値\(E_{c}\)は内殻電子も扱う全電子計算を行えば直ちに得られますが, 価電子のみを扱う擬ポテンシャル法からは得られません。 この理由から,擬ポテンシャル法では計算できないと思われますが,この問題を見事に解決したのがSchefflerのグループ [Pehlke93] です。 Schefflerらは 図 5.16 に示したように, 始状態(initial state)と終状態(final state)の違いに着目しています。

../_images/image27.svg

光電子放出過程の始状態と終状態:(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}}\)はそれぞれ異なるが, 始状態が同一ということから,終状態の系の全エネルギーも同じ値にならなければ ならないという次の重要な関係式が導かれます。

()\[E_{\rm{kin}}\left(\rm{I}\right)+E_{\rm{tot}}\left(\rm{I}\right) = E_{\rm{kin}}\left(\rm{II}\right) + E_{\rm{tot}}\left(\rm{II}\right)\]

内殻準位シフト\(\Delta E_{\text{kin}}\)を次式で定義します。

()\[\Delta E_{\text{kin}} \equiv E_{\text{kin}}(\rm{II}) - E_{\text{kin}}(\rm{I})\]

ゆえに,(5.2) を用いれば

()\[\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) により

()\[\Delta E_{\text{kin}} = \Delta E_{c}\]

が成り立つので,(5.4) と比較して

()\[\Delta E_{c} = - \Delta E_{\text{tot}} (6)\]

が導かれます。

../_images/image28.svg

内殻光電子放出のスペクトル

実験的に得られる情報を模式的に表すと 図 5.17 に示したようなスペクトルです。 ここでは,電子間クーロン相互作用によるオージェ過程は考えません。 横軸は光電子の運動エネルギー\(E_{\text{kin}}\),縦軸は光電子数(強度)です。 また,横軸は内殻準位の結合エネルギー\(E_{\text{bind}}\)とみることもできて,この場合は左側ほど結合が強くなっています。 結晶バルクからの光電子スペクトルは赤色で示したように\(E_{\text{kin}}(I)\)に唯一のピークをもちます。 これに対して,結晶表面付近からの光電子スペクトルは青色で示したようにいくつかの ピーク\(E_{\text{kin}}(II)\)に分かれます。 各ピークの強度はそのピークに関係した原子数の比から定まります。 電気二重層の効果のためピーク位置は通常右側にずれます。 光電子は結晶内部の非弾性散乱でエネルギーを失うので,バルクのピークは結晶表面から せいぜい数nm程度の深さの原子によるものであることを注意してください。 計算できるものは,バルク位置からピーク位置のずれと 各ピークの相対的な強度です。

内殻正孔を含む原子の擬ポテンシャル

第一原理擬ポテンシャルバンド計算法では,内殻電子状態を凍結させ,価電子状態を 自己無撞着に計算します。そのためバンド計算の段階では内殻に正孔を生じさせることができません。そのかわり内殻正孔を含む擬ポテンシャルを作成することは可能です。 Schefflerら [Pehlke93] は,光電子放出時に生成された内殻正孔はまわりの電子によりすみやかに遮蔽(screening)されるものと仮定しました。しかし,格子を変形させるだけの 時間はないとしています。また,電子はドープされた不純物から無尽蔵に補給される,すなわちFermi面は不純物準位にピンニングされる,と考えて電気的に中性が保たれているものとしています。これらの仮定により計算されたスペクトルは実験結果とよく一致しています。

以上の考え方に従えば,内殻正孔を含む原子の擬ポテンシャルを次のように作成します。 例えば\(2p\)準位に内殻正孔を含むシリコン原子の場合,

  1. 14個の電子からなる\((1s)^{2}(2s)^{2}(2p)^{6}(3s)^{2}(3p)^{2}\)の電子配置の 中性シリコン原子において,\(2p\)準位の電子1個を\(3p\)準位に移動して \((1s)^{2}(2s)^{2}(2p)^{5}(3s)^{2}(3p)^{3}\)とした励起状態の中性シリコン原子を考える

  2. その原子の全電子計算を自己無撞着におこなう

  3. 価電子として\((3s)^{2}(3p)^{3}\)の5個の電子をはがしてイオン化する

  4. このようにして,内殻正孔を有し5価にイオン化したシリコン原子の擬ポテンシャルができる

とします。 これは 図 5.18 の2つの終状態(final state)のうち 右側のscreened hole(遮蔽正孔)に対応します。

スカラー相対論での擬ポテンシャル計算では,内殻準位のスピン軌道分裂は考慮せず 縮重度に対して重み平均をとったものを内殻準位とします。 内殻準位のシフト量の計算では,この仮定により結果は変わりません。

../_images/image29.svg

Si原子の電子配置:左図は基底状態の電子配置,右図は内殻正孔が生じた場合の終状態の電子配置である。

計算の実行方法

内殻正孔を含む原子の擬ポテンシャルを用いて内殻準位シフトを バンド計算します。

バンド計算は次のように行います。

  1. シリコン表面の座標を作成し,通常のシリコン擬ポテンシャルを用いて 各原子に力が働かなくなるまで十分に格子緩和させる

  2. その座標を用いて,原子1個を内殻正孔を含む擬ポテンシャルに置き換えて 全エネルギーを計算する

  3. すべての原子に対して順番に置き換えて全エネルギーを計算する

  4. バルク位置の原子を決めて,これを基準にして他の配置の全エネルギーの差をとり,運動エネルギーのシフト量を計算する

  5. 強度を含めたスペクトルとして表示する

計算例:Si(100)表面

Si(100)表面のモデル

まずはじめに,Si(100) \(p(2 \times 2)\)再構成表面のモデルを作成します。 Si(100)表面はダングリングボンド数を減らすためダイマー構造をとり, それらのダイマーは列方向に交互に傾くこと(バックリング)で安定化することが知られています。 この時,バックリングに連動してダイマーの低い方から高い方に電子が移動します。 実験的にはSi(100) \(c(4 \times 2)\)構造が安定となるが,計算ではバックリングの性質が 似通った\(p(2 \times 2)\)構造を扱います。この方が計算量を減らせるからです。 この仮定はSchefflerら [Pehlke93] と同様です。

../_images/image30.svg

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のピーク位置が異なったと考えられます。

../_images/image32.svg

SCLSの運動エネルギー:それぞれ青丸はunscreened,赤丸はscreenedの内殻正孔擬ポテンシャルを用いた結果である。赤丸はSchefflerと同じ方法である。縦軸は光電子の運動エネルギー(単位はeV)のバルクからのずれである。この場合,バルクを\(\mathbf{3}_{\mathbf{u}}\)位置の原子にとっている。

Schefflerらの論文 [Pehlke93] にある結果と比較するために,図 5.21 に表面から3層までの原子によるSCLSを表示します。 縦軸は強度であり,各強度は原子数の比をとっています。 上から順に,unscreened,screenedの各計算値,実験値を示しています。 実験値はLandemarkら [Landemark92] によるものです。

../_images/image33.svg

SCLSの強度:縦軸はSCLSの強度であり,各強度は原子数の比をとっている。上から順に,unscreened,screenedの各計算値,実験値を表示した。実験値はLandemarkら [Landemark92] によるものである。実験に合うのはscreenedである。XPS用の内殻正孔擬ポテンシャルはscreenedで作成しなければならない。

図 5.21 の計算結果は実験結果 [Landemark92] をよく再現し, また,Schefflerらの論文の結果 [Pehlke93] に一致しています。 実験に合うのはscreenedであることがわかります。 このため,XPS用の内殻正孔擬ポテンシャルはscreenedで作成しなければなりません。

参考文献

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

仕事関数

機能の概要

PHASEを利用して,仕事関数を評価することが可能です。ここでは,仕事関数を計算する方法を説明します。

第一原理計算の枠組み内における仕事関数とは,真空準位とフェルミエネルギーとの差です。真空準位は,表面のSCF計算を実施し,表面から十分に離れた箇所での局所ポテンシャルを利用して算出することができます。

入力パラメータ

仕事関数を計算するためには,表面のモデルを準備する必要があります。対象としたい系の,対象としたい面

方位をもつ表面モデルを用意します。さらに,入力データの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 を実行します。計算が収束した後に,必要な局所ポテンシャル

データなどが出力されます。すでに収束した計算に対する継続計算として実行することも可能です。

計算の実行方法

計算が終了した段階では,局所ポテンシャルのデータが逆空間のデータとして保存されます。仕事関数を得るた

めには,逆空間のデータを実空間へ逆フーリエ変換し,表面内で平均を計算しその結果を出力する必要がありま

す。このような処理を行うプログラムが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 です。

計算結果の出力

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 ファイルも作成されます。

計算例:アルミニウムの仕事関数

アルミニウムの仕事関数の計算例を紹介します。サンプルデータは, samples/surface/workfunc/Al です。

利用する系は,Al (111) 7 層の表面モデルです。表面に垂直な軸はc 軸とします。c 軸の長さは,50 Å としました。アルミニウム(111) 面はほとんど再構成しないので,構造最適化は施しませんでした。原点を中心に,反転対称性が存在するようにモデルを作成しました。また,交換相関相互作用は局所ポテンシャルに含めない設定で計算を行いました。アルミニウムの表面モデルを 図 5.22 に示します。

../_images/image34.png

Al(111)面7層モデル

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

../_images/image35.png

表面に垂直な距離と局所ポテンシャルの関係

陽電子寿命解析

機能の概要

電子の反粒子である陽電子は、電子と同じ質量を持ち、正の電荷を持ちます。陽電子は電子と対消滅し、\(\gamma\)線を放出します。この陽電子消滅の現象を利用して、結晶の品質や、欠陥の研究が可能です。 ここで、陽電子消滅実験から有用な情報を引き出すのに、第一原理計算に基づいて陽電子寿命を予測し、実験結果と比較することが重要です。PHASEには、完全結晶における陽電子寿命を予測する機能があります。

陽電子寿命解析、以下の手順で計算を行います。

  1. はじめに 通常の電子状態計算(バンド計算)を実行します。PHASEには、擬ポテンシャル・平面波法が実装されているので、この手法に基づいて計算を行います。バンド計算により、価電子の電荷密度 \(\rho_{v}\)が得られます。全電子の電荷密度は次式で与えられます。

    ()\[\rho_{e} = \rho_{v} + \rho_{c}\]

    ここで、\(\rho_{c}\)は、コア 電子の電荷密度です。CIAOで作成し公開されている擬ポテンシャル のデータファイルには、自由な原子におけるコア電子の電荷密度の 情報が含まれています。このデータを読み込み (5.7) を評価します。

  2. 陽電子波 動関数\(\psi_{+}\)は次式で与えられます(原子単位)。

    ()\[\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\)点に属します。この波動関数を平面波によって展開します。

    ()\[\psi_{+} = \sum_{\overrightarrow{G}} C_{\overrightarrow{G}} \exp \left( i\overrightarrow{G} \cdot \overrightarrow{r} \right)\]

    ここで、逆格子周期ベクトル\(\overrightarrow{G}\)の和を有限に抑えるため、平面波の運動エネルギーの上限を設定します。

  3. 陽電子密度を求めます。

    ()\[\rho_{p}\left( \overrightarrow{r} \right) = \left| \psi_{+} \right|^{2}\]
  4. 電子及び陽電子の 電荷密度を用いて、下記の式を評価し、陽電子寿命を計算します。

    ()\[\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では、上式の評価において、下記の近似を用いています。

    ()\[\rho_{e}\Gamma\left( \rho_{e} \right) \cong \rho_{v}\Gamma\left( \rho_{v} \right) + \rho_{c}\Gamma\left( \rho_{c} \right)\]

    この近似が成り立つためには、 価電子とコア電子の分布の重なりが小さいことが条件となります。

本計算では、電子・陽電子間の相関に対して、局所密度近似を用いています。すなわち、相関ポテンシャルと増大因子は、均一な電子ガス中に陽電子が1個ある場合に計算された結果をもとに、電子密度の関数として与えられます。増大因子に関しては、次式が提案されています [Puska95]

()\[\Gamma = 1 + 1.23r_{s} + 0.9889r_{s}^{3/2} - 1.482r_{s}^{2} + 0.3956_{s}^{5/2} + r_{s}^{3}/6\]

ここで、\(\frac{4\pi}{3}r_{s}^{3} = 1/\rho_{e}\)です。また、ギャップのある系、すなわち誘電体においては、金属よりも電子のスクリーニング効果が小さいため、次の補正を行う事を推奨します [Puska91] , [Nakamoto08]

()\[\Gamma = 1 + 1.23r_{s} + 0.9889r_{s}^{3/2} - 1.482r_{s}^{2} + 0.3956_{s}^{5/2} + \left( 1 - 1/\varepsilon_{\text{ele}} \right)r_{s}^{3}/6\]

ここで、\(\varepsilon_{\text{ele}}\)は電子系誘電率です。その値が実験により測定されていない場合には、UVSORにより、密度汎関数理論に基づいて評価することができます。計算手法の詳細については、 [Nakamoto08] を参照ください。

入力パラメータ

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.の行は削除します。

計算結果の出力

陽電子寿命予測計算を行うと、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)に示します。この分布が高いところで、陽電子が大きな確率で消滅することになります。

../_images/image36.svg

Si結晶中の価電子分布(a)、陽電子分布(b)、電子・陽電子対分布(c)

使用上の注意

陽電子寿命の計算における注意点です。

  • 擬ポテンシャルの選択

元素によっては、セミコア状態を持つものがあります。ここで、セミコア状態とは、コア電子の内、軌道が空間的に広がり、コア電子の分布と価電子の分布との重なりが無視できない場合のことです。この場合、セミコア電子を価電子として取り扱い、擬ポテンシャルを作成することが望まれます。公開されている擬ポテンシャルには、元素によっては、このようにして作成されたものがあり、その際はこれを利用することを推奨します。もし、そのような擬ポテンシャルが作成されていなければ、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といった数値がありますが、これは、繰り返し計算において、 前回計算された、寿命と今回計算された寿命を示しており、繰り返し計算により、寿命の値が収束に近づいている事を示唆しています。

通常の電子のバンド計算が十分収束しており、かつ使用上の注意の事項を確認できれば、計算は十分考慮されたものであると考えてよいでしょう。

参考文献

Puska95
    1. 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
    1. Puska, ``Ab-initio Calculations of Positron Annihilation Rates in Solids'', J. Phys. Condens. Matter 3 (1991) p. 3455.

Nakamoto08(1,2)
  1. 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.

ボルン有効電荷

概要

平面波基底を採用する第一原理計算において,原子の電荷を一意に求めることは簡単なことではありません。ボルン有効電荷はベリー位相理論に基づいて計算されるものであり,電荷を決めるための最良の方法と考えられます。その基本的な考え方は,“原子が微小に変位した場合に発生する分極”を変位量で割ることによって電荷を求めることができる,というものです。分極も変位も3方向あり得るので,ボルン有効電荷は2階のテンソルとなります。なお,ボルン有効電荷の計算はギャップのある系でのみ計算することが可能な点にご注意ください。

ボルン有効電荷の計算の流れ

ボルン有効電荷は,次のような表式によって計算します。

()\[ Z_{\alpha \beta}^{*} = - \frac{\Omega}{q_e} \frac{\partial P_{\alpha}}{\partial u_{\beta}} = Z_{\rm ion} \delta_{\alpha \beta} + \sum_i \frac{f}{2\pi} a_{i\alpha} \cdot \frac{\partial \phi_i \left( u_{\beta} \right)}{\partial u_{\beta}} .\]

ここでは \(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は以下のような流れで計算を行います。

  1. 対象とする原子すべてのSCF計算を行う。

  2. 対象とする原子すべてを3方向変位させた計算を行う。

  3. 1., 2.で得られた電荷密度を入力とした固定電荷計算によって,ベリー位相計算を3つの逆格子ベクトルに対して行う。

  4. 3. で得られたベリー位相データを結合し, () を利用してボルン有効電荷を計算する。

入力として必要なのは,SCF計算およびベリー位相計算の入力の元となるテンプレート入力ファイルと,berry.plの動作を制御するコントロールファイルです。

入力データ

概要

ボルン有効電荷の計算は,複数回の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
  }
}

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ディレクトリーにおいて行われます。この計算は非並列で行われ,通常数秒から数十秒程度で終了します。

計算結果

計算が最後まで実行されると,以下のようなログが得られます。

--- 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 --- 以下の結果を利用するようにしてください。

例題

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

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を必要な回数実行します。

ボルン有効電荷の計算

最後にボルン有効電荷を計算します。以下の手続きを踏みます。

  1. ボルン有効電荷計算用のディレクトリーを作成します(たとえば,zeff)。

  2. ベリー位相データファイルberry.dataをすべて連結し,ファイルの先頭にその数を指定します。たとえば,21のベリー位相計算を行ったならばファイルの先頭に21と記述します。

  3. ボルン有効電荷計算用のディレクトリーに,SCF計算用の入力ファイルと2.で得たberry.dataファイルをコピーします。

  4. コピーした入力ファイルからdisplacementブロックを削除し,以下を挿入します。 ボルン有効電荷の計算においてSCF計算を行う必要はないので,controlブロックにおいてmax_iteration = 0とします。postprocessing以下の設定が,ボルン有効電荷を計算するための指示です。

control{
  condition = initial
  max_iteration = 0
}
postprocessing{
  polarization{
    sw_bp_property = on
    property = effective_charge
  }
}
  1. PHASEを非並列で実行します。結果は,outputxxxファイルに,5.1.9.5 章 節で説明する形式で出力されます。

BoltzTraPを利用した解析(バージョン2019.01以上)

BoltzTraP [Madsen06] , [Madsen18] とは,Boltzman理論を利用し,バンド構造から輸送係数などを計算するプログラムです。必要な情報は結晶の対称性とバンドエネルギーです。BoltzTraPを利用すると,温度および化学ポテンシャルの関数として以下のような量を求めることができます。

  • ゼーベック係数

  • 伝導度(緩和時間で割った値が出力される)

  • ホール係数

  • 熱伝導率(電子からの寄与分のみ;緩和時間で割った値が出力される)

  • 電子比熱

  • 磁化率

ここでは,PHASE/0が計算するバンド構造からBoltzTraPを利用する方法を説明します。BoltzTraPにはその使い方が大きく異なるバージョン1.とバージョン2.がありますが,PHASE/0はどちらのバージョンにも対応しています。

入力ファイル

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と同じ値。

PHASE/0の実行

PHASE/0の実行は通常通り行います。計算機能の制限などは特にありません。構造最適化,格子最適化が収束するとBoltzTraPで必要なデータファイルが出力されます。SCF計算でも固定電荷計算でもBoltzTraPによる計算は可能ですが,BoltzTraPの解析はk点数に対する収束性が悪い場合があり,k点数を変えながら収束を確かめる,という手続きを踏む必要があります。そのため,固定電荷計算を活用することを推奨します。

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.と違いはありません。

計算例

体心立方CoSb3結晶のゼーベック係数の計算例を紹介します。CoSb3の原子配置は 図 5.25 に示すとおり。

../_images/image45.png

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のサンプリングでほぼ収束した結果が得られていると考えられます。

../_images/image46.png

CoSb3の300Kにおけるゼーベック係数

参考文献

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

ベーダ―解析向け電荷密度ファイルの出力 (バージョン2019.02以上)

概要

PHASE/0における実空間における電荷密度出力機能では、通常価電子部分のみが出力されますが、ベーダ―解析では、内殻電子の寄与も考慮することにより、解析精度を上げることが出来ます。そこで、CUBE形式ファイルの出力の際に、内殻電子の寄与を加える機能が搭載されています。

ベーダ―解析について

ベーダ―解析とは,CUBE形式のファイルから各原子に割り当てる電子数を求める解析手法です。PHASE/0にベーダ―解析を行う機能そのものは備わっていませんが,ベーダ―解析はbaderプログラム

http://theory.cm.utexas.edu/henkelman/code/bader/

をダウンロードし,コンパイルすることによって簡単に行うことができます。詳しくはbaderプログラムのドキュメントなどを参照してください。

処理内容

価電子密度及び内殻電子密度を、それぞれ \(\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 c} (\mathbf{r}) = \sum_{I} \rho_{\rm c}^{\alpha} (\mathbf{r} - \mathbf{R}_I)\]

ここで、は球対称であり、擬ポテンシャルファイル中に出力されています。これを読みこみ、以下の処理をします。

  1. 逆格子空間で処理する場合

()\[\rho_{\rm c} (\mathbf{G}) = \sum_{I} \rho_{\rm c}^{\alpha} ( \mathbf{G} ) \exp (-i \mathbf{G} \cdot \mathbf{R}_I )\]

を価電子密度 \(\rho_{\rm v} (\mathbf{G})\) に加えた \(\rho_{\rm tot} (\mathbf{G})\) を計算し、フーリエ変換により \(\rho_{\rm tot} (\mathbf{r})\) を求める。

  1. 実空間で処理する場合

まず、にフーリエ変換を施しを得る。次に、実空間のメッシュ点 jで

()\[\rho_{\rm c} (\mathbf{r}_j) = \sum_{I} \rho_{\rm c}^{\alpha} ( \mathbf{r}_j - \mathbf{R}_I )\]

を計算し、 \(\rho_{\rm v} (\mathbf{r}_j)\) に加えて \(\rho_{\rm tot} (\mathbf{r}_j)\) を得る。これを全てのメッシュ点に対して行えばよい。なお、内殻電子密度は原子核近傍に局在しているので、メッシュ点 jは、原子位置 \(\mathbf{R}_I\) から適当な距離 rcut以内にあるものを選ぶ。

入力

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 )
  }
}

出力

出力ファイル名は、価電子密度のCUBEファイル名を元に “_ae” を加えた名称です。例えば、価電子密度CUBEファイル名が “nfchr.data” の場合、全電子密度CUBEファイルは ”nfchr_ae.data” となります。

計算例

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

(切断する位置は全電荷密度で決定、積分は価電子密度を利用)

GaNのベーダ―電荷

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

(切断する位置は全電荷密度で決定、積分は価電子密度を利用)

4H-SiCのベーダ―電荷

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は期待される結果を出力しておらず、注意が必要です。

band-unfolding計算機能(2020.01以降)

概要

Band-unfolding計算機能とは、「基本格子の逆格子ベクトルのBZ内の対称点を結ぶ k点で、スーパーセルのバンド計算を行い、バンド計算終了後、各波動関数のGベクトル成分のうち、基本格子の逆格子ベクトルの周期をもつ成分を取り出すフィルターをかけ、その (重み)成分をファイルに出力する」機能です。可視化については band.pl と同様に、gnuplot の描画機能を用いるようなperlスクリプトが付属します。

各k点で波動関数 \(\psi_{nk\sigma}\) (バンドn、スピン \(\sigma\) )が得られた後、スペクトル強度

()\[A_{nk\sigma} = \sum_{G \in G_{\rm pr}} \left| \left< G | \psi_{nk\sigma} \right> \right|^2\]

を計算し、ファイルに出力します。ここで、Gprは、基本格子の逆格子ベクトルが作るGベクトルです。なお、非ノルム保存擬ポテンシャルの場合には、

()\[\begin{split}A_{nk\sigma} = \sum_{G \in G_{\rm pr}} \left| \left< G | \tilde{\psi}_{nk\sigma} \right> \right|^2 + \sum_I \sum_{\tau l m} \sum_{\tau' l' m'} q_{\tau l m, \tau' l' m'}^I f_{\tau l m}^{I \ast} f_{\tau' l' m'}^I, \\ f_{\tau l m}^I = \sum_{G \in G_{\rm pr}} \left< \beta_{\tau l m}^I | G \right> \left< G | \tilde{\psi}_{nk\sigma} \right>\end{split}\]

となります。ここで、 \(\beta_{\tau l m}^I\) は、原子I、主量子数 \(\tau\) 、方位量子数 \(l\) 、磁気量子数 \(m\) におけるプロジェクタです。また、 \(q_{\tau l m, \tau' l' m'}^I\) は補償電荷です。

入力ファイル

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
  }
}

出力ファイル

スペクトル強度が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
…
(後略)

band-unfold.plスクリプトの利用

band-unfold.pl を用いると、gnuplotを用いて可視化するためのファイルが生成されます。以下にスクリプト使用法を示します。このスクリプトは、スペクトル強度 ( plot_band_energy.dat ) あるいはスペクトル関数 ( plot_band_energy.map ) を出力ます。同時に生成されるplot_band_unfolding.gnu は gnuplot 用のファイルです。ここで、スペクトル強度は、 (5.19) 或いは (5.20) で定義されます。スペクトル関数は、

\[A_{k\sigma} (w) = \sum_n A_{nk\sigma} \delta (w-\varepsilon_{nk\sigma})\]

で得るものとします。

(スペクトル強度を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ファイルの指定は必須です。

band-unfold.plのオプション

オプション

意味

デフォルト値

-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

例題

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の導入による周期の乱れを反映しています。

../_images/MoS2_BZ_band.png

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

../_images/image75.png

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

../_images/image77.png

(左上)図 5‑26の2個のS原子をTeに置換したスーパーセル。 (左下) 基本格子のブリルアンゾーン及び対称点。(右)アンフォールドしたバンド分散。

図 5.30 に、 図 5.29 と同じ系に対するスペクトル関数を示します。なお、スペクトル関数は

\[A_{k\sigma} (w) = \sum_n A_{nk\sigma} \delta ( w -\varepsilon_{nk\sigma} )\]

で定義しています。

../_images/image79.png

図 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
../_images/image80.png

(左) GeドープSiの構造。(右)アンフォールドしたバンド。

原子周囲局所ポテンシャル出力機能(2021.02以降)

機能の概要

本機能を用いることによって原子周囲の局所ポテンシャルの平均値を評価することが可能です。

局所ポテンシャルを \(V\left(r\right)\), 原子A中心の球対称な重み関数をfとすると、原子Aの周囲の局所ポテンシャル平均値は、

()\[V_A = \int dr V \left( r \right) f \left( \left| r-R_A \right| \right)\]

であらわされます。関数fとしては、積分半径 \(r_c\) 内でのみ有限の値を持つ関数

()\[\begin{split}f\left(r\right) = \begin{cases} \frac{1}{\Omega} & r \leq r_c \\ 0 & r>r_c \end{cases}\end{split}\]

が考えられます。ここで\(\Omega=\frac{4\pi r_c^3}{3}\) です。さて、PHASE/0では、局所ポテンシャルは

()\[V\left(r\right) = \sum_{G} e^{i G \cdot r}\]

のように表現されるので (5.22) (5.23)(5.21) に代入するとつぎのような表式が得られます。

()\[\begin{split}V_A = \sum_G V\left(G\right) e^{i G \cdot r} w, \\ w = \frac{4\pi}{G^3} \frac{1}{\Omega} \left(G r_c\right)^3 j_1 \left(G r_c \right), \\ j_1 \left(x\right) = \frac{\sin{x}}{x^2} - \frac{\cos{x}}{x} .\end{split}\]

(5.24) 式を用いて原子周囲の局所ポテンシャルの平均値を求めることができます。

入力パラメーターファイル

局所ポテンシャル平均値を計算するには、以下のような入力を作成します。

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 で指定します。

出力ファイル

局所ポテンシャル平均値は、potential_on_atoms.dataに出力されます。

# Potential on atoms
#   id     pot (eV)
    1     -19.343121
    2     -19.539243
 (後略)

第1列及び第2列は、それぞれ原子のインデックス、局所ポテンシャルの平均値 (単位:eV)に対応します。

計算例: Al-Graphene-Al系

Al-Graphene-Al系を用いた計算例を紹介します。入力ファイルは samples/local_pot_av/Al-Graphene-Al 以下にあります。 Al-Graphene-Al系の原子配置は、 図 5.32 に示す通りです。

../_images/local_pot_av_config.png

Al-Graphene-Al系の原子配置。茶及び水色の球は、それぞれ C及びAl原子に対応する。C原子のインデックスは、左端から順につけるものとする。

その他の計算条件は以下のとおりです。

Al-Graphene-Al 系の計算に用いた条件

計算条件

平面波カットオフ [Ry]

30.0

電荷密度カットオフ [Ry]

270.0

k点サンプリング

monk (1x36x1, \(\Gamma\) -centered)

交換相関相互作用

GGAPBE, PAW

SCF収束条件 [Ha/atom]

1.0E-8

計算結果を以下に示します。青線及び赤線は、それぞれ積分半径1.0及び2.0 の結果に対応します。また、四角 (丸) は、交換相関ポテンシャルを含まない (含む) 計算に対応します。プロファイルは、積分半径や交換相関ポテンシャルの有無に、あまり依存しないことが分かります。

../_images/local_pot_av_result.png

Al-Graphene-Al 系の局所ポテンシャル平均値のプロファイル。左端のC原子のポテンシャルがエネルギーの原点です。