def get_symmetry(bulk, symprec=1e-5): """ Return symmetry operations as hash. Hash key 'rotations' gives the numpy integer array of the rotation matrices for scaled positions Hash key 'translations' gives the numpy float64 array of the translation vectors in scaled positions """ # Atomic positions have to be specified by scaled positions for spglib. positions = bulk.get_scaled_positions().copy() lattice = bulk.get_cell().T.copy() numbers = bulk.get_atomic_numbers() # Get number of symmetry operations and allocate symmetry operations # multi = spg.multiplicity(cell, positions, numbers, symprec) multi = 48 * bulk.get_number_of_atoms() rotation = np.zeros((multi, 3, 3), dtype=int) translation = np.zeros((multi, 3)) # Get symmetry operations num_sym = spg.symmetry( rotation, translation, lattice, positions, numbers, symprec ) return {'rotations': rotation[:num_sym], 'translations': translation[:num_sym]}
def get_symmetry(bulk, symprec=1e-5, angle_tolerance=-1.0): """ Return symmetry operations as hash. Hash key 'rotations' gives the numpy integer array of the rotation matrices for scaled positions Hash key 'translations' gives the numpy double array of the translation vectors in scaled positions """ # Atomic positions have to be specified by scaled positions for spglib. positions = bulk.get_scaled_positions().copy() lattice = bulk.get_cell().T.copy() numbers = np.intc(bulk.get_atomic_numbers()).copy() # Get number of symmetry operations and allocate symmetry operations # multi = spg.multiplicity(cell, positions, numbers, symprec) multi = 48 * bulk.get_number_of_atoms() rotation = np.zeros((multi, 3, 3), dtype='intc') translation = np.zeros((multi, 3)) # Get symmetry operations magmoms = bulk.get_magnetic_moments() if magmoms == None: num_sym = spg.symmetry(rotation, translation, lattice, positions, numbers, symprec, angle_tolerance) else: num_sym = spg.symmetry_with_collinear_spin(rotation, translation, lattice, positions, numbers, magmoms, symprec, angle_tolerance) return { 'rotations': rotation[:num_sym].copy(), 'translations': translation[:num_sym].copy() }
def get_symmetry(bulk, use_magmoms=False, symprec=1e-5, angle_tolerance=-1.0): """ Return symmetry operations as hash. Hash key 'rotations' gives the numpy integer array of the rotation matrices for scaled positions Hash key 'translations' gives the numpy double array of the translation vectors in scaled positions """ # Atomic positions have to be specified by scaled positions for spglib. positions = np.array(bulk.get_scaled_positions(), dtype='double', order='C') lattice = np.array(bulk.get_cell().T, dtype='double', order='C') numbers = np.array(bulk.get_atomic_numbers(), dtype='intc') # Get number of symmetry operations and allocate symmetry operations # multi = spg.multiplicity(cell, positions, numbers, symprec) multi = 48 * bulk.get_number_of_atoms() rotation = np.zeros((multi, 3, 3), dtype='intc') translation = np.zeros((multi, 3), dtype='double') # Get symmetry operations if use_magmoms: magmoms = bulk.get_magnetic_moments() equivalent_atoms = np.zeros(len(magmoms), dtype='intc') num_sym = spg.symmetry_with_collinear_spin(rotation, translation, equivalent_atoms, lattice, positions, numbers, magmoms, symprec, angle_tolerance) return ({'rotations': np.array(rotation[:num_sym], dtype='intc', order='C'), 'translations': np.array(translation[:num_sym], dtype='double', order='C')}, equivalent_atoms) else: num_sym = spg.symmetry(rotation, translation, lattice, positions, numbers, symprec, angle_tolerance) return {'rotations': np.array(rotation[:num_sym], dtype='intc', order='C'), 'translations': np.array(translation[:num_sym], dtype='double', order='C')}
def get_symmetry(bulk, symprec=1e-5, angle_tolerance=-1.0): """ Return symmetry operations as hash. Hash key 'rotations' gives the numpy integer array of the rotation matrices for scaled positions Hash key 'translations' gives the numpy double array of the translation vectors in scaled positions """ # Atomic positions have to be specified by scaled positions for spglib. positions = bulk.get_scaled_positions().copy() lattice = bulk.get_cell().T.copy() numbers = np.intc(bulk.get_atomic_numbers()).copy() # Get number of symmetry operations and allocate symmetry operations # multi = spg.multiplicity(cell, positions, numbers, symprec) multi = 48 * bulk.get_number_of_atoms() rotation = np.zeros((multi, 3, 3), dtype='intc') translation = np.zeros((multi, 3)) # Get symmetry operations magmoms = bulk.get_magnetic_moments() if magmoms == None: num_sym = spg.symmetry(rotation, translation, lattice, positions, numbers, symprec, angle_tolerance) else: num_sym = spg.symmetry_with_collinear_spin(rotation, translation, lattice, positions, numbers, magmoms, symprec, angle_tolerance) return {'rotations': rotation[:num_sym].copy(), 'translations': translation[:num_sym].copy()}
def get_symmetry(cell, use_magmoms=False, symprec=1e-5, angle_tolerance=-1.0): """This gives crystal symmetry operations from a crystal structure. Args: cell: Crystal structrue given either in Atoms object or tuple. In the case given by a tuple, it has to follow the form below, (Lattice parameters in a 3x3 array (see the detail below), Fractional atomic positions in an Nx3 array, Integer numbers to distinguish species in a length N array, (optional) Collinear magnetic moments in a length N array), where N is the number of atoms. Lattice parameters are given in the form: [[a_x, a_y, a_z], [b_x, b_y, b_z], [c_x, c_y, c_z]] use_magmoms: bool: If True, collinear magnetic polarizatin is considered. symprec: float: Symmetry search tolerance in the unit of length. angle_tolerance: float: Symmetry search tolerance in the unit of angle deg. If the value is negative, an internally optimized routine is used to judge symmetry. Return: dictionary: Rotation parts and translation parts. 'rotations': Gives the numpy 'intc' array of the rotation matrices. 'translations': Gives the numpy 'double' array of fractional translations with respect to a, b, c axes. """ lattice, positions, numbers, magmoms = _expand_cell( cell, use_magmoms=use_magmoms) multi = 48 * len(positions) rotation = np.zeros((multi, 3, 3), dtype='intc') translation = np.zeros((multi, 3), dtype='double') # Get symmetry operations if use_magmoms: equivalent_atoms = np.zeros(len(magmoms), dtype='intc') num_sym = spg.symmetry_with_collinear_spin(rotation, translation, equivalent_atoms, lattice, positions, numbers, magmoms, symprec, angle_tolerance) return ({ 'rotations': np.array(rotation[:num_sym], dtype='intc', order='C'), 'translations': np.array(translation[:num_sym], dtype='double', order='C') }, equivalent_atoms) else: num_sym = spg.symmetry(rotation, translation, lattice, positions, numbers, symprec, angle_tolerance) return { 'rotations': np.array(rotation[:num_sym], dtype='intc', order='C'), 'translations': np.array(translation[:num_sym], dtype='double', order='C') }
def get_symmetry(cell, use_magmoms=False, symprec=1e-5, angle_tolerance=-1.0): """This gives crystal symmetry operations from a crystal structure. Args: cell: Crystal structrue given either in Atoms object or tuple. In the case given by a tuple, it has to follow the form below, (Lattice parameters in a 3x3 array (see the detail below), Fractional atomic positions in an Nx3 array, Integer numbers to distinguish species in a length N array, (optional) Collinear magnetic moments in a length N array), where N is the number of atoms. Lattice parameters are given in the form: [[a_x, a_y, a_z], [b_x, b_y, b_z], [c_x, c_y, c_z]] use_magmoms: bool: If True, collinear magnetic polarizatin is considered. symprec: float: Symmetry search tolerance in the unit of length. angle_tolerance: float: Symmetry search tolerance in the unit of angle deg. If the value is negative, an internally optimized routine is used to judge symmetry. Return: dictionary: Rotation parts and translation parts. 'rotations': Gives the numpy 'intc' array of the rotation matrices. 'translations': Gives the numpy 'double' array of fractional translations with respect to a, b, c axes. """ lattice, positions, numbers, magmoms = _expand_cell( cell, use_magmoms=use_magmoms) multi = 48 * len(positions) rotation = np.zeros((multi, 3, 3), dtype='intc') translation = np.zeros((multi, 3), dtype='double') # Get symmetry operations if use_magmoms: equivalent_atoms = np.zeros(len(magmoms), dtype='intc') num_sym = spg.symmetry_with_collinear_spin(rotation, translation, equivalent_atoms, lattice, positions, numbers, magmoms, symprec, angle_tolerance) return ({'rotations': np.array(rotation[:num_sym], dtype='intc', order='C'), 'translations': np.array(translation[:num_sym], dtype='double', order='C')}, equivalent_atoms) else: num_sym = spg.symmetry(rotation, translation, lattice, positions, numbers, symprec, angle_tolerance) return {'rotations': np.array(rotation[:num_sym], dtype='intc', order='C'), 'translations': np.array(translation[:num_sym], dtype='double', order='C')}