N-T-Fit-semi_FEA.py 技術ドキュメント

プログラムの動作

N-T-Fit-semi_FEA.py は、Free Electron Approximation (FEA) に基づいて半導体のホール効果測定データ(キャリア濃度、移動度、電気伝導率、ホール係数)を温度の関数として解析するためのPythonスクリプトです。主な機能は以下の通りです。

  1. シミュレーション (sim モード): 与えられた半導体パラメータ(有効質量、バンドギャップ、ドナー準位と濃度、アクセプター準位と濃度など)に基づき、フェルミ準位、電子濃度、正孔濃度、ホール係数などの温度依存性をシミュレートします。測定データがある場合は、それらと比較してグラフ表示し、活性化エネルギーも計算します。

  2. キャリア濃度フィッティング (fit, fit_e, fit_h モード): 測定されたキャリア濃度 \(N\) の温度依存性を、非線形最小二乗法を用いてフィッティングします。

    • fit: 電子と正孔の二重キャリアモデルを用いて \(N = |n_e - n_h|\) をフィッティングします。散乱因子 \(r\) は0.5に固定されます。

    • fit_h: 正孔のみの単一キャリアモデルを用いて \(N = n_h\) をフィッティングします。散乱因子 \(r\) は0.5に固定されます。

    • fit_e: 電子のみの単一キャリアモデルを用いて \(N = n_e\) をフィッティングします。散乱因子 \(r\) は0.5に固定されます。

  3. ホール係数フィッティング (fit_RH モード): 測定されたホール係数 \(R_H\) の温度依存性を、非線形最小二乗法を用いてフィッティングします。電子と正孔の二重キャリアモデルを使用し、散乱因子 \(r\) を考慮します。このモードでは tkMobility クラスで定義された移動度モデルが使用されます。

本プログラムは、半導体の電子構造や欠陥準位を評価するために、ホール効果測定データと理論モデルを比較する強力なツールを提供します。

原理

本プログラムは、Free Electron Approximation (FEA) に基づく半導体統計の計算と、scipyライブラリによる非線形最小二乗最適化を組み合わせています。

1. 半導体統計

半導体中のキャリア濃度は、フェルミ・ディラック統計に基づき、バンド内の状態密度 \(D(E)\) とフェルミ準位 \(E_F\) を用いて計算されます。

  • 伝導帯の電子濃度 \(n_e\): $\(n_e = \int_{E_C}^{\infty} D_C(E) f(E, E_F, T) dE\)$

  • 価電子帯の正孔濃度 \(n_h\): $\(n_h = \int_{-\infty}^{E_V} D_V(E) (1 - f(E, E_F, T)) dE\)\( ここで、\)f(E, E_F, T)\( はフェルミ・ディラック分布関数で、次のように定義されます。 \)\(f(E, E_F, T) = \frac{1}{1 + \exp\left(\frac{E - E_F}{k_B T}\right)}\)\( \)k_B\( はボルツマン定数、\)T$ は絶対温度です。

FEAでは、状態密度は有効質量 \(m^*\) を用いて以下のように表されます。

  • 伝導帯の状態密度 \(D_C(E)\): $\(D_C(E) = \frac{1}{2\pi^2} \left(\frac{2 m_e^*}{\hbar^2}\right)^{3/2} \sqrt{E - E_C}\)$

  • 価電子帯の状態密度 \(D_V(E)\): $\(D_V(E) = \frac{1}{2\pi^2} \left(\frac{2 m_h^*}{\hbar^2}\right)^{3/2} \sqrt{E_V - E}\)\( ここで、\)E_C\( は伝導帯底、\)E_V\( は価電子帯頂上、\)\hbar\( はディラック定数、\)m_e^\( は電子の有効質量、\)m_h^$ は正孔の有効質量です。

2. 不純物準位のイオン化

