プログラムドキュメント: draw_bravais_lattice.py

概要

draw_bravais_lattice.py は、Python言語で記述されたスクリプトであり、ブラベー格子の単位格子と格子点を3Dで可視化することを目的としています。

このスクリプトは、指定された格子定数と結晶系に基づいて、ブラベー格子の単位格子、格子点、格子ベクトル、およびオプションで補助線や基本格子を3Dで描画します。Matplotlibライブラリを使用して3Dプロットを生成し、結果を画像ファイルとして保存し、同時に表示します。

非標準ライブラリ

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

  • numpy: 数値計算、特にベクトル演算や行列演算に使用されます。

  • matplotlib: 2Dおよび3Dのプロット、グラフ描画に使用されます。

クラス

Arrow3D

Matplotlibの FancyArrowPatch を継承し、3D空間に矢印を描画するためのクラスです。このクラスは、3D座標の矢印を2Dのスクリーン座標に投影し、Matplotlibの3D軸上に適切に描画することを可能にします。

初期化メソッド: __init__(self, xs, ys, zs, *args, **kwargs)

Arrow3D オブジェクトを初期化します。

  • xs (list[float]): 矢印のX座標 (開始点, 終了点)。

  • ys (list[float]): 矢印のY座標 (開始点, 終了点)。

  • zs (list[float]): 矢印のZ座標 (開始点, 終了点)。

  • *args: FancyArrowPatch に渡される追加の位置引数。

  • **kwargs: FancyArrowPatch に渡される追加のキーワード引数。

メソッド: draw(self, renderer)

矢印をレンダラーに描画します。3D座標を2Dスクリーン座標に変換し、変換された座標に基づいて矢印を描画します。

  • renderer (matplotlib.backend_bases.RendererBase): 描画に使用されるレンダラーオブジェクト。

メソッド: do_3d_projection(self, renderer=None)

3D投影を計算し、描画順序のためのZ深度を返します。矢印の3D座標を2Dスクリーン座標に変換し、最小のZ深度を返して、Matplotlibの3Dレンダリングにおける描画順序を適切に処理します。

  • renderer (matplotlib.backend_bases.RendererBase or None): 描画に使用されるレンダラーオブジェクト(オプション)。

  • 戻り値 (float): 変換されたZ座標の最小値。

関数

draw_vector(ax, vec, color, label, fontsize)

指定された3Dベクトルを矢印としてMatplotlibの3D軸に描画します。矢印は原点 (0,0,0) から指定されたベクトルまで描画され、ベクトルの先端にはラベルが表示されます。

  • ax (mpl_toolkits.mplot3d.axes3d.Axes3D): 矢印を描画する3D軸オブジェクト。

  • vec (numpy.ndarray): 矢印の終点となる3Dベクトル。

  • color (str): 矢印とラベルの色。

  • label (str): 矢印のラベル文字列。

  • fontsize (int): ラベルのフォントサイズ。

  • 戻り値: なし。

lattice_vectors(a, b, c, alpha, beta, gamma)

単位格子の格子定数から3つの基本格子ベクトルを計算します。計算は、a 軸をx軸に沿わせ、b 軸をxy平面に置き、c 軸をz軸正方向に向ける形で座標系を設定して行われます。

  • a (float): 格子定数 a の長さ。

  • b (float): 格子定数 b の長さ。

  • c (float): 格子定数 c の長さ。

  • alpha (float): 角度 αbc の間の角度、度数)。

  • beta (float): 角度 βac の間の角度、度数)。

  • gamma (float): 角度 γab の間の角度、度数)。

  • 戻り値 (tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]): 3つの基本格子ベクトル (va, vb, vc)。

set_equal_aspect(ax, points)

Matplotlibの3Dプロットの軸のアスペクト比を等しく設定します。描画される全ての点の範囲に基づいて、x, y, z軸の表示範囲を調整し、立体が歪まないように真のアスペクト比を維持します。

  • ax (mpl_toolkits.mplot3d.axes3d.Axes3D): 軸のアスペクト比を設定する3D軸オブジェクト。

  • points (numpy.ndarray): 描画される全ての点のNumpy配列。

  • 戻り値: なし。

draw_unit_cell_with_lattice(a, b, c, alpha, beta, gamma, lattice_points=None, dashed_lines=None, basis_vectors=None)

指定された格子定数と格子点を用いて、ブラベー単位格子を3Dで描画します。この関数は、単位格子の辺、頂点、格子ベクトル、格子点、オプションで補助線、および基本格子を描画し、結果を画像ファイルとして保存した後、画面に表示します。ユーザーがプロットを操作すると、現在の視点角度 (elev, azim) がコンソールに出力されます。

  • a (float): 格子定数 a の長さ。

  • b (float): 格子定数 b の長さ。

  • c (float): 格子定数 c の長さ。

  • alpha (float): 角度 αbc の間の角度、度数)。

  • beta (float): 角度 βac の間の角度、度数)。

  • gamma (float): 角度 γab の間の角度、度数)。

  • lattice_points (list[list[float]] or None): 格子点を表す係数のリスト。各要素は [u, v, w] 形式で u*va + v*vb + w*vc と計算されます。None の場合、格子点は描画されません。

  • dashed_lines (list[tuple[tuple[float, float, float], tuple[float, float, float]]] or None): 補助線(破線)の始点と終点を表す係数のリスト。各要素は ([u1, v1, w1], [u2, v2, w2]) 形式です。None の場合、補助線は描画されません。

  • basis_vectors (list[list[float]] or None): 基本格子ベクトルを表す係数のリスト。各要素は [u, v, w] 形式です。None の場合、基本格子は描画されません。

  • 戻り値: なし。

