Beispiel #1
0
 def getSupercell(self, atoms):
     from pyspglib import spglib
     s = spglib.get_symmetry(atoms)
     symmetry = []
     print "building symmetry"
     for i, rot in enumerate(s['rotations'][:100]):
         print "symetry :", i
         trans = s['translations'][i]
         map0 = self.getMap(atoms, rot, trans)
         symmetry.append([rot, map0])
     return symmetry
Beispiel #2
0
 def getSupercell(self, atoms):
     from pyspglib import spglib
     s = spglib.get_symmetry(atoms)
     symmetry = []
     print("building symmetry")
     for i, rot in enumerate(s['rotations'][:100]):
         print("symetry :", i)
         trans = s['translations'][i]
         map0 = self.getMap(atoms, rot, trans)
         symmetry.append([rot, map0])
     return symmetry
def get_unique_wyckoff(prim):
    """ Function to find unique wyckoff sites in the primitive cell
    
    Parameters
        prim = pylada primitive cell

    Returns
        unique_list = unique list of sites (as numpy array) in primitive cell
    """
    p = deepcopy(prim)

    #Anuj_04/07/17: To make sure unique wyckoff is done on primitive
    #    p = primitive(pp)

    # compute space group for the given primitive cell using spglib
    sym = spglib.get_symmetry(p, 0.1)

    # compute inverce cell of the primitive cell
    inverse_cell = np.linalg.inv(p.cell)

    dummy_list = []
    wyckoff_list = []

    for i in range(len(p)):
        a = p[i].pos
        a3 = get_pos_in_prim_cell(p, a)
        frac_a = np.dot(inverse_cell, a3)
        symm_list = []
        for j in range(len(sym['rotations'])):
            # rotation matrix from sym
            R = sym['rotations'][j]
            # translation vector from sym
            Tt = sym['translations'][j]
            frac_symm_a = np.dot(R, frac_a) + Tt
            symm_a = np.dot(p.cell, frac_symm_a)
            symm_list.append(symm_a)
            symm_a2 = get_pos_in_prim_cell(p, symm_a)
            symm_list.append(symm_a2)
        # loop to find symmetrical equivalent positions
        for k in range(i + 1, len(p)):
            b = p[k].pos
            b2 = get_pos_in_prim_cell(p, b)
            # check distance between positions in pos and symm_list
            if any(distance.euclidean(b2, c) < 0.1 for c in symm_list):
                p[k].pos = p[i].pos
        dummy_list = a.tolist()
        dummy_list.append(p[i].type)
        wyckoff_list.append(dummy_list)

    ### getting unique array of positions
    unique_list = [list(t) for t in set(map(tuple, wyckoff_list))]

    return unique_list
def get_unique_ints(prim, int_pos, ttol=0.5):
    """ Function to find unique interstitial sites in the primitive cell
    
    Parameters
        prim = pylada primitive cell
        int_pos = list of interstitial positions in primitive cell
        ttol = tolerance, default = 0.5

    Returns
        unique_int_list = list of unique intestital sites (cartesian (x,y,z) as list) in primitive cell
    """
    prim2 = deepcopy(prim)
    pos2 = deepcopy(int_pos)
    sym2 = spglib.get_symmetry(prim2, 0.1)

    inverse_cell2 = np.linalg.inv(prim2.cell)
    int_list2 = []

    for i in range(len(pos2)):
        #   numpy 1D array into column vector with shape listed as (3,)
        a4 = pos2[i]
        frac_a4 = np.dot(inverse_cell2, a4)
        symm_list2 = []
        for j in range(len(sym2['rotations'])):
            R = sym2['rotations'][j]
            Tt = sym2['translations'][j]
            frac_symm_a4 = np.dot(R, frac_a4) + Tt
            symm_a4 = np.dot(prim2.cell, frac_symm_a4)
            symm_list2.append(symm_a4)
            symm_a5 = get_pos_in_prim_cell(prim2, symm_a4)
            symm_list2.append(symm_a5)
        # loop to find symmetrical equivalent positions
        for k in range(i + 1, len(pos2)):
            b2 = pos2[k]
            # check distance between positions in pos and symm_list
            if any(distance.euclidean(b2, c2) < ttol for c2 in symm_list2):
                pos2[k] = pos2[i]
        int_list2.append(pos2[i])

    ### getting the unique list of interstitials
    unique_int_list = [list(t) for t in set(map(tuple, int_list2))]

    return unique_int_list
