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 []
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 []
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 []
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
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
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
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
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
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
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 []