Matlantis で LAMMPS を使う場合は PFPを力場として用いるためにLAMMPSとの連携パッケージ matlantis-lammps が必要です(インストールガイドはこちらです)。
この記事では、matlantis-lammps をインストールした上でさらに、LAMMPS で PFP を用いた計算をする際のインプットの作成についてまとめました(連携パッケージをインストールすると同梱されている lammps.in や READMEを合わせてご覧ください)。
目次
--------
PFPを使うためのLAMMPSインプットの形式
- # からはじまる行はコメントアウト行です。
- units は "metal" (3行目)
- 必要に応じて単位換算が必要です。詳細はLAMMPSの公式マニュアルをご参照ください。
https://docs.lammps.org/units.html - 例えば metal は時間の単位が pico second となっておりますのでご留意ください。
- 熱浴のTdamp(3つめの数字)は時間単位のため対応が必要です。
- units が real の場合の "fix nvt temp 300.0 300.0 100.0" は、metalでは、"fix nvt temp 300.0 300.0 0.1" となります
- 公式マニュアルはこちら(https://docs.lammps.org/fix_nh.html)です。
- 必要に応じて単位換算が必要です。詳細はLAMMPSの公式マニュアルをご参照ください。
- atom_style は "atomic" (5行目)
- "charge" も利用可能ですが 電荷は与えないため "atomic" と同義です。
- "molecular", "full"も利用できます
- atom_styleについて詳細は公式マニュアル(https://docs.lammps.org/atom_style.html)もご覧ください
- pair_style は "pfp_api(半角スペース)v.N.0.0 (PFPバージョン)(半角スペース)CRYSTAL_U0(PFPのcalculationモード)(18行目)
例:
pair_style pfp_api v7.0.0 CRYSTAL
- LightPFPの場合は"light_pfp(半角スペース)examplesv1hienca (モデルID)"とします
例:pair_style light_pfp examplesv1hienca
- LightPFPの場合は"light_pfp(半角スペース)examplesv1hienca (モデルID)"とします
- mass に 構成原子の質量を記述し(15, 16行目)、対応してpair_coeff を species として構成原子を記述(28行目)
- 例:mass 3 16を定義した場合、pair_coeff * * species C O O として mass とpair_coeff を一致させる必要があります。
- 通常、LAMMPSでは inファイルに加えてdataファイルが必要ですが、PFPを用いる場合には、古典力場を使用する際にdataファイルに記載する bond, anglem dihedral, improper 等の設定が不要なため、mass, pair_style を inファイルに記載しています。もちろん、mass, pair_styleを dataファイルに設定して別ファイルとしても問題なく実行可能です。
matlantis-lammpsに含まれている lammps.in はこちらです。
ASE でLAMMPSインプットファイルの作成
CIF ファイルを元に、ASEをつかってPFP用のLAMMPS インプットファイルを作成する方法を紹介します。ここでは、まず 構造の情報を LAMMPS の data ファイルに書き出し、さらに PFP力場を使うために必要な情報を書き込んだ in ファイル を作成します。
- 必要なデータ: CIF ファイル(ここでは test.cif)
- 出力されるデータ : LAMMPSインプットファイル(ここでは test_opt.in, test.data )
1. ライブラリの読み込み、関数の定義
必要なライブラリを読み込み、CIF ファイルを LAMMPS の dataファイルとして書き出し、参考値として分子量を計算する関数を定義します。
LAMMPS data を書き出すときの引数は以下のようにしています。
- format: "lammps-data"
- masses :True
- units : "metal"
- atom_style : "atomic"
- specorder : None
import sys, os
import numpy as np
from ase.data import atomic_numbers
from ase.io import read, write, Trajectory
from ase.io.lammpsdata import read_lammps_data, write_lammps_data
from pfcc_extras.visualize import view_ngl
def cif_to_lammps_ase(cif_file, lammps_file, specorder=None, atom_style='atomic', units='metal'):
atoms = read(cif_file)
atoms.write(lammps_file,
format='lammps-data',
masses=True,
units=units,
atom_style=atom_style,
specorder=specorder
)
mol_weight = np.sum(atoms.get_masses())
return mol_weight
2. 出力ファイル名の指定、data ファイルの作成
出力ファイル名を指定して、1で定義した関数を実行します。
lammps_data_file = "test"
lammps_in_file = "test_opt"
mol_weight = cif_to_lammps_ase("IS(1).cif", lammps_data_file+".data")
print(mol_weight)
読み込んだ data ファイルを描画して確認します。mask_slab ではslab 構造を構成する元素(ここでは例として "Rh")slab を表示させないようにしています。
atoms = read(lammps_data_file+'.data', format='lammps-data', units='metal')
mask_slab = atoms.numbers==atomic_numbers['Rh']
display(view_ngl([atoms, atoms[~mask_slab]], ['ball+stick'], replace_structure=True))
3. cif ファイルを読み込み、pair_coef の取得
以下のように、cif ファイルを ASE の atomsとして読み込み、pair_coef として入力する値を取得します。
ase_atoms = read("test.cif")
species = ase_atoms.symbols.species()
specorder = sorted(list(species), key=lambda x:-atomic_numbers[x])
pair_coeff = ' '.join(specorder)
print(species)
print(pair_coeff)
4. LAMMPS in ファイルの書き出し
in ファイルとして書き出します。
lmp_data = f"./input_ase.data"
lmp_min_in = f"""
units metal
boundary p p p
atom_style atomic
atom_modify map yes
box tilt large
pair_style pfp_api v7.0.0 CRYSTAL_U0_PLUS_D3
read_data {lmp_data}
pair_coeff * * species {pair_coeff}
thermo 100
thermo_style custom step temp pe ke density
neigh_modify every 1 delay 0 check yes
minimize 1e-4 1e-6 10000 1000000
write_data lmp_min.data pair ij
"""
with open(lammps_in_file+".in", "w") as fo:
fo.write(lmp_min_in)
5. LAMMPS実行
!lmp_serial -i {lammps_in_file}.in -log ./opt_log.lammps