Seebeck_scan プログラム仕様

Seebeck_scan.py

概要: このスクリプトは、フェルミ準位、キャリア濃度、温度、有効質量を様々にスキャンしながら、熱電材料のゼーベック係数を計算しプロットします。

詳細説明: 散乱因子 r の異なる値に対して、以下のスキャンモードをサポートしています。 - EF (フェルミ準位): フェルミ準位をスキャンし、ゼーベック係数を計算します。 - Ne (キャリア濃度): キャリア濃度をスキャンし、ゼーベック係数を計算します。 - T (温度): 温度をスキャンし、ゼーベック係数を計算します。このモードでは、フェルミ準位、キャリア濃度、または還元フェルミ準位のいずれかを固定できます。 - m_eff (有効質量): 有効質量をスキャンし、ゼーベック係数を計算します。このモードでも、フェルミ準位、キャリア濃度、または還元フェルミ準位のいずれかを固定できます。

計算はFermi–Dirac積分に基づき、キャリアタイプ(電子または正孔)を指定できます。 結果はCSVファイルとして保存することも可能です。

散乱因子 r はキャリアの緩和時間 tau(E) がエネルギー E に対して tau(E)∝E^(r-1/2) で定義されます。

実行例:

# EF scan python Seebeck_scan.py --mode EF --T 300 --m_eff 1.0 --scan-min -0.2 --scan-max 0.5 --n 121

# Ne scan python Seebeck_scan.py --mode Ne --T 300 --m_eff 1.0 --scan-min 1e15 --scan-max 1e21 --n 121 --logscan

# T scan, EF固定 python Seebeck_scan.py --mode T --fixed EF --EF 0.10 --m_eff 1.0 --scan-min 100 --scan-max 800 --n 121

# T scan, Ne固定 python Seebeck_scan.py --mode T --fixed Ne --Ne 1e18 --m_eff 1.0 --scan-min 100 --scan-max 800 --n 121

# m_eff scan, Ne固定 python Seebeck_scan.py --mode m_eff --fixed Ne --Ne 1e18 --T 300 --scan-min 0.1 --scan-max 3.0 --n 121

# CSV保存 python Seebeck_scan.py --mode Ne --csv result.csv

関連リンク: Seebeck_scan.py 技術ドキュメント

electrical.Seebeck_scan.Fj(j, xi)[ソース]

フェルミ・ディラック積分を計算します(ガンマ関数による前因子なし)。

概要: Fj(j, xi) = ∫_0^∞ x^j / (1+exp(x-xi)) dx を数値的に評価します。

詳細説明: この関数は、引数 j と xi に対してフェルミ・ディラック積分を計算します。 標準的な定義に含まれる 1/Gamma(j+1) の前因子は含まれません。 計算結果は @lru_cache デコレータによってキャッシュされ、同じ引数での再計算を防ぎ、 パフォーマンスを向上させます。 j が -1.0 以下の場合、ValueError を発生させます。

パラメータ:
  • j -- float; フェルミ・ディラック積分の次数。j > -1 である必要があります。

  • xi -- float; 還元フェルミ準位 (xi = E_F / (k_B T))。

戻り値:

float; 計算されたフェルミ・ディラック積分の値。

electrical.Seebeck_scan.Nc_3D(T, m_eff=1.0)[ソース]

3次元における有効状態密度 Nc を計算します。

概要: 温度 T と有効質量 m_eff に基づいて、3次元バンドの有効状態密度 Nc を計算します。

パラメータ:
  • T -- float; 温度 [K]。

  • m_eff -- float; 有効質量比 m*/m0。m0 は自由電子質量です。

戻り値:

float; 計算された有効状態密度 Nc [m^-3]。

electrical.Seebeck_scan.default_scan_settings(mode)[ソース]

指定されたスキャンモードのデフォルト設定を返します。

概要: スキャンモードに基づいて、スキャン範囲の最小値、最大値、点数、および対数スケールフラグのデフォルト値を決定します。

パラメータ:

mode -- str; スキャンモード ("EF", "Ne", "T", "m_eff")。

戻り値:

tuple[float, float, int, bool]; (scan_min, scan_max, npts, logscan) のタプル。

例外:

ValueError -- 未知のスキャンモードが指定された場合。

electrical.Seebeck_scan.electron_density_from_xi(xi, T, m_eff=1.0)[ソース]

還元フェルミ準位 xi から電子濃度を計算します。

概要: 還元フェルミ準位 xi、温度 T、有効質量 m_eff を用いて電子濃度 n を計算します。