main()

プログラムのエントリポイント。コマンドライン引数を解析し、ブラベー単位格子の描画を実行します。コマンドライン引数に基づいて、描画する結晶系と表示オプション(格子ベクトル、補助線、基本格子)を設定し、draw_unit_cell_with_lattice 関数を呼び出して単位格子を描画します。引数が指定されない場合は、デフォルト値が使用されます。

  • 戻り値: なし。

入出力

入力

プログラムの入力は、主にコマンドライン引数を通じて行われます。

  1. コマンドライン引数:

    • cell_type (str): 描画する結晶系を指定する文字列。プログラムは、文字列の最初の文字とそれに続く文字の組み合わせによって結晶系を識別します。認識される主なタイプは以下の通りです。

      • S で始まる: 単純格子 (Simple)。例: SC (Simple Cubic), ST (Simple Tetragonal), SO (Simple Orthorhombic), SR (Simple Rhombohedral), SH (Simple Hexagonal), SM (Simple Monoclinic), STri (Simple Triclinic)。

      • F で始まる: 面心格子 (Face-centered)。例: FC (Face-centered Cubic), FO (Face-centered Orthorhombic)。

      • B で始まる: 体心格子 (Body-centered)。例: BC (Body-centered Cubic), BT (Body-centered Tetragonal), BO (Body-centered Orthorhombic)。

      • C で始まる: 底心格子 (Base-centered)。例: CO (Base-centered Orthorhombic), CM (Base-centered Monoclinic)。

      • デフォルト値は BC (Body-centered Cubic)。

    • draw_lattice_vectors (int): 格子ベクトルを描画するかどうかを示すフラグ。1 で描画、0 で非描画。

      • デフォルト値は True (1)。

    • draw_support_lines (int): 補助線を描画するかどうかを示すフラグ。1 で描画、0 で非描画。

      • デフォルト値は True (1)。

    • draw_primitive_cell (int): 基本格子を描画するかどうかを示すフラグ。1 で描画、0 で非描画。

      • デフォルト値は False (0)。

  2. コード内定数:

    • 視点の初期値: elev = 5.90, azim = -67.55

    • 描画要素のスタイル設定: lattice_vector_color ('blue'), axis_arrow_color ('blue'), axis_label_font_size (24), point_color ('red'), point_size (500)。 これらの値はコード内で直接設定されており、コマンドライン引数からは変更できません。

出力

プログラムは以下の出力を生成します。

  1. 3Dプロット表示: Matplotlibによって生成されたブラベー格子の3Dプロットウィンドウが画面に表示されます。

  2. 画像ファイル出力: 描画された3Dプロットは、カレントディレクトリに bravais_cell_with_basis_vectors.png というファイル名でPNG画像として保存されます。解像度は 300 dpi、背景は透過です。

  3. コンソール出力:

    • main() 関数実行時に、設定された cell タイプと各描画オプションの状態 (draw_lattice_vectors, draw_support_lines, draw_primitive_cell) が標準出力に表示されます。

    • 3Dプロットウィンドウを操作する際、現在の視点角度 (elevazim) がコンソールにリアルタイムで出力されます。

    • 無効な cell タイプが指定された場合、エラーメッセージが標準出力に表示されます。

使用方法

draw_bravais_lattice.py スクリプトは、コマンドラインから実行します。

基本的な実行形式

python draw_bravais_lattice.py [cell_type] [draw_lattice_vectors] [draw_support_lines] [draw_primitive_cell]
  • [cell_type]: 描画する結晶系の文字列(例: SC, FC, BC)。

  • [draw_lattice_vectors]: 格子ベクトルを描画するかどうか (1 または 0)。

  • [draw_support_lines]: 補助線を描画するかどうか (1 または 0)。

  • [draw_primitive_cell]: 基本格子を描画するかどうか (1 または 0)。

引数は省略可能で、省略された場合はデフォルト値が適用されます。

1. デフォルト設定で体心立方格子 (BCC) を描画

コマンドライン引数を指定しない場合、cellBC (体心立方)、draw_lattice_vectorsdraw_support_lines1 (描画)、draw_primitive_cell0 (非描画) となります。

python draw_bravais_lattice.py

出力例:

cell='BC'
draw_lattice_vectors=1
draw_support_lines=1
draw_primitive_cell=0

2. 面心立方格子 (FCC) を描画し、全てのオプションを有効にする

面心立方格子 (FC) を描き、格子ベクトル、補助線、基本格子の全てを描画します。

python draw_bravais_lattice.py FC 1 1 1

出力例:

cell='FC'
draw_lattice_vectors=1
draw_support_lines=1
draw_primitive_cell=1

3. 単純立方格子 (SC) を描画し、格子ベクトルのみ有効にする

単純立方格子 (SC) を描き、格子ベクトルのみ描画し、補助線と基本格子は非描画にします。

python draw_bravais_lattice.py SC 1 0 0

出力例:

cell='SC'
draw_lattice_vectors=1
draw_support_lines=0
draw_primitive_cell=0

4. 無効な結晶系を指定した場合

認識されない結晶系を指定すると、エラーメッセージが表示されます。

python draw_bravais_lattice.py XYZ

出力例:

cell='XYZ'
draw_lattice_vectors=1
draw_support_lines=1
draw_primitive_cell=0

Error: Invalid cell type [XYZ]