tb_harrison.py のドキュメント

.. role:: python(code) :language: python

このドキュメントは、Slater-Kosterタイトバインディングモデルを実装するPythonスクリプト tb_harrison.py について説明します。

  1. tb_harrison.py の概要


tb_harrison.py は、Slater-Kosterタイトバインディング(TB)モデルを実装するPythonモジュールです。 s、p、d軌道を持つ有限クラスター(分子)の計算を対象としており、直交基底(S = I)と実対称ハミルトニアン(H)を仮定しています。 特に、ハリソン則(Harrison's rules)に基づいた積分パラメータのスケーリングに対応しています。

  1. インストール


tb_harrison.py は単一のPythonスクリプトファイルであり、特別なインストール手順は必要ありません。 必要な依存ライブラリがインストールされていれば、そのまま実行またはインポートして使用できます。

  1. 依存関係


このスクリプトは以下の非標準Pythonライブラリに依存しています。 これらは pip を使用してインストールできます。

  • numpy: 数値計算、特に配列操作に使用されます。

    • インストールコマンド: pip install numpy

  • scipy: 科学技術計算ライブラリ。線形代数モジュール scipy.linalgeigh 関数が固有値問題を解くために使用されます。

    • インストールコマンド: pip install scipy

  1. 使い方


a. CLIからの実行

tb_harrison.py は、main() 関数を通じてCLIから直接実行できます。 プログラムはハードコードされた原子設定、Slater-Kosterパラメータ、およびオンサイトエネルギーを使用してハミルトニアンを構築し、対角化して結果を表示します。

::bash

python tb_harrison.py

b. Pythonスクリプト内での使用

i. クラス: SlaterKosterTB

SlaterKosterTB クラスは、Slater-Kosterタイトバインディング法の主要なロジックをカプセル化します。

1. 概要

s、p、d軌道を持つ有限クラスター用の最小限のSlater-Kosterタイトバインディング(TB)モデルを提供します。 直交基底と実対称ハミルトニアンを仮定しています。 ハリソン則によるスケーリングをサポートしており、 sk_params"harrison" エントリを通じて積分キーごとの指数を指定できます。

harrison パラメータの例:

{
    "harrison": {
        "d0": 1.0,
        "power_default": 2.0,
        "power_map": {
            "sd_sigma": 3.5,
            "pd_sigma": 3.5,
            "pd_pi": 3.5
        },
        "d0_map": {
            "pd_sigma": 2.0
        }
    }
}

harrison が省略された場合、スケーリングは行われません(スケールは1)。 後方互換性のため、 {"d0":..., "power":...} のみが与えられた場合、それがデフォルトとして使用されます。

2. コンストラクタ: __init__()

:python:SlaterKosterTB.__init__()

SlaterKosterTB クラスの新しいインスタンスを初期化します。 既知の軌道タイプ(s、p、d)とそれに対応する軌道のリストを設定し、原子リストとハミルトニアン行列を空の状態に初期化します。

設定される軌道タイプは以下の通りです。

  • "s": ["s"]

  • "p": ["px", "py", "pz"]

  • "d": ["dxy", "dyz", "dzx", "dx2-y2", "dz2"]

3. メソッド:

  • :python:SlaterKosterTB.add_atom(symbol, orb_type, x, y, z)

    モデルに原子を追加します。

    :param symbol: str: 原子の元素記号。 :param orb_type: str: 原子の軌道タイプ(例: "s", "p", "d")。 :param x: float: 原子のX座標。 :param y: float: 原子のY座標。 :param z: float: 原子のZ座標。 :returns: None :raises ValueError: 未知の軌道タイプが指定された場合。

  • :python:SlaterKosterTB._need_param(p, key)

    静的メソッド。指定されたSKパラメータが存在するか確認し、その値を返します。 sk_params 辞書から key に対応する値を取得します。 key が存在しない場合は KeyError を発生させます。

    :param p: dict: Slater-Kosterパラメータを格納する辞書。 :param key: str: 取得するパラメータのキー。 :returns: float or int: 指定されたキーに対応するパラメータ値。 :raises KeyError: 指定されたキーが sk_params に存在しない場合。

  • :python:SlaterKosterTB._harrison_scale(d, sk_params, key=None)

    静的メソッド。ハリソン則に基づいて、距離によるスケーリング因子を計算します。 サイト間距離 dsk_params"harrison" セクションに定義されたルールに従って、スケーリング因子を計算します。 d0 (基準距離) と power (指数) は、グローバルまたはキーごとに指定できます。 harrison パラメータが指定されていない場合、または d が0以下の場合、スケーリングは行われず1.0を返します。 指数の選択順序は、1) power_map[key] -> 2) power_default -> 3) 従来の power です。

    :param d: float: サイト間の距離。 :param sk_params: dict: Slater-Kosterパラメータを含む辞書。 :param key: str, optional: スケーリング対象の積分キー(例: "ss_sigma")。キー固有のスケーリング設定に使用されます。デフォルトは None。 :returns: float: 計算されたハリスン則によるスケーリング因子。

  • :python:SlaterKosterTB._scaled_param(d, sk_params, key)

    ハリソン則でスケーリングされたSlater-Kosterパラメータを返します。 まず :python:_need_param() を使用して元のパラメータ値を取得し、次に :python:_harrison_scale() を使用してスケーリング因子を計算します。 最後に、元のパラメータ値にスケーリング因子を乗じて結果を返します。

    :param d: float: サイト間の距離。 :param sk_params: dict: Slater-Kosterパラメータを含む辞書。 :param key: str: スケーリング対象のSlater-Koster積分キー。 :returns: float: ハリソン則でスケーリングされたパラメータ値。

  • :python:SlaterKosterTB._get_sk_elements(vec, orb1, orb2, p)

    2つの軌道間のSlater-Koster行列要素を計算します。 2つの原子間の相対位置ベクトル vec とそれぞれの軌道タイプ orb1, orb2 を基に、ハミルトニアンのオフサイト要素を計算します。 距離 d、方向余弦 l, m, n を用いて、s-s、s-p、s-d、p-p、p-d の各相互作用を処理します。 d-d 相互作用は現在未実装です。 軌道間の対称性に基づいて、特定の相互作用では符号が反転することがあります。

    :param vec: :python:numpy.ndarray: 原子間の相対位置ベクトル (x, y, z)。 :param orb1: str: 1番目の原子の軌道タイプ(例: "s", "px", "dxy")。 :param orb2: str: 2番目の原子の軌道タイプ(例: "s", "px", "dxy")。 :param p: dict: Slater-Kosterパラメータを含む辞書。 :returns: float: 計算されたSlater-Koster行列要素の値。 :raises NotImplementedError: d-d ホッピングまたはサポートされていない軌道ペアが指定された場合。

  • :python:SlaterKosterTB.build_hamiltonian(sk_params, onsite_energies)

    システムのハミルトニアン行列を構築します。 追加された原子とその軌道情報、Slater-Kosterパラメータ、オンサイトエネルギーに基づいて、全体のハミルトニアン行列を構築します。 まず、オンサイト項を対角要素に設定します。次に、異なる原子間のオフサイト項を :python:_get_sk_elements() を使用して計算し、行列を埋めます。 ハミルトニアンは実対称行列として構築されます。

    :param sk_params: dict: Slater-Kosterパラメータを含む辞書。 :param onsite_energies: dict: 原子の記号と軌道タイプごとのオンサイトエネルギーを含む辞書。 :returns: :python:numpy.ndarray: 構築されたハミルトニアン行列。

  • :python:SlaterKosterTB.orbital_labels()

    各原子の軌道に対応するラベルのリストを生成します。 各原子の位置と軌道タイプを組み合わせて、ハミルトニアン行列の各要素に対応する識別のための文字列ラベルを生成します。

    例: "Ba(0.000,0.000,0.000)_s", "N(0.000,0.000,0.800)_px"

    :returns: list[str]: 各軌道に対応するラベルのリスト。

