プログラム kronig_penney.py のドキュメント

1. 概要

kronig_penney.py は、Kronig-Penneyモデルを用いて1次元のバンド計算を実行するPythonスクリプトです。このプログラムは、半導体の電子バンド構造を矩形ポテンシャルでモデル化し、その結果をグラフ表示、バンド図プロット、または波動関数プロットのいずれかのモードで出力します。

2. 非標準ライブラリ

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

  • numpy: 数値計算、特に配列操作や数学関数 (sqrt, exp, sin, cos, tan, cosh, sinh など) のために使用されます。線形代数演算 (numpy.linalgLA) も利用されます。

  • matplotlib.pyplot: 計算結果をグラフとして可視化するために使用されます。

3. 定数

プログラム内で定義されている物理定数および数学定数は以下の通りです。

  • pi (float): 円周率 (3.14159265358979323846)

  • pi2 (float): 2 * pi

  • h (float): プランク定数 (6.6260755e-34 Js)

  • hbar (float): ディラック定数 (1.05459e-34 Js)

  • c (float): 真空中の光速 (2.99792458e8 m/s)

  • e (float): 素電荷 (1.60218e-19 C)

  • e0 (float): 真空の誘電率 (8.854418782e-12 C^2 N^-1 m^-2)

  • kB (float): ボルツマン定数 (1.380658e-23 JK^-1)

  • me (float): 電子の質量 (9.1093897e-31 kg)

  • R (float): 気体定数 (8.314462618 J/K/mol)

  • a0 (float): ボーア半径 (5.29177e-11 m)

4. グローバル設定

プログラムの動作を制御するグローバル変数は以下の通りです。これらの一部はコマンドライン引数で上書き可能です。

  • モード設定

    • mode (str): プログラムの実行モード。デフォルトは 'graph'。取りうる値は 'graph' (エネルギーと delta(E) の関係をプロット), 'band' (エネルギーバンド構造をプロット), 'wf' (波動関数をプロット) です。

  • 結晶定義

    • a (float): 格子定数 (オングストローム A)。デフォルトは 5.4064 A (シリコン Si の値)。

  • ポテンシャル設定

    • bwidth (float): ポテンシャル障壁の幅 (A)。デフォルトは 0.5 A

    • bpot (float): ポテンシャル障壁の高さ (eV)。デフォルトは 10.0 eV

  • graphview() モード設定

    • kg (float): プロットする波数 (pi/a 単位)。デフォルトは 0.0

    • Emin (float): エネルギー走査の最小値 (eV)。デフォルトは 0.0

    • Emax (float): エネルギー走査の最大値 (eV)。デフォルトは 9.5

    • nE (int): グラフを表示するエネルギー点の数。デフォルトは 51

    • nEsearch (int): 解を走査するエネルギー点の数。デフォルトは nE と同じ (51)。

    • eps (float): Secant法の収束判定許容誤差。デフォルトは 1.0e-8

    • nmaxiter (int): Secant法の最大繰り返し回数。デフォルトは 100

    • dump (float): Secant法の収束を助けるための微小な値。デフォルトは 0.0

  • band() モード設定

    • kmin (float): ブロッホ波数 k の最小値 (pi/a 単位)。デフォルトは -0.5

    • kmax (float): ブロッホ波数 k の最大値 (pi/a 単位)。デフォルトは 0.5

    • nk (int): k 点の数。デフォルトは 21

    • Erange (list of float): プロットするエネルギー範囲 [E_min, E_max] (eV)。デフォルトは [0.0, 10.0]

    • nMaxLevel (int): リストに保存する準位の最大数。デフォルトは 15

  • wf() モード設定

    • xwmin (float): 波動関数を描画する x 範囲の最小値 (A)。デフォルトは 0.0

    • xwmax (float): 波動関数を描画する x 範囲の最大値 (A)。デフォルトは 3.0 * a

    • nxw (int): 波動関数を描画する x 点の数。デフォルトは 101

    • kw (float): 描画する波動関数の波数 (pi/a 単位)。デフォルトは 0.0

    • iLevel (int): 描画する波動関数の準位番号 (0から始まるインデックス)。デフォルトは 0

  • 描画設定 (matplotlib)

    • figsize (tuple of float): 図のサイズ (幅, 高さ)。デフォルトは (6, 8)

    • fontsize (int): 軸ラベルなどのフォントサイズ。デフォルトは 12

    • legend_fontsize (int): 凡例のフォントサイズ。デフォルトは 8

5. コマンドライン引数

プログラムはコマンドライン引数を受け付け、グローバル設定の一部を上書きできます。引数は位置によって解釈されます。

