예제 #1
0
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')
예제 #2
0
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))
예제 #3
0
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)
예제 #4
0
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))
예제 #5
0
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
예제 #6
0
def get_identity_operator(atoms):
    equals = numpy.arange(0, len(atoms), 1)
    return SymmetryOperation("Identity", equals, None)