def _snl_to_spec(snl, enforce_gga=False): spec = {} incar_enforce = {'NPAR': 2} structure = snl.structure mpvis = MPGGAVaspInputSet(user_incar_settings=incar_enforce) if enforce_gga else MPVaspInputSet(user_incar_settings=incar_enforce) incar = mpvis.get_incar(structure) poscar = mpvis.get_poscar(structure) kpoints = mpvis.get_kpoints(structure) potcar = mpvis.get_potcar(structure) spec['vasp'] = {} spec['vasp']['incar'] = incar.to_dict spec['vasp']['poscar'] = poscar.to_dict spec['vasp']['kpoints'] = kpoints.to_dict spec['vasp']['potcar'] = potcar.to_dict # Add run tags of pseudopotential spec['run_tags'] = spec.get('run_tags', [potcar.functional]) spec['run_tags'].extend(potcar.symbols) # Add run tags of +U u_tags = ['%s=%s' % t for t in zip(poscar.site_symbols, incar.get('LDAUU', [0] * len(poscar.site_symbols)))] spec['run_tags'].extend(u_tags) spec['_dupefinder'] = DupeFinderVasp().to_dict() spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA+U optimize structure (2x)' if spec['vasp'][ 'incar'].get('LDAU', False) else 'GGA optimize structure (2x)' return spec
def _snl_to_spec(snl, enforce_gga=False, parameters=None): parameters = parameters if parameters else {} parameters['boltztrap'] = parameters.get('boltztrap', True) # by default run boltztrap spec = {'parameters': parameters} incar_enforce = {'NPAR': 2} if 'exact_structure' in parameters and parameters['exact_structure']: structure = snl.structure else: structure = snl.structure.get_primitive_structure() mpvis = MPGGAVaspInputSet( user_incar_settings=incar_enforce) if enforce_gga else MPVaspInputSet( user_incar_settings=incar_enforce) incar = mpvis.get_incar(structure) poscar = mpvis.get_poscar(structure) kpoints = mpvis.get_kpoints(structure) potcar = mpvis.get_potcar(structure) spec['vasp'] = {} spec['vasp']['incar'] = incar.as_dict() spec['vasp']['poscar'] = poscar.as_dict() spec['vasp']['kpoints'] = kpoints.as_dict() spec['vasp']['potcar'] = potcar.as_dict() # Add run tags of pseudopotential spec['run_tags'] = spec.get('run_tags', [potcar.functional]) spec['run_tags'].extend(potcar.symbols) # Add run tags of +U u_tags = [ '%s=%s' % t for t in zip(poscar.site_symbols, incar.get('LDAUU', [0] * len(poscar.site_symbols))) ] spec['run_tags'].extend(u_tags) # add user run tags if 'run_tags' in parameters: spec['run_tags'].extend(parameters['run_tags']) del spec['parameters']['run_tags'] # add exact structure run tag automatically if we have a unique situation if 'exact_structure' in parameters and parameters[ 'exact_structure'] and snl.structure != snl.structure.get_primitive_structure( ): spec['run_tags'].extend('exact_structure') spec['_dupefinder'] = DupeFinderVasp().to_dict() spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA+U optimize structure (2x)' if spec['vasp'][ 'incar'].get('LDAU', False) else 'GGA optimize structure (2x)' return spec
def _snl_to_spec(snl, enforce_gga=False, parameters=None): parameters = parameters if parameters else {} spec = {'parameters': parameters} incar_enforce = {'NPAR': 2} if 'exact_structure' in parameters and parameters['exact_structure']: structure = snl.structure else: structure = snl.structure.get_primitive_structure() mpvis = MPGGAVaspInputSet(user_incar_settings=incar_enforce) if enforce_gga else MPVaspInputSet(user_incar_settings=incar_enforce) incar = mpvis.get_incar(structure) poscar = mpvis.get_poscar(structure) kpoints = mpvis.get_kpoints(structure) potcar = mpvis.get_potcar(structure) spec['vasp'] = {} spec['vasp']['incar'] = incar.to_dict spec['vasp']['poscar'] = poscar.to_dict spec['vasp']['kpoints'] = kpoints.to_dict spec['vasp']['potcar'] = potcar.to_dict # Add run tags of pseudopotential spec['run_tags'] = spec.get('run_tags', [potcar.functional]) spec['run_tags'].extend(potcar.symbols) # Add run tags of +U u_tags = ['%s=%s' % t for t in zip(poscar.site_symbols, incar.get('LDAUU', [0] * len(poscar.site_symbols)))] spec['run_tags'].extend(u_tags) # add user run tags if 'run_tags' in parameters: spec['run_tags'].extend(parameters['run_tags']) del spec['parameters']['run_tags'] # add exact structure run tag automatically if we have a unique situation if 'exact_structure' in parameters and parameters['exact_structure'] and snl.structure != snl.structure.get_primitive_structure(): spec['run_tags'].extend('exact_structure') spec['_dupefinder'] = DupeFinderVasp().to_dict() spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA+U optimize structure (2x)' if spec['vasp'][ 'incar'].get('LDAU', False) else 'GGA optimize structure (2x)' return spec
def _snl_to_spec(snl, enforce_gga=False): spec = {} incar_enforce = {'NPAR': 2} structure = snl.structure mpvis = MPGGAVaspInputSet( user_incar_settings=incar_enforce) if enforce_gga else MPVaspInputSet( user_incar_settings=incar_enforce) incar = mpvis.get_incar(structure) poscar = mpvis.get_poscar(structure) kpoints = mpvis.get_kpoints(structure) potcar = mpvis.get_potcar(structure) spec['vasp'] = {} spec['vasp']['incar'] = incar.to_dict spec['vasp']['poscar'] = poscar.to_dict spec['vasp']['kpoints'] = kpoints.to_dict spec['vasp']['potcar'] = potcar.to_dict # Add run tags of pseudopotential spec['run_tags'] = spec.get('run_tags', [potcar.functional]) spec['run_tags'].extend(potcar.symbols) # Add run tags of +U u_tags = [ '%s=%s' % t for t in zip(poscar.site_symbols, incar.get('LDAUU', [0] * len(poscar.site_symbols))) ] spec['run_tags'].extend(u_tags) spec['_dupefinder'] = DupeFinderVasp().to_dict() spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA+U optimize structure (2x)' if spec['vasp'][ 'incar'].get('LDAU', False) else 'GGA optimize structure (2x)' return spec
def _snl_to_spec(snl, enforce_gga=True): spec = {} mpvis = MPGGAVaspInputSet() if enforce_gga else MPVaspInputSet() structure = snl.structure spec['vasp'] = {} spec['vasp']['incar'] = mpvis.get_incar(structure).to_dict spec['vasp']['incar']['NPAR'] = 2 spec['vasp']['poscar'] = mpvis.get_poscar(structure).to_dict spec['vasp']['kpoints'] = mpvis.get_kpoints(structure).to_dict spec['vasp']['potcar'] = mpvis.get_potcar(structure).to_dict spec['_dupefinder'] = DupeFinderVasp().to_dict() spec['_priority'] = 2 # TODO: restore category # spec['_category'] = 'Materials Project' spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA+U optimize structure (2x)' if spec['vasp'][ 'incar'].get('LDAU', False) else 'GGA optimize structure (2x)' spec.update(_get_metadata(snl)) return spec
def structure_to_wf(structure): """ This method starts with a Structure object and creates a Workflow object The workflow has two steps - a structure relaxation and a static run :param structure: :return: """ fws = [] # list of FireWorks to run connections = defaultdict(list) # dependencies between FireWorks # generate VASP input objects for 1st VASP run - this is put in the FW spec mpvis = MPGGAVaspInputSet(user_incar_settings={'NPAR': 2}) incar = mpvis.get_incar(structure) poscar = mpvis.get_poscar(structure) kpoints = mpvis.get_kpoints(structure) potcar = mpvis.get_potcar(structure) # serialize the VASP input objects to the FW spec spec = {} spec['vasp'] = {} spec['vasp']['incar'] = incar.as_dict() spec['vasp']['poscar'] = poscar.as_dict() spec['vasp']['kpoints'] = kpoints.as_dict() spec['vasp']['potcar'] = potcar.as_dict() spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA optimize structure (2x) example' # set up the custodian that we want to run jobs = VaspJob.double_relaxation_run('', gzipped=False) for j in jobs: # turn off auto npar, it doesn't work for >1 node j.auto_npar = False handlers = [VaspErrorHandler(), FrozenJobErrorHandler(), MeshSymmetryErrorHandler(), NonConvergingErrorHandler()] c_params = {'jobs': [j.as_dict() for j in jobs], 'handlers': [h.as_dict() for h in handlers], 'max_errors': 5} custodiantask = VaspCustodianTaskEx(c_params) # 1st Firework - run GGA optimize structure # VaspWriterTask - write input files (INCAR, POSCAR, KPOINTS, POSCAR) based on spec # CustodianTaskEx - run VASP within a custodian tasks = [VaspWriterTask(), custodiantask] fws.append(Firework(tasks, spec, name=get_name(structure, spec['task_type']), fw_id=1)) # 2nd Firework - insert previous run into DB spec = {'task_type': 'VASP db insertion example'} fws.append( Firework([VaspToDBTaskEx()], spec, name=get_name(structure, spec['task_type']), fw_id=2)) connections[1] = [2] # 3rd Firework - static run. # VaspCopyTask - copy output from previous run to this directory # SetupStaticRunTask - override old parameters for static run # CustodianTaskEx - run VASP within a custodian spec = {'task_type': 'GGA static example'} copytask = VaspCopyTask({'use_CONTCAR': True, 'skip_CHGCAR': True}) setuptask = SetupStaticRunTask() custodiantask = VaspCustodianTaskEx({'jobs': [VaspJob('', auto_npar=False).as_dict()], 'handlers': [h.as_dict() for h in handlers], 'max_errors': 5}) fws.append(Firework([copytask, setuptask, custodiantask], spec, name=get_name(structure, spec['task_type']), fw_id=3)) connections[2] = [3] # 4th Firework - insert previous run into DB spec = {'task_type': 'VASP db insertion example'} fws.append( Firework([VaspToDBTaskEx()], spec, name=get_name(structure, spec['task_type']), fw_id=4)) connections[3] = [4] return Workflow(fws, connections, name=get_slug(structure.formula))
def vac_antisite_def_struct_gen(mpid, mapi_key, cellmax): if not mpid: print ("============\nERROR: Provide an mpid\n============") return if not mapi_key: with MPRester() as mp: struct = mp.get_structure_by_material_id(mpid) else: with MPRester(mapi_key) as mp: struct = mp.get_structure_by_material_id(mpid) prim_struct_sites = len(struct.sites) struct = SpacegroupAnalyzer(struct).get_conventional_standard_structure() conv_struct_sites = len(struct.sites) conv_prim_rat = int(conv_struct_sites/prim_struct_sites) sc_scale = get_sc_scale(struct,cellmax) mpvis = MPGGAVaspInputSet() # Begin defaults: All default settings. blk_vasp_incar_param = {'IBRION':-1,'EDIFF':1e-4,'EDIFFG':0.001,'NSW':0,} def_vasp_incar_param = {'ISIF':2,'NELM':99,'IBRION':2,'EDIFF':1e-6, 'EDIFFG':0.001,'NSW':40,} kpoint_den = 6000 # End defaults ptcr_flag = True try: potcar = mpvis.get_potcar(struct) except: print ("VASP POTCAR folder not detected.\n" \ "Only INCAR, POSCAR, KPOINTS are generated.\n" \ "If you have VASP installed on this system, \n" \ "refer to pymatgen documentation for configuring the settings.") ptcr_flag = False vac = Vacancy(struct, {}, {}) scs = vac.make_supercells_with_defects(sc_scale) site_no = scs[0].num_sites if site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 scs = vac.make_supercells_with_defects(sc_scale) for i in range(len(scs)): sc = scs[i] poscar = mpvis.get_poscar(sc) kpoints = Kpoints.automatic_density(sc,kpoint_den) incar = mpvis.get_incar(sc) if ptcr_flag: potcar = mpvis.get_potcar(sc) interdir = mpid if not i: fin_dir = os.path.join(interdir,'bulk') try: os.makedirs(fin_dir) except: pass incar.update(blk_vasp_incar_param) incar.write_file(os.path.join(fin_dir,'INCAR')) poscar.write_file(os.path.join(fin_dir,'POSCAR')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir,'POTCAR')) kpoints.write_file(os.path.join(fin_dir,'KPOINTS')) else: blk_str_sites = set(scs[0].sites) vac_str_sites = set(sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = list(vac_sites)[0] site_mult = int(vac.get_defectsite_multiplicity(i-1)/conv_prim_rat) vac_site_specie = vac_site.specie vac_symbol = vac_site.specie.symbol vac_dir ='vacancy_{}_mult-{}_sitespecie-{}'.format(str(i), site_mult, vac_symbol) fin_dir = os.path.join(interdir,vac_dir) try: os.makedirs(fin_dir) except: pass incar.update(def_vasp_incar_param) poscar.write_file(os.path.join(fin_dir,'POSCAR')) incar.write_file(os.path.join(fin_dir,'INCAR')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir,'POTCAR')) kpoints.write_file(os.path.join(fin_dir,'KPOINTS')) # Antisite generation at all vacancy sites struct_species = scs[0].types_of_specie for specie in set(struct_species)-set([vac_site_specie]): subspecie_symbol = specie.symbol anti_struct = sc.copy() anti_struct.append(specie, vac_site.frac_coords) poscar = mpvis.get_poscar(anti_struct) incar = mpvis.get_incar(anti_struct) incar.update(def_vasp_incar_param) as_dir ='antisite_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i), site_mult, vac_symbol, subspecie_symbol) fin_dir = os.path.join(interdir,as_dir) try: os.makedirs(fin_dir) except: pass poscar.write_file(os.path.join(fin_dir,'POSCAR')) incar.write_file(os.path.join(fin_dir,'INCAR')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir,'POTCAR')) kpoints.write_file(os.path.join(fin_dir,'KPOINTS'))
def vac_antisite_def_struct_gen(mpid, mapi_key, cellmax): if not mpid: print("============\nERROR: Provide an mpid\n============") return if not mapi_key: with MPRester() as mp: struct = mp.get_structure_by_material_id(mpid) else: with MPRester(mapi_key) as mp: struct = mp.get_structure_by_material_id(mpid) prim_struct_sites = len(struct.sites) struct = SpacegroupAnalyzer(struct).get_conventional_standard_structure() conv_struct_sites = len(struct.sites) conv_prim_rat = int(conv_struct_sites / prim_struct_sites) sc_scale = get_sc_scale(struct, cellmax) mpvis = MPGGAVaspInputSet() # Begin defaults: All default settings. blk_vasp_incar_param = { 'IBRION': -1, 'EDIFF': 1e-4, 'EDIFFG': 0.001, 'NSW': 0, } def_vasp_incar_param = { 'ISIF': 2, 'NELM': 99, 'IBRION': 2, 'EDIFF': 1e-6, 'EDIFFG': 0.001, 'NSW': 40, } kpoint_den = 6000 # End defaults ptcr_flag = True try: potcar = mpvis.get_potcar(struct) except: print ("VASP POTCAR folder not detected.\n" \ "Only INCAR, POSCAR, KPOINTS are generated.\n" \ "If you have VASP installed on this system, \n" \ "refer to pymatgen documentation for configuring the settings.") ptcr_flag = False vac = Vacancy(struct, {}, {}) scs = vac.make_supercells_with_defects(sc_scale) site_no = scs[0].num_sites if site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 scs = vac.make_supercells_with_defects(sc_scale) for i in range(len(scs)): sc = scs[i] poscar = mpvis.get_poscar(sc) kpoints = Kpoints.automatic_density(sc, kpoint_den) incar = mpvis.get_incar(sc) if ptcr_flag: potcar = mpvis.get_potcar(sc) interdir = mpid if not i: fin_dir = os.path.join(interdir, 'bulk') try: os.makedirs(fin_dir) except: pass incar.update(blk_vasp_incar_param) incar.write_file(os.path.join(fin_dir, 'INCAR')) poscar.write_file(os.path.join(fin_dir, 'POSCAR')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir, 'POTCAR')) kpoints.write_file(os.path.join(fin_dir, 'KPOINTS')) else: blk_str_sites = set(scs[0].sites) vac_str_sites = set(sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = list(vac_sites)[0] site_mult = int( vac.get_defectsite_multiplicity(i - 1) / conv_prim_rat) vac_site_specie = vac_site.specie vac_symbol = vac_site.specie.symbol vac_dir = 'vacancy_{}_mult-{}_sitespecie-{}'.format( str(i), site_mult, vac_symbol) fin_dir = os.path.join(interdir, vac_dir) try: os.makedirs(fin_dir) except: pass incar.update(def_vasp_incar_param) poscar.write_file(os.path.join(fin_dir, 'POSCAR')) incar.write_file(os.path.join(fin_dir, 'INCAR')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir, 'POTCAR')) kpoints.write_file(os.path.join(fin_dir, 'KPOINTS')) # Antisite generation at all vacancy sites struct_species = scs[0].types_of_specie for specie in set(struct_species) - set([vac_site_specie]): subspecie_symbol = specie.symbol anti_struct = sc.copy() anti_struct.append(specie, vac_site.frac_coords) poscar = mpvis.get_poscar(anti_struct) incar = mpvis.get_incar(anti_struct) incar.update(def_vasp_incar_param) as_dir = 'antisite_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i), site_mult, vac_symbol, subspecie_symbol) fin_dir = os.path.join(interdir, as_dir) try: os.makedirs(fin_dir) except: pass poscar.write_file(os.path.join(fin_dir, 'POSCAR')) incar.write_file(os.path.join(fin_dir, 'INCAR')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir, 'POTCAR')) kpoints.write_file(os.path.join(fin_dir, 'KPOINTS'))
def substitute_def_struct_gen(mpid, solute, mapi_key, cellmax): print(mpid, solute, mapi_key, cellmax) if not mpid: print("============\nERROR: Provide an mpid\n============") return if not solute: print("============\nERROR: Provide solute atom\n============") return if not mapi_key: with MPRester() as mp: struct = mp.get_structure_by_material_id(mpid) else: with MPRester(mapi_key) as mp: struct = mp.get_structure_by_material_id(mpid) print(struct.formula) mpvis = MPGGAVaspInputSet() # Begin defaults: All default settings. blk_vasp_incar_param = { 'IBRION': -1, 'EDIFF': 1e-4, 'EDIFFG': 0.001, 'NSW': 0, } def_vasp_incar_param = { 'ISIF': 2, 'NELM': 99, 'IBRION': 2, 'EDIFF': 1e-6, 'EDIFFG': 0.001, 'NSW': 40, } kpoint_den = 6000 # End defaults # Check if POTCAR file can be geneated ptcr_flag = True try: potcar = mpvis.get_potcar(struct) except: print ("VASP POTCAR folder not detected.\n" \ "Only INCAR, POSCAR, KPOINTS are generated.\n" \ "If you have VASP installed on this system, \n" \ "refer to pymatgen documentation for configuring the settings.") ptcr_flag = False print(ptcr_flag) vac = Vacancy(struct, {}, {}) sc_scale = get_sc_scale(struct, cellmax) scs = vac.make_supercells_with_defects(sc_scale) site_no = scs[0].num_sites if site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 scs = vac.make_supercells_with_defects(sc_scale) print len(scs) interdir = mpid blk_str_sites = set(scs[0].sites) for i in range(1, len(scs)): sc = scs[i] vac_str_sites = set(sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = list(vac_sites)[0] site_mult = vac.get_defectsite_multiplicity(i - 1) vac_site_specie = vac_site.specie vac_specie = vac_site.specie.symbol # Solute substitution defect generation at all vacancy sites struct_species = scs[0].types_of_specie solute_struct = sc.copy() solute_struct.append(solute, vac_site.frac_coords) incar = mpvis.get_incar(solute_struct) incar.update(def_vasp_incar_param) poscar = mpvis.get_poscar(solute_struct) kpoints = Kpoints.automatic_density(solute_struct, kpoint_den) if ptcr_flag: potcar = mpvis.get_potcar(solute_struct) sub_def_dir = 'solute_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i), site_mult, vac_specie, solute) fin_dir = os.path.join(interdir, sub_def_dir) try: os.makedirs(fin_dir) except: pass poscar.write_file(os.path.join(fin_dir, 'POSCAR')) incar.write_file(os.path.join(fin_dir, 'INCAR')) kpoints.write_file(os.path.join(fin_dir, 'KPOINTS')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir, 'POTCAR'))
def substitute_def_struct_gen(mpid, solute, mapi_key, cellmax): print (mpid, solute, mapi_key, cellmax) if not mpid: print ("============\nERROR: Provide an mpid\n============") return if not solute: print ("============\nERROR: Provide solute atom\n============") return if not mapi_key: with MPRester() as mp: struct = mp.get_structure_by_material_id(mpid) else: with MPRester(mapi_key) as mp: struct = mp.get_structure_by_material_id(mpid) print (struct.formula) mpvis = MPGGAVaspInputSet() # Begin defaults: All default settings. blk_vasp_incar_param = {'IBRION':-1,'EDIFF':1e-4,'EDIFFG':0.001,'NSW':0,} def_vasp_incar_param = {'ISIF':2,'NELM':99,'IBRION':2,'EDIFF':1e-6, 'EDIFFG':0.001,'NSW':40,} kpoint_den = 6000 # End defaults # Check if POTCAR file can be geneated ptcr_flag = True try: potcar = mpvis.get_potcar(struct) except: print ("VASP POTCAR folder not detected.\n" \ "Only INCAR, POSCAR, KPOINTS are generated.\n" \ "If you have VASP installed on this system, \n" \ "refer to pymatgen documentation for configuring the settings.") ptcr_flag = False print (ptcr_flag) vac = Vacancy(struct, {}, {}) sc_scale = get_sc_scale(struct,cellmax) scs = vac.make_supercells_with_defects(sc_scale) site_no = scs[0].num_sites if site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 scs = vac.make_supercells_with_defects(sc_scale) print len(scs) interdir = mpid blk_str_sites = set(scs[0].sites) for i in range(1,len(scs)): sc = scs[i] vac_str_sites = set(sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = list(vac_sites)[0] site_mult = vac.get_defectsite_multiplicity(i-1) vac_site_specie = vac_site.specie vac_specie = vac_site.specie.symbol # Solute substitution defect generation at all vacancy sites struct_species = scs[0].types_of_specie solute_struct = sc.copy() solute_struct.append(solute, vac_site.frac_coords) incar = mpvis.get_incar(solute_struct) incar.update(def_vasp_incar_param) poscar = mpvis.get_poscar(solute_struct) kpoints = Kpoints.automatic_density(solute_struct,kpoint_den) if ptcr_flag: potcar = mpvis.get_potcar(solute_struct) sub_def_dir ='solute_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i), site_mult, vac_specie, solute) fin_dir = os.path.join(interdir,sub_def_dir) try: os.makedirs(fin_dir) except: pass poscar.write_file(os.path.join(fin_dir,'POSCAR')) incar.write_file(os.path.join(fin_dir,'INCAR')) kpoints.write_file(os.path.join(fin_dir,'KPOINTS')) if ptcr_flag: potcar.write_file(os.path.join(fin_dir,'POTCAR'))
def structure_to_wf(structure): """ This method starts with a Structure object and creates a Workflow object The workflow has two steps - a structure relaxation and a static run :param structure: :return: """ fws = [] # list of FireWorks to run connections = defaultdict(list) # dependencies between FireWorks # generate VASP input objects for 1st VASP run - this is put in the FW spec mpvis = MPGGAVaspInputSet(user_incar_settings={'NPAR': 2}) incar = mpvis.get_incar(structure) poscar = mpvis.get_poscar(structure) kpoints = mpvis.get_kpoints(structure) potcar = mpvis.get_potcar(structure) # serialize the VASP input objects to the FW spec spec = {} spec['vasp'] = {} spec['vasp']['incar'] = incar.to_dict spec['vasp']['poscar'] = poscar.to_dict spec['vasp']['kpoints'] = kpoints.to_dict spec['vasp']['potcar'] = potcar.to_dict spec['vaspinputset_name'] = mpvis.__class__.__name__ spec['task_type'] = 'GGA optimize structure (2x) example' # set up the custodian that we want to run jobs = VaspJob.double_relaxation_run('', gzipped=False) for j in jobs: # turn off auto npar, it doesn't work for >1 node j.auto_npar = False handlers = [VaspErrorHandler(), FrozenJobErrorHandler(), MeshSymmetryErrorHandler(), NonConvergingErrorHandler()] c_params = {'jobs': [j.to_dict for j in jobs], 'handlers': [h.to_dict for h in handlers], 'max_errors': 5} custodiantask = VaspCustodianTaskEx(c_params) # 1st FireWork - run GGA optimize structure # VaspWriterTask - write input files (INCAR, POSCAR, KPOINTS, POSCAR) based on spec # CustodianTaskEx - run VASP within a custodian tasks = [VaspWriterTask(), custodiantask] fws.append(FireWork(tasks, spec, name=get_name(structure, spec['task_type']), fw_id=1)) # 2nd FireWork - insert previous run into DB spec = {'task_type': 'VASP db insertion example'} fws.append( FireWork([VaspToDBTaskEx()], spec, name=get_name(structure, spec['task_type']), fw_id=2)) connections[1] = [2] # 3rd FireWork - static run. # VaspCopyTask - copy output from previous run to this directory # SetupStaticRunTask - override old parameters for static run # CustodianTaskEx - run VASP within a custodian spec = {'task_type': 'GGA static example'} copytask = VaspCopyTask({'use_CONTCAR': True, 'skip_CHGCAR': True}) setuptask = SetupStaticRunTask() custodiantask = VaspCustodianTaskEx({'jobs': [VaspJob('', auto_npar=False).to_dict], 'handlers': [h.to_dict for h in handlers], 'max_errors': 5}) fws.append(FireWork([copytask, setuptask, custodiantask], spec, name=get_name(structure, spec['task_type']), fw_id=3)) connections[2] = [3] # 4th FireWork - insert previous run into DB spec = {'task_type': 'VASP db insertion example'} fws.append( FireWork([VaspToDBTaskEx()], spec, name=get_name(structure, spec['task_type']), fw_id=4)) connections[3] = [4] return Workflow(fws, connections, name=get_slug(structure.formula))