free_electron_band.py 技術ドキュメント

プログラムの動作

free_electron_band.py は、結晶中の自由電子モデルに基づいたエネルギーバンド構造を計算し、可視化するPythonプログラムです。このプログラムは、指定された結晶格子(デフォルトではシリコン相当)と有効質量のもとで、ブリルアンゾーン内の高対称点パスに沿った電子のエネルギー準位(バンド構造)を計算します。

主な機能は以下の通りです。

  • 物理定数(プランク定数、電子質量、素電荷など)を定義し、計算に使用します。

  • 結晶の格子定数と有効質量を設定し、自由電子近似におけるエネルギー定数 KE を計算します。

  • 逆格子空間のメートルテンソル rg を定義し、波数ベクトルの大きさを計算するのに使用します。

  • 指定されたk点パス(高対称点)に沿って、自由電子のエネルギー \(E(\vec{k})\) を計算します。この計算では、逆格子ベクトル \(\vec{G}_{hkl}\) を考慮した波数ベクトル \(\vec{k} + \vec{G}_{hkl}\) を用います。

  • 計算されたエネルギーバンド構造を matplotlib を使用してグラフとしてプロットし、表示します。

このプログラムは、結晶材料における電子のバンド構造の基本的な振る舞いを、自由電子近似というシンプルなモデルで理解するための教育的ツールとして、また初期的な解析の出発点として役立ちます。

原理

このプログラムは、結晶中の電子が自由電子として振る舞うという近似に基づいています。自由電子のエネルギーは主にその運動エネルギーによって決定されます。

一般に、自由電子のエネルギー \(E\) は波数ベクトル \(\vec{k}\) を用いて以下のように表されます。

\[E = \frac{\hbar^2 |\vec{k}|^2}{2 m^*}\]

ここで、\( \hbar \) はディラック定数、\( |\vec{k}| \) は波数ベクトルの大きさ、\( m^* \) は電子の有効質量です。

結晶中では、電子の波数ベクトルはブリルアンゾーン内の波数ベクトル \(\vec{k}\) と、逆格子ベクトル \(\vec{G}_{hkl}\) の和として表されます。したがって、結晶中の自由電子のエネルギーは、以下の式で計算されます。

\[E(\vec{k}, \vec{G}_{hkl}) = \text{KE} \cdot |\vec{k} + \vec{G}_{hkl}|^2\]

ここで、

  • \(\vec{k} = (k_x, k_y, k_z)\) はブリルアンゾーン内の波数ベクトル(プログラム内では内部座標で表現されます)。

  • \(\vec{G}_{hkl} = (h, k, l)\) はミラー指数 \((h, k, l)\) で与えられる逆格子ベクトルです。

  • \(\text{KE}\) は、プログラム内で定義される定数で、以下の物理定数と単位変換によって計算されます。 $\( \text{KE} = \frac{\hbar^2}{2 m_{\text{eff}} m_e} \times \frac{10^{20}}{e} \)\( ここで、\)m_{\text{eff}}\( は有効質量比(プログラム中の `meff`)、\)m_e\( は電子の静止質量(プログラム中の `me`)、\)e\( は素電荷(プログラム中の `e`)です。\)10^{20}\( の係数は、波数ベクトルの単位を \)m^{-1}\( から \)Å^{-1}\( に変換し、エネルギー単位をジュールから電子ボルトに変換するために使用されます。最終的に \)\text{KE}\( は \)eV \cdot Å^2$ の単位を持ちます。

波数ベクトルの二乗ノルム \(|\vec{k} + \vec{G}_{hkl}|^2\) は、逆格子空間のメートルテンソル rg を用いて計算されます。現在のプログラムでは、立方晶を仮定しており、rg は対角成分のみが \( (2\pi/a)^2 \) と設定されています(a は格子定数)。これにより、内部座標で与えられた波数ベクトルが実際の逆格子空間での波数ベクトルに変換され、その大きさが計算されます。

cal_E 関数は、与えられた \(\vec{k}\)\(\vec{G}_{hkl}\) に基づいて上記のエネルギーを計算します。プログラムは、指定されたk点パスに沿って \(\vec{k}\) を変化させ、複数の逆格子ベクトル \(\vec{G}_{hkl}\) についてエネルギーを計算することで、バンド構造をプロットします。

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

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

  • numpy: 数値計算(特に配列操作や数学関数)のために使用されます。

  • matplotlib: グラフの描画、特にバンド構造のプロットのために使用されます。

