tkfermi_integral プログラム仕様

Fermi-Dirac積分を高速かつ堅牢に計算するためのライブラリ。

このモジュールは、フェルミ・ディラック積分 F_r(eta) の様々な次数 r に対する効率的な計算を提供します。 半導体物理学や統計物理学におけるキャリア密度や関連する熱力学的特性の計算に利用できます。 特に、整数次数 r=-1, 0, 1 に対しては解析解を用いた高速化が施されており、 その他の次数では漸近展開や数値積分を組み合わせて高い精度と性能を実現しています。

tkfermi_integral.py ドキュメント

FermiIntegral_3half(eta, *, epsabs=1e-10, epsrel=1e-08, limit=50)[ソース]

フェルミ・ディラック積分 F_{3/2}(eta) を計算します。

この関数は、FermiIntegral_fast 関数のラッパーであり、 積分の次数 r1.5 に固定して呼び出すことで、特定の次数を便利に計算できるようにします。 非放物型バンドにおけるキャリア密度や、その他の物理量の計算に利用されます。

パラメータ:
  • eta (float) -- 無次元化学ポテンシャル E_f / kT

  • epsabs (float) -- (キーワード引数) 数値積分の絶対許容誤差。デフォルトは1.0e-10です。

  • epsrel (float) -- (キーワード引数) 数値積分の相対許容誤差。デフォルトは1.0e-8です。

  • limit (int) -- (キーワード引数) scipy.integrate.quad で使用される最大部分区間数。デフォルトは50です。

戻り値:

フェルミ・ディラック積分 F_{3/2}(eta) の値。

戻り値の型:

float

FermiIntegral_fast(eta, r, *, epsabs=1e-10, epsrel=1e-08, limit=50, use_cache=True)[ソース]

一般的なフェルミ・ディラック積分 F_r(eta) を高速かつ高精度に計算します。

この関数は、以下の優先順位で計算方法を適用します。

  1. 整数次数 `r = -1, 0, 1` の場合: それぞれ expit(eta), log(1 + exp(eta)), および dilogarithmscipy.special.spence)を用いた解析解または特殊関数によって高速に計算されます。 r = 1 の非常に大きな eta に対しては、漸近展開も利用されます。

  2. その他の次数および `eta` の範囲: _FermiIntegral_core を呼び出して、縮退近似、非縮退近似、または数値積分を適用します。 use_cacheTrue の場合、計算結果は _FermiIntegral_cached を通じてキャッシュされます。

パラメータ:
  • eta (float) -- 無次元化学ポテンシャル E_f / kT

  • r (float) -- フェルミ・ディラック積分の次数。

  • epsabs (float) -- (キーワード引数) 数値積分の絶対許容誤差。デフォルトは1.0e-10です。

  • epsrel (float) -- (キーワード引数) 数値積分の相対許容誤差。デフォルトは1.0e-8です。

  • limit (int) -- (キーワード引数) scipy.integrate.quad で使用される最大部分区間数。デフォルトは50です。

  • use_cache (bool) -- (キーワード引数) 計算結果をキャッシュするかどうか。デフォルトはTrueです。

戻り値:

フェルミ・ディラック積分の値。

戻り値の型:

float

FermiIntegral_half(eta, *, epsabs=1e-10, epsrel=1e-08, limit=50)[ソース]

フェルミ・ディラック積分 F_{1/2}(eta) を計算します。

この関数は、FermiIntegral_fast 関数のラッパーであり、 積分の次数 r0.5 に固定して呼び出すことで、特定の次数を便利に計算できるようにします。 半導体中の電子濃度計算によく用いられます。

パラメータ:
  • eta (float) -- 無次元化学ポテンシャル E_f / kT

  • epsabs (float) -- (キーワード引数) 数値積分の絶対許容誤差。デフォルトは1.0e-10です。

  • epsrel (float) -- (キーワード引数) 数値積分の相対許容誤差。デフォルトは1.0e-8です。

  • limit (int) -- (キーワード引数) scipy.integrate.quad で使用される最大部分区間数。デフォルトは50です。

戻り値:

フェルミ・ディラック積分 F_{1/2}(eta) の値。

戻り値の型:

float

electron_density(Nc, eta_c, *, epsabs=1e-10, epsrel=1e-08, limit=50)[ソース]

導電帯における電子濃度を計算します(非放物型効果は無視し、標準的な放物型バンドを仮定)。

