from aimstools.misc import *
from aimstools.preparation import FHIAimsSetup
from aimstools.preparation.templates import (
vibes_phonopy_template,
vibes_relaxation_template,
vibes_slurm_template,
)
from aimstools.preparation.utilities import monkhorstpack2kptdensity
from pathlib import Path
import os
[docs]class FHIVibesSetup(FHIAimsSetup):
"""Sets up calculation with FHI-vibes."""
def __init__(self, geometryfile, **kwargs) -> None:
super().__init__(geometryfile, **kwargs)
self.basis = kwargs.get("basis", "tight")
[docs] def setup_relaxation(self, overwrite=False):
logger.debug("Setting up relaxation with FHI-vibes.")
xc = self.aseargs["xc"]
basis = self.basis
tier = self.aseargs["tier"]
k_grid = self.aseargs["k_grid"]
spin = self.aseargs["spin"]
k_density = monkhorstpack2kptdensity(self.structure, k_grid)
calculator_kwargs = []
vibes_kwargs = []
if spin == "collinear":
calculator_kwargs.append("default_initial_moment: 0.1")
if not self.structure.is_2d():
vibes_kwargs.append(
"\n[calculator.kpoints]\ndensity: {:.2f}".format(k_density)
)
else:
calculator_kwargs.append("k_grid: {:d} {:d} {:d}".format(*k_grid))
calculator_kwargs = "\n".join(str(k) for k in calculator_kwargs)
vibes_kwargs = "\n".join(str(k) for k in vibes_kwargs)
mask = "[1,1,1,1,1,1]" if not self.structure.is_2d() else "[1,1,0,0,0,1]"
template = vibes_relaxation_template.format(
xc=xc,
basis=basis,
tier=tier,
mask=mask,
spin=spin,
calculator_kwargs=calculator_kwargs,
vibes_kwargs=vibes_kwargs,
)
relaxationfile = self.dirpath.joinpath("relaxation.in")
if relaxationfile.exists() and (overwrite == False):
logger.warning(
"File relaxation.in already exists. Set overwrite=True to force overwrite."
)
if not relaxationfile.exists() or overwrite:
logger.info("Writing file {} ...".format(relaxationfile))
with open(self.dirpath.joinpath("relaxation.in"), "w") as file:
file.write(template)
[docs] def setup_phonopy(self, overwrite=False):
logger.debug("Setting up phonon calculation with FHI-vibes.")
xc = self.aseargs["xc"]
basis = self.basis
tier = self.aseargs["tier"]
k_grid = self.aseargs["k_grid"]
spin = self.aseargs["spin"]
k_density = monkhorstpack2kptdensity(self.structure, k_grid)
calculator_kwargs = []
vibes_kwargs = []
if spin == "collinear":
calculator_kwargs.append("default_initial_moment: 0.1")
if not self.structure.is_2d():
vibes_kwargs.append(
"\n[calculator.kpoints]\ndensity: {:.2f}".format(k_density)
)
else:
calculator_kwargs.append("k_grid: {:d} {:d} {:d}".format(*k_grid))
calculator_kwargs = "\n".join(str(k) for k in calculator_kwargs)
vibes_kwargs = "\n".join(str(k) for k in vibes_kwargs)
template = vibes_phonopy_template.format(
xc=xc,
basis=basis,
tier=tier,
spin=spin,
calculator_kwargs=calculator_kwargs,
vibes_kwargs=vibes_kwargs,
)
phonopyfile = self.dirpath.joinpath("phonopy.in")
if phonopyfile.exists() and (overwrite == False):
logger.warning(
"File phonopy.in already exists. Set overwrite=True to force overwrite."
)
if not phonopyfile.exists() or overwrite:
logger.info("Writing file {} ...".format(phonopyfile))
with open(self.dirpath.joinpath("phonopy.in"), "w") as file:
file.write(template)
[docs] def write_submission_file(self, task, overwrite=False):
assert task in ["relaxation", "phonopy"], "Task for FHI-vibes not recognized."
templatefile = os.getenv("VIBES_SLURM_TEMPLATE")
if templatefile == None:
template = vibes_slurm_template
else:
with open(templatefile, "r") as file:
template = file.read()
jobname = self.structure.atoms.get_chemical_formula().format("metal")
if task == "relaxation":
jobname += "_relax"
elif task == "phonopy":
jobname += "_phon"
template = template.format(jobname=jobname, task=task)
submitfile = self.dirpath.joinpath("submit.sh")
if submitfile.exists() and (overwrite == False):
logger.warning(
"File submit.sh already exists. Set overwrite=True to force overwrite."
)
if not submitfile.exists() or overwrite:
logger.info("Writing {} ...".format(submitfile))
with open(submitfile, "w") as file:
file.write(template)