Seebeck_scan プログラム仕様

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

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

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

散乱因子 r はキャリアの緩和時間 tau(E) がエネルギー E の (r-1/2)乗に比例することで定義されます。

関連リンク: Seebeck_scan_usage

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 を発生させます。

引数:
param j:

フェルミ・ディラック積分の次数。j は -1 より大きい必要があります。

type j:

float

param xi:

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

type xi:

float

戻り値:
returns:

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

rtype:

float

例外:
raises ValueError:

j が -1.0 以下の場合。

Seebeck_scan.Nc_3D(T, m_eff=1.0)
概要:

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

詳細説明:

温度 T と有効質量 m_eff に基づいて、3次元バンドの有効状態密度 Nc を計算します。 Nc は以下の式で計算されます。 Nc = 2 * (2 * pi * m_eff * m0_SI * kB_SI * T / (h_SI**2)) ** 1.5

引数:
param T:

温度 [K]。

type T:

float

param m_eff:

有効質量比 m*/m0。m0 は自由電子質量です。

type m_eff:

float

戻り値:
returns:

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

rtype:

float

Seebeck_scan.default_scan_settings(mode)
概要:

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

詳細説明:

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

引数:
param mode:

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

type mode:

str

戻り値:
returns:

(scan_min, scan_max, npts, logscan) のタプル。

rtype:

tuple

例外:
raises ValueError:

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

Seebeck_scan.electron_density_from_xi(xi, T, m_eff=1.0)
概要:

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

詳細説明:

還元フェルミ準位 xi、温度 T、有効質量 m_eff を用いて電子濃度 n を計算します。 電子濃度 n は以下の式で与えられます: n = Nc * Fj(0.5, xi) / Gamma(1.5) ここで、Nc は有効状態密度、Fj(0.5, xi) はガンマ関数による前因子を含まないフェルミ・ディラック積分です。

引数:
param xi:

還元フェルミ準位。

type xi:

float

param T:

温度 [K]。

type T:

float

param m_eff:

有効質量比 m*/m0。

type m_eff:

float

戻り値:
returns:

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

rtype:

float

Seebeck_scan.main()
概要:

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

詳細説明:

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

引数:

None

戻り値:

None

Seebeck_scan.make_scan_values(mode, scan_min, scan_max, npts, logscan)
概要:

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

詳細説明:

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

引数:
param mode:

スキャンモード。この引数は主にエラーメッセージの表示に使用されます。

type mode:

str

param scan_min:

スキャン範囲の最小値。

type scan_min:

float

param scan_max:

スキャン範囲の最大値。

type scan_max:

float

param npts:

スキャン点の数。

type npts:

int

param logscan:

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

type logscan:

bool

戻り値:
returns:

生成されたスキャン値の配列。

rtype:

numpy.ndarray

例外:
raises ValueError:

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

Seebeck_scan.make_title(mode, carrier, fixed, T0, m_eff0, EF0_eV, Ne0_cm3, xi0)
概要:

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

詳細説明:

スキャンモード、キャリアタイプ、固定条件などのパラメータに基づいて、グラフのタイトルを作成します。 タイトルには、スキャンモード、キャリアタイプ、および固定されている物理量とその値が含まれます。

引数:
param mode:

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

type mode:

str

param carrier:

キャリアタイプ ("electron" または "hole")。

type carrier:

str

param fixed:

固定された変数 ("EF", "Ne", "xi")。mode が "T" または "m_eff" の場合にのみ関連します。

type fixed:

str

param T0:

基準温度 [K]。

type T0:

float

param m_eff0:

基準有効質量比 m*/m0。

type m_eff0:

float

param EF0_eV:

基準フェルミ準位 [eV]。

type EF0_eV:

float

param Ne0_cm3:

基準電子濃度 [cm^-3]。

type Ne0_cm3:

float

param xi0:

基準還元フェルミ準位。

type xi0:

float

戻り値:
returns:

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

rtype:

str

Seebeck_scan.parse_r_list(text)
概要:

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

詳細説明:

入力文字列を解析し、浮動小数点数の散乱因子 r のリストを返します。 各散乱因子は -1 より大きい必要があります。

