Source code for dpgen.generator.lib.vasp

#!/usr/bin/python3


from pymatgen.io.vasp import Incar


def _make_vasp_incar_dict(
    ecut,
    ediff,
    npar,
    kpar,
    kspacing=0.5,
    kgamma=True,
    smearing=None,
    sigma=None,
    metagga=None,
):
    incar_dict = {}
    incar_dict["PREC"] = "A"
    incar_dict["ENCUT"] = ecut
    incar_dict["ISYM"] = 0
    incar_dict["ALGO"] = "fast"
    incar_dict["EDIFF"] = ediff
    incar_dict["LREAL"] = "A"
    incar_dict["NPAR"] = npar
    incar_dict["KPAR"] = kpar
    incar_dict["NELMIN"] = 4
    incar_dict["ISIF"] = 2
    if smearing is not None:
        incar_dict["ISMEAR"] = smearing
    if sigma is not None:
        incar_dict["SIGMA"] = sigma
    incar_dict["IBRION"] = -1
    incar_dict["NSW"] = 0
    incar_dict["LWAVE"] = "F"
    incar_dict["LCHARG"] = "F"
    incar_dict["PSTRESS"] = 0
    incar_dict["KSPACING"] = kspacing
    if kgamma:
        incar_dict["KGAMMA"] = "T"
    else:
        incar_dict["KGAMMA"] = "F"
    if metagga is not None:
        incar_dict["LASPH"] = "T"
        incar_dict["METAGGA"] = metagga
    return incar_dict


def _update_incar_dict(incar_dict_, user_dict):
    if user_dict is None:
        return incar_dict_
    incar_dict = incar_dict_
    for ii in user_dict:
        ci = ii.upper()
        incar_dict[ci] = user_dict[ii]
    return incar_dict


[docs] def write_incar_dict(incar_dict): lines = [] for key in incar_dict: if isinstance(incar_dict[key], bool): if incar_dict[key]: rs = "T" else: rs = "F" else: rs = str(incar_dict[key]) lines.append(f"{key}={rs}") return "\n".join(lines)
def _make_smearing(fp_params): smearing = None sigma = None if "smearing" in fp_params: smearing = fp_params["smearing"] if "sigma" in fp_params: sigma = fp_params["sigma"] if smearing is None: return None, sigma smearing_method = (smearing.split(":")[0]).lower() if smearing_method == "mp": order = 1 if len(smearing.split(":")) == 2: order = int(smearing.split(":")[1]) return order, sigma elif smearing_method == "gauss": return 0, sigma elif smearing_method == "fd": return -1, sigma else: raise RuntimeError("unsuppported smearing method %s " % smearing_method) def _make_metagga(fp_params): metagga = None if "metagga" in fp_params: metagga = fp_params["metagga"] if metagga == "NONE": metagga = None elif metagga not in [None, "SCAN", "TPSS", "RTPSS", "M06L", "MBJ"]: raise RuntimeError("unknown metagga method " + metagga) return metagga
[docs] def make_vasp_incar_user_dict(fp_params): ecut = fp_params["ecut"] ediff = fp_params["ediff"] npar = fp_params["npar"] kpar = fp_params["kpar"] kspacing = fp_params["kspacing"] if "user_vasp_params" in fp_params: user_dict = fp_params["user_vasp_params"] else: user_dict = None smearing, sigma = _make_smearing(fp_params) metagga = _make_metagga(fp_params) incar_dict = _make_vasp_incar_dict( ecut, ediff, npar, kpar, kspacing=kspacing, kgamma=False, smearing=smearing, sigma=sigma, metagga=metagga, ) incar_dict = _update_incar_dict(incar_dict, user_dict) incar = write_incar_dict(incar_dict) return incar
[docs] def incar_upper(dincar): standard_incar = {} for key, val in dincar.items(): standard_incar[key.upper()] = val return Incar(standard_incar)