Пример #1
0
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"
Пример #2
0
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"
Пример #3
0
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
Пример #4
0
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