Beispiel #5
0
# import vasp
# bulk = vasp.read_vasp(sys.argv[1])

print "[get_spacegroup]"
print "  Spacegroup of Silicon is ", spglib.get_spacegroup(silicon)
print ""
print "[get_spacegroup]"
print "  Spacegroup of Rutile is ", spglib.get_spacegroup(rutile)
print ""
print "[get_spacegroup]"
print "  Spacegroup of MgB2 is ", spglib.get_spacegroup(MgB2)
print ""
print "[get_symmetry]"
print "  Symmetry operations of Rutile unitcell are:"
print ""
symmetry = spglib.get_symmetry(rutile)
for i in range(symmetry['rotations'].shape[0]):
    print "  --------------- %4d ---------------" % (i + 1)
    rot = symmetry['rotations'][i]
    trans = symmetry['translations'][i]
    print "  rotation:"
    for x in rot:
        print "     [%2d %2d %2d]" % (x[0], x[1], x[2])
    print "  translation:"
    print "     (%8.5f %8.5f %8.5f)" % (trans[0], trans[1], trans[2])
print ""
print "[get_pointgroup]"
print "  Pointgroup of Rutile is", spglib.get_pointgroup(
    symmetry['rotations'])[0]
print ""
Beispiel #6
0
# import vasp
# bulk = vasp.read_vasp(sys.argv[1])

print "[get_spacegroup]"
print "  Spacegroup of Silicon is ", spglib.get_spacegroup(silicon)
print ""
print "[get_spacegroup]"
print "  Spacegroup of Rutile is ", spglib.get_spacegroup(rutile)
print ""
print "[get_spacegroup]"
print "  Spacegroup of MgB2 is ", spglib.get_spacegroup(MgB2)
print ""
print "[get_symmetry]"
print "  Symmetry operations of Rutile unitcell are:"
print ""
symmetry = spglib.get_symmetry( rutile )
for i in range(symmetry['rotations'].shape[0]):
  print "  --------------- %4d ---------------" % (i+1)
  rot = symmetry['rotations'][i]
  trans = symmetry['translations'][i]
  print "  rotation:"
  for x in rot:
    print "     [%2d %2d %2d]" % (x[0], x[1], x[2])
  print "  translation:"
  print "     (%8.5f %8.5f %8.5f)" % (trans[0], trans[1], trans[2])
print ""
print "[get_pointgroup]"
print "  Pointgroup of Rutile is", spglib.get_pointgroup(symmetry['rotations'])[0]
print ""

dataset = spglib.get_symmetry_dataset( rutile )
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
#!/usr/bin/evn python

import sys
from atoms import Atoms
from vasp import read_vasp
from pyspglib import spglib
import numpy as np

def get_magmom(text):
    magmom = []
    for numxmag in text.split():
        num, mag = numxmag.split('*')
        magmom += [float(mag)] * int(num)
    return magmom

def parse_incar(filename):
    for line in open(filename):
        for conf in line.split(';'):
            if 'MAGMOM' in conf:
                return get_magmom(conf.split('=')[1])

cell = read_vasp(sys.argv[1]) # POSCAR
magmoms = parse_incar(sys.argv[2]) # INCAR
cell.set_magnetic_moments(magmoms)
symmetry = spglib.get_symmetry(cell, symprec=1e-3)
print len(symmetry['rotations'])
#!/usr/bin/evn python

import sys
from atoms import Atoms
from vasp import read_vasp
from pyspglib import spglib
import numpy as np


def get_magmom(text):
    magmom = []
    for numxmag in text.split():
        num, mag = numxmag.split('*')
        magmom += [float(mag)] * int(num)
    return magmom


def parse_incar(filename):
    for line in open(filename):
        for conf in line.split(';'):
            if 'MAGMOM' in conf:
                return get_magmom(conf.split('=')[1])


cell = read_vasp(sys.argv[1])  # POSCAR
magmoms = parse_incar(sys.argv[2])  # INCAR
cell.set_magnetic_moments(magmoms)
symmetry = spglib.get_symmetry(cell, symprec=1e-3)
print len(symmetry['rotations'])