def check_mirror(atoms, normal_vector, debug=False): com = atoms.get_center_of_mass() # normalize vector L = numpy.linalg.norm(normal_vector) normal_vector /= L mirrored = mirror_through_plane(atoms, normal_vector, debug=debug) if debug: print normal_vector print atoms.get_positions() print mirrored from ice_package.help_methods import get_oxygens import ase ase.visualize.view(get_oxygens(mirrored)) ase.visualize.view(atoms) print normal_vector raw_input("Continue") result = get_equals(atoms, mirrored, debug=debug) if result == None: return None return SymmetryOperation('sigma', result, None, vector=normal_vector, magnitude=1, order_no=0, type='sigma')
def check_improper_rotation(atoms, vector, angle, center, n, result, order_no=0): a = atoms.copy() a.rotate(vector, a=angle, center=center) positions = mirror_through_plane(a, vector) equals = get_equals(atoms, positions) on = order_no # n = 2 is equal with inversion operator if n == 2 or (float(order_no + 1) / float(n)) == 0.5: return if equals != None: operation_name = "S%i" % n while order_no > 0: operation_name += "'" order_no -= 1 result.append( SymmetryOperation(operation_name, equals, None, vector=vector, magnitude=n, type='S', order_no=on))
def check_inversion_center(atoms): positions = positions_related_to_center_of_mass(atoms, atoms.get_positions()) positions = -positions + atoms.get_center_of_mass() result = get_equals(atoms, positions) if result == None: return None print "Inversion center found" return SymmetryOperation("i", result, None, type='i', order_no=0, magnitude=1)
def check_single_rotation(atoms, vector, angle, center, n, result, order_no=0): a = atoms.copy() a.rotate(vector, a=angle, center=center) positions = a.get_positions() equals = get_equals(atoms, positions) on = order_no if equals != None: operation_name = "C%i" % n while order_no > 0: operation_name += "'" order_no -= 1 result.append( SymmetryOperation(operation_name, equals, None, vector=vector, magnitude=n, type='C', order_no=on))
def get_periodic_symmetry_operations(atoms, error_tolerance=0.01, debug=False): from ase.utils import irotate from ase.visualize import view from pyspglib import spglib #symmetry = spglib.get_symmetry(atoms, symprec=1e-5) symmetry = spglib.get_symmetry(atoms, symprec=1e-2) dataset = spglib.get_symmetry_dataset(atoms, symprec=1e-2) result = [] if debug: cell, scaled_positions, numbers = spglib.find_primitive(atoms, symprec=1e-5) a = Atoms(symbols='O4', cell=cell, scaled_positions=scaled_positions, pbc=True) #symmetry = spglib.get_symmetry(a, symprec=1e-2) #dataset = spglib.get_symmetry_dataset(a, symprec=1e-2) print dataset['equivalent_atoms'] print dataset['international'] print dataset['hall'] print dataset['wyckoffs'] print dataset['transformation_matrix'] print "Number of symmetry operations %i" % len(dataset['rotations']) for i in range(dataset['rotations'].shape[0]): new_atoms = atoms.copy() test = atoms.copy() rot = dataset['rotations'][i] trans = dataset['translations'][i] if debug: x, y, z = irotate(rot) #print x, y, z print "------------------- %i -----------------------" % i print "Rotation" print rot print "Translation" print trans new_pos = new_atoms.get_scaled_positions() for l, pos in enumerate(new_atoms.get_scaled_positions()): #print new_pos[l] new_pos[l] = (numpy.dot(rot, pos)) new_pos[l] += trans #print new_pos[l] new_atoms.set_scaled_positions(new_pos) equals = get_equals_periodic(atoms, new_atoms, error_tolerance=error_tolerance, debug=debug) if equals != None: so = SymmetryOperation(str(i), equals, None, vector=None, magnitude=1, rotation_matrix=rot, translation_vector=trans) #if debug: # print so result.append(so) else: print "Equivalent not found" #view(test) #view(new_atoms) #raw_input() return result
def get_identity_operator(atoms): equals = numpy.arange(0, len(atoms), 1) return SymmetryOperation("Identity", equals, None)