point_group.py 技術ドキュメント

プログラムの動作

point_group.py は、結晶学における点群の対称操作を解析、可視化、および計算するためのPythonユーティリティです。このプログラムは、指定された点群について以下の機能を提供し、研究者や学生が結晶構造の対称性を理解し、具体的なベクトル操作を行うことを支援します。

  • 点群のリスト表示: 32種類の結晶点群(Hermann–Mauguin記号)の一覧を表示します。

  • 対称操作の詳細表示: 指定された点群に含まれる全ての対称操作を3x3の直交行列として出力し、それぞれの操作が恒等操作、反転、回転、鏡映、または回反のいずれであるかを分類して表示します。

  • ステレオ投影図の生成: 指定された点群の対称要素(回転軸、鏡映面)と、任意のシードベクトルを点群の操作で展開した結果の方向をステレオ投影図として可視化します。これにより、対称性の直感的な理解を深めることができます。

  • 方向の展開(数値出力): 指定されたシードベクトルを点群の全ての対称操作で展開し、得られる一意な方向ベクトルの集合を数値リストとして出力します。

このプログラムは、結晶の物理的性質(例:光学特性、弾性、磁性)がその点群対称性によって強く影響されるため、これらの分野における解析ツールとして役立ちます。特に、対称的に等価な方向の特定や、特定の対称要素の存在確認に有用です。

原理

point_group.py は、主に以下の数学的・幾何学的原理とアルゴリズムに基づいています。

  1. 点群と対称操作: 結晶点群は、ある一点を不動点として結晶構造を不変に保つ全ての対称操作の集合です。各対称操作は3x3の直交行列 \(R\) で表現されます。

    • 恒等操作 (Identity): \(R = I\) (単位行列)

    • 反転 (Inversion): \(R = -I\)

    • 回転 (Rotation): \(\det(R) = 1\)。回転軸に沿って物体を回転させます。回転角度 \(\theta\) は行列のトレース \(\text{tr}(R)\) から、以下の関係で求められます。 $\(\text{tr}(R) = 1 + 2 \cos \theta\)$

    • 鏡映 (Mirror): \(\det(R) = -1\) かつ \(R^2 = I\) (数値的には \(R^2 \approx I\))。特定の平面に関して物体を鏡像反転させます。

    • 回反 (Rotoinversion): \(\det(R) = -1\) かつ \(R^2 \neq I\)。回転と反転の組み合わせです。

  2. 直交行列の数値安定化: 浮動小数点計算の誤差により、対称操作を表す行列が厳密な直交行列(\(R R^T = I\) および \(|\det(R)| = 1\))からわずかにずれることがあります。本プログラムでは、tkpointgroup ライブラリの tkg.snap_matrix 関数(特異値分解 SVD を利用)を用いて、最も近い直交行列に射影し、数値的な安定性を確保しています。

  3. 方向の展開 (Group Orbit): 与えられた初期ベクトル \(\mathbf{v}_0\) に対して、点群 \(G = \{R_1, R_2, \ldots, R_n\}\) の全ての対称操作 \(R_i\) を作用させることで、新しいベクトルの集合 \(\{R_1 \mathbf{v}_0, R_2 \mathbf{v}_0, \ldots, R_n \mathbf{v}_0\}\) が得られます。これを群軌道 (group orbit) と呼び、対称的に等価な方向の集合を表します。 プログラムでは、これらのベクトルを正規化し、さらに \(z<0\) の場合は \(-1\) 倍して \(z \ge 0\) の上半球にマッピングし、浮動小数点誤差を考慮した重複排除を行って一意な方向のみを抽出します。

  4. 対称要素の抽出:

    • 回転軸: 対称操作行列 \(R\) の固有ベクトルで、固有値が \(1\) となるものが回転軸の方向を示します。

    • 鏡映面法線: 鏡映操作行列 \(R\) の固有ベクトルで、固有値が \(-1\) となるものが鏡映面への法線方向を示します。

  5. ステレオ投影 (Stereographic Projection): 3次元の単位球面上の点 \((x, y, z)\) を2次元平面 \((x', y')\) に投影する手法です。南極 \((0, 0, -1)\) を投影中心とし、点 \((x, y, z)\) と南極を結ぶ直線が \(z=0\) 平面と交わる点が投影点となります。 その座標変換式は以下のようになります。 $\(x' = \frac{x}{1+z}\)\( \)\(y' = \frac{y}{1+z}\)\( プログラムでは、上半球(\)z \ge 0$)の点のみを扱い、下半球の点は対応する上半球の点に反転させてから投影します。これにより、全ての方向を単位円内にプロットできます。

  6. 点群記号の正規化: Hermann–Mauguin記号は多様な形式を持つため、内部的には tkpointgroup ライブラリがより一般的なSchoenflies記号などに変換して対称操作行列を構築します。本プログラムでは、ユーザーが指定したHermann–Mauguin記号を _pg_symbol_for_tkg 関数で tkpointgroup が理解できる形式に変換するロジックを含んでいます。

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

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

  • numpy: 数値計算、特に多次元配列(行列やベクトル)の操作に使用されます。

  • matplotlib: グラフ描画ライブラリで、ステレオ投影図の生成と表示に使用されます。

  • tkpointgroup: 結晶点群の対称操作行列を効率的に生成するためのライブラリです。

