TB Harrison Scaling Program ドキュメント

本ドキュメントは、Pythonプログラム tb_harrison.py の技術的な側面について解説します。

プログラムの動作

tb_harrison.py は、Slater-Kosterタイトバインディング法(S-K TB法)を用いて、有限クラスター(分子)の電子構造を計算するプログラムです。特に、ホッピング積分に原子間距離依存性を導入するためのHarrisonスケーリング則を組み込んでいます。

主な機能:

  • 原子と軌道の追加: S、P、D軌道タイプを持つ原子を特定の空間座標に追加できます。

  • ハミルトニアンの構築: 追加された原子とその軌道に基づき、システムのハミルトニアン行列を構築します。対角成分にはオンサイトエネルギーを、非対角成分には原子間のホッピング積分を設定します。

  • Slater-Koster要素の計算: 2つの異なる原子軌道間のホッピング積分(S-K要素)を、原子間距離と方向余弦に基づいて計算します。S-S、S-P、P-P、S-D、P-Dタイプの結合がサポートされています(D-D結合は未実装)。

  • Harrisonスケーリング: 計算されたS-K要素に対して、原子間距離 \(d\) に応じたHarrisonスケーリング \(V = V_0 (d_0 / d)^p\) を適用します。これにより、ホッピング積分の物理的な距離減衰をモデル化します。スケーリングの基準距離 \(d_0\) や指数 \(p\) は、結合タイプ(例: sd_sigma, pd_pi)ごとに柔軟に設定できます。

  • 固有値問題の解決: 構築されたハミルトニアン行列を対角化し、システムの軌道エネルギー(固有値)と分子軌道(固有ベクトル)を計算します。

  • 結果の出力: 計算された軌道エネルギーと、各分子軌道を構成する原子軌道係数を標準出力に表示します。

解決する課題:

このプログラムは、比較的少ない計算コストで分子の電子構造を近似的に理解することを目的としています。特に、原子間距離が変化する系において、ホッピング積分の距離依存性を経験的なHarrisonスケーリングで効率的に記述し、より物理的に現実的な電子状態予測を可能にします。

原理

このプログラムは、Slater-Koster (S-K) タイトバインディング法とHarrisonスケーリングを組み合わせています。

Slater-Koster タイトバインディング法

S-K TB法は、結晶や分子の電子構造を原子軌道の線形結合として近似する手法です。ハミルトニアン行列 \(H\) は、原子軌道 \(|i\rangle\) を基底として構築されます。 $\( H_{ij} = \langle i | \hat{H} | j \rangle \)\( 対角成分 \)H_{ii}\( は原子 \)i\( のオンサイトエネルギーを表し、非対角成分 \)H_{ij}\( (\)i \neq j\() は原子 \)i\( と原子 \)j\( の間のホッピング積分(相互作用エネルギー)を表します。 プログラムでは、S, P, D軌道(`s`, `px`, `py`, `pz`, `dxy`, `dyz`, `dzx`, `dx2-y2`, `dz2`)が考慮され、これら原子軌道間のホッピング積分は、原子間距離 \)d\( と方向余弦 \)(l, m, n)\((原子 \)i\( から原子 \)j\( へのベクトル \)\vec{d}$ を単位ベクトル化したもの)に依存するSlater-Koster要素によって計算されます。

例えば、P-P結合の場合、ホッピング積分はP-P \(\sigma\) (\(V_{pp\sigma}\)) と P-P \(\pi\) (\(V_{pp\pi}\)) の2種類の基本積分と方向余弦で表現されます。 $\( H_{px, px} = l^2 V_{pp\sigma} + (1-l^2) V_{pp\pi} \)\( \)\( H_{px, py} = l m (V_{pp\sigma} - V_{pp\pi}) \)\( 同様に、S-S、S-P、S-D、P-D結合についても、それぞれの基本積分(例: \)V_{ss\sigma}\(, \)V_{sp\sigma}\(, \)V_{sd\sigma}\(, \)V_{pd\sigma}\(, \)V_{pd\pi}$)と方向余弦を使って表現されます。

Harrison スケーリング

