Seebeck_ZT.py ドキュメント
本ドキュメントは、Pythonプログラム Seebeck_ZT.py の機能、実装、使用方法について記述します。
概要
Seebeck_ZT.py は、熱電輸送特性を計算するためのモジュールです。ゼーベック係数 (\(S\))、ローレンツ因子 (\(L\))、電気伝導度 (\(\sigma\))、移動度 (\(\mu\))、電子熱伝導度 (\(\kappa_e\))、パワーファクター (\(PF\))、およびZT因子を計算し、キャリア濃度依存性をプロットおよびExcelファイルに保存します。
このモジュールは、3次元放物線バンドモデルと緩和時間近似(\(\tau(E) \propto E^{r-1/2}\))に基づき、フェルミ・ディラック積分を用いた厳密な輸送積分によって熱電輸送特性を評価します。コマンドライン引数を通じて、温度 (\(T\))、有効質量 (\(m^*\))、参照移動度 (\(\mu_{\text{ref}}\))、格子熱伝導率 (\(\kappa_{\text{latt}}\))、キャリア種別、散乱因子 \(r\) のリストなどを設定できます。
非標準ライブラリ
このプログラムは以下の非標準ライブラリに依存しています。
numpy: 数値計算のため。matplotlib: 計算結果をプロットするため。scipy: 数値積分 (quad) および特殊関数 (expit,gamma) のため。openpyxl: 計算結果をExcelファイルに保存するため。
定数
プログラム内で使用される物理定数(SI単位系)とその他の定数です。
kB: ボルツマン定数 (\(1.380649 \times 10^{-23} \, [J/K]\))e: 素電荷 (\(1.602176634 \times 10^{-19} \, [C]\))h: プランク定数 (\(6.62607015 \times 10^{-34} \, [J \cdot s]\))hbar: 換算プランク定数 (\(\hbar = h / (2\pi) = 1.054571817 \times 10^{-34} \, [J \cdot s]\))m0: 自由電子質量 (\(9.1093837015 \times 10^{-31} \, [kg]\))
散乱因子 \(r\): 緩和時間 \(\tau(E)\) のエネルギー依存性を定義する因子です。 \(\tau(E) \propto E^{r-1/2}\) ここで \(E\) はエネルギーです。
figsize: プロットの図のサイズ ((10, 10))。
関数
Fj(j, xi)
フェルミ・ディラック積分 \(F_j(\xi)\) を計算します。
概要: フェルミ・ディラック積分 \(F_j(\xi) = \int_0^\infty \frac{x^j}{1+\exp(x-\xi)} dx\) を計算します。
詳細説明:
SciPy の quad 関数を使用して数値積分を実行します。結果は lru_cache でキャッシュされ、同じ引数での再計算を回避し、パフォーマンスを向上させます。この関数は、ガンマ関数による正規化(\(1/\Gamma(j+1)\))は含まれていません。
引数:
j(float): 積分の次数。xi(float): 還元フェルミ準位 (reduced Fermi level)。
戻り値:
float: フェルミ・ディラック積分 \(F_j(\xi)\) の値。
Nc_3D(T, m_eff=1.0)
3次元放物線バンドにおける有効状態密度 \(N_c\) を計算します。
概要: 3次元放物線バンドにおける有効状態密度 \(N_c\) を計算します。
詳細説明: 以下の公式を用いて有効状態密度を計算します。 ここで、\(m^*\) は有効質量、\(k_B\) はボルツマン定数、\(T\) は温度、\(h\) はプランク定数です。
引数:
T(float): 温度 \([K]\)。m_eff(float, optional): 有効質量の比率 (\(m^*/m_0\))。\(m_0\) は自由電子質量です。デフォルトは \(1.0\)。
戻り値:
float: 有効状態密度 \(N_c \, [m^{-3}]\)。
electron_density_from_xi(xi, T, m_eff=1.0)
還元フェルミ準位 \(\xi\) から電子濃度 \(n\) を計算します。
概要: 還元フェルミ準位 \(\xi\) から電子濃度 \(n\) を計算します。
詳細説明: 電子濃度は以下の式で計算されます。 ここで、\(N_c\) は有効状態密度、\(F_{1/2}^{\text{std}}(\xi)\) は標準化されたフェルミ・ディラック積分です。標準化されたフェルミ・ディラック積分は \(F_{1/2}^{\text{std}}(\xi) = F_{1/2}(\xi) / \Gamma(3/2)\) と定義されます。
引数:
xi(float): 還元フェルミ準位。T(float): 温度 \([K]\)。m_eff(float, optional): 有効質量の比率 (\(m^*/m_0\))。デフォルトは \(1.0\)。
戻り値:
float: 電子濃度 \(n \, [m^{-3}]\)。
transport_I0(xi, r)
輸送積分 \(I_0\) を計算します。
概要: 輸送積分 \(I_0\) を計算します。
詳細説明: \(\tau(E) \propto E^{r-1/2}\) の緩和時間に対する輸送積分の一つである \(I_0\) を計算します。
引数:
xi(float): 還元フェルミ準位。r(float): 散乱因子。緩和時間のエネルギー依存性 \(E^{r-1/2}\) を定義します。
戻り値:
float: 輸送積分 \(I_0\) の値。
transport_I1(xi, r)
輸送積分 \(I_1\) を計算します。
概要: 輸送積分 \(I_1\) を計算します。
詳細説明: \(\tau(E) \propto E^{r-1/2}\) の緩和時間に対する輸送積分の一つである \(I_1\) を計算します。
引数:
xi(float): 還元フェルミ準位。r(float): 散乱因子。緩和時間のエネルギー依存性 \(E^{r-1/2}\) を定義します。
戻り値:
float: 輸送積分 \(I_1\) の値。
transport_I2(xi, r)
輸送積分 \(I_2\) を計算します。
概要: 輸送積分 \(I_2\) を計算します。
詳細説明: \(\tau(E) \propto E^{r-1/2}\) の緩和時間に対する輸送積分の一つである \(I_2\) を計算します。
引数:
xi(float): 還元フェルミ準位。r(float): 散乱因子。緩和時間のエネルギー依存性 \(E^{r-1/2}\) を定義します。
戻り値:
float: 輸送積分 \(I_2\) の値。
transport_prefactor_sigma(T, m_eff=1.0)
電気伝導度 \(\sigma\) の計算における前因子 \(A_\sigma\) を計算します。
概要: 電気伝導度 \(\sigma\) の計算における前因子 \(A_\sigma\) を計算します。
詳細説明: 電気伝導度は \(\sigma = A_\sigma \cdot \tau_{\text{pref}} (k_B T)^{r+1} I_0\) の形で表されます。 この関数は、\(\tau(E) = \tau_{\text{pref}} E^{r-1/2}\) と定義される緩和時間において、以下の物理定数を含む前因子 \(A_\sigma\) をSI単位系で計算します。 ここで、\(e\) は素電荷、\(m^*\) は有効質量、\(\hbar\) は換算プランク定数です。
引数:
T(float): 温度 \([K]\)。(コード内では直接使用されないが引数として定義されている)m_eff(float, optional): 有効質量の比率 (\(m^*/m_0\))。デフォルトは \(1.0\)。
戻り値:
float: 電気伝導度の前因子 \(A_\sigma \, [S \cdot J^{-(r+1)}]\)。
sigma_from_xi_tau_pref(xi, r, T, tau_pref, m_eff=1.0)
還元フェルミ準位 \(\xi\)、散乱因子 \(r\)、温度 \(T\)、緩和時間の前因子 \(\tau_{\text{pref}}\) から電気伝導度 \(\sigma\) を計算します。
概要: 還元フェルミ準位 \(\xi\)、散乱因子 \(r\)、温度 \(T\)、緩和時間の前因子 \(\tau_{\text{pref}}\) から電気伝導度 \(\sigma\) を計算します。
詳細説明:
電気伝導度は以下の式で計算されます。
ここで、\(A_\sigma\) は transport_prefactor_sigma で計算される前因子、\(I_0\) は transport_I0 で計算される輸送積分です。
引数:
xi(float): 還元フェルミ準位。r(float): 散乱因子。T(float): 温度 \([K]\)。tau_pref(float): 緩和時間の前因子 \(\tau_{\text{pref}} \, [s / J^{r-1/2}]\)。m_eff(float, optional): 有効質量の比率 (\(m^*/m_0\))。デフォルトは \(1.0\)。
戻り値:
float: 電気伝導度 \(\sigma \, [S/m]\)。
seebeck_from_xi_transport(xi, r, carrier="electron")
還元フェルミ準位 \(\xi\) と散乱因子 \(r\) からゼーベック係数 \(S\) を計算します。
概要: 還元フェルミ準位 \(\xi\) と散乱因子 \(r\) からゼーベック係数 \(S\) を計算します。
詳細説明: ゼーベック係数は厳密な輸送積分を用いて以下の式で計算されます。 \(q\) はキャリアの種類によって異なり、電子の場合は \(-e\)、正孔の場合は \(+e\) となります。
引数:
xi(float): 還元フェルミ準位。r(float): 散乱因子。\(\tau(E) \propto E^{r-1/2}\) で定義されます。carrier(str, optional): キャリアの種類。"electron"または"hole"を指定します。デフォルトは"electron"。
戻り値:
float: ゼーベック係数 \(S \, [V/K]\)。
例外:
ValueError:carrierが"electron"または"hole"以外の場合。
lorenz_from_xi_transport(xi, r)
還元フェルミ準位 \(\xi\) と散乱因子 \(r\) からローレンツ因子 \(L\) を計算します。
概要: 還元フェルミ準位 \(\xi\) と散乱因子 \(r\) からローレンツ因子 \(L\) を計算します。
詳細説明: ローレンツ因子は厳密な輸送積分を用いて以下の式で計算されます。
引数:
xi(float): 還元フェルミ準位。r(float): 散乱因子。
戻り値:
float: ローレンツ因子 \(L \, [V^2/K^2]\) (または \([W \cdot \Omega / K^2]\))。
mobility_from_sigma_n(sigma, n)
電気伝導度 \(\sigma\) と電子濃度 \(n\) から移動度 \(\mu\) を計算します。
概要: 電気伝導度 \(\sigma\) と電子濃度 \(n\) から移動度 \(\mu\) を計算します。
詳細説明: 電気伝導度 \(\sigma\)、電子濃度 \(n\)、素電荷 \(e\)、移動度 \(\mu\) の間に成り立つ関係式 \(\sigma = n e \mu\) を用いて移動度を計算します。 したがって、\(\mu = \sigma / (n e)\) となります。
引数:
sigma(float): 電気伝導度 \([S/m]\)。n(float): 電子濃度 \([m^{-3}]\)。
戻り値:
float: 移動度 \(\mu \, [m^2/V/s]\)。
tau_pref_from_mu_ref(mu_ref_cm2_Vs, xi_ref, r, T, m_eff=1.0)
参照移動度 \(\mu_{\text{ref}}\) と参照還元フェルミ準位 \(\xi_{\text{ref}}\) に基づいて、緩和時間の前因子 \(\tau_{\text{pref}}\) を決定します。
概要: 参照移動度 \(\mu_{\text{ref}}\) と参照還元フェルミ準位 \(\xi_{\text{ref}}\) に基づいて、緩和時間の前因子 \(\tau_{\text{pref}}\) を決定します。
詳細説明: 緩和時間 \(\tau(E)\) が \(\tau(E) = \tau_{\text{pref}} E^{r-1/2}\) で定義されるとき、指定された \(\xi_{\text{ref}}\) と \(T\) における移動度が \(\mu_{\text{ref}}\) となるように \(\tau_{\text{pref}}\) を逆算します。 まず、参照移動度 \(\mu_{\text{ref}, \text{SI}}\) (\([m^2/V/s]\)) から参照電気伝導度 \(\sigma_{\text{ref}} = n_{\text{ref}} e \mu_{\text{ref}, \text{SI}}\) を計算します。 次に、電気伝導度の式 \(\sigma_{\text{ref}} = A_\sigma \cdot \tau_{\text{pref}} (k_B T)^{r+1} I_0(\xi_{\text{ref}}, r)\) を用いて \(\tau_{\text{pref}}\) を解きます。
参照移動度 mu_ref_cm2_Vs は \(cm^2/V/s\) 単位で与えられますが、計算ではSI単位に変換されます。
引数:
mu_ref_cm2_Vs(float): 参照移動度 \([cm^2/V/s]\)。xi_ref(float): 参照還元フェルミ準位。この \(\xi\) で参照移動度が再現されます。r(float): 散乱因子。T(float): 温度 \([K]\)。m_eff(float, optional): 有効質量の比率 (\(m^*/m_0\))。デフォルトは \(1.0\)。
戻り値:
float: 緩和時間の前因子 \(\tau_{\text{pref}} \, [s / J^{r-1/2}]\)。
tau_at_energy(E_J, tau_pref, r)
特定のエネルギー \(E_J\) における緩和時間 \(\tau(E_J)\) を計算します。
概要: 特定のエネルギー \(E_J\) における緩和時間 \(\tau(E_J)\) を計算します。
詳細説明:
緩和時間は以下の式で定義されます。
\(E_J\) が \(0\) 以下の場合は np.nan を返します。
引数:
E_J(float): エネルギー \([J]\)。tau_pref(float): 緩和時間の前因子 \([s / J^{r-1/2}]\)。r(float): 散乱因子。
戻り値:
float: エネルギー \(E_J\) における緩和時間 \(\tau(E_J) \, [s]\)。
equivalent_l0_from_tau_pref(tau_pref, r, m_eff=1.0)
緩和時間の前因子 \(\tau_{\text{pref}}\) から等価な平均自由行程 \(l_0\) を計算します。
概要: 緩和時間の前因子 \(\tau_{\text{pref}}\) から等価な平均自由行程 \(l_0\) を計算します。
詳細説明: 一部のスライドでの慣例的な定義 \(\tau(E) = \sqrt{m^*/2} \, [ l_0(T) e^{-r} ] E^{r-1/2}\) から、\(l_0(T)\) を逆算します。 ここで \(e\) は素電荷です。
引数:
tau_pref(float): 緩和時間の前因子 \([s / J^{r-1/2}]\)。r(float): 散乱因子。m_eff(float, optional): 有効質量の比率 (\(m^*/m_0\))。デフォルトは \(1.0\)。
戻り値:
float: 等価な平均自由行程 \(l_0 \, [m]\)。
save_results_to_excel(outfile, meta_rows, data_rows)
計算結果とメタデータをExcelファイルに保存します。
概要: 計算結果とメタデータをExcelファイルに保存します。
詳細説明:
指定された出力ファイル名で新しいExcelワークブックを作成し、"metadata" と "transport_vs_Ne" の \(2\) つのシートにデータを書き込みます。
"metadata" シートには計算条件などのメタデータが保存され、"transport_vs_Ne" シートにはキャリア濃度に対する輸送特性の計算結果が保存されます。
"transport_vs_Ne" シートの列は以下の通りです。
r: 散乱因子xi: 還元フェルミ準位tau_pref_s_per_J^(r-1/2): 緩和時間の前因子 \([s / J^{r-1/2}]\)tau_at_kBT_s: エネルギー \(k_B T\) における緩和時間 \([s]\)l0_equiv_m: 等価な平均自由行程 \(l_0 \, [m]\)Ne_m^-3: 電子濃度 \([m^{-3}]\)Ne_cm^-3: 電子濃度 \([cm^{-3}]\)S_V_per_K: ゼーベック係数 \([V/K]\)S_uV_per_K: ゼーベック係数 \([\mu V/K]\)L_Wohm_per_K2: ローレンツ因子 \([W \cdot \Omega / K^2]\)sigma_S_per_m: 電気伝導度 \([S/m]\)mu_m2_per_Vs: 移動度 \([m^2/V/s]\)mu_cm2_per_Vs: 移動度 \([cm^2/V/s]\)kappa_e_W_per_mK: 電子熱伝導度 \([W/m/K]\)PF_W_per_mK2: パワーファクター \([W/m/K^2]\)PF_mW_per_mK2: パワーファクター \([mW/m/K^2]\)ZT: 性能指数 \(ZT\)
引数:
outfile(str): 出力するExcelファイル名。例:"results.xlsx"。meta_rows(list): メタデータを含む行のリスト。各要素はExcelの \(1\) 行に対応するリストです。data_rows(list): 計算結果データを含む行のリスト。各要素はExcelの \(1\) 行に対応するリストです。
戻り値:
None
main()
スクリプトの主要な実行フローを定義します。コマンドライン引数を解析し、熱電輸送特性を計算・プロット・保存します。
概要: スクリプトの主要な実行フローを定義します。コマンドライン引数を解析し、熱電輸送特性を計算・プロット・保存します。
詳細説明:
argparse モジュールを使用してコマンドライン引数(温度、有効質量、参照移動度、格子熱伝導率、キャリア種別、還元フェルミ準位の範囲と点数、散乱因子 \(r\) のリスト、出力ファイル名など)を解析します。
次に、指定されたパラメータに基づいて、各散乱因子 \(r\) に対して輸送特性(電子濃度 \(n\)、ゼーベック係数 \(S\)、ローレンツ因子 \(L\)、電気伝導度 \(\sigma\)、移動度 \(\mu\)、電子熱伝導度 \(\kappa_e\)、パワーファクター \(PF\)、ZT因子)を計算します。
計算の主なステップは以下の通りです。
参照移動度 \(\mu_{\text{ref}}\) と参照還元フェルミ準位 \(\xi_{\text{ref}}\) から、緩和時間の前因子 \(\tau_{\text{pref}}\) を決定します。
還元フェルミ準位
xi_rangeの各点に対して、以下の特性を計算します。電子濃度: \(n = \text{electron\_density\_from\_xi}(\xi, T, m_{\text{eff}})\)
電気伝導度: \(\sigma = \text{sigma\_from\_xi\_tau\_pref}(\xi, r, T, \tau_{\text{pref}}, m_{\text{eff}})\)
移動度: \(\mu = \sigma / (n e)\)
ゼーベック係数: \(S = \text{seebeck\_from\_xi\_transport}(\xi, r, \text{carrier})\)
ローレンツ因子: \(L = \text{lorenz\_from\_xi\_transport}(\xi, r)\)
電子熱伝導度: \(\kappa_e = L \sigma T\)
パワーファクター: \(PF = S^2 \sigma\)
ZT因子: \(ZT = PF \cdot T / (\kappa_e + \kappa_{\text{latt}})\)
計算されたデータは
save_results_to_excel関数を使用してExcelファイルに保存されます。最後に、計算結果は
matplotlibを用いてキャリア濃度に対する各特性のグラフとしてプロットされ、表示されます。
戻り値:
None
コマンドライン引数
Seebeck_ZT.py は以下のコマンドライン引数をサポートします。
--T(float): 温度 \([K]\)。デフォルトは \(300.0\)。--m_eff(float): 有効質量の比率 \(m^*/m_0\)。デフォルトは \(1.0\)。--mu_ref(float): 参照還元フェルミ準位--xi_refにおいて再現される参照移動度 \([cm^2/V/s]\)。デフォルトは \(10.0\)。--xi_ref(float): 参照移動度--mu_refが再現される還元フェルミ準位 \(\xi\)。デフォルトは \(0.0\)。--klatt(float): 格子熱伝導率 \(\kappa_{\text{latt}} \, [W/m/K]\)。デフォルトは \(5.0\)。--carrier(str): キャリアの種類。"electron"または"hole"を選択します。デフォルトは"electron"。--xi_min(float): 還元フェルミ準位 \(\xi\) の最小値。デフォルトは \(-5.0\)。--xi_max(float): 還元フェルミ準位 \(\xi\) の最大値。デフォルトは \(40.0\)。--nxi(int): 還元フェルミ準位 \(\xi\) の計算点数。デフォルトは \(181\)。--r_list(str): カンマ区切りの散乱因子 \(r\) のリスト。デフォルトは"2.0,1.5,1.0,0.5,0.0,-0.5"。--outfile(str): Excel出力ファイル名。デフォルトは"transport_vs_Ne.xlsx"。
入出力
入力
入力はコマンドライン引数を通じて行われます。設定可能なパラメータについては「コマンドライン引数」セクションを参照してください。
出力
プログラムは以下の \(2\) 種類の出力を生成します。
Excelファイル: 指定されたファイル名(デフォルトは
transport_vs_Ne.xlsx)でExcelファイルが保存されます。このファイルには \(2\) つのシートが含まれます。"metadata": 計算に使用されたコマンドライン引数とその他のメタデータが格納されます。"transport_vs_Ne": キャリア濃度に対する熱電輸送特性の計算結果が表形式で格納されます。列の詳細についてはsave_results_to_excel()関数の説明を参照してください。
Matplotlibプロット: 計算されたキャリア濃度依存性を示す \(7\) つのプロット(ゼーベック係数、ローレンツ因子、電気伝導度、移動度、電子熱伝導度、パワーファクター、ZT因子)が
matplotlibウィンドウに表示されます。 各プロットの横軸はキャリア濃度 \(N_e \, [cm^{-3}]\) (対数スケール) で、縦軸はそれぞれの熱電輸送特性の値です。散乱因子 \(r\) の異なる値ごとに曲線が描画され、凡例で区別されます。
使用例
還元フェルミ準位の範囲を狭め、\(r\) の値を \(2\) つだけ指定して実行する場合の例です。
python Seebeck_ZT.py --T 300 --xi_min -2 --xi_max 2 --nxi 21 --r_list "0.5,0.0" --outfile custom_results.xlsx