ドナー準位 \(E_D\) とアクセプター準位 \(E_A\) のイオン化状態も考慮されます。

  • アクセプターがイオン化している確率 \(f_{A^-}\): $\(f_{A^-}(E_A, E_F, T) = \frac{1}{1 + g_A \exp\left(\frac{E_A - E_F}{k_B T}\right)}\)\( \)g_A$ はアクセプター準位の縮退度です。

  • ドナーがイオン化している確率 \(f_{D^+}\): $\(f_{D^+}(E_D, E_F, T) = \frac{1}{1 + g_D \exp\left(\frac{E_F - E_D}{k_B T}\right)}\)\( \)g_D$ はドナー準位の縮退度です。

イオン化されたアクセプター濃度 \(N_A^-\) とドナー濃度 \(N_D^+\) は、それぞれの全濃度 \(N_A\), \(N_D\) と上記確率を用いて \(N_A^- = N_A f_{A^-}\)\(N_D^+ = N_D f_{D^+}\) となります。

3. 電荷中性条件とフェルミ準位の決定

半導体全体の電荷中性条件は以下のように表されます。 $\(n_e + N_A^- = n_h + N_D^+\)\( この条件を満たすように、二分法などの数値計算手法を用いてフェルミ準位 \)E_F$ が決定されます。

4. ホール係数 \(R_H\)

ホール係数 \(R_H\) は、キャリアの濃度、移動度、散乱因子に依存します。

  • 単一キャリアモデル: 電子のみの場合: \(R_H = - \frac{r_e}{e n_e}\) 正孔のみの場合: \(R_H = \frac{r_h}{e n_h}\) ここで \(e\) は素電荷、\(r_e, r_h\) はそれぞれ電子、正孔のホール因子です。

  • 二重キャリアモデル: 電子と正孔の両方が寄与する場合のホール係数 \(R_H\) は、それぞれのキャリアの濃度 \(n_e, n_h\)、移動度 \(\mu_e, \mu_h\)、ホール因子 \(r_e, r_h\) を用いて計算されます。 $\(R_H = \frac{n_h r_h \mu_h^2 - n_e r_e \mu_e^2}{e (n_h \mu_h + n_e \mu_e)^2}\)\( `fit` モードでは \)r_e=r_h=0.5\( に固定されますが、`fit_RH` モードでは `mobility.rfac` に基づいてホール因子が決定されます。ホール因子 \)r_H\( は、キャリア散乱機構に依存し、緩和時間 \)\tau(E) = \tau_0 E^s\( の指数 \)s\( に応じて値が変わります(例えば、\)s=-1/2\( (音響フォノン散乱) で \)r_H \approx 1.18$)。

5. 最適化アルゴリズム

フィッティングには scipy.optimize.minimize 関数が使用されます。目的関数は、測定データとモデル計算値の間の二乗誤差(通常は対数スケールでの誤差)の合計 \(S^2\) です。 $\(S^2 = \frac{1}{N_{data}-1} \sum_{i} \left( \ln(Y_{obs,i} + \epsilon) - \ln(Y_{cal,i} + \epsilon) \right)^2\)\( ここで \)Y_{obs,i}\( は観測値、\)Y_{cal,i}\( は計算値、\)\epsilon$ は対数計算時のゼロ除算を避けるための微小定数です。 最適化アルゴリズムとして、Nelder-Mead、Powell、CG (Conjugate Gradient)、BFGS、Newton-CG、Trust-NCG、Dogleg、L-BFGS-B、TNC、COBYLA、SLSQP、Trust-Constr、Trust-Exact、Trust-Krylov などが選択可能です(プログラムコードでは 'nelder-mead' がデフォルト)。

必要な非標準ライブラリとインストール方法

本プログラムを実行するには、以下の非標準ライブラリが必要です。

  • numpy: 数値計算

  • matplotlib: グラフ描画

  • scipy: 最適化機能 (scipy.optimize.minimize)

  • openpyxl: Excelファイル (.xlsx) の読み込み(直接インポートされていませんが、tkTransport.read_Hall_excel が内部で利用する可能性があります)

  • tklib: カスタムライブラリ(半導体統計、移動度モデル、ファイルI/Oなど)

