vasp_plot_epsilon.py Technical Documentation

プログラムの動作

vasp_plot_epsilon.py は、VASP (Vienna Ab-initio Simulation Package) によって計算された光学誘電率を OUTCAR ファイルから抽出し、グラフとしてプロットし、Excelファイルに保存するためのPythonスクリプトです。VASP計算で LEPSILON = .TRUE. が設定されている場合に生成される誘電率データを解析することを目的としています。

主な機能:

  • VASPの OUTCAR ファイルから、頻度依存の複素誘電率テンソル \(\epsilon(\omega) = \epsilon_1(\omega) + i\epsilon_2(\omega)\) を抽出します。

  • 誘電率テンソルの実部 (\(\epsilon_1\)) と虚部 (\(\epsilon_2\)) を、各テンソル成分 (XX, YY, ZZ, XY, YZ, ZX) について読み取ります。

  • VASPが計算する "density-density" 応答と "current-current" 応答のいずれかを選択してプロットできます。

  • 抽出した誘電率データを epsilon.xlsx というExcelファイルに保存します。

  • Matplotlibライブラリを使用して、各テンソル成分の実部と虚部をエネルギー (eV) の関数としてプロットし、インタラクティブなグラフウィンドウで表示します。

  • プロットするエネルギー範囲をコマンドライン引数で指定できます。

解決する課題: VASPの OUTCAR ファイルはテキスト形式であり、誘電率データが複数のセクションにわたって記述されているため、手動でデータを抽出して可視化するのは手間がかかります。このスクリプトは、その抽出と可視化のプロセスを自動化し、解析を効率化します。

原理

このプログラムは、VASPの出力ファイルである OUTCAR の特定のキーワードを検索し、その後の行から誘電率データを数値として読み取ります。 VASPが LEPSILON = .TRUE. オプションで計算を実行すると、OUTCAR には以下のようなセクションが出力されます。

  • frequency dependent IMAGINARY DIELECTRIC FUNCTION (independent particle, no local field effects) density-density

  • frequency dependent REAL DIELECTRIC FUNCTION (independent particle, no local field effects) density-density

  • frequency dependent IMAGINARY DIELECTRIC FUNCTION (independent particle, no local field effects) current-current

  • frequency dependent REAL DIELECTRIC FUNCTION (independent particle, no local field effects) current-current

これらのセクションには、エネルギー (eV) と対応する誘電率テンソル成分 \(\epsilon_{ij}\) の値が表形式で記述されています。誘電率は複素量であり、実部 \(\epsilon_1\) と虚部 \(\epsilon_2\) で構成されます。各成分は通常、XX, YY, ZZ, XY, YZ, ZX の6つの独立な要素として報告されます。

プログラムは、指定されたVASP計算ディレクトリ内の OUTCAR ファイルを読み込み、read_spectrum 関数を使用して上記のキーワードを正規表現で検索し、対応するエネルギーと誘電率のデータを抽出します。 ユーザーはコマンドライン引数 mode を介して、"density-density" 応答または "current-current" 応答のどちらをプロット対象とするかを選択できます。

抽出されたデータは、NumPy配列に格納され、以下の形式でExcelファイルに保存されます。

E(eV)

e1xx

e2xx

e1yy

e2yy

e1zz

e2zz

e1yz

e2yz

e1zx

e2zx

e1xy

e2xy

...

...

...

...

...

...

...

...

...

...

...

...

...

そして、Matplotlibライブラリを用いて、エネルギー \(E\) を横軸、誘電率 \(\epsilon\) を縦軸とする2次元プロットを作成します。6つの独立なテンソル成分 (XX, YY, ZZ, XY, YZ, ZX) それぞれについて、実部と虚部が個別のサブプロットに表示されます。軸ラベルにはLaTeX表記が使用され、実部は $\epsilon_1$, 虚部は $\epsilon_2$ と表示されます。

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

このプログラムは以下の非標準Pythonライブラリに依存しています。

  • numpy: 数値計算、特に配列操作に使用されます。

    pip install numpy
    
  • scipy: 科学技術計算ライブラリ。interp1d がインポートされていますが、このプログラムの現在のバージョンでは直接使用されていません。

    pip install scipy
    
  • matplotlib: データの可視化、グラフ描画に使用されます。

    pip install matplotlib
    
  • tklib: このプログラムが依存するカスタムライブラリ群です。VASPのファイルパス取得 (tkVASP)、ファイル操作 (tkFile)、データのエクスポート (tkVariousData) など、様々なユーティリティ機能を提供します。 通常、このライブラリは pip で直接インストールできる形式ではない可能性があります。このプログラムを実行するには、tklib ディレクトリを、vasp_plot_epsilon.py と同じディレクトリ、またはPythonのモジュール検索パスが通っている場所に配置する必要があります。 例: vasp_plot_epsilon.py と同じ階層に tklib ディレクトリが存在するように配置します。

    .
    ├── vasp_plot_epsilon.py
    └── tklib/
        ├── __init__.py
        ├── tkfile.py
        ├── tkre.py
        └── ... (その他のtklibモジュール)
    

必要な入力ファイル