このライブラリで定義される(非正規化)フェルミ・ディラック積分 I_{1/2}(eta) は、 ∫_0^∞ ε^{1/2} / (1 + exp(ε - eta)) dε であり、ガンマ関数による除算は行われません。 したがって、電子濃度 n は以下の式で与えられます。

n = Nc * (2/sqrt(pi)) * I_{1/2}(eta_c)

この関数は eta_c がスカラーでもNumpy配列でも対応し、それぞれの eta_c に対して FermiIntegral_half を呼び出して電子濃度を計算します。

パラメータ:
  • Nc (float) -- 導電帯の実効状態密度 [cm^-3] または [m^-3]。単位は結果に引き継がれます。

  • eta_c (float or numpy.ndarray) -- 電子に対する無次元化学ポテンシャル eta_c = (Ef - Ec) / (kT)

  • epsabs (float) -- (キーワード引数) 数値積分の絶対許容誤差。デフォルトは1.0e-10です。

  • epsrel (float) -- (キーワード引数) 数値積分の相対許容誤差。デフォルトは1.0e-8です。

  • limit (int) -- (キーワード引数) scipy.integrate.quad で使用される最大部分区間数。デフォルトは50です。

戻り値:

Nc と同じ単位の電子濃度。eta_c がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

fermi_dirac_e(x, eta, g=1.0)[ソース]

フェルミ・ディラック分布関数 f = 1 / (1 + g * exp(x - eta)) を計算します。

この関数は、scipy.special.expit (ロジスティックシグモイド関数) を使用して、 exp(x - eta) が非常に大きいまたは小さい場合に発生する可能性のある 数値的な不安定性(オーバーフローやアンダーフロー)を回避し、 よりロバストな計算を提供します。

パラメータ:
  • x (float or numpy.ndarray) -- 無次元エネルギー E / kT

  • eta (float or numpy.ndarray) -- 無次元化学ポテンシャル E_f / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

フェルミ・ディラック分布関数の値。x または eta がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

fermi_dirac_e_if(x, eta, g=1.0)[ソース]

フェルミ・ディラック分布関数 f = 1 / (1 + g * exp(x - eta)) を計算します。

この関数は、x - eta の値に基づいて条件分岐を使用し、 指数関数 exp() の引数が非常に大きくなったり小さくなったりする場合の 数値的な安定性(オーバーフローやアンダーフロー)を確保します。 xlim_exp の範囲外では、結果を 0.0 または 1.0 にクリップします。

パラメータ:
  • x (float) -- 無次元エネルギー E / kT

  • eta (float) -- 無次元化学ポテンシャル E_f / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

フェルミ・ディラック分布関数の値。

戻り値の型:

float

fermi_dirac_e_npvector(x)[ソース]

与えられたエネルギー x = (E - E_f) / kT のNumpy配列に対するフェルミ・ディラック分布関数を計算します。

この関数は、数値的な安定性を確保するために、x の値を [-xlim_exp, xlim_exp] の範囲にクリップします。 また、x の符号に応じて計算方法を切り替えることで、大きな x の値に対してもオーバーフローやアンダーフローを防ぎます。

パラメータ:

x (numpy.ndarray) -- 無次元エネルギー (E - E_f) / kT を表すNumpy配列。

戻り値:

各エネルギー x に対応するフェルミ・ディラック分布関数の値。

戻り値の型:

numpy.ndarray

fermi_dirac_h(x, eta, g=1.0)[ソース]

正孔(ホール)の占有確率 1 - f を計算します。

この関数は、1 - f = 1 / (1 + g * exp(eta - x)) という形で定義される正孔の確率を、 scipy.special.expit を使用して数値的に安定な方法で計算します。 フェルミ・ディラック分布関数 f と同様に、g はスピン縮重因子です。

パラメータ:
  • x (float or numpy.ndarray) -- 無次元エネルギー E / kT

  • eta (float or numpy.ndarray) -- 無次元化学ポテンシャル E_f / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

正孔の占有確率 1 - f の値。x または eta がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

generate_sommerfeld_coeffs(n_terms)[ソース]

ゾンマーフェルト展開に使用される係数を生成します。

この関数は、フェルミ・ディラック積分の縮退近似(ゾンマーフェルト展開) において使用される定数 z_k = (1 - 2^(1-2k)) * zeta(2k) を計算します。 zeta(s, q) はフルヴィッツのゼータ関数です。

パラメータ:

n_terms (int) -- 生成する係数の数。

戻り値:

生成されたゾンマーフェルト展開係数のタプル。

戻り値の型:

tuple[float]

