equation-brent.py 技術ドキュメント
プログラムの動作
equation-brent.py は、半導体におけるフェルミ準位 (\(E_F\)) を数値的に決定するためのPythonプログラムです。このプログラムの主な目的は、与えられた半導体パラメータ(伝導帯・価電子帯のエネルギー準位、有効状態密度、ドーパント濃度と準位、温度など)のもとで、電荷中性条件を満たすフェルミ準位を算出することです。
具体的な機能は以下の通りです。
電荷中性条件の定義: 電子、正孔、イオン化ドナー、イオン化アクセプタの密度を計算し、これらのバランスがゼロとなるフェルミ準位を探索します。
Brent法の適用: 根探索アルゴリズムであるBrent法を用いて、電荷中性条件の関数がゼロとなる \(E_F\) を効率的かつロバストに探索します。
物理モデルの組み込み: フェルミ・ディラック分布関数、電子密度(\(N_e\))、正孔密度(\(N_h\))、イオン化ドナー密度(\(N_D^+\))、イオン化アクセプタ密度(\(N_A^-\))の計算ロジックが含まれています。
このプログラムは、半導体のキャリア濃度解析やデバイスシミュレーションにおける基礎的なパラメータ決定に利用できます。
原理
本プログラムは、半導体における電荷中性条件をフェルミ準位 \(E_F\) の関数として定義し、その根をBrent法で探索します。
電荷中性条件
半導体中では、電子、正孔、イオン化されたドーパントの総電荷が釣り合っている必要があります。この条件は以下のように表されます。
ここで、
\(N_e\): 電子密度
\(N_h\): 正孔密度
\(N_A^-\): イオン化アクセプタ密度
\(N_D^+\): イオン化ドナー密度
です。
各密度の計算式
プログラムでは、これらの密度を以下の式で計算します。ここで、\(k_B\) はボルツマン定数、\(T\) は絶対温度、ekBT は \(e/(k_B T)\) (ここで \(e\) は素電荷) を表す定数です。
電子密度 (\(N_e\)): $\(N_e(E_F, T) = N_c \exp\left(-\frac{E_c - E_F}{k_B T}\right) = N_c \exp\left(-(E_c - E_F) \cdot \text{ekBT}\right)\)\( \)N_c\( は伝導帯の有効状態密度、\)E_c$ は伝導帯下端です。
正孔密度 (\(N_h\)): $\(N_h(E_F, T) = N_v \exp\left(-\frac{E_F - E_v}{k_B T}\right) = N_v \exp\left(-(E_F - E_v) \cdot \text{ekBT}\right)\)\( \)N_v\( は価電子帯の有効状態密度、\)E_v$ は価電子帯上端です。
フェルミ・ディラック関数 (\(f_e(E, E_F, T)\)): $\(f_e(E, E_F, T) = \frac{1}{1 + \exp\left(\frac{E - E_F}{k_B T}\right)} = \frac{1}{1 + \exp\left((E - E_F) \cdot \text{ekBT}\right)}\)$
イオン化ドナー密度 (\(N_D^+\)): $\(N_D^+(E_F, T) = N_D \left(1 - f_e(E_D, E_F, T)\right)\)\( \)N_D\( はドナー濃度、\)E_D$ はドナー準位です。
イオン化アクセプタ密度 (\(N_A^-\)): $\(N_A^-(E_F, T) = N_A f_e(E_A, E_F, T)\)\( \)N_A\( はアクセプタ濃度、\)E_A$ はアクセプタ準位です。
プログラムでは、上記電荷中性条件を \(f(E_F) = N_e(E_F) + N_A^-(E_F) - N_h(E_F) - N_D^+(E_F) = 0\) となるような \(E_F\) を探索します。
Brent法
Brent法は、二分法、セカント法、および逆二次補間法を組み合わせたロバストな根探索アルゴリズムです。これにより、単独の手法よりも高速かつ確実に根を見つけることができます。プログラムは、初期区間 \([E_{Fmin}, E_{Fmax}]\) 内で \(f(E_F)\) が符号を反転すること(すなわち \(f(E_{Fmin}) \cdot f(E_{Fmax}) < 0\))を前提としています。
必要な非標準ライブラリとインストール方法
本プログラムの実行には、以下の非標準ライブラリが必要です。
numpy: 数値計算を効率的に行うためのライブラリです。
expなどの数学関数に使用されています。
インストール方法
pip コマンドを使用してインストールできます。
pip install numpy
必要な入力ファイル
equation-brent.py は、入力ファイルを必要としません。
すべての物理定数、半導体パラメータ、およびBrent法の探索パラメータは、プログラムのソースコード内にハードコードされています。
生成される出力ファイル
equation-brent.py は、いかなる出力ファイルも生成しません。
計算結果や収束過程の情報は、すべて標準出力 (stdout) に表示されます。
コマンドラインでの使用例 (Usage)
本プログラムは引数を取らずに実行されます。
python equation-brent.py
コマンドラインでの具体的な使用例
以下のコマンドでプログラムを実行します。
python equation-brent.py
実行すると、フェルミ準位の探索過程が標準出力に表示されます。初期探索範囲 (\(E_{Fmin}\), \(E_{Fmax}\)) とそれぞれの電荷差 (\(dQmin\), \(dQmax\)) がまず示されます。その後、各反復 (Iter) ごとに、現在の探索区間 (\(EFa,b\))、その時点での電荷差 (\(dQa,b\))、Brent法によって計算された次の試行値 (\(EFs\)) とその電荷差 (\(dQs\))、およびその時点での電子密度 (\(Ne\))、正孔密度 (\(Nh\))、イオン化アクセプタ密度 (\(NA-\))、イオン化ドナー密度 (\(ND+\)) が出力されます。
探索が収束すると、最終的なフェルミ準位 (\(EF\)) の値とともに「Success」メッセージが表示されます。収束しなかった場合は、「Failed」メッセージが出力されます。
実行結果の例:
Solution of EF by Brent's method
EFmin = 0.00000000 dQmin = 1.025e+15
EFmax = 1.00000000 dQmax = -2.100e+18
Iter 0: EFa,b = 0.00000000 - 1.00000000 dQa,b = 1.025e+15 - -2.10000000e+18
EFs = 0.50000000 dQs = -2.100e+18
Ne=2.1000e+18 Nh=2.1000e+18 NA-=1.0000e+15 ND+=1.0000e+16 dQ=-2.0990e+18
Iter 1: EFa,b = 0.00000000 - 0.50000000 dQa,b = 1.025e+15 - -2.09900000e+18
EFs = 0.00000000 dQs = 1.025e+15
Ne=2.1000e+00 Nh=1.0250e+15 NA-=1.0000e+15 ND+=1.0000e+16 dQ=1.0250e+15
Iter 2: EFa,b = 0.00000000 - 0.00000000 dQa,b = 1.025e+15 - -1.18900000e+16
EFs = 0.00000000 dQs = 1.025e+15
Ne=2.1000e+00 Nh=1.0250e+15 NA-=1.0000e+15 ND+=1.0000e+16 dQ=1.0250e+15
...(途中省略)...
Iter 12: EFa,b = 0.05315320 - 0.05315320 dQa,b = 5.968e+06 - -5.11075674e+06
EFs = 0.05315320 dQs = 5.968e+06
Ne=1.1966e+11 Nh=1.4981e+14 NA-=1.0000e+15 ND+=1.0000e+16 dQ=-1.0251e+16
Success: Convergence reached at EF = 0.0531532029706376
上記例では、フェルミ準位が約 \(0.05315\) eV で収束したことが示されています。