これらのライブラリは、Pythonのパッケージ管理ツール pip を使ってインストールできます。コマンドライン(またはターミナル)で以下のコマンドを実行してください。

pip install numpy matplotlib tkpointgroup

必要な入力ファイル

point_group.py は、入力ファイルとして特定のファイルを必要としません。全ての入力情報は、コマンドライン引数として直接プログラムに渡されます。

  • 点群記号: Hermann–Mauguin 記号(例: 4mm, -3m, m-3m)またはその別名(例: Td, Oh)を —pg オプションで指定します。

  • シード方向ベクトル: 3次元ベクトルを —vec オプションで文字列として指定します(例: '0.8,0.1,0.05' または '0.8 0.1 0.05')。

生成される出力ファイル

point_group.py は、ファイル形式での出力を生成しません。全ての出力は以下の形式で提供されます。

  1. 標準出力 (Stdout):

    • list モード: 32種類の結晶点群のHermann–Mauguin記号のリスト。

    • pg モード: 指定された点群に含まれる各対称操作の3x3行列と、その操作の種類(Identity, Inversion, Rotation, Mirror, Rotoinversion)が整形されたテキスト形式で出力されます。

    • expand モード: 指定されたシードベクトルを点群の操作で展開した結果として得られる、一意な方向ベクトルの座標リストが出力されます。各ベクトルは正規化され、z座標が正になるように調整されています。

    • stereo モード: ステレオ投影図の生成に加えて、展開された方向ベクトルの座標リストが標準出力にも出力されます。

  2. グラフィカルウィンドウ:

    • stereo モード: matplotlib ライブラリを使用して、ステレオ投影図が独立したグラフィカルウィンドウに表示されます。この図には、回転軸(白抜きの三角)、鏡映面(破線の大円)、および展開された方向(青い丸、オプションで番号付き)がプロットされます。

プログラムの実行が完了した後、またはグラフィカルウィンドウが表示されている状態では、ユーザーはEnterキーを押すことでプログラムを終了するよう促されます。

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

point_group.py は、以下の基本形式でコマンドラインから実行されます。

python point_group.py <mode> [options]
  • <mode>: 実行する機能を選択します。以下のいずれかを指定します。

    • list: 利用可能な32種の結晶点群(Hermann–Mauguin)をリスト表示します。

    • pg: 指定された点群の対称操作行列とその種類を表示します。

    • stereo: 指定された点群のステレオ投影図を表示します。回転軸、鏡映面、展開された方向が含まれます。

    • expand: 指定されたシードベクトルを点群の操作で展開した、一意な方向の座標を数値で出力します。

  • [options]: 以下のオプション引数を指定できます。

    • --pg <symbol>, -p <symbol>: 処理対象とする点群のHermann–Mauguin記号(例: 4mm, -3m, m-3m)またはSchoenflies記号の別名(例: Td, C3v)を指定します。list モード以外では必須です。

    • --vec <x,y,z>, --vec "<x y z>": stereo モードや expand モードで使用するシード方向ベクトルを、コンマ区切りまたはスペース区切りの3つの浮動小数点数で指定します。デフォルト値は '0.8,0.1,0.05' です。

    • --no-anno: stereo モードで展開された方向点に付与される番号ラベルを非表示にします。

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