これらのライブラリは pip コマンドでインストールできます。tklib については特別な設定が必要です。

# numpy, matplotlib, scipy, openpyxl のインストール
pip install numpy matplotlib scipy openpyxl

# tklib の設定
# tklib はカスタムライブラリであるため、手動でPythonの検索パスに追加する必要があります。
# 通常は、`c:/tkProg/tklib/python` や `d:/tkProg/tklib/python` のようなディレクトリに
# tklibライブラリのソースコードを配置し、Pythonスクリプトからそのパスを追加します。
# プログラムコード中に以下の行があるため、tklibがこれらのパスに存在することが期待されます。
# sys.path.append("c:/tkProg/tklib/python")
# sys.path.append("d:/tkProg/tklib/python")
# したがって、tklibのインストールは、該当するディレクトリにtklibのPythonモジュールを
# 配置する作業となります。

必要な入力ファイル

本プログラムは、ホール効果測定データを含むExcelファイル (.xlsx) またはCSVファイル (.csv) を入力として期待します。 ファイルには、以下のヘッダーを持つ列が含まれている必要があります。

  • T: 温度 (K)

  • N: キャリア濃度 (cm\(^{-3}\))

  • mu: 移動度 (cm\(^2\)/(V\(\cdot\)s))

  • sigma: 電気伝導率 (S/cm)

  • RH: ホール係数 (cm\(^3\)/C) - fit_RH モードまたは sim モードで必要

ファイル例 (example.xlsx または example.csv):

T

N

mu

sigma

RH

300

1.00E+18

200

32.0

6.25E-03

350

1.20E+18

180

34.6

5.21E-03

400

1.50E+18

160

38.4

4.17E-03

...

...

...

...

...

生成される出力ファイル

プログラムの実行モードに応じて、以下のファイルが生成または更新されます。

  1. パラメータファイル ([infile_body].in): 入力ファイル名 (infile) の本体部分(拡張子を除く)に.inが付加されたファイルが、最適化された半導体パラメータ(有効質量、バンドギャップ、ドナー・アクセプター準位と濃度、散乱因子など)とプログラム設定を保存するために生成されます。フィッティングモードの場合、最適化後にこのファイルが更新されます。

  2. パラメータバックアップファイル ([infile_body].in.bak): .inファイルの更新前に、既存の.inファイルがある場合はその内容が.in.bakファイルにバックアップされます。

  3. データ出力CSVファイル ([infile_body]-EFT-[mode].csv): 入力ファイル名から生成されたファイル名に -EFT-[mode].csv が付加されたCSVファイルが、シミュレーションまたはフィッティングの結果として生成されます。このファイルには、以下のデータ列が含まれます。

    • T: 温度 (K)

    • 1000/T: 逆温度 (1000/K)

    • EF(eV): フェルミ準位 (eV)

    • Ne,obs(cm-3): 測定キャリア濃度 (cm\(^{-3}\))

    • Ne,fin: 計算された電子濃度 (cm\(^{-3}\)) (最終値)

    • Nh,fin: 計算された正孔濃度 (cm\(^{-3}\)) (最終値)

    • NA-,fin: イオン化アクセプター濃度 (cm\(^{-3}\)) (最終値)

    • ND+,fin: イオン化ドナー濃度 (cm\(^{-3}\)) (最終値)

    • RH,fin: 計算されたホール係数 (cm\(^3\)/C) (最終値)

    • Ns,fin: 計算された正味キャリア濃度 \(|n_e - n_h|\) (cm\(^{-3}\)) (最終値)

    • mu(Hall)(cm2/Vs): 測定移動度 (cm\(^2\)/(V\(\cdot\)s))

    • mu,fin: 計算された移動度 (cm\(^2\)/(V\(\cdot\)s)) (最終値)

    • FH,e: 電子のホール因子

    • FH,h: 正孔のホール因子

    • Ne,Hall: ホール測定から導出される電子濃度

    • Nh,Hall: ホール測定から導出される正孔濃度 (fit モードではFH,e, FH,h, Ne,Hall, Nh,Hallは出力されません)

