crystal_draw_cell.py 技術ドキュメント
プログラムの動作
crystal_draw_cell.py は、指定された格子パラメータと原子サイト情報に基づき、結晶の単位格子およびその中に配置された原子を3Dで可視化するPythonプログラムです。同時に、実空間と逆空間の各種結晶学的な情報を計算し、標準出力に表示します。
主な機能は以下の通りです。
結晶構造の計算: 定義された格子パラメータから実空間の格子ベクトル、メートルテンソル、単位格子体積を計算します。
逆格子構造の計算: 実空間の格子ベクトルから逆格子ベクトル、逆格子パラメータ、逆格子メートルテンソル、逆格子単位格子体積を計算します。
3D可視化: Matplotlibの
mpl_toolkits.mplot3dを使用して、実空間単位格子(黒線)、逆格子単位格子(赤線)、およびその中に配置された原子(球体)を3Dプロットで表示します。原子は指定された半径と色で描画されます。コンソール出力: 計算された結晶学的なパラメータ(格子定数、格子ベクトル、メートルテンソル、体積など)を整形された形式で標準出力に表示します。
このプログラムは、結晶構造の幾何学的特性、特に実空間と逆空間の関係を視覚的に理解するためのツールとして機能します。
原理
crystal_draw_cell.py は、結晶学の基本的な概念とベクトル演算に基づいて結晶構造を計算し、可視化します。主要な原理は以下の通りです。
格子パラメータと格子ベクトルの関係: 結晶の単位格子は、3つの格子ベクトル \(\vec{a}_1, \vec{a}_2, \vec{a}_3\) によって定義されます。これらのベクトルは、格子パラメータ \(a, b, c\)(長さ)および \(\alpha, \beta, \gamma\)(角度)から計算されます。
tkcrystalbase.cal_lattice_vectors関数は、これらのパラメータからデカルト座標系における格子ベクトルを導出します。標準的なデカルト座標系での格子ベクトル成分 \(a_{ij}\) は、tkcrystalbaseモジュール内部で計算されますが、一般的に以下のような関係に基づいています。 $\( \vec{a}_1 = (a, 0, 0) \)\( \)\( \vec{a}_2 = (b \cos\gamma, b \sin\gamma, 0) \)\( \)\( \vec{a}_3 = (c \cos\beta, c (\cos\alpha - \cos\beta \cos\gamma) / \sin\gamma, c \sqrt{1 - \cos^2\alpha - \cos^2\beta - \cos^2\gamma + 2\cos\alpha \cos\beta \cos\gamma} / \sin\gamma) \)$分数座標からデカルト座標への変換: 原子の位置は通常、格子ベクトルに対する分数座標 \((x, y, z)\) で与えられます。これをデカルト座標 \((X, Y, Z)\) に変換するには、格子ベクトルを用いて次のように計算します。 $\( (X, Y, Z) = x \vec{a}_1 + y \vec{a}_2 + z \vec{a}_3 \)$ この計算は
tkcrystalbase.fractional_to_cartesian関数によって行われます。逆格子ベクトルの計算: 実空間の格子ベクトル \(\vec{a}_1, \vec{a}_2, \vec{a}_3\) から、逆格子ベクトル \(\vec{b}_1, \vec{b}_2, \vec{b}_3\) が計算されます。これらは以下の関係式によって定義されます。 $\( \vec{b}_1 = 2\pi \frac{\vec{a}_2 \times \vec{a}_3}{V} \)\( \)\( \vec{b}_2 = 2\pi \frac{\vec{a}_3 \times \vec{a}_1}{V} \)\( \)\( \vec{b}_3 = 2\pi \frac{\vec{a}_1 \times \vec{a}_2}{V} \)\( ここで \)V = \vec{a}_1 \cdot (\vec{a}_2 \times \vec{a}_3)$ は実空間単位格子の体積です。この計算は
tkcrystalbase.cal_reciprocal_lattice_vectors関数によって行われます。逆格子単位格子は、逆格子ベクトルで張られる平行六面体です。単位格子の描画 (
draw_box関数):draw_box関数は、3つの格子ベクトルaij[0],aij[1],aij[2]を用いて、原点から伸びる12本の線分を描画することで、単位格子(平行六面体)の枠を構築します。これにより、単位格子の形状が視覚的に表現されます。原子の配置と描画 (
draw_unitcell関数):draw_unitcell関数は、各原子サイトの分数座標と、nrangeで指定された範囲に基づいて原子を配置します。reduce01関数を使って座標を \([0, 1)\) の範囲に正規化した後、整数オフセットを加えて目的の範囲に繰り返し原子をプロットします。これにより、複数の単位格子にわたる原子の配置をシミュレートし、Matplotlibのax.scatterを使用して指定された色と半径(krによるスケーリング)の球として描画します。
必要な非標準ライブラリとインストール方法
このプログラムは、以下の非標準ライブラリに依存しています。
numpy: 数値計算(配列操作、三角関数、線形代数など)に使用されます。
matplotlib: グラフの描画、特に
mpl_toolkits.mplot3dによる3Dプロットに使用されます。tkcrystalbase: 結晶学的な計算(格子ベクトル、逆格子ベクトル、体積、座標変換など)を行うカスタムモジュールです。このモジュールは、本プログラムと同じプロジェクトの一部として提供されるか、別途インストールされている必要があります。
これらのライブラリは、Pythonのパッケージマネージャpipを使用してインストールできます。
pip install numpy matplotlib
tkcrystalbase モジュールについては、通常、crystal_draw_cell.py と同じディレクトリに tkcrystalbase.py ファイルとして配置する必要があります。
必要な入力ファイル
crystal_draw_cell.py は、外部からの入力ファイルを直接読み込む機能は持っていません。プログラムの動作に必要なすべての設定情報は、ソースコード内にPythonのリストや変数として直接記述されています。
具体的には、以下の情報がプログラムの冒頭で定義されています。
lattice_parameters: 格子定数。長さ(オングストローム)と角度(度)のリスト[a, b, c, alpha, beta, gamma]。例:
[5.62, 5.62, 5.62, 60.0, 60.0, 60.0](菱面体晶)例:
[5.62, 5.62, 5.62, 90.0, 90.0, 90.0](立方晶)
sites: 各原子サイトの情報。原子名、サイトラベル、原子番号、原子質量、電荷、半径(オングストローム)、色、および分数座標のリストのリスト。例:
['Na', 'Na1', 11, 22.98997, +1.0, 0.7, 'red', np.array([0.0, 0.0, 0.0])]
kr: 原子サイズを描画するためのスケーリング係数。kRUC: 逆格子単位格子を実空間単位格子に対して描画する際のサイズ調整係数。nrange: 結晶構造を描画する単位格子の範囲。[[min_x, max_x], [min_y, max_y], [min_z, max_z]]の形式。figsize: Matplotlibで生成される図のサイズ。
これらのパラメータは、プログラムを実行する前にソースコードを直接編集することで変更できます。
生成される出力ファイル
crystal_draw_cell.py は、直接ディスクにファイルを保存する機能は持っていません。主な出力は以下の二種類です。
3Dプロットウィンドウ: Matplotlibによって生成されるグラフィカルなウィンドウが表示されます。このウィンドウには、以下の要素が3次元空間に描画されます。
実空間単位格子: 黒い線で描かれた平行六面体の枠。
逆格子単位格子: 赤い線で描かれた平行六面体の枠。そのスケールは
kRUCによって調整されます。原子:
sitesリストで定義された位置、半径、色に従って配置された球体。 ユーザーはこのウィンドウを通じて結晶構造を視覚的に探索でき、Matplotlibの標準機能を利用して手動で画像(PNG, JPG, PDFなど)として保存することが可能です。
標準出力 (コンソール): プログラムの実行中に、計算された結晶学的なパラメータが標準出力に表示されます。これには以下の情報が含まれます。
入力された格子パラメータ
計算された実空間格子ベクトル(
ax,ay,az)実空間のメートルテンソル(
gij)実空間単位格子の体積
計算された逆格子パラメータ
計算された逆格子格子ベクトル(
Rax,Ray,Raz)逆空間のメートルテンソル(
Rgij)逆格子単位格子の体積
これらの情報は、結晶構造の数値的な詳細を確認するために利用できます。
コマンドラインでの使用例 (Usage)
crystal_draw_cell.py はコマンドライン引数を取らないシンプルなプログラムです。実行はPythonインタープリタを介して行います。
python crystal_draw_cell.py
コマンドラインでの具体的な使用例
以下の例は、プログラムをデフォルト設定で実行した場合の動作を示します。
実行コマンド: プログラムファイルがカレントディレクトリにあることを確認し、以下のコマンドを実行します。
python crystal_draw_cell.py実行結果の説明:
コンソール出力: 標準出力には、以下のような結晶学的な計算結果が表示されます(数値は
lattice_parametersおよびsitesの定義によって変わります)。Lattice parameters: [5.62, 5.62, 5.62, 60.0, 60.0, 60.0] Lattice vectors: ax: ( 5.62, 0, 0) A ay: ( 2.81, 4.867, 0) A az: ( 2.81, 1.622, 4.587) A Metric tensor: gij: ( 31.58, 15.79, 15.79) A ( 15.79, 31.58, 15.79) A ( 15.79, 15.79, 31.58) A Volume: 104.9 A^3 Unit cell volume: 104.9 A^3 Reciprocal lattice parameters: [1.118, 1.118, 1.118, 109.47, 109.47, 109.47] Reciprocal lattice vectors: Rax: ( 0.8696, -0.5026, -0.2903) A^-1 Ray: ( 0, 1.005, -0.2903) A^-1 Raz: ( 0, 0, 0.5807) A^-1 Reciprocal lattice metric tensor: Rgij: ( 1.249, 0.4164, 0.4164) A^-1 ( 0.4164, 1.249, 0.4164) A^-1 ( 0.4164, 0.4164, 1.249) A^-1 Reciprocal unit cell volume: 0.3792 A^-3グラフィカル出力: デフォルトの
lattice_parameters = [5.62, 5.62, 5.62, 60.0, 60.0, 60.0]とsites定義(菱面体晶のNaとCl)に基づいて、結晶構造の3Dプロットが表示されます。このプロットでは、黒い線で実空間単位格子が、赤い線で逆格子単位格子が描画されます。Na原子は赤色の球体で、Cl原子は青色の球体で表現され、それぞれの原子半径に応じてサイズが異なります。ユーザーはマウス操作でこの3Dプロットを回転、拡大・縮小して様々な角度から結晶構造を観察できます。