Source code for atomate2.vasp.jobs.mpmorph

"""Jobs that compose MPMorph flows."""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import TYPE_CHECKING

from atomate2.common.flows.mpmorph import FastQuenchMaker, SlowQuenchMaker
from atomate2.vasp.jobs.md import MDMaker
from atomate2.vasp.jobs.mp import MPGGARelaxMaker, MPGGAStaticMaker
from atomate2.vasp.powerups import update_user_incar_settings
from atomate2.vasp.sets.mpmorph import MPMorphMDSetGenerator

if TYPE_CHECKING:
    from pathlib import Path

    from jobflow import Flow, Job
    from pymatgen.core import Structure

    from atomate2.vasp.jobs.base import BaseVaspMaker
    from atomate2.vasp.sets.base import VaspInputGenerator


[docs] @dataclass class BaseMPMorphMDMaker(MDMaker): """ Maker to create VASP molecular dynamics jobs for amorphous materials. Parameters ---------- name : str The job name. input_set_generator : .VaspInputSetGenerator A generator used to make the input set. write_input_set_kwargs : dict Keyword arguments that will get passed to :obj:`.write_vasp_input_set`. copy_vasp_kwargs : dict Keyword arguments that will get passed to :obj:`.copy_vasp_outputs`. run_vasp_kwargs : dict Keyword arguments that will get passed to :obj:`.run_vasp`. task_document_kwargs : dict Keyword arguments that will get passed to :obj:`.TaskDoc.from_directory`. stop_children_kwargs : dict Keyword arguments that will get passed to :obj:`.should_stop_children`. write_additional_data : dict Additional data to write to the current directory. Given as a dict of {filename: data}. Note that if using FireWorks, dictionary keys cannot contain the "." character which is typically used to denote file extensions. To avoid this, use the ":" character, which will automatically be converted to ".". E.g. ``{"my_file:txt": "contents of the file"}``. """ name: str = "MPMorph MD Maker" input_set_generator: VaspInputGenerator = field( default_factory=MPMorphMDSetGenerator )
[docs] @dataclass class SlowQuenchVaspMaker(SlowQuenchMaker): """Slow quench from high to low temperature structures using VASP MDMaker. Quenches a provided structure with a molecular dynamics run from a desired high temperature to a desired low temperature. Flow creates a series of MD runs that holds at a certain temperature and initiates the following MD run at a lower temperature (step-wise temperature MD runs). Parameters ---------- name : str Name of the flows produced by this maker. md_maker : BaseMPMorphMDMaker MDMaker to generate the molecular dynamics jobs specifically for MPMorph AIMD; inherits from MDMaker (VASP) quench_start_temperature : float = 3000 Starting temperature for quench; default 3000K quench_end_temperature : float = 500 Ending temperature for quench; default 500K quench_temperature_step : int = 500 Temperature step for quench; default 500K drop quench_n_steps : int = 1000 Number of steps for quench; default 1000 steps """ name: str = "vasp slow quench" md_maker: BaseVaspMaker = field(default_factory=BaseMPMorphMDMaker)
[docs] def call_md_maker( self, structure: Structure, temp: float | tuple[float, float], prev_dir: str | Path | None = None, ) -> Flow | Job: """Call the VASP MD maker. Parameters ---------- structure : .Structure A pymatgen structure object. temp : float or tuple[float, float] The temperature in Kelvin. prev_dir : str or Path or None A previous calculation directory to copy output files from. Returns ------- A slow quench .Flow or .Job """ incar_updates = { "NSW": self.quench_n_steps, "TEBEG": temp[0] if isinstance(temp, tuple) else temp, "TEEND": temp[1] if isinstance(temp, tuple) else temp, } self.md_maker = update_user_incar_settings( flow=self.md_maker, incar_updates=incar_updates, ) self.md_maker = self.md_maker.update_kwargs( update={"name": f"Vasp Slow Quench MD Maker {temp}K"} ) return self.md_maker.make(structure=structure, prev_dir=prev_dir)
[docs] @dataclass class FastQuenchVaspMaker(FastQuenchMaker): """Fast quench from high temperature to 0K structures with VASP. Quenches a provided structure with a single (or double) relaxation and a static calculation at 0K. NOTE: By default, same as atomate2.vasp.flows.mp.MPGGADoubleRelaxMaker. This exists for the user to structure a FastQuenchMaker more easily. This is built for consistency with MPMorph flows. Parameters ---------- name : str Name of the flows produced by this maker. relax_maker : ForceFieldRelaxMaker Relax Maker relax_maker2 : ForceFieldRelaxMaker Relax Maker for a second relaxation; useful for tighter convergence static_maker : ForceFieldStaticMaker Static Maker """ name: str = "Vasp fast quench" relax_maker: BaseVaspMaker = field(default_factory=MPGGARelaxMaker) relax_maker2: BaseVaspMaker = field( default_factory=lambda: MPGGARelaxMaker( copy_vasp_kwargs={"additional_vasp_files": ("WAVECAR", "CHGCAR")} ) ) static_maker: BaseVaspMaker = field( default_factory=lambda: MPGGAStaticMaker( copy_vasp_kwargs={"additional_vasp_files": ("WAVECAR", "CHGCAR")} ) )