def _create_phono3py_fc2(phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc2, input_filename, use_alm, log_level): if input_filename is None: filename = 'disp_fc3.yaml' else: filename = 'disp_fc3.' + input_filename + '.yaml' if log_level: print("Displacement dataset is read from %s." % filename) file_exists(filename, log_level) disp_dataset = parse_disp_fc3_yaml(filename=filename) num_atom = phono3py.get_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_FC3") file_exists("FORCES_FC3", log_level) forces_fc2 = parse_FORCES_FC2(disp_dataset, filename="FORCES_FC3") if not forces_fc2: return False _convert_force_unit(forces_fc2, energy_to_eV, distance_to_A) phono3py.produce_fc2(forces_fc2, displacement_dataset=disp_dataset, is_permutation_symmetry=symmetrize_fc2, translational_symmetry_type=tsym_type, use_alm=use_alm) return True
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 _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc3r, symmetrize_fc2, input_filename, output_filename, is_compact_fc, cutoff_pair_distance, use_alm, alm_options, compression, log_level): if input_filename is None: filename = 'disp_fc3.yaml' else: filename = 'disp_fc3.' + input_filename + '.yaml' file_exists(filename, log_level) if log_level: print("Displacement dataset for fc3 is read from %s." % filename) disp_dataset = parse_disp_fc3_yaml(filename=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) num_atom = phono3py.get_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) file_exists("FORCES_FC3", log_level) if log_level: print("Sets of supercell forces are read from %s." % "FORCES_FC3") sys.stdout.flush() forces_fc3 = parse_FORCES_FC3(disp_dataset) _convert_force_unit(forces_fc3, force_to_eVperA) phono3py.produce_fc3(forces_fc3, displacement_dataset=disp_dataset, symmetrize_fc3r=symmetrize_fc3r, is_compact_fc=is_compact_fc, use_alm=use_alm, alm_options=alm_options) if output_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + output_filename + '.hdf5' if log_level: print("Writing fc3 to %s" % filename) p2s_map = phono3py.get_primitive().get_primitive_to_supercell_map() write_fc3_to_hdf5(phono3py.get_fc3(), filename=filename, p2s_map=p2s_map, compression=compression) return True
def _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A, tsym_type, symmetrize_fc3_r, symmetrize_fc2, cutoff_distance, input_filename, output_filename, use_alm, log_level): if input_filename is None: filename = 'disp_fc3.yaml' else: filename = 'disp_fc3.' + input_filename + '.yaml' file_exists(filename, log_level) if log_level: print("Displacement dataset is read from %s." % filename) disp_dataset = parse_disp_fc3_yaml(filename=filename) num_atom = phono3py.get_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) file_exists("FORCES_FC3", log_level) if log_level: print("Sets of supercell forces are read from %s." % "FORCES_FC3") forces_fc3 = parse_FORCES_FC3(disp_dataset) if not forces_fc3: return False _convert_force_unit(forces_fc3, force_to_eVperA) phono3py.produce_fc3( forces_fc3, displacement_dataset=disp_dataset, cutoff_distance=cutoff_distance, translational_symmetry_type=tsym_type, is_permutation_symmetry=symmetrize_fc3_r, is_permutation_symmetry_fc2=symmetrize_fc2, use_alm=use_alm) if output_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + output_filename + '.hdf5' if log_level: print("Writing fc3 to %s" % filename) write_fc3_to_hdf5(phono3py.get_fc3(), filename=filename) return True
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_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_FC3", log_level) natom = phono3py.supercell.get_number_of_atoms() disp_dataset = _get_type2_dataset(natom, filename="FORCES_FC3") if disp_dataset: 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: if input_filename is None: filename = 'disp_fc3.yaml' else: filename = 'disp_fc3.' + input_filename + '.yaml' if log_level: print("Displacement dataset for fc2 is read from %s." % filename) file_exists(filename, log_level) disp_dataset = parse_disp_fc3_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_FC3") # forces are stored in disp_dataset. parse_FORCES_FC2(disp_dataset, filename="FORCES_FC3", 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 run_thermal_conductivity(phono3py): # Create fc3 and fc2 from disp_fc3.yaml and FORCES_FC3 disp_dataset = parse_disp_fc3_yaml(filename="disp_fc3.yaml") forces_fc3 = parse_FORCES_FC3(disp_dataset, filename="FORCES_FC3") phono3py.produce_fc3(forces_fc3, displacement_dataset=disp_dataset, is_translational_symmetry=True, is_permutation_symmetry=True, is_permutation_symmetry_fc2=True) fc3 = phono3py.get_fc3() fc2 = phono3py.get_fc2() # # Create fc2 from disp_fc2.yaml and FORCES_FC2 # disp_dataset2 = parse_disp_fc2_yaml(filename="disp_fc2.yaml") # forces_fc2 = parse_FORCES_FC2(disp_dataset2, filename="FORCES_FC2") # phono3py.produce_fc2( # forces_fc2, # displacement_dataset=disp_dataset2, # is_translational_symmetry=True, # is_permutation_symmetry=True) # # Read fc3 and fc2 from c3.hdf5 and fc2.hdf5 # fc3 = read_fc3_from_hdf5(filename="fc3.hdf5") # fc2 = read_fc2_from_hdf5(filename="fc2.hdf5") # phono3py.set_fc3(fc3) # phono3py.set_fc2(fc2) show_drift_fc3(fc3) show_drift_force_constants(fc2, name='fc2') # # For special cases like NAC # primitive = phono3py.get_phonon_primitive() # nac_params = parse_BORN(primitive, filename="BORN") # nac_params['factor'] = Hartree * Bohr # phono3py.set_phph_interaction(nac_params=nac_params) phono3py.run_thermal_conductivity( temperatures=range(0, 1001, 10), boundary_mfp=1e6, # This is to avoid divergence of phonon life time. write_kappa=True) # Conductivity_RTA object (https://git.io/vVRUW) cond_rta = phono3py.get_thermal_conductivity()
def _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc3r, symmetrize_fc2, input_filename, output_filename, is_compact_fc, cutoff_pair_distance, fc_calculator, fc_calculator_options, compression, log_level): file_exists("FORCES_FC3", log_level) natom = phono3py.supercell.get_number_of_atoms() disp_dataset = _get_type2_dataset(natom, filename="FORCES_FC3") 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 input_filename is None: filename = 'disp_fc3.yaml' else: filename = 'disp_fc3.' + input_filename + '.yaml' file_exists(filename, log_level) if log_level: print("Displacement dataset for fc3 is read from %s." % filename) disp_dataset = parse_disp_fc3_yaml(filename=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) num_atom = phono3py.get_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) if log_level: print("Sets of supercell forces are read from %s." % "FORCES_FC3") sys.stdout.flush() # forces are stored in disp_dataset. parse_FORCES_FC3(disp_dataset, unit_conversion_factor=force_to_eVperA) phono3py.produce_fc3(displacement_dataset=disp_dataset, symmetrize_fc3r=symmetrize_fc3r, is_compact_fc=is_compact_fc, fc_calculator=fc_calculator, fc_calculator_options=fc_calculator_options) if output_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + output_filename + '.hdf5' if log_level: print("Writing fc3 to %s" % filename) write_fc3_to_hdf5(phono3py.get_fc3(), filename=filename, p2s_map=phono3py.primitive.p2s_map, compression=compression) return True
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)