from dargs import Argument, Variant
from dpgen.arginfo import general_mdata_arginfo
[docs]
def init_bulk_mdata_arginfo() -> Argument:
"""Generate arginfo for dpgen init_bulk mdata.
Returns
-------
Argument
arginfo
"""
return general_mdata_arginfo("init_bulk_mdata", ("fp",))
[docs]
def init_surf_mdata_arginfo() -> Argument:
"""Generate arginfo for dpgen init_surf mdata.
Returns
-------
Argument
arginfo
"""
return general_mdata_arginfo("init_surf_mdata", ("fp",))
[docs]
def init_reaction_mdata_arginfo() -> Argument:
"""Generate arginfo for dpgen init_reaction mdata.
Returns
-------
Argument
arginfo
"""
return general_mdata_arginfo("init_reaction_mdata", ("reaxff", "build", "fp"))
[docs]
def init_bulk_vasp_args() -> list[Argument]:
return []
[docs]
def init_bulk_abacus_args() -> list[Argument]:
doc_relax_kpt = 'Path of `KPT` file for relaxation in stage 1. Only useful if `init_fp_style` is "ABACUS".'
doc_md_kpt = 'Path of `KPT` file for MD simulations in stage 3. Only useful if `init_fp_style` is "ABACUS".'
doc_atom_masses = 'List of atomic masses of elements. The order should be the same as `Elements`. Only useful if `init_fp_style` is "ABACUS".'
return [
Argument("relax_kpt", str, optional=True, doc=doc_relax_kpt),
Argument("md_kpt", str, optional=True, doc=doc_md_kpt),
Argument("atom_masses", list[float], optional=True, doc=doc_atom_masses),
]
[docs]
def init_bulk_variant_type_args() -> list[Variant]:
doc_init_fp_style = "First-principle software. If this key is absent."
return [
Variant(
"init_fp_style",
[
Argument(
"VASP",
dict,
init_bulk_vasp_args(),
doc="No more parameters is needed to be added.",
),
Argument("ABACUS", dict, init_bulk_abacus_args(), doc="ABACUS"),
],
default_tag="VASP",
optional=True,
doc=doc_init_fp_style,
)
]
[docs]
def init_bulk_jdata_arginfo() -> Argument:
"""Generate arginfo for dpgen init_bulk jdata.
Returns
-------
Argument
dpgen init_bulk jdata arginfo
"""
doc_init_bulk = "Generate initial data for bulk systems."
doc_stages = "Stages for `init_bulk`."
doc_elements = "Atom types."
doc_potcars = "Path of POTCAR."
doc_cell_type = "Specifying which typical structure to be generated. **Options** include fcc, hcp, bcc, sc, diamond."
doc_super_cell = "Size of supercell."
doc_from_poscar = "Deciding whether to use a given poscar as the beginning of relaxation. If it's true, keys (`cell_type`, `latt`) will be aborted. Otherwise, these two keys are **necessary**."
doc_from_poscar_path = "Path of POSCAR for VASP or STRU for ABACUS. **Necessary** if `from_poscar` is true."
doc_relax_incar = "Path of INCAR for VASP or INPUT for ABACUS for relaxation in VASP. **Necessary** if `stages` include 1."
doc_md_incar = "Path of INCAR for VASP or INPUT for ABACUS for MD in VASP. **Necessary** if `stages` include 3."
doc_scale = "Scales for isotropic transforming cells."
doc_skip_relax = "If it's true, you may directly run stage 2 (perturb and scale) using an unrelaxed POSCAR."
doc_pert_numb = "Number of perturbations for each scaled (key `scale`) POSCAR."
doc_pert_box = "Anisotropic Perturbation for cells (independent changes of lengths of three box vectors as well as angel among) in decimal formats. 9 elements of the 3x3 perturbation matrix will be randomly sampled from a uniform distribution (default) in the range [-pert_box, pert_box]. Such a perturbation matrix adds the identity matrix gives the actual transformation matrix for this perturbation operation."
doc_pert_atom = "Perturbation of atom coordinates (Angstrom). Random perturbations are performed on three coordinates of each atom by adding values randomly sampled from a uniform distribution in the range [-pert_atom, pert_atom]."
doc_md_nstep = "Steps of AIMD in stage 3. If it's not equal to settings via `NSW` in `md_incar`, DP-GEN will follow `NSW`."
doc_coll_ndata = "Maximal number of collected data."
doc_type_map = (
"The indices of elements in deepmd formats will be set in this order."
)
return Argument(
"init_bulk_jdata",
dict,
[
Argument("stages", list[int], optional=False, doc=doc_stages),
Argument("elements", list[str], optional=False, doc=doc_elements),
Argument("potcars", list[str], optional=True, doc=doc_potcars),
Argument("cell_type", str, optional=True, doc=doc_cell_type),
Argument("super_cell", list[int], optional=False, doc=doc_super_cell),
Argument(
"from_poscar", bool, optional=True, default=False, doc=doc_from_poscar
),
Argument("from_poscar_path", str, optional=True, doc=doc_from_poscar_path),
Argument("relax_incar", str, optional=True, doc=doc_relax_incar),
Argument("md_incar", str, optional=True, doc=doc_md_incar),
Argument("scale", list[float], optional=False, doc=doc_scale),
Argument("skip_relax", bool, optional=False, doc=doc_skip_relax),
Argument("pert_numb", int, optional=False, doc=doc_pert_numb),
Argument("pert_box", float, optional=False, doc=doc_pert_box),
Argument("pert_atom", float, optional=False, doc=doc_pert_atom),
Argument("md_nstep", int, optional=False, doc=doc_md_nstep),
Argument("coll_ndata", int, optional=False, doc=doc_coll_ndata),
Argument("type_map", list[str], optional=True, doc=doc_type_map),
],
sub_variants=init_bulk_variant_type_args(),
doc=doc_init_bulk,
)
[docs]
def init_surf_jdata_arginfo() -> Argument:
"""Generate arginfo for dpgen init_surf jdata.
Returns
-------
Argument
dpgen init_surf jdata arginfo
"""
doc_init_surf = "Generate initial data for surface systems."
doc_stages = "Stages for `init_surf`."
doc_elements = "Atom types."
doc_potcars = "Path of POTCAR."
doc_cell_type = "Specifying which typical structure to be generated. **Options** include fcc, hcp, bcc, sc, diamond."
doc_super_cell = "Size of supercell."
doc_from_poscar = "Deciding whether to use a given poscar as the beginning of relaxation. If it's true, keys (`cell_type`, `latt`) will be aborted. Otherwise, these two keys are **necessary**."
doc_from_poscar_path = "Path of POSCAR for VASP or STRU for ABACUS. **Necessary** if `from_poscar` is true."
doc_latt = "Lattice constant for single cell."
doc_layer_numb = "Number of atom layers constructing the slab."
doc_z_min = "Thickness of slab without vacuum (Angstrom). If `layer_numb` is set, `z_min` will be ignored."
doc_vacuum_max = "Maximal thickness of vacuum (Angstrom)."
doc_vacuum_min = "Minimal thickness of vacuum (Angstrom). Default value is 2 times atomic radius."
doc_vacuum_resol = "Interval of thickness of vacuum. If size of `vacuum_resol` is 1, the interval is fixed to its value. If size of `vacuum_resol` is 2, the interval is `vacuum_resol[0]` before `mid_point`, otherwise `vacuum_resol[1]` after `mid_point`."
doc_vacuum_numb = (
"The total number of vacuum layers **Necessary** if vacuum_resol is empty."
)
doc_mid_point = "The mid point separating head region and tail region. **Necessary** if the size of vacuum_resol is 2 or 0."
doc_head_ratio = "Ratio of vacuum layers in the nearby region with denser intervals(head region). **Necessary** if vacuum_resol is empty."
doc_millers = "Miller indices."
doc_relax_incar = (
"Path of INCAR for relaxation in VASP. **Necessary** if `stages` include 1."
)
doc_scale = "Scales for isotropic transforming cells."
doc_skip_relax = "If it's true, you may directly run stage 2 (perturb and scale) using an unrelaxed POSCAR."
doc_pert_numb = "Number of perturbations for each scaled (key `scale`) POSCAR."
doc_pert_box = "Anisotropic Perturbation for cells (independent changes of lengths of three box vectors as well as angel among) in decimal formats. 9 elements of the 3x3 perturbation matrix will be randomly sampled from a uniform distribution (default) in the range [-pert_box, pert_box]. Such a perturbation matrix adds the identity matrix gives the actual transformation matrix for this perturbation operation."
doc_pert_atom = "Perturbation of atom coordinates (Angstrom). Random perturbations are performed on three coordinates of each atom by adding values randomly sampled from a uniform distribution in the range [-pert_atom, pert_atom]."
doc_coll_ndata = "Maximal number of collected data."
return Argument(
"init_surf_jdata",
dict,
[
Argument("stages", list[int], optional=False, doc=doc_stages),
Argument("elements", list[str], optional=False, doc=doc_elements),
Argument("potcars", list[str], optional=True, doc=doc_potcars),
Argument("cell_type", str, optional=True, doc=doc_cell_type),
Argument("super_cell", list[int], optional=False, doc=doc_super_cell),
Argument(
"from_poscar", bool, optional=True, default=False, doc=doc_from_poscar
),
Argument("from_poscar_path", str, optional=True, doc=doc_from_poscar_path),
Argument("latt", float, optional=False, doc=doc_latt),
Argument("layer_numb", int, optional=True, doc=doc_layer_numb),
Argument("z_min", int, optional=True, doc=doc_z_min),
Argument("vacuum_max", float, optional=False, doc=doc_vacuum_max),
Argument("vacuum_min", float, optional=True, doc=doc_vacuum_min),
Argument("vacuum_resol", list[float], optional=False, doc=doc_vacuum_resol),
Argument("vacuum_numb", int, optional=True, doc=doc_vacuum_numb),
Argument("mid_point", float, optional=True, doc=doc_mid_point),
Argument("head_ratio", float, optional=True, doc=doc_head_ratio),
Argument("millers", list[list[int]], optional=False, doc=doc_millers),
Argument("relax_incar", str, optional=True, doc=doc_relax_incar),
Argument("scale", list[float], optional=False, doc=doc_scale),
Argument("skip_relax", bool, optional=False, doc=doc_skip_relax),
Argument("pert_numb", int, optional=False, doc=doc_pert_numb),
Argument("pert_box", float, optional=False, doc=doc_pert_box),
Argument("pert_atom", float, optional=False, doc=doc_pert_atom),
Argument("coll_ndata", int, optional=False, doc=doc_coll_ndata),
],
doc=doc_init_surf,
)
[docs]
def init_reaction_jdata_arginfo() -> Argument:
"""Generate arginfo for dpgen init_reaction jdata.
Returns
-------
Argument
dpgen init_reaction jdata arginfo
"""
doc_init_reaction = "Generate initial data for reactive systems for small gas-phase molecules, from a ReaxFF NVT MD trajectory."
doc_type_map = (
'Type map, which should match types in the initial data. e.g. ["C", "H", "O"]'
)
doc_reaxff = "Parameters for ReaxFF NVT MD."
doc_data = "Path to initial LAMMPS data file. The atom_style should be charge."
doc_ff = (
"Path to ReaxFF force field file. Available in the lammps/potentials directory."
)
doc_control = "Path to ReaxFF control file."
doc_temp = "Target Temperature for the NVT MD simulation. Unit: K."
doc_dt = "Real time for every time step. Unit: fs."
doc_tau_t = "Time to determine how rapidly the temperature. Unit: fs."
doc_dump_frep = "Frequency of time steps to collect trajectory."
doc_nstep = "Total steps to run the ReaxFF MD simulation."
doc_cutoff = "Cutoff radius to take clusters from the trajectory. Note that only a complete molecule or free radical will be taken."
doc_dataset_size = "Collected dataset size for each bond type."
doc_qmkeywords = 'Gaussian keywords for first-principle calculations. e.g. force mn15/6-31g** Geom=PrintInputOrient. Note that "force" job is necessary to collect data. Geom=PrintInputOrient should be used when there are more than 50 atoms in a cluster.'
return Argument(
"init_reaction_jdata",
dict,
[
Argument("type_map", list[str], doc=doc_type_map),
Argument(
"reaxff",
dict,
[
Argument("data", str, doc=doc_data),
Argument("ff", str, doc=doc_ff),
Argument("control", str, doc=doc_control),
Argument("temp", [float, int], doc=doc_temp),
Argument("dt", [float, int], doc=doc_dt),
Argument("tau_t", [float, int], doc=doc_tau_t),
Argument("dump_freq", int, doc=doc_dump_frep),
Argument("nstep", int, doc=doc_nstep),
],
doc=doc_reaxff,
),
Argument("cutoff", float, doc=doc_cutoff),
Argument("dataset_size", int, doc=doc_dataset_size),
Argument("qmkeywords", str, doc=doc_qmkeywords),
],
doc=doc_init_reaction,
)