(section_1_title)="1. ドキュメントタイトル"
pw1d.py プログラムドキュメント
(section_2_overview)="2. 概要"
このドキュメントは、Pythonスクリプト pw1d.py の機能と使用法を解説します。
pw1d.py は、1次元の平面波基底を用いてバンド計算を行うスクリプトです。自由電子モデルに周期ポテンシャルを導入し、固体中の電子のエネルギーバンド構造や波動関数を計算・可視化します。FFTを利用してポテンシャルのフーリエ変換を計算し、平面波基底を用いて固有方程式を解きます。
関連リンク: コードのDocstringに :doc:`pw1d_usage``` と記述されていますが、このドキュメントセットには pw1d_usage`` というドキュメントが含まれていないため、参照エラーを避けるためにリンクは解除します。
(section_3_dependencies)="3. 依存ライブラリ"
pw1d.py は以下のPythonライブラリに依存しています。
標準ライブラリ:
sys: システム固有のパラメータと機能にアクセスするためのモジュール。csv: CSV (Comma Separated Values) ファイルの読み書きをサポートするモジュール。
非標準ライブラリ:
numpy(np): 数値計算のための基盤となるパッケージ。配列オブジェクトや線形代数ルーチンなどを提供します。sqrt,exp,sin,cos,tan,pi:numpyから個別にインポートされる数学関数および定数。numpy.linalg(LA): 線形代数ルーチンを含むモジュール。
matplotlib.pyplot(plt): グラフ描画のためのライブラリ。
これらのライブラリは、スクリプトを実行する前にインストールされている必要があります。
(section_4_configurations)="4. 設定とグローバル変数"
pw1d.py は、スクリプトの冒頭で定義されるいくつかのグローバル変数によって動作を制御します。これらの一部はコマンドライン引数によって上書き可能です。
(subsection_4_1_physical_constants)="4.1. 物理定数" プログラム内で使用される物理定数です。
pi: 円周率 (3.14159265358979323846)pi2:2.0 * pih: プランク定数 (6.6260755e-34 Js)hbar: 換算プランク定数 (1.05459e-34 Js)c: 光速 (2.99792458e8 m/s)e: 素電荷 (1.60218e-19 C)e0: 真空の誘電率 (8.854418782e-12 C^2 N^-1 m^-2)kB: ボルツマン定数 (1.380658e-23 JK^-1)me: 電子質量 (9.1093897e-31 kg)R: モル気体定数 (8.314462618 J/K/mol)a0: ボーア半径 (5.29177e-11 m)KE: 運動エネルギーの係数 (hbar * hbar / 2.0 / me / e * 1.0e20)。単位はeVとÅngströmに合わせて調整されています。
(subsection_4_2_global_configuration)="4.2. グローバル設定" プログラムの実行モードを制御します。
mode: 実行モード ('ft'|'band'|'wf')。デフォルトは'ft'。
(subsection_4_3_crystal_definition)="4.3. 結晶定義" 結晶の特性を定義します。
a: 格子定数 (5.4064 Å)。デフォルト値はシリコンの格子定数です。na: FFTのための分割数 (64)。2のべき乗である必要があります。
(subsection_4_4_potential)="4.4. ポテンシャル" ポテンシャルの種類とパラメータを定義します。
pottype: ポテンシャルの種類 ('rect'|'gauss')。デフォルトは'rect'。bwidth: 障壁幅 (0.5 Å)。bpot: 障壁高さ (10.0 eV)。
(subsection_4_5_band)="4.5. バンド計算設定" バンド計算のパラメータを定義します。
nG: G点数(基底関数の数) (3)。kmin: k点の最小値 (-0.5)。単位はpi/aの係数。kmax: k点の最大値 (0.5)。単位はpi/aの係数。nk: k点の分割数 (21)。Erange: プロットするエネルギー範囲 ([0.0, 10.0] eV)。
(subsection_4_6_wave_function)="4.6. 波動関数計算設定" 波動関数計算のパラメータを定義します。
xwmin: 波動関数プロットのx座標最小値 (0.0 Å)。xwmax: 波動関数プロットのx座標最大値 (3.0 * a Å)。nxw: 波動関数プロットのx点数 (101)。kw: 波動関数を計算するk値 (0.0)。単位はpi/aの係数。iLevel: プロットするエネルギー準位のインデックス (0)。
(subsection_4_7_figure_configuration)="4.7. 図の設定" Matplotlibによる図の表示設定です。
figsize: 図のサイズ ((6, 8))。fontsize: フォントサイズ (12)。legend_fontsize: 凡例のフォントサイズ (12)。
(section_5_command_line_arguments)="5. コマンドライン引数" プログラムはコマンドライン引数を受け取ることができ、これにより上記グローバル変数のデフォルト値を上書きします。引数はモードによって必要な数が異なります。
基本的な呼び出し形式は以下の通りです。
python pw1d.py (mode a na pottype bwidth bpot ...)
引数の順序と意味は以下の通りです。括弧内の引数はオプションであり、指定しない場合はデフォルト値が使用されます。
全モード共通:
mode(str): 実行モード ('ft','band','wf')。デフォルトは'ft'。a(float): 格子定数 (Å)。デフォルトは5.4064。na(int): FFTのための分割数。デフォルトは64。pottype(str): ポテンシャルの種類 ('rect','gauss')。デフォルトは'rect'。bwidth(float): 障壁幅 (Å)。デフォルトは0.5。bpot(float): 障壁高さ (eV)。デフォルトは10.0。
bandモードの場合 (上記共通引数に続けて): 7.nG(int): G点数(基底関数の数)。デフォルトは3。 8.kmin(float): k点の最小値 (pi/a単位)。デフォルトは-0.5。 9.kmax(float): k点の最大値 (pi/a単位)。デフォルトは0.5。 10.nk(int): k点の分割数。デフォルトは21。wfモードの場合 (上記共通引数に続けて): 7.nG(int): G点数(基底関数の数)。デフォルトは3。 8.kw(float): 波動関数を計算するk値 (pi/a単位)。デフォルトは0.0。 9.iLevel(int): プロットするエネルギー準位のインデックス。デフォルトは0。 10.xwmin(float): 波動関数プロットのx座標最小値 (Å)。デフォルトは0.0。 11.xwmax(float): 波動関数プロットのx座標最大値 (Å)。デフォルトは3.0 * a。 12.nxw(int): 波動関数プロットのx点数。デフォルトは101。
引数が不足している場合、または不正な場合は、デフォルト値が適用されるか、usage() メッセージと共にプログラムが終了します。
使用例:
python pw1d.py
python pw1d.py ft 5.4064 64 rect 0.5 10.0
python pw1d.py band 5.4064 64 rect 0.5 10.0 3 -0.5 0.5 21
python pw1d.py wf 5.4064 64 rect 0.5 10.0 3 0.0 0 0.0 16.2192 101
(section_6_function_descriptions)="6. 関数説明"
(subsection_6_1_pfloat)="6.1. pfloat(str)"
概要: 文字列を浮動小数点数に安全に変換します。
詳細: 変換できない場合は
Noneを返し、プログラムは終了しません。パラメータ:
str(str): 変換する文字列。
戻り値:
floatまたはNone: 変換された浮動小数点数、または変換できなかった場合はNone。
(subsection_6_2_pint)="6.2. pint(str)"
概要: 文字列を整数に安全に変換します。
詳細: 変換できない場合は
Noneを返し、プログラムは終了しません。パラメータ:
str(str): 変換する文字列。
戻り値:
intまたはNone: 変換された整数、または変換できなかった場合はNone。
(subsection_6_3_getarg)="6.3. getarg(position, defval=None)"
概要: コマンドライン引数を安全に取得します。
詳細: 指定されたインデックスの引数が存在しない場合は、デフォルト値を返します。
パラメータ:
position(int): 取得する引数の位置 (sys.argvのインデックス)。defval(any, optional): 引数が存在しない場合に返すデフォルト値。デフォルトはNone。
戻り値:
strまたはany: 取得した引数の文字列、またはデフォルト値。
(subsection_6_4_getfloatarg)="6.4. getfloatarg(position, defval=None)"
概要: コマンドライン引数を浮動小数点数として安全に取得します。
詳細:
getargとpfloatを組み合わせて、引数を浮動小数点数に変換して返します。パラメータ:
position(int): 取得する引数の位置。defval(any, optional): 引数が存在しない場合、または変換できなかった場合に返すデフォルト値。デフォルトはNone。
戻り値:
floatまたはany: 変換された浮動小数点数、またはデフォルト値。
(subsection_6_5_getintarg)="6.5. getintarg(position, defval=None)"
概要: コマンドライン引数を整数として安全に取得します。
詳細:
getargとpintを組み合わせて、引数を整数に変換して返します。パラメータ:
position(int): 取得する引数の位置。defval(any, optional): 引数が存在しない場合、または変換できなかった場合に返すデフォルト値。デフォルトはNone。
戻り値:
intまたはany: 変換された整数、またはデフォルト値。
(subsection_6_6_usage)="6.6. usage()"
概要: スクリプトの正しい使用方法を標準出力に表示します。
詳細: コマンドライン引数の形式と、利用可能なモード (
ft,band,wf) およびそれに対応するパラメータの例を示します。パラメータ: なし。
戻り値: なし。
(subsection_6_7_terminate)="6.7. terminate(message=None)"
概要: メッセージを表示し、使用方法を表示してプログラムを終了します。
詳細: エラーが発生した場合などに呼び出され、ユーザーに情報を提供し、スクリプトの実行を停止します。
パラメータ:
message(str, optional): 終了前に表示するエラーメッセージ。デフォルトはNone。
戻り値: なし (プログラムが終了するため)。
(subsection_6_8_reduce)="6.8. reduce(x, x0)"
概要:
xをx0の周期で還元します。詳細:
xを[0, x0)の範囲にマッピングします。負の値の場合も正しく処理されます。パラメータ:
x(float): 還元する値。x0(float): 周期。
戻り値:
float: 還元された値。
(subsection_6_9_pot)="6.9. pot(x)"
概要: 指定された位置でのポテンシャルエネルギーを計算します。
詳細: グローバル変数
pottypeによって矩形障壁 (rect) またはガウス型ポテンシャル (gauss) のいずれかを計算します。周期境界条件を考慮してreduce関数を使用します。パラメータ:
x(float): ポテンシャルを評価する空間座標。
戻り値:
float:xにおけるポテンシャルエネルギー (eV)。
(subsection_6_10_build_potential)="6.10. build_potential(xmin, xstep, n)"
概要: 空間グリッド上のポテンシャル分布を構築します。
詳細:
pot関数を使用して、指定された範囲とステップでポテンシャル値を計算し、x座標とポテンシャル値の配列を返します。パラメータ:
xmin(float): ポテンシャル計算を開始するx座標。xstep(float): x座標のステップサイズ。n(int): 計算する点の数。
戻り値:
tuple[numpy.ndarray, numpy.ndarray]:x座標の配列。
対応するポテンシャル値の配列。
(subsection_6_11_find_iG)="6.11. find_iG(dij, Glist)"
概要: 指定された逆格子座標
dijに対応するGlistのインデックスを検索します。詳細:
Glist内の要素とdijを比較し、一致する要素のインデックスを返します。パラメータ:
dij(int): 検索する逆格子座標。Glist(list[int]ornumpy.ndarray[int]): 逆格子座標のリスト。
戻り値:
intまたはNone:dijが見つかった場合のインデックス、見つからなかった場合はNone。
(subsection_6_12_find_Vft)="6.12. find_Vft(dij, Glist, Vft)"
概要: 指定された逆格子座標
dijに対応するフーリエ変換されたポテンシャル値Vftを検索します。詳細:
Glistを使用してdijのインデックスを見つけ、そのインデックスに対応するVftの値を返します。見つからなかった場合は0.0を返します。パラメータ:
dij(int): 検索する逆格子座標。Glist(list[int]ornumpy.ndarray[int]): 逆格子座標のリスト。Vft(list[complex]ornumpy.ndarray[complex]): フーリエ変換されたポテンシャル値のリスト。
戻り値:
complexまたはfloat:dijに対応するVftの値、または0.0。
(subsection_6_13_cal_fft)="6.13. cal_fft(na, a, ypot)"
概要: 実空間ポテンシャルのフーリエ変換を計算し、物理的な逆格子空間の表現に変換します。
詳細:
numpyのFFT関数を使用し、結果をG<0の成分が負のG値に対応するようにシフトします。パラメータ:
na(int): FFTに用いるサンプリング点の数。a(float): 格子定数(単位長さ)。ypot(numpy.ndarray[float]): 実空間のポテンシャル値の配列。
戻り値:
tuple:xft0(list[int]): FFTの生の結果のx軸インデックス (0からna-1)。yft0(numpy.ndarray[complex]): FFTの生の結果のフーリエ変換されたポテンシャル。xft(numpy.ndarray[float]): 物理的に並べ替えられた逆格子座標 (G値)。yft(numpy.ndarray[complex]): 物理的に並べ替えられたフーリエ変換されたポテンシャル。iGlist(list[int]): G値に対応する逆格子点の整数インデックス。nahalf(int): FFT点の数の半分。xftstep(float): 逆格子空間のステップサイズ。
(subsection_6_14_extract_basis)="6.14. extract_basis(yft0, nG)"
概要: フーリエ変換されたポテンシャルから、指定された数のG点基底(平面波基底)を抽出します。
詳細:
nGに基づき、中心 (G=0) から対称的にG点を抽出します。nG=2の場合はG=0とG=1を、それ以外の場合はG=0を中心に正負のG点を抽出します。抽出されたGlistの要素の順序は、昇順にはソートされず、[0, 1, ..., nGmax, -1, ..., -nGmax]のような順序になります。パラメータ:
yft0(numpy.ndarray[complex]): FFTの生の結果のフーリエ変換されたポテンシャル。nG(int): 抽出するG点の総数。
戻り値:
tuple:Glist(numpy.ndarray[int]): 抽出されたG点の整数インデックスのリスト。Vftlist(numpy.ndarray[complex]): 抽出されたG点に対応するフーリエ変換されたポテンシャル値のリスト。nGmax(int): 抽出されたG点の最大絶対値 (int(nG / 2))。
(subsection_6_15_free_KE)="6.15. free_KE(k, iG)"
概要: 自由電子の運動エネルギーを計算します。
詳細: ブロッホ波の波数
kと逆格子ベクトルiGを用いて、運動エネルギーを求めます。パラメータ:
k(float): ブロッホ波の波数。単位はpi/aの係数。iG(int): 逆格子点の整数インデックス。
戻り値:
float: 計算された運動エネルギー (eV)。
(subsection_6_16_solve_pw)="6.16. solve_pw(Glist, Vftlist, nGmax, nG, k, IsPrint=0)"
概要: 平面波基底を用いて固有方程式を解き、エネルギー固有値と平面波係数を計算します。
詳細: フォック行列(ハミルトニアン行列)を構築し、
Numpyの線形代数ソルバーを用いて固有値問題(Schrödinger方程式)を解きます。ハミルトニアンはエルミート行列となるように構築されます。パラメータ:
Glist(numpy.ndarray[int]): 考慮する逆格子点 (G値) のリスト。Vftlist(numpy.ndarray[complex]): 各G点に対応するフーリエ変換されたポテンシャル。nGmax(int):Glistにおける最大の正のG値。nG(int): 基底関数の総数。k(float): 計算を行うブロッホ波の波数。IsPrint(int, optional): デバッグ情報の出力レベル。0はなし、1は主要な値、2は詳細な値を出力。デフォルトは0。
戻り値:
tuple[numpy.ndarray[float], numpy.ndarray[complex]]:ei(numpy.ndarray[float]): 計算されたエネルギー固有値の配列。ci(numpy.ndarray[complex]): 各エネルギー固有値に対応する平面波係数(固有ベクトル)。
(subsection_6_17_cal_wf)="6.17. cal_wf(xwmin, xwmax, nxw, kw, ci, Glist)"
概要: 平面波係数から実空間の波動関数を計算します。
詳細: 指定された空間範囲とグリッドで、平面波の重ね合わせとして波動関数とその確率密度を計算します。
パラメータ:
xwmin(float): 波動関数を計算するx座標の最小値。xwmax(float): 波動関数を計算するx座標の最大値。nxw(int): 計算するx点の数。kw(float): ブロッホ波の波数。ci(list[complex]ornumpy.ndarray[complex]): 各G点に対応する平面波の係数。Glist(list[int]ornumpy.ndarray[int]): 考慮する逆格子点 (G値) のリスト。
戻り値:
tuple[numpy.ndarray[complex], numpy.ndarray[complex], complex]:xwf(numpy.ndarray[complex]): 波動関数を評価したx座標の配列。ywf(numpy.ndarray[complex]): 計算された波動関数の複素数値の配列。charge_scalar(complex): 波動関数の確率密度|Ψ|^2の値。注意: この関数はchargeとして単一のスカラー値(ループの最後のxにおける確率密度)を返します。呼び出し元であるwf()関数では、この戻り値は使用されず、ywfから確率密度が配列として再計算されます。
(subsection_6_18_wf)="6.18. wf()"
概要: 波動関数を計算し、ポテンシャルと合わせてプロットします。
詳細: 設定されたパラメータに基づき、ポテンシャル、フーリエ変換されたポテンシャル、固有値、選択されたエネルギー準位の波動関数を計算し、
Matplotlibで可視化します。計算結果は標準出力にも表示されます。パラメータ: なし。
戻り値: なし。
(subsection_6_19_band)="6.19. band()"
概要: エネルギーバンド構造を計算し、自由電子バンドと共にプロットします。
詳細: 異なる波数
kに対して固有方程式を解き、エネルギー固有値を計算します。計算されたバンド構造は、自由電子のエネルギーバンドと比較してMatplotlibでプロットされます。nGが4以上の場合、自動的に奇数に変換されます (例:4->3,5->5,6->5)。nGの値が0以下または64より大きい場合はエラーで終了します。パラメータ: なし。
戻り値: なし。
(subsection_6_20_ft)="6.20. ft()"
概要: ポテンシャルのフーリエ変換を計算し、実空間ポテンシャルとフーリエ変換されたポテンシャルをプロットします。
詳細: 設定されたパラメータに基づいて実空間ポテンシャルを構築し、そのフーリエ変換を実行します。結果は
Matplotlibを用いて、実空間と逆格子空間の両方で可視化されます。パラメータ: なし。
戻り値: なし。
(subsection_6_21_main)="6.21. main()"
概要: スクリプトの主要な実行ロジック。
詳細: グローバル変数
modeに基づいて、ft(),band(),wf()のいずれかの関数を呼び出します。無効なモードが指定された場合はエラーメッセージと共に終了します。パラメータ: なし。
戻り値: なし。
(section_7_execution)="7. 実行方法"
pw1d.py はPythonインタプリタを使用して実行されます。コマンドライン引数により動作モードやパラメータを制御できます。
python pw1d.py [オプション引数...]
オプション引数の例:
デフォルトモード (
ft):python pw1d.pyフーリエ変換モード (
ft) で特定のパラメータを指定:python pw1d.py ft 5.0 128 rect 0.3 5.0
バンド計算モード (
band) で特定のパラメータを指定:python pw1d.py band 5.4064 64 rect 0.5 10.0 5 -0.3 0.3 31
波動関数モード (
wf) で特定のパラメータを指定:python pw1d.py wf 5.4064 64 rect 0.5 10.0 5 0.1 1 0.0 16.2192 201
プログラムの実行後、グラフが表示され、ユーザーが ENTER キーを押すまで一時停止します。
(section_8_input_output)="8. 入出力" (subsection_8_1_input)="8.1. 入力"
コマンドライン引数: プログラムの動作モード (
mode) や各種物理的・計算的パラメータは、コマンドライン引数として入力されます。ユーザー入力: グラフ表示後、プログラムはユーザーが
ENTERキーを押すのを待ちます。これはinput()関数によって処理されます。
pw1d.py はファイルからの入力を直接サポートしていません。すべての設定はスクリプト内のグローバル変数またはコマンドライン引数を通じて行われます。
(subsection_8_2_output)="8.2. 出力"
標準出力 (
stdout):プログラムの起動時、設定されたパラメータが表示されます。
FFTの結果、G基底の抽出、固有方程式の解(エネルギー固有値や平面波係数)などの計算の中間結果や詳細情報が表示されます。
エラーメッセージや使用方法 (
usage()) が表示されることがあります。
グラフ表示 (
matplotlib.pyplot):ftモード: 実空間ポテンシャルと、そのフーリエ変換されたポテンシャル(生の結果と物理的に並べ替えられた結果)がグラフとして表示されます。bandモード: 計算されたエネルギーバンド構造が、自由電子のエネルギーバンドと比較してプロットされます。wfモード: 選択されたエネルギー準位の波動関数(実部、虚部)と確率密度、および実空間ポテンシャルがプロットされます。すべてのグラフは
plt.pause(0.1)の後、ユーザーがENTERを押すまで表示が維持されます。
pw1d.py は計算結果をファイルに保存する機能は持っていません。
(section_9_notes)="9. 注意事項"
cal_wf()のcharge戻り値:cal_wf()関数のcharge戻り値は、Docstringでは「波動関数の確率密度」と記述されていますが、実際にはループの最後のx座標における単一のスカラー値 (f * f.conjugate()) が返されます。この関数の呼び出し元である
wf()関数では、この戻り値は利用されず、ywf配列からcharge = [(f0 * f0.conjugate()).real for f0 in ywf]として確率密度が配列として再計算されプロットされます。
band()モードにおけるnGの調整:band()関数内では、nG(基底関数の数) が4以上の場合、nG = int(nG / 2) * 2 + 1というロジックで奇数に調整されます。これにより、G=0 を中心とした対称的なG点のセットが維持されやすくなります (例:nG=4->3,nG=6->5)。nGが0以下または64より大きい場合はエラーで終了します。
グラフの凡例:
band()関数およびft()関数内のいくつかのplot()呼び出しでは、label引数が指定されていないため、ax1.legend()やax1.legend(fontsize = legend_fontsize)が呼び出されても凡例は表示されません。
ft()関数のcal_fft戻り値の変数名:ft()関数内でcal_fftの戻り値を受け取る際に、iGlistを意味する戻り値がiGという変数名で受け取られています。しかし、iGはその後のコードではリストとして適切に扱われています。
プロットのX軸範囲:
band()関数において、プロットのX軸範囲はax1.set_xlim([-0.5, 0.5])とハードコードされており、コマンドライン引数のkmin,kmaxの値に連動していません。