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 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
# 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 ""
# 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'])