コマンドラインでの使用例 (Usage)

Usage: Variables in () are optional
 python N-T-Fit-semi_FEA.py mode (file args)
 (i) python N-T-Fit-semi_FEA.py sim infile(.xlsx) EC EA NA ED ND
     Plot N-T with simulated data
     ex: python N-T-Fit-semi_FEA.py sim infile.xlsx 1.1 0.05 1e17 1.05 1e16
 (ii) python N-T-Fit-semi_FEA.py fit|fit_h|fit_e|fit_RH infile(.xlsx) EC EA NA ED ND (Eb a1 a2)
     Fit to N-mu-T data
       mode = fit   : Fit to Ns = 1/eRH by two-carrier (hole-electron) model. Scattering factor is fixed to r = 0.5
              fit_h : Fit to Nh by single-carrier model. Scattering factor is fixed to r = 0.5
              fit_e : Fit to Ne by single-carrier model. Scattering factor is fixed to r = 0.5
              fit_RH: Fit to RH by two-carrier (hole-electron) model with scattering factor
     ex: python N-T-Fit-semi_FEA.py fit infile.xlsx 1.1 0.05 1e17 1.05 1e16

引数の説明:

  • mode: 実行モードを指定します。

    • sim: シミュレーションモード

    • fit: キャリア濃度 \(N=|n_e-n_h|\) を二重キャリアモデルでフィッティング (r=0.5 固定)

    • fit_h: キャリア濃度 \(N=n_h\) を正孔単一キャリアモデルでフィッティング (r=0.5 固定)

    • fit_e: キャリア濃度 \(N=n_e\) を電子単一キャリアモデルでフィッティング (r=0.5 固定)

    • fit_RH: ホール係数 \(R_H\) を二重キャリアモデルでフィッティング (散乱因子 r を考慮)

  • infile(.xlsx): 入力データファイル名 (ExcelまたはCSV)。

  • EC: 伝導帯底のエネルギー (eV)。

  • EA: アクセプター準位のエネルギー (価電子帯頂上 EV=0.0 からの相対値, eV)。

  • NA: アクセプター濃度 (cm\(^{-3}\))。

  • ED: ドナー準位のエネルギー (価電子帯頂上 EV=0.0 からの相対値, eV)。

  • ND: ドナー濃度 (cm\(^{-3}\))。

  • (Eb a1 a2): オプションの移動度モデルパラメータ。コード中では tkMobility クラスで使用される可能性のあるパラメータですが、デフォルトのtkMobility設定では直接コマンドラインで指定されることはありません。

コマンドラインでの具体的な使用例

ここでは、sample.xlsxという入力ファイルが存在し、それにT, N, mu, sigma, RHの列が含まれていると仮定します。

例1: シミュレーションモード

sample.xlsx ファイルを使い、伝導帯底EC=1.1 eV、アクセプター準位EA=0.05 eV、NA=1e17 cm⁻³、ドナー準位ED=1.05 eV、ND=1e16 cm⁻³ の初期パラメータでキャリア濃度、ホール係数などの温度依存性をシミュレートします。

python N-T-Fit-semi_FEA.py sim sample.xlsx 1.1 0.05 1e17 1.05 1e16

