Source code for jarvis.analysis.defects.vacancy

"""Modules for making point-defect vacancies."""
import pprint
from collections import OrderedDict
from jarvis.analysis.structure.spacegroup import Spacegroup3D
from jarvis.core.utils import rand_select
from jarvis.core.atoms import Atoms


[docs]class Vacancy(object): """Obtain vacancy defects in Atoms class using Wyckoff data.""" def __init__( self, atoms=None, defect_structure=None, defect_index=None, wyckoff_multiplicity=None, symbol=None, ): """ Initialize the method. Arguments are given below. Args: atoms: jarvis.core.Atoms object. defect_index: atoms index for defect. defect_structure: Atoms with defect. wyckoff_multiplicity: Wyckoff multiplicity. symbol: Elemenyt symbol. """ self._atoms = atoms self._defect_index = defect_index self._defect_structure = defect_structure self._wyckoff_multiplicity = wyckoff_multiplicity self._symbol = symbol
[docs] @classmethod def from_dict(self, d={}): """Load from a dictionary.""" return Vacancy( atoms=Atoms.from_dict(d["atoms"]), defect_structure=Atoms.from_dict(d["defect_structure"]), defect_index=d["defect_index"], wyckoff_multiplicity=d["wyckoff_multiplicity"], symbol=d["symbol"], )
[docs] def generate_defects( self, enforce_c_size=10.0, on_conventional_cell=False, extend=1 ): """Provide function to generate defects.""" atoms = self._atoms if on_conventional_cell: atoms = Spacegroup3D(atoms).conventional_standard_structure a = atoms.lattice.lat_lengths()[0] b = atoms.lattice.lat_lengths()[1] c = atoms.lattice.lat_lengths()[2] if enforce_c_size is not None: dim1 = int(float(enforce_c_size) / float(a)) + extend dim2 = int(float(enforce_c_size) / float(b)) + extend dim3 = int(float(enforce_c_size) / float(c)) + extend # atoms = atoms.make_supercell([dim1, dim2, dim3]) supercell_size = [dim1, dim2, dim3] spg = Spacegroup3D(atoms) wyckoffs = spg._dataset["wyckoffs"] atoms.props = wyckoffs supercell = atoms.make_supercell(supercell_size) props = rand_select(supercell.props) vacs = [] for i, j in props.items(): defect_strt = supercell.remove_site_by_index(j) vac = Vacancy( atoms=supercell, defect_structure=defect_strt, defect_index=j, wyckoff_multiplicity=i, symbol=supercell.elements[j], ) vacs.append(vac) return vacs
[docs] def to_dict(self): """Convert to a dictionary.""" d = OrderedDict() d["atoms"] = self._atoms.to_dict() if self._defect_structure is not None: d["defect_structure"] = self._defect_structure.to_dict() else: d["defect_structure"] = None d["defect_index"] = self._defect_index d["wyckoff_multiplicity"] = self._wyckoff_multiplicity d["symbol"] = self._symbol return d
def __repr__(self, indent=2): """Representation of the class as dict.""" return pprint.pformat(self.to_dict(), indent=indent)
""" if __name__ == "__main__": from jarvis.io.vasp.inputs import Poscar box = [[2.715, 2.715, 0], [0, 2.715, 2.715], [2.715, 0, 2.715]] coords = [[0, 0, 0], [0.25, 0.25, 0.25]] elements = ["Si", "Si"] Si = Atoms(lattice_mat=box, coords=coords, elements=elements) Si = Poscar.from_file( "/rk2/knc6/JARVIS-DFT/2D-bulk/mp-1143_bulk_LDA/MAIN-ELASTIC-bulk@mp_1143/POSCAR" ).atoms vacs = Vacancy(atoms=Si).generate_defects() for i in vacs: print(i) spg = Spacegroup3D(Si) cvn = spg.conventional_standard_structure spg = Spacegroup3D(cvn) props = spg._dataset["wyckoffs"] Si.props = props ss = Si.make_supercell([2, 2, 2]) props = ss.props # print (rand_select(props)) """