EffectiveMass.py Technical Documentation

プログラムの動作

EffectiveMass.py は、バンド構造データ(運動量 \(k\) とエネルギー \(E\) の関係)を CSV ファイルから読み込み、そのデータを用いて有効質量 \(m^*\) を計算し、グラフとして表示するプログラムです。

主な機能は以下の通りです。

  • CSV形式の入力ファイルから \(k\) ベクトルと \(E\) エネルギーのデータを読み込みます。

  • \(E-k\) 分散関係の数値的な二階微分を計算し、\(d^2E/dk^2\) を求めます。

  • この二階微分を用いて、特定の規約に基づいた有効質量を計算します。

  • 異なる差分計算ステップサイズ(nskip)で有効質量を計算し、その結果をプロットします。

  • 計算された有効質量が非常に大きい(または \(d^2E/dk^2\) がゼロに近い)場合、または有効質量の符号が変化する点で、プロットの線を分割します。

  • 結果は Matplotlib を使用してグラフとしてリアルタイムに表示されます。

このプログラムは、バンド構造からキャリアの動的な応答を特徴づける有効質量を推定するという課題を解決します。特に、バンドの曲率が小さい(フラットなバンド)領域や、バンドの極大・極小点での有効質量変化を視覚的に捉えるのに役立ちます。

原理

有効質量 \(m^*\) は、結晶中の電子が外部電場や磁場に対してどのように振る舞うかを示す重要なパラメータであり、バンド構造の曲率から定義されます。標準的な有効質量 \(m^*\) は以下の式で与えられます。

\[m^* = \frac{\hbar^2}{\frac{d^2E}{dk^2}}\]

ここで、\(E\) はエネルギー、\(k\) は波数(運動量)、\(\hbar\) は換算プランク定数です。

本プログラムでは、この二階微分 \(d^2E/dk^2\) を数値的に計算するために、中心差分近似を使用しています。離散データ点 \(E_i\) における二階微分は、ステップサイズ \(n\) を用いて次のように近似されます。

\[\frac{d^2E}{dk^2} \approx \frac{E_{i+n} + E_{i-n} - 2E_i}{(n \cdot \Delta k)^2}\]

ここで、\(E_{i+n}\)\(E_{i-n}\) は、\(k_i\) から \(n \cdot \Delta k\) だけ離れた点でのエネルギー値、\(\Delta k\) は隣接する \(k\) 点間の間隔です。

プログラムでは、エネルギー \(E\) が電子ボルト(eV)単位で与えられていると仮定し、これをジュール(J)に変換するために電気素量 \(e\) を乗じています。

\[d^2E/dk^2 \text{ (J m}^2\text{)} = (E_{i+n} + E_{i-n} - 2E_i) \cdot e / (n \cdot \Delta k)^2\]

次に、プログラムでは km という定数を定義しています。

\[km = \hbar^2 \left(\frac{2\pi}{a}\right)^2\]

ここで \(a\) は格子定数です。そして、計算される有効質量 \(m\) は次のように定義されます。

\[m = \frac{km}{d^2E/dk^2} = \frac{\hbar^2 (2\pi/a)^2}{d^2E/dk^2}\]

この \(m\) は、標準的な有効質量 \(m^* = \hbar^2 / (d^2E/dk^2)\) に対して、\(\left(\frac{2\pi}{a}\right)^2\) という係数を乗じた値になっています。したがって、プロットされる量 \(m/m_e\) は、標準的な有効質量を電子質量で正規化した値に、さらに格子定数と関連するスケーリングファクター \(\left(\frac{2\pi}{a}\right)^2\) を乗じたものとなります。

さらに、プログラムは minv = d2Edk2c / km を計算し、abs(minv) <= 1.0e20 という条件で、計算された有効質量が非常に大きい(バンドが平坦に近い)場合や、符号が変化する点を検出し、プロット上で線を中断する処理を行います (cutline オプションが有効な場合)。これにより、物理的に意味のある範囲での有効質量変化をより明確に表示します。

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

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

  • NumPy: 数値計算(配列操作、数学関数など)

  • Matplotlib: グラフ描画

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

pip install numpy matplotlib

必要な入力ファイル

プログラムは band.csv という名前の CSV ファイルから入力データを読み込みます。このファイルは、波動ベクトル \(k\) と対応するエネルギー \(E\) の2つの列を持つ必要があります。

