Source code for dpgen.generator.lib.vasp

#!/usr/bin/python3 

import os
import numpy as np
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 (type(incar_dict[key]) == bool): if incar_dict[key]: rs = 'T' else : rs = 'F' else : rs = str(incar_dict[key]) lines.append('%s=%s' % (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 == 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)