ii. 関数: main()

:python:main()

1. 概要

SlaterKosterTB クラスの使用例を示します。 SlaterKosterTB クラスを初期化し、複数の原子をモデルに追加します。 定義済みのSlater-Kosterパラメータとオンサイトエネルギーを使用してハミルトニアンを構築し、 scipy.linalg.eigh を使用してハミルトニアンを対角化し、固有値(軌道エネルギー)と固有ベクトルを計算します。 結果として得られたエネルギーと、それぞれの固有状態における支配的な軌道成分を表示します。

2. 処理フロー

  1. SlaterKosterTB インスタンスを初期化します。

  2. 複数の原子(Ba 1つ、N 5つ)を特定の座標と軌道タイプで追加します。

  3. Slater-Kosterパラメータ(params)とオンサイトエネルギー(onsite)を定義します。

    • params には、ss_sigma, sp_sigma, pp_sigma, pp_pi, sd_sigma, pd_sigma, pd_pi の値と、ハリソン則スケーリング用の "harrison" 設定が含まれます。

    • onsite には、Baのd軌道とNのp軌道に対するオンサイトエネルギーが含まれます。

  4. :python:build_hamiltonian() メソッドを呼び出し、ハミルトニアン行列を構築します。

  5. 構築されたハミルトニアン行列を scipy.linalg.eigh で対角化し、固有値(エネルギー)と固有ベクトルを取得します。

  6. エネルギーを昇順にソートします。

  7. :python:orbital_labels() メソッドで各軌道のラベルを生成します。

  8. 計算された固有値(軌道エネルギー)と、各固有状態における軌道の係数を表示します。