実行結果の説明:

  • プログラムは指定されたパラメータを用いて、温度 \(T\) に対するフェルミ準位 \(E_F\)、電子濃度 \(n_e\)、正孔濃度 \(n_h\)、ホール係数 \(R_H\) などの温度依存性を計算します。

  • コンソールには、初期パラメータでの計算結果と活性化エネルギーの分析結果が出力されます。

  • sample.in ファイルが生成(または更新)され、初期設定とシミュレーションパラメータが保存されます。

  • sample-EFT-sim.csv ファイルが生成され、計算されたすべての温度依存データ(\(T\), \(E_F\), \(n_e\), \(n_h\), \(R_H\), ホール因子など)が保存されます。

  • matplotlibによりグラフウィンドウがポップアップ表示され、測定データ(N, mu)とシミュレーション結果(\(n_e\), \(n_h\), \(|n_s|\))が比較表示されます。また、Hall因子とフェルミ準位、活性化エネルギーの温度依存性もプロットされます。ユーザーがEnterキーを押すとプログラムが終了します。

例2: キャリア濃度フィッティングモード (fit)

sample.xlsx ファイルを使い、伝導帯底EC=1.1 eV、アクセプター準位EA=0.05 eV、NA=1e17 cm⁻³、ドナー準位ED=1.05 eV、ND=1e16 cm⁻³ の初期パラメータでキャリア濃度 \(N\) を二重キャリアモデルでフィッティングします。ここでは、アクセプター準位 \(E_A\) と濃度 \(N_A\) を最適化対象とします(dos.optid設定に依存しますが、この例ではEANAが最適化されると仮定します)。

python N-T-Fit-semi_FEA.py fit sample.xlsx 1.1 0.05 1e17 1.05 1e16

実行結果の説明:

  • プログラムは sample.xlsx から測定データ (T, N, mu, sigma) を読み込みます。

  • 初期パラメータでのキャリア濃度の温度依存性が計算され、コンソールに出力されます。

  • matplotlibのグラフウィンドウが表示され、初期パラメータでの計算結果が測定データと共にプロットされます。

  • scipy.optimize.minimize を用いた非線形最小二乗フィッティングが開始され、最適化の進行状況(イテレーションごとのパラメータ値とS2値)がコンソールに出力されます。

  • フィッティング中に、cparams.graphupdateinterval (デフォルト10) 回のイテレーションごとにグラフが更新され、現在のフィッティング結果がリアルタイムで表示されます。

  • 最適化が完了すると、コンソールに最終的な最適化されたパラメータ値と最小二乗誤差 \(S^2\) が表示されます。

  • sample.in ファイルが更新され、最適化されたパラメータが保存されます。

  • sample-EFT-fit.csv ファイルが生成され、測定データとフィッティング結果が保存されます。

  • 最終的なフィッティング結果を示すグラフが更新され、ユーザーがEnterキーを押すとプログラムが終了します。

例3: ホール係数フィッティングモード (fit_RH)

sample.xlsx ファイルを使い、伝導帯底EC=1.1 eV、アクセプター準位EA=0.05 eV、NA=1e17 cm⁻³、ドナー準位ED=1.05 eV、ND=1e16 cm⁻³ の初期パラメータでホール係数 \(R_H\) を二重キャリアモデルでフィッティングします。

python N-T-Fit-semi_FEA.py fit_RH sample.xlsx 1.1 0.05 1e17 1.05 1e16

実行結果の説明:

  • fit モードと同様に、sample.xlsx から測定データ (T, N, mu, sigma, RH) を読み込みます。

  • 初期パラメータでのキャリア濃度、ホール係数などの温度依存性が計算され、コンソールに出力されます。

  • fit モードと同様に、グラフウィンドウが表示され、初期プロットの後、最適化の進行に応じてグラフが更新されます。

  • fit モードとは異なり、最適化の目的関数はホール係数 \(R_H\) の二乗誤差に基づきます。

  • 最適化完了後、コンソールに最終的なパラメータと \(S^2\) が出力されます。

  • sample.in ファイルが更新され、最適化されたパラメータが保存されます。

  • sample-EFT-fit_RH.csv ファイルが生成され、測定データとフィッティング結果に加え、Hall因子やホール測定から導出されるキャリア濃度なども保存されます。

  • 最終グラフが表示され、ユーザーがEnterキーを押すとプログラムが終了します。