vasp_plot_dos.py 技術ドキュメント
プログラムの動作
vasp_plot_dos.py は、VASP (Vienna Ab-initio Simulation Package) によって計算された状態密度 (DOS: Density of States) を解析し、グラフとして可視化するためのPythonスクリプトです。このプログラムはVASPの標準出力ファイル(DOSCAR, OUTCAR, EIGENVAL, POSCAR など)を読み込み、エネルギー対DOS、およびエネルギー対電子数 (\(N_e\)) の積算曲線をプロットします。
主な機能は以下の通りです。
VASP出力ファイルから結晶構造情報、計算パラメータ、フェルミ準位、状態密度、電子数、バンドエネルギーなどを抽出します。
フェルミ準位をエネルギー基準として0 eVに補正します。
価電子帯最大エネルギー (\(E_V\)), 伝導帯最小エネルギー (\(E_C\)), バンドギャップ (\(E_g\)), 最高被占軌道 (HOMO), 最低非占軌道 (LUMO) などのバンドエッジ情報を特定します。
オプションで、ガウス関数による畳み込み(スムージング)をDOSデータに適用し、プロットのノイズを低減します。
Matplotlibライブラリを使用して、状態密度と電子数積算曲線をグラフ化します。グラフには特定されたバンドエッジも点線で表示されます。
生成されたグラフはPNG画像ファイルとして保存され、オプションで画面に表示されます。
このプログラムは、VASP計算結果のDOSを容易に視覚化し、バンド構造に関連する物理量を直感的に評価できるようにすることで、手動でのデータ処理やグラフ作成の手間を省き、研究者の解析作業を効率化します。
原理
本プログラムは、VASP計算の出力ファイルに含まれる物理情報に基づき、状態密度 (DOS) の解析とプロットを行います。
状態密度 (DOS): DOSCARファイルから読み取られる状態密度 \(DOS(E)\) は、エネルギー \(E\) における電子の状態数を示します。スピン偏極計算 (
ISPIN=2) の場合は、アップスピン (\(DOS_{\text{up}}(E)\)) とダウンスピン (\(DOS_{\text{dn}}(E)\)) の両方が考慮されます。電子数積算曲線 (\(N_e\)): DOSCARファイルには、各エネルギー \(E\) までの電子数積算曲線 \(N_e(E)\) も含まれています。これは、状態密度をエネルギーに関して積分したもので、次のように定義されます。
\[N_e(E) = \int_{-\infty}^{E} DOS(E') dE'\]フェルミ準位 (\(E_F\)): VASPのOUTCARファイルから読み取られるフェルミ準位 (\(E_F\)) は、エネルギーの基準点として使用され、全てのエネルギー値は \(E_F = 0\) に補正されます。
バンドエッジ (HOMO, LUMO, \(E_V\), \(E_C\)) とバンドギャップ (\(E_g\)): EIGENVALおよびOUTCARファイルの情報から、価電子帯最大エネルギー (\(E_V\), VBM: Valence Band Maximum)、伝導帯最小エネルギー (\(E_C\), CBM: Conduction Band Minimum)、および対応するバンドギャップ (\(E_g = E_C - E_V\)) が特定されます。また、バンドの占有率 (
occ_thで設定される閾値、デフォルト0.5) を基に、最高被占軌道 (HOMO: Highest Occupied Molecular Orbital) および最低非占軌道 (LUMO: Lowest Unoccupied Molecular Orbital) も探索されます。HOMO: 占有されているバンドの中で最も高いエネルギー準位。
LUMO: 占有されていないバンドの中で最も低いエネルギー準位。
ガウス関数による畳み込み (スムージング): 生のDOSデータはしばしばノイズを含むため、視認性を向上させるためにガウス関数 \(G(x, \sigma)\) を用いた畳み込みが適用されます。これにより、データが滑らかになります。畳み込みは以下の式で表されます。
\[ (f * G)(E) = \int_{-\infty}^{\infty} f(E') G(E - E', \sigma) dE' \]ここで \(G(x, \sigma)\) は標準偏差 \(\sigma\) を持つガウス関数です。
\[ G(x, \sigma) = \frac{1}{\sigma \sqrt{2\pi}} \exp\left(-\frac{x^2}{2\sigma^2}\right) \]プログラムの引数
Gaussian_widthは、この \(\sigma\) に相当します。width = 0.0の場合、スムージングは適用されません。
必要な非標準ライブラリとインストール方法
このプログラムの実行には、以下の非標準Pythonライブラリが必要です。
numpy: 数値計算のための基盤ライブラリ。
scipy: 科学技術計算のためのライブラリ。主にデータの補間 (
interp1d) や畳み込み (convolution) に使用されます。matplotlib: グラフ描画のためのライブラリ。
これらのライブラリは、通常 pip コマンドでインストールできます。
pip install numpy scipy matplotlib
tklib: このプログラムの動作に必須のカスタムライブラリです。
tkVASPやtkCrystalといったVASPファイル解析および結晶構造操作の機能を提供します。標準的なPythonパッケージリポジトリには登録されていない可能性があるため、開発元から入手し、Python環境に適切に配置する必要があります。
もし pip でインストールを試みる場合は、以下のコマンドを実行する可能性があります。
pip install tklib
しかし、これが失敗する場合は、手動でライブラリのソースコードを入手し、PYTHONPATH に追加するか、プログラムと同じディレクトリに配置する必要があります。
必要な入力ファイル
vasp_plot_dos.py は、VASP計算結果が格納されたディレクトリ(CAR_dir 引数で指定)内に、以下の標準的なVASP出力ファイルが存在することを期待します。これらのファイルはVASPが正常に計算を完了した際に生成されるものです。
POSCAR: 結晶構造(格子定数、原子位置など)に関する情報が含まれています。プログラムはセルの体積などの情報を読み取ります。
INCAR: VASPの入力パラメータ(計算モード、K点サンプリング方法など)が記述されています。プログラムは基本的な計算設定を把握するために読み取ります。
OUTCAR: VASPの主要な出力ファイルで、計算のログ、フェルミ準位 (
EF), スピン偏極情報 (ISPIN), バンドエッジの情報などが含まれます。EIGENVAL: 各K点における電子の固有値(エネルギー準位)がリストされています。プログラムはこれを基にバンドエッジ(HOMO, LUMO, \(E_V\), \(E_C\))を特定します。
DOSCAR: 状態密度 (DOS) および電子数積算曲線 (\(N_e\)) がエネルギーごとに詳細に記述されています。プログラムはこれらをプロットの主要データとして使用します。
これらのファイルはVASPの標準的なテキストファイル形式であり、特定のデータ構造を持っています。プログラムは tklib.tkvasp モジュールを通じてこれらのファイルを解析します。
生成される出力ファイル
プログラムの実行が成功すると、以下の画像ファイルが生成されます(save_figure 引数が1の場合)。
dos.png: VASPによって計算された状態密度 (DOS) および(オプションで)電子数積算曲線 (\(N_e\)) をプロットしたPNG画像ファイルです。内容:
横軸はエネルギー (単位: eV) で、フェルミ準位が0 eVに補正されています。
縦軸は上部サブプロットが状態密度 (DOS, 単位: states/cm\(^3\)/eV)、下部サブプロット(
plot_figure_Neが1の場合)が電子数 (\(N_e\), 単位: states/cm\(^3\)) です。スピン偏極計算 (
ISPIN=2) の場合、アップスピンとダウンスピンのDOSおよび\(N_e\)が異なる色(デフォルトで黒と赤)でプロットされます。特定されたバンドエッジ(\(E_V\) (Valence Band), \(E_C\) (Conduction Band), \(E_{HOMO}\) (Highest Occupied Molecular Orbital), \(E_{LUMO}\) (Lowest Unoccupied Molecular Orbital))および初期のフェルミ準位 (\(E_{F0}\)) が、それぞれのプロットに点線で示されます。
図は高解像度 (300dpi) で、透明背景で保存されます。
コマンドラインでの使用例 (Usage)
vasp_plot_dos.py は、以下の書式でコマンドラインから実行されます。引数を省略した場合、カッコ内のデフォルト値が適用されます。
python vasp_plot_dos.py mode CAR_dir Emin Emax occ_th Gaussian_width save_figure plot_figure plot_figure_Ne
mode: プログラムの実行モード。現在サポートされているのは'DOS'のみです。CAR_dir: VASPの出力ファイル(DOSCAR,OUTCARなど)が格納されているディレクトリのパス。デフォルト:
.(カレントディレクトリ)
Emin: プロットするエネルギー範囲の下限 (eV)。デフォルト:
-10.0
Emax: プロットするエネルギー範囲の上限 (eV)。デフォルト:
10.0
occ_th: HOMOとLUMOを分離するための占有率の閾値。この値を超える占有率を持つバンドがHOMO、下回るものがLUMO探索の対象となります。デフォルト:
0.5
Gaussian_width: DOSデータのスムージングに用いるガウス関数の幅 (標準偏差 \(\sigma\), 単位: eV)。0.0を指定するとスムージングは行われません。デフォルト:
0.0
save_figure: プロットされた図をPNGファイル (dos.png) として保存するかどうか。1: 保存する (デフォルト)0: 保存しない
plot_figure: プロットされた図を画面に表示するかどうか。1: 表示する (デフォルト)0: 表示しない
plot_figure_Ne: 電子数積算曲線 (\(N_e\)) をプロットに含めるかどうか。1: 含める (デフォルト)0: 含めない (DOSのみをプロット)
コマンドラインでの具体的な使用例
例1: デフォルトに近い設定で実行(スムージング適用)
カレントディレクトリにあるVASP出力ファイルからDOSを読み込み、エネルギー範囲を-10 eVから10 eV、ガウス幅0.2 eVでスムージングを適用してプロットします。図はPNGファイルとして保存され、画面にもDOSと電子数積算曲線の両方が表示されます。
python vasp_plot_dos.py DOS . -10 10 0.5 0.2 1 1 1
実行結果の説明:
プログラムはまずVASPの出力ファイルを読み込み、POSCAR, INCAR, OUTCAR, EIGENVAL, DOSCAR のパスを表示します。次に、OUTCARからフェルミ準位とスピン情報、DOSCARからDOSのエネルギー範囲、EIGENVALからバンドエッジ情報(HOMO, LUMO, \(E_V\), \(E_C\), \(E_g\))を抽出してターミナルに出力します。その後、指定されたガウス幅でDOSをスムージングし、MatplotlibウィンドウにDOSと\(N_e\)の両方を表示します。ウィンドウを閉じると、dos.png という名前の画像ファイルがカレントディレクトリに生成されます。
例2: 特定のディレクトリから読み込み、スムージングなし、DOSのみ表示
./my_vasp_calc というディレクトリにあるVASP出力ファイルからDOSを読み込みます。エネルギー範囲は-5 eVから5 eVに限定し、スムージングは適用しません。図はPNGファイルとして保存され、画面にも表示されますが、電子数積算曲線はプロットされません。
python vasp_plot_dos.py DOS ./my_vasp_calc -5 5 0.5 0.0 1 1 0
実行結果の説明:
プログラムは指定された ./my_vasp_calc ディレクトリ内のVASP出力ファイルを処理します。ターミナルには、my_vasp_calc ディレクトリ内のファイルのパスや解析結果が表示されます。ガウス幅が0.0のため、生のDOSデータがプロットされます。MatplotlibウィンドウにはDOSのみが表示され、バンドエッジが点線で示されます。ウィンドウを閉じると、カレントディレクトリに dos.png が保存されます。この dos.png には、DOSグラフのみが含まれ、\(N_e\)グラフは含まれません。