vasp_plot_band.py 技術ドキュメント

プログラムの動作

vasp_plot_band.py は、VASP (Vienna Ab-initio Simulation Package) の計算結果からバンド構造を解析し、プロットするためのPythonスクリプトです。

主な機能:

  • VASPの標準出力ファイル(INCAR, POSCAR, KPOINTS, OUTCAR, EIGENVAL など)を読み込み、計算されたバンド構造のデータを抽出します。

  • 価電子帯最大エネルギー (EV)、伝導帯最小エネルギー (EC)、バンドギャップ (Eg)、HOMO (Highest Occupied Molecular Orbital)、LUMO (Lowest Unoccupied Molecular Orbital) を自動的に特定し、表示します。

  • 抽出したバンド構造のデータをExcel形式 (.xlsx) で出力します。

  • Matplotlibライブラリを使用して、バンド構造図を生成し、PNG画像として保存したり、画面に表示したりすることができます。

  • プロットモードとして、各k点でのマーカー表示 (band)、k点間の線連結表示 (bandline)、占有数を考慮した表示 (bandocc) を選択できます。

  • フェルミ準位 (EF) を基準としてエネルギーをシフトし、分かりやすいバンド図を生成します。

解決する課題:

VASPの生出力ファイルからバンド構造を直接視覚化するのは困難であり、このプログラムはVASP計算結果の迅速な解析と視覚化を可能にすることで、物質の電子構造に関する理解を深める手助けをします。特に、バンドギャップやHOMO/LUMOレベルといった重要な電子状態の特性を明確に提示します。

原理

