EF_T_DOS プログラム仕様
- electrical.EF_T_DOS.CalEF(T, EF0, E0, E1, totNe)[ソース]
電荷中性条件に基づいてFermiレベルを計算する。
概要: 指定された温度`T`と電子の総数`totNe`に対し、電荷中性条件を満たすFermiレベル`EF`をNewton法で計算する。
詳細説明: `scipy.optimize.newton`メソッドを使用し、`Ne(T, EF, E0, E1) - totNe = 0`の根を探索します。 初期値として`EF0`が与えられます。この関数は、プログラム内で実際に使用されていません(二分法が採用されています)。
- electrical.EF_T_DOS.DOS(E)[ソース]
エネルギーEにおける状態密度 (DOS) を補間して取得する。
概要: 読み込まれたDOSデータ (E_raw, dos_raw) を用いて、任意のエネルギー`E`での状態密度を補間計算する。
詳細説明: キュビックスプライン補間 (scipy.interpolate.interp1d(kind='cubic')) を使用して、 離散的なDOSデータから連続的なDOS値を取得します。 要求されたエネルギー`E`が元のDOSデータの範囲外である場合、エラーメッセージを出力しプログラムを終了します。
- electrical.EF_T_DOS.DOSfe(E, T, EF)[ソース]
状態密度とFermi-Dirac分布関数の積を計算する。
概要: エネルギー`E`における状態密度 (DOS) と電子のFermi-Dirac分布関数 (fe) の積を返す。
詳細説明: 電子濃度を計算するための被積分関数として使用されます。
- electrical.EF_T_DOS.DOSfh(E, T, EF)[ソース]
状態密度と正孔のFermi-Dirac分布関数の積を計算する。
概要: エネルギー`E`における状態密度 (DOS) と正孔のFermi-Dirac分布関数 (fh) の積を返す。
詳細説明: 正孔濃度を計算するための被積分関数として使用されます。
- electrical.EF_T_DOS.FindBandEdges(E, DOS, EF0, Egth)[ソース]
バンドエッジ (価電子帯上端 EV と伝導帯下端 EC) を探索する。
概要: DOSデータとFermiレベルの初期値、DOS閾値に基づいて価電子帯上端 (EV) と伝導帯下端 (EC) を特定する。
詳細説明: DOS (状態密度) データ配列 DOS と対応するエネルギー配列 E を使用して、 まず`EF0`に近いエネルギーからDOS値が`Egth` (閾値) を超える点を探索します。 `EF0`より低いエネルギー側で`Egth`を超える最初の点の次のエネルギーをEVとし、 `EF0`より高いエネルギー側で`Egth`を超える最初の点の一つ前のエネルギーをECとします。
- electrical.EF_T_DOS.NAm(EF, T)[ソース]
イオン化されたアクセプター密度を計算する。
概要: 指定されたフェルミ準位`EF`と温度`T`における、イオン化されたアクセプターの密度を計算する。
詳細説明: アクセプター準位`EA`における電子のFermi-Dirac分布関数`fe`を用いて、 アクセプターが電子を受け入れてイオン化される確率`fe(EA, T, EF)`を計算し、 アクセプターの全密度`NA`に乗算します。
- electrical.EF_T_DOS.NDp(EF, T)[ソース]
イオン化されたドナー密度を計算する。
概要: 指定されたフェルミ準位`EF`と温度`T`における、イオン化されたドナーの密度を計算する。
詳細説明: ドナー準位`ED`における電子のFermi-Dirac分布関数`fe`を用いて、 ドナーが電子を放出してイオン化される確率`1 - fe(ED, T, EF)`を計算し、 ドナーの全密度`ND`に乗算します。
- electrical.EF_T_DOS.Ne(T, EF, E0, E1)[ソース]
特定のエネルギー範囲内の電子濃度を計算する。
概要: 指定された温度`T`、フェルミ準位`EF`、エネルギー範囲`[E0, E1]`における電子濃度を計算する。
詳細説明: `DOSfe`関数を`E0`から`E1`まで`integrate`関数 (台形公式) を用いて数値積分することで電子濃度を求めます。 デバッグモードが有効な場合、積分エラーが出力されます。
- electrical.EF_T_DOS.Nh(T, EF, E0, E1)[ソース]
特定のエネルギー範囲内の正孔濃度を計算する。
概要: 指定された温度`T`、フェルミ準位`EF`、エネルギー範囲`[E0, E1]`における正孔濃度を計算する。
詳細説明: `DOSfh`関数を`E0`から`E1`まで`integrate`関数 (台形公式) を用いて数値積分することで正孔濃度を求めます。 デバッグモードが有効な場合、積分エラーが出力されます。
- electrical.EF_T_DOS.exec_EF()[ソース]
Fermiレベル依存性の計算と結果のプロットを実行する。
概要: 特定の温度 (T0) の下で、フェルミ準位を掃引し、キャリア密度、ホール係数、有効状態密度などのEF依存性を計算・グラフ表示する。
詳細説明: EFmin`から`EFmax`までのフェルミ準位を`nEF`ステップで掃引し、各EFにおける 電子濃度 (`Ne)、正孔濃度 (Nh)、イオン化ドナー密度 (NDp)、 イオン化アクセプター密度 (NAm)、ホール係数 (RH) などを計算します。 さらに、有効状態密度 (NC, NV) も計算し、Matplotlibを使って複数のグラフにプロットして表示します。
- 戻り値:
なし (ただし、内部で終了処理を含む可能性あり)
- 戻り値の型:
None
- electrical.EF_T_DOS.exec_T()[ソース]
温度依存性の計算と結果のプロットを実行する。
概要: 指定された温度範囲でFermiレベル、キャリア密度、ホール係数などの温度依存性を計算し、結果をグラフ表示する。
詳細説明: Tmin`から`Tmax`までの温度を`nT`ステップで掃引し、各温度において電荷中性条件 (`Ne + NAm - Nh - NDp = 0) を満たすFermiレベル (EF) を二分法で決定します。 その後、電子濃度 (Ne)、正孔濃度 (Nh)、イオン化ドナー密度 (NDp)、 イオン化アクセプター密度 (NAm)、ホール係数 (RH) などを計算し、 Matplotlibを使って複数のグラフにプロットして表示します。
- 戻り値:
成功時は0を返す (エラー時は0以外の値を返すことがある)。
- 戻り値の型:
- electrical.EF_T_DOS.fe(E, T, EF)[ソース]
Fermi-Dirac分布関数を計算する。
概要: 指定されたエネルギー`E`、温度`T`、フェルミ準位`EF`における電子の占有確率を計算する。
詳細説明: Fermi-Dirac分布関数 1 / (exp((E - EF) * e / kB / T) + 1.0) を計算します。 温度`T`が0 Kの場合、Fermi準位`EF`より低いエネルギーでは1.0、高いエネルギーでは0.0を返します(ステップ関数)。
- electrical.EF_T_DOS.fh(E, T, EF)[ソース]
正孔のFermi-Dirac分布関数 (1 - fe) を計算する。
概要: 指定されたエネルギー`E`、温度`T`、フェルミ準位`EF`における正孔の占有確率を計算する。
詳細説明: 電子のFermi-Dirac分布関数`fe(E, T, EF)`の補数として計算されます。
- electrical.EF_T_DOS.getarg(position, defval=None)[ソース]
コマンドライン引数を取得する。
概要: 指定された位置のコマンドライン引数を取得する。
詳細説明: `sys.argv`リストから`position`で指定された位置の引数を取得します。 引数が存在しない場合は、`defval`で指定されたデフォルト値を返します。
- electrical.EF_T_DOS.getfloatarg(position, defval=None)[ソース]
コマンドライン引数を浮動小数点数として取得する。
概要: 指定された位置のコマンドライン引数を浮動小数点数に変換して取得する。
詳細説明: `getarg`で引数を取得した後、`pfloat`関数を用いてfloat型に変換します。 引数が存在しない場合や変換に失敗した場合は、`defval`で指定されたデフォルト値を返します。
- electrical.EF_T_DOS.getintarg(position, defval=None)[ソース]
コマンドライン引数を整数として取得する。
概要: 指定された位置のコマンドライン引数を整数に変換して取得する。
詳細説明: `getarg`で引数を取得した後、`pint`関数を用いてint型に変換します。 引数が存在しない場合や変換に失敗した場合は、`defval`で指定されたデフォルト値を返します。
- electrical.EF_T_DOS.integrate(func, E0, E1, h)[ソース]
台形公式を用いて関数を数値積分する。
概要: 与えられた関数`func`を`E0`から`E1`まで、ステップ幅`h`で台形公式により数値積分する。
詳細説明: 積分範囲`[E0, E1]`を`h`のステップで分割し、台形公式 h * (0.5 * (y0 + yn) + sum(y[1:n-1])) を適用して積分値を計算します。 scipy.integrate.quad`の代替として使用されます。エラー値は常に-1.0`を返します。
- electrical.EF_T_DOS.main()[ソース]
プログラムのメインエントリポイント。
概要: コマンドライン引数の処理、DOSCARデータの読み込み、バンドエッジの特定、および選択された計算モードの実行を行う。
詳細説明: 1. updatevars()`を呼び出してコマンドライン引数を解析し、グローバル変数を設定します。 2. 指定されたファイルからDOSデータを読み込み、セル体積でスケーリングします。 3. `FindBandEdges()`を使用して価電子帯上端 (`EV) と伝導帯下端 (EC) を特定します。 4. ドナーおよびアクセプター準位を設定します。 5. 設定された計算モード (mode) に基づいて、`exec_T()`または`exec_EF()`のいずれかを実行します。 モードが不正な場合はエラーメッセージを出力し終了します。
- 戻り値:
なし
- 戻り値の型:
None
- electrical.EF_T_DOS.read_csv(infile, xmin=None, xmax=None, delimiter=',')[ソース]
CSVファイルからデータを読み込む。
概要: 指定されたCSVファイルからヘッダーと2列の数値データを読み込む。
詳細説明: `infile`で指定されたCSVファイルを読み込み、最初の行をヘッダーとして解釈します。 その後の行から、1列目をxデータ、2列目をyデータとして読み込みます。 `xmin`と`xmax`が指定されている場合、xデータがこの範囲内の行のみが処理されます。
- electrical.EF_T_DOS.rieman(x0, dx, y, xmin, xmax)[ソース]
リーマン和を用いて数値を積分する。
概要: 与えられたy値の配列に対し、指定された範囲内でリーマン和による近似積分を行う。
詳細説明: x軸の開始点`x0`とステップ幅`dx`、そして対応するy値の配列`y`を用いて、 積分範囲`[xmin, xmax]`内でのy値の合計を計算し、`dx`を乗算して近似積分値を求めます。 この関数は単純なリーマン和であり、より高度な数値積分手法ではありません。
- electrical.EF_T_DOS.savecsv(outfile, header, datalist)[ソース]
データをCSVファイルに保存する。
概要: 指定されたヘッダーとデータリストをCSV形式でファイルに書き込む。
詳細説明: `outfile`で指定されたファイル名でCSVファイルを開き、`header`を1行目、 `datalist`の内容を以降の行に書き込みます。`datalist`は、各要素が1つの列に対応する リストのリストとして期待されます。