tb1d.py の技術ドキュメント

プログラムの動作

tb1d.py は、1次元タイトバインディング法を用いて量子井戸ポテンシャル下での電子のバンド構造を計算し、その結果を可視化するPythonプログラムです。主な機能は以下の2つのモードで提供されます。

  1. basis モード: 孤立した量子井戸ポテンシャル内の電子のエネルギー準位と波動関数を計算し、プロットします。無限井戸ポテンシャルの準位と比較することもできます。

  2. band モード: 1次元周期ポテンシャル(複数の量子井戸が周期的に配置された構造)における電子のバンド構造をタイトバインディング法で計算し、波数 \(k\) に対するエネルギー \(E(k)\) の関係を図示します。基底関数として、孤立量子井戸の固有状態を利用します。

  3. wf モード: 現在のところ実装されておらず、実行すると終了します。

本プログラムは、1次元結晶における電子状態の基本的な振る舞いを、特に量子井戸の準位とバンド構造の関連性を視覚的に理解することを目的としています。

原理

1. 量子井戸内の電子状態

プログラムは、矩形障壁ポテンシャルを持つ1次元量子井戸における電子の固有状態を計算します。電子のエネルギー準位 \(E\) は、シュレーディンガー方程式を解き、波動関数の連続性と微分の連続性という境界条件から導かれる以下の超越方程式を数値的に解くことで求められます。

井戸の幅を \(w_{width}\)、ポテンシャルの深さを \(V_0 = V_{vac} - V_{base}\) とし、電子の有効質量を \(m_{eff}\) とします。障壁内(\(|x| > w_{width}/2\))の波数 \(k_b\) と井戸内(\(|x| \le w_{width}/2\))の波数 \(k_w\) は以下のように定義されます。

\[k_b = \frac{\sqrt{2 m_{eff} m_e (V_0 - E) e}}{\hbar} \cdot 10^{-10} \quad (\AA^{-1})\]
\[k_w = \frac{\sqrt{2 m_{eff} m_e E e}}{\hbar} \cdot 10^{-10} \quad (\AA^{-1})\]

ここで、\(m_e\) は自由電子質量、\(e\) は素電荷、\(\hbar\) は換算プランク定数です。

偶関数基底の場合: $\(\Delta_{even}(E) = k_b - k_w \tan(k_w w_{width}/2) = 0\)$

奇関数基底の場合: $\(\Delta_{odd}(E) = k_b + k_w / \tan(k_w w_{width}/2) = 0\)$

これらの超越方程式は、cal_delta_even および cal_delta_odd 関数で計算され、secant法 (refine_E 関数) によって \(E\) を決定します。KE は運動エネルギー項の係数として、 $\(KE = \frac{\hbar^2}{2 m_e e} \cdot 10^{20}\)$ と定義されています。

計算された固有状態は、タイトバインディング法の基底関数として使用されます。

2. タイトバインディング法によるバンド構造計算

1次元周期構造における電子のバンド構造は、孤立した量子井戸の固有状態(基底関数)を線形結合して近似するタイトバインディング法によって計算されます。

この方法では、結晶の電子状態を記述するハミルトニアン行列 \(H\) と重なり積分行列 \(S\) を構築し、一般化固有値問題 \(H C = E S C\) を解きます。プログラムでは、ブロッホの定理に基づき、波数 \(k\) に依存する行列要素 \(F_{ij}(k)\)\(S_{ij}(k)\) を計算します。

サイト \(i\) にある原子の \(p\) 番目の基底関数を \(\phi_{i,p}(x)\)、サイト \(j\) にある原子の \(q\) 番目の基底関数を \(\phi_{j,q}(x)\) とし、サイト \(i\) の位置を \(x_i\)、サイト \(j\) の位置を \(x_j\) とします。格子定数を \(a\) とすると、行列要素は以下のように与えられます。