3. 入力

main() 関数は、外部からの直接的な入力を受け取りません。 原子の構成、Slater-Kosterパラメータ、およびオンサイトエネルギーは、関数内でハードコードされた辞書として定義されています。

  • 原子構成の例:

    • Ba: (0, 0, 0) にd軌道

    • N: (0, 0, 0.8), (1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0) にp軌道

  • Slater-Kosterパラメータの例 (params):

    {
        "ss_sigma": -1.40,
        "sp_sigma": 1.84,
        "pp_sigma": 3.24,
        "pp_pi": -0.81,
        "sd_sigma": -2.0,
        "pd_sigma": -2.2,
        "pd_pi": 1.0,
        "harrison": {
            "d0": 1.0,
            "power_default": 2.0,
            "power_map": {
                "sd_sigma": 3.5,
                "pd_sigma": 3.5,
                "pd_pi": 3.5
            }
        }
    }
    
  • オンサイトエネルギーの例 (onsite):

    {
        "Ba": {
            "d": 0.0
        },
        "N": {
            "p": -3.0
        }
    }
    

4. 出力

標準出力に計算結果が表示されます。

  • 固有値(軌道エネルギー)のリスト:

    Eigenvalues (Orbital Energies) [eV]:
    [-5.68817682 -5.04892461 -4.27963242 -3.42533038 -3.12513366 -2.89880816
     -2.89880816 -2.89880816 -2.61066063 -2.61066063 -2.61066063 -2.06209867
     -2.06209867 -2.06209867  1.82276569  2.62883072  2.62883072  2.62883072
      3.20815335  3.20815335  3.20815335]
    
  • 各固有状態の詳細: 各固有状態について、その番号、エネルギー、および各軌道の係数が表示されます。

    No. |   Energy (eV) |  Dominant components
    ------------------------------------------------------------------------
      1 |    -5.6882
        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.279
        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.681
        N(1.000,0.000,0.000)_px:+0.000
        N(1.000,0.000,0.000)_py:+0.000
        N(1.000,0.000,0.000)_pz:+0.000
        ...
    
  1. Slater-Kosterタイトバインディングモデルについて


a. ハリソン則によるスケーリング

この実装では、Slater-Kosterパラメータの距離依存性をハリソン則を用いてモデル化しています。 ハリソン則では、2つのサイト間のホッピング積分 V がサイト間距離 d のべき乗に反比例すると仮定します。 具体的には、 V(d) = V(d0) * (d0 / d)^power の形式でスケーリングされます。

sk_params 辞書内の "harrison" エントリを介してスケーリングルールを設定できます。

  • "d0": 基準となる距離。デフォルトは 1.0

  • "power_default": スケーリングに使用されるデフォルトの指数。デフォルトは 2.0

  • "power_map": 特定のSlater-Koster積分キー(例: "sd_sigma", "pd_sigma")に対して、 power_default を上書きする指数を指定するための辞書。

  • "d0_map": (オプション) 特定のSlater-Koster積分キーに対して、 d0 を上書きする基準距離を指定するための辞書。

スケーリング因子の計算では、以下の優先順位で指数(power)が選択されます。

  1. power_map[key] (キー固有の指定があれば最優先)

  2. power_default (デフォルトの指数)

  3. 従来の "power" キー(旧形式との互換性のため)

d0 以下の場合や "harrison" パラメータが指定されていない場合は、スケーリングは行われず、因子は 1.0 となります。

  1. ライセンス


このコードにはライセンス情報が明記されていません。 コードからは確認できません。