def process_item(self, item): """ Process the tasks and materials into a magnetism collection Args: item dict: a dict of material_id, structure, and tasks Returns: dict: a magnetism dictionary """ struct = Structure.from_dict(item["structure"]) total_magnetization = item["magnetism"].get( "total_magnetization", 0) # not necessarily == sum(magmoms) msa = CollinearMagneticStructureAnalyzer(struct) sign = np.sign(total_magnetization) total_magnetization = abs(total_magnetization) magmoms = list(sign * np.array(msa.magmoms)) magnetism = { self.magnetism.key: item[self.materials.key], "magnetism": { 'ordering': msa.ordering.value, 'is_magnetic': msa.is_magnetic, 'exchange_symmetry': msa.get_exchange_group_info()[1], 'num_magnetic_sites': msa.number_of_magnetic_sites, 'num_unique_magnetic_sites': msa.number_of_unique_magnetic_sites(), 'types_of_magnetic_species': [str(t) for t in msa.types_of_magnetic_specie], 'magmoms': magmoms, 'total_magnetization_normalized_vol': total_magnetization / struct.volume, 'total_magnetization_normalized_formula_units': total_magnetization / (struct.composition.get_reduced_composition_and_factor()[1]) }, "pymatgen_version": pymatgen_version } return magnetism
def calc(self, item): """ Process the tasks and materials into a magnetism collection Args: item dict: a dict of material_id, structure, and tasks Returns: dict: a magnetism dictionary """ struct = Structure.from_dict(get(item, "output.structure")) struct_has_magmoms = 'magmom' in struct.site_properties total_magnetization = abs( get(item, "calcs_reversed.0.output.outcar.total_magnetization", 0)) msa = CollinearMagneticStructureAnalyzer(struct) magmoms = msa.magmoms magnetism = { "magnetism": { 'ordering': msa.ordering.value if struct_has_magmoms else "Unknown", 'is_magnetic': msa.is_magnetic, 'exchange_symmetry': msa.get_exchange_group_info()[1], 'num_magnetic_sites': msa.number_of_magnetic_sites, 'num_unique_magnetic_sites': msa.number_of_unique_magnetic_sites(), 'types_of_magnetic_species': [str(t) for t in msa.types_of_magnetic_specie], 'magmoms': magmoms, 'total_magnetization': total_magnetization, 'total_magnetization_normalized_vol': total_magnetization / struct.volume, 'total_magnetization_normalized_formula_units': total_magnetization / (struct.composition.get_reduced_composition_and_factor()[1]) }, "pymatgen_version": pymatgen_version } return magnetism
def test_magnetic_properties(self): msa = CollinearMagneticStructureAnalyzer(self.GdB4) self.assertFalse(msa.is_collinear) msa = CollinearMagneticStructureAnalyzer(self.Fe) self.assertFalse(msa.is_magnetic) self.Fe.add_site_property("magmom", [5]) msa = CollinearMagneticStructureAnalyzer(self.Fe) self.assertTrue(msa.is_magnetic) self.assertTrue(msa.is_collinear) self.assertEqual(msa.ordering, Ordering.FM) msa = CollinearMagneticStructureAnalyzer( self.NiO, make_primitive=False, overwrite_magmom_mode="replace_all_if_undefined", ) self.assertEqual(msa.number_of_magnetic_sites, 4) self.assertEqual(msa.number_of_unique_magnetic_sites(), 1) self.assertEqual(msa.types_of_magnetic_species, (Element.Ni, )) self.assertEqual(msa.get_exchange_group_info(), ("Fm-3m", 225))