5.1. 基本的な使い方

引数なしで実行すると、デフォルト設定で graph モードが実行されます。

python kronig_penney.py

5.2. 各モードの引数

コマンドライン引数の最初の要素 (sys.argv[1]) は実行モードを指定します。2番目以降の引数はモードによって異なります。

  • 共通引数: 常に以下の順序で指定されます。

    1. mode (str): 実行モード (graph, band, または wf)。

    2. a (float): 格子定数。

    3. bwidth (float): ポテンシャル障壁の幅。

    4. bpot (float): ポテンシャル障壁の高さ。

  • graph モードの追加引数:

    1. kg (float): プロットする波数。

    2. Emin (float): エネルギー走査の最小値。

    3. Emax (float): エネルギー走査の最大値。

    4. nE (int): グラフを表示するエネルギー点の数。

  • band モードの追加引数:

    1. kmin (float): ブロッホ波数 k の最小値。

    2. kmax (float): ブロッホ波数 k の最大値。

    3. nk (int): k 点の数。

  • wf モードの追加引数:

    1. kw (float): 描画する波動関数の波数。

    2. iLevel (int): 描画する波動関数の準位番号。

    3. xwmin (float): 波動関数を描画する x 範囲の最小値。

    4. xwmax (float): 波動関数を描画する x 範囲の最大値。

    5. nxw (int): 波動関数を描画する x 点の数。

引数はオプションであり、指定されない場合は対応するグローバル変数のデフォルト値が使用されます。

6. 入出力

6.1. 入力ファイル

本プログラムは入力ファイルを読み込みません。すべての設定はソースコード内のグローバル変数またはコマンドライン引数を通じて行われます。

6.2. 出力ファイル

本プログラムは計算結果をファイルに保存しません。

6.3. 標準出力

プログラムは、初期パラメータ、計算の進行状況(特に find_Elist() 関数でのエネルギー準位の探索結果)、エラーメッセージ、および終了時のプロンプトを標準出力に出力します。

6.4. グラフィック出力

matplotlib.pyplot を使用して計算結果をグラフとして画面に表示します。ユーザーが ENTER キーを押すまでグラフは表示され続けます。

7. 主要関数

7.1. pfloat(str)

  • 概要: 文字列を float 型に安全に変換します。

  • 詳細説明: 変換できない場合は None を返します。

  • 引数:

    • str (str): 変換する文字列。

  • 戻り値:

    • float または None: 変換された float 値、または None

7.2. pint(str)

  • 概要: 文字列を int 型に安全に変換します。

  • 詳細説明: 変換できない場合は None を返します。

  • 引数:

    • str (str): 変換する文字列。

  • 戻り値:

    • int または None: 変換された int 値、または None

7.3. getarg(position, defval=None)

  • 概要: コマンドライン引数を安全に取得します。

  • 詳細説明: 指定された位置の引数が存在しない場合、デフォルト値を返します。

  • 引数:

    • position (int): 取得する引数の位置(インデックス)。

      • defval (Any, optional): 引数が存在しない場合に返すデフォルト値。デフォルトは None

  • 戻り値:

    • Any: 指定された位置の引数、またはデフォルト値。

7.4. getfloatarg(position, defval=None)

  • 概要: コマンドライン引数を float 型に変換して安全に取得します。

  • 詳細説明: 指定された位置の引数が存在しない場合や float に変換できない場合、デフォルト値を返します。

  • 引数:

    • position (int): 取得する引数の位置(インデックス)。

      • defval (float または None, optional): 引数が存在しない場合や変換できない場合に返すデフォルト値。デフォルトは None

  • 戻り値:

    • float または None: 変換された float 値の引数、またはデフォルト値。

7.5. getintarg(position, defval=None)

  • 概要: コマンドライン引数を int 型に変換して安全に取得します。

  • 詳細説明: 指定された位置の引数が存在しない場合や int に変換できない場合、デフォルト値を返します。

  • 引数:

    • position (int): 取得する引数の位置(インデックス)。

      • defval (int または None, optional): 引数が存在しない場合や変換できない場合に返すデフォルト値。デフォルトは None

  • 戻り値:

    • int または None: 変換された int 値の引数、またはデフォルト値。

7.6. round01(x, a)

  • 概要: 数値を区間 [0, a) にマッピングし、周期的なオフセットを計算します。

  • 詳細説明: x = n * a + x0 となるような x0 と整数 n を計算します。x00 <= x0 < a の範囲に収まります。

  • 引数:

    • x (float): マッピング対象の数値。

    • a (float): 周期の幅。

  • 戻り値:

    • tuple (float, int): xa で割った余り x0 と整数 n のタプル。