1. 利用可能な点群のリスト表示

利用可能な結晶点群の一覧を表示します。

python point_group.py list

実行結果(一部抜粋):

--- Available Crystal Point Groups (H–M) ---
  1: 1
  2: -1
  3: 2
  4: m
  5: 2/m
...
 30: 432
 31: -43m
 32: m-3m

Press ENTER to terminate>>

2. 特定の点群の対称操作を表示

点群 Td の全ての対称操作行列とその種類を表示します。

python point_group.py pg --pg Td

実行結果(一部抜粋):

--- Point Group: Td  (mapped as 'Td') ---
Total symmetry operations: 24

Operation 01: Identity
[ 1.00000  0.00000  0.00000]
[ 0.00000  1.00000  0.00000]
[ 0.00000  0.00000  1.00000]

Operation 02: Rotation C3
[ 0.00000  0.00000  1.00000]
[ 1.00000  0.00000  0.00000]
[ 0.00000  1.00000  0.00000]

... (以下24個の操作が続く) ...

Operation 24: Rotoinversion S4
[ 0.00000  1.00000  0.00000]
[-1.00000  0.00000  0.00000]
[ 0.00000  0.00000  1.00000]

Press ENTER to terminate>>

3. シードベクトルを点群操作で展開した方向の数値出力

点群 C3v を使用し、シードベクトル (0.1, 0.2, 0.3) を展開した結果の方向を数値で表示します。

python point_group.py expand --pg C3v --vec "0.1 0.2 0.3"

実行結果:

--- Expanded directions (hemisphere, unique) for PG C3v from (0.287,0.573,0.781) ---
01: ( 0.287349,  0.574697,  0.778841)
02: ( 0.574697,  0.287349,  0.778841)
03: (-0.574697, -0.287349,  0.778841)
04: ( 0.287349, -0.574697,  0.778841)
05: (-0.287349,  0.574697,  0.778841)
06: (-0.287349, -0.574697,  0.778841)

Press ENTER to terminate>>

4. 点群のステレオ投影図の表示

点群 D2h のステレオ投影図を表示します。デフォルトのシードベクトルが使用され、展開された方向は番号付けされます。図が表示された後、Enterキーを押すとプログラムが終了します。

python point_group.py stereo --pg D2h

実行結果: Matplotlibによって生成されたステレオ投影図のウィンドウが表示されます。この図には、D2h 点群の回転軸、鏡映面の大円、およびデフォルトのシードベクトルから展開された方向点がプロットされ、各点には番号が振られます。同時に、標準出力には展開された方向の座標リストが表示されます。

--- Expanded directions (hemisphere, unique) for PG D2h (mapped 'D2h') from seed (0.8,0.1,0.05) ---
01: ( 0.993707,  0.124213,  0.062107)
02: ( 0.993707, -0.124213,  0.062107)
03: (-0.993707,  0.124213,  0.062107)
04: (-0.993707, -0.124213,  0.062107)

Press ENTER to close>>
Press ENTER to terminate>>

5. ステレオ投影図で番号ラベルなしの表示

点群 Oh のステレオ投影図を、展開された方向点に番号を振らずに表示します。

python point_group.py stereo --pg Oh --no-anno

実行結果: D2h の例と同様にステレオ投影図が表示されますが、展開された方向点には番号が表示されません。標準出力には展開された方向の座標リストが出力されます。

--- Expanded directions (hemisphere, unique) for PG Oh (mapped 'Oh') from seed (0.8,0.1,0.05) ---
01: ( 0.993707,  0.124213,  0.062107)
... (以下、多数の方向が続く) ...
48: (-0.124213,  0.062107,  0.993707)

Press ENTER to close>>
Press ENTER to terminate>>