draw_bravais_lattice.py 技術ドキュメント

このドキュメントは、Pythonプログラム draw_bravais_lattice.py の機能、原理、使用方法について説明します。

プログラムの動作

draw_bravais_lattice.py は、様々な種類のブラベー格子(結晶構造の基本単位)を3次元空間に視覚的に描画するためのPythonスクリプトです。主な目的は、結晶学における単位格子、格子点、格子ベクトル、そして必要に応じて基本格子の視覚化を支援することです。

プログラムの主な機能は以下の通りです。

  • ブラベー格子の描画: 指定された格子タイプに応じて、対応する単位格子を描画します。

  • 格子点、格子ベクトル、補助線の表示: 単位格子内の格子点、および単位格子の基本ベクトル(\(a, b, c\))を矢印で表示します。特定の格子タイプ(面心立方格子など)では、単位格子内部の格子点を結ぶ補助線も描画されます。

  • 基本格子の表示: 面心格子や体心格子などの複合格子の場合、その単位格子内に対応する基本格子の基底ベクトルと、それらが形成する菱面体などの基本単位も描画できます。

  • 3Dプロットの生成と保存: Matplotlibを使用して3Dプロットを生成し、PNG画像ファイルとして保存するほか、対話的なウィンドウで表示します。

  • コマンドライン引数による制御: 描画する格子タイプや、格子ベクトル、補助線、基本格子の表示/非表示をコマンドライン引数で指定できます。

このプログラムは、結晶構造の理解を深めたい学生や研究者にとって、複雑な3次元構造を直感的に把握するための貴重なツールとなります。

原理

このプログラムは、以下の原理に基づいてブラベー格子を描画します。

  1. 格子ベクトルの計算: まず、結晶の格子定数 \(a, b, c\) と軸間角度 \(\alpha, \beta, \gamma\) (度数)から、3次元デカルト座標系における基本格子ベクトル \(\mathbf{a}, \mathbf{b}, \mathbf{c}\) を計算します。これは lattice_vectors 関数によって実行されます。 デカルト座標における各ベクトルの成分は以下の数式で定義されます。

    \[\mathbf{a} = (a, 0, 0)\]
    \[\mathbf{b} = (b \cos\gamma_r, b \sin\gamma_r, 0)\]
    \[\mathbf{c} = (c \cos\beta_r, c \frac{\cos\alpha_r - \cos\beta_r \cos\gamma_r}{\sin\gamma_r}, c \sqrt{1 - \cos^2\beta_r - \left(\frac{\cos\alpha_r - \cos\beta_r \cos\gamma_r}{\sin\gamma_r}\right)^2})\]

    ここで、\(\alpha_r, \beta_r, \gamma_r\) はそれぞれ角度 \(\alpha, \beta, \gamma\) をラジアンに変換したものです。

  2. ブラベー格子の定義: 結晶学における14種類のブラベー格子のうち、いくつかの代表的なタイプ(単純格子、面心格子、体心格子など)がプログラム内部で定義されています。各格子タイプには、以下の情報が関連付けられています。

    • 格子定数: \(a, b, c\) および \(\alpha, \beta, \gamma\) の値。

    • 格子点: 単位格子内の格子点(頂点、面心、体心など)の分数座標リスト。これらの座標は上記の基本格子ベクトルに適用され、デカルト座標の格子点に変換されます。

    • 補助線: 描画される格子点間に引かれる補助線の端点の分数座標リスト。これにより、単位格子内部の対称性や結合が視覚化されます。

    • 基本格子ベクトル: 複合格子(FCC, BCCなど)の場合、その単位格子を構成する基本格子の基底ベクトルを定義する分数座標リスト。

  3. 3D描画: matplotlib ライブラリの mpl_toolkits.mplot3d モジュールを使用して、計算された単位格子の頂点、格子点、格子ベクトル、および補助線を3次元空間に描画します。

    • Arrow3D クラスは matplotlib.patches.FancyArrowPatch を拡張したもので、3次元空間の矢印を正確な透視投影で描画するために、mpl_toolkits.mplot3d.proj3d を利用しています。これにより、カメラの視点に応じて矢印が正しく描画されます。

    • set_equal_aspect 関数は、プロットの軸の範囲を調整し、オブジェクトが歪まずに正しい比率で表示されるようにします。

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

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

  • numpy: 数値計算(特にベクトル演算)に使用されます。

  • matplotlib: 2D/3Dグラフィック描画に使用されます。

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