詳細説明: 電子濃度 n は以下の式で与えられます: n = Nc * F_{1/2}^{std}(xi) = Nc * Fj(1/2, xi) / Gamma(3/2) ここで、Nc は有効状態密度、Fj(1/2, xi) はガンマ関数による前因子を含まないフェルミ・ディラック積分です。

パラメータ:
  • xi -- float; 還元フェルミ準位。

  • T -- float; 温度 [K]。

  • m_eff -- float; 有効質量比 m*/m0。

戻り値:

float; 計算された電子濃度 n [m^-3]。

electrical.Seebeck_scan.main()[ソース]

ゼーベック係数スキャンプログラムのメインエントリポイント。

概要: コマンドライン引数をパースし、指定されたモードとパラメータに基づいてゼーベック係数を計算し、結果をプロットまたはCSVファイルに保存します。

詳細説明: - argparse を使用して、スキャンモード、固定条件、キャリアタイプ、基準温度、有効質量、フェルミ準位、電子濃度、還元フェルミ準位、散乱因子のリスト、スキャン範囲、点数、対数スキャンオプション、X軸スケール、CSV出力ファイル名、プロット表示の有無などの引数を定義します。 - デフォルトのスキャン設定を適用し、スキャン値の配列を生成します。 - 指定された散乱因子のリスト r_list の各値に対して、スキャン値 (xvals) ごとにゼーベック係数を計算します。 - 各計算結果は rows リストに追加され、後でCSVとして保存するために使用されます。 - 計算結果は matplotlib を使用してプロットされ、適切なラベル、タイトル、凡例が設定されます。 - --csv オプションが指定された場合、save_csv 関数を呼び出して結果を保存します。 - --no-show オプションが指定されない限り、プロットを表示します。

electrical.Seebeck_scan.make_scan_values(mode, scan_min, scan_max, npts, logscan)[ソース]

スキャンする値の配列を生成します。

概要: 指定された範囲 (scan_min, scan_max) と点数 npts に基づいて、 線形または対数スケールのスキャン値配列を生成します。

パラメータ:
  • mode -- str; スキャンモード。ログスキャン時に影響することがあるが、主にエラーメッセージ用。

  • scan_min -- float; スキャン範囲の最小値。

  • scan_max -- float; スキャン範囲の最大値。

  • npts -- int; スキャン点の数。

  • logscan -- bool; スキャン値を対数スケールで生成するかどうか。

戻り値:

numpy.ndarray; 生成されたスキャン値の配列。

例外:

ValueError -- 対数スキャンで scan_min または scan_max が0以下の場合。

electrical.Seebeck_scan.make_title(mode, carrier, fixed, T0, m_eff0, EF0_eV, Ne0_cm3, xi0)[ソース]

プロットのタイトル文字列を生成します。

概要: スキャンモード、キャリアタイプ、固定条件などのパラメータに基づいて、グラフのタイトルを作成します。

パラメータ:
  • mode -- str; スキャンモード ("EF", "Ne", "T", "m_eff")。

  • carrier -- str; キャリアタイプ ("electron" または "hole")。

  • fixed -- str; 固定された変数 ("EF", "Ne", "xi")。

  • T0 -- float; 基準温度 [K]。

  • m_eff0 -- float; 基準有効質量比 m*/m0。

  • EF0_eV -- float; 基準フェルミ準位 [eV]。

  • Ne0_cm3 -- float; 基準電子濃度 [cm^-3]。

  • xi0 -- float; 基準還元フェルミ準位。

戻り値:

str; 生成されたタイトル文字列。

electrical.Seebeck_scan.parse_r_list(text)[ソース]

カンマ区切りの文字列から散乱因子 r のリストをパースします。

概要: 入力文字列を解析し、浮動小数点数の散乱因子 r のリストを返します。

パラメータ:

text -- str; カンマで区切られた散乱因子の文字列(例: "2,1.5,1")。

戻り値:

list[float]; パースされた散乱因子 r のリスト。

例外:

ValueError -- r のリストが空の場合、またはリスト内のいずれかの r が -1.0 以下の場合。

electrical.Seebeck_scan.resolve_xi(mode, scan_value, T0, m_eff0, EF0_eV, Ne0_cm3, xi0, fixed)[ソース]

現在のスキャン値とモードに基づいて、還元フェルミ準位 (xi)、フェルミ準位 (EF_eV)、 電子濃度 (Ne_cm3)、温度 (T_K)、および有効質量 (m_eff) を解決します。

概要: 様々なスキャンモードと固定条件を考慮して、関連する物理量を計算します。

