draw_2D_BZs.py 技術ドキュメント

プログラムの動作

draw_2D_BZs.py は、2次元正方格子の逆格子空間におけるブリルアンゾーン(BZ)を計算し、視覚的に描画するPythonスクリプトです。このプログラムは、指定された最大ブリルアンゾーン数までを異なる色で表示し、各ゾーンを区切るブラッグ面も破線で重ねて表示します。さらに、プロットの右側には、各色に対応するBZ番号を示すカスタムカラーバー(凡例)が描画されます。これにより、結晶学や物性物理学における重要な概念であるブリルアンゾーンの構造を直感的に理解することができます。

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

  • 最大ゾーン数を指定して、その数までのブリルアンゾーンを描画します。

  • プロットの表示範囲を調整できます。

  • 各ブリルアンゾーンは異なる色で塗り分けられ、識別しやすくなっています。

  • ブリルアンゾーンを区切るブラッグ面(逆格子空間での垂直二等分面)が破線で表示されます。

  • 逆格子点(格子点)が黒い点でプロットされます。

  • メインプロットの右側に、各BZ番号に対応する色を示すカスタム凡例が自動生成されます。

原理

このプログラムは、2次元正方格子におけるブリルアンゾーンの定義に基づいて領域を計算します。ブリルアンゾーンは、逆格子空間において、原点からの距離が最も近い逆格子点(または原点と特定の逆格子点を結ぶ線分の垂直二等分面によって区切られた領域)として定義されます。

具体的には、逆格子空間上の任意の点 \(\mathbf{k} = (k_x, k_y)\) がどのブリルアンゾーンに属するかを以下のように判定します。

  1. 原点からの距離の二乗: \(\mathbf{k}\) から原点 \(\mathbf{0}=(0,0)\) までの距離の二乗 \(d_0^2\) を計算します。 $\(d_0^2 = k_x^2 + k_y^2\)$

  2. 逆格子点からの距離の二乗: すべての逆格子点 \(\mathbf{G}_{ij} = (i,j)\) について、 \(\mathbf{k}\) から \(\mathbf{G}_{ij}\) までの距離の二乗 \(d_{ij}^2\) を計算します。 $\(d_{ij}^2 = (k_x - i)^2 + (k_y - j)^2\)\( ここで \)i, j$ は整数です。

  3. ブリルアンゾーンの判定: 点 \(\mathbf{k}\) が属するブリルアンゾーンの番号は、以下の条件を満たす逆格子点 \(\mathbf{G}_{ij}\) の数に1を加えたものです。 $\(d_{ij}^2 < d_0^2\)\( この条件は、点 \)\mathbf{k}\( が、原点よりも逆格子点 \)\mathbf{G}_{ij}$ に近いことを意味します。原点に最も近い領域が第1ブリルアンゾーン、次に近い領域が第2ブリルアンゾーン、というように定義されます。

  4. ブラッグ面(垂直二等分面): ブリルアンゾーンの境界は、原点と各逆格子点 \(\mathbf{G}_{ij}\) を結ぶ線分の垂直二等分線によって形成されます。この垂直二等分線は、以下の式で表されます。 $\(k_x i + k_y j = \frac{1}{2}(i^2 + j^2)\)$ プログラムでは、この式を用いてブラッグ面を破線で描画しています。

これらの計算をグリッド上の各点に対して行い、それぞれの点にゾーン番号を割り当てることで、ブリルアンゾーンの形状を決定し描画します。

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

本プログラムの実行には、以下のPython非標準ライブラリが必要です。

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

  • matplotlib: グラフ描画(プロット、イメージ表示、カラーバーなど)

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

pip install numpy matplotlib

必要な入力ファイル

draw_2D_BZs.py は、外部の入力ファイルを必要としません。すべての設定はコマンドライン引数として渡されます。

生成される出力ファイル

本プログラムは、計算結果をファイルとして保存しません。実行すると、ブリルアンゾーンが描画されたグラフが新しいウィンドウに表示されます。ユーザーは、このウィンドウから手動で画像を保存することができます(matplotlibの機能)。

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

プログラムはコマンドライン引数を受け付けます。

python draw_2D_BZs.py [-h] [max_zone] [limit]

引数の説明:

  • max_zone: 描画する最大のブリルアンゾーン番号。整数で指定します。デフォルト値は 10 です。

  • limit: プロットの表示範囲(\(k_x, k_y\) の絶対値の上限)。浮動小数点数で指定します。単位は \(2\pi/a\) です。指定しない場合、ゾーン数に応じて自動的に決定されます。

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

1. デフォルト設定で実行

最大ゾーン数を 10 とし、プロット範囲を自動決定します。

python draw_2D_BZs.py

実行結果: 第1ブリルアンゾーンから第10ブリルアンゾーンまでが描画され、プロット範囲は自動的に決定されます。

2. 最大ゾーン数を指定して実行

第3ブリルアンゾーンまでを描画します。

python draw_2D_BZs.py 3

実行結果: 第1ブリルアンゾーンから第3ブリルアンゾーンまでが描画されます。プロット範囲はゾーン数に合わせて自動調整されます。

3. 最大ゾーン数とプロット範囲を指定して実行

第5ブリルアンゾーンまでを描画し、プロット範囲を \(k_x, k_y \in [-3.0, 3.0]\) に設定します。

python draw_2D_BZs.py 5 3.0

実行結果: 第1ブリルアンゾーンから第5ブリルアンゾーンまでが描画され、グラフの表示範囲は \(k_x\) および \(k_y\) の両軸で \(-3.0\) から \(3.0\) の間になります。これにより、特定の領域を拡大して見ることができます。