def substitute_def_struct_gen(mpid, solute, mapi_key, cellmax, struct_file=None): if not mpid and not struct_file: print ("============\nERROR: Provide an mpid\n============") return if not solute: print ("============\nERROR: Provide solute atom\n============") return # Get primitive structure from the Materials Project DB if not struct_file: 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) else: struct = Structure.from_file(struct_file) if mpid: root_fldr = mpid else: root_fldr = struct.composition.reduced_formula sga = SpacegroupAnalyzer(struct) prim_struct = sga.find_primitive() #prim_struct_sites = len(prim_struct.sites) #conv_struct = sga.get_conventional_standard_structure() #conv_struct_sites = len(conv_struct.sites) #conv_prim_ratio = int(conv_struct_sites / prim_struct_sites) # Default VASP settings def_vasp_incar_param = {'ISIF':2, 'EDIFF':1e-6, 'EDIFFG':0.001,} kpoint_den = 15000 # Create each substitutional defect structure and associated VASP files sc_scale = get_sc_scale(inp_struct=prim_struct, final_site_no=cellmax) blk_sc = prim_struct.copy() blk_sc.make_supercell(scaling_matrix=sc_scale) site_no = blk_sc.num_sites # Rescale if needed while site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 blk_sc = prim_struct.copy() blk_sc.make_supercell(scaling_matrix=sc_scale) site_no = blk_sc.num_sites # Create solute structures at vacancy sites # First find all unique defect sites blk_str_sites = set(blk_sc.sites) symm_struct = SpacegroupAnalyzer(prim_struct).get_symmetrized_structure() unique_sites = sorted([site[0] for site in symm_struct.equivalent_sites], \ key=lambda s: s.species_string) for i, site in enumerate(unique_sites): vac = Vacancy(structure=prim_struct, defect_site=site) vac_sc = vac.generate_defect_structure(supercell=sc_scale) # Get vacancy site information vac_str_sites = set(vac_sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = next(iter(vac_sites)) vac_specie = vac_site.specie.symbol site_mult = vac.get_multiplicity() # Solute substitution defect generation at the vacancy site solute_struct = vac_sc.copy() solute_struct.append(solute, vac_site.frac_coords) custom_kpoints = Kpoints.automatic_density(solute_struct, kppa=kpoint_den) mpvis = MPMetalRelaxSet(solute_struct, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) # Generate VASP directory sub_def_dir ='solute_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i+1), site_mult, vac_specie, solute) fin_dir = os.path.join(root_fldr, sub_def_dir) mpvis.write_input(fin_dir)
def vac_antisite_def_struct_gen(mpid, mapi_key, cellmax, struct_file=None): if not mpid and not struct_file: print ("============\nERROR: Provide an mpid\n============") return # Get primitive structure from the Materials Project DB if not struct_file: 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) else: struct = Structure.from_file(struct_file) sga = SpacegroupAnalyzer(struct) prim_struct = sga.find_primitive() #prim_struct_sites = len(prim_struct.sites) #conv_struct = sga.get_conventional_standard_structure() #conv_struct_sites = len(conv_struct.sites) #conv_prim_ratio = int(conv_struct_sites / prim_struct_sites) # Default VASP settings def_vasp_incar_param = {'ISIF':2, 'EDIFF':1e-6, 'EDIFFG':0.001,} kpoint_den = 15000 # Create bulk structure and associated VASP files sc_scale = get_sc_scale(inp_struct=prim_struct, final_site_no=cellmax) blk_sc = prim_struct.copy() blk_sc.make_supercell(scaling_matrix=sc_scale) site_no = blk_sc.num_sites # Rescale if needed while site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 blk_sc = prim_struct.copy() blk_sc.make_supercell(scaling_matrix=sc_scale) site_no = blk_sc.num_sites blk_str_sites = set(blk_sc.sites) custom_kpoints = Kpoints.automatic_density(blk_sc, kppa=kpoint_den) mpvis = MPMetalRelaxSet(blk_sc, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) if mpid: root_fldr = mpid else: root_fldr = struct.composition.reduced_formula fin_dir = os.path.join(root_fldr, 'bulk') mpvis.write_input(fin_dir) if not mpid: # write the input structure if mpid is not used struct.to(fmt='poscar', filename=os.path.join(fin_dir, 'POSCAR.uc')) # Create each defect structure and associated VASP files # First find all unique defect sites periodic_struct = sga.get_symmetrized_structure() unique_sites = list(set([periodic_struct.find_equivalent_sites(site)[0] \ for site in periodic_struct.sites])) temp_struct = Structure.from_sites(sorted(unique_sites)) prim_struct2 = SpacegroupAnalyzer(temp_struct).find_primitive() prim_struct2.lattice = prim_struct.lattice # a little hacky for i, site in enumerate(prim_struct2.sites): vac = Vacancy(structure=prim_struct, defect_site=site) vac_sc = vac.generate_defect_structure(supercell=sc_scale) # Get vacancy site information vac_str_sites = set(vac_sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = next(iter(vac_sites)) site_mult = vac.get_multiplicity() vac_site_specie = vac_site.specie vac_symbol = vac_site_specie.symbol custom_kpoints = Kpoints.automatic_density(vac_sc, kppa=kpoint_den) mpvis = MPMetalRelaxSet(vac_sc, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) vac_dir = 'vacancy_{}_mult-{}_sitespecie-{}'.format( str(i+1), site_mult, vac_symbol) fin_dir = os.path.join(root_fldr, vac_dir) mpvis.write_input(fin_dir) # Antisites generation at the vacancy site struct_species = blk_sc.species for specie in set(struct_species) - set([vac_site_specie]): specie_symbol = specie.symbol anti_sc = vac_sc.copy() anti_sc.append(specie, vac_site.frac_coords) mpvis = MPMetalRelaxSet(anti_sc, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) anti_dir = 'antisite_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i+1), site_mult, vac_symbol, specie_symbol) fin_dir = os.path.join(root_fldr, anti_dir) mpvis.write_input(fin_dir)
def vac_antisite_def_struct_gen(mpid, mapi_key, cellmax): if not mpid: print("============\nERROR: Provide an mpid\n============") return # Get primitive structure from the Materials Project DB 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) sga = SpacegroupAnalyzer(struct) prim_struct = sga.find_primitive() #prim_struct_sites = len(prim_struct.sites) #conv_struct = sga.get_conventional_standard_structure() #conv_struct_sites = len(conv_struct.sites) #conv_prim_ratio = int(conv_struct_sites / prim_struct_sites) # Default VASP settings def_vasp_incar_param = { 'ISIF': 2, 'EDIFF': 1e-6, 'EDIFFG': 0.001, } kpoint_den = 15000 # Create bulk structure and associated VASP files sc_scale = get_sc_scale(inp_struct=prim_struct, final_site_no=cellmax) blk_sc = prim_struct.copy() blk_sc.make_supercell(scaling_matrix=sc_scale) site_no = blk_sc.num_sites # Rescale if needed if site_no > cellmax: max_sc_dim = max(sc_scale) i = sc_scale.index(max_sc_dim) sc_scale[i] -= 1 blk_sc = prim_struct.copy() blk_sc.make_supercell(scaling_matrix=sc_scale) blk_str_sites = set(blk_sc.sites) custom_kpoints = Kpoints.automatic_density(blk_sc, kppa=kpoint_den) mpvis = MPMetalRelaxSet(blk_sc, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) ptcr_flag = True try: potcar = mpvis.potcar 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 fin_dir = os.path.join(mpid, 'bulk') mpvis.write_input(fin_dir) # Create each defect structure and associated VASP files # First find all unique defect sites periodic_struct = sga.get_symmetrized_structure() unique_sites = list(set([periodic_struct.find_equivalent_sites(site)[0] \ for site in periodic_struct.sites])) temp_struct = Structure.from_sites(sorted(unique_sites)) prim_struct2 = SpacegroupAnalyzer(temp_struct).find_primitive() prim_struct2.lattice = prim_struct.lattice # a little hacky for i, site in enumerate(prim_struct2.sites): vac = Vacancy(structure=prim_struct, defect_site=site) vac_sc = vac.generate_defect_structure(supercell=sc_scale) # Get vacancy site information vac_str_sites = set(vac_sc.sites) vac_sites = blk_str_sites - vac_str_sites vac_site = next(iter(vac_sites)) site_mult = vac.get_multiplicity() vac_site_specie = vac_site.specie vac_symbol = vac_site_specie.symbol custom_kpoints = Kpoints.automatic_density(vac_sc, kppa=kpoint_den) mpvis = MPMetalRelaxSet(vac_sc, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) vac_dir = 'vacancy_{}_mult-{}_sitespecie-{}'.format( str(i + 1), site_mult, vac_symbol) fin_dir = os.path.join(mpid, vac_dir) mpvis.write_input(fin_dir) # Antisites generation at the vacancy site struct_species = blk_sc.species for specie in set(struct_species) - set([vac_site_specie]): specie_symbol = specie.symbol anti_sc = vac_sc.copy() anti_sc.append(specie, vac_site.frac_coords) mpvis = MPMetalRelaxSet(anti_sc, user_incar_settings=def_vasp_incar_param, user_kpoints_settings=custom_kpoints) anti_dir = 'antisite_{}_mult-{}_sitespecie-{}_subspecie-{}'.format( str(i + 1), site_mult, vac_symbol, specie_symbol) fin_dir = os.path.join(mpid, anti_dir) mpvis.write_input(fin_dir)