draw_band_fs.py Technical Document
プログラムの動作
draw_band_fs.py は、固体の電子バンド構造、状態密度 (DOS)、フェルミ準位 (EF)、フェルミ面 (FS)、および有効質量をシミュレートし、可視化するためのPythonプログラムです。このプログラムは、1次元 (1D)、2次元 (2D)、3次元 (3D) の結晶に対応し、以下の3つの単純な物理モデルをサポートしています。
自由電子モデル (free): 相互作用のない電子ガス。
タイトバインディングモデル (tb): 最近接ホッピングのみを考慮した単純なモデル。
準自由電子モデル (nfe): 自由電子モデルに弱い周期ポテンシャルを追加したモデル。
主な機能
バンド構造計算とプロット:
1Dバンド図(ブリルアンゾーン内の一直線パス)。
2D/3Dバンド図(高対称点パスに沿ったプロット)。
状態密度 (DOS) の計算とプロット:
ガウスブロードニングまたはヒストグラム法によるDOSの生成。
1Dバンド図と並行してDOSをプロットするオプション。
フェルミ準位 (EF) の決定:
ユーザー指定の電子数 (
--nelec) とスピン縮退度 (--spin) に基づき、DOS積分からEFを自動計算。または、
--ef_fixedオプションでEFを固定値として直接指定可能。この場合、DOS計算はスキップされます。
フェルミ点/フェルミ面 (kF/FS) のプロット:
1Dのフェルミ点。
2Dのフェルミ面(等高線)。周期境界条件を視覚的に表現するため、複数セルにわたって表示されます。
3Dのフェルミ面(等値面)。Marching Cubesアルゴリズムを使用して3D空間に描画されます。
有効質量 (m*) のオーバーレイ:
1Dバンド図において、有効質量 \(m^*(k)\) を補助軸として表示するオプション。
解決する課題
このプログラムは、物性物理学における電子構造の基本的な概念(バンド構造、フェルミ準位、状態密度、フェルミ面、有効質量など)を、具体的な計算と視覚化を通じて理解するための教育的ツールとして設計されています。複雑な第一原理計算を行うことなく、これらの概念の物理的意味やモデル依存性を直感的に把握することを支援します。
原理
draw_band_fs.py は、固体の電子構造を記述するためのいくつかの単純なモデルに基づいています。計算は、内部単位系 (内部 \(k\) 空間は \([-0.5, 0.5)\) で周期1) で行われ、物理単位への変換には NORMALIZATION_UNIT = 2 * np.pi が使用されます。これは格子定数 \(a=1\) と仮定した場合の \(k_{phys} = k_{int} \cdot (2\pi/a)\) に対応します。
1. バンドエネルギー計算
各モデルでは、波数ベクトル \(\mathbf{k}\) に対する電子のエネルギー \(E(\mathbf{k})\) が計算されます。
自由電子モデル (
--mode free): 電子は相互作用せず、運動エネルギーのみを持ちます。プログラムでは、逆格子ベクトル \(\mathbf{G}\) を考慮した拡張ゾーン表示でバンドエネルギーを計算します。 $\(E(\mathbf{k}) = |\mathbf{k} - \mathbf{G}|^2\)\( ここで、\)\mathbf{k}\( は第1ブリルアンゾーン内の波数、\)\mathbf{G}\( は逆格子ベクトルです。プログラムでは、\)\mathbf{G}=0\( および各座標軸方向の \)\pm \mathbf{e}_i\( に対応する最小セットのGベクトルが用いられます。定数係数 \)\hbar^2/(2m)$ は省略されています。タイトバインディングモデル (
--mode tb): 電子は原子サイトに局在し、隣接するサイト間でのみホッピングすると仮定します。サイトエネルギーを0、ホッピング積分を \(t=1\) とした場合の単純なバンド分散です。1次元: \(E(k_x) = -2t \cos(k_x a)\)
2次元: \(E(k_x, k_y) = -2t (\cos(k_x a) + \cos(k_y a))\)
3次元: \(E(k_x, k_y, k_z) = -2t (\cos(k_x a) + \cos(k_y a) + \cos(k_z a))\) プログラムでは \(t=1, a=1\) として、例えば1次元では \(E(k_x) = -\cos(k_x \cdot (2\pi/a))\) と計算されます。
準自由電子モデル (
--mode nfe): 自由電子モデルに弱い周期ポテンシャルを追加したモデルです。逆格子ベクトル \(\mathbf{G}\) を基底としてハミルトニアン行列を構築し、その対角化によってエネルギー固有値を求めます。 ハミルトニアン行列の要素 \(H_{\mathbf{G}, \mathbf{G}'}\) は、 $\(H_{\mathbf{G}, \mathbf{G}'}(\mathbf{k}) = \delta_{\mathbf{G}, \mathbf{G}'} E_0(\mathbf{k} - \mathbf{G}) + V_{\mathbf{G} - \mathbf{G}'}\)\( ここで \)E_0(\mathbf{q}) = |\mathbf{q}|^2\( は自由電子の運動エネルギー(定数係数省略)、\)V_{\mathbf{q}}\( は周期ポテンシャルのフーリエ成分です。プログラムでは、非対角成分 \)V_{\mathbf{G} - \mathbf{G}'}$ は簡略化され、全ての非対角要素にユーザー指定の定数--vが用いられます。
2. 状態密度 (DOS) とフェルミ準位 (EF)
DOSは、特定のエネルギーにおける状態の数を表します。
--ef_fixed オプションが指定されていない場合、プログラムは以下の手順でDOSを計算し、EFを決定します。
ブリルアンゾーンのサンプリング: 指定された次元のブリルアンゾーンを格子点 (
--ef_res) でサンプリングし、各 \(k\) 点で全てのバンドエネルギーを計算します。DOSの構築: サンプリングされた全バンドエネルギーを用いてDOSが構築されます。
--dos_sigma > 0の場合: ガウスブロードニングが適用されます。各エネルギー点 \(E_i\) に対して、\(\exp(-(E-E_i)^2 / (2\sigma^2))\) のガウス関数が加算されます。--dos_sigma <= 0の場合: 単純なヒストグラムとしてDOSが計算されます。 DOSは、総状態数がspin * Nband(Nband はモデル内のバンド数) になるようにスケールされます。
EFの決定: DOSをエネルギーで積分し、累積状態数 \(N(E)\) を求めます。ユーザー指定の電子数
--nelecが \(N(E_F)\) に等しくなるエネルギー \(E_F\) を線形補間によって決定します。
3. フェルミ面 (FS)
フェルミ面は、電子が占有している状態と空の状態を分ける \(k\) 空間上の境界であり、\(E(\mathbf{k}) = E_F\) となる点の集合です。
1D フェルミ点: 1次元のバンド図において、\(E(k_x) = E_F\) となる \(k_x\) の点を二分法 (
refine_root_bisection) を用いて検出します。2D フェルミ面: 2次元の \(k_x\)-\(k_y\) 平面で、指定されたバンドのエネルギーグリッドを作成し、\(E(k_x, k_y) = E_F\) の等高線を描画します (
matplotlib.pyplot.contour)。3D フェルミ面: 3次元の \(k_x\)-\(k_y\)-\(k_z\) 空間で、指定されたバンドのエネルギーグリッドを作成し、\(E(k_x, k_y, k_z) = E_F\) の等値面を
scikit-imageライブラリのmeasure.marching_cubesアルゴリズムを用いて抽出します。
4. 有効質量 (\(m^*\))
1次元のバンド図で、電子の有効質量 \(m^*(k)\) はバンド分散の二次導関数から計算されます。 $\(m^*(k) = \frac{\hbar^2}{\frac{d^2E}{d k^2}}\)\( プログラムでは \)a=1, \hbar=1\( として \)1 / (d^2E / d(ka)^2)\( を数値的に計算し、\)(2\pi)^2$ を掛けています。二次導関数は、バンドエネルギーの差分から中心差分近似で求められます。
必要な非標準ライブラリとインストール方法
このプログラムは以下の非標準Pythonライブラリを使用します。
numpy: 数値計算
matplotlib: グラフ描画
scikit-image (skimage): 3Dフェルミ面プロット (
--type 3dfs) のみ。Marching Cubesアルゴリズムを提供します。
これらのライブラリは pip コマンドを使用してインストールできます。
pip install numpy matplotlib scikit-image
必要な入力ファイル
draw_band_fs.py は、外部の入力ファイルを必要としません。全てのパラメータはコマンドライン引数として指定されます。
生成される出力ファイル
draw_band_fs.py は、ファイルを生成しません。全ての出力は matplotlib を使用したグラフィカルウィンドウとして表示されます。
コマンドラインでの使用例 (Usage)
プログラムを実行するための基本的なコマンドと主要な引数を以下に示します。
python draw_band_fs.py --help
usage: draw_band_fs.py [-h] [--type {1dband,2dband,3dband,1dfs,2dfs,3dfs}] [--mode {free,tb,nfe}] [--ef_fixed EF_FIXED] [--nelec NELEC] [--spin SPIN] [--res RES] [--ef_res EF_RES] [--v V] [--k_path_range KMIN KMAX] [--E_range EMIN EMAX] [--E_ef_range EMIN EMAX] [--dos] [--dos_nE DOS_NE] [--dos_sigma DOS_SIGMA] [--kf_tol KF_TOL] [--kf_merge_tol KF_MERGE_TOL] [--mstar] [--nx_view NX_VIEW] [--fs_band FS_BAND] [--fs_alpha FS_ALPHA]
Toy band / DOS / EF(nelec from DOS integral) / kF / m*(k) and FS (1dfs/2dfs/3dfs) simulator.
options:
-h, --help show this help message and exit
--type {1dband,2dband,3dband,1dfs,2dfs,3dfs}
Output type: band plots or Fermi surface plots.
--mode {free,tb,nfe} Model: free / tb / nfe (toy NFE Hamiltonian).
--ef_fixed EF_FIXED Fixed Fermi energy (EF). If set, skips DOS calculation (nelec is ignored).
--nelec NELEC Electrons per unit cell (including spin). EF is obtained from DOS integral (ignored if --ef_fixed is set).
--spin SPIN Spin degeneracy factor (default 2).
--res RES Resolution for FS grids / band path segments.
--ef_res EF_RES BZ sampling resolution per axis for DOS/EF (cost grows as ef_res^dim; ignored if --ef_fixed is set).
--v V Off-diagonal coupling strength in toy NFE Hamiltonian.
--k_path_range KMIN KMAX
kx range for 1D band/1D cut plots (internal unit).
--E_range EMIN EMAX Energy axis range for plotting (visual only).
--E_ef_range EMIN EMAX
Energy range used for DOS/EF calculation. Default: auto from sampled energies. (ignored if --ef_fixed is set).
--dos Also plot DOS (next to band). Requires DOS calculation (--ef_fixed must be None).
--dos_nE DOS_NE Energy grid points for DOS.
--dos_sigma DOS_SIGMA
Gaussian broadening sigma for DOS (<=0 => histogram).
--kf_tol KF_TOL Tolerance for kF root finding.
--kf_merge_tol KF_MERGE_TOL
Merge tolerance for reduced kF lines (internal unit).
--mstar Overlay effective mass m*(k) on band plot (right axis), clipped to [-5,5].
--nx_view NX_VIEW 2D FS periodic view range (internal unit).
--fs_band FS_BAND Band index used for FS isosurface/contour (default 0).
--fs_alpha FS_ALPHA Alpha for 3D FS surface.
コマンドラインでの具体的な使用例
1. 2次元タイトバインディングモデルのバンド構造とDOS、フェルミ準位自動計算
2次元タイトバインディングモデルの高対称点パスに沿ったバンド構造とDOSをプロットし、電子数 --nelec 1.0 からフェルミ準位を自動計算します。
python draw_band_fs.py --type 2dband --mode tb --nelec 1.0 --dos --ef_res 50
実行結果: 2D正方格子ブリルアンゾーンの高対称点 (\(\Gamma\)-X-M-\(\Gamma\)) に沿ったバンド構造と、その右隣に状態密度 (DOS) のグラフが表示されます。DOSから計算されたフェルミ準位 \(E_F\) が両方のグラフに破線で示され、バンド図には \(E_F\) に対応するバンドがプロットされます。
2. 3次元準自由電子モデルのフェルミ面 (固定フェルミ準位)
3次元準自由電子モデル (--mode nfe) の第0バンドについて、固定されたフェルミ準位 (--ef_fixed 2.0) でフェルミ面をプロットします。弱い周期ポテンシャルの結合強度 --v 0.5 を指定します。
python draw_band_fs.py --type 3dfs --mode nfe --fs_band 0 --ef_fixed 2.0 --v 0.5 --res 60
実行結果:
3Dのフェルミ面がインタラクティブな3Dプロットウィンドウで表示されます。--fs_band 0 で指定されたバンドの \(E=2.0\) の等値面がMarching Cubesアルゴリズムによって計算され、カラーシェーディング付きでレンダリングされます。
3. 1次元自由電子モデルのバンド構造と有効質量
1次元自由電子モデルのバンド構造をプロットし、有効質量 \(m^*(k)\) をオーバーレイ表示します。
python draw_band_fs.py --type 1dband --mode free --nelec 1.0 --mstar --k_path_range -1.0 1.0 --E_range 0 15
実行結果:
\(k_x\) 軸に沿った自由電子モデルのバンドがプロットされます。フェルミ準位 \(E_F\) が破線で示され、有効質量 \(m^*(k)\) が右側の補助Y軸を使って点線でオーバーレイ表示されます。バンドが分散するにつれて有効質量が変化する様子が確認できます。--k_path_range -1.0 1.0 により、第1ブリルアンゾーン外の領域も表示されます。