7.7. usage()

  • 概要: スクリプトの正しい使用方法を標準出力に表示します。

  • 詳細説明: コマンドライン引数の形式といくつかの使用例を示します。

7.8. terminate(message=None)

  • 概要: エラーメッセージを表示してプログラムを終了します。

  • 詳細説明: usage() 関数を呼び出した後、指定されたメッセージ(任意)を表示してプログラムを終了します。

  • 引数:

      • message (str または None, optional): 表示するエラーメッセージ(オプション)。デフォルトは None

7.9. pot(x)

  • 概要: 矩形ポテンシャル関数を定義します。

  • 詳細説明: 0 <= x < a - bwidth の範囲ではポテンシャルは0、a - bwidth <= x < a の範囲では bpot のポテンシャルを返します。周期 a を持ちます。グローバル変数 a, bwidth, bpot を使用します。

  • 引数:

    • x (float): 位置 (A)。

  • 戻り値:

    • float: 指定された位置 x におけるポテンシャル値 (eV)。

7.10. build_potential(xmin, xstep, n)

  • 概要: 指定された範囲でポテンシャルプロファイルを作成します。

  • 詳細説明: xmin から開始し、n 個の点に対して xstep 間隔でポテンシャル値を計算します。

  • 引数:

    • xmin (float): 最初の x 座標 (A)。

    • xstep (float): x 座標のステップ幅 (A)。

    • n (int): 計算する点の数。

  • 戻り値:

    • tuple (numpy.ndarray, numpy.ndarray): x 座標の配列と対応するポテンシャル値の配列のタプル。

7.11. cal_delta(E, k, w, b, V0)

  • 概要: Kronig-Penneyモデルのエネルギー方程式の左辺 delta(E) を計算します。

  • 詳細説明: エネルギー E と波数 k、ポテンシャルパラメータ wbV0 を用いて、周期的な結晶における電子のエネルギー準位を決定する方程式の値を計算します。delta(E) = cos(ka) となる E が許容エネルギーとなります。

  • 引数:

    • E (float): 電子のエネルギー (eV)。

    • k (float): ブロッホ波数 (単位: pi/a)。

    • w (float): ポテンシャル井戸の幅 (A)。

    • b (float): ポテンシャル障壁の幅 (A)。

    • V0 (float): ポテンシャル障壁の高さ (eV)。

  • 戻り値:

    • float: Kronig-Penneyモデル方程式の左辺の値。

7.12. check_ci(ci, kw, Ei, w, b, V0, eps, IsPrint=0)

  • 概要: 波束係数 ci がKronig-Penneyモデルの境界条件を満たしているか検証します (デバッグ用)。

  • 詳細説明: 4つの境界条件式に ci を代入し、その結果が eps より小さいかを確認します。満たさない場合はエラーで終了します。

  • 引数:

    • ci (list of complex): 波動関数の係数リスト。

    • kw (float): ブロッホ波数 (単位: pi/a)。

    • Ei (float): 電子のエネルギー (eV)。

    • w (float): ポテンシャル井戸の幅 (A)。

    • b (float): ポテンシャル障壁の幅 (A)。

    • V0 (float): ポテンシャル障壁の高さ (eV)。

    • eps (float): 許容誤差。

      • IsPrint (int, optional): 詳細を出力するかどうかのフラグ (0: なし, 1: あり)。デフォルトは 0

7.13. refine_E(E0, E1, nmaxiter, eps, dump, k, w, b, V0, IsPrint=0)

  • 概要: Secant法を用いてKronig-Penneyモデルの許容エネルギー E を高精度化します。

  • 詳細説明: cal_delta(E)=0 となる E をSecant法で探索し、収束したエネルギー値を返します。

  • 引数:

    • E0 (float): 探索範囲の下限エネルギー (eV)。

    • E1 (float): 探索範囲の上限エネルギー (eV)。

    • nmaxiter (int): 最大繰り返し回数。

    • eps (float): 収束判定の許容誤差。

    • dump (float): 収束を助けるための微小な値。

    • k (float): ブロッホ波数 (単位: pi/a)。

    • w (float): ポテンシャル井戸の幅 (A)。

    • b (float): ポテンシャル障壁の幅 (A)。

    • V0 (float): ポテンシャル障壁の高さ (eV)。

      • IsPrint (int, optional): 詳細を出力するかどうかのフラグ (0: なし, 1: あり)。デフォルトは 0

  • 戻り値:

    • tuple (float, float, float) または (None, None, None): 収束したエネルギー (float)、最終的なエネルギー変化 (float)、最終的な delta 値 (float) のタプル。収束しない場合は None のタプル。