Harrisonスケーリングは、原子間ホッピング積分 \(V\) が原子間距離 \(d\) にどのように依存するかをモデル化するための経験的な法則です。一般的に、以下の形式で表されます。 $\( V = V_0 \left( \frac{d_0}{d} \right)^p \)$ ここで、

  • \(V\): 実際の原子間距離 \(d\) におけるホッピング積分。

  • \(V_0\): 基準となる距離 \(d_0\) におけるホッピング積分。これは sk_params で与えられる値に相当します。

  • \(d_0\): 基準距離。プログラムでは通常 \(1.0\) と設定されますが、d0_map で結合タイプごとに設定することも可能です。

  • \(d\): 実際の原子間距離。

  • \(p\): 距離減衰指数(またはパワー指数)。結合タイプによって異なる値を持ちます。例えば、ss_sigmasp_sigmapp_sigmapp_pi などに対してはデフォルトで \(2.0\)sd_sigmapd_sigmapd_pi などに対しては \(3.5\) のような値が適用されます。

このスケーリング則は、原子間距離が変化する際にホッピング積分の値がどのように減少するかを記述し、より現実的な相互作用を表現するために使用されます。

固有値問題

ハミルトニアン行列 \(H\) が構築されると、その固有値問題を解くことで、分子軌道のエネルギーと構成を得ます。 $\( H \Psi = E \Psi \)\( ここで、\)E\( は軌道エネルギー(固有値)のセットであり、\)\Psi$ は対応する分子軌道(固有ベクトル)のセットです。各固有ベクトルは、各原子軌道の係数の線形結合として分子軌道を表します。プログラムでは、scipy.linalg.eigh を使用してこの対称行列の固有値問題を解きます。

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

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

  • numpy: 数値計算、特に配列操作やベクトル/行列演算に広く使用されます。

  • scipy: 科学技術計算ライブラリで、このプログラムでは対称行列の固有値分解を行う scipy.linalg.eigh を使用します。

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

pip install numpy scipy

必要な入力ファイル

現在の tb_harrison.py プログラムは、外部の入力ファイルを必要としません。すべての原子配置、Slater-Kosterパラメータ、およびオンサイトエネルギーは、プログラムの main() 関数内にPythonの辞書としてハードコードされています。

  • 原子情報: tb.add_atom() メソッドを用いて、原子の種類、軌道タイプ、3次元座標 (x, y, z) をプログラム内で直接定義します。

  • Slater-Kosterパラメータ: params という辞書に、ss_sigma, sp_sigma, pp_sigma, pp_pi などの基本ホッピング積分値を定義します。Harrisonスケーリングに関する情報もこの辞書に含めます。

  • オンサイトエネルギー: onsite という辞書に、各原子の種類と軌道タイプに対応するオンサイトエネルギーを定義します。

生成される出力ファイル

tb_harrison.py は、計算結果をファイルとして保存することはありません。全ての出力は標準出力(コンソール)に直接表示されます。

出力される主な内容:

  1. Eigenvalues (Orbital Energies) [eV]: 計算された全軌道のエネルギー値が昇順にソートされてリスト形式で表示されます。

  2. No. | Energy (eV) | Dominant components: 各軌道について、以下の情報が詳細に表示されます。

    • No.: 軌道番号 (1から始まる)。

    • Energy (eV): その軌道のエネルギー値。

    • 各原子軌道係数: その分子軌道を構成する各原子軌道の係数 (symbol(x,y,z)_orbital_type:coefficient) が表示されます。例えば、Ba(0.000,0.000,0.000)_dz2:-0.234 のように、原子の種類、座標、軌道タイプ、そしてその原子軌道が分子軌道にどの程度寄与しているかを示す係数が示されます。

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

tb_harrison.py はコマンドライン引数を必要としません。プログラムを実行するには、Pythonインタプリタを使用してスクリプトを直接実行します。

python tb_harrison.py

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

以下のコマンドを実行します。

python tb_harrison.py

