基本的な思想
Packmol より一段上の入力を扱う
Packmol が直接扱うのは、構造テンプレート、配置数、配置領域、最小分離距離などです。
一方、構造作成時に利用者が考えたいのは、組成比、総原子数、質量密度または数密度、分子ユニットなどです。
packmol_util は、この二つの層を分離します。
組成・総原子数・密度・構造ユニット
│
▼
packmol_util
│
▼
structure / number / inside box / radius
│
▼
Packmol
利用側では Packmol の入力ファイルを直接文字列として組み立てるのではなく、Python のデータとして条件を与えることを基本とします。
高レベル I/F と低レベル I/F
通常の構造作成では AmorphousBuilder を入口として使います。
一方、セルサイズ計算、Packmol 入力生成、Packmol 実行、XYZ から POSCAR への変換などは下位のクラスから個別に利用できます。
AmorphousBuilder
│
├── model
├── PackmolInp
└── Packmol
高レベル I/F に処理を閉じ込めず、必要な層だけを利用できる構造にしています。
builder
AmorphousBuilder は全体を統合する層です。
主に、
組成比
総原子数
質量密度または数密度
最小分離距離
Packmol に配置する template
をまとめて扱います。
組成比と総原子数から組成単位の倍率を決め、密度からセルサイズを決定し、登録された template を Packmol の入力へ渡します。
packmol
Packmol は Packmol 実行とその周辺処理を担当します。
密度とセルサイズに関する計算、Packmol の実行、XYZ から POSCAR への変換などを担当し、構造 template 自体の定義とは分離されています。
packmol_inp
PackmolInp は Python 側の設定を Packmol の入力形式へ変換します。
たとえば Python 側で登録した構造は、
structure ...
number ...
inside box ...
end structure
という Packmol の入力へ変換されます。
packing radius を元素記号で与えた場合は、XYZ 内の原子順をもとに Packmol の atom index に変換します。
model
model は Packmol に渡す構造 template を扱います。
単原子だけでなく、PO4 のような複数原子からなる構造ユニットも 1 個の template として作成できます。
ここで重要なのは、
分子・構造ユニット内部の幾何
Packmol 配置時の排除距離
を別のものとして扱うことです。
たとえば PO4 内部の P–O 距離は XYZ template の幾何であり、packing radius ではありません。
組成比と総原子数
組成比 [3, 1, 4] は 1 組成単位あたり 8 原子を意味します。
総原子数はこの組成単位を壊さない値である必要があります。
AmorphousBuilder は組成比との整合を取り、実際に使用する総原子数と倍率を保持します。
この倍率は builder.multiplier から参照でき、template の配置数を決める基準として利用できます。
密度からセルサイズを決める
数密度 (\rho_N)、総原子数 (N)、立方セル一辺長 (L) の関係は、
[ L = \left(\frac{N}{\rho_N}\right)^{1/3} ]
です。
質量密度を指定する場合は、組成から平均原子量を求め、数密度へ変換してセルサイズを決定します。
Packmol 自体に密度を解釈させるのではなく、Packmol に渡す前に Python 側で配置領域へ変換します。