基本的な思想

en ja

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 側で配置領域へ変換します。