def unique_symmetry_operations_as_vectors_from_structure( structure, subset = None ): """ Uses pymatgen symmetry analysis to find the minimum complete set of symmetry operations for the space group of a structure. Args: structure (pymatgen Structure): structure to be analysed. subset (Optional [list]): list of atom indices to be used for generating the symmetry operations Returns: a list of lists, containing the symmetry operations as vector mappings. """ symmetry_analyzer = SpacegroupAnalyzer( structure ) print( "The spacegroup for structure is {}".format(symmetry_analyzer.get_spacegroup_symbol()) ) symmetry_operations = symmetry_analyzer.get_symmetry_operations() mappings = [] if subset: species_subset = [ spec for i,spec in enumerate(structure.species) if i in subset] frac_coords_subset = [ coord for i, coord in enumerate( structure.frac_coords ) if i in subset ] mapping_structure = Structure( structure.lattice, species_subset, frac_coords_subset ) else: mapping_structure = structure for symmop in symmetry_operations: new_structure = Structure( mapping_structure.lattice, mapping_structure.species, symmop.operate_multi( mapping_structure.frac_coords ) ) new_mapping = [ x+1 for x in list( coord_list_mapping_pbc( new_structure.frac_coords, mapping_structure.frac_coords ) ) ] if new_mapping not in mappings: mappings.append( new_mapping ) return mappings
def test_coord_list_mapping_pbc(self): c1 = [0.1, 0.2, 0.3] c2 = [0.2, 0.3, 0.3] c3 = [0.5, 0.3, 0.6] c4 = [1.5, -0.7, -1.4] a = np.array([c1, c3, c2]) b = np.array([c4, c2, c1]) inds = coord_list_mapping_pbc(a, b) diff = a - b[inds] diff -= np.round(diff) self.assertTrue(np.allclose(diff, 0)) self.assertRaises(Exception, coord_list_mapping, [c1,c2], [c2,c3]) self.assertRaises(Exception, coord_list_mapping, [c2], [c2,c2])