以下は、lattice_plane.py のソースコードを解析して作成されたSphinx(MyST)でビルド可能なMarkdownドキュメントです。
プログラム lattice_plane.py ドキュメント
概要
このドキュメントは、Pythonプログラム lattice_plane.py の機能と使用方法について説明します。
lattice_plane.py は、指定された格子定数とミラー指数 (hkl) に基づいて、結晶の単位格子とその中の (hkl) 面を3Dで描画するスクリプトです。コマンドライン引数としてミラー指数 h, k, l を受け入れ、それらの値に応じて面を可視化します。描画されるのは単位格子に最も近い (hkl) 面の一部です。
非標準ライブラリ
本プログラムは以下の非標準ライブラリに依存しています。
numpy: 数値計算、特にベクトルおよび行列操作のために使用されます。matplotlib: 2D/3Dグラフィックの描画に使用されます。mpl_toolkits.mplot3d.art3d.Poly3DCollectionはmatplotlibのサブモジュールであり、3Dプロットで多角形を描画するために使用されます。
これらのライブラリは、通常 pip コマンドでインストールできます。
pip install numpy matplotlib
主要機能
lattice_plane.py は、以下の主要な機能を提供します。
3D単位格子の描画: 結晶の単位格子を3D空間に描画します。
ミラー指数面
(hkl)の描画: 指定されたミラー指数h,k,lに対応する格子面を単位格子内に描画します。格子軸ラベルとミラーインターセプト: 描画された単位格子に格子軸
a,b,cのラベルと、各軸とのミラーインターセプト1/h,1/k,1/lの注釈を追加します。コマンドライン引数によるミラー指数指定: 実行時にコマンドライン引数としてミラー指数
h,k,lを受け取ることができます。画像出力と表示: 生成された3DプロットをPNG画像ファイルとして保存し、画面に表示します。
関数
init_frac_cell()
分数座標系における単位格子の頂点と辺を初期化します。
この関数は、立方晶を想定した分数座標の8つの頂点と、それらの頂点を結ぶ12本の辺のインデックスのリストを生成します。これらの情報は、単位格子を表現するために使用されます。
引数: なし
戻り値:
fverts(numpy.ndarray): 分数座標系における単位格子の8つの頂点の配列。edges(list[tuple[int, int]]): 単位格子の辺を定義する頂点インデックスのペアのリスト。
compute_frac_polygon(h, k, l, fverts, edges)
ミラー指数 (hkl) によって定義される平面と単位格子の辺との交点を計算し、ポリゴンとして返します。
この関数は、平面の方程式 \(hx + ky + lz = 1\) を使用して、単位格子を構成する各辺との交点を求めます。交点が辺の内部 (\(0 \leq t \leq 1\)) にある場合のみ採用し、それらの交点を多角形の頂点として収集します。
浮動小数点数の誤差による重複点を np.unique() を使用して処理します。
最後に、これらの頂点を平面上の任意の中心点からの角度に基づいてソートし、凸多角形を形成するように並べ替えます。このソートには、平面の法線ベクトル n とそれに直交する2つのベクトル u, v が利用されます。
引数:
h(int): ミラー指数h。k(int): ミラー指数k。l(int): ミラー指数l。fverts(numpy.ndarray): 分数座標系における単位格子の頂点配列。edges(list[tuple[int, int]]): 単位格子の辺を定義する頂点インデックスのペアのリスト。
戻り値:
numpy.ndarrayまたはNone: 計算された交点を角度順に並べたポリゴン頂点の配列。交点が存在しない場合はNone。
main()
スクリプトのメインエントリポイント。単位格子と指定されたミラー指数面を描画します。
この関数は、以下の処理を実行します。
コマンドライン引数の処理: コマンドライン引数からミラー指数
h,k,lを読み込みます。引数が指定されない場合、デフォルト値を使用します。格子定数の変換: 設定されている格子定数と角度をラジアンに変換します。
格子ベクトルの計算: 結晶学の慣例に従い、実空間の格子ベクトル
a1,a2,a3を計算します。変換行列の構築: 分数座標から実座標への変換行列
Mを構築します。分数単位格子の取得:
init_frac_cell()を呼び出して、分数座標系の単位格子頂点と辺を取得します。分数ポリゴンの計算:
compute_frac_polygon()を呼び出して、指定された(hkl)面の分数座標系でのポリゴン頂点を取得します。座標変換: 取得した分数座標のポリゴン頂点と単位格子頂点を、変換行列
Mを使用して実空間座標に変換します。プロットの初期化:
matplotlibを用いて3Dプロットを初期化し、グリッドや軸を非表示に設定します。単位格子の描画: 実空間座標に変換された単位格子の辺を描画します。
(hkl)面の描画: 実空間座標に変換された(hkl)面のポリゴンを描画します。ポリゴンが有効かつ3点以上で構成されている場合にのみ描画されます。ラベルと注釈の追加:
格子軸
a,b,cのラベルを各軸の先端付近に配置します。ミラー指数
h,k,lが0でない場合、対応する軸とのミラーインターセプト \(1/h\), \(1/k\), \(1/l\) を注釈として追加します。
視点調整: 仰角 (
elev)、方位角 (azim)、カメラとオブジェクト間の距離 (dist) を設定して視点を調整します。保存と表示: 生成されたプロットを
lattice_plane{h}{k}{l}.pngという名前のPNG画像ファイルとして保存し、画面に表示します。
引数: なし
戻り値: なし
入力
本プログラムはコマンドライン引数を入力として受け取ります。
ミラー指数
h,k,l:型: 整数 (
int)オプションです。指定されない場合、プログラム内で定義されているデフォルト値 (初期値
h=1,k=2,l=3) が使用されます。各引数は順に
h,k,lに対応します。例えば、hとkのみを指定し、lを指定しない場合は、lのデフォルト値が使用されます。
出力
本プログラムは以下の出力を行います。
画像ファイル:
ファイル名:
lattice_plane{h}{k}{l}.png保存パス: スクリプトが実行されたディレクトリ
形式: PNG (Portable Network Graphics)
詳細:
dpi=300,bbox_inches='tight',transparent=Trueの設定で保存されます。ファイル名には、描画時に使用されたミラー指数h,k,lの値が組み込まれます。例:
h=1,k=1,l=0で実行した場合、lattice_plane110.pngが出力されます。
画面表示:
matplotlibによって生成された3Dプロットウィンドウが画面に表示されます。
使用方法
コマンドライン引数
本プログラムは、以下の形式でコマンドラインから実行できます。
python lattice_plane.py [h] [k] [l]
[h],[k],[l]はオプションの整数引数で、ミラー指数を指定します。
実行例
デフォルトのミラー指数 (1, 2, 3) で実行する:
python lattice_plane.py出力ファイル名:
lattice_plane123.pngミラー指数 (1, 1, 0) で実行する:
python lattice_plane.py 1 1 0
出力ファイル名:
lattice_plane110.pngミラー指数 (2, 1, 1) で実行する:
python lattice_plane.py 2 1 1
出力ファイル名:
lattice_plane211.png
構成定数
プログラム lattice_plane.py には、以下の構成定数が直接コード内に定義されています。これらはプログラムの動作や描画設定を制御します。
格子定数:
a: 1.0 (a軸長さ)b: 1.2 (b軸長さ)c: 0.8 (c軸長さ)alpha: 90 (\(\alpha\) 角度、度)beta: 100 (\(\beta\) 角度、度)gamma: 110 (\(\gamma\) 角度、度)
ミラー指数初期値:
h: 1k: 2l: 3 (これらの値はコマンドライン引数で上書きされる可能性があります)
描画設定:
plane_color:'cyan'(格子面の塗りつぶし色)edge_color:'blue'(格子面の縁の色)plane_alpha: 0.1 (格子面の透明度)plt.rcParams['font.family']:'MS Gothic'(Matplotlibのデフォルトフォント設定)
ミラーインターセプト注釈オフセット:
offset_alabel: -0.1 (a軸ラベルのオフセット)offset_blabel: -0.2 (b軸ラベルのオフセット)offset_clabel: -0.05 (c軸ラベルのオフセット)
視点調整:
elev: 20 (仰角)azim: 30 (方位角)dist: 12 (カメラとオブジェクト間の距離)