コード例 #1
0
class ComputedEntryTest(unittest.TestCase):
    def setUp(self):
        self.entry = ComputedEntry(vasprun.final_structure.composition,
                                   vasprun.final_energy,
                                   parameters=vasprun.incar)
        self.entry2 = ComputedEntry({"Fe": 2, "O": 3}, 2.3)
        self.entry3 = ComputedEntry("Fe2O3", 2.3)
        self.entry4 = ComputedEntry("Fe2O3", 2.3, entry_id=1)

    def test_energy(self):
        self.assertAlmostEqual(self.entry.energy, -269.38319884)
        self.entry.correction = 1.0
        self.assertAlmostEqual(self.entry.energy, -268.38319884)
        self.assertAlmostEqual(self.entry3.energy_per_atom, 2.3 / 5)

    def test_composition(self):
        self.assertEqual(self.entry.composition.reduced_formula, "LiFe4(PO4)4")
        self.assertEqual(self.entry2.composition.reduced_formula, "Fe2O3")

    def test_to_from_dict(self):
        d = self.entry.as_dict()
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.energy, -269.38319884)

    def test_entry_id(self):
        self.assertEqual(self.entry4.entry_id, 1)
        self.assertEqual(self.entry2.entry_id, None)

    def test_str(self):
        self.assertIsNotNone(str(self.entry))
コード例 #2
0
class ComputedEntryTest(unittest.TestCase):
    def setUp(self):
        self.entry = ComputedEntry(vasprun.final_structure.composition, vasprun.final_energy, parameters=vasprun.incar)
        self.entry2 = ComputedEntry({"Fe": 2, "O": 3}, 2.3)
        self.entry3 = ComputedEntry("Fe2O3", 2.3)
        self.entry4 = ComputedEntry("Fe2O3", 2.3, entry_id=1)

    def test_energy(self):
        self.assertAlmostEqual(self.entry.energy, -269.38319884)
        self.entry.correction = 1.0
        self.assertAlmostEqual(self.entry.energy, -268.38319884)
        self.assertAlmostEqual(self.entry3.energy_per_atom, 2.3 / 5)

    def test_composition(self):
        self.assertEqual(self.entry.composition.reduced_formula, "LiFe4(PO4)4")
        self.assertEqual(self.entry2.composition.reduced_formula, "Fe2O3")

    def test_to_from_dict(self):
        d = self.entry.as_dict()
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.energy, -269.38319884)

    def test_entry_id(self):
        self.assertEqual(self.entry4.entry_id, 1)
        self.assertEqual(self.entry2.entry_id, None)

    def test_str(self):
        self.assertIsNotNone(str(self.entry))
コード例 #3
0
class ComputedEntryTest(unittest.TestCase):

    def setUp(self):
        self.entry = ComputedEntry(vasprun.final_structure.composition,
                                   vasprun.final_energy,
                                   parameters=vasprun.incar)
        self.entry2 = ComputedEntry({"Fe": 2, "O": 3}, 2.3)
        self.entry3 = ComputedEntry("Fe2O3", 2.3)
        self.entry4 = ComputedEntry("Fe2O3", 2.3, entry_id=1)
        self.entry5 = ComputedEntry("Fe6O9", 6.9)

    def test_energy(self):
        self.assertAlmostEqual(self.entry.energy, -269.38319884)
        self.entry.correction = 1.0
        self.assertAlmostEqual(self.entry.energy, -268.38319884)
        self.assertAlmostEqual(self.entry3.energy_per_atom, 2.3 / 5)

    def test_composition(self):
        self.assertEqual(self.entry.composition.reduced_formula, "LiFe4(PO4)4")
        self.assertEqual(self.entry2.composition.reduced_formula, "Fe2O3")
        self.assertEqual(self.entry5.composition.reduced_formula, "Fe2O3")
        self.assertEqual(self.entry5.composition.get_reduced_formula_and_factor()[1], 3)

    def test_normalize(self):
        entry = ComputedEntry("Fe6O9", 6.9, correction=1)
        entry.normalize()
        self.assertEqual(entry.composition.formula, "Fe2 O3")
        self.assertAlmostEqual(entry.uncorrected_energy, 6.9/3)
        self.assertAlmostEqual(entry.correction, 1/3)
        self.assertAlmostEqual(entry.energy * 3, 6.9 + 1)
        entry.normalize("atom")
        self.assertEqual(entry.composition.formula, "Fe0.4 O0.6")
        self.assertAlmostEqual(entry.uncorrected_energy, 6.9/15)
        self.assertAlmostEqual(entry.correction, 1/15)
        self.assertAlmostEqual(entry.energy * 15, 6.9 + 1)

    def test_to_from_dict(self):
        d = self.entry.as_dict()
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.energy, -269.38319884)

    def test_entry_id(self):
        self.assertEqual(self.entry4.entry_id, 1)
        self.assertEqual(self.entry2.entry_id, None)

    def test_str(self):
        self.assertIsNotNone(str(self.entry))

    def test_sulfide_energy(self):
        self.entry = ComputedEntry("BaS", -10.21249155)
        self.assertAlmostEqual(self.entry.energy, -10.21249155)
        self.assertAlmostEqual(self.entry.energy_per_atom, -10.21249155 / 2)
        self.entry.correction = 1.0
        self.assertAlmostEqual(self.entry.energy, -9.21249155)

    def test_is_element(self):
        entry = ComputedEntry("Fe3",2.3)
        self.assertTrue(entry.is_element)