引数:
param text:

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

type text:

str

戻り値:
returns:

パースされた散乱因子 r のリスト。

rtype:

list[float]

例外:
raises ValueError:

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

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" の場合、scan_value は EF_eV として扱われ、Tとm_effは T0 と m_eff0 を使用します。 - mode が "Ne" の場合、scan_value は Ne_cm3 として扱われ、Tとm_effは T0 と m_eff0 を使用します。 - mode が "T" の場合、scan_value は T_K として扱われ、m_effは m_eff0 を使用し、

fixed 引数("EF", "Ne", "xi")に基づいて EF_eV または Ne_cm3 を固定して xi を計算します。

  • mode が "m_eff" の場合、scan_value は m_eff として扱われ、Tは T0 を使用し、 fixed 引数("EF", "Ne", "xi")に基づいて EF_eV または Ne_cm3 を固定して xi を計算します。

引数:
param mode:

現在のスキャンモード ("EF", "Ne", "T", "m_eff")。

type mode:

str

param scan_value:

現在のスキャン対象の値。

type scan_value:

float

param T0:

基準温度 [K]。

type T0:

float

param m_eff0:

基準有効質量比 m*/m0。

type m_eff0:

float

param EF0_eV:

基準フェルミ準位 [eV]。mode が "T" または "m_eff" で fixed が "EF" の場合に固定値として使用。

type EF0_eV:

float

param Ne0_cm3:

基準電子濃度 [cm^-3]。mode が "T" または "m_eff" で fixed が "Ne" の場合に固定値として使用。

type Ne0_cm3:

float

param xi0:

基準還元フェルミ準位。mode が "T" または "m_eff" で fixed が "xi" の場合に固定値として使用。

type xi0:

float

param fixed:

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

type fixed:

str

戻り値:
returns:

(xi, EF_eV, Ne_cm3, T_K, m_eff) のタプル。

rtype:

tuple[float, float, float, float, float]

例外:
raises ValueError:

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

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"

引数:
param outfile:

出力CSVファイルのパス。空文字列の場合、ファイルは保存されません。

type outfile:

str

param rows:

各行が辞書形式で表現されたデータのリスト。

type rows:

list[dict]

戻り値:
returns:

None

rtype:

None

Seebeck_scan.seebeck_from_xi(xi, r, carrier='electron')
概要:

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

詳細説明:

還元フェルミ準位 xi、散乱因子 r、キャリアタイプに基づいてゼーベック係数 S を計算します。 ゼーベック係数は以下の式で計算されます。 S = (k_B / q) * [((r + 2) / (r + 1)) * (Fj(r+1, xi) / Fj(r, xi)) - xi] ここで q はキャリアの電荷(電子の場合は -e_SI、正孔の場合は +e_SI)です。 散乱因子 r は -1.0 より大きい必要があります。

引数:
param xi:

還元フェルミ準位。

type xi:

float

param r:

散乱因子。r は -1 より大きい必要があります。

type r:

float

param carrier:

キャリアのタイプ ("electron" または "hole")。

type carrier:

str

戻り値:
returns:

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

rtype:

float

例外:
raises ValueError:

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

Seebeck_scan.x_label(mode)
概要:

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

詳細説明:

プロットのX軸に表示する適切なラベルを返します。 返されるラベルはLaTeX形式の数式を含む場合があります。

引数:
param mode:

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

type mode:

str

戻り値:
returns:

X軸のラベル文字列。

rtype:

str

Seebeck_scan.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] で解が見つからない場合、 自動的に探索範囲を拡張しようと試みます。 電子濃度が0以下の場合、ValueError を発生させます。

引数:
param n_m3:

電子濃度 [m^-3]。正の値である必要があります。

type n_m3:

float

param T:

温度 [K]。

type T:

float

param m_eff:

有効質量比 m*/m0。

type m_eff:

float

param xi_low:

brentqの初期探索範囲の下限。

type xi_low:

float

param xi_high:

brentqの初期探索範囲の上限。

type xi_high:

float

戻り値:
returns:

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

rtype:

float

例外:
raises ValueError:

電子濃度が正でない場合。

raises RuntimeError:

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