space_group.py 技術ドキュメント

プログラムの動作

space_group.py は、結晶学における空間群の情報を表示したり、指定された空間群の対称操作を用いて分率座標を展開し、その結果を視覚化したりするためのPythonスクリプトです。このプログラムは主に以下の機能を提供します。

  • 全空間群のリスト表示: 国際結晶学連合 (ITA) で定義されている全230の空間群の番号と記号を一覧表示します。

  • 特定の空間群の詳細情報表示: 指定された空間群番号に対応するヘルマン・モーガン記号、結晶系、点群、およびその空間群に含まれる全ての対称操作(回転行列、並進ベクトル、変換式、操作の種類)を詳細に表示します。

  • 座標の展開と表示: 指定された初期分率座標(x, y, z)に対し、特定の空間群の全ての対称操作を適用し、生成される等価なサイトの座標をリストアップします。重複するサイトは指定された許容誤差内で排除され、ユニークなサイトのみが表示されます。

  • ステレオ投影(平面投影): 座標展開と同様に等価なサイトを生成した後、それらをXY単位格子平面に投影し、z座標の情報を色やラベルで表現した図を生成します。これにより、単位セル内の等価なサイトの分布を直感的に把握できます。

このプログラムは、結晶構造解析や材料科学の研究において、空間群の性質を理解し、結晶サイトの対称的な配置を調べる際に役立ちます。

原理

space_group.py は、主にPythonの科学計算ライブラリ numpy と、結晶構造解析に特化したライブラリ pymatgen を利用して機能を実現しています。

1. 空間群の表現と操作