pip install numpy matplotlib

必要な入力ファイル

このプログラムは、外部の入力ファイルを必要としません。 すべての設定(格子タイプ、描画オプションなど)は、コマンドライン引数またはプログラム内の初期値によって直接指定されます。

生成される出力ファイル

プログラムを実行すると、以下の画像ファイルが生成され、カレントディレクトリに保存されます。

  • bravais_cell_with_basis_vectors.png:

    • 描画されたブラベー格子を含む3Dプロットの画像ファイルです。

    • 高解像度 (300 dpi) で、透過背景 (transparent=True) で保存されます。

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

プログラムは以下の形式で実行します。

python draw_bravais_lattice.py [CELL_TYPE] [DRAW_LATTICE_VECTORS] [DRAW_SUPPORT_LINES] [DRAW_PRIMITIVE_CELL]

引数の説明:

  • [CELL_TYPE] (必須): 描画するブラベー格子の種類を指定します。

    • 例: SC (単純立方), ST (単純正方), SO (単純斜方), SR (菱面体), SH (単純六方), FC (面心立方), FO (面心斜方), BC (体心立方), BT (体心正方), BO (体心斜方), CO (C面心斜方), SM (単純単斜), STri (単純三斜), CM (C面心単斜)。

    • プログラム内部のデフォルト値は BC です。

  • [DRAW_LATTICE_VECTORS] (オプション): 格子ベクトル(\(\mathbf{a}, \mathbf{b}, \mathbf{c}\))を描画するかどうか。

    • 1: 描画する。

    • 0: 描画しない。

    • プログラム内部のデフォルト値は 1 です。

  • [DRAW_SUPPORT_LINES] (オプション): 単位格子内部の補助線を描画するかどうか。

    • 1: 描画する。

    • 0: 描画しない。

    • プログラム内部のデフォルト値は 1 です。

  • [DRAW_PRIMITIVE_CELL] (オプション): 基本格子(面心格子や体心格子の場合)を描画するかどうか。

    • 1: 描画する。

    • 0: 描画しない。

    • プログラム内部のデフォルト値は 0 です。

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

例1: 面心立方格子 (FC) を基本格子付きで描画

面心立方格子 (FC) を描き、格子ベクトル、補助線、そして基本格子をすべて表示します。

python draw_bravais_lattice.py FC 1 1 1

実行結果の説明: このコマンドを実行すると、以下のような情報が標準出力に出力されます。

cell='FC'
draw_lattice_vectors=1
draw_support_lines=1
draw_primitive_cell=1
elev: 5.90, azim: -67.55

そして、matplotlibのウィンドウが表示され、面心立方格子の単位格子、すべての格子点、格子ベクトル(a, b, c)、内部の補助線、および面心立方格子に対応する菱面体(基本格子)が緑色で描画されます。また、bravais_cell_with_basis_vectors.png というファイル名で画像が保存されます。

例2: 単純立方格子 (SC) を格子ベクトルと補助線なしで描画

単純立方格子 (SC) を描き、格子ベクトルと補助線は非表示にします。基本格子は単純格子には存在しないため、このオプションは影響しません。

python draw_bravais_lattice.py SC 0 0 0

実行結果の説明: このコマンドを実行すると、以下のような情報が標準出力に出力されます。

cell='SC'
draw_lattice_vectors=0
draw_support_lines=0
draw_primitive_cell=0
elev: 5.90, azim: -67.55

matplotlibのウィンドウが表示され、単純立方格子の単位格子(黒い線と頂点)、および各頂点の格子点(赤い点)のみが描画されます。格子ベクトルや補助線は表示されません。同様に、bravais_cell_with_basis_vectors.png というファイル名で画像が保存されます。