これらのライブラリは pip コマンドを使用してインストールできます。

pip install numpy matplotlib

必要な入力ファイル

このプログラムは、外部の入力ファイルを必要としません。 すべての物理定数、結晶パラメータ(格子定数、有効質量)、計算範囲、およびプロット設定は、ソースコード内に直接ハードコードされています。

生成される出力ファイル

free_electron_band.py は、以下の情報を出力します。

  • コンソール出力: プログラムの実行中に、格子定数、有効質量、逆格子メートルテンソル、計算範囲、プロットエネルギー範囲、k点パスの距離情報、k点ベクトルなどが標準出力に表示されます。

  • グラフィックウィンドウ: 計算された自由電子のバンド構造を示すグラフが matplotlib によって描画され、グラフィックウィンドウとして表示されます。このウィンドウには、指定された高対称点パスに沿ったエネルギーとk点の関係がプロットされます。グラフは、ユーザーがEnterキーを押すまで表示され続けます。

  • ファイル出力: このプログラムは、計算結果やグラフ画像をファイルとして保存する機能を持っていません。グラフを保存したい場合は、表示されたグラフィックウィンドウの保存機能を使用するか、プログラムに plt.savefig() などのコードを追加する必要があります。

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

free_electron_band.py は、コマンドライン引数を取らずに実行されます。

python free_electron_band.py

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

以下のコマンドを実行することで、自由電子のバンド構造計算が開始され、結果のプロットが表示されます。

python free_electron_band.py

実行結果の説明:

上記のコマンドを実行すると、まず以下のような情報がコンソールに出力されます。

KE =  3.809983794348639

Lattice parameters: (5.4064) A
Effective mass: 1.0 me
Reciprocal lattice metric [A^-2]:
array([[1.35339678, 0.        , 0.        ],
       [0.        , 1.35339678, 0.        ],
       [0.        , 0.        , 1.35339678]])
khl range: h=[-3, 3] k=[-3, 3] l=[-3, 3]
Plot E range: 0.0 - 10.0 eV

k [W         : (0.5000, 0.0000, 1.0000] to [L         :(0.5000, 0.5000, 0.5000]
k [L         : (0.5000, 0.5000, 0.5000] to [$\Gamma$  :(0.0000, 0.0000, 0.0000]
k [$\Gamma$  : (0.0000, 0.0000, 0.0000] to [X         :(0.0000, 0.0000, 1.0000]
k [X         : (0.0000, 0.0000, 1.0000] to [W         :(0.5000, 0.0000, 1.0000]
k [W         : (0.5000, 0.0000, 1.0000] to [K         :(0.7500, 0.0000, 0.7500]
k: W          - L         : nk= 59 ktotal=0.0000 kstep=(0.0000, 0.0086, -0.0086)
k: L          - $\Gamma$  : nk= 87 ktotal=0.5113 kstep=(-0.0058, -0.0058, -0.0058)
k: $\Gamma$   - X         : nk= 48 ktotal=1.0039 kstep=(0.0000, 0.0000, 0.0104)
k: X          - W         : nk= 59 ktotal=1.5034 kstep=(0.0086, 0.0000, 0.0000)
k: W          - K         : nk= 36 ktotal=2.0147 kstep=(0.0071, 0.0000, -0.0071)

k vectors
 k_total: 2.27419163625407 A^-1
 nk     :  101
 kstep  : 0.02251674887375297
 dklist
[0.5112674249151591,
 0.4926715124031662,
 0.49944439169650444,
 0.5112674249151591,
 0.2605408823240803]
 ktotallist:
[0.0,
 0.5112674249151591,
 1.0039389373183253,
 1.50338332901483,
 2.0146507539299894,
 2.2751916362540696]
 nk_list: [59, 87, 48, 59, 36]

plot
Press ENTER to exit>>

このコンソール出力に加えて、matplotlibによるバンド構造のグラフが新しいウィンドウで表示されます。グラフは、W, L, Γ, X, W, K の高対称点パスに沿った自由電子のエネルギーを示し、縦軸がエネルギー(eV)、横軸がk点パスの距離に対応します。ウィンドウは、コンソールでEnterキーが押されるまで表示され続けます。