def read_castep(filename): f_castep = open(filename) castep_in = CastepIn(f_castep.readlines()) f_castep.close() tags = castep_in.get_tags() # 1st stage is to create Atoms object ignoring Spin polarization. General case. cell = Atoms(cell=tags['lattice_vectors'], symbols=tags['atomic_species'], scaled_positions=tags['coordinates']) # Analyse spin states and add data to Atoms instance "cell" if ones exist magmoms = tags['magnetic_moments'] if magmoms is not None: # Print out symmetry information for magnetic cases # Original code from structure/symmetry.py symmetry = Symmetry(cell, symprec=1e-5) print( "CASTEP-interface: Magnetic structure, number of operations without spin: %d" % len(symmetry.get_symmetry_operations()['rotations'])) print("CASTEP-interface: Spacegroup without spin: %s" % symmetry.get_international_table()) cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-5) print( "CASTEP-interface: Magnetic structure, number of operations with spin: %d" % len(symmetry.get_symmetry_operations()['rotations'])) print("") return cell
def gencastep(fn,modenum,basis,natom,typatsym,symprec,atpos): from phonopy import Phonopy import phonopy.structure.spglib as spg from phonopy.structure.atoms import PhonopyAtoms as Atoms from phonopy.structure.symmetry import Symmetry, find_primitive, get_pointgroup fh=open(fn,'w') unitcell = Atoms(symbols=typatsym, cell=basis, positions=atpos) pbasis=np.eye(3) for i in range(len(basis)): pbasis[i]=basis[i]/np.linalg.norm(basis[i]) symmetry = Symmetry(unitcell, symprec) rotations = symmetry.get_symmetry_operations()['rotations'] translations = symmetry.get_symmetry_operations()['translations'] print('Space group International symbol: %s' % symmetry.get_international_table()) fh.write('%BLOCK LATTICE_CART\n') for bl in basis: fh.write('%s\n' % ''.join(' %12.8f' % b for b in bl)) fh.write('%ENDBLOCK LATTICE_CART\n\n') fh.write('%BLOCK POSITIONS_ABS\n') for i in range(len(typatsym)): fh.write(" %3s " % typatsym[i]) fh.write('%s\n' % ''.join(' %12.8f' % p for p in atpos[i].tolist())) fh.write('%ENDBLOCK POSITIONS_ABS\n\n') fh.write('SYMMETRY_TOL : %f ang\n' % symprec) fh.write('SYMMETRY_GENERATE \n') fh.write('#KPOINT_MP_GRID : 4 4 4\n#KPOINT_MP_OFFSET : 0.5 0.5 0.5\n')
def test_magmom(self): symprec = 1e-5 cell = get_unitcell_from_phonopy_yaml(os.path.join(data_dir,"Cr.yaml")) symmetry_nonspin = Symmetry(cell, symprec=symprec) atom_map_nonspin = symmetry_nonspin.get_map_atoms() len_sym_nonspin = len( symmetry_nonspin.get_symmetry_operations()['rotations']) spin = [1, -1] cell_withspin = cell.copy() cell_withspin.set_magnetic_moments(spin) symmetry_withspin = Symmetry(cell_withspin, symprec=symprec) atom_map_withspin = symmetry_withspin.get_map_atoms() len_sym_withspin = len( symmetry_withspin.get_symmetry_operations()['rotations']) broken_spin = [1, -2] cell_brokenspin = cell.copy() cell_brokenspin = cell.copy() cell_brokenspin.set_magnetic_moments(broken_spin) symmetry_brokenspin = Symmetry(cell_brokenspin, symprec=symprec) atom_map_brokenspin = symmetry_brokenspin.get_map_atoms() len_sym_brokenspin = len( symmetry_brokenspin.get_symmetry_operations()['rotations']) self.assertTrue((atom_map_nonspin == atom_map_withspin).all()) self.assertFalse((atom_map_nonspin == atom_map_brokenspin).all()) self.assertTrue(len_sym_nonspin == len_sym_withspin) self.assertFalse(len_sym_nonspin == len_sym_brokenspin)
def read_crystal(filename): f_crystal = open(filename) crystal_in = CrystalIn(f_crystal.readlines()) f_crystal.close() tags = crystal_in.get_tags() cell = Atoms(cell=tags['lattice_vectors'], symbols=tags['atomic_species'], scaled_positions=tags['coordinates']) magmoms = tags['magnetic_moments'] if magmoms is not None: # Print out symmetry information for magnetic cases # Original code from structure/symmetry.py symmetry = Symmetry(cell, symprec=1e-5) print( "CRYSTAL-interface: Magnetic structure, number of operations without spin: %d" % len(symmetry.get_symmetry_operations()['rotations'])) print("CRYSTAL-interface: Spacegroup without spin: %s" % symmetry.get_international_table()) cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-5) print( "CRYSTAL-interface: Magnetic structure, number of operations with spin: %d" % len(symmetry.get_symmetry_operations()['rotations'])) print("") return cell, tags['conv_numbers']
def gencastep(fn, modenum, basis, natom, typatsym, symprec, atpos): from phonopy import Phonopy import phonopy.structure.spglib as spg from phonopy.structure.atoms import PhonopyAtoms as Atoms from phonopy.structure.symmetry import Symmetry, find_primitive, get_pointgroup fh = open(fn, 'w') unitcell = Atoms(symbols=typatsym, cell=basis, positions=atpos) pbasis = np.eye(3) for i in range(len(basis)): pbasis[i] = basis[i] / np.linalg.norm(basis[i]) symmetry = Symmetry(unitcell, symprec) rotations = symmetry.get_symmetry_operations()['rotations'] translations = symmetry.get_symmetry_operations()['translations'] print('Space group International symbol: %s' % symmetry.get_international_table()) fh.write('%BLOCK LATTICE_CART\n') for bl in basis: fh.write('%s\n' % ''.join(' %12.8f' % b for b in bl)) fh.write('%ENDBLOCK LATTICE_CART\n\n') fh.write('%BLOCK POSITIONS_ABS\n') for i in range(len(typatsym)): fh.write(" %3s " % typatsym[i]) fh.write('%s\n' % ''.join(' %12.8f' % p for p in atpos[i].tolist())) fh.write('%ENDBLOCK POSITIONS_ABS\n\n') fh.write('SYMMETRY_TOL : %f ang\n' % symprec) fh.write('SYMMETRY_GENERATE \n') fh.write('#KPOINT_MP_GRID : 4 4 4\n#KPOINT_MP_OFFSET : 0.5 0.5 0.5\n')
def test_magmom(convcell_cr): symprec = 1e-5 cell = convcell_cr symmetry_nonspin = Symmetry(cell, symprec=symprec) atom_map_nonspin = symmetry_nonspin.get_map_atoms() len_sym_nonspin = len( symmetry_nonspin.get_symmetry_operations()['rotations']) spin = [1, -1] cell_withspin = cell.copy() cell_withspin.set_magnetic_moments(spin) symmetry_withspin = Symmetry(cell_withspin, symprec=symprec) atom_map_withspin = symmetry_withspin.get_map_atoms() len_sym_withspin = len( symmetry_withspin.get_symmetry_operations()['rotations']) broken_spin = [1, -2] cell_brokenspin = cell.copy() cell_brokenspin = cell.copy() cell_brokenspin.set_magnetic_moments(broken_spin) symmetry_brokenspin = Symmetry(cell_brokenspin, symprec=symprec) atom_map_brokenspin = symmetry_brokenspin.get_map_atoms() len_sym_brokenspin = len( symmetry_brokenspin.get_symmetry_operations()['rotations']) assert (atom_map_nonspin == atom_map_withspin).all() assert (atom_map_nonspin != atom_map_brokenspin).any() assert len_sym_nonspin == len_sym_withspin assert len_sym_nonspin != len_sym_brokenspin
def read_crystal(filename): f_crystal = open(filename) crystal_in = CrystalIn(f_crystal.readlines()) f_crystal.close() tags = crystal_in.get_tags() cell = Atoms(cell=tags['lattice_vectors'], symbols=tags['atomic_species'], scaled_positions=tags['coordinates']) magmoms = tags['magnetic_moments'] if magmoms is not None: # Print out symmetry information for magnetic cases # Original code from structure/symmetry.py symmetry = Symmetry(cell, symprec=1e-5) print("CRYSTAL-interface: Magnetic structure, number of operations without spin: %d" % len(symmetry.get_symmetry_operations()['rotations'])) print("CRYSTAL-interface: Spacegroup without spin: %s" % symmetry.get_international_table()) cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-5) print("CRYSTAL-interface: Magnetic structure, number of operations with spin: %d" % len(symmetry.get_symmetry_operations()['rotations'])) print("") return cell, tags['conv_numbers']
def test_magmom(self): symprec = 1e-5 cell = read_cell_yaml(os.path.join(data_dir, "Cr.yaml")) symmetry_nonspin = Symmetry(cell, symprec=symprec) atom_map_nonspin = symmetry_nonspin.get_map_atoms() len_sym_nonspin = len( symmetry_nonspin.get_symmetry_operations()['rotations']) spin = [1, -1] cell_withspin = cell.copy() cell_withspin.set_magnetic_moments(spin) symmetry_withspin = Symmetry(cell_withspin, symprec=symprec) atom_map_withspin = symmetry_withspin.get_map_atoms() len_sym_withspin = len( symmetry_withspin.get_symmetry_operations()['rotations']) broken_spin = [1, -2] cell_brokenspin = cell.copy() cell_brokenspin = cell.copy() cell_brokenspin.set_magnetic_moments(broken_spin) symmetry_brokenspin = Symmetry(cell_brokenspin, symprec=symprec) atom_map_brokenspin = symmetry_brokenspin.get_map_atoms() len_sym_brokenspin = len( symmetry_brokenspin.get_symmetry_operations()['rotations']) self.assertTrue((atom_map_nonspin == atom_map_withspin).all()) self.assertFalse((atom_map_nonspin == atom_map_brokenspin).all()) self.assertTrue(len_sym_nonspin == len_sym_withspin) self.assertFalse(len_sym_nonspin == len_sym_brokenspin)
def _distribute_forces(supercell, disp, forces, filename, symprec): natom = supercell.get_number_of_atoms() lattice = supercell.get_cell() symbols = supercell.get_chemical_symbols() positions = supercell.get_positions() positions[disp[0]] += disp[1] cell = Atoms(cell=lattice, positions=positions, symbols=symbols, pbc=True) symmetry = Symmetry(cell, symprec) independent_atoms = symmetry.get_independent_atoms() # Rotation matrices in Cartesian rotations = [] for r in symmetry.get_symmetry_operations()["rotations"]: rotations.append(similarity_transformation(lattice.T, r)) map_operations = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() atoms_in_dot_scf = _get_independent_atoms_in_dot_scf(filename) if len(forces) != len(atoms_in_dot_scf): print("%s does not contain necessary information." % filename) print('Plese check if there are "FGL" lines with') print('"total forces" are required.') return False if len(atoms_in_dot_scf) == natom: print("It is assumed that there is no symmetrically-equivalent " "atoms in ") print("'%s' at wien2k calculation." % filename) force_set = forces elif len(forces) != len(independent_atoms): print("Non-equivalent atoms of %s could not be recognized by phonopy." % filename) return False else: # 1. Transform wien2k forces to those on independent atoms indep_atoms_to_wien2k = [] forces_remap = [] for i, pos_wien2k in enumerate(atoms_in_dot_scf): for j, pos in enumerate(cell.get_scaled_positions()): diff = pos_wien2k - pos diff -= np.rint(diff) if (abs(diff) < symprec).all(): forces_remap.append(np.dot(rotations[map_operations[j]], forces[i])) indep_atoms_to_wien2k.append(map_atoms[j]) break if len(forces_remap) != len(forces): print("Atomic position mapping between Wien2k and phonopy failed.") print("If you think this is caused by a bug of phonopy") print("please report it in the phonopy mainling list.") return False # 2. Distribute forces from independent to dependent atoms. force_set = [] for i in range(natom): j = indep_atoms_to_wien2k.index(map_atoms[i]) force_set.append(np.dot(rotations[map_operations[i]].T, forces_remap[j])) return force_set
def test_get_map_operations(self): symprec = 1e-5 cell = read_cell_yaml(os.path.join(data_dir, "..", "NaCl.yaml")) scell = get_supercell(cell, np.diag([2, 2, 2]), symprec=symprec) symmetry = Symmetry(scell, symprec=symprec) # start = time.time() symmetry._set_map_operations() # end = time.time() # print(end - start) map_ops = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() positions = scell.get_scaled_positions() rotations = symmetry.get_symmetry_operations()['rotations'] translations = symmetry.get_symmetry_operations()['translations'] for i, (op_i, atom_i) in enumerate(zip(map_ops, map_atoms)): r_pos = np.dot(rotations[op_i], positions[i]) + translations[op_i] diff = positions[atom_i] - r_pos diff -= np.rint(diff) self.assertTrue((diff < symprec).all())
def get_crystal_structure(cell, conv_numbers, write_symmetry=False): lattice = cell.get_cell() positions = cell.get_positions() numbers = cell.get_atomic_numbers() # Create and EXTERNAL file (fort.34) # Dimensionality, centring, crystal type lines = "3 1 1\n" # Cartesian components of the lattice vectors for lattvec in lattice: lines += ("%12.8f" * 3 + "\n") % tuple(lattvec) # Symmetry operators if write_symmetry: symmetry = Symmetry(cell, symprec=1e-5) rotations = symmetry.get_symmetry_operations()['rotations'] translations = symmetry.get_symmetry_operations()['translations'] N_symmops = 0 symmlines = "" for i in range(0, len(rotations)): N_symmops += 1 for j in range(0, 3): symmlines += (" %5.2f" * 3 + "\n") % tuple(rotations[i][j]) symmlines += (" %5.2f" * 3 + "\n") % tuple(translations[i]) lines += ("%d\n" % N_symmops) lines += symmlines else: lines += "1\n" lines += " 1.00 0.00 0.00\n" lines += " 0.00 1.00 0.00\n" lines += " 0.00 0.00 1.00\n" lines += " 0.00 0.00 0.00\n" # Number of atoms in the unit cell (asymmetric unit) lines += ("%d\n") % len(positions) # Conventional atomic number and cartesian coordinates of the atoms for i, pos in zip(conv_numbers, positions): lines += (" %d " + "%16.12f" * 3 + "\n") % (i, pos[0], pos[1], pos[2]) return lines
def get_crystal_structure(cell, conv_numbers, write_symmetry=False): lattice = cell.get_cell() positions = cell.get_positions() numbers = cell.get_atomic_numbers() # Create and EXTERNAL file (fort.34) # Dimensionality, centring, crystal type lines = "3 1 1\n" # Cartesian components of the lattice vectors for lattvec in lattice: lines += ("%12.8f" * 3 + "\n") % tuple(lattvec) # Symmetry operators if write_symmetry: symmetry = Symmetry(cell, symprec=1e-5) rotations = symmetry.get_symmetry_operations()['rotations'] translations = symmetry.get_symmetry_operations()['translations'] N_symmops = 0 symmlines = "" for i in range(0, len(rotations)): N_symmops += 1 for j in range(0, 3): symmlines += (" %5.2f" * 3 + "\n") % tuple(rotations[i][j]) symmlines += (" %5.2f" * 3 + "\n") % tuple(translations[i]) lines += ("%d\n" % N_symmops) lines += symmlines else: lines += "1\n" lines += " 1.00 0.00 0.00\n" lines += " 0.00 1.00 0.00\n" lines += " 0.00 0.00 1.00\n" lines += " 0.00 0.00 0.00\n" # Number of atoms in the unit cell (asymmetric unit) lines += ("%d\n") % len(positions) # Conventional atomic number and cartesian coordinates of the atoms for i, pos in zip(conv_numbers, positions): lines += (" %d " + "%16.12f"*3 + "\n") % (i, pos[0], pos[1], pos[2]) return lines
def test_get_map_operations(self): symprec = 1e-5 cell = get_unitcell_from_phonopy_yaml( os.path.join(data_dir,"../NaCl.yaml")) scell = get_supercell(cell, np.diag([2, 2, 2]), symprec=symprec) symmetry = Symmetry(scell, symprec=symprec) start = time.time() symmetry._set_map_operations() end = time.time() # print(end - start) map_ops = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() positions = scell.get_scaled_positions() rotations = symmetry.get_symmetry_operations()['rotations'] translations = symmetry.get_symmetry_operations()['translations'] for i, (op_i, atom_i) in enumerate(zip(map_ops, map_atoms)): r_pos = np.dot(rotations[op_i], positions[i]) + translations[op_i] diff = positions[atom_i] - r_pos diff -= np.rint(diff) self.assertTrue((diff < symprec).all())
def test_parse_wien2k_struct(self): cell, npts, r0s, rmts = parse_wien2k_struct("BaGa2.struct") lattice = cell.get_cell().T displacements, supercell = parse_disp_yaml("disp_BaGa2.yaml", return_cell=True) symmetry = Symmetry(cell) print(PhonopyAtoms(atoms=cell)) sym_op = symmetry.get_symmetry_operations() print(symmetry.get_international_table()) for i, (r, t) in enumerate( zip(sym_op['rotations'], sym_op['translations'])): print("--- %d ---" % (i + 1)) print(r) print(t)
def get_born_parameters(f, primitive, is_symmetry): # Read unit conversion factor, damping factor, ... factors = [float(x) for x in f.readline().split()] if len(factors) < 1: print "BORN file format of line 1 is incorrect" return False if len(factors) < 2: factors = factors[0] # Read dielectric constant line = f.readline().split() if not len(line) == 9: print "BORN file format of line 2 is incorrect" return False dielectric = np.reshape([float(x) for x in line], (3, 3)) # Read Born effective charge symmetry = Symmetry(primitive, is_symmetry=is_symmetry) independent_atoms = symmetry.get_independent_atoms() born = np.zeros((primitive.get_number_of_atoms(), 3, 3), dtype=float) for i in independent_atoms: line = f.readline().split() if len(line) == 0: print "Number of lines for Born effect charge is not enough." return False if not len(line) == 9: print "BORN file format of line %d is incorrect" % (i + 3) return False born[i] = np.reshape([float(x) for x in line], (3, 3)) # Expand Born effective charges to all atoms in the primitive cell rotations = symmetry.get_symmetry_operations()['rotations'] map_operations = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() for i in range(primitive.get_number_of_atoms()): # R_cart = L R L^-1 rot_cartesian = similarity_transformation( primitive.get_cell().transpose(), rotations[map_operations[i]]) # R_cart^T B R_cart^-T (inverse rotation is required to transform) born[i] = similarity_transformation(rot_cartesian.transpose(), born[map_atoms[i]]) non_anal = {'born': born, 'factor': factors, 'dielectric': dielectric } return non_anal
def symmetrize_borns_and_epsilon(borns, epsilon, ucell, symprec=1e-5, is_symmetry=True): lattice = ucell.get_cell() positions = ucell.get_scaled_positions() u_sym = Symmetry(ucell, is_symmetry=is_symmetry, symprec=symprec) rotations = u_sym.get_symmetry_operations()['rotations'] translations = u_sym.get_symmetry_operations()['translations'] ptg_ops = get_pointgroup_operations(rotations) epsilon_ = symmetrize_2nd_rank_tensor(epsilon, ptg_ops, lattice) for i, Z in enumerate(borns): site_sym = get_site_symmetry(i, lattice, positions, rotations, translations, symprec) Z = symmetrize_2nd_rank_tensor(Z, site_sym, lattice) borns_ = np.zeros_like(borns) for i in range(len(borns)): count = 0 for r, t in zip(rotations, translations): count += 1 diff = np.dot(positions, r.T) + t - positions[i] diff -= np.rint(diff) dist = np.sqrt(np.sum(np.dot(diff, lattice) ** 2, axis=1)) j = np.nonzero(dist < symprec)[0][0] r_cart = similarity_transformation(lattice.T, r) borns_[i] += similarity_transformation(r_cart, borns[j]) borns_[i] /= count return borns_, epsilon_
def parse_BORN( primitive, filename = "BORN" ): file = open( filename, 'r' ) # Read unit conversion factor, damping factor, ... factors = [ float( x ) for x in file.readline().split() ] if len( factors ) < 1: print "BORN file format of line 1 is incorrect" return None if len( factors ) < 2: factors.append( Damping_Factor ) # Read dielectric constant line = file.readline().split() if 9 < len( line ) or len( line ) < 9: print "BORN file format of line 2 is incorrect" return None dielectric = np.reshape( [ float( x ) for x in line ], ( 3, 3 ) ) # Read Born effective charge symmetry = Symmetry( primitive ) independent_atoms = symmetry.get_independent_atoms() born = np.zeros( ( primitive.get_number_of_atoms(), 3, 3 ), dtype=float ) for i in independent_atoms: line = file.readline().split() if 9 < len( line ) or len( line ) < 9: print "BORN file format of line %d is incorrect" % ( i + 3 ) return None born[ i ] = np.reshape( [ float( x ) for x in line ], ( 3, 3 ) ) # Expand Born effective charges to all atoms in the primitive cell rotations = symmetry.get_symmetry_operations()['rotations'] map_operations = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() for i in range( primitive.get_number_of_atoms() ): # R_cart = L R L^-1 rot_cartesian = similarity_transformation( primitive.get_cell().transpose(), rotations[ map_operations[i] ] ) # R_cart^T B R_cart^-T ( inverse rotation is required to transform ) born[i] = similarity_transformation( rot_cartesian.transpose(), born[ map_atoms[ i ] ] ) non_anal = {'born': born, 'factor': factors, 'dielectric': dielectric } return non_anal
def get_born_parameters(f, primitive, is_symmetry): # Read unit conversion factor, damping factor, ... factors = [float(x) for x in f.readline().split()] if len(factors) < 1: print "BORN file format of line 1 is incorrect" return False if len(factors) < 2: factors = factors[0] # Read dielectric constant line = f.readline().split() if not len(line) == 9: print "BORN file format of line 2 is incorrect" return False dielectric = np.reshape([float(x) for x in line], (3, 3)) # Read Born effective charge symmetry = Symmetry(primitive, is_symmetry=is_symmetry) independent_atoms = symmetry.get_independent_atoms() born = np.zeros((primitive.get_number_of_atoms(), 3, 3), dtype=float) for i in independent_atoms: line = f.readline().split() if len(line) == 0: print "Number of lines for Born effect charge is not enough." return False if not len(line) == 9: print "BORN file format of line %d is incorrect" % (i + 3) return False born[i] = np.reshape([float(x) for x in line], (3, 3)) # Expand Born effective charges to all atoms in the primitive cell rotations = symmetry.get_symmetry_operations()['rotations'] map_operations = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() for i in range(primitive.get_number_of_atoms()): # R_cart = L R L^-1 rot_cartesian = similarity_transformation( primitive.get_cell().transpose(), rotations[map_operations[i]]) # R_cart^T B R_cart^-T (inverse rotation is required to transform) born[i] = similarity_transformation(rot_cartesian.transpose(), born[map_atoms[i]]) non_anal = {'born': born, 'factor': factors, 'dielectric': dielectric} return non_anal
def get_born_OUTCAR(poscar_filename="POSCAR", outcar_filename="OUTCAR", primitive_axis=np.eye(3), supercell_matrix=np.eye(3, dtype='intc'), is_symmetry=True, symmetrize_tensors=False): ucell = read_vasp(poscar_filename) scell = get_supercell(ucell, supercell_matrix) inv_smat = np.linalg.inv(supercell_matrix) pcell = get_primitive(scell, np.dot(inv_smat, primitive_axis)) u_sym = Symmetry(ucell, is_symmetry=is_symmetry) p_sym = Symmetry(pcell, is_symmetry=is_symmetry) lattice = ucell.get_cell().T outcar = open(outcar_filename) borns = [] while True: line = outcar.readline() if not line: break if "NIONS" in line: num_atom = int(line.split()[11]) if "MACROSCOPIC STATIC DIELECTRIC TENSOR" in line: epsilon = [] outcar.readline() epsilon.append([float(x) for x in outcar.readline().split()]) epsilon.append([float(x) for x in outcar.readline().split()]) epsilon.append([float(x) for x in outcar.readline().split()]) if "BORN" in line: outcar.readline() line = outcar.readline() if "ion" in line: for i in range(num_atom): born = [] born.append([float(x) for x in outcar.readline().split()][1:]) born.append([float(x) for x in outcar.readline().split()][1:]) born.append([float(x) for x in outcar.readline().split()][1:]) outcar.readline() borns.append(born) borns = np.array(borns, dtype='double') epsilon = np.array(epsilon, dtype='double') if symmetrize_tensors: borns_orig = borns.copy() point_sym = [similarity_transformation(lattice, r) for r in u_sym.get_pointgroup_operations()] epsilon = symmetrize_tensor(epsilon, point_sym) for i in range(num_atom): z = borns[i] site_sym = [similarity_transformation(lattice, r) for r in u_sym.get_site_symmetry(i)] borns[i] = symmetrize_tensor(z, site_sym) rotations = u_sym.get_symmetry_operations()['rotations'] map_atoms = u_sym.get_map_atoms() borns_copy = np.zeros_like(borns) for i, m_i in enumerate(map_atoms): count = 0 for j, r_j in enumerate(u_sym.get_map_operations()): if map_atoms[j] == m_i: count += 1 r_cart = similarity_transformation(lattice, rotations[r_j]) borns_copy[i] += similarity_transformation(r_cart, borns[j]) borns_copy[i] /= count borns = borns_copy sum_born = borns.sum(axis=0) / len(borns) borns -= sum_born if (np.abs(borns_orig - borns) > 0.1).any(): sys.stderr.write( "Born effective charge symmetrization might go wrong.\n") p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc') s_indep_atoms = p2s[p_sym.get_independent_atoms()] u2u = scell.get_unitcell_to_unitcell_map() u_indep_atoms = [u2u[x] for x in s_indep_atoms] reduced_borns = borns[u_indep_atoms].copy() return reduced_borns, epsilon
if '*' in numxmag: num, mag = numxmag.split('*') magmom += [float(mag)] * int(num) else: magmom.append(float(numxmag)) 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("POSCAR") symmetry = Symmetry(cell, symprec=1e-3) map_nonspin = symmetry.get_map_atoms() print("Number of operations w/o spin %d" % len(symmetry.get_symmetry_operations()['rotations'])) magmoms = parse_incar("INCAR") cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-3) print("Number of operations w spin %d" % len(symmetry.get_symmetry_operations()['rotations'])) map_withspin = symmetry.get_map_atoms() if ((map_nonspin - map_withspin) == 0).all(): print(True) else: print(False) print(map_nonspin) print(map_withspin)
def get_born_OUTCAR(poscar_filename="POSCAR", outcar_filename=None, primitive_matrix=None, supercell_matrix=None, is_symmetry=True, symmetrize_tensors=False, read_vasprunxml=False, symprec=1e-5): if outcar_filename is None: if read_vasprunxml: filename = "vasprun.xml" else: filename = "OUTCAR" else: filename = outcar_filename if primitive_matrix is None: pmat = np.eye(3) else: pmat = primitive_matrix if supercell_matrix is None: smat = np.eye(3, dtype='intc') else: smat = supercell_matrix ucell = read_vasp(poscar_filename) if read_vasprunxml: import io borns = [] epsilon = [] with io.open(outcar_filename, "rb") as f: vasprun = VasprunxmlExpat(f) if vasprun.parse(): epsilon = vasprun.get_epsilon() borns = vasprun.get_born() else: borns, epsilon = _read_born_and_epsilon(filename) num_atom = len(borns) assert num_atom == ucell.get_number_of_atoms(), \ "num_atom %d != len(borns) %d" % (ucell.get_number_of_atoms(), len(borns)) if symmetrize_tensors: lattice = ucell.get_cell() positions = ucell.get_scaled_positions() u_sym = Symmetry(ucell, is_symmetry=is_symmetry, symprec=symprec) rotations = u_sym.get_symmetry_operations()['rotations'] translations = u_sym.get_symmetry_operations()['translations'] ptg_ops = get_pointgroup_operations(rotations) epsilon = symmetrize_2nd_rank_tensor(epsilon, ptg_ops, lattice) borns = symmetrize_borns(borns, rotations, translations, lattice, positions, symprec) inv_smat = np.linalg.inv(smat) scell = get_supercell(ucell, smat, symprec=symprec) pcell = get_primitive(scell, np.dot(inv_smat, pmat), symprec=symprec) p2s = np.array(pcell.get_primitive_to_supercell_map(), dtype='intc') p_sym = Symmetry(pcell, is_symmetry=is_symmetry, symprec=symprec) s_indep_atoms = p2s[p_sym.get_independent_atoms()] u2u = scell.get_unitcell_to_unitcell_map() u_indep_atoms = [u2u[x] for x in s_indep_atoms] reduced_borns = borns[u_indep_atoms].copy() return reduced_borns, epsilon, s_indep_atoms
magmom = [] for numxmag in text.split(): if '*' in numxmag: num, mag = numxmag.split('*') magmom += [float(mag)] * int(num) else: magmom.append(float(numxmag)) 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("POSCAR") symmetry = Symmetry(cell, symprec=1e-3) map_nonspin = symmetry.get_map_atoms() print "Number of operations w/o spin", len(symmetry.get_symmetry_operations()['rotations']) magmoms = parse_incar("INCAR") cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-3) print "Number of operations w spin", len(symmetry.get_symmetry_operations()['rotations']) map_withspin = symmetry.get_map_atoms() if ((map_nonspin - map_withspin) == 0).all(): print True else: print False print map_nonspin print map_withspin
if '*' in numxmag: num, mag = numxmag.split('*') magmom += [float(mag)] * int(num) else: magmom.append(float(numxmag)) 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("POSCAR") symmetry = Symmetry(cell, symprec=1e-3) map_nonspin = symmetry.get_map_atoms() print("Number of operations w/o spin %d" % len(symmetry.get_symmetry_operations()['rotations'])) magmoms = parse_incar("INCAR") cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-3) print("Number of operations w spin %d" % len(symmetry.get_symmetry_operations()['rotations'])) map_withspin = symmetry.get_map_atoms() if ((map_nonspin - map_withspin) == 0).all(): print(True) else: print(False) print(map_nonspin) print(map_withspin)
def distribute_forces(supercell, disp, forces, filename, symprec): natom = supercell.get_number_of_atoms() lattice = supercell.get_cell() symbols = supercell.get_chemical_symbols() positions = supercell.get_positions() positions[disp[0]] += disp[1] cell = Atoms(cell=lattice, positions=positions, symbols=symbols, pbc=True) symmetry = Symmetry(cell, symprec) independent_atoms = symmetry.get_independent_atoms() # Rotation matrices in Cartesian rotations = [] for r in symmetry.get_symmetry_operations()['rotations']: rotations.append(similarity_transformation(lattice.T, r)) map_operations = symmetry.get_map_operations() map_atoms = symmetry.get_map_atoms() atoms_in_dot_scf = get_independent_atoms_in_dot_scf(filename) if not len(forces) == len(atoms_in_dot_scf): print "%s does not contain necessary information." % filename print "Plese check if there are \"FGL\" lines with" print "\"total forces\" are required." return False if len(atoms_in_dot_scf) == natom: print "It is assumed that there is no symmetrically-equivalent atoms in " print "\'%s\' at wien2k calculation." % filename print "" force_set = forces elif not len(forces) == len(independent_atoms): print "Non-equivalent atoms of %s could not be recognized by phonopy." % filename return False else: # 1. Transform wien2k forces to those on independent atoms indep_atoms_to_wien2k = [] forces_remap = [] for i, pos_wien2k in enumerate(atoms_in_dot_scf): for j, pos in enumerate(cell.get_scaled_positions()): diff = pos_wien2k - pos diff -= np.rint(diff) if (abs(diff) < 0.00001).all(): forces_remap.append( np.dot(forces[i], rotations[map_operations[j]].T)) indep_atoms_to_wien2k.append(map_atoms[j]) break if not len(forces_remap) == len(forces): print "Atomic position mapping between Wien2k and phonopy failed." print "If you think this is caused by a bug of phonopy" print "please report it in the phonopy mainling list." return False # 2. Distribute forces from independent to dependent atoms. force_set = [] for i in range(natom): force_set.append( np.dot(forces_remap[indep_atoms_to_wien2k.index(map_atoms[i])], rotations[map_operations[i]])) return force_set
magmom = [] for numxmag in text.split(): if '*' in numxmag: num, mag = numxmag.split('*') magmom += [float(mag)] * int(num) else: magmom.append(float(numxmag)) 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("POSCAR") symmetry = Symmetry(cell, symprec=1e-3) map_nonspin = symmetry.get_map_atoms() print "Number of operations w/o spin", len(symmetry.get_symmetry_operations()['rotations']) magmoms = parse_incar("INCAR") cell.set_magnetic_moments(magmoms) symmetry = Symmetry(cell, symprec=1e-3) print "Number of operations w spin", len(symmetry.get_symmetry_operations()['rotations']) map_withspin = symmetry.get_map_atoms() if ((map_nonspin - map_withspin) == 0).all(): print True else: print False print map_nonspin print map_withspin