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) は、以下のフェルミ・ディラック積分を数値的に評価します。

\[F_j(\xi) = \int_0^\infty \frac{x^j}{1+e^{x-\xi}} dx\]

この関数は、引数 jxi に対してフェルミ・ディラック積分を計算します。標準的な定義に含まれる \(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\) は、以下の式で与えられます。

\[N_c = 2 \left( \frac{2 \pi m^* k_B T}{h^2} \right)^{3/2}\]

ここで、\(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 = N_c \frac{F_j(0.5, \xi)}{\Gamma(1.5)}\]

ここで、\(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\) は、単一バンドモデルにおいて以下の式で計算されます。

\[S = \frac{k_B}{q} \left[ \frac{r+2}{r+1} \frac{F_j(r+1, \xi)}{F_j(r, \xi)} - \xi \right]\]

ここで、\(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: --modeT または 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 (デフォルト): --modeNe または --logscan が指定された場合は log、それ以外は linear

    • linear

    • log

  • --csv (str): オプションのCSV出力ファイル名 (デフォルト: "")。

  • --no-show (action="store_true"): プロットを表示しません。

入出力

入力

プログラムの入力は、上記の「コマンドライン引数」で指定される各種パラメータです。これらの引数は、スキャンモード、物理定数の基準値、スキャン範囲、散乱因子のリストなどを制御します。

出力

プログラムは以下の出力を行います。

  1. プロット: ゼーベック係数 (\(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 オプションで抑制できます。

  2. 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\)