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 ファイル作成クラスを使った上記スクリプトの一般化