hole_density(Nv, eta_v, *, epsabs=1e-10, epsrel=1e-08, limit=50)[ソース]

価電子帯における正孔濃度を計算します(標準的な放物型バンドを仮定)。

このライブラリで定義される(非正規化)フェルミ・ディラック積分 I_{1/2} を使用して、 正孔濃度 p は以下の式で計算されます。

p = Nv * (2/sqrt(pi)) * I_{1/2}( beta(Ev - Ef) )

eta_v = (Ef - Ev) / (kT) として渡される場合、beta(Ev - Ef) = -eta_v となるため、 FermiIntegral_half(-eta_v) を呼び出す必要があります。 この関数は eta_v がスカラーでもNumpy配列でも対応し、それぞれの eta_v に対して FermiIntegral_half を呼び出して正孔濃度を計算します。

パラメータ:
  • Nv (float) -- 価電子帯の実効状態密度 [cm^-3] または [m^-3]。単位は結果に引き継がれます。

  • eta_v (float or numpy.ndarray) -- 無次元化学ポテンシャル eta_v = (Ef - Ev) / (kT)

  • epsabs (float) -- (キーワード引数) 数値積分の絶対許容誤差。デフォルトは1.0e-10です。

  • epsrel (float) -- (キーワード引数) 数値積分の相対許容誤差。デフォルトは1.0e-8です。

  • limit (int) -- (キーワード引数) scipy.integrate.quad で使用される最大部分区間数。デフォルトは50です。

戻り値:

Nv と同じ単位の正孔濃度。eta_v がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

ionized_acceptor_frac(eta, xA, g=1.0)[ソース]

イオン化されたアクセプターの割合を計算します。

この関数は、アクセプター準位が電子で占有されている確率として定義される、 イオン化されたアクセプターの割合 N_A^- / N_A を計算します。 基本的なフェルミ・ディラック分布関数 fermi_dirac_e のラッパーです。

パラメータ:
  • eta (float or numpy.ndarray) -- 無次元化学ポテンシャル E_f / kT

  • xA (float or numpy.ndarray) -- 無次元アクセプター準位エネルギー E_A / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

イオン化されたアクセプターの割合。eta または xA がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

ionized_donor_frac(eta, xD, g=1.0)[ソース]

イオン化されたドナーの割合を計算します。

この関数は、ドナー準位が正孔で占有されている(つまり電子を放出した)確率として定義される、 イオン化されたドナーの割合 N_D^+ / N_D を計算します。 基本的な正孔の占有確率関数 fermi_dirac_h のラッパーです。

パラメータ:
  • eta (float or numpy.ndarray) -- 無次元化学ポテンシャル E_f / kT

  • xD (float or numpy.ndarray) -- 無次元ドナー準位エネルギー E_D / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

イオン化されたドナーの割合。eta または xD がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

log_fermi_dirac_e(x, eta, g=1.0)[ソース]

フェルミ・ディラック分布関数 f の自然対数 log(f) を安定的に計算します。

この関数は f = 1 / (1 + g * exp(x - eta)) の対数を計算しますが、 scipy.special.log_expit を使用することで、f が非常に小さい(0に近い)場合に log(f) を直接計算する際のアンダーフロー問題を回避します。

パラメータ:
  • x (float or numpy.ndarray) -- 無次元エネルギー E / kT

  • eta (float or numpy.ndarray) -- 無次元化学ポテンシャル E_f / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

フェルミ・ディラック分布関数の自然対数値。x または eta がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

log_fermi_dirac_h(x, eta, g=1.0)[ソース]

正孔(ホール)の占有確率 1 - f の自然対数 log(1 - f) を安定的に計算します。

この関数は 1 - f = 1 / (1 + g * exp(eta - x)) の対数を計算しますが、 scipy.special.log_expit を使用することで、1 - f が非常に小さい(0に近い)場合に log(1 - f) を直接計算する際のアンダーフロー問題を回避します。

パラメータ:
  • x (float or numpy.ndarray) -- 無次元エネルギー E / kT

  • eta (float or numpy.ndarray) -- 無次元化学ポテンシャル E_f / kT

  • g (float) -- スピン縮重因子。デフォルトは1.0です。

戻り値:

正孔の占有確率の自然対数値。x または eta がNumpy配列の場合、結果もNumpy配列となります。

戻り値の型:

float or numpy.ndarray

n_deg_coeffs = 10
_deg_coeffs = [

(1.0 - 2.0 ** (-(2 * k + 1))) * float(zeta(2 * k + 2, 1.0)) for k in range(n_deg_coeffs)

]