Source code for defermi.generator
"""
Generate defect objects
"""
from pymatgen.core.sites import PeriodicSite
from pymatgen.symmetry.analyzer import SpacegroupAnalyzer
from .defects import Interstitial, Substitution, Vacancy
from .tools.structure import remove_oxidation_state_from_site
[docs]
def create_interstitials(structure,elements,supercell_size=None,**kwargs):
"""
Create Interstitial objects based on Voronoi with pymatgen,
staring from a bulk structure (unit cell or supercell).
Parameters
----------
structure : Structure
Bulk structure.
elements : list
List of element symbols.
supercell_size : int
Input for the make_supercell function of the Structure class.
If None the input structure is not modified. The default is None.
kwargs:
Kwargs to pass to VoronoiInterstitialGenerator:
- clustering_tol: Tolerance for clustering the Voronoi nodes.
- min_dist: Minimum distance between an interstitial and the nearest atom.
- ltol: Tolerance for lattice matching.
- stol: Tolerance for structure matching.
- angle_tol: Angle tolerance for structure matching.
- kwargs: Additional keyword arguments for the `TopographyAnalyzer` constructor.
Returns
-------
defects : list
List of Interstitial objects.
"""
from pymatgen.analysis.defects.generators import VoronoiInterstitialGenerator
defects = []
bulk_structure = structure.copy()
if supercell_size:
bulk_structure.make_supercell(supercell_size)
generator = VoronoiInterstitialGenerator().generate(bulk_structure,elements)
for inter in generator:
bulk_structure.remove_oxidation_states()
remove_oxidation_state_from_site(inter.site)
interstitial = Interstitial(
defect_site=inter.site,
bulk_structure=bulk_structure,
multiplicity=inter.multiplicity,
label=f'mult{inter.multiplicity}')
defects.append(interstitial)
return defects
[docs]
def create_substitutions(structure,elements_to_replace,supercell_size=None, **kwargs):
"""
Create Substitution objects for each non-equivalent site,
staring from a bulk structure (unit cell or supercell).
Parameters
----------
structure : Structure
Bulk structure, both unit cell or supercell can be used as input.
elements_to_replace : dict
Dict with element symbol of specie to be replaced as keys and element
symbol of the species to be replaced with as values ({'old_El':'new_El'}).
supercell_size : int or numpy array
Input for the make_supercell function of the Structure class.
If None the input structure is not modified.
kwargs : dict
Kwargs to pass to SpaceGroupAnalyzer class:
- symprec (float):
Tolerance for symmetry finding. Defaults to 0.01,
which is fairly strict and works well for properly refined
structures with atoms in the proper symmetry coordinates. For
structures with slight deviations from their proper atomic
positions (e.g., structures relaxed with electronic structure
codes), a looser tolerance of 0.1 (the value used in Materials
Project) is often needed.
- angle_tolerance (float):
Angle tolerance for symmetry finding. Defaults to 5 degrees.
Returns
-------
defects : list
List of Substitution objects.
"""
import string
letters = string.ascii_lowercase
defects = []
bulk_structure = structure.copy()
if supercell_size:
bulk_structure.make_supercell(supercell_size)
else:
sites = bulk_structure.sites
sym_struct = SpacegroupAnalyzer(structure=bulk_structure,**kwargs).get_symmetrized_structure()
for el_to_sub,el_subbed in elements_to_replace.items():
idx = 0
for site_group in sym_struct.equivalent_sites:
site = site_group[0]
if site.specie.symbol == el_to_sub:
defect_site = PeriodicSite(el_subbed,site.frac_coords,site.lattice)
substitution = Substitution(
defect_site=defect_site,
bulk_structure=bulk_structure,
site_in_bulk=site)
multiplicity = len(sym_struct.find_equivalent_sites(site))
substitution.set_multiplicity(multiplicity)
substitution.set_label(letters[idx])
idx += 1
defects.append(substitution)
return defects
[docs]
def create_vacancies(structure,elements=None,supercell_size=None, **kwargs):
"""
Create Vacancy objects for each non-equivalent site,
staring from a bulk structure (unit cell or supercell).
Parameters
----------
structure : Structure
Bulk structure, both unit cell or supercell can be used as input.
elements : str
Symbol of the elements for which vacancies are needed.
If None all of the elements are considered. The default is None.
supercell_size : int or numpy array
Input for the make_supercell function of the Structure class.
If None the input structure is not modified.
kwargs : dict
Kwargs to pass to SpaceGroupAnalyzer class:
- symprec (float):
Tolerance for symmetry finding. Defaults to 0.01,
which is fairly strict and works well for properly refined
structures with atoms in the proper symmetry coordinates. For
structures with slight deviations from their proper atomic
positions (e.g., structures relaxed with electronic structure
codes), a looser tolerance of 0.1 (the value used in Materials
Project) is often needed.
- angle_tolerance (float):
Angle tolerance for symmetry finding. Defaults to 5 degrees.
Returns
-------
defects : list
List of Vacancy objects.
"""
import string
letters = string.ascii_lowercase
defects = []
bulk_structure = structure.copy()
if supercell_size:
bulk_structure.make_supercell(supercell_size)
if not elements:
elements = [el.symbol for el in bulk_structure.composition.elements]
sym_struct = SpacegroupAnalyzer(structure=bulk_structure,**kwargs).get_symmetrized_structure()
for el in bulk_structure.composition.elements:
idx = 0
for site_group in sym_struct.equivalent_sites:
site = site_group[0]
if el.symbol in elements:
if site.specie == el:
vacancy = Vacancy(
defect_site=site,
bulk_structure=bulk_structure)
multiplicity = len(sym_struct.find_equivalent_sites(site))
vacancy.set_multiplicity(multiplicity)
vacancy.set_label(letters[idx])
idx += 1
defects.append(vacancy)
return defects