このプログラムは、主にVASPの出力ファイル群からエネルギーバンドの情報を抽出し、それをグラフとして描画するアルゴリズムに基づいています。

  1. VASPファイル解析:

    • tkVASP クラス(tklib.tkcrystal.tkvasp モジュール内)を用いて、INCAR, POSCAR, KPOINTS, OUTCAR, EIGENVAL などのVASP出力ファイルを読み込みます。

    • OUTCAR からは、計算されたフェルミ準位 (\(E_F\))、スピン分極 (ISPIN) の情報などが抽出されます。

    • EIGENVAL からは、各k点における電子のエネルギー準位と占有数(occupancy)が読み込まれます。

    • KPOINTS ファイルに記述された高対称点とk点経路に基づき、バンド構造プロットのX軸となる各k点の累積距離 ktot が計算されます。

  2. エネルギー基準の補正:

    • 読み込んだエネルギー準位は、OUTCAR から取得したフェルミ準位 \(E_F\) を基準として補正されます。すなわち、プロットされるエネルギー \(E'\)\(E' = E - E_F\) となります。これにより、\(E_F\) が0 eVに位置するようにバンド図が描画されます。

  3. バンドエッジの特定:

    • プログラムは、tkVASP.find_band_edges_from_eigenval および tkVASP.gbandedges 関数を使用して、価電子帯最大エネルギー (\(E_V\))、伝導帯最小エネルギー (\(E_C\))、およびバンドギャップ (\(E_g\)) を特定します。

    • これらの値は、電子の占有率 (occ_th、デフォルトは0.5) を閾値として決定されます。

      • \(E_V\) は、占有されている(占有率が occ_th よりも高い)バンドのうち、最も高いエネルギーを持つ準位として識別されます。

      • \(E_C\) は、占有されていない(占有率が occ_th よりも低い)バンドのうち、最も低いエネルギーを持つ準位として識別されます。

      • バンドギャップは \(E_g = E_C - E_V\) として計算されます。

    • 同様に、HOMO (\(E_{HOMO}\)) と LUMO (\(E_{LUMO}\)) のエネルギーも特定されます。HOMOは全k点で最大の占有エネルギー、LUMOは全k点で最小の非占有エネルギーに対応します。

  4. バンド構造のプロット:

    • matplotlib.pyplot を利用してバンド構造図が描画されます。

    • X軸はk点の累積距離 ktot、Y軸は補正されたエネルギー準位 \(E'\) です。

    • tkcrystal.tkbandstructure.plot_band 関数が実際の描画処理を行います。この関数は、k点パス上の高対称点を垂直線とラベルでマークし、\(E_F=0\) のラインや \(E_V\), \(E_C\), \(E_{HOMO}\), \(E_{LUMO}\) の位置も表示します。

    • mode 引数に応じて、バンドはマーカーで表示されるか (band, bandocc)、線で連結されるか (bandline) が決定されます。bandocc モードでは、占有数に応じてマーカーのサイズや色が調整される場合があります。

    • ISPIN=2 (スピン分極計算) の場合、スピンアップとスピンダウンの両方のバンドが個別にプロットされます。

必要な非標準ライブラリとインストール方法

vasp_plot_band.py は、以下の非標準ライブラリに依存しています。

  • numpy: 高度な数値計算(配列操作など)

  • scipy: 科学技術計算(補間機能など、本プログラムでは interp1d がインポートされているものの、直接使用されている箇所は少ない可能性があります)

  • matplotlib: グラフ描画

  • tklib: このプログラム特有のVASPファイル解析、データ処理、ユーティリティ機能を提供するカスタムライブラリです。tklib のインストール方法は、配布元に依存します。

インストール方法 (numpy, scipy, matplotlib):

これらのライブラリはPythonのパッケージ管理ツール pip を使ってインストールできます。コマンドライン(ターミナルやコマンドプロンプト)で以下のコマンドを実行してください。

pip install numpy scipy matplotlib

tklib について:

tklib は標準の pip リポジトリには存在しないカスタムライブラリです。通常は、プログラムの作者によって別途提供されるか、ローカルに配置される必要があります。このプログラムが正しく動作するためには、tklib ディレクトリが vasp_plot_band.py と同じディレクトリ、またはPythonのパスが通っている場所に存在する必要があります。

必要な入力ファイル

プログラムを実行するには、VASP計算の出力ファイルが特定のディレクトリ構造で存在している必要があります。デフォルトでは、CAR_dir (VASP計算結果ディレクトリ) の直下に以下のファイルが存在することを期待します。

  • INCAR: VASPの入力設定ファイル。

    • VASPの計算パラメータが含まれています。

  • POSCAR: 結晶構造ファイル。

    • 原子の種類、位置、格子定数など、計算対象の結晶構造情報が含まれています。

  • KPOINTS: k点サンプリングまたはk点経路定義ファイル。

    • バンド構造計算に使用されたk点経路の情報が含まれています。高対称点の名前と座標、各パスのk点数などが記述されます。

  • OUTCAR: VASPの標準出力ファイル。

    • 計算過程の詳細なログ、フェルミ準位 (\(E_F\))、ISPIN設定 (スピン分極計算の有無)、バンドエッジ情報などが含まれています。

  • EIGENVAL: k点ごとのエネルギー準位と占有数を含むファイル。

    • バンド構造プロットの最も重要な入力ファイルです。各k点における各電子準位のエネルギー値とその占有状態が記述されています。

  • DOSCAR: 状態密度 (Density Of States) 計算の出力ファイル。

    • プログラム内部でパスは取得されますが、直接の読み込みは行われていないようです。

期待されるファイル形式とデータ構造:

これらのファイルは全てVASPの標準的なテキストファイル形式です。プログラムはこれらのファイルを解析し、必要な情報を抽出します。ユーザーが手動でこれらのファイルの内容を修正する必要はありませんが、VASP計算が正常に終了し、これらのファイルが完全な状態で存在していることが前提となります。

生成される出力ファイル

プログラムの実行により、以下のファイルが生成されます。

  • band.xlsx:

    • 内容: 解析されたバンド構造の数値データが保存されるExcelスプレッドシートです。

    • 構造:

      • 1行目: ヘッダー行。k点のデカルト座標 (kx, ky, kz)、k点間の距離 (dk)、開始k点からの累積距離 (ktot)、そして各バンドのエネルギー準位 (Eup(0), Eup(1), ... Eup(nL-1)) が記載されます。

      • ISPIN=2 (スピン分極計算) の場合、スピンダウンの各バンドのエネルギー準位 (Edn(0), Edn(1), ... Edn(nL-1)) も追加されます。

      • 2行目以降: 各k点における上記の値が列挙されます。

    • 用途: バンド構造の生データを他の解析ツールで利用したり、詳細な数値を確認したりする際に役立ちます。

  • band.png:

    • 内容: プロットされたバンド構造図の高解像度PNG画像ファイルです。

    • 描画:

      • X軸: k点の累積距離。高対称点には垂直線とラベルが表示されます。

      • Y軸: フェルミ準位を0eVとしたエネルギー(単位はeV)。

      • バンド: スピンアップ(青色)とスピンダウン(赤色、ISPIN=2の場合)の各バンドがプロットされます。

      • 特定のエネルギー準位: フェルミ準位 (\(E_{F0}\)) が点線で示され、価電子帯最大エネルギー (\(E_V\))、伝導帯最小エネルギー (\(E_C\))、HOMO (\(E_{HOMO}\))、LUMO (\(E_{LUMO}\)) の位置も表示されます。

    • 用途: プレゼンテーション資料やレポートへの挿入、バンド構造の視覚的な解析に利用されます。

コマンドラインでの使用例 (Usage)

vasp_plot_band.py は、以下の形式でコマンドラインから実行します。

python vasp_plot_band.py mode CAR_dir EF0 Emin Emax occ_th save_figure plot_figure

引数の説明:

  • mode: バンド構造のプロットモードを指定します。

    • band: 各k点におけるエネルギー準位をマーカーでプロットします。

    • bandline: 各k点におけるエネルギー準位を線で連結してプロットします。

    • bandocc: band モードに似ていますが、占有数に応じてマーカーの表示を調整する可能性があります。

  • CAR_dir: VASPの出力ファイルが格納されているディレクトリのパスを指定します。デフォルトはカレントディレクトリ (.) です。

  • EF0: バンドエッジ (HOMO/LUMO) を検索する際の基準となるエネルギー値 (eV)。デフォルトは 0.1 eV です。

  • Emin: プロットするエネルギー範囲の下限値 (eV)。デフォルトは -10.0 eV です。

  • Emax: プロットするエネルギー範囲の上限値 (eV)。デフォルトは 10.0 eV です。

  • occ_th: HOMOとLUMOを分離するための占有率の閾値。デフォルトは 0.5 です。

  • save_figure: プロットされた図を画像ファイルとして保存するかどうか。1 で保存、0 で保存しない。デフォルトは 1 です。

  • plot_figure: プロットされた図を画面に表示するかどうか。1 で表示、0 で表示しない。デフォルトは 1 です。

コマンドラインでの具体的な使用例

ここでは、現在のディレクトリ (.) にVASPの出力ファイルが存在し、一般的な設定でバンド構造をプロットする例を示します。

python vasp_plot_band.py band . 0.1 -10.0 10.0 0.5 1 1

実行結果の説明:

上記のコマンドを実行すると、以下のようなプロセスと出力が行われます(実際の出力はVASPの計算結果によって異なります)。

  1. 引数の解析と初期情報の表示: プログラムは指定された引数を解析し、実行モード、VASPディレクトリ、エネルギー範囲などの設定値を出力します。

    =============== Plot band structure calculated by VASP ============
    
    mode:  band
    
  2. VASP出力ファイルの探索と情報表示: CAR_dir で指定されたディレクトリからVASPの主要な出力ファイル(INCAR, POSCAR, KPOINTS, OUTCAR, EIGENVAL, DOSCAR)のパスを特定し、その情報を表示します。

    CAR dir(ideal) :  .
      INCAR   :  ./INCAR
      POSCAR  :  ./POSCAR
      KPOINTS :  ./KPOINTS
      CONTCAR :  ./CONTCAR
      OUTCAR  :  ./OUTCAR
      EIGENVAL:  ./EIGENVAL
      DOSCAR  :  ./DOSCAR
    
    Occupancy threshold to seprate HOMO and LUMO: 0.5
    save_figure: 1
    plot_figure: 1
    
    EF0: 0.1 eV
    
  3. 結晶構造、INCAR/OUTCAR情報の読み込み: POSCARから結晶構造、INCAR/OUTCARから計算設定(ISPIN、フェルミ準位など)を読み込み、表示します。

    *** Read crystal structure from [./POSCAR]
    ... (POSCARの格子定数や原子情報が表示される)
    Information in OUTCAR:
      ISPIN    : 1
      IsHF     : 0
      IsMETAGGA: 0
      EF = -1.234567 eV corrected to 0
    
  4. KPOINTSおよびEIGENVALの解析: KPOINTSファイルから高対称k点と経路情報、EIGENVALファイルからk点ごとのバンド準位と占有数を読み込み、その概要を表示します。

    Special k points in KPOINTS:
      GAMMA      (  0.0000   0.0000   0.0000) w=0.000    0.0000     0.0000
      X          (  0.5000   0.0000   0.0000) w=0.000    1.0000     1.0000
    ...
    k points in EIGENVAL:
    nk(band)= 100
    nLevels = 10
      (  0.0000   0.0000   0.0000) w=0.0000  dk=0.0000 ktot=0.0000
      (  0.0050   0.0000   0.0000) w=0.0000  dk=0.0050 ktot=0.0050
    ...
    
  5. バンドエッジ情報の表示: 計算されたバンドエッジ(EV, EC, Eg, HOMO, LUMO)が表示されます。

    Band edge from EIGENVAL:
    EF from OUTCAR: -1.234567 eV
    EF0=       0.100000 eV
      find_band_edges: EV=  -0.500000  EC=   2.000000  Eg=   2.500000 eV
                 HOMO:  -0.550000 eV
                 LUMO:   1.950000 eV
      gbandedges()   : EV=  -0.500000  EC=   2.000000  Eg=   2.500000 eV
    
  6. バンド構造データのExcelファイル出力: band.xlsx ファイルが生成され、バンド構造の数値データが保存されます。

    Save band structure data to [band.xlsx]
    
  7. バンド構造図のプロットと保存: band.png ファイルにバンド構造図が保存され、指定があれば画面に表示されます。画面表示された場合、「Press ENTER to exit>>」と表示され、ユーザーがEnterキーを押すまでウィンドウが開いたままになります。

    plot band structure
    
    Save band structure to figure file [band.png]
    
    Press ENTER to exit>>
    

これにより、VASP計算結果のバンド構造が視覚的に表現され、数値データとしても保存されます。