def _read_disp_fc_yaml(disp_filename, fc_type): if fc_type == "phonon_fc2": dataset = parse_disp_fc2_yaml(filename=disp_filename) else: dataset = parse_disp_fc3_yaml(filename=disp_filename) return dataset
def parse_forces(natom, force_to_eVperA, distance_to_A, cutoff_pair_distance=None, force_filename="FORCES_FC3", disp_filename=None, is_fc2=False, log_level=0): disp_dataset = _get_type2_dataset(natom, filename=force_filename) if disp_dataset: # type2 if log_level: print("%d snapshots were found in %s." % (len(disp_dataset['displacements']), "FORCES_FC3")) if force_to_eVperA is not None: disp_dataset['forces'] *= force_to_eVperA if distance_to_A is not None: disp_dataset['displacements'] *= distance_to_A else: # type1 if log_level: print("Displacement dataset for %s is read from \"%s\"." % ("fc2" if is_fc2 else "fc3", disp_filename)) if is_fc2: disp_dataset = parse_disp_fc2_yaml(filename=disp_filename) else: disp_dataset = parse_disp_fc3_yaml(filename=disp_filename) if cutoff_pair_distance: if ('cutoff_distance' not in disp_dataset or 'cutoff_distance' in disp_dataset and cutoff_pair_distance < disp_dataset['cutoff_distance']): disp_dataset['cutoff_distance'] = cutoff_pair_distance if log_level: print("Cutoff-pair-distance: %f" % cutoff_pair_distance) if disp_dataset['natom'] != natom: msg = ("Number of atoms in supercell is not consistent with " "\"%s\"." % disp_filename) raise RuntimeError(msg) _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=is_fc2) if log_level: print("Sets of supercell forces are read from \"%s\"." % force_filename) sys.stdout.flush() # forces are stored in disp_dataset. if is_fc2: parse_FORCES_FC2(disp_dataset, filename=force_filename, unit_conversion_factor=force_to_eVperA) else: parse_FORCES_FC3(disp_dataset, filename=force_filename, unit_conversion_factor=force_to_eVperA) return disp_dataset
def _create_phono3py_phonon_fc2(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc2, input_filename, is_compact_fc, fc_calculator, fc_calculator_options, log_level): file_exists("FORCES_FC2", log_level) natom = phono3py.phonon_supercell.get_number_of_atoms() disp_dataset = _get_type2_dataset(natom, filename="FORCES_FC2") if disp_dataset: if log_level: print("%d snapshots were found in %s." % (len(disp_dataset['displacements']), "FORCES_FC2")) if force_to_eVperA is not None: disp_dataset['forces'] *= force_to_eVperA if distance_to_A is not None: disp_dataset['displacements'] *= distance_to_A else: if input_filename is None: filename = 'disp_fc2.yaml' else: filename = 'disp_fc2.' + input_filename + '.yaml' if log_level: print("Displacement dataset is read from %s." % filename) file_exists(filename, log_level) disp_dataset = parse_disp_fc2_yaml(filename=filename) if disp_dataset['natom'] != natom: print("Number of atoms in supercell is not consistent with %s" % filename) if log_level: print_error() sys.exit(1) _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=True) if log_level: print("Sets of supercell forces are read from %s." % "FORCES_FC2") # forces are stored in disp_dataset. parse_FORCES_FC2(disp_dataset, unit_conversion_factor=force_to_eVperA) phono3py.produce_fc2(displacement_dataset=disp_dataset, symmetrize_fc2=symmetrize_fc2, is_compact_fc=is_compact_fc, fc_calculator=fc_calculator, fc_calculator_options=fc_calculator_options) return True
def _create_phono3py_phonon_fc2(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc2, input_filename, is_compact_fc, use_alm, alm_options, log_level): if input_filename is None: filename = 'disp_fc2.yaml' else: filename = 'disp_fc2.' + input_filename + '.yaml' if log_level: print("Displacement dataset is read from %s." % filename) file_exists(filename, log_level) disp_dataset = parse_disp_fc2_yaml(filename=filename) num_atom = phono3py.get_phonon_supercell().get_number_of_atoms() if disp_dataset['natom'] != num_atom: print("Number of atoms in supercell is not consistent with %s" % filename) if log_level: print_error() sys.exit(1) _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=True) if log_level: print("Sets of supercell forces are read from %s." % "FORCES_FC2") file_exists("FORCES_FC2", log_level) forces_fc2 = parse_FORCES_FC2(disp_dataset) if not forces_fc2: return False _convert_force_unit(forces_fc2, force_to_eVperA) phono3py.produce_fc2( forces_fc2, displacement_dataset=disp_dataset, symmetrize_fc2=symmetrize_fc2, is_compact_fc=is_compact_fc, use_alm=use_alm, alm_options=alm_options) return True
def create_FORCE_SETS_from_FORCES_FCx_then_exit(phonon_smat, input_filename, log_level): if phonon_smat is not None: if input_filename is None: disp_filename = 'disp_fc2.yaml' else: disp_filename = 'disp_fc2.' + input_filename + '.yaml' forces_filename = "FORCES_FC2" else: if input_filename is None: disp_filename = 'disp_fc3.yaml' else: disp_filename = 'disp_fc3.' + input_filename + '.yaml' forces_filename = "FORCES_FC3" with open(forces_filename, 'r') as f: len_first_line = get_length_of_first_line(f) if len_first_line == 3: file_exists(disp_filename, log_level) disp_dataset = parse_disp_fc2_yaml(filename=disp_filename) file_exists(forces_filename, log_level) parse_FORCES_FC2(disp_dataset, filename=forces_filename) if log_level: print("Displacement dataset was read from \"%s\"." % disp_filename) write_FORCE_SETS(disp_dataset) if log_level: print("FORCE_SETS has been created.") print_end() else: if log_level: print("The file format of %s is already readable by phonopy." % forces_filename) print_end() sys.exit(0)
def create_FORCES_FC3_and_FORCES_FC2_then_exit(settings, input_filename, output_filename, log_level): interface_mode = settings.calculator ##################### # Create FORCES_FC3 # ##################### if settings.create_forces_fc3 or settings.create_forces_fc3_file: if input_filename is None: disp_fc3_filename = 'disp_fc3.yaml' else: disp_fc3_filename = 'disp_fc3.' + input_filename + '.yaml' ph3py_yaml = None disp_filenames = files_exist(['phono3py_disp.yaml', disp_fc3_filename], log_level, is_any=True) if disp_filenames[0] == 'phono3py_disp.yaml': try: ph3py_yaml = Phono3pyYaml() ph3py_yaml.read('phono3py_disp.yaml') if ph3py_yaml.calculator is not None: interface_mode = ph3py_yaml.calculator # overwrite disp_filename = 'phono3py_disp.yaml' except KeyError: file_exists('disp_fc3.yaml', log_level) if log_level > 0: print("\"phono3py_disp.yaml\" was found but wasn't used.") disp_filename = disp_fc3_filename else: disp_filename = disp_filenames[0] if ph3py_yaml is None: file_exists(disp_filename, log_level) disp_dataset = parse_disp_fc3_yaml(filename=disp_filename) else: disp_dataset = ph3py_yaml.dataset if log_level: print('') print("Displacement dataset was read from \"%s\"." % disp_filename) num_atoms = disp_dataset['natom'] num_disps = len(disp_dataset['first_atoms']) for d1 in disp_dataset['first_atoms']: for d2 in d1['second_atoms']: if 'included' not in d2 or d2['included']: num_disps += 1 if settings.create_forces_fc3_file: file_exists(settings.create_forces_fc3_file, log_level) force_filenames = [ x.strip() for x in open(settings.create_forces_fc3_file) ] else: force_filenames = settings.create_forces_fc3 for filename in force_filenames: file_exists(filename, log_level) if log_level > 0: print("Number of displacements: %d" % num_disps) print("Number of supercell files: %d" % len(force_filenames)) if not check_number_of_force_files(num_disps, force_filenames, disp_filename): force_sets = [] else: force_sets = get_force_sets(interface_mode, num_atoms, num_disps, force_filenames, disp_filename=disp_filename, verbose=(log_level > 0)) if settings.subtract_forces: force_filename = settings.subtract_forces file_exists(force_filename, log_level) force_set_zero = get_force_sets(interface_mode, num_atoms, 1, [ force_filename, ], verbose=(log_level > 0))[0] for fs in force_sets: fs -= force_set_zero if log_level > 0: print( "Forces in \'%s\' were subtracted from supercell forces." % force_filename) if force_sets: write_FORCES_FC3(disp_dataset, force_sets, filename="FORCES_FC3") if log_level: print("") print("%s has been created." % "FORCES_FC3") print_end() sys.exit(0) else: if log_level: print("") print("%s could not be created." % "FORCES_FC3") print_error() sys.exit(1) ##################### # Create FORCES_FC2 # ##################### if settings.create_forces_fc2: if input_filename is None: disp_filename = 'disp_fc2.yaml' else: disp_filename = 'disp_fc2.' + input_filename + '.yaml' file_exists(disp_filename, log_level) disp_dataset = parse_disp_fc2_yaml(filename=disp_filename) if log_level: print("Displacement dataset was read from \"%s\"." % disp_filename) num_atoms = disp_dataset['natom'] num_disps = len(disp_dataset['first_atoms']) force_filenames = settings.create_forces_fc2 for filename in force_filenames: file_exists(filename, log_level) if log_level > 0: print("Number of displacements: %d" % num_disps) print("Number of supercell files: %d" % len(force_filenames)) force_sets = get_force_sets(interface_mode, num_atoms, num_disps, force_filenames, disp_filename, verbose=(log_level > 0)) if settings.subtract_forces: force_filename = settings.subtract_forces file_exists(force_filename, log_level) force_set_zero = get_force_sets(interface_mode, num_atoms, 1, [ force_filename, ], verbose=(log_level > 0))[0] for fs in force_sets: fs -= force_set_zero if log_level > 0: print( "Forces in \'%s\' were subtracted from supercell forces." % force_filename) if force_sets: write_FORCES_FC2(disp_dataset, forces_fc2=force_sets, filename="FORCES_FC2") if log_level: print("") print("%s has been created." % "FORCES_FC2") print_end() sys.exit(0) else: if log_level: print("") print("%s could not be created." % "FORCES_FC2") print_error() sys.exit(1)
def create_FORCES_FC3_and_FORCES_FC2_then_exit(settings, input_filename, log_level): """Create FORCES_FC3 and FORCES_FC2 from files.""" interface_mode = settings.calculator ph3py_yaml = None ##################### # Create FORCES_FC3 # ##################### if settings.create_forces_fc3 or settings.create_forces_fc3_file: if input_filename is None: disp_fc3_filename = "disp_fc3.yaml" else: disp_fc3_filename = "disp_fc3." + input_filename + ".yaml" disp_filenames = files_exist(["phono3py_disp.yaml", disp_fc3_filename], log_level, is_any=True) disp_filename = disp_filenames[0] if "phono3py_disp.yaml" in disp_filename: ph3py_yaml = Phono3pyYaml() ph3py_yaml.read(disp_filename) if ph3py_yaml.calculator is not None: interface_mode = ph3py_yaml.calculator # overwrite disp_dataset = ph3py_yaml.dataset else: file_exists(disp_filename, log_level) disp_dataset = parse_disp_fc3_yaml(filename=disp_filename) if log_level: print("") print('Displacement dataset was read from "%s".' % disp_filename) num_atoms = disp_dataset["natom"] num_disps = len(disp_dataset["first_atoms"]) for d1 in disp_dataset["first_atoms"]: for d2 in d1["second_atoms"]: if "included" not in d2 or d2["included"]: num_disps += 1 if settings.create_forces_fc3_file: file_exists(settings.create_forces_fc3_file, log_level) force_filenames = [ x.strip() for x in open(settings.create_forces_fc3_file) ] else: force_filenames = settings.create_forces_fc3 for filename in force_filenames: file_exists(filename, log_level) if log_level > 0: print("Number of displacements: %d" % num_disps) print("Number of supercell files: %d" % len(force_filenames)) if not check_number_of_force_files(num_disps, force_filenames, disp_filename): force_sets = [] else: force_sets = get_force_sets( interface_mode, num_atoms, force_filenames, verbose=(log_level > 0), ) if settings.subtract_forces: force_filename = settings.subtract_forces file_exists(force_filename, log_level) force_set_zero = get_force_sets( interface_mode, num_atoms, [ force_filename, ], verbose=(log_level > 0), )[0] for fs in force_sets: fs -= force_set_zero if log_level > 0: print("Forces in '%s' were subtracted from supercell forces." % force_filename) if force_sets: write_FORCES_FC3(disp_dataset, forces_fc3=force_sets, filename="FORCES_FC3") if log_level: print("") print("%s has been created." % "FORCES_FC3") print_end() sys.exit(0) else: if log_level: print("") print("%s could not be created." % "FORCES_FC3") print_error() sys.exit(1) ##################### # Create FORCES_FC2 # ##################### if settings.create_forces_fc2: if input_filename is None: disp_fc2_filename = "disp_fc2.yaml" else: disp_fc2_filename = "disp_fc2." + input_filename + ".yaml" disp_filenames = files_exist(["phono3py_disp.yaml", disp_fc2_filename], log_level, is_any=True) if "phono3py_disp.yaml" in disp_filenames[0]: # ph3py_yaml is not None, phono3py_disp.yaml is already read. if ph3py_yaml is None: disp_filename = disp_filenames[0] ph3py_yaml = Phono3pyYaml() ph3py_yaml.read(disp_filename) if ph3py_yaml.calculator is not None: interface_mode = ph3py_yaml.calculator # overwrite disp_dataset = ph3py_yaml.phonon_dataset else: disp_filename = disp_filenames[0] file_exists(disp_filename, log_level) disp_dataset = parse_disp_fc2_yaml(filename=disp_filename) if log_level: print('Displacement dataset was read from "%s".' % disp_filename) num_atoms = disp_dataset["natom"] num_disps = len(disp_dataset["first_atoms"]) force_filenames = settings.create_forces_fc2 for filename in force_filenames: file_exists(filename, log_level) if log_level > 0: print("Number of displacements: %d" % num_disps) print("Number of supercell files: %d" % len(force_filenames)) force_sets = get_force_sets( interface_mode, num_atoms, force_filenames, verbose=(log_level > 0), ) if settings.subtract_forces: force_filename = settings.subtract_forces file_exists(force_filename, log_level) force_set_zero = get_force_sets( interface_mode, num_atoms, [ force_filename, ], verbose=(log_level > 0), )[0] for fs in force_sets: fs -= force_set_zero if log_level > 0: print("Forces in '%s' were subtracted from supercell forces." % force_filename) if force_sets: write_FORCES_FC2(disp_dataset, forces_fc2=force_sets, filename="FORCES_FC2") if log_level: print("") print("%s has been created." % "FORCES_FC2") print_end() sys.exit(0) else: if log_level: print("") print("%s could not be created." % "FORCES_FC2") print_error() sys.exit(1)