def get_matched_structure_mapping(base: Structure, inserted: Structure, sm: StructureMatcher): """ Get the mapping from the inserted structure onto the base structure, assuming that the inserted structure sans the working ion is some kind of SC of the base. Args: base: host structure, smaller cell inserted: bigger cell sm: StructureMatcher instance Returns: sc_m : supercell matrix to apply to s1 to get s2 total-t : translation to apply on s1 * sc_m to get s2 """ s1, s2 = sm._process_species([base, inserted]) fu, _ = sm._get_supercell_size(s1, s2) try: val, dist, sc_m, total_t, mapping = sm._strict_match(s1, s2, fu=fu, s1_supercell=True) except TypeError: return None sc = s1 * sc_m sc.lattice = Lattice.from_parameters(*sc.lattice.abc, *sc.lattice.angles, vesta=True) # type: ignore return sc_m, total_t
def test_get_supercell_size(self): l = Lattice.cubic(1) l2 = Lattice.cubic(0.9) s1 = Structure(l, ['Mg', 'Cu', 'Ag', 'Cu', 'Ag'], [[0] * 3] * 5) s2 = Structure(l2, ['Cu', 'Cu', 'Ag'], [[0] * 3] * 3) sm = StructureMatcher(supercell_size='volume') self.assertEqual(sm._get_supercell_size(s1, s2), (1, True)) self.assertEqual(sm._get_supercell_size(s2, s1), (1, True)) sm = StructureMatcher(supercell_size='num_sites') self.assertEqual(sm._get_supercell_size(s1, s2), (2, False)) self.assertEqual(sm._get_supercell_size(s2, s1), (2, True)) sm = StructureMatcher(supercell_size='Ag') self.assertEqual(sm._get_supercell_size(s1, s2), (2, False)) self.assertEqual(sm._get_supercell_size(s2, s1), (2, True)) sm = StructureMatcher(supercell_size='wfieoh') self.assertRaises(ValueError, sm._get_supercell_size, s1, s2)
def test_get_supercell_size(self): l = Lattice.cubic(1) l2 = Lattice.cubic(0.9) s1 = Structure(l, ["Mg", "Cu", "Ag", "Cu", "Ag"], [[0] * 3] * 5) s2 = Structure(l2, ["Cu", "Cu", "Ag"], [[0] * 3] * 3) sm = StructureMatcher(supercell_size="volume") self.assertEqual(sm._get_supercell_size(s1, s2), (1, True)) self.assertEqual(sm._get_supercell_size(s2, s1), (1, True)) sm = StructureMatcher(supercell_size="num_sites") self.assertEqual(sm._get_supercell_size(s1, s2), (2, False)) self.assertEqual(sm._get_supercell_size(s2, s1), (2, True)) sm = StructureMatcher(supercell_size="Ag") self.assertEqual(sm._get_supercell_size(s1, s2), (2, False)) self.assertEqual(sm._get_supercell_size(s2, s1), (2, True)) sm = StructureMatcher(supercell_size="wfieoh") self.assertRaises(ValueError, sm._get_supercell_size, s1, s2)
def test_get_supercell_size(self): l = Lattice.cubic(1) l2 = Lattice.cubic(0.9) s1 = Structure(l, ['Mg', 'Cu', 'Ag', 'Cu', 'Ag'], [[0]*3]*5) s2 = Structure(l2, ['Cu', 'Cu', 'Ag'], [[0]*3]*3) sm = StructureMatcher(supercell_size='volume') result = sm._get_supercell_size(s1, s2) self.assertEqual(result[0], 1) self.assertEqual(result[1], True) result = sm._get_supercell_size(s2, s1) self.assertEqual(result[0], 1) self.assertEqual(result[1], True) sm = StructureMatcher(supercell_size='num_sites') result = sm._get_supercell_size(s1, s2) self.assertEqual(result[0], 2) self.assertEqual(result[1], False) result = sm._get_supercell_size(s2, s1) self.assertEqual(result[0], 2) self.assertEqual(result[1], True)