Seebeck_scan.py ドキュメント
本ドキュメントは、ゼーベック係数スキャンプログラム Seebeck_scan.py のソースコードを解析し、Sphinx (MyST) でビルド可能なMarkdown形式で記述したものです。
概要
Seebeck_scan.py は、熱電材料のゼーベック係数を、フェルミ準位、キャリア濃度、温度、有効質量といった様々な物理パラメータをスキャンしながら計算し、結果をプロットするスクリプトです。
散乱因子 \(r\) の異なる値に対して以下のスキャンモードをサポートしています。
EF(フェルミ準位): フェルミ準位をスキャンし、ゼーベック係数を計算します。Ne(キャリア濃度): キャリア濃度をスキャンし、ゼーベック係数を計算します。T(温度): 温度をスキャンし、ゼーベック係数を計算します。このモードでは、フェルミ準位、キャリア濃度、または還元フェルミ準位のいずれかを固定できます。m_eff(有効質量): 有効質量をスキャンし、ゼーベック係数を計算します。このモードでも、フェルミ準位、キャリア濃度、または還元フェルミ準位のいずれかを固定できます。
計算はFermi-Dirac積分に基づき、キャリアタイプ(電子または正孔)を指定できます。結果はCSVファイルとして保存することも可能です。
散乱因子 \(r\) はキャリアの緩和時間 \(\tau(E)\) がエネルギー \(E\) の \((r-1/2)\) 乗に比例することで定義されます。
非標準ライブラリ
本プログラムは以下の非標準ライブラリを使用しています。
matplotlib.pyplot: データのプロットに使用されます。numpy: 数値計算、特に配列操作に使用されます。scipy.integrate.quad: 数値積分(フェルミ・ディラック積分)に使用されます。scipy.optimize.brentq: 根を求めるためのアルゴリズム(還元フェルミ準位の計算)に使用されます。scipy.special.expit: シグモイド関数(ロジスティック関数)として使用されます。scipy.special.gamma: ガンマ関数として使用されます。
定数
プログラム内で使用される物理定数(SI単位系)とエネルギー単位変換定数は以下の通りです。
kB_SI: ボルツマン定数 \(k_B = 1.380649 \times 10^{-23} \; [J/K]\)e_SI: 素電荷 \(e = 1.602176634 \times 10^{-19} \; [C]\)h_SI: プランク定数 \(h = 6.62607015 \times 10^{-34} \; [J \cdot s]\)m0_SI: 自由電子質量 \(m_0 = 9.1093837015 \times 10^{-31} \; [kg]\)kB_eV: ボルツマン定数 \(k_B = 8.617333262145 \times 10^{-5} \; [eV/K]\)
関数
Fj(j, xi)
フェルミ・ディラック積分を計算します(ガンマ関数による前因子なし)。
概要
Fj(j, xi) は、以下のフェルミ・ディラック積分を数値的に評価します。
この関数は、引数 j と xi に対してフェルミ・ディラック積分を計算します。標準的な定義に含まれる \(1/\Gamma(j+1)\) の前因子は含まれません。計算結果は lru_cache デコレータによってキャッシュされ、同じ引数での再計算を防ぎ、パフォーマンスを向上させます。
引数
j(float): フェルミ・ディラック積分の次数。\(j > -1\) である必要があります。xi(float): 還元フェルミ準位 \(\xi = E_F / (k_B T)\)。
戻り値
(
float): 計算されたフェルミ・ディラック積分の値。
例外
ValueError:jが -1.0 以下の場合に発生します。
Nc_3D(T, m_eff=1.0)
3次元における有効状態密度 \(N_c\) を計算します。
概要
温度 T と有効質量 m_eff に基づいて、3次元バンドの有効状態密度 \(N_c\) を計算します。
背景理論(推測)
3次元のバンドにおける有効状態密度 \(N_c\) は、以下の式で与えられます。
ここで、\(m^*\) は有効質量(m_eff * m0_SI)、\(k_B\) はボルツマン定数、 \(T\) は温度、 \(h\) はプランク定数です。
引数
T(float): 温度 \([K]\)。m_eff(float): 有効質量比 \(m^*/m_0\)。\(m_0\) は自由電子質量です。
戻り値
(
float): 計算された有効状態密度 \(N_c \; [m^{-3}]\)。
electron_density_from_xi(xi, T, m_eff=1.0)
還元フェルミ準位 xi から電子濃度を計算します。
概要
還元フェルミ準位 xi、温度 T、有効質量 m_eff を用いて電子濃度 \(n\) を計算します。
背景理論(推測)
電子濃度 \(n\) は、有効状態密度 \(N_c\) とフェルミ・ディラック積分 \(F_j(\xi)\) を用いて以下の式で与えられます。
ここで、\(N_c\) は有効状態密度(Nc_3D() で計算)、\(F_j(0.5, \xi)\) はガンマ関数による前因子を含まないフェルミ・ディラック積分(Fj() で計算)です。\(\Gamma(1.5) = \frac{\sqrt{\pi}}{2}\) です。
引数
xi(float): 還元フェルミ準位。T(float): 温度 \([K]\)。m_eff(float): 有効質量比 \(m^*/m_0\)。
戻り値
(
float): 計算された電子濃度 \(n \; [m^{-3}]\)。
xi_from_electron_density(n_m3, T, m_eff=1.0, xi_low=-40.0, xi_high=120.0)
与えられた電子濃度から還元フェルミ準位 xi を計算します。
概要
この関数は、electron_density_from_xi 関数を解いて xi を見つけるために、Brentのアルゴリズム (scipy.optimize.brentq) を使用します。初期の探索範囲 [xi_low, xi_high] で解が見つからない場合、自動的に探索範囲を拡張しようと試みます。
アルゴリズム(推測)
関数 \(f(\xi) = \text{electron\_density\_from\_xi}(\xi, T, m_{eff}) - n_{m3}\) の根を求めることで、指定された電子濃度 \(n_{m3}\) に対応する還元フェルミ準位 \(\xi\) を探します。Brentのアルゴリズムは、区間内の根を効率的に見つけるための頑健な方法です。
引数
n_m3(float): 電子濃度 \([m^{-3}]\)。正の値である必要があります。T(float): 温度 \([K]\)。m_eff(float): 有効質量比 \(m^*/m_0\)。xi_low(float):brentqの初期探索範囲の下限。xi_high(float):brentqの初期探索範囲の上限。
戻り値
(
float): 計算された還元フェルミ準位 \(\xi\)。
例外
ValueError: 電子濃度が正でない場合。RuntimeError: 指定された電子濃度に対する \(\xi\) の探索範囲を見つけられなかった場合。
seebeck_from_xi(xi, r, carrier="electron")
還元フェルミ準位 xi からゼーベック係数を計算します。
概要
還元フェルミ準位 xi、散乱因子 r、キャリアタイプに基づいてゼーベック係数 \(S\) を計算します。
背景理論(推測)
ゼーベック係数 \(S\) は、単一バンドモデルにおいて以下の式で計算されます。
ここで、\(k_B\) はボルツマン定数、\(q\) はキャリアの電荷(電子の場合は \(-e_{SI}\)、正孔の場合は \(+e_{SI}\))、\(F_j(j, \xi)\) はFj() 関数で計算されるフェルミ・ディラック積分です。散乱因子 \(r\) は \(-1.0\) より大きい必要があります。
引数
xi(float): 還元フェルミ準位。r(float): 散乱因子。\(r > -1\) である必要があります。carrier(str): キャリアのタイプ ("electron" または "hole")。
戻り値
(
float): 計算されたゼーベック係数 \(S \; [V/K]\)。
例外
ValueError: キャリアタイプが 'electron' または 'hole' ではない場合、またはrが -1.0 以下の場合。
parse_r_list(text)
カンマ区切りの文字列から散乱因子 r のリストをパースします。
概要
入力文字列を解析し、浮動小数点数の散乱因子 r のリストを返します。
引数
text(str): カンマで区切られた散乱因子の文字列(例: "2,1.5,1")。
戻り値
(
list[float]): パースされた散乱因子rのリスト。
例外
ValueError:rのリストが空の場合、またはリスト内のいずれかのrが -1.0 以下の場合。
default_scan_settings(mode)
指定されたスキャンモードのデフォルト設定を返します。
概要
スキャンモードに基づいて、スキャン範囲の最小値、最大値、点数、および対数スケールフラグのデフォルト値を決定します。
引数
mode(str): スキャンモード ("EF", "Ne", "T", "m_eff")。
戻り値
(
tuple): (scan_min,scan_max,npts,logscan) のタプル。
例外
ValueError: 未知のスキャンモードが指定された場合。
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以下の場合。
resolve_xi(mode, scan_value, T0, m_eff0, EF0_eV, Ne0_cm3, xi0, fixed)
現在のスキャン値とモードに基づいて、還元フェルミ準位 (\(\xi\))、フェルミ準位 (\(E_F\)), 電子濃度 (\(N_e\)), 温度 (\(T_K\)), および有効質量 (\(m_{eff}\)) を解決します。
概要
この関数は、mode 引数に応じて、scan_value を基に物理量を計算します。
modeが "EF" の場合:scan_valueは \(E_F\) として扱われ、\(T\) と \(m_{eff}\) は固定値 (T0,m_eff0) を使用します。\(\xi = E_F / (k_B T)\) を計算します。modeが "Ne" の場合:scan_valueは \(N_e\) として扱われ、\(T\) と \(m_{eff}\) は固定値 (T0,m_eff0) を使用します。xi_from_electron_density()を用いて \(\xi\) を計算し、\(E_F = \xi k_B T\) を計算します。modeが "T" の場合:scan_valueは \(T\) として扱われ、\(m_{eff}\) は固定値 (m_eff0) を使用します。fixed引数("EF", "Ne", "xi")に基づいて他の量が計算されます。fixed == "EF": \(E_F = \text{EF0_eV}\) を固定し、\(\xi = E_F / (k_B T)\) を計算します。fixed == "Ne": \(N_e = \text{Ne0_cm3}\) を固定し、xi_from_electron_density()を用いて \(\xi\) を計算し、\(E_F = \xi k_B T\) を計算します。fixed == "xi": \(\xi = \text{xi0}\) を固定し、\(E_F = \xi k_B T\) を計算します。
modeが "m_eff" の場合:scan_valueは \(m_{eff}\) として扱われ、\(T\) は固定値 (T0) を使用します。fixed引数("EF", "Ne", "xi")に基づいて他の量が計算されます。fixed == "EF": \(E_F = \text{EF0_eV}\) を固定し、\(\xi = E_F / (k_B T)\) を計算します。fixed == "Ne": \(N_e = \text{Ne0_cm3}\) を固定し、xi_from_electron_density()を用いて \(\xi\) を計算し、\(E_F = \xi k_B T\) を計算します。fixed == "xi": \(\xi = \text{xi0}\) を固定し、\(E_F = \xi k_B T\) を計算します。
引数
mode(str): 現在のスキャンモード ("EF", "Ne", "T", "m_eff")。scan_value(float): 現在のスキャン対象の値。T0(float): 基準温度 \([K]\)。m_eff0(float): 基準有効質量比 \(m^*/m_0\)。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\), \(E_{F_{eV}}\), \(N_{e_{cm3}}\), \(T_K\), \(m_{eff}\)) のタプル。
例外
ValueError: 未知のスキャンモードまたは固定条件が指定された場合。
x_label(mode)
指定されたスキャンモードに対応するX軸ラベル文字列を返します。
概要
プロットのX軸に表示する適切なラベルを返します。
引数
mode(str): スキャンモード ("EF", "Ne", "T", "m_eff")。
戻り値
(
str): X軸のラベル文字列。例:$E_F-E_c$ (eV),$N_e$ (cm$^{-3}$)。
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^*/m_0\)。EF0_eV(float): 基準フェルミ準位 \([eV]\)。Ne0_cm3(float): 基準電子濃度 \([cm^{-3}]\)。xi0(float): 基準還元フェルミ準位。
戻り値
(
str): 生成されたタイトル文字列。
save_csv(outfile, rows)
計算結果をCSVファイルに保存します。
概要
計算されたゼーベック係数と関連する物理量を、指定されたファイル名でCSV形式で保存します。 outfile が空文字列の場合、ファイル保存はスキップされます。
引数
outfile(str): 出力CSVファイルのパス。空文字列の場合、ファイルは保存されません。rows(list[dict]): 各行が辞書形式で表現されたデータのリスト。
戻り値
None
main()
ゼーベック係数スキャンプログラムのメインエントリポイント。
概要
コマンドライン引数をパースし、指定されたモードとパラメータに基づいてゼーベック係数を計算し、結果をプロットまたはCSVファイルに保存します。
argparse を使用して、スキャンモード、固定条件、キャリアタイプ、基準温度、有効質量、フェルミ準位、電子濃度、還元フェルミ準位、散乱因子のリスト、スキャン範囲、点数、対数スキャンオプション、X軸スケール、CSV出力ファイル名、プロット表示の有無などの引数を定義します。
デフォルトのスキャン設定を適用し、make_scan_values() を使ってスキャン値の配列を生成します。指定された散乱因子のリスト r_list の各値に対して、スキャン値 (xvals) ごとに resolve_xi() で物理量を解決し、seebeck_from_xi() でゼーベック係数を計算します。
各計算結果は rows リストに追加され、後でCSVとして保存するために使用されます。計算結果は matplotlib を使用してプロットされ、x_label() や make_title() で適切なラベル、タイトル、凡例が設定されます。
--csv オプションが指定された場合、save_csv() 関数を呼び出して結果を保存します。 --no-show オプションが指定されない限り、プロットを表示します。
引数
None
戻り値
None
コマンドライン引数
Seebeck_scan.py は以下のコマンドライン引数をサポートします。
--mode: スキャンターゲット。以下のいずれかを選択します。EF(デフォルト): フェルミ準位をスキャンします。Ne: キャリア濃度をスキャンします。T: 温度をスキャンします。m_eff: 有効質量をスキャンします。
--fixed:--modeがTまたはm_effの場合に、何を固定するかを指定します。EF(デフォルト): フェルミ準位を固定します。Ne: キャリア濃度を固定します。xi: 還元フェルミ準位を固定します。
--carrier: キャリアのタイプ。electron(デフォルト)hole
--T(float): 基準温度 \([K]\) (デフォルト: 300.0)。--m_eff(float): 基準有効質量比 \(m^*/m_0\) (デフォルト: 1.0)。--EF(float): 基準フェルミ準位 \(E_F-E_c \; [eV]\) (または対応するバンド端基準) (デフォルト: 0.10)。--Ne(float): 基準電子濃度 \([cm^{-3}]\) (デフォルト: \(1 \times 10^{18}\))。--xi(float): 基準還元フェルミ準位 (デフォルト: 0.0)。--r-list(str): カンマ区切りの散乱因子 \(r\) のリスト (デフォルト: "2,1.5,1,0.5,0,-0.5")。--scan-min(float): スキャン範囲の最小値 (デフォルト:--modeに依存)。--scan-max(float): スキャン範囲の最大値 (デフォルト:--modeに依存)。--n(int): スキャン点の数 (デフォルト:--modeに依存)。--logscan(action="store_true"): スキャン値を対数間隔で使用します。--xscale(str): X軸のスケール。auto(デフォルト):--modeがNeまたは--logscanが指定された場合はlog、それ以外はlinear。linearlog
--csv(str): オプションのCSV出力ファイル名 (デフォルト: "")。--no-show(action="store_true"): プロットを表示しません。
入出力
入力
プログラムの入力は、上記の「コマンドライン引数」で指定される各種パラメータです。これらの引数は、スキャンモード、物理定数の基準値、スキャン範囲、散乱因子のリストなどを制御します。
出力
プログラムは以下の出力を行います。
プロット: ゼーベック係数 (\(S\)) をY軸、選択されたスキャンパラメータ(\(E_F\), \(N_e\), \(T\), \(m^*\)) をX軸とするグラフが生成され、
matplotlibを用いて表示されます。複数の散乱因子rに対して複数の線がプロットされます。X軸ラベル: スキャンモードに応じて
$E_F-E_c$ (eV),$N_e$ (cm$^{-3}$),$T$ (K),$m^*/m_0$のいずれか。Y軸ラベル:
$S$ ($\mu$V/K)。タイトル: スキャンモード、キャリアタイプ、固定条件、基準パラメータを含む情報。
凡例: 各プロット線に対応する散乱因子 \(r\) の値。
グリッド: 表示されます。
ゼロライン: \(S=0\) に水平線が表示されます。 プロットの表示は
--no-showオプションで抑制できます。
CSVファイル:
--csvオプションでファイル名が指定された場合、計算結果がCSV形式で保存されます。 出力されるCSVファイルには以下の列が含まれます。mode: スキャンモードscan_value: 現在のスキャン対象の値r: 散乱因子S_V_per_K: 計算されたゼーベック係数 \([V/K]\)S_uV_per_K: 計算されたゼーベック係数 \([\mu V/K]\)xi: 還元フェルミ準位EF_eV: フェルミ準位 \([eV]\)Ne_cm3: 電子濃度 \([cm^{-3}]\)T_K: 温度 \([K]\)m_eff_m0: 有効質量比 \(m^*/m_0\)