EffectiveMass.py プログラム解説

1. 概要

EffectiveMass.py は、バンド構造データ(波数 k とエネルギー E の関係)から実効質量と波数 k の関係を計算し、その結果をプロットする Python スクリプトです。主に固体物理学におけるバンド計算結果の解析を目的としています。

2. 目的

与えられたバンド構造データに対して、エネルギーの波数に関する2階微分を数値的に計算することで実効質量を求め、波数の関数として実効質量を可視化します。これにより、バンドの曲率から電子や正孔の有効的な質量を評価することができます。

3. 使用ライブラリ

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

標準ライブラリ

  • sys: システム固有のパラメータや関数にアクセスするためのライブラリ。

  • csv: CSV (Comma Separated Values) ファイルの読み書きをサポートするライブラリ。

非標準ライブラリ

  • numpy: 数値計算を効率的に行うためのライブラリ。配列操作や数学関数を提供します。

  • matplotlib: グラフ描画のためのライブラリ。特に matplotlib.pyplot を使用してプロットを作成します。

4. 定数

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

物理定数

  • pi: 円周率 (3.14159265358979323846)

  • pi2: 2.0 * pi

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

  • hbar: 換算プランク定数 (1.05459e-34 Js)

  • c: 光速 (2.99792458e8 m/s)

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

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

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

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

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

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

5. パラメータ

プログラムの動作を制御するパラメータは以下の通りです。

  • a: 格子定数。バンド構造の計算に使用されるものと推測されます (4.0e-10 m)。

  • infile: 入力として使用する CSV ファイル名 (デフォルト値: 'band.csv')。

  • cutline: プロットにおいて、実効質量が極端な値を取る場合に線が切断されるかどうかを制御するフラグ (デフォルト値: 1)。

  • fontsize: プロットのフォントサイズ (デフォルト値: 12)。

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

6. 入力

ファイル名

infile パラメータで指定されたCSVファイル。デフォルトでは band.csv です。

フォーマット

CSV (Comma Separated Values) 形式のファイル。 最初の行はヘッダーであり、1列目のラベルが波数を、2列目のラベルがエネルギーを表します。 2行目以降は数値データが続き、1列目が波数 k、2列目がエネルギー E の値です。

入力ファイルの例

k,E
-0.5,0.1
-0.4,0.05
-0.3,0.02
-0.2,0.005
-0.1,0.001
0.0,0.0
0.1,0.001
0.2,0.005
0.3,0.02
0.4,0.05
0.5,0.1

7. 出力

標準出力

  • 読み込んだ波数 k とエネルギー E のリストが表示されます。

  • 実効質量の計算過程において、各点でのインデックス iE[i-1], E[i], E[i+1] の値、および逆実効質量 1.0/m* の値が表形式で出力されます。

  • 不正な数値データが検出された場合、警告メッセージが表示されます。

  • プログラム終了時に、プロットウィンドウを閉じるための ENTER キー入力待ちメッセージが表示されます。

グラフ出力

  • matplotlib を使用して、波数 k と電子の静止質量で正規化された実効質量 m/me の関係を示すプロットウィンドウが表示されます。

  • nskip = 1nskip = 4 の2つの計算結果が異なる色でプロットされ、凡例で識別されます。

  • x軸のラベルは入力ファイルの1列目ヘッダー、y軸のラベルは m_e / m_e^0 となります。

  • x軸の範囲は [-0.5, 0.5] に固定されます。

  • cutline パラメータが 1 の場合、実効質量が極端な値を取る点や符号が反転する点でプロットの線が切断されます。

ファイル出力

savecsv() 関数は定義されていますが、プログラムの main() 関数からは呼び出されていないため、計算結果がCSVファイルとして保存されることはありません

8. 内部処理

  1. データの読み込み:

    • main() 関数が実行されると、まず read_csv(infile) 関数が呼び出され、指定されたCSVファイル (デフォルト: band.csv) から波数 k とエネルギー E のデータが読み込まれます。

    • 読み込んだデータのヘッダーは klabelElabel に格納されます。

  2. 実効質量計算の前処理:

    • 波数データの個数 nk と波数間隔 dk が計算されます。

    • 実効質量を計算するための定数 kmkm = hbar^2 * (2 * pi / a)^2 として計算されます。

  3. 実効質量の計算 (nskip = 1):

    • 中央差分近似を用いて、エネルギー E の波数 k に関する2階微分 d2Edk2c が以下の式で計算されます。

      \frac{d^2E}{dk^2} \approx \frac{E_{i+nskip} + E_{i-nskip} - 2 E_i}{(nskip \cdot dk)^2}
      

      ここで、e は素電荷であり、計算結果に掛けて単位変換を行っていると推測されます。

    • 逆実効質量 minvd2Edk2c / km として計算されます。

    • abs(minv) <= 1.0e20 の条件を満たす場合、実効質量が極端に大きい(あるいはゼロに近い)と判断され、プロットの線を切断するために Noneymc リストに挿入されます。

    • 実効質量の符号 signprev が反転する点でもプロットの線が切断されます。

    • 計算された実効質量 m を電子の静止質量 me で割った m / me の値が ymc リストに格納されます。

  4. 実効質量の計算 (nskip = 4):

    • nskip の値が 4 に設定され、上記とほぼ同様の計算が再度行われます。

    • 結果は xk2ymc2 リストに格納されます。

  5. プロット:

    • matplotlib.pyplot を使用して、xkymc および xk2ymc2 のデータが同じグラフ上にプロットされます。

    • x軸には klabel、y軸には m_e / m_e^0 がラベルとして設定されます。

    • x軸の範囲は [-0.5, 0.5] に設定されます。

    • プロットウィンドウが表示され、ユーザーが ENTER キーを押すまでプログラムは一時停止します。

9. 実行方法

このプログラムは Python インタープリタで直接実行できます。

  1. 入力ファイル band.csvEffectiveMass.py と同じディレクトリに配置します。 (infile パラメータを変更することで異なるパスを指定することも可能です。)

  2. ターミナルまたはコマンドプロンプトを開き、スクリプトがあるディレクトリに移動します。

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

    python EffectiveMass.py
    

実行後、計算結果が標準出力に表示され、最終的に実効質量と波数の関係を示すプロットウィンドウが表示されます。プロットウィンドウは、ターミナルで ENTER キーを押すまで閉じません。

10. 注意事項

  • 入力ファイル band.csv は、プログラムが期待するCSVフォーマットに従っている必要があります。ヘッダー行と2列の数値データが必須です。

  • savecsv() 関数はソースコードに存在しますが、main() 関数内で呼び出されていないため、現行のバージョンではデータはファイルに保存されません。

  • 実効質量の計算において、nskip の値によって計算される実効質量のプロットが異なる場合があります。これは差分近似のステップサイズの違いによるものです。

  • 実効質量が極端な値を取る(分母がゼロに近づくなど)場合、プロットの線が意図的に切断されます。これは cutline パラメータと abs(minv) <= 1.0e20 の条件によって制御されます。