draw_unit_cells.py 技術ドキュメント

プログラムの動作

本プログラム draw_unit_cells.py は、結晶学における単位格子およびその繰り返し構造であるスーパーセルを3次元で可視化するためのPythonスクリプトです。結晶の基本的な繰り返し単位の形状を理解し、その空間的な配置を視覚的に捉えることを目的としています。

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

  • 格子ベクトルの計算: 結晶の格子定数(3辺の長さ \(a, b, c\))と軸間角度(\(\alpha, \beta, \gamma\))から、デカルト座標系における基本格子ベクトル \(v_a, v_b, v_c\) を計算します。

  • スーパーセルの描画: 計算された基本格子ベクトルに基づいて、指定されたサイズ(\(nx, ny, nz\))のスーパーセルを構成する各単位格子を3D空間に描画します。

  • 単位格子の強調表示: スーパーセルの中央または原点に位置する単位格子を太い線で描画し、視覚的に強調します。

  • 格子点の描画: 各単位格子の頂点に相当する格子点を小さな黒い球で描画します。

  • 視点の調整と出力: 3Dプロットの初期視点を設定し、ユーザーがマウス操作で視点を変更するたびに、現在の視点(elevazim の角度)をコンソールに出力します。

  • 画像ファイルの保存: 描画されたスーパーセルの画像を unit_cells.png というファイル名で保存します。

  • アスペクト比の均一化: 3Dプロットの各軸のアスペクト比を揃えることで、描画される構造が歪むことなく正確に表示されるようにします。

本プログラムは、結晶構造の直感的な理解を助ける教育ツールや、構造解析の初期段階での視覚的確認に役立ちます。

原理

格子ベクトルの計算

単位格子の3辺の長さ \(a, b, c\) と、それらの間の角度 \(\alpha, \beta, \gamma\) (度数法)が与えられたとき、直交座標系における基本格子ベクトル \(v_a, v_b, v_c\) は以下の数式によって計算されます。

まず、与えられた角度をラジアンに変換します。 $\(\alpha_r = \alpha \cdot \frac{\pi}{180}\)\( \)\(\beta_r = \beta \cdot \frac{\pi}{180}\)\( \)\(\gamma_r = \gamma \cdot \frac{\pi}{180}\)$

次に、各格子ベクトルの成分を定義します。慣例として、\(v_a\) をx軸上に配置し、\(v_b\) をxy平面上に配置します。

  1. \(v_a\) ベクトル: $\(v_a = (a, 0, 0)\)$

  2. \(v_b\) ベクトル: \(v_b\)\(v_a\)\(\gamma_r\) の角度をなすため、xy平面上での成分は以下のようになります。 $\(v_b = (b \cos \gamma_r, b \sin \gamma_r, 0)\)$

  3. \(v_c\) ベクトル: \(v_c\) の成分は、他の2つのベクトルおよび角度 \(\alpha_r, \beta_r\) から決定されます。 \(v_c = (c_x, c_y, c_z)\) とすると、 $\(c_x = c \cos \beta_r\)\( \)c_y\( は以下のように計算されます。 \)\(c_y = c \frac{\cos \alpha_r - \cos \beta_r \cos \gamma_r}{\sin \gamma_r}\)\( \)c_z\( は三平方の定理を用いて計算されます。 \)\(c_z = \sqrt{c^2 - c_x^2 - c_y^2}\)\( この計算により、デカルト座標系における3つの基本格子ベクトル \)v_a, v_b, v_c$ が得られます。

スーパーセルの描画

スーパーセルは、基本格子ベクトル \(v_a, v_b, v_c\) を整数倍したオフセット \(i v_a + j v_b + k v_c\) を原点として、各単位格子を描画することで構築されます。ここで、\(i, j, k\) はそれぞれ \(0\) から \(nx-1, ny-1, nz-1\) までの整数をとります。各単位格子は、その原点と3つの基本格子ベクトルによって定義される平行六面体として描画されます。

3Dプロットのアスペクト比固定

set_equal_aspect 関数は、Matplotlibの3Dプロットにおいて、x, y, z軸の表示スケールを統一し、描画されるオブジェクトの形状が歪まないようにします。これは、描画範囲内の全ての点を含む最小の立方体を見つけ、その立方体の中心をプロットの中心に、辺の長さを軸の範囲に設定することで実現されます。

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

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

  • numpy: 数値計算を効率的に行うためのライブラリです。特にベクトルや行列の操作、数学関数の利用に用いられます。

  • matplotlib: グラフ描画ライブラリです。本プログラムでは特に matplotlib.pyplotmpl_toolkits.mplot3d を使用して3次元プロットを生成します。

これらのライブラリは、Pythonのパッケージマネージャーである pip を用いてインストールすることができます。コマンドライン(ターミナルやコマンドプロンプト)で以下のコマンドを実行してください。

pip install numpy matplotlib

必要な入力ファイル

本プログラム draw_unit_cells.py は、コマンドライン引数や外部ファイルからパラメータを読み込む機能を持っていません。 全ての結晶パラメータ(格子定数 \(a, b, c\) および角度 \(\alpha, \beta, \gamma\))は、プログラムのソースコード内に直接ハードコードされています。したがって、実行に必要な入力ファイルは存在しません。

パラメータを変更したい場合は、プログラムの以下の行を直接編集する必要があります。

draw_supercell(a=5.0, b=5.5, c=4.5, alpha=80, beta=70, gamma=100)

生成される出力ファイル

プログラムを実行すると、以下の出力ファイルが生成されます。

  • unit_cells.png:

    • 形式: PNG画像ファイル

    • 内容: 描画されたスーパーセルとその中の単位格子、および格子点を含む3次元プロットの画像です。

    • 特徴:

      • 解像度は300dpiです。

      • 余白が最小限に抑えられた「tight」なレイアウトで保存されます。

      • 背景が透過(transparent)で保存されるため、様々な背景色の上で利用できます。

この画像ファイルは、スーパーセルの視覚的な表現として利用できます。

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

本プログラム draw_unit_cells.py は、現在コマンドライン引数を受け取るように設計されていません。したがって、特別な引数を指定することなく、Pythonインタプリタを使用して直接スクリプトを実行します。

基本的な実行コマンドは以下の通りです。

python draw_unit_cells.py

プログラムを実行すると、内部で定義された結晶パラメータ(\(a=5.0, b=5.5, c=4.5, \alpha=80, \beta=70, \gamma=100\))に基づいてスーパーセルが描画されます。

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

以下のコマンドは、draw_unit_cells.py を実行する具体的な例です。

python draw_unit_cells.py

実行結果:

  1. プログラムが実行されると、まずMatplotlibによる3Dプロットが表示されるGUIウィンドウが立ち上がります。このウィンドウには、指定された格子定数と角度で構成された3x3x3のスーパーセルが描画されます。原点に位置する単位格子は太い線で強調され、全ての格子点は黒い点で表示されます。

  2. 同時に、カレントディレクトリに unit_cells.png という画像ファイルが生成されます。このファイルには、表示された3Dプロットの内容が300dpiの高解像度で保存されます。

  3. GUIウィンドウのプロットをマウスでドラッグして視点を変更するたびに、プログラムを実行したターミナルまたはコマンドプロンプトに、現在の視点角度(elevazim)が以下の形式で出力されます。

    elev: 5.90, azim: -67.55
    elev: 10.23, azim: -75.10
    elev: -2.50, azim: -50.00
    ...
    

    これにより、ユーザーは希望の視点を見つけ、その角度を記録することができます。