これにより、プログラム内で定義された特定の分子構造(中心にBa原子、その周囲にN原子が配置されたクラスター)に対するタイトバインディング計算が実行されます。 プログラムの main 関数では、以下の原子が定義されています。

  • Ba原子 (D軌道) @ (0, 0, 0)

  • N原子 (P軌道) @ (0, 0, 0.8)

  • N原子 (P軌道) @ (1, 0, 0)

  • N原子 (P軌道) @ (-1, 0, 0)

  • N原子 (P軌道) @ (0, 1, 0)

  • N原子 (P軌道) @ (0, -1, 0)

また、Slater-KosterパラメータとHarrisonスケーリング設定、およびBaのD軌道とNのP軌道のオンサイトエネルギーも定義されています。

実行結果の抜粋:

(実際の出力は、計算機の浮動小数点精度やNumPy/SciPyのバージョンによって微細な差がある可能性があります。)

Eigenvalues (Orbital Energies) [eV]:
[-3.66986221 -3.37648497 -3.37648497 -3.37648497 -3.36441315 -3.29870836
 -3.29870836 -3.29870836 -2.85966601 -2.85966601 -2.77583796 -2.77583796
 -2.57322971 -2.57322971 -2.33333333 -2.33333333 -2.33333333 -1.82348575
 -1.82348575 -1.50000000 -1.50000000 -1.50000000 -1.33088998 -1.33088998
 -1.14035624 -1.14035624 -0.63870891 -0.63870891 -0.50000000 -0.50000000
 -0.50000000 -0.32890696 -0.32890696 -0.06313753 -0.06313753 -0.06313753]

No. |   Energy (eV) |  Dominant components
------------------------------------------------------------------------
 1 |  -3.6699
   Ba(0.000,0.000,0.000)_dxy:+0.000
   Ba(0.000,0.000,0.000)_dyz:+0.000
   Ba(0.000,0.000,0.000)_dzx:+0.000
   Ba(0.000,0.000,0.000)_dx2-y2:+0.000
   Ba(0.000,0.000,0.000)_dz2:-0.234
   N(0.000,0.000,0.800)_px:+0.000
   N(0.000,0.000,0.800)_py:+0.000
   N(0.000,0.000,0.800)_pz:+0.508
   N(1.000,0.000,0.000)_px:+0.428
   N(1.000,0.000,0.000)_py:+0.000
   N(1.000,0.000,0.000)_pz:+0.000
   N(-1.000,0.000,0.000)_px:-0.428
   N(-1.000,0.000,0.000)_py:+0.000
   N(-1.000,0.000,0.000)_pz:+0.000
   N(0.000,1.000,0.000)_px:+0.000
   N(0.000,1.000,0.000)_py:+0.428
   N(0.000,1.000,0.000)_pz:+0.000
   N(0.000,-1.000,0.000)_px:+0.000
   N(0.000,-1.000,0.000)_py:-0.428
   N(0.000,-1.000,0.000)_pz:+0.000
 2 |  -3.3765
   Ba(0.000,0.000,0.000)_dxy:+0.000
   Ba(0.000,0.000,0.000)_dyz:+0.000
   Ba(0.000,0.000,0.000)_dzx:+0.000
   Ba(0.000,0.000,0.000)_dx2-y2:-0.000
   Ba(0.000,0.000,0.000)_dz2:-0.000
   N(0.000,0.000,0.800)_px:+0.000
   N(0.000,0.000,0.800)_py:+0.000
   N(0.000,0.000,0.800)_pz:+0.000
   N(1.000,0.000,0.000)_px:+0.000
   N(1.000,0.000,0.000)_py:-0.500
   N(1.000,0.000,0.000)_pz:+0.000
   N(-1.000,0.000,0.000)_px:+0.000
   N(-1.000,0.000,0.000)_py:+0.500
   N(-1.000,0.000,0.000)_pz:+0.000
   N(0.000,1.000,0.000)_px:+0.000
   N(0.000,1.000,0.000)_py:+0.000
   N(0.000,1.000,0.000)_pz:+0.000
   N(0.000,-1.000,0.000)_px:+0.000
   N(0.000,-1.000,0.000)_py:+0.000
   N(0.000,-1.000,0.000)_pz:+0.000
... (以下略)