def write_FORCES(lattice, forces_filenames, displacements, filename='FORCE_SETS', amplitude=0.01, mode='vasp', is_zero_point=False, is_fropho_disp=False): if mode == "vasp": try: from lxml import etree except ImportError: print "You need to install python-lxml." sys.exit(1) if is_zero_point: force_files = forces_filenames[1:] if mode == "wien2k": zero_forces = wien2k.get_forces_wien2k(forces_filenames[0], lattice) else: # "vasp" case zero_forces = \ vasp.get_forces_vasprun_xml(etree.iterparse( vasp.VasprunWrapper(forces_filenames[0]), tag='varray')) else: force_files = forces_filenames zero_forces = None displacements = sort_displacements(displacements) forces = [] # Show progress print >> sys.stderr, "counter (file index):", for i in range(len(displacements)): if mode == "wien2k": # wien2k forces.append(wien2k.get_forces_wien2k(force_files[i], lattice)) else: # vasp forces.append( vasp.get_forces_vasprun_xml( etree.iterparse(vasp.VasprunWrapper(force_files[i]), tag='varray'))) write_FORCES_from_forces(lattice, forces, displacements, amplitude, filename, zero_forces, is_fropho_disp, verbose=True) # Show progress print >> sys.stderr, "\n"
def write_FORCES( lattice, forces_filenames, displacements, filename='FORCE_SETS', amplitude=0.01, mode='vasp', is_zero_point=False, is_fropho_disp=False ): if mode == "vasp": try: from lxml import etree except ImportError: print "You need to install python-lxml." sys.exit(1) if is_zero_point: force_files = forces_filenames[1:] if mode == "wien2k": zero_forces = wien2k.get_forces_wien2k(forces_filenames[0], lattice) else: # "vasp" case zero_forces = \ vasp.get_forces_vasprun_xml(etree.iterparse( vasp.VasprunWrapper( forces_filenames[0] ), tag='varray' ) ) else: force_files = forces_filenames zero_forces = None displacements = sort_displacements( displacements ) forces = [] # Show progress print >> sys.stderr, "counter (file index):", for i in range( len( displacements ) ): if mode == "wien2k": # wien2k forces.append( wien2k.get_forces_wien2k( force_files[i], lattice ) ) else: # vasp forces.append( vasp.get_forces_vasprun_xml( etree.iterparse( vasp.VasprunWrapper( force_files[i] ), tag='varray') ) ) write_FORCES_from_forces( lattice, forces, displacements, amplitude, filename, zero_forces, is_fropho_disp, verbose=True ) # Show progress print >> sys.stderr, "\n"
def write_FORCE_SETS_wien2k(forces_filenames, displacements, supercell, filename='FORCE_SETS', is_zero_point=False, is_distribute=True, symprec=1e-5): natom = supercell.get_number_of_atoms() lattice = supercell.get_cell() for wien2k_filename, disp in zip(forces_filenames, displacements['first_atoms']): # Parse wien2k case.scf file wien2k_forces = wien2k.get_forces_wien2k(wien2k_filename, lattice) if is_distribute: force_set = wien2k.distribute_forces( supercell, [disp['number'], disp['displacement']], wien2k_forces, wien2k_filename, symprec) if not force_set: return False else: if not (natom == len(wien2k_forces)): print "%s contains only forces of %d atoms" % ( wien2k_filename, len(wien2k_forces)) return False else: force_set = wien2k_forces drift_force = np.sum(force_set, axis=0) / len(force_set) print "Drift force of %s" % wien2k_filename print "%12.8f %12.8f %12.8f" % tuple(drift_force) print "This drift force was subtracted from forces." print disp['forces'] = np.array(force_set) - drift_force write_FORCE_SETS(displacements, filename=filename) return True