詳細説明: この関数は、mode 引数に応じて、scan_value を基に物理量を計算します。 - mode が "EF" または "Ne" の場合、scan_value はそれぞれEFまたはNeとして扱われ、Tとm_effは固定値 (T0, m_eff0) を使用します。 - mode が "T" または "m_eff" の場合、scan_value はそれぞれTまたはm_effとして扱われ、fixed 引数("EF", "Ne", "xi")に基づいて他の量が計算されます。

パラメータ:
  • mode -- str; 現在のスキャンモード ("EF", "Ne", "T", "m_eff")。

  • scan_value -- float; 現在のスキャン対象の値。

  • T0 -- float; 基準温度 [K]。

  • m_eff0 -- float; 基準有効質量比 m*/m0。

  • EF0_eV -- float; 基準フェルミ準位 [eV]。

  • Ne0_cm3 -- float; 基準電子濃度 [cm^-3]。

  • xi0 -- float; 基準還元フェルミ準位。

  • fixed -- str; mode が "T" または "m_eff" の場合に固定する変数 ("EF", "Ne", "xi")。

戻り値:

tuple[float, float, float, float, float]; (xi, EF_eV, Ne_cm3, T_K, m_eff) のタプル。

例外:

ValueError -- 未知のスキャンモードまたは固定条件が指定された場合。

electrical.Seebeck_scan.save_csv(outfile, rows)[ソース]

計算結果をCSVファイルに保存します。

概要: 計算されたゼーベック係数と関連する物理量を、指定されたファイル名でCSV形式で保存します。

詳細説明: outfile が空文字列の場合、ファイル保存はスキップされます。 CSVヘッダーは固定されており、以下のフィールドが含まれます: "mode", "scan_value", "r", "S_V_per_K", "S_uV_per_K", "xi", "EF_eV", "Ne_cm3", "T_K", "m_eff_m0"

パラメータ:
  • outfile -- str; 出力CSVファイルのパス。空文字列の場合、ファイルは保存されません。

  • rows -- list[dict]; 各行が辞書形式で表現されたデータのリスト。

electrical.Seebeck_scan.seebeck_from_xi(xi, r, carrier='electron')[ソース]

還元フェルミ準位 xi からゼーベック係数を計算します。

概要: 還元フェルミ準位 xi、散乱因子 r、キャリアタイプに基づいてゼーベック係数 S を計算します。

詳細説明: ゼーベック係数は以下の式で計算されます。 S = (k_B / q) * [((r + 2) / (r + 1)) * (F_{r+1}(xi) / F_r(xi)) - xi] ここで q はキャリアの電荷(電子の場合は -e_SI、正孔の場合は +e_SI)です。 散乱因子 r は -1.0 より大きい必要があります。

パラメータ:
  • xi -- float; 還元フェルミ準位。

  • r -- float; 散乱因子。r > -1 である必要があります。

  • carrier -- str; キャリアのタイプ ("electron" または "hole")。

戻り値:

float; 計算されたゼーベック係数 S [V/K]。

例外:

ValueError -- キャリアタイプが 'electron' または 'hole' ではない場合、または r が -1.0 以下の場合。

electrical.Seebeck_scan.x_label(mode)[ソース]

指定されたスキャンモードに対応するX軸ラベル文字列を返します。

概要: プロットのX軸に表示する適切なラベルを返します。

パラメータ:

mode -- str; スキャンモード ("EF", "Ne", "T", "m_eff")。

戻り値:

str; X軸のラベル文字列。

electrical.Seebeck_scan.xi_from_electron_density(n_m3, T, m_eff=1.0, xi_low=-40.0, xi_high=120.0)[ソース]

与えられた電子濃度から還元フェルミ準位 xi を計算します。

概要: 電子濃度 n_m3、温度 T、有効質量 m_eff に対応する還元フェルミ準位 xi を見つけます。

詳細説明: この関数は、electron_density_from_xi 関数を解いて xi を見つけるために、 Brentのアルゴリズム (scipy.optimize.brentq) を使用します。 初期の探索範囲 [xi_low, xi_high] で解が見つからない場合、 自動的に探索範囲を拡張しようと試みます。 電子濃度が0以下の場合、ValueError を発生させます。

パラメータ:
  • n_m3 -- float; 電子濃度 [m^-3]。正の値である必要があります。

  • T -- float; 温度 [K]。

  • m_eff -- float; 有効質量比 m*/m0。

  • xi_low -- float; brentqの初期探索範囲の下限。

  • xi_high -- float; brentqの初期探索範囲の上限。

戻り値:

float; 計算された還元フェルミ準位 xi。

例外:
  • ValueError -- 電子濃度が正でない場合。

  • RuntimeError -- 指定された電子濃度に対するxiの探索範囲を見つけられなかった場合。