pypackmol (in RMC_DFT)
Packmol 利用の簡便化のための python パッケージ(nakada)
pacmol公式サイト
linux
wget https://m3g.iqm.unicamp.br/packmol/packmol.tar.gz
tar xzf packmol.tar.gz
cd packmol
make
for Mac
brew install gcc
tar xzf packmol.tar.gz
cd packmol
FC=gfortran-14 F77=gfortran-14 ./configure
make
フォルダに対してパスを通すか、コピーして使う
公式packmolモジュール
使わない
https://github.com/m3g/Packmol.jl#packmol
ただの packmol の実行のための(subprocess)するだけのラッパー
入力ファイル(packmol.inp)
rmc_dft.packmol.packmol.Packmol
基本的な使い方1
from x_logger import XLogger
from rmc_dft.packmol.packmol import Packmol
def main() -> None:
logger = XLogger()
comment = "FeSiB amorphous generated by Packmol"
PACKMOL = "/Users/nakada/packmol/bin/packmol"
result_xyz_file = "amorphous/FeSiB_amorphous.xyz"
Fe_xyz_file = "amorphous/Fe.xyz"
Si_xyz_file = "amorphous/Si.xyz"
B_xyz_file = "amorphous/B.xyz"
##########################
N_tot = 500 # セルの原子数
rho_g_cm3 = 7.35 # 質量密度
ratios = [80, 9, 11] # 化学量論比
symbols = ["Fe", "Si", "B"]
##########################
pm = Packmol()
n_per_A3 = pm.number_density_from_mass_density(symbols, ratios, rho_g_cm3)
# mass_density_g_cm3 = pm.mass_density_from_number_density(symbols, ratios, number_density_A3)
# Fe-Si-B の総原子数からそれぞれの原子数を決める,化学量論比はすでに決定済み
counts = pm.compute_element_counts(symbols, ratios, N_tot)
N_Fe = counts["Fe"]
N_Si = counts["Si"]
N_B = counts["B"]
L = pm.cell_length_from_number_density(N_tot, n_per_A3)
logger.info(f'{counts}')
logger.info(f'L = {L:.6f}')
with open(result_xyz_file, "w") as f:
f.write("tolerance 2.0\n")
f.write("filetype xyz\n")
f.write(f"output {result_xyz_file}\n\n")
# Fe
f.write(f"structure {Fe_xyz_file}\n")
f.write(f" number {N_Fe}\n")
f.write(f" inside box 0.0 0.0 0.0 {L:.6f} {L:.6f} {L:.6f}\n")
f.write("end structure\n\n")
# Si
f.write(f"structure {Si_xyz_file}\n")
f.write(f" number {N_Si}\n")
f.write(f" inside box 0.0 0.0 0.0 {L:.6f} {L:.6f} {L:.6f}\n")
f.write("end structure\n\n")
# B
f.write(f"structure {B_xyz_file}\n")
f.write(f" number {N_B}\n")
f.write(f" inside box 0.0 0.0 0.0 {L:.6f} {L:.6f} {L:.6f}\n")
f.write("end structure\n")
# --- structure file generation ---
pm.write_single_atom_xyz("Fe.xyz", "Fe")
pm.write_single_atom_xyz("Si.xyz", "Si")
pm.write_single_atom_xyz("B.xyz", "B")
# Packmol を自動実行
pm.run_packmol(packmol_bin=PACKMOL)
# POSCAR
pm.xyz_to_poscar(
"FeSiB_amorphous.xyz",
"POSCAR",
comment=comment,
elements=["Fe", "Si", "B"],
)
if __name__ == "__main__":
main()
rmc_dft.packmol.PackmolInp
input ファイル作成クラスを使った上記スクリプトの一般化