def test_screen_defect(): defect = SimpleDefect(None, "O1", [1, 2]) assert screen_simple_defect(defect, ["Va_O1"]) == \ SimpleDefect(None, "O1", [1, 2]) assert screen_simple_defect(defect, ["Va_O1_1"]) == \ SimpleDefect(None, "O1", [1]) assert screen_simple_defect(defect, ["Va_N1"]) is None
def test_defect_entries_maker(cubic_supercell_info, cubic_supercell, mocker): mock = mocker.patch("pydefect.input_maker.defect_entries_maker.defaults") mock.displace_distance = 0.0 defect_set = DefectSet(defects={ SimpleDefect(None, "H1", [1]), SimpleDefect("Ne", "He1", [0]) }) maker = DefectEntriesMaker(cubic_supercell_info, defect_set) va_h1_str = cubic_supercell.copy() va_h1_str.pop(0) va_h1_str = to_istructure(va_h1_str) ne_he1_str = cubic_supercell.copy() coords = ne_he1_str.pop(32).frac_coords ne_he1_str.append("Ne", coords) ne_he1_str = to_istructure(ne_he1_str) defect_entries = { DefectEntry("Ne_He1", 0, ne_he1_str, ne_he1_str.copy(), "m-3m", (0.25, 0.0, 0.0)), DefectEntry("Va_H1", 1, va_h1_str, va_h1_str.copy(), "m-3m", (0.0, 0.0, 0.0)), } assert maker.defect_entries == defect_entries
def test_defect_set_maker(supercell_info): defect_maker = DefectSetMaker(supercell_info) expected = {SimpleDefect(None, "H1", [-1, 0, 1]), SimpleDefect(None, "He1", [0]), SimpleDefect("H", "i1", [-1, 0, 1]), SimpleDefect("He", "i1", [0])} assert defect_maker.defect_set == expected
def test_defect_set_maker_oxi_state(supercell_info): defect_maker = DefectSetMaker(supercell_info, {"H": 2}) assert defect_maker.defect_set.defects == { SimpleDefect(None, "H1", [-2, -1, 0]), SimpleDefect(None, "He1", [0]), SimpleDefect("H", "i1", [0, 1, 2]), SimpleDefect("He", "i1", [0]) }
def test_defect_set_maker_electroneg_diff(supercell_info): defect_maker = DefectSetMaker(supercell_info, dopants=["Li"], ele_neg_diff=2.2 - 0.98 - 1e-5) assert set(defect_maker.defect_set) == { SimpleDefect(None, "H1", [-1, 0, 1]), SimpleDefect(None, "He1", [0]), SimpleDefect("H", "i1", [-1, 0, 1]), SimpleDefect("He", "i1", [0]), SimpleDefect("Li", "i1", [-1, 0, 1]), }
def test_make_defect_set(oxi_states, he_vacancy_charge, tmpdir, supercell_info): tmpdir.chdir() supercell_info.to_json_file() args = Namespace(oxi_states=oxi_states, dopants=["Li"], kwargs=["Li_H1", "Va_He1", "Va_H1_-1"]) make_defect_set(args) simple_defects = {SimpleDefect(None, "He1", he_vacancy_charge), SimpleDefect(None, "H1", [-1]), SimpleDefect("Li", "H1", [0])} DefectSet(defects=simple_defects).to_yaml("expected.yaml") assert Path("defect_in.yaml").read_text() == Path("expected.yaml").read_text()
def test_defect_entries_maker_insert_host_atoms(cubic_supercell_info, mocker): mock = mocker.patch("pydefect.input_maker.defect_entries_maker.defaults") mock.displace_distance = 0.0 defect_set = DefectSet(defects={SimpleDefect("He", "H1", [0]), SimpleDefect("H", "He1", [0])}) maker = DefectEntriesMaker(cubic_supercell_info, defect_set) for defect_entry in maker.defect_entries: if defect_entry.name == "H_He1": actual = defect_entry.structure[0].frac_coords np.testing.assert_array_equal(actual, [0.25, 0.0, 0.0]) if defect_entry.name == "He_H1": actual = defect_entry.structure[31].frac_coords np.testing.assert_array_equal(actual, [0.0, 0.0, 0.0])
def test_make_defect_entries(tmpdir, supercell_info): tmpdir.chdir() supercell_info.to_json_file() defect_set = DefectSet({SimpleDefect(None, "He1", [-1, 0])}) defect_set.to_yaml() args = Namespace() make_defect_entries(args) names = {str(name) for name in Path(".").glob("*")} assert names == { 'Va_He1_-1', 'defect_in.yaml', 'perfect', 'Va_He1_0', 'supercell_info.json' } perfect_structure = Structure.from_file(str(Path("perfect") / "POSCAR")) assert perfect_structure == supercell_info.structure file_names = { str(file_name.name) for file_name in Path("Va_He1_-1").glob("*") } assert file_names == {"POSCAR", "defect_entry.json", "prior_info.yaml"} expected = """charge: -1 """ assert Path("Va_He1_-1/prior_info.yaml").read_text() == expected
def from_yaml(cls, filename: str = "defect_in.yaml") -> "DefectSet": d = loadfn(filename) names = set() for name, charges in d.items(): in_name, out_name = name.split("_") names.add(SimpleDefect(in_name, out_name, tuple(charges))) return cls(names)
def _create_vacancy_set(self): result = set() for out_name, site in self.supercell_info.sites.items(): minus_oxi_stat = -self._oxidation_state(site.element) result.add(SimpleDefect(None, out_name, charge_set(minus_oxi_stat))) return result
def _create_interstitial_set(self): result = set() for in_name in self._subs: oxi_stat = self._oxidation_state(in_name) for i in range(len(self.supercell_info.interstitials)): result.add( SimpleDefect(in_name, f"i{i + 1}", charge_set(oxi_stat))) return result
def test_defect_entries_interstitials(cubic_supercell_info, mocker): mock = mocker.patch("pydefect.input_maker.defect_entries_maker.defaults") mock.displace_distance = 0.0 defect_set = DefectSet(defects={SimpleDefect("H", "i1", [0])}) maker = DefectEntriesMaker(cubic_supercell_info, defect_set) defect_entry = maker.defect_entries.pop() actual = defect_entry.structure[0].frac_coords np.testing.assert_array_equal(actual, [0.25, 0.25, 0.25])
def test_defect_set_maker_dopants(supercell_info): defect_maker = DefectSetMaker(supercell_info, dopants=["Li"]) assert set(defect_maker.defect_set) == { SimpleDefect(None, "H1", [-1, 0, 1]), SimpleDefect(None, "He1", [0]), SimpleDefect("Li", "H1", [0]), SimpleDefect("H", "i1", [-1, 0, 1]), SimpleDefect("He", "i1", [0]), SimpleDefect("Li", "i1", [-1, 0, 1]), }
def _create_substitutional_set(self): result = set() for in_name, (out_name, site) \ in product(self._subs, self.supercell_info.sites.items()): host_element = site.element sub_en = electronegativity(in_name) host_en = electronegativity(host_element) are_same_elem = in_name == host_element if None in (sub_en, host_en) or are_same_elem or \ abs(sub_en - host_en) > self._ele_neg_diff: continue sub_oxi = self._oxidation_state(in_name) host_oxi = self._oxidation_state(host_element) oxi_diff = sub_oxi - host_oxi result.add(SimpleDefect(in_name, out_name, charge_set(oxi_diff))) return result
def test_simple_defect_msonable(): defect = SimpleDefect("Va", "O1", [1, 2]) assert_msonable(defect)
def test_defect_set_maker_screening(supercell_info): defect_maker = DefectSetMaker(supercell_info, keywords=["Va_H1"]) expected = {SimpleDefect(None, "H1", [-1, 0, 1])} assert defect_maker.defect_set == expected
def test_simple_defect_hashable(): defect = SimpleDefect(None, "O1", (1, 2)) d = {defect: 1}
def test_simple_defect(): defect = SimpleDefect(None, "O1", [1, 2]) expected = Defect("Va_O1", (1, 2)) assert defect.name == expected.name assert defect.charge_list == expected.charge_list assert defect.in_atom is None