Пример #1
0
def parse_set_of_forces(num_atoms,
                        forces_filenames,
                        verbose=True):
    hook = 'Forces acting on atoms'
    is_parsed = True
    force_sets = []

    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))
        pwscf_forces = iter_collect_forces(filename,
                                           num_atoms,
                                           hook,
                                           [6, 7, 8],
                                           word='force')
        if check_forces(pwscf_forces, num_atoms, filename, verbose=verbose):
            drift_force = get_drift_forces(pwscf_forces,
                                           filename=filename,
                                           verbose=verbose)
            force_sets.append(np.array(pwscf_forces) - drift_force)
        else:
            is_parsed = False

    if is_parsed:
        return force_sets
    else:
        return []
Пример #2
0
def parse_set_of_forces(num_atoms, forces_filenames, verbose=True):
    hook = 'ATOM                     X                   Y                   Z'
    force_sets = []
    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))
        crystal_forces = iter_collect_forces(filename, num_atoms, hook,
                                             [2, 3, 4])
        if check_forces(crystal_forces, num_atoms, filename, verbose=verbose):
            is_parsed = True
            drift_force = get_drift_forces(crystal_forces,
                                           filename=filename,
                                           verbose=verbose)
            # Convert forces Hartree / Bohr ->  eV / Angstrom
            # This avoids confusion with the units. CRYSTAL uses Angstroms for
            # coordinates, but Hartree / Bohr for forces. This would lead in mixed
            # units hartree / (Angstrom * Bohr) for force constants, requiring
            # additional tweaks for unit conversions in other parts of the code
            force_sets.append(
                np.multiply(
                    np.array(crystal_forces) - drift_force, Hartree / Bohr))
        else:
            is_parsed = False

    if is_parsed:
        return force_sets
    else:
        return []
Пример #3
0
def parse_set_of_forces(num_atoms,
                        forces_filenames,
                        verbose=True):
    hook = 'ATOM                     X                   Y                   Z'
    force_sets = []
    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))
        crystal_forces = iter_collect_forces(filename,
                                           num_atoms,
                                           hook,
                                           [2, 3, 4])
        if check_forces(crystal_forces, num_atoms, filename, verbose=verbose):
            is_parsed = True
            drift_force = get_drift_forces(crystal_forces,
                                           filename=filename,
                                           verbose=verbose)
            # Convert forces Hartree / Bohr ->  eV / Angstrom
            # This avoids confusion with the units. CRYSTAL uses Angstroms for
            # coordinates, but Hartree / Bohr for forces. This would lead in mixed
            # units hartree / (Angstrom * Bohr) for force constants, requiring
            # additional tweaks for unit conversions in other parts of the code
            force_sets.append(np.multiply(np.array(crystal_forces) - drift_force, Hartree / Bohr))
        else:
            is_parsed = False

    if is_parsed:
        return force_sets
    else:
        return []
Пример #4
0
def parse_set_of_forces(num_atoms,
                        forces_filenames,
                        verbose=True):
    hook = 'Forces acting on atoms'
    is_parsed = True
    force_sets = []

    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))
        pwscf_forces = iter_collect_forces(filename,
                                           num_atoms,
                                           hook,
                                           [6, 7, 8],
                                           word='force')
        if check_forces(pwscf_forces, num_atoms, filename, verbose=verbose):
            drift_force = get_drift_forces(pwscf_forces,
                                           filename=filename,
                                           verbose=verbose)
            force_sets.append(np.array(pwscf_forces) - drift_force)
        else:
            is_parsed = False

    if is_parsed:
        return force_sets
    else:
        return []
Пример #5
0
def parse_set_of_forces(displacements, forces_filenames, num_atom):
    hook = ''
    for siesta_filename, disp in zip(forces_filenames,
                                     displacements['first_atoms']):
        siesta_forces = iter_collect_forces(siesta_filename,
                                            num_atom,
                                            hook, [1, 2, 3],
                                            word='')
        drift_force = get_drift_forces(siesta_forces)
        disp['forces'] = np.array(siesta_forces) - drift_force

    return True
Пример #6
0
def parse_set_of_forces(num_atoms, forces_filenames):
    hook = ''  # Just for skipping the first line
    force_sets = []
    for filename in forces_filenames:
        siesta_forces = iter_collect_forces(filename,
                                            num_atoms,
                                            hook, [1, 2, 3],
                                            word='')
        if not siesta_forces:
            return []
        drift_force = get_drift_forces(siesta_forces)
        force_sets.append(np.array(siesta_forces) - drift_force)

    return force_sets
Пример #7
0
def parse_set_of_forces(displacements,
                        forces_filenames,
                        num_atom):
    hook = 'Forces acting on atoms'
    for pwscf_filename, disp in zip(forces_filenames,
                                    displacements['first_atoms']):
        pwscf_forces = iter_collect_forces(pwscf_filename,
                                           num_atom,
                                           hook,
                                           [6, 7, 8],
                                           word='force')
        drift_force = get_drift_forces(pwscf_forces)
        disp['forces'] = np.array(pwscf_forces) - drift_force

    return True
Пример #8
0
def parse_set_of_forces(num_atoms, forces_filenames):
    hook = 'Forces acting on atoms'
    force_sets = []
    for filename in forces_filenames:
        pwscf_forces = iter_collect_forces(filename,
                                           num_atoms,
                                           hook, [6, 7, 8],
                                           word='force')
        if not pwscf_forces:
            return []

        drift_force = get_drift_forces(pwscf_forces)
        force_sets.append(np.array(pwscf_forces) - drift_force)

    return force_sets
