예제 #1
0
    def test_matches(self):
        self.assertTrue(self.NiO.matches(self.NiO_AFM_111))
        self.assertTrue(self.NiO.matches(self.NiO_AFM_001))

        # MSA adds magmoms to Structure, so not equal
        msa = CollinearMagneticStructureAnalyzer(
            self.NiO, overwrite_magmom_mode="replace_all")
        self.assertFalse(msa.matches_ordering(self.NiO))
        self.assertFalse(msa.matches_ordering(self.NiO_AFM_111))
        self.assertFalse(msa.matches_ordering(self.NiO_AFM_001))

        msa = CollinearMagneticStructureAnalyzer(
            self.NiO_AFM_001, overwrite_magmom_mode="respect_sign")
        self.assertFalse(msa.matches_ordering(self.NiO))
        self.assertFalse(msa.matches_ordering(self.NiO_AFM_111))
        self.assertTrue(msa.matches_ordering(self.NiO_AFM_001))
        self.assertTrue(msa.matches_ordering(self.NiO_AFM_001_opposite))

        msa = CollinearMagneticStructureAnalyzer(
            self.NiO_AFM_111, overwrite_magmom_mode="respect_sign")
        self.assertFalse(msa.matches_ordering(self.NiO))
        self.assertTrue(msa.matches_ordering(self.NiO_AFM_111))
        self.assertFalse(msa.matches_ordering(self.NiO_AFM_001))
        self.assertFalse(msa.matches_ordering(self.NiO_AFM_001_opposite))
예제 #2
0
    def collate_mp_data(struct):

        mag_tasks = {}
        min_energy = 0

        ordering_labels = {
            "Unknown": "Unknown",
            "FM": "Ferromagnetic",
            "AFM": "Antiferromagnetic",
            "FiM": "Ferrimagnetic",
            "NM": "Non-magnetic",
        }

        with MPRester(endpoint="https://zola.lbl.gov/rest/v2") as mpr:

            # find similar structures in Materials Project
            mpids = mpr.find_structure(struct)

            # and all tasks for those materials, specifically their structures
            # and total energy per atom
            for d in mpr.query({"task_id": {"$in": mpids}}, ["task_ids"]):

                for task_id in d["task_ids"]:

                    add_task = True

                    task_struct = mpr.get_task_data(
                        task_id, prop="structure")[0]["structure"]
                    have_magmoms = "magmom" in task_struct.site_properties
                    task_energy = mpr.get_task_data(
                        task_id, prop="energy_per_atom")[0]["energy_per_atom"]
                    min_energy = min([min_energy, task_energy])
                    msa = CollinearMagneticStructureAnalyzer(task_struct)

                    if not have_magmoms:
                        ordering = "Unknown"
                    else:
                        ordering = msa.ordering.value

                        # group together similar orderings, only display lowest
                        # energy task for each ordering
                        mag_tasks_to_remove = []

                        for mag_task_id, mag_task in mag_tasks.items():
                            struct_to_compare = mag_task["struct"]
                            if msa.matches_ordering(struct_to_compare):
                                # if existing task is lower in energy, keep that one
                                if mag_task["energy"] < task_energy:
                                    add_task = False
                                # else remove existing task and add this one
                                else:
                                    mag_tasks_to_remove.append(mag_task_id)

                        # remove higher energy duplicate tasks
                        for mag_task_id in mag_tasks_to_remove:
                            del mag_tasks[mag_task_id]

                    if add_task:
                        mag_tasks[task_id] = {
                            "struct": task_struct,
                            "ordering": ordering_labels[ordering],
                            "energy": task_energy,
                        }

        for k, v in mag_tasks.items():
            v["energy"] = 1000 * (v["energy"] - min_energy)
            mag_tasks[k] = v

        return mag_tasks