コード例 #4
0
    def test_normalize_not_in_place(self):
        ealist = [
            ManualEnergyAdjustment(5),
            ConstantEnergyAdjustment(5),
            CompositionEnergyAdjustment(1, 5, uncertainty_per_atom=0, name="Na"),
            TemperatureEnergyAdjustment(0.005, 100, 10, uncertainty_per_deg=0),
        ]
        entry = ComputedEntry("Na5Cl5", 6.9, energy_adjustments=ealist)

        normed_entry = entry.normalize(inplace=False)
        entry.normalize()

        self.assertEqual(normed_entry.as_dict(), entry.as_dict())
コード例 #5
0
class ComputedEntryTest(unittest.TestCase):
    def setUp(self):
        self.entry = ComputedEntry(
            vasprun.final_structure.composition,
            vasprun.final_energy,
            parameters=vasprun.incar,
        )
        self.entry2 = ComputedEntry({"Fe": 2, "O": 3}, 2.3)
        self.entry3 = ComputedEntry("Fe2O3", 2.3)
        self.entry4 = ComputedEntry("Fe2O3", 2.3, entry_id=1)
        self.entry5 = ComputedEntry("Fe6O9", 6.9)
        ea = ConstantEnergyAdjustment(-5, name="Dummy adjustment")
        self.entry6 = ComputedEntry("Fe6O9", 6.9, correction=-10)
        self.entry7 = ComputedEntry("Fe6O9", 6.9, energy_adjustments=[ea])

    def test_energy(self):
        self.assertAlmostEqual(self.entry.energy, -269.38319884)
        self.entry.correction = 1.0
        self.assertAlmostEqual(self.entry.energy, -268.38319884)
        self.assertAlmostEqual(self.entry3.energy_per_atom, 2.3 / 5)

    def test_composition(self):
        self.assertEqual(self.entry.composition.reduced_formula, "LiFe4(PO4)4")
        self.assertEqual(self.entry2.composition.reduced_formula, "Fe2O3")
        self.assertEqual(self.entry5.composition.reduced_formula, "Fe2O3")
        self.assertEqual(
            self.entry5.composition.get_reduced_formula_and_factor()[1], 3)

    def test_per_atom_props(self):
        entry = ComputedEntry("Fe6O9", 6.9)
        entry.energy_adjustments.append(
            CompositionEnergyAdjustment(-0.5,
                                        9,
                                        uncertainty_per_atom=0.1,
                                        name="O"))
        self.assertAlmostEqual(entry.energy, 2.4)
        self.assertAlmostEqual(entry.energy_per_atom, 2.4 / 15)
        self.assertAlmostEqual(entry.uncorrected_energy, 6.9)
        self.assertAlmostEqual(entry.uncorrected_energy_per_atom, 6.9 / 15)
        self.assertAlmostEqual(entry.correction, -4.5)
        self.assertAlmostEqual(entry.correction_per_atom, -4.5 / 15)
        self.assertAlmostEqual(entry.correction_uncertainty, 0.9)
        self.assertAlmostEqual(entry.correction_uncertainty_per_atom, 0.9 / 15)

    def test_normalize(self):
        entry = ComputedEntry("Fe6O9", 6.9, correction=1)
        entry.normalize()
        self.assertEqual(entry.composition.formula, "Fe2 O3")
        self.assertAlmostEqual(entry.uncorrected_energy, 6.9 / 3)
        self.assertAlmostEqual(entry.correction, 1 / 3)
        self.assertAlmostEqual(entry.energy * 3, 6.9 + 1)
        self.assertAlmostEqual(entry.energy_adjustments[0].value, 1 / 3)
        entry.normalize("atom")
        self.assertEqual(entry.composition.formula, "Fe0.4 O0.6")
        self.assertAlmostEqual(entry.uncorrected_energy, 6.9 / 15)
        self.assertAlmostEqual(entry.correction, 1 / 15)
        self.assertAlmostEqual(entry.energy * 15, 6.9 + 1)
        self.assertAlmostEqual(entry.energy_adjustments[0].value, 1 / 15)

    def test_normalize_energy_adjustments(self):
        ealist = [
            ManualEnergyAdjustment(5),
            ConstantEnergyAdjustment(5),
            CompositionEnergyAdjustment(1,
                                        5,
                                        uncertainty_per_atom=0,
                                        name="Na"),
            TemperatureEnergyAdjustment(0.005, 100, 10, uncertainty_per_deg=0),
        ]
        entry = ComputedEntry("Na5Cl5", 6.9, energy_adjustments=ealist)
        assert entry.correction == 20
        entry.normalize()
        assert entry.correction == 4
        for ea in entry.energy_adjustments:
            assert ea.value == 1

    def test_normalize_not_in_place(self):
        ealist = [
            ManualEnergyAdjustment(5),
            ConstantEnergyAdjustment(5),
            CompositionEnergyAdjustment(1,
                                        5,
                                        uncertainty_per_atom=0,
                                        name="Na"),
            TemperatureEnergyAdjustment(0.005, 100, 10, uncertainty_per_deg=0),
        ]
        entry = ComputedEntry("Na5Cl5", 6.9, energy_adjustments=ealist)

        normed_entry = entry.normalize(inplace=False)
        entry.normalize()

        self.assertEqual(normed_entry.as_dict(), entry.as_dict())

    def test_to_from_dict(self):
        d = self.entry.as_dict()
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.energy, -269.38319884)

    def test_to_from_dict_with_adjustment(self):
        """
        Legacy case where adjustment was provided manually
        """
        d = self.entry6.as_dict()
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.uncorrected_energy, 6.9)
        self.assertEqual(e.energy_adjustments[0].value,
                         self.entry6.energy_adjustments[0].value)

    def test_to_from_dict_with_adjustment_2(self):
        """
        Modern case where correction was provided manually
        """
        d = self.entry7.as_dict()
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.uncorrected_energy, 6.9)
        self.assertEqual(e.energy_adjustments[0].value,
                         self.entry7.energy_adjustments[0].value)

    def test_to_from_dict_with_adjustment_3(self):
        """
        Legacy case where the entry was serialized before the energy_adjustment
        attribute was part of ComputedEntry
        """
        # same as entry6
        d = {
            "@module": "pymatgen.entries.computed_entries",
            "@class": "ComputedEntry",
            "energy": 6.9,
            "composition": defaultdict(float, {
                "Fe": 6.0,
                "O": 9.0
            }),
            "parameters": {},
            "data": {},
            "entry_id": None,
            "correction": -10,
        }
        e = ComputedEntry.from_dict(d)
        self.assertAlmostEqual(e.uncorrected_energy, 6.9)
        self.assertAlmostEqual(e.correction, -10)
        assert len(e.energy_adjustments) == 1

    def test_conflicting_correction_adjustment(self):
        """
        Should raise a ValueError if a user tries to manually set both the correction
        and energy_adjustment, even if the values match.
        """
        ea = ConstantEnergyAdjustment(-10, name="Dummy adjustment")
        with pytest.raises(ValueError, match="Argument conflict!"):
            ComputedEntry("Fe6O9",
                          6.9,
                          correction=-10,
                          energy_adjustments=[ea])

    def test_entry_id(self):
        self.assertEqual(self.entry4.entry_id, 1)
        self.assertEqual(self.entry2.entry_id, None)

    def test_str(self):
        self.assertIsNotNone(str(self.entry))

    def test_sulfide_energy(self):
        self.entry = ComputedEntry("BaS", -10.21249155)
        self.assertAlmostEqual(self.entry.energy, -10.21249155)
        self.assertAlmostEqual(self.entry.energy_per_atom, -10.21249155 / 2)
        self.entry.correction = 1.0
        self.assertAlmostEqual(self.entry.energy, -9.21249155)

    def test_is_element(self):
        entry = ComputedEntry("Fe3", 2.3)
        self.assertTrue(entry.is_element)