このプログラムの実行には、VASPによって光学誘電率が計算された結果を含む OUTCAR ファイルが必須です。

  • OUTCAR:

    • VASPの計算結果ファイル。

    • INCAR ファイルに LEPSILON = .TRUE. が設定されているVASP計算の出力である必要があります。

    • このファイルには、エネルギーの関数として実部および虚部の誘電率テンソル成分(density-density応答とcurrent-current応答の両方)のデータが含まれている必要があります。

    • vasp_plot_epsilon.py は、指定されたVASP計算ディレクトリ (CAR_dir) 内の OUTCAR を自動的に検出して読み込みます。

  • VASP計算ディレクトリ (CAR_dir):

    • OUTCAR ファイルを含むディレクトリを指します。

    • プログラムは tkVASP モジュールを使用して、このディレクトリから OUTCAR のパスを特定します。INCAR, POSCAR, CONTCAR などの他のVASPファイルも同じディレクトリにあることが想定されますが、プログラムが直接これらのファイルを読み込むことはありません。

生成される出力ファイル

プログラムは以下の出力ファイルを生成します。

  • epsilon.xlsx:

    • ファイル名: epsilon.xlsx

    • 場所: プログラムが実行されたVASP計算ディレクトリ内に保存されます。

    • 内容: 抽出された誘電率データがExcel形式で保存されます。1列目にエネルギー (E(eV))、続く列に各誘電率テンソル成分の実部と虚部 (e1xx, e2xx, e1yy, e2yy, e1zz, e2zz, e1yz, e2yz, e1zx, e2zx, e1xy, e2xy) が含まれます。

  • Matplotlibグラフウィンドウ:

    • 内容: Matplotlibによって生成されるグラフィカルなウィンドウが表示されます。このウィンドウには、6つのサブプロット(XX, YY, ZZ, XY, YZ, ZX)があり、それぞれに誘電率の実部 (\(\epsilon_1\)) と虚部 (\(\epsilon_2\)) がエネルギー \(E\) の関数としてプロットされます。

    • 保存: このグラフは自動的にファイルに保存されません。ユーザーは表示されたウィンドウから手動で画像を保存できます。プログラムの実行後、Enterキーを押すか、グラフウィンドウを閉じることで終了します。

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

vasp_plot_epsilon.py は、コマンドライン引数を使用して実行モード、VASP計算ディレクトリ、およびプロットするエネルギー範囲を指定します。

python vasp_plot_epsilon.py [mode] [CAR_dir] [Emin] [Emax]
  • [mode] (必須):

    • 誘電率の応答タイプを指定します。

    • 有効な値: density (density-density応答) または current (current-current応答)。

  • [CAR_dir] (オプション):

    • VASP計算ディレクトリのパス。OUTCAR ファイルが存在するディレクトリを指定します。

    • デフォルト値は . (カレントディレクトリ) です。

  • [Emin] (オプション):

    • プロットするエネルギー範囲の下限値 (eV)。

    • デフォルト値は 0.0 eV です。

  • [Emax] (オプション):

    • プロットするエネルギー範囲の上限値 (eV)。

    • デフォルト値は 8.0 eV です。

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

以下の例では、プログラムの実行方法と、それによって生成される結果について説明します。

  1. 基本的な実行例 (density-density応答、カレントディレクトリ、デフォルトエネルギー範囲): VASPの OUTCAR ファイルがカレントディレクトリにあり、density-density応答をプロットしたい場合。

    python vasp_plot_epsilon.py density .
    

    または、明示的にエネルギー範囲を指定する場合:

    python vasp_plot_epsilon.py density . 0.0 8.0
    

    実行結果:

    • カレントディレクトリに epsilon.xlsx ファイルが生成されます。このファイルには、OUTCAR から抽出されたエネルギーと誘電率テンソル成分 (実部・虚部) のデータが含まれます。

    • Matplotlibによるグラフウィンドウが表示されます。ウィンドウには6つのサブプロットがあり、それぞれXX, YY, ZZ, XY, YZ, ZX成分の誘電率実部と虚部が \(0.0 \sim 8.0\) eV の範囲でプロットされます。

    • プログラムはグラフウィンドウを閉じるか、コンソールでEnterキーが押されるまで待機します。

  2. 特定のディレクトリとエネルギー範囲を指定した実行例 (current-current応答): VASP計算ディレクトリが ./my_vasp_calc/ にあり、current-current応答を \(2.0 \sim 15.0\) eV の範囲でプロットしたい場合。

    python vasp_plot_epsilon.py current ./my_vasp_calc/ 2.0 15.0
    

    実行結果:

    • ./my_vasp_calc/ ディレクトリ内に epsilon.xlsx ファイルが生成されます。このファイルには、OUTCAR から抽出されたエネルギーと誘電率テンソル成分 (current-current応答の実部・虚部) のデータが含まれます。

    • Matplotlibによるグラフウィンドウが表示されます。ウィンドウには6つのサブプロットがあり、それぞれXX, YY, ZZ, XY, YZ, ZX成分の誘電率実部と虚部が \(2.0 \sim 15.0\) eV の範囲でプロットされます。

    • プログラムはグラフウィンドウを閉じるか、コンソールでEnterキーが押されるまで待機します。

  3. 無効なモードを指定した場合の例:

    python vasp_plot_epsilon.py invalid_mode .
    

    実行結果:

    • 以下のエラーメッセージが表示され、プログラムが終了します。

      Error: Invalide mode [invalid_mode]
      Usage:
        (a)  python vasp_plot_epsilon.py mode CAR_dir Emin, Emax
           ex: python vasp_plot_epsilon.py density . 0.0 8.0