Esempio n. 1
0
    def make_defect_set(self,
                        keywords: Union[str, list, None] = None,
                        specified_defects: Optional[list] = None) -> None:
        """Return defect name list based on DefectInitialSetting object. """
        defects = {}
        # vacancies
        defects.update(
            self._substituted_set(removed_sites=self.irreducible_sites,
                                  inserted_element=None))

        # substituted + antisite
        configs = self.antisite_configs + self.dopant_configs
        for in_elem, out_elem in configs:
            removed_sites = [
                i for i in self.irreducible_sites if out_elem == i.element
            ]
            substituted = self._substituted_set(removed_sites=removed_sites,
                                                inserted_element=in_elem)
            defects.update(substituted)

        # interstitials
        inserted_elements = self.structure.symbol_set + tuple(self.dopants)
        defects.update(
            self._interstitial_set(inserted_elements=inserted_elements))

        # complex defects
        defects.update(self._complex_set())

        defects = select_defects(defect_set=defects,
                                 keywords=keywords,
                                 included=self.included,
                                 excluded=self.excluded,
                                 specified_defects=specified_defects)

        self.defect_entries = []
        for name, defect in defects.items():
            center = defect.pop("center")
            for charge in defect.pop("charges"):
                inserted_indices = \
                    [i["index"] for i in defect["inserted_atoms"]]
                # By default, neighboring atoms are perturbed.
                # If one wants to avoid it, set displacement_distance = 0
                perturbed_structure, neighboring_sites = \
                    perturb_neighboring_atoms(
                        structure=defect["initial_structure"],
                        center=center,
                        cutoff=defect["cutoff"],
                        distance=self.displacement_distance,
                        inserted_atom_indices=inserted_indices)

                defect["initial_structure"].set_charge(charge)
                perturbed_structure.set_charge(charge)

                self.defect_entries.append(
                    DefectEntry(
                        name=name,
                        perturbed_initial_structure=perturbed_structure,
                        charge=charge,
                        neighboring_sites=neighboring_sites,
                        **defect))
Esempio n. 2
0
    def setUp(self):
        """ """
        # DefectEntry class object for a single vacancy
        name = "Va_O1"
        defect_type = DefectType.from_string("vacancy")
        self.initial_structure_vacancy = \
            self.get_structure_by_name(name="MgO64atoms-Va_O_0-unrelaxed")
        perturbed_initial_structure = self.initial_structure_vacancy.copy()
        removed_atoms = [{"element": "O", "index": 32, "coords": [0.25, 0, 0]}]
        inserted_atoms = []
        changes_of_num_elements = {"O": -1}
        charge = 2
        initial_site_symmetry = "m-3m"
        multiplicity = 32
        neighboring_sites = [0, 4, 16, 17, 24, 26]
        cutoff = round(8.419456 / 4 * CUTOFF_FACTOR, 2)
        self.MgO_Va_O1_2 = \
            DefectEntry(name=name,
                        defect_type=defect_type,
                        initial_structure=self.initial_structure_vacancy,
                        perturbed_initial_structure=perturbed_initial_structure,
                        removed_atoms=removed_atoms,
                        inserted_atoms=inserted_atoms,
                        changes_of_num_elements=changes_of_num_elements,
                        charge=charge,
                        initial_site_symmetry=initial_site_symmetry,
                        cutoff=cutoff,
                        neighboring_sites=neighboring_sites,
                        multiplicity=multiplicity)

        name = "complex"
        defect_type = DefectType.from_string("complex")
        self.initial_structure_complex = \
            self.get_structure_by_name(name="MgO64atoms-Va_Mg+Va_O+Ca_i")
        perturbed_initial_structure = self.initial_structure_complex.copy()
        removed_atoms = [{
            "element": "Mg",
            "index": 0,
            "coords": [0, 0, 0]
        }, {
            "element": "O",
            "index": 32,
            "coords": [0.25, 0, 0]
        }]
        inserted_atoms = [{
            "element": "Ca",
            "index": 0,
            "coords": [0.125, 0, 0]
        }]
        changes_of_num_elements = {"Mg": -1, "Ca": 1, "O": -1}
        charge = 2
        initial_site_symmetry = "4mm"
        multiplicity = 192
        neighboring_sites = [16, 17, 24, 26, 47, 48, 55, 57]
        cutoff = round(8.419456 / 4 * CUTOFF_FACTOR, 2)
        self.MgO_complex = \
            DefectEntry(name=name,
                        defect_type=defect_type,
                        initial_structure=self.initial_structure_complex,
                        perturbed_initial_structure=perturbed_initial_structure,
                        removed_atoms=removed_atoms,
                        inserted_atoms=inserted_atoms,
                        changes_of_num_elements=changes_of_num_elements,
                        charge=charge,
                        initial_site_symmetry=initial_site_symmetry,
                        cutoff=cutoff,
                        neighboring_sites=neighboring_sites,
                        multiplicity=multiplicity)