Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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])
    }
Ejemplo n.º 5
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]),
    }
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
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])
Ejemplo n.º 13
0
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]),
    }
Ejemplo n.º 14
0
    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
Ejemplo n.º 15
0
def test_simple_defect_msonable():
    defect = SimpleDefect("Va", "O1", [1, 2])
    assert_msonable(defect)
Ejemplo n.º 16
0
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
Ejemplo n.º 17
0
def test_simple_defect_hashable():
    defect = SimpleDefect(None, "O1", (1, 2))
    d = {defect: 1}
Ejemplo n.º 18
0
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