Пример #9
0
def parse_set_of_forces(displacements,
                        forces_filenames,
                        num_atom):
    hook = ''
    for siesta_filename, disp in zip(forces_filenames,
                                    displacements['first_atoms']):
        siesta_forces = iter_collect_forces(siesta_filename,
                                           num_atom,
                                           hook,
                                           [1, 2, 3],
                                           word='')
        drift_force = get_drift_forces(siesta_forces)
        disp['forces'] = np.array(siesta_forces) - drift_force

    return True
Пример #10
0
def parse_set_of_forces(num_atoms, forces_filenames):
    hook = '' # Just for skipping the first line
    force_sets = []
    for filename in forces_filenames:
        siesta_forces = iter_collect_forces(filename,
                                            num_atoms,
                                            hook,
                                            [1, 2, 3],
                                            word='')
        if not siesta_forces:
            return []
        drift_force = get_drift_forces(siesta_forces)
        force_sets.append(np.array(siesta_forces) - drift_force)

    return force_sets
Пример #11
0
def parse_set_of_forces(num_atoms, forces_filenames, verbose=False):
    hook = 'CONVERGED'
    force_sets = []
    for fplo_filename in forces_filenames:
        fplo_forces = iter_collect_forces(fplo_filename,
                                          num_atoms,
                                          hook, [6, 7, 8],
                                          word='TOTAL NEUTRAL FORCES')

        # rotate forces from the FPLO xyz coordinate system
        # into the coordinate system of phonopy

        # read the phonopy lattice vectors
        conf, cell = parse_disp_yaml(return_cell=True)
        ppy_lat = cell.get_cell()

        # read the fplo output file
        f = open(fplo_filename, 'r')
        outf = f.readlines()
        f.close

        # search lattice vectors
        fp_lat = np.zeros((3, 3))
        for j in np.arange(len(outf)):
            if outf[j].find("lattice vectors") == 0:
                for i in np.arange(3):
                    fp_lat[i, :] = list(
                        map(float,
                            outf[j + i + 1].split(":")[1].split()))  # [bohr]

        if np.allclose(fp_lat, np.zeros((3, 3))):
            sys.exit("(EE) The lattice vectors were not found in: " +
                     fplo_filename)

        T = np.dot(np.linalg.inv(ppy_lat), fp_lat)

        if not np.allclose(np.dot(T.T, T), np.eye(3)):
            sys.exit("(EE) The basis transformation is wrong!")

        for i in np.arange(len(fplo_forces)):
            fplo_forces[i] = np.dot(T, np.array(fplo_forces[i]))

        # Calculate the drift_force (sum over all forces has to be zero) and
        # normalize the forces.
        drift_force = get_drift_forces(fplo_forces, fplo_filename, verbose)
        force_sets.append(np.array(fplo_forces) - drift_force)

    return force_sets
Пример #12
0
def parse_set_of_forces(num_atoms, forces_filenames):
    hook = 'Forces acting on atoms'
    force_sets = []
    for filename in forces_filenames:
        pwscf_forces = iter_collect_forces(filename,
                                           num_atoms,
                                           hook,
                                           [6, 7, 8],
                                           word='force')
        if not pwscf_forces:
            return []

        drift_force = get_drift_forces(pwscf_forces)
        force_sets.append(np.array(pwscf_forces) - drift_force)
        
    return force_sets
Пример #13
0
def parse_set_of_forces(num_atoms, forces_filenames, verbose=True):
    force_sets = []

    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))

        forces = iter_collect_forces(filename, num_atoms,
                                     '# Atom   Kind   Element', [3, 4, 5])

        if not check_forces(forces, num_atoms, filename, verbose=verbose):
            return []  # if one file is invalid, the whole thing is broken

        drift_force = get_drift_forces(forces,
                                       filename=filename,
                                       verbose=verbose)
        force_sets.append(np.array(forces) - drift_force)

    return force_sets
Пример #14
0
def parse_set_of_forces(num_atoms, forces_filenames, verbose=True):
    hook = ''  # Just for skipping the first line
    is_parsed = True
    force_sets = []
    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))
        siesta_forces = iter_collect_forces(filename,
                                            num_atoms,
                                            hook, [1, 2, 3],
                                            word='')
        if check_forces(siesta_forces, num_atoms, filename, verbose=verbose):
            drift_force = get_drift_forces(siesta_forces,
                                           filename=filename,
                                           verbose=verbose)
            force_sets.append(np.array(siesta_forces) - drift_force)
        else:
            is_parsed = False

    if is_parsed:
        return force_sets
    else:
        return []
Пример #15
0
def parse_set_of_forces(num_atoms, forces_filenames, verbose=True):
    hook = '' # Just for skipping the first line
    is_parsed = True
    force_sets = []
    for i, filename in enumerate(forces_filenames):
        if verbose:
            sys.stdout.write("%d. " % (i + 1))
        siesta_forces = iter_collect_forces(filename,
                                            num_atoms,
                                            hook,
                                            [1, 2, 3],
                                            word='')
        if check_forces(siesta_forces, num_atoms, filename, verbose=verbose):
            drift_force = get_drift_forces(siesta_forces,
                                           filename=filename,
                                           verbose=verbose)
            force_sets.append(np.array(siesta_forces) - drift_force)
        else:
            is_parsed = False

    if is_parsed:
        return force_sets
    else:
        return []