ファイル形式:

  • 1行目はヘッダー行で、各列のラベル(例: "k_vec", "Energy_eV")を含みます。

  • 2行目以降はデータ行で、数値データ(浮動小数点数)が格納されます。

  • \(k\) は最初の列、\(E\) は2番目の列に配置されます。

データ構造の例 (band.csv):

k_vec,Energy_eV
-0.5,0.1
-0.4,0.08
-0.3,0.05
-0.2,0.02
-0.1,0.005
0.0,0.0
0.1,0.005
0.2,0.02
0.3,0.05
0.4,0.08
0.5,0.1

プログラムのソースコード内で infile = 'band.csv' とハードコードされているため、ファイル名は band.csv である必要があります。別のファイル名を使用する場合は、ソースコードを編集する必要があります。

生成される出力ファイル

このプログラムは、ファイルとして出力データは生成しません。

代わりに、計算された有効質量と波動ベクトル \(k\) の関係を Matplotlib を用いてリアルタイムでグラフとして表示します。グラフは画面上にウィンドウとして表示され、ユーザーが Enter キーを押すまで表示され続けます。

グラフの要素:

  • X軸: 入力ファイルから読み込んだ \(k\) ベクトル。ラベルは入力ファイルの1列目のヘッダー。

  • Y軸: 計算された有効質量を電子質量 \(m_e\) で割った値 (\(m/m_e^0\))。

  • プロット線: nskip=1nskip=4 の2つの異なる差分ステップサイズで計算された有効質量が別々の線でプロットされます。

  • cutline フラグが 1 に設定されている場合、有効質量が非常に大きい点や符号が変化する点では、プロット線が途切れて表示されます。

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

このプログラムはコマンドライン引数を直接処理しません。実行には、Python インタープリタを通じてスクリプトを指定するだけです。

python EffectiveMass.py

入力ファイルは現在のディレクトリに band.csv という名前で存在している必要があります。

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

  1. 以下の内容で band.csv というファイルを作成します。

    k_vec (1/A),Energy_eV
    -0.5,-0.05
    -0.4,-0.032
    -0.3,-0.018
    -0.2,-0.008
    -0.1,-0.002
    0.0,0.0
    0.1,-0.002
    0.2,-0.008
    0.3,-0.018
    0.4,-0.032
    0.5,-0.05
    

    (このデータは、ガンマ点 \(k=0\) で極大を持つバンドを示唆しています。そのため \(d^2E/dk^2\) は負になり、有効質量は負になる可能性があります。)

  2. プログラムを以下のコマンドで実行します。

    python EffectiveMass.py
    
  3. 実行結果の説明: プログラムはまず、band.csv から読み込まれた kE の値を出力します。

    k= [-0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5]
    E= [-0.05, -0.032, -0.018, -0.008, -0.002, 0.0, -0.002, -0.008, -0.018, -0.032, -0.05]
    
    Differentiate for nskip =  1
    i    E[i-1]  E[i]    E[i+1]  1.0/m*
    1 -0.05 -0.032 -0.018 -3.195027584102941e+28
    2 -0.032 -0.018 -0.008 -3.195027584102941e+28
    3 -0.018 -0.008 -0.002 -3.195027584102941e+28
    4 -0.008 -0.002 0.0 -3.195027584102941e+28
    5 -0.002 0.0 -0.002 -3.195027584102941e+28
    6 0.0 -0.002 -0.008 -3.195027584102941e+28
    7 -0.002 -0.008 -0.018 -3.195027584102941e+28
    8 -0.008 -0.018 -0.032 -3.195027584102941e+28
    9 -0.018 -0.032 -0.05 -3.195027584102941e+28
    
    Differentiate for nskip =  4
    i    E[i-1]  E[i]    E[i+1]  1.0/m*
    4 -0.008 -0.002 -0.002 -1.9968922400643384e+29
    5 -0.002 0.0 -0.008 -1.9968922400643384e+29
    6 0.0 -0.002 -0.018 -1.9968922400643384e+29
    

    続けて、Matplotlib のウィンドウが開き、計算された有効質量(電子質量で正規化された値 \(m/m_e^0\))が \(k\) ベクトルに対してプロットされます。nskip=1nskip=4 の2つの異なる計算結果がそれぞれ異なる色とマーカーで表示されます。この例の場合、入力データが二次関数的な性質を持っているため、有効質量はほぼ一定の負の値を示すことが期待されます。ウィンドウには "Press ENTER to exit>>" と表示され、Enter キーが押されるまでグラフが表示され続けます。Enter を押すとプログラムが終了します。