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の探索範囲を見つけられなかった場合。