7.14. find_Elist(Emin, Emax, nEsearch, k, w, b, V0)

  • 概要: 指定されたエネルギー範囲でKronig-Penneyモデルの許容エネルギー準位と対応する係数を見つけます。

  • 詳細説明: Emin から Emax までを nEsearch 分割して cal_delta(E) の符号反転を探索し、Secant法で厳密なエネルギー値を特定します。同時に波動関数の係数 ci も計算します。

  • 引数:

    • Emin (float): 探索するエネルギー範囲の最小値 (eV)。

    • Emax (float): 探索するエネルギー範囲の最大値 (eV)。

    • nEsearch (int): エネルギー範囲の探索ステップ数。

    • k (float): ブロッホ波数 (単位: pi/a)。

    • w (float): ポテンシャル井戸の幅 (A)。

    • b (float): ポテンシャル障壁の幅 (A)。

    • V0 (float): ポテンシャル障壁の高さ (eV)。

  • 戻り値:

    • tuple (list of float, list of list of complex): 許容エネルギー準位のリストと、各準位に対応する波動関数係数のリストのタプル。

7.15. cal_wavefunction(ci, x, kw, Ei, w, b, V0)

  • 概要: 指定された係数 ci を用いて、Kronig-Penneyモデルの波動関数 Psi(x) を計算します。

  • 詳細説明: ブロッホの定理に基づき Psi(x) = exp(ikx) * u(x) の形式で波動関数を構築します。u(x) は周期関数で、ポテンシャル障壁内外で異なる形を取ります。

  • 引数:

    • ci (list of complex): 波動関数の係数リスト。

    • x (float): 波動関数を評価する位置 (A)。

    • kw (float): ブロッホ波数 (単位: pi/a)。

    • Ei (float): 電子のエネルギー (eV)。

    • w (float): ポテンシャル井戸の幅 (A)。

    • b (float): ポテンシャル障壁の幅 (A)。

    • V0 (float): ポテンシャル障壁の高さ (eV)。

  • 戻り値:

    • complex: 位置 x における複素波動関数の値。

7.16. wf()

  • 概要: Kronig-Penneyモデルにおける波動関数を計算し、プロットします。

  • 詳細説明: グローバル変数 kwiLevel に対応するエネルギー準位を計算し、その波動関数を xwmin から xwmax の範囲で描画します。ポテンシャルプロファイルも重ねて表示します。描画後、ユーザーの入力(ENTER キー)を待ち、プログラムを終了します。グローバル変数 mode, a, bwidth, bpot, nEsearch, nMaxLevel, kw, iLevel, xwmin, xwmax, nxw を使用します。

7.17. band()

  • 概要: Kronig-Penneyモデルのエネルギーバンド構造を計算し、プロットします。

  • 詳細説明: 指定された波数範囲 (kmin から kmax) で複数の k 点に対して許容エネルギー準位を計算し、E-k図(バンド構造)をプロットします。描画後、ユーザーの入力(ENTER キー)を待ち、プログラムを終了します。グローバル変数 mode, a, bwidth, bpot, kmin, kmax, nk, nEsearch, nMaxLevel を使用します。

7.18. graphview()

  • 概要: Kronig-Penneyモデルの許容エネルギー方程式の delta(E) 関数をプロットします。

  • 詳細説明: 特定の波数 kg に対して、エネルギー E の関数としての cal_delta(E) の値を計算し、グラフ表示します。delta(E)=0 となる点が許容エネルギー準位を示します。描画後、ユーザーの入力(ENTER キー)を待ち、プログラムを終了します。グローバル変数 mode, a, bwidth, bpot, Emin, Emax, nE を使用します。

7.19. main()

  • 概要: プログラムのエントリポイント。

  • 詳細説明: コマンドライン引数で指定された mode に応じて、graphview()band()、または wf() 関数を呼び出します。無効なモードが指定された場合はエラーメッセージを表示して終了します。グローバル変数 mode を使用します。

8. 実行例

以下に、各モードでのプログラムの実行例を示します。

8.1. デフォルト設定 (graph モード)

python kronig_penney.py

8.2. graph モードの指定例

python kronig_penney.py graph 5.4064 0.5 10.0 0.0 0.0 9.5 51

8.3. band モードの指定例

python kronig_penney.py band 5.4064 0.5 10.0 -0.5 0.5 21

8.4. wf モードの指定例

python kronig_penney.py wf 5.4064 0.5 10.0 0.0 0 0.0 16.2192 101