\[F_{pq}(k) = \sum_{N} e^{i k \frac{2\pi}{a} (x_j + N a - x_i)} \int \phi_{i,p}^*(x - x_i) V(x) \phi_{j,q}(x - x_j - N a) dx\]
\[S_{pq}(k) = \sum_{N} e^{i k \frac{2\pi}{a} (x_j + N a - x_i)} \int \phi_{i,p}^*(x - x_i) \phi_{j,q}(x - x_j - N a) dx\]

ここで、\(V(x)\) は結晶全体のポテンシャル、\(N\) は格子周期を表す整数です。プログラムでは cal_tij 関数で \(F_{pq}(k)\) の積分の実体であるホッピング積分を、cal_Sij 関数で重なり積分を計算します。 最終的に、solve_eigenstates 関数内で、これらの行列要素から構成される \(F\)\(S\) 行列を用いて、LA.eigvals(LA.inv(Sij) @ Fij) によって固有値 \(E(k)\) を計算し、バンド構造を得ます。

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

このプログラムは以下の非標準Pythonライブラリを使用します。

  • numpy: 高度な数値計算(配列操作、線形代数など)

  • matplotlib: グラフ描画

  • csv: (現時点では直接使用されていませんが、インポートされています。)

これらのライブラリは、以下の pip コマンドでインストールできます。

pip install numpy matplotlib

必要な入力ファイル

tb1d.py は、外部の入力ファイルを必要としません。 結晶構造、原子の種類、ポテンシャルの定義、計算パラメータ、プロット範囲など、すべての設定はスクリプト内のグローバル変数としてハードコードされています。

ユーザーは、スクリプトの冒頭付近にある以下の変数を編集することで、異なる結晶設定を試すことができます。

  • crystalname: 'Si', 'AB', 'Sim' のいずれかを指定して、定義済みの結晶構造を切り替えます。

  • atoms および crystal リスト: 必要に応じて、原子の種類やサイトの配置を直接編集できます。

生成される出力ファイル

本プログラムは、計算結果をファイルとして出力しません。 すべての計算結果(ポテンシャル、エネルギー準位、波動関数、バンド構造)は、matplotlib を用いてリアルタイムでグラフィカルに画面に表示されます。 プログラムの実行後、プロットウィンドウが表示され、ユーザーがEnterキーを押すまで結果が維持されます。

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

tb1d.py は、実行時に引数を渡すことでモードを切り替えることができます。

基本的な使用法:

python tb1d.py (mode)

mode は以下のいずれかです。

  • basis: 量子井戸のポテンシャル、エネルギー準位、波動関数を表示します。

  • band: タイトバインディング法によるバンド構造を計算し、表示します。

  • wf: 現在実装されておらず、実行すると終了します。

引数を省略した場合、デフォルトのモードは 'basis' です。

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

1. 基底関数の表示 (basis モード)

量子井戸ポテンシャル、エネルギー準位、および基底となる波動関数をプロットします。

python tb1d.py basis

実行結果の説明: プログラムが実行されると、標準出力に設定パラメータ、計算された有限井戸および無限井戸のエネルギー準位、そしてそれぞれの解析解と数値解によるエネルギー計算結果が表示されます。同時に matplotlib のウィンドウが開かれ、左側にポテンシャルエネルギー曲面、破線で有限井戸のエネルギー準位、点線で無限井戸のエネルギー準位、緑色の曲線で各準位に対応する波動関数が表示されます。

2. バンド構造の計算と表示 (band モード)

タイトバインディング法を用いてバンド構造を計算し、表示します。

python tb1d.py band

実行結果の説明: プログラムが実行されると、標準出力に設定パラメータ、量子井戸のエネルギー準位、近接サイトの情報、基底セット、そして各 \(k\) 点での固有値が表示されます。同時に matplotlib のウィンドウが開き、左側にポテンシャルエネルギー曲面、破線で孤立した量子井戸のエネルギー準位、緑色の曲線でその波動関数が表示されます。右側には、波数 \(k\) に対する電子のバンドエネルギー \(E(k)\) が黒い丸印でプロットされます。crystalname'Si' (単一原子) の場合、タイトバインディング法の行列要素 Fij および Fij/Sij の結果も、それぞれ赤の実線、青の破線としてプロットされ、バンド形成の過程が視覚化されます。