空間群は、結晶構造が持つ対称性を記述する数学的なグループです。これは、点群操作(回転、鏡映、反転)と並進操作(格子並進、らせん軸、映進面)の組み合わせで構成されます。 pymatgen ライブラリは、これらの空間群情報を国際結晶学連合 (ITA) の標準設定に基づいて効率的に扱います。

  • SpaceGroup.from_int_number(ispg): 指定されたITA番号 (1-230) に基づいて SpaceGroup オブジェクトを生成します。このオブジェクトは、その空間群に含まれる全ての基本的な対称操作 (SymmOp オブジェクトのリスト) を symmetry_ops プロパティとして保持しています。

  • SymmOp オブジェクト: 各対称操作は SymmOp クラスのインスタンスとして表現されます。これは3x3の回転行列 (\(R\)) と3要素の並進ベクトル (\(t\)) を内部に持ち、点 \(p = (x, y, z)\) を新しい点 \(p' = Rp + t\) に変換する操作を定義します。op.operate(point) メソッドでこの変換を実行します。

2. 対称操作の分類 (classify_symop_spg 関数)

この関数は、与えられた SymmOp オブジェクトを解析し、その操作の種類を「Identity (恒等操作)」「Pure Translation (純粋並進)」「Inversion (反転)」「Rotation (回転)」「Screw Rotation (らせん回転)」「Mirror (鏡映)」「Glide Reflection (映進鏡映)」に分類します。

  • 回転行列の決定因子 (\(det(R)\)):

    • \(det(R) = 1\): 回転またはらせん回転

    • \(det(R) = -1\): 反転、鏡映、または映進鏡映

  • 並進ベクトル (\(t\)):

    • \(t = [0,0,0]\) (または非常に小さい) : 純粋な点群操作(恒等、反転、回転、鏡映)

    • \(t \neq [0,0,0]\) (または十分に大きい) : 並進成分を伴う操作(純粋並進、らせん回転、映進鏡映)

  • 回転軸の特定: \(det(R)=1\) の場合、回転行列 \(R\) の固有値が1である固有ベクトルが回転軸を示します。回転角 \(\theta\)\(trace(R) = 1 + 2 \cos \theta\) の関係から導出できます。

  • 鏡映面の法線ベクトルの特定: \(det(R)=-1\) かつ \(R^2=I\) の場合、回転行列 \(R\) の固有値が-1である固有ベクトルが鏡映面の法線ベクトルを示します。

3. 座標の展開と重複排除 (expand_coordinates 関数)

初期座標 \(p_0 = (x_0, y_0, z_0)\) に対して、空間群の全ての対称操作 \(op_i\) を適用し、変換された座標 \(p_i' = op_i(p_0)\) を計算します。

  • 分率座標の折り返し: 変換後の座標は単位セルの内部に収まるように、各成分を \([0, 1)\) の範囲に折り返します。これは np.mod(transformed, 1.0) で行われます。

  • 重複排除 (トーラス最短距離): 結晶は周期的な構造を持つため、異なる対称操作によって生成された座標が、周期的な並進によって同一のサイトを示す場合があります。重複を排除するためには、2つの点 \(p_1 = (x_1, y_1, z_1)\)\(p_2 = (x_2, y_2, z_2)\) の間の「トーラス距離」を計算します。 トーラス距離は、座標差の絶対値 \(\Delta = |p_1 - p_2|\) を計算し、各成分を \(0.5\) を超える場合は \(1.0 - \Delta\) に置き換えることで算出されます。 例えば、1次元の場合、点 \(x_1=0.1\)\(x_2=0.9\) の距離は \(|0.1 - 0.9| = 0.8\) ですが、周期境界条件を考慮すると \(0.1\)\(0.9\) の距離は \((0.1 \rightarrow 0 \rightarrow 0.9)\)\(0.2\) となります。 具体的には、各軸成分について \(d_i = \min(|p_{1,i} - p_{2,i}|, 1 - |p_{1,i} - p_{2,i}|)\) を計算し、これらの成分からユークリッド距離 \(\sqrt{d_x^2 + d_y^2 + d_z^2}\) を求めます。この距離が rmin (最小距離閾値) より小さい場合に、2つの点は重複していると判断されます。

    \[ d_i = \min(|p_{1,i} - p_{2,i}|, 1 - |p_{1,i} - p_{2,i}|) \]
    \[ D = \sqrt{d_x^2 + d_y^2 + d_z^2} \]

4. ステレオ投影(XY平面投影) (plot_unit_cell_projection 関数)

展開された座標のXY平面投影図を matplotlib を用いて描画します。各点のアウトラインは共通ですが、z座標の情報に基づいてマーカーの色と中央のラベルが変化します。

  • z=0 または z=1: 赤色のマーカー。

  • zと \(1-z\) のペアが存在: 黄色のマーカー、中央に +- ラベル。

  • zと \(z \pm 0.5\) のペアが存在: 黄色のマーカー、中央に +1/2 または -1/2 ラベル。

  • \(z\) が存在し、\(1-z\) のみが存在: 灰色のマーカー、中央に - ラベル。

  • 上記以外(zがユニーク): 白色のマーカー、ラベルなし。

これは完全なステレオ投影ではなく、z座標の情報をエンコードしたXY平面への投影図です。

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

このプログラムの実行には、以下のPython非標準ライブラリが必要です。

  • numpy: 数値計算を効率的に行うためのライブラリ。

  • matplotlib: グラフ描画を行うためのライブラリ。

  • pymatgen: 材料科学のためのPythonライブラリ。結晶構造、空間群、対称操作などを扱います。

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

pip install numpy matplotlib pymatgen

必要な入力ファイル

space_group.py は、入力ファイルを必要としません。全ての必要な情報はコマンドライン引数として与えられます。

生成される出力ファイル

space_group.py は、ディスクにファイルを生成しません。

  • --mode list, --mode inf, --mode expand の場合、プログラムの実行結果は標準出力 (コンソール) にテキスト形式で表示されます。

  • --mode stereo の場合、matplotlib によってグラフィックウィンドウが開き、XY単位格子に等価なサイトの投影図が表示されます。この図は自動的にはファイルとして保存されません。必要であれば、表示されたウィンドウから手動で保存してください。

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

space_group.py の基本的な使用法は以下の通りです。

python space_group.py --mode {list|inf|stereo|expand} [--ispg <int>] [--xyz <x,y,z>] [--rmin <float>]

引数:

  • --mode : 必須。実行するモードを指定します。

    • list: 全ての空間群番号と記号をリスト表示します。

    • inf: 指定された空間群の詳細情報を表示します。--ispg が必要です。

    • stereo: 展開された点のステレオ投影図をプロットします。--ispg が必要です。

    • expand: 座標を展開し、結果をテキストで表示します。--ispg が必要です。

  • --ispg : 空間群番号 (1から230まで)。inf, stereo, expand モードで必須です。

  • --xyz : 座標展開のための初期分率座標。カンマ区切りの文字列 ('x,y,z') で指定します。デフォルトは '0.9,0.1,0.15' です。

  • --rmin : 同一サイトと判断するための最小距離。デフォルトは 1.0e-5 です。

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

1. 全ての空間群をリスト表示

python space_group.py --mode list

実行結果の説明: 標準出力に、空間群番号とそのヘルマン・モーガン記号が1番から230番まで順番にリスト表示されます。

--- All Space Groups (1 to 230) ---
[  1] P1
[  2] P-1
[  3] P2
[  4] P2_1
[  5] C2
[  6] Pm
... (中略) ...
[229] Im-3m
[230] Ia-3d

その後、Press ENTER to terminate>> と表示され、Enterキーを押すとプログラムが終了します。

2. 空間群 225 (Fm-3m) の詳細情報を表示

python space_group.py --mode inf --ispg 225

実行結果の説明: 標準出力に、空間群225 (Fm-3m) の詳細情報が表示されます。これには、ヘルマン・モーガン記号、結晶系、点群記号が含まれます。続いて、この空間群が持つ全ての対称操作について、それぞれの種類 (例: Identity, Rotation, Mirror, Inversion など)、回転行列、並進ベクトル、および座標変換の数式が順番にリスト表示されます。

--- Detailed Information for Space Group 225 ---
Hermann-Mauguin Symbol: Fm-3m
Crystal System:          cubic
Point Group:             m-3m

--- Symmetry Operations ---
Total operations: 192

Operation 1: Identity
  Rotation Matrix (R):
    [ 1.0000,  0.0000,  0.0000]
    [ 0.0000,  1.0000,  0.0000]
    [ 0.0000,  0.0000,  1.0000]
  Translation Vector (t):
    [ 0.0000,  0.0000,  0.0000]
  Transformation: (x, y, z)

Operation 2: Rotation C2 (x-axis)
  Rotation Matrix (R):
    [ 1.0000,  0.0000,  0.0000]
    [ 0.0000, -1.0000,  0.0000]
    [ 0.0000,  0.0000, -1.0000]
  Translation Vector (t):
    [ 0.0000,  0.0000,  0.0000]
  Transformation: (x, -y, -z)

... (中略) ...

Operation 192: Glide Reflection (σ) (mz-plane)
  Rotation Matrix (R):
    [-1.0000,  0.0000,  0.0000]
    [ 0.0000, -1.0000,  0.0000]
    [ 0.0000,  0.0000,  1.0000]
  Translation Vector (t):
    [ 0.5000,  0.5000,  0.0000]
  Transformation: (-x+0.500, -y+0.500, z)

その後、Press ENTER to terminate>> と表示され、Enterキーを押すとプログラムが終了します。

3. 空間群 225 (Fm-3m) で座標 (0.1, 0.2, 0.3) を展開し表示

python space_group.py --mode expand --ispg 225 --xyz 0.1,0.2,0.3

実行結果の説明: 指定された空間群と初期座標から、各対称操作によって生成される変換後の座標がリスト表示されます。全ての変換後の座標が表示された後、重複を排除したユニークな座標の総数と、それらの座標が改めてリスト表示されます。

--- Space Group 225 (Fm-3m), Expanded points from (0.1000, 0.2000, 0.3000) ---
Operation 01 (Identity): ( 0.1000,  0.2000,  0.3000)
Operation 02 (Rotation C2 (x-axis)): ( 0.1000,  0.8000,  0.7000)
Operation 03 (Rotation C2 (y-axis)): ( 0.9000,  0.2000,  0.7000)
Operation 04 (Rotation C2 (z-axis)): ( 0.9000,  0.8000,  0.3000)
... (中略) ...
Operation 192 (Glide Reflection (σ) (mz-plane)): ( 0.4000,  0.3000,  0.3000)

Total expanded points (including duplicates): 192
Total unique expanded points (rmin=1.0e-05): 48

--- Unique Expanded Points ---
01: ( 0.1000,  0.2000,  0.3000)
02: ( 0.1000,  0.8000,  0.7000)
03: ( 0.9000,  0.2000,  0.7000)
04: ( 0.9000,  0.8000,  0.3000)
... (中略) ...
48: ( 0.7000,  0.3000,  0.4000)

その後、Press ENTER to terminate>> と表示され、Enterキーを押すとプログラムが終了します。

4. 空間群 225 (Fm-3m) で座標 (0.1, 0.2, 0.3) を展開しステレオ投影図を表示

python space_group.py --mode stereo --ispg 225 --xyz 0.1,0.2,0.3

実行結果の説明: 上記 expand モードと同様に座標が展開され、ユニークなサイトのリストが標準出力に表示されます。それに加えて、matplotlib によってグラフィックウィンドウが開き、XY単位格子に等価なサイトの投影図が表示されます。各マーカーは展開されたサイトのXY座標を示し、色と中央のラベルがz座標の特定の情報(例: z=0, zと1-zのペアなど)を表します。

コンソールには、各ユニークな (x,y) ペアに対して、どのz値が存在するか、そして has_pair などの内部的な判定結果が表示されます。

--- Space Group 225 (Fm-3m), Expanded points from (0.1000, 0.2000, 0.3000) ---
Operation 01 (Identity): ( 0.1000,  0.2000,  0.3000)
... (中略) ...
Operation 192 (Glide Reflection (σ) (mz-plane)): ( 0.4000,  0.3000,  0.3000)

Total expanded points (including duplicates): 192
Total unique expanded points (rmin=1.0e-05): 48

--- Unique Expanded Points ---
01: ( 0.1000,  0.2000,  0.3000)
... (中略) ...
48: ( 0.7000,  0.3000,  0.4000)

001: (x,y)=(0.10000,0.20000) z_set=[0.3, 0.7] : has_pair=True has_pair_±0.5=False/False
002: (x,y)=(0.10000,0.30000) z_set=[0.2, 0.8] : has_pair=True has_pair_±0.5=False/False
003: (x,y)=(0.10000,0.40000) z_set=[0.1, 0.9] : has_pair=True has_pair_±0.5=False/False
... (中略) ...
048: (x,y)=(0.90000,0.80000) z_set=[0.3, 0.7] : has_pair=True has_pair_±0.5=False/False

Press ENTER to terminate>>

グラフィックウィンドウが表示され、Press ENTER to terminate>> と表示されます。Enterキーを押すと、グラフィックウィンドウが閉じられ、プログラムが終了します。