tb1d.py 技術ドキュメント
プログラムの動作
tb1d.py は、Pythonで記述された1次元の量子井戸ポテンシャルにおけるタイトバインディング法による電子バンド計算を行うプログラムです。主な機能は以下の2つのモードに分けられます。
basisモード: 設定された量子井戸ポテンシャルに対する単一の量子井戸中の基底状態(エネルギー準位と波動関数)を計算し、プロットして表示します。このモードでは、無限井戸ポテンシャルと有限井戸ポテンシャルの両方についてエネルギー準位を計算し、比較します。bandモード: 周期的な量子井戸アレイ(結晶)における電子のエネルギーバンド構造を、タイトバインディング法を用いて計算し、波数 \(k\) に対するエネルギー分散関係をプロットして表示します。各サイトの基底状態を線形結合してハミルトニアン行列と重なり積分行列を構築し、その固有値を解くことでバンド構造を導出します。
このプログラムは、半導体ヘテロ構造における電子状態や、固体物理学におけるバンド理論の基礎を視覚的に理解するためのツールとして機能します。
原理
このプログラムは、主に以下の物理的および数学的原理に基づいています。
1次元量子井戸の解法: 有限の深さを持つ1次元の矩形量子井戸中の電子の定常状態シュレディンガー方程式を解きます。
\[-\frac{\hbar^2}{2m^*} \frac{d^2\psi(x)}{dx^2} + V(x)\psi(x) = E\psi(x)\]ここで、\(m^*\) は有効質量、\(V(x)\) はポテンシャルエネルギー、\(E\) はエネルギー、\(x\) は空間座標、\(\hbar\) はディラック定数です。 波動関数は井戸内部と外部で異なる形式を取り、境界条件(波動関数とその1階微分が連続)を適用することで、許容されるエネルギー準位が決定されます。プログラムでは、偶関数解と奇関数解に対応する以下の関係式が0になるエネルギー \(E\) を、Secant法(
refine_E関数)を用いて探索します。偶関数解の条件: $\(\kappa_b - \kappa_w \tan\left(\frac{\kappa_w w}{2}\right) = 0\)$
奇関数解の条件: $\(\kappa_b + \frac{\kappa_w}{\tan\left(\frac{\kappa_w w}{2}\right)} = 0\)$
ここで、\(w\) は井戸幅、\(V_0 = V_{vac} - V_{base}\) は井戸の深さ(真空準位からの深さ)、\(\kappa_w = \frac{\sqrt{2m^* E'}}{\hbar}\) は井戸内の波数、\(\kappa_b = \frac{\sqrt{2m^*(V_0 - E')}}{\hbar}\) は障壁内の減衰定数です。エネルギーは \(E = V_{base} + E'\) として計算され、\(E'\) は井戸底からのエネルギーです。
タイトバインディング法 (Tight-binding Method): 周期的な原子配列を持つ結晶の電子バンド構造を計算するために使用されます。各原子サイトに局在する量子井戸の波動関数(
basis関数で計算される)を基底として、ブロッホの定理を適用した波動関数を仮定します。\[\Psi_k(x) = \sum_{n, j} c_{n,j}(k) e^{ik(ja)} \phi_n(x - ja)\]ここで、\(n\) は軌道インデックス、\(j\) は格子サイトインデックス、\(a\) は格子定数、\(k\) は波数です。 この波動関数を用いて、結晶のシュレディンガー方程式から以下の一般化固有値問題を導出します。
\[\sum_{j'} (H_{jj'} - E S_{jj'}) c_{j'} = 0\]ここで、\(H_{jj'}\) はハミルトニアン行列要素、\(S_{jj'}\) は重なり積分行列要素です。
ハミルトニアン行列要素 \(H_{mn}(k)\) と重なり積分行列要素 \(S_{mn}(k)\): 波数 \(k\) を含む以下の形式で構築されます。 $\(H_{mn}(k) = \sum_{N_x} e^{ik N_x a} \int \phi_m^*(x - x_m) \hat{H} \phi_n(x - x_n - N_x a) dx\)\( \)\(S_{mn}(k) = \sum_{N_x} e^{ik N_x a} \int \phi_m^*(x - x_m) \phi_n(x - x_n - N_x a) dx\)\( ここで \)\phi_n\( は各サイトの孤立量子井戸の波動関数であり、\)x_m, x_n\( はサイトの位置、\)N_x\( は格子周期の整数倍です。 プログラムでは、`Fij` がハミルトニアン行列、\)Sij\( が重なり積分行列に対応します。`cal_tij` 関数は、位相因子を乗じる前の要素 \)\int \phi_m^*(x - x_m) \hat{H} \phi_n(x - x_n - N_x a) dx$ を計算します。 このとき、
cal_tijは以下のルールで値を返します。同じサイト上の同じ軌道 (\(m=n\) かつ \(N_x=0\)) の場合、その孤立量子井戸の固有エネルギー
orbital["E"]を返します。これは運動エネルギー項と局所ポテンシャルエネルギー項の和を含みます。それ以外の場合(異なるサイト、または異なる軌道、または隣接サイトとの相互作用)、結晶全体の周期ポテンシャル \(V(x)\) と基底波動関数の積の積分 \(\int \phi_m^*(x - x_m) V(x) \phi_n(x - x_n - N_x a) dx\) を計算して返します。これは隣接サイトからの摂動による結合エネルギー寄与を表します。
最終的に、
solve_eigenstates関数内で行列FijとSijを構築した後、Fij = LA.inv(Sij) @ Fijの変換を行い、標準的な固有値問題 \(M C = E C\) を解くことで、波数 \(k\) に対するエネルギー \(E\) のバンド構造(分散関係)を求めます。
必要な非標準ライブラリとインストール方法
このプログラムは、以下のPython非標準ライブラリを使用します。
NumPy: 数値計算(配列操作、線形代数、数学関数など)
Matplotlib: グラフ描画
これらのライブラリは pip コマンドでインストールできます。
pip install numpy matplotlib
csv ライブラリもインポートされていますが、現在のソースコードでは使用されていません。
必要な入力ファイル
このプログラムは、外部の入力ファイルを必要としません。すべての物理定数、結晶構造、ポテンシャル設定、計算パラメータはPythonソースコード内にハードコードされています。
ユーザーはソースコード内の以下のセクションを直接編集することで、計算条件を変更できます。
#======================== Potential ========================#======================== Crystal definition ========================#============================================== X range to plot potential and basis ==============================#===================================== 解を走査するグラフ表示 =====================================#======================== Wave function plot ========================#======================== <E> integration ========================#======================== Band ========================#=================================== figure configuration ===================================
特に、crystalname = 'Si' の行を変更することで、異なる結晶設定 ('AB', 'Sim') を選択できます。
生成される出力ファイル
このプログラムは、計算結果をファイルとして保存する機能を持っていません。
代わりに、matplotlib を用いて以下の情報をグラフィカルに表示します。
basisモード:1次元空間中のポテンシャルエネルギー \(V(x)\)。
無限量子井戸ポテンシャルのエネルギー準位(点線、赤)。
有限量子井戸ポテンシャルのエネルギー準位(破線、青)。
対応する波動関数 \(\phi(x)\)(緑)。波動関数は、それぞれのエネルギー準位上に重ねてプロットされます。
bandモード:1次元空間中のポテンシャルエネルギー \(V(x)\)(左側のサブプロット)。
個々の量子井戸の基底状態のエネルギー準位(破線、青)と波動関数(緑)。
波数 \(k\) に対する電子のエネルギーバンド構造(右側のサブプロット)。ハイブリダイズされたバンド(黒丸)が表示されます。単一サイト結晶の場合には、非ハイブリダイズされたバンドも比較のためプロットされます。
プログラムは、表示されたグラフウィンドウが閉じられるか、コンソールで Enter キーが押されるまで一時停止します。
コマンドラインでの使用例 (Usage)
基本的な実行コマンドと引数は以下の通りです。
python tb1d.py [mode]
[mode](オプション): 実行モードを指定します。以下のいずれかを指定できます。basis: 量子井戸の基底状態を計算し、プロットします。band: タイトバインディング法によるバンド構造を計算し、プロットします。wf: このモードは現在実装されておらず、エラーメッセージを表示して終了します。
[mode] が省略された場合、デフォルトで basis モードが実行されます。
コマンドラインでの具体的な使用例
例1: 量子井戸の基底状態と波動関数を表示する
この例では、設定された単一量子井戸(または結晶中の各サイトの量子井戸)のエネルギー準位と波動関数が計算され、プロットされます。
python tb1d.py basis
実行結果の説明:
プログラムが起動すると、単一のMatplotlibウィンドウが表示されます。このウィンドウには、ポテンシャルエネルギーのプロファイル、無限井戸ポテンシャルに対する計算されたエネルギー準位、および有限井戸ポテンシャルに対する計算されたエネルギー準位とそれぞれの波動関数が重ねて表示されます。コンソールには、各量子準位のエネルギー値、パリティ、波動関数の規格化積分などがテキスト情報として出力されます。グラフウィンドウはユーザーが Enter キーを押すまで表示され続けます。
例2: タイトバインディング法によるバンド構造を表示する
この例では、設定された周期的な結晶構造における電子のエネルギーバンド構造が計算され、波数 \(k\) の関数としてプロットされます。
python tb1d.py band
実行結果の説明:
プログラムが起動すると、Matplotlibウィンドウが2つのサブプロットを持つ形で表示されます。
左側のサブプロットには、結晶のポテンシャルエネルギーのプロファイルと、個々の量子井戸の基底状態のエネルギー準位および波動関数が表示されます。これは、バンド計算に使用される基底状態がどのようなものであるかを示します。
右側のサブプロットには、波数 \(k\) を横軸、エネルギー \(E\) を縦軸としたバンド分散関係が表示されます。計算されたエネルギーバンドは黒丸でプロットされます。単一サイト結晶 (crystalname = 'Si') の場合は、近似的な非ハイブリダイズバンドも比較のためにプロットされます。コンソールには、各 \(k\) 点での計算されたエネルギー固有値がテキスト情報として出力されます。グラフウィンドウはユーザーが Enter キーを押すまで表示され続けます。