# pypackmol (in RMC_DFT) Packmol 利用の簡便化のための python パッケージ(nakada) ## pacmol公式サイト - [公式サイト](https://m3g.iqm.unicamp.br/packmol/) - [公式 tar.gz (最新版)](https://m3g.iqm.unicamp.br/packmol/packmol.tar.gz) - [github](https://github.com/m3g/packmol) ## linux ```aiignore wget https://m3g.iqm.unicamp.br/packmol/packmol.tar.gz tar xzf packmol.tar.gz cd packmol make ``` ## for Mac ```aiignore 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 ```python 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 ファイル作成クラスを使った上記スクリプトの一般化 ``` ```