vasp_ef プログラム仕様
VASPのDOSCARファイルに基づいてキャリア密度とフェルミ準位を計算するスクリプト。
概要: VASPが出力するDOSCARファイルから得られた状態密度(DOS)データを用いて、 半導体のフェルミ準位(EF)とキャリア密度(電子、正孔、イオン化ドーパント)の温度依存性またはEF依存性を計算し、 結果をグラフで可視化します。
詳細説明: このスクリプトは、VASPのDOSCARから読み取った全状態密度(DOS)と、 INCAR/POSCAR/CONTCARから取得したセル情報を用いて、半導体中の電荷キャリア濃度を計算します。 主に以下の二つのモードで動作します。
温度依存性 ('T'モード): 指定された温度範囲で、電荷中性条件を満たすフェルミ準位を数値的に探索します。 各温度における電子濃度、正孔濃度、イオン化ドナー・アクセプター濃度、ホール係数、 および見かけの活性化エネルギーを計算し、結果をプロットします。 フェルミ準位の探索には、バイセクション法またはニュートン法が用いられます。
フェルミ準位依存性 ('EF'モード): 指定された固定温度において、フェルミ準位を変化させた場合のキャリア濃度、ホール係数、 および熱平衡時の有効温度 (T0) を計算します。 これにより、伝導帯と価電子帯の有効状態密度を推定することも可能です。 結果は、DOSプロット、キャリア濃度対EFプロット、ホール係数対EFプロット、T0対EFプロットとして表示されます。
スクリプトはVASPの出力ファイルを自動的に検索し、DOSデータを体積あたりに変換します。 また、ユーザーはドナーおよびアクセプターの準位と濃度を設定して、計算に含めることができます。
関連リンク: vasp_ef.py 技術ドキュメント
- VASP.vasp_ef.CalEF(T, EF0, E0, E1, totNe)[ソース]
概要: 電荷中性条件に基づいてフェルミ準位を計算します。 詳細説明:
ニュートン法(scipy.optimize.newton) を使用して、指定された総電子数`totNe`と 電子密度`Ne`が等しくなるようなフェルミ準位`EF`を探索します。 この関数は現在、スクリプト内で使用されていません。
:param : param T: 温度 (K)。 :param : type T: float :param : param EF0: フェルミ準位の初期推定値 (eV)。 :param : type EF0: float :param : param E0: 電子密度計算の積分範囲下限 (eV)。 :param : type E0: float :param : param E1: 電子密度計算の積分範囲上限 (eV)。 :param : type E1: float :param : param totNe: 総電子数。 :param : type totNe: float
- 戻り値:
returns: 計算されたフェルミ準位 (eV)。 :rtype: float
- VASP.vasp_ef.DOS(E)[ソース]
概要: 指定されたエネルギーにおけるDOS (状態密度) を返します。 詳細説明:
:param : param E: エネルギー (eV)。 :param : type E: float
- 戻り値:
returns: 指定されたエネルギーにおけるDOS (states/eV/Vcell)。 :rtype: float
- VASP.vasp_ef.DOSfe(E, T, EF)[ソース]
概要: DOSと電子のフェルミ・ディラック分布関数の積を計算します。 詳細説明:
積分計算のために、エネルギー`E`におけるDOSと電子の占有確率`fe`の積を返します。
:param : param E: エネルギー (eV)。 :param : type E: float :param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float
- 戻り値:
returns: DOS(E) * fe(E, T, EF) の値。 :rtype: float
- VASP.vasp_ef.DOSfh(E, T, EF)[ソース]
概要: DOSと正孔のフェルミ・ディラック分布関数の積を計算します。 詳細説明:
積分計算のために、エネルギー`E`におけるDOSと正孔の占有確率`fh`の積を返します。
:param : param E: エネルギー (eV)。 :param : type E: float :param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float
- 戻り値:
returns: DOS(E) * fh(E, T, EF) の値。 :rtype: float
- VASP.vasp_ef.FindBandEdges(E, DOS, Emidgap, DOSth)[ソース]
概要: バンドエッジ (価電子帯上端 EV, 伝導帯下端 EC) を探索します。 詳細説明:
状態密度(DOS)データと指定されたバンドギャップ中間エネルギーの初期推定値、 およびDOSのしきい値を用いて、価電子帯上端 (EV) と伝導帯下端 (EC) を特定します。 EmidgapからDOSがしきい値DOSthを下回る領域を探索し、そこからバンドエッジを決定します。
:param : param E: エネルギーの配列。 :param : type E: list of float :param : param DOS: DOSの配列。 :param : type DOS: list of float :param : param Emidgap: バンドギャップ中間エネルギーの初期推定値 (eV)。 :param : type Emidgap: float :param : param DOSth: DOSのしきい値。これを超えるDOS値を持つエネルギーをバンドエッジとみなします。 :param : type DOSth: float
- 戻り値:
- returns: (EV, EC)のタプル。
EV (float): 価電子帯上端のエネルギー (eV)。 EC (float): 伝導帯下端のエネルギー (eV)。
- rtype:
tuple
- VASP.vasp_ef.NAm(EF, T)[ソース]
概要: イオン化アクセプター密度を計算します。 詳細説明:
全アクセプター濃度`NA`とアクセプター準位`EA`、温度`T`、フェルミ準位`EF`を用いて、 イオン化されたアクセプターの密度を計算します。 アクセプター準位は電子によって占有されている場合にイオン化されます (fe(EA, T, EF))。
:param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param T: 温度 (K)。 :param : type T: float
- 戻り値:
returns: イオン化アクセプター密度。 :rtype: float
- VASP.vasp_ef.NDp(EF, T)[ソース]
概要: イオン化ドナー密度を計算します。 詳細説明:
全ドナー濃度`ND`とドナー準位`ED`、温度`T`、フェルミ準位`EF`を用いて、 イオン化されたドナーの密度を計算します。 ドナー準位は電子によって占有されていない場合にイオン化されます (1 - fe(ED, T, EF))。
:param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param T: 温度 (K)。 :param : type T: float
- 戻り値:
returns: イオン化ドナー密度。 :rtype: float
- VASP.vasp_ef.Ne(T, EF, E0, E1)[ソース]
概要: 指定されたエネルギー範囲における電子密度を計算します。 詳細説明:
DOSfe`関数を`integrate`関数で数値積分し、温度`T、フェルミ準位`EF`、 エネルギー範囲`[E0, E1]`における電子の総数を計算します。
:param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param E0: 積分範囲の下限 (eV)。 :param : type E0: float :param : param E1: 積分範囲の上限 (eV)。 :param : type E1: float
- 戻り値:
returns: 計算された電子密度。 :rtype: float
- VASP.vasp_ef.Nh(T, EF, E0, E1)[ソース]
概要: 指定されたエネルギー範囲における正孔密度を計算します。 詳細説明:
DOSfh`関数を`integrate`関数で数値積分し、温度`T、フェルミ準位`EF`、 エネルギー範囲`[E0, E1]`における正孔の総数を計算します。
:param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param E0: 積分範囲の下限 (eV)。 :param : type E0: float :param : param E1: 積分範囲の上限 (eV)。 :param : type E1: float
- 戻り値:
returns: 計算された正孔密度。 :rtype: float
- VASP.vasp_ef.cal_densities(T, EF, ECmin, ECmax, EVmin, EVmax)[ソース]
概要: 電子、正孔、イオン化ドナー、イオン化アクセプターの密度を計算します。 詳細説明:
指定された温度`T`とフェルミ準位`EF`、および伝導帯と価電子帯の積分範囲を用いて、 各種キャリア密度と電荷不均衡を計算します。 電荷不均衡は Ne + NAm - Nh - NDp で定義されます。
:param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param ECmin: 伝導帯積分範囲の下限 (eV)。 :param : type ECmin: float :param : param ECmax: 伝導帯積分範囲の上限 (eV)。 :param : type ECmax: float :param : param EVmin: 価電子帯積分範囲の下限 (eV)。 :param : type EVmin: float :param : param EVmax: 価電子帯積分範囲の上限 (eV)。 :param : type EVmax: float
- 戻り値:
- returns: (Ne1, Nh1, NDp1, NAm1, dN) のタプル。
Ne1 (float): 電子密度。 Nh1 (float): 正孔密度。 NDp1 (float): イオン化ドナー密度。 NAm1 (float): イオン化アクセプター密度。 dN (float): 電荷不均衡 (Ne1 + NAm1 - Nh1 - NDp1)。
- rtype:
tuple
- VASP.vasp_ef.callbackfunc(obj)[ソース]
概要: 最適化アルゴリズムのイテレーション中に呼び出されるコールバック関数です。 詳細説明:
`tkequation.Equation`クラスのソルバーがイテレーションごとに現在の状態 (イテレーション回数、現在のx値、探索範囲、ステップサイズなど)を コンソールに出力します。これにより、収束過程を監視できます。
:param : param obj: 現在の最適化ソルバーオブジェクト。 :param : type obj: tkequation.Equation
- 戻り値:
returns: 常に1を返します(ソルバーの続行を指示)。 :rtype: int
- VASP.vasp_ef.dQ(T, EF, ECmin, ECmax, EVmin, EVmax, N0)[ソース]
概要: 電荷中性からの逸脱を計算します。 詳細説明:
`cal_densities`関数を用いて計算された電荷不均衡から、 基準となる過剰電子密度`N0`を差し引いた値を返します。 これはフェルミ準位探索の目的関数として使用されます。
:param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param ECmin: 伝導帯積分範囲の下限 (eV)。 :param : type ECmin: float :param : param ECmax: 伝導帯積分範囲の上限 (eV)。 :param : type ECmax: float :param : param EVmin: 価電子帯積分範囲の下限 (eV)。 :param : type EVmin: float :param : param EVmax: 価電子帯積分範囲の上限 (eV)。 :param : type EVmax: float :param : param N0: 基準となる過剰電子密度。 :param : type N0: float
- 戻り値:
returns: 電荷不均衡から基準値を差し引いた値。 :rtype: float
- VASP.vasp_ef.diff(h, T, EF, ECmin, ECmax, EVmin, EVmax, N0)[ソース]
概要: `dQ`関数の数値微分を計算します。 詳細説明:
中心差分法を用いて、`dQ`関数をフェルミ準位`EF`に関して数値微分します。 これはフェルミ準位探索(ニュートン法)のヤコビアンとして使用されます。
:param : param h: 微分に使用するステップサイズ。 :param : type h: float :param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float :param : param ECmin: 伝導帯積分範囲の下限 (eV)。 :param : type ECmin: float :param : param ECmax: 伝導帯積分範囲の上限 (eV)。 :param : type ECmax: float :param : param EVmin: 価電子帯積分範囲の下限 (eV)。 :param : type EVmin: float :param : param EVmax: 価電子帯積分範囲の上限 (eV)。 :param : type EVmax: float :param : param N0: 基準となる過剰電子密度。 :param : type N0: float
- 戻り値:
returns: dQ関数のEFに関する数値微分値。 :rtype: float
- VASP.vasp_ef.exec_EF()[ソース]
概要: フェルミ準位変化に伴うキャリア密度と関連パラメータを計算し、プロットします。 詳細説明:
指定された固定温度`T0`において、`EFmin`から`EFmax`までのフェルミ準位範囲で、 電子密度、正孔密度、イオン化ドナー・アクセプター密度、ホール係数、 および熱平衡時の有効温度 (T0) を計算します。 さらに有効状態密度を推定します。 計算結果をコンソールに出力し、Matplotlibでグラフとして表示します。
- パラメータ:
なし
- 戻り値:
なし
- VASP.vasp_ef.exec_T()[ソース]
概要: 温度変化に伴うフェルミ準位とキャリア密度を計算し、プロットします。 詳細説明:
`Tmin`から`Tmax`までの温度範囲で、電荷中性条件を満たすフェルミ準位を バイセクション法またはニュートン法で探索します。 各温度におけるフェルミ準位、電子濃度、正孔濃度、イオン化ドナー・アクセプター濃度、 ホール係数、および見かけの活性化エネルギーを計算し、コンソールに出力します。 最後に、Matplotlibを用いて結果をグラフで可視化します。
- パラメータ:
なし
- 戻り値:
なし
- VASP.vasp_ef.fe(E, T, EF)[ソース]
概要: フェルミ・ディラック分布関数を計算します (電子の場合)。 詳細説明:
指定されたエネルギー`E`、温度`T`、フェルミ準位`EF`における電子の占有確率を計算します。 温度`T`が0の場合、EFより低いエネルギーでは1、高いエネルギーでは0を返します。
:param : param E: エネルギー (eV)。 :param : type E: float :param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float
- 戻り値:
returns: フェルミ・ディラック分布関数の値 (0から1)。 :rtype: float
- VASP.vasp_ef.fh(E, T, EF)[ソース]
概要: フェルミ・ディラック分布関数の穴の占有確率を計算します (正孔の場合)。 詳細説明:
電子の場合のフェルミ・ディラック分布関数`fe`を用いて、正孔の占有確率 (1 - fe) を計算します。
:param : param E: エネルギー (eV)。 :param : type E: float :param : param T: 温度 (K)。 :param : type T: float :param : param EF: フェルミ準位 (eV)。 :param : type EF: float
- 戻り値:
returns: 正孔の占有確率 (0から1)。 :rtype: float
- VASP.vasp_ef.getarg(position, defval=None)[ソース]
概要: コマンドライン引数を取得します。 詳細説明:
sys.argvから指定された位置のコマンドライン引数を取得します。 引数が存在しない場合はデフォルト値を返します。
:param : param position: 取得する引数の位置(0はスクリプト名)。 :param : type position: int :param : param defval: 引数が見つからなかった場合に返すデフォルト値。デフォルトはNone。 :param : type defval: any, optional
- 戻り値:
returns: 指定された位置の引数、またはデフォルト値。 :rtype: str or any
- VASP.vasp_ef.getfloatarg(position, defval=None)[ソース]
概要: コマンドライン引数を浮動小数点数として取得します。 詳細説明:
getargで取得した文字列をpfloat関数で浮動小数点数に変換して返します。
:param : param position: 取得する引数の位置。 :param : type position: int :param : param defval: 引数が見つからなかった場合に返すデフォルト値。デフォルトはNone。 :param : type defval: float, optional
- 戻り値:
returns: 変換された浮動小数点数、またはNone。 :rtype: float or None
- VASP.vasp_ef.getintarg(position, defval=None)[ソース]
概要: コマンドライン引数を整数として取得します。 詳細説明:
getargで取得した文字列をpint関数で整数に変換して返します。
:param : param position: 取得する引数の位置。 :param : type position: int :param : param defval: 引数が見つからなかった場合に返すデフォルト値。デフォルトはNone。 :param : type defval: int, optional
- 戻り値:
returns: 変換された整数、またはNone。 :rtype: int or None
- VASP.vasp_ef.integrate(func, E0, E1, h)[ソース]
概要: 台形公式を用いて関数を数値積分します。 詳細説明:
指定された関数`func`をエネルギー範囲`[E0, E1]`でステップサイズ`h`を用いて台形公式で数値積分します。 戻り値の2つ目の要素は常に-1.0で、エラー情報は含まれません。
:param : param func: 積分する関数。引数としてエネルギー (float) を取ります。 :param : type func: callable :param : param E0: 積分範囲の下限 (eV)。 :param : type E0: float :param : param E1: 積分範囲の上限 (eV)。 :param : type E1: float :param : param h: 積分ステップサイズ (eV)。 :param : type h: float
- 戻り値:
returns: [積分値, エラーコード]のリスト。エラーコードは常に-1.0。 :rtype: list
- VASP.vasp_ef.main()[ソース]
概要: スクリプトのメインエントリポイントです。 詳細説明:
コマンドライン引数を解析し、VASPファイル(POSCAR, DOSCAR)から 結晶構造情報と状態密度 (DOS) データを読み込みます。 読み込んだ情報に基づいて、バンドエッジ (EV, EC)、ドーパント準位、 および数値積分パラメータを設定します。 その後、グローバル変数`mode`の値に応じて`exec_T`または`exec_EF`関数を呼び出し、 キャリア密度とフェルミ準位の計算を実行します。
- パラメータ:
なし
- 戻り値:
なし
- VASP.vasp_ef.pfloat(str)[ソース]
概要: 文字列を浮動小数点数に変換します。 詳細説明:
与えられた文字列を浮動小数点数に変換します。 変換に失敗した場合はNoneを返します。
:param : param str: 変換する文字列。 :param : type str: str
- 戻り値:
returns: 変換された浮動小数点数、またはNone。 :rtype: float or None
- VASP.vasp_ef.pint(str)[ソース]
概要: 文字列を整数に変換します。 詳細説明:
与えられた文字列を整数に変換します。 変換に失敗した場合はNoneを返します。
:param : param str: 変換する文字列。 :param : type str: str
- 戻り値:
returns: 変換された整数、またはNone。 :rtype: int or None
- VASP.vasp_ef.read_csv(infile, xmin=None, xmax=None, delimiter=',')[ソース]
概要: CSVファイルからデータを読み込みます。 詳細説明:
指定されたCSVファイルからヘッダーと2つのカラム(通常x, y)のデータを読み込みます。 xminとxmaxが指定されている場合、x値がその範囲内のデータのみを抽出します。 ファイル読み込みに失敗した場合はエラーメッセージを表示し、プログラムを終了します。
:param : param infile: 入力ファイル名。 :param : type infile: str :param : param xmin: 読み込むx値の最小値。Noneの場合、制限なし。 :param : type xmin: float, optional :param : param xmax: 読み込むx値の最大値。Noneの場合、制限なし。 :param : type xmax: float, optional :param : param delimiter: CSVの区切り文字。デフォルトは','。 :param : type delimiter: str, optional
- 戻り値:
- returns: (header, x_data, y_data)のタプル。
header (list of str): CSVファイルのヘッダー。 x_data (list of float): 最初のカラムのデータ。 y_data (list of float): 2番目のカラムのデータ。
- rtype:
tuple
- VASP.vasp_ef.rieman(x0, dx, y, xmin, xmax)[ソース]
概要: リーマン和を用いて積分を近似計算します。 詳細説明:
与えられたデータ配列yとステップサイズdx、開始点x0を用いて、 指定された範囲[xmin, xmax]におけるリーマン和を計算します。 この関数は現在、スクリプト内で使用されていません。
:param : param x0: データの開始x座標。 :param : type x0: float :param : param dx: x方向のステップサイズ。 :param : type dx: float :param : param y: y値の配列。 :param : type y: list of float :param : param xmin: 積分範囲の下限。 :param : type xmin: float :param : param xmax: 積分範囲の上限。 :param : type xmax: float
- 戻り値:
returns: 計算されたリーマン和。 :rtype: float
- VASP.vasp_ef.savecsv(outfile, header, datalist)[ソース]
概要: データをCSVファイルに保存します。 詳細説明:
指定されたファイルパスにヘッダー行とデータリストを書き込みます。 datalistは各カラムのデータを含むリストのリストとして与えられます。 ファイル書き込みに失敗した場合はエラーメッセージを表示します。
:param : param outfile: 出力ファイル名。 :param : type outfile: str :param : param header: CSVファイルのヘッダー行。 :param : type header: list of str :param : param datalist: 書き込むデータ。各内部リストは1つのカラムに対応。 :param : type datalist: list of list
- 戻り値:
なし