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_force_constants(phono3py, phonon_supercell_matrix, settings, force_to_eVperA=None, distance_to_A=None, compression=None, input_filename=None, output_filename=None, log_level=1): if settings.get_fc_calculator() is None: symmetrize_fc3r = (settings.get_is_symmetrize_fc3_r() or settings.get_fc_symmetry()) symmetrize_fc2 = (settings.get_is_symmetrize_fc2() or settings.get_fc_symmetry()) else: # Rely on fc calculator the symmetrization of fc. symmetrize_fc2 = False symmetrize_fc3r = False if log_level: show_phono3py_force_constants_settings(settings) ####### # fc3 # ####### if (settings.get_is_joint_dos() or (settings.get_is_isotope() and not (settings.get_is_bterta() or settings.get_is_lbte())) or settings.get_read_gamma() or settings.get_read_pp() or settings.get_write_phonon() or settings.get_constant_averaged_pp_interaction() is not None): pass else: if settings.get_read_fc3(): # Read fc3.hdf5 _read_phono3py_fc3(phono3py, symmetrize_fc3r, input_filename, log_level) else: # fc3 from FORCES_FC3 if not _create_phono3py_fc3( phono3py, force_to_eVperA, distance_to_A, symmetrize_fc3r, symmetrize_fc2, input_filename, output_filename, settings.get_is_compact_fc(), settings.get_cutoff_pair_distance(), settings.get_fc_calculator(), settings.get_fc_calculator_options(), compression, log_level): print("fc3 was not created properly.") if log_level: print_error() sys.exit(1) cutoff_distance = settings.get_cutoff_fc3_distance() if cutoff_distance is not None and cutoff_distance > 0: if log_level: print("Cutting-off fc3 by zero (cut-off distance: %f)" % cutoff_distance) phono3py.cutoff_fc3_by_zero(cutoff_distance) if log_level: show_drift_fc3(phono3py.get_fc3(), primitive=phono3py.get_primitive()) ####### # fc2 # ####### phonon_primitive = phono3py.get_phonon_primitive() p2s_map = phonon_primitive.p2s_map if settings.get_read_fc2(): _read_phono3py_fc2(phono3py, symmetrize_fc2, input_filename, log_level) else: if phonon_supercell_matrix is None: if settings.get_fc_calculator() is not None: pass elif not _create_phono3py_fc2( phono3py, force_to_eVperA, distance_to_A, symmetrize_fc2, input_filename, settings.get_is_compact_fc(), settings.get_fc_calculator(), settings.get_fc_calculator_options(), log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) else: if not _create_phono3py_phonon_fc2( phono3py, force_to_eVperA, distance_to_A, symmetrize_fc2, input_filename, settings.get_is_compact_fc(), settings.get_fc_calculator(), settings.get_fc_calculator_options(), log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) if output_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + output_filename + '.hdf5' if log_level: print("Writing fc2 to %s" % filename) write_fc2_to_hdf5(phono3py.get_fc2(), filename=filename, p2s_map=p2s_map, physical_unit='eV/Angstrom^2', compression=compression) if log_level: show_drift_force_constants(phono3py.get_fc2(), primitive=phonon_primitive, name='fc2')
def create_phono3py_force_constants( phono3py, settings, ph3py_yaml=None, input_filename=None, output_filename=None, log_level=1, ): """Read or calculate force constants.""" if settings.fc_calculator is None: symmetrize_fc3r = settings.is_symmetrize_fc3_r or settings.fc_symmetry symmetrize_fc2 = settings.is_symmetrize_fc2 or settings.fc_symmetry else: # Rely on fc calculator the symmetrization of fc. symmetrize_fc2 = False symmetrize_fc3r = False if log_level: show_phono3py_force_constants_settings(settings) ####### # fc3 # ####### if (settings.is_joint_dos or (settings.is_isotope and not (settings.is_bterta or settings.is_lbte)) or settings.read_gamma or settings.read_pp or (not settings.is_bterta and settings.write_phonon) or settings.constant_averaged_pp_interaction is not None): pass else: if settings.read_fc3: _read_phono3py_fc3(phono3py, symmetrize_fc3r, input_filename, log_level) else: # fc3 from FORCES_FC3 or ph3py_yaml _create_phono3py_fc3( phono3py, ph3py_yaml, symmetrize_fc3r, input_filename, settings.is_compact_fc, settings.cutoff_pair_distance, settings.fc_calculator, settings.fc_calculator_options, log_level, ) 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.fc3, filename=filename, p2s_map=phono3py.primitive.p2s_map, compression=settings.hdf5_compression, ) cutoff_distance = settings.cutoff_fc3_distance if cutoff_distance is not None and cutoff_distance > 0: if log_level: print("Cutting-off fc3 by zero (cut-off distance: %f)" % cutoff_distance) phono3py.cutoff_fc3_by_zero(cutoff_distance) if log_level: show_drift_fc3(phono3py.fc3, primitive=phono3py.primitive) ####### # fc2 # ####### phonon_primitive = phono3py.phonon_primitive p2s_map = phonon_primitive.p2s_map if settings.read_fc2: _read_phono3py_fc2(phono3py, symmetrize_fc2, input_filename, log_level) else: if phono3py.phonon_supercell_matrix is None: if settings.fc_calculator == "alm" and phono3py.fc2 is not None: if log_level: print("fc2 that was fit simultaneously with fc3 " "by ALM is used.") else: _create_phono3py_fc2( phono3py, ph3py_yaml, symmetrize_fc2, input_filename, settings.is_compact_fc, settings.fc_calculator, settings.fc_calculator_options, log_level, ) else: _create_phono3py_phonon_fc2( phono3py, ph3py_yaml, symmetrize_fc2, input_filename, settings.is_compact_fc, settings.fc_calculator, settings.fc_calculator_options, log_level, ) if output_filename is None: filename = "fc2.hdf5" else: filename = "fc2." + output_filename + ".hdf5" if log_level: print('Writing fc2 to "%s".' % filename) write_fc2_to_hdf5( phono3py.fc2, filename=filename, p2s_map=p2s_map, physical_unit="eV/angstrom^2", compression=settings.hdf5_compression, ) if log_level: show_drift_force_constants(phono3py.fc2, primitive=phonon_primitive, name="fc2")
def create_phono3py_force_constants(phono3py, phonon_supercell_matrix, settings, read_fc3, read_fc2, tsym_type, symmetrize_fc3_r, symmetrize_fc3_q, symmetrize_fc2, input_filename, output_filename, log_level): if log_level: show_phono3py_force_constants_settings(read_fc3, read_fc2, tsym_type, symmetrize_fc3_r, symmetrize_fc3_q, symmetrize_fc2, settings) # fc3 if (settings.get_is_joint_dos() or (settings.get_is_isotope() and not (settings.get_is_bterta() or settings.get_is_lbte())) or settings.get_read_gamma() or settings.get_read_amplitude() or settings.get_constant_averaged_pp_interaction() is not None): pass else: if read_fc3: # Read fc3.hdf5 if input_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc3 from %s" % filename) fc3 = read_fc3_from_hdf5(filename=filename) phono3py.set_fc3(fc3) else: # fc3 from FORCES_THIRD and FORCES_SECOND _create_phono3py_fc3(phono3py, tsym_type, symmetrize_fc3_r, symmetrize_fc2, settings.get_cutoff_fc3_distance(), input_filename, output_filename, log_level) if log_level: show_drift_fc3(phono3py.get_fc3()) # fc2 if read_fc2: if input_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc2 from %s" % filename) phonon_supercell = phono3py.get_phonon_supercell() phonon_fc2 = read_fc2_from_hdf5(filename=filename) if phonon_fc2.shape[0] != phonon_supercell.get_number_of_atoms(): print("Matrix shape of fc2 doesn't agree with supercell.") if log_level: print_error() sys.exit(1) phono3py.set_fc2(phonon_fc2) else: if log_level: print("Solving fc2") if phonon_supercell_matrix is None: if phono3py.get_fc2() is None: _create_phono3py_fc2(phono3py, tsym_type, symmetrize_fc2, input_filename, log_level) else: _create_phono3py_phonon_fc2(phono3py, tsym_type, symmetrize_fc2, input_filename, log_level) if output_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + output_filename + '.hdf5' if log_level: print("Writing fc2 to %s" % filename) write_fc2_to_hdf5(phono3py.get_fc2(), filename=filename) if log_level: show_drift_force_constants(phono3py.get_fc2(), name='fc2')
def create_phono3py_force_constants(phono3py, phonon_supercell_matrix, settings, energy_to_eV=None, distance_to_A=None, input_filename=None, output_filename=None, log_level=1): read_fc3 = settings.get_read_fc3() read_fc2 = settings.get_read_fc2() symmetrize_fc3_r = settings.get_is_symmetrize_fc3_r() symmetrize_fc3_q = settings.get_is_symmetrize_fc3_q() symmetrize_fc2 = settings.get_is_symmetrize_fc2() if settings.get_is_translational_symmetry(): tsym_type = 1 elif settings.get_tsym_type() > 0: tsym_type = settings.get_tsym_type() else: tsym_type = 0 if log_level: show_phono3py_force_constants_settings(read_fc3, read_fc2, tsym_type, symmetrize_fc3_r, symmetrize_fc3_q, symmetrize_fc2, settings) # fc3 if (settings.get_is_joint_dos() or (settings.get_is_isotope() and not (settings.get_is_bterta() or settings.get_is_lbte())) or settings.get_read_gamma() or settings.get_read_amplitude() or settings.get_constant_averaged_pp_interaction() is not None): pass else: if read_fc3: # Read fc3.hdf5 if input_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc3 from %s" % filename) fc3 = read_fc3_from_hdf5(filename=filename) num_atom = phono3py.get_supercell().get_number_of_atoms() if fc3.shape[0] != num_atom: print("Matrix shape of fc3 doesn't agree with supercell size.") if log_level: print_error() sys.exit(1) phono3py.set_fc3(fc3) else: # fc3 from FORCES_FC3 if not _create_phono3py_fc3( phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc3_r, symmetrize_fc2, settings.get_cutoff_fc3_distance(), input_filename, output_filename, log_level): print("fc3 was not created properly.") if log_level: print_error() sys.exit(1) if log_level: show_drift_fc3(phono3py.get_fc3()) # fc2 if read_fc2: if input_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc2 from %s" % filename) num_atom = phono3py.get_phonon_supercell().get_number_of_atoms() phonon_fc2 = read_fc2_from_hdf5(filename=filename) if phonon_fc2.shape[0] != num_atom: print("Matrix shape of fc2 doesn't agree with supercell size.") if log_level: print_error() sys.exit(1) phono3py.set_fc2(phonon_fc2) else: if log_level: print("Solving fc2") if phonon_supercell_matrix is None: if phono3py.get_fc2() is None: if not _create_phono3py_fc2( phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc2, input_filename, log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) else: if not _create_phono3py_phonon_fc2( phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc2, input_filename, log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) if output_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + output_filename + '.hdf5' if log_level: print("Writing fc2 to %s" % filename) write_fc2_to_hdf5(phono3py.get_fc2(), filename=filename) if log_level: show_drift_force_constants(phono3py.get_fc2(), name='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), write_kappa=True) # Conductivity_RTA object (https://git.io/vVRUW) cond_rta = phono3py.get_thermal_conductivity()
def _set_force_constants( ph3py, units, dataset=None, fc3_filename=None, fc2_filename=None, forces_fc3_filename=None, forces_fc2_filename=None, fc_calculator=None, fc_calculator_options=None, symmetrize_fc=True, is_compact_fc=False, log_level=0): p2s_map = ph3py.primitive.p2s_map if fc3_filename is not None: fc3 = read_fc3_from_hdf5(filename=fc3_filename, p2s_map=p2s_map) ph3py.fc3 = fc3 elif forces_fc3_filename is not None: if type(forces_fc3_filename) is str: force_filename = forces_fc3_filename disp_filename = None else: force_filename, disp_filename = forces_fc3_filename _set_fc3(ph3py, units, force_filename, disp_filename, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, log_level) elif os.path.isfile("fc3.hdf5"): ph3py.fc3 = read_fc3_from_hdf5(filename="fc3.hdf5", p2s_map=p2s_map) if log_level: print("fc3 was loaded from \"fc3.hdf5\".") elif os.path.isfile("FORCES_FC3") and os.path.isfile("disp_fc3.yaml"): _set_fc3(ph3py, units, "FORCES_FC3", "disp_fc3.yaml", symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, log_level) if log_level and ph3py.fc3 is not None: show_drift_fc3(ph3py.fc3, primitive=ph3py.primitive) if fc2_filename is not None: fc2 = read_fc2_from_hdf5(filename=fc2_filename, p2s_map=p2s_map) ph3py.fc2 = fc2 elif forces_fc2_filename is not None: if type(forces_fc2_filename) == str: force_filename = forces_fc2_filename disp_filename = None else: force_filename, disp_filename = forces_fc2_filename _set_fc2(ph3py, units, force_filename, disp_filename, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, log_level) elif os.path.isfile("fc2.hdf5"): ph3py.fc2 = read_fc2_from_hdf5(filename="fc2.hdf5", p2s_map=p2s_map) if log_level: print("fc2 was loaded from \"fc2.hdf5\".") elif os.path.isfile("FORCES_FC2") and os.path.isfile("disp_fc2.yaml"): _set_fc2(ph3py, units, "FORCES_FC2", "disp_fc2.yaml", symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, log_level) if log_level and ph3py.fc2 is not None: show_drift_force_constants(ph3py.fc2, primitive=ph3py.phonon_primitive, name='fc2')
def create_phono3py_force_constants(phono3py, phonon_supercell_matrix, settings, force_to_eVperA=None, distance_to_A=None, compression=None, input_filename=None, output_filename=None, log_level=1): read_fc3 = settings.get_read_fc3() read_fc2 = settings.get_read_fc2() symmetrize_fc3r = (settings.get_is_symmetrize_fc3_r() or settings.get_fc_symmetry()) symmetrize_fc3q = settings.get_is_symmetrize_fc3_q() symmetrize_fc2 = (settings.get_is_symmetrize_fc2() or settings.get_fc_symmetry()) if settings.get_use_alm_fc2(): symmetrize_fc2 = False if settings.get_use_alm_fc3(): symmetrize_fc3r = False alm_options = None if settings.get_use_alm_fc3() or settings.get_use_alm_fc2(): if settings.get_alm_options() is not None: alm_option_types = {'solver': str, 'cutoff_distance': float} alm_options = {} for option_str in settings.get_alm_options().split(","): key, val = [x.strip() for x in option_str.split('=')[:2]] if key.lower() in alm_option_types: option_value = alm_option_types[key.lower()](val) alm_options[key.lower()] = option_value if log_level: show_phono3py_force_constants_settings(read_fc3, read_fc2, symmetrize_fc3r, symmetrize_fc3q, symmetrize_fc2, settings) # fc3 if (settings.get_is_joint_dos() or (settings.get_is_isotope() and not (settings.get_is_bterta() or settings.get_is_lbte())) or settings.get_read_gamma() or settings.get_read_pp() or settings.get_write_phonon() or settings.get_constant_averaged_pp_interaction() is not None): pass else: if read_fc3: # Read fc3.hdf5 if input_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc3 from %s" % filename) p2s_map = phono3py.get_primitive().get_primitive_to_supercell_map() try: fc3 = read_fc3_from_hdf5(filename=filename, p2s_map=p2s_map) except RuntimeError: import traceback traceback.print_exc() if log_level: print_error() sys.exit(1) num_atom = phono3py.get_supercell().get_number_of_atoms() if fc3.shape[1] != num_atom: print("Matrix shape of fc3 doesn't agree with supercell size.") if log_level: print_error() sys.exit(1) if symmetrize_fc3r: set_translational_invariance_fc3(fc3) set_permutation_symmetry_fc3(fc3) phono3py.set_fc3(fc3) else: # fc3 from FORCES_FC3 if not _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc3r, symmetrize_fc2, input_filename, output_filename, settings.get_is_compact_fc(), settings.get_use_alm_fc3(), alm_options, compression, log_level): print("fc3 was not created properly.") if log_level: print_error() sys.exit(1) cutoff_distance = settings.get_cutoff_fc3_distance() if cutoff_distance is not None and cutoff_distance > 0: if log_level: print("Cutting-off fc3 by zero (cut-off distance: %f)" % cutoff_distance) phono3py.cutoff_fc3_by_zero(cutoff_distance) if log_level: show_drift_fc3(phono3py.get_fc3(), primitive=phono3py.get_primitive()) # fc2 phonon_primitive = phono3py.get_phonon_primitive() phonon_supercell = phono3py.get_phonon_supercell() p2s_map = phonon_primitive.get_primitive_to_supercell_map() if read_fc2: if input_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc2 from %s" % filename) num_atom = phonon_supercell.get_number_of_atoms() try: phonon_fc2 = read_fc2_from_hdf5(filename=filename, p2s_map=p2s_map) except RuntimeError: import traceback traceback.print_exc() if log_level: print_error() sys.exit(1) if phonon_fc2.shape[1] != num_atom: print("Matrix shape of fc2 doesn't agree with supercell size.") if log_level: print_error() sys.exit(1) if symmetrize_fc2: if phonon_fc2.shape[0] == phonon_fc2.shape[1]: symmetrize_force_constants(phonon_fc2) else: symmetrize_compact_force_constants(phonon_fc2, phonon_primitive) phono3py.set_fc2(phonon_fc2) else: if phonon_supercell_matrix is None: if not _create_phono3py_fc2(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc2, input_filename, settings.get_is_compact_fc(), settings.get_use_alm_fc2(), alm_options, log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) else: if not _create_phono3py_phonon_fc2(phono3py, force_to_eVperA, distance_to_A, symmetrize_fc2, input_filename, settings.get_is_compact_fc(), settings.get_use_alm_fc2(), alm_options, log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) if output_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + output_filename + '.hdf5' if log_level: print("Writing fc2 to %s" % filename) write_fc2_to_hdf5(phono3py.get_fc2(), filename=filename, p2s_map=p2s_map, compression=compression) if log_level: show_drift_force_constants(phono3py.get_fc2(), primitive=phonon_primitive, name='fc2')
def set_dataset_and_force_constants(ph3py, ph3py_yaml=None, fc3_filename=None, fc2_filename=None, forces_fc3_filename=None, forces_fc2_filename=None, fc_calculator=None, fc_calculator_options=None, produce_fc=True, symmetrize_fc=True, is_compact_fc=False, cutoff_pair_distance=None, log_level=0): read_fc = {'fc2': False, 'fc3': False} p2s_map = ph3py.primitive.p2s_map if fc3_filename is not None: fc3 = read_fc3_from_hdf5(filename=fc3_filename, p2s_map=p2s_map) ph3py.fc3 = fc3 read_fc['fc3'] = True if log_level: print("fc3 was read from \"%s\"." % fc3_filename) elif forces_fc3_filename is not None: if type(forces_fc3_filename) is str: force_filename = forces_fc3_filename disp_filename = None else: force_filename, disp_filename = forces_fc3_filename _set_forces_fc3(ph3py, ph3py_yaml, force_filename, disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, cutoff_pair_distance, log_level) elif os.path.isfile("fc3.hdf5"): ph3py.fc3 = read_fc3_from_hdf5(filename="fc3.hdf5", p2s_map=p2s_map) read_fc['fc3'] = True if log_level: print("fc3 was read from \"fc3.hdf5\".") elif os.path.isfile("FORCES_FC3"): disp_filename = None if os.path.isfile("disp_fc3.yaml"): if ph3py_yaml is None: disp_filename = "disp_fc3.yaml" elif ph3py_yaml.dataset is None: disp_filename = "disp_fc3.yaml" _set_forces_fc3(ph3py, ph3py_yaml, "FORCES_FC3", disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, cutoff_pair_distance, log_level) elif (ph3py_yaml is not None and ph3py_yaml.dataset is not None and forces_in_dataset(ph3py_yaml.dataset)): _set_forces_fc3(ph3py, ph3py_yaml, None, None, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, cutoff_pair_distance, log_level) if log_level and ph3py.fc3 is not None: show_drift_fc3(ph3py.fc3, primitive=ph3py.primitive) if fc2_filename is not None: fc2 = read_fc2_from_hdf5(filename=fc2_filename, p2s_map=p2s_map) ph3py.fc2 = fc2 read_fc['fc2'] = True if log_level: print("fc2 was read from \"%s\"." % fc2_filename) elif forces_fc2_filename is not None: if type(forces_fc2_filename) is str: force_filename = forces_fc2_filename disp_filename = None else: force_filename, disp_filename = forces_fc2_filename _set_forces_fc2(ph3py, ph3py_yaml, force_filename, disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "phonon_fc2", log_level) elif os.path.isfile("fc2.hdf5"): ph3py.fc2 = read_fc2_from_hdf5(filename="fc2.hdf5", p2s_map=p2s_map) read_fc['fc2'] = True if log_level: print("fc2 was read from \"fc2.hdf5\".") elif os.path.isfile("FORCES_FC2"): disp_filename = None if os.path.isfile("disp_fc2.yaml"): if ph3py_yaml is None: disp_filename = "disp_fc2.yaml" elif ph3py_yaml.dataset is None: disp_filename = "disp_fc2.yaml" _set_forces_fc2(ph3py, ph3py_yaml, "FORCES_FC2", disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "phonon_fc2", log_level) elif (ph3py.phonon_supercell_matrix is None and fc_calculator == 'alm' and ph3py.fc2 is not None): if log_level: print("fc2 that was fit simultaneously with fc3 by ALM is used.") elif (ph3py_yaml is not None and ph3py_yaml.phonon_dataset is not None and forces_in_dataset(ph3py_yaml.phonon_dataset)): _set_forces_fc2(ph3py, ph3py_yaml, None, None, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "phonon_fc2", log_level) elif (ph3py_yaml is not None and ph3py_yaml.dataset is not None and forces_in_dataset(ph3py_yaml.dataset)): _set_forces_fc2(ph3py, ph3py_yaml, None, None, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "fc2", log_level) elif os.path.isfile("FORCES_FC3"): # suppose fc3.hdf5 is read but fc2.hdf5 doesn't exist. disp_filename = None if os.path.isfile("disp_fc3.yaml"): if ph3py_yaml is None: disp_filename = "disp_fc3.yaml" elif ph3py_yaml.dataset is None: disp_filename = "disp_fc3.yaml" _set_forces_fc2(ph3py, ph3py_yaml, "FORCES_FC3", disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "fc2", log_level) if log_level and ph3py.fc2 is not None: show_drift_force_constants(ph3py.fc2, primitive=ph3py.phonon_primitive, name='fc2') # Cases that dataset is in phono3py.yaml but not forces. if (ph3py_yaml is not None and ph3py_yaml.dataset is not None): ph3py.dataset = ph3py_yaml.dataset if (ph3py_yaml is not None and ph3py_yaml.phonon_dataset is not None): ph3py.phonon_dataset = ph3py_yaml.phonon_dataset return read_fc
def set_dataset_and_force_constants( ph3py: Phono3py, ph3py_yaml: typing.Union[Phono3pyYaml, None] = None, fc3_filename=None, fc2_filename=None, forces_fc3_filename=None, forces_fc2_filename=None, fc_calculator=None, fc_calculator_options=None, produce_fc=True, symmetrize_fc=True, is_compact_fc=False, cutoff_pair_distance=None, log_level=0, ): """Set displacements, forces, and create force constants.""" read_fc = {"fc2": False, "fc3": False} p2s_map = ph3py.primitive.p2s_map phonon_p2s_map = ph3py.phonon_primitive.p2s_map if fc3_filename is not None: fc3 = read_fc3_from_hdf5(filename=fc3_filename, p2s_map=p2s_map) ph3py.fc3 = fc3 read_fc["fc3"] = True if log_level: print('fc3 was read from "%s".' % fc3_filename) elif forces_fc3_filename is not None: if type(forces_fc3_filename) is str: force_filename = forces_fc3_filename disp_filename = None else: force_filename, disp_filename = forces_fc3_filename _set_forces_fc3( ph3py, ph3py_yaml, force_filename, disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, cutoff_pair_distance, log_level, ) elif os.path.isfile("fc3.hdf5"): ph3py.fc3 = read_fc3_from_hdf5(filename="fc3.hdf5", p2s_map=p2s_map) read_fc["fc3"] = True if log_level: print('fc3 was read from "fc3.hdf5".') elif os.path.isfile("FORCES_FC3"): disp_filename = None if os.path.isfile("disp_fc3.yaml"): if ph3py_yaml is None: disp_filename = "disp_fc3.yaml" elif ph3py_yaml.dataset is None: disp_filename = "disp_fc3.yaml" _set_forces_fc3( ph3py, ph3py_yaml, "FORCES_FC3", disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, cutoff_pair_distance, log_level, ) elif ( ph3py_yaml is not None and ph3py_yaml.dataset is not None and forces_in_dataset(ph3py_yaml.dataset) ): _set_forces_fc3( ph3py, ph3py_yaml, None, None, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, cutoff_pair_distance, log_level, ) if log_level and ph3py.fc3 is not None: show_drift_fc3(ph3py.fc3, primitive=ph3py.primitive) if fc2_filename is not None: fc2 = read_fc2_from_hdf5(filename=fc2_filename, p2s_map=phonon_p2s_map) ph3py.fc2 = fc2 read_fc["fc2"] = True if log_level: print('fc2 was read from "%s".' % fc2_filename) elif forces_fc2_filename is not None: if type(forces_fc2_filename) is str: force_filename = forces_fc2_filename disp_filename = None else: force_filename, disp_filename = forces_fc2_filename _set_forces_fc2( ph3py, ph3py_yaml, force_filename, disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "phonon_fc2", log_level, ) elif os.path.isfile("fc2.hdf5"): ph3py.fc2 = read_fc2_from_hdf5(filename="fc2.hdf5", p2s_map=phonon_p2s_map) read_fc["fc2"] = True if log_level: print('fc2 was read from "fc2.hdf5".') elif os.path.isfile("FORCES_FC2"): disp_filename = None if os.path.isfile("disp_fc2.yaml"): if ph3py_yaml is None: disp_filename = "disp_fc2.yaml" elif ph3py_yaml.phonon_dataset is None: disp_filename = "disp_fc2.yaml" if ( disp_filename is None and ph3py_yaml is not None and ph3py_yaml.phonon_dataset is None ): msg = ( '"FORCES_FC2" was found. But phonon displacement dataset ' f'was not found in "{ph3py_yaml.yaml_filename}".' ) raise RuntimeError(msg) _set_forces_fc2( ph3py, ph3py_yaml, "FORCES_FC2", disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "phonon_fc2", log_level, ) elif ( ph3py.phonon_supercell_matrix is None and fc_calculator == "alm" and ph3py.fc2 is not None ): if log_level: print("fc2 that was fit simultaneously with fc3 by ALM is used.") elif ( ph3py_yaml is not None and ph3py_yaml.phonon_dataset is not None and forces_in_dataset(ph3py_yaml.phonon_dataset) ): _set_forces_fc2( ph3py, ph3py_yaml, None, None, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "phonon_fc2", log_level, ) elif ( ph3py_yaml is not None and ph3py_yaml.dataset is not None and forces_in_dataset(ph3py_yaml.dataset) ): _set_forces_fc2( ph3py, ph3py_yaml, None, None, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "fc2", log_level, ) elif os.path.isfile("FORCES_FC3"): # suppose fc3.hdf5 is read but fc2.hdf5 doesn't exist. disp_filename = None if os.path.isfile("disp_fc3.yaml"): if ph3py_yaml is None: disp_filename = "disp_fc3.yaml" elif ph3py_yaml.dataset is None: disp_filename = "disp_fc3.yaml" _set_forces_fc2( ph3py, ph3py_yaml, "FORCES_FC3", disp_filename, produce_fc, symmetrize_fc, is_compact_fc, fc_calculator, fc_calculator_options, "fc2", log_level, ) if log_level and ph3py.fc2 is not None: show_drift_force_constants( ph3py.fc2, primitive=ph3py.phonon_primitive, name="fc2" ) # Cases that dataset is in phono3py.yaml but not forces. if ph3py.dataset is None: if ph3py_yaml is not None and ph3py_yaml.dataset is not None: ph3py.dataset = ph3py_yaml.dataset if ph3py_yaml is not None and ph3py_yaml.phonon_dataset is not None: ph3py.phonon_dataset = ph3py_yaml.phonon_dataset return read_fc
def create_phono3py_force_constants(phono3py, phonon_supercell_matrix, settings, energy_to_eV=None, distance_to_A=None, input_filename=None, output_filename=None, log_level=1): read_fc3 = settings.get_read_fc3() read_fc2 = settings.get_read_fc2() symmetrize_fc3_r = settings.get_is_symmetrize_fc3_r() symmetrize_fc3_q = settings.get_is_symmetrize_fc3_q() symmetrize_fc2 = settings.get_is_symmetrize_fc2() if settings.get_is_translational_symmetry(): tsym_type = 1 elif settings.get_tsym_type() > 0: tsym_type = settings.get_tsym_type() else: tsym_type = 0 if log_level: show_phono3py_force_constants_settings(read_fc3, read_fc2, tsym_type, symmetrize_fc3_r, symmetrize_fc3_q, symmetrize_fc2, settings) # fc3 if (settings.get_is_joint_dos() or (settings.get_is_isotope() and not (settings.get_is_bterta() or settings.get_is_lbte())) or settings.get_read_gamma() or settings.get_read_amplitude() or settings.get_constant_averaged_pp_interaction() is not None): pass else: if read_fc3: # Read fc3.hdf5 if input_filename is None: filename = 'fc3.hdf5' else: filename = 'fc3.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc3 from %s" % filename) fc3 = read_fc3_from_hdf5(filename=filename) num_atom = phono3py.get_supercell().get_number_of_atoms() if fc3.shape[0] != num_atom: print("Matrix shape of fc3 doesn't agree with supercell size.") if log_level: print_error() sys.exit(1) phono3py.set_fc3(fc3) else: # fc3 from FORCES_FC3 if not _create_phono3py_fc3(phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc3_r, symmetrize_fc2, settings.get_cutoff_fc3_distance(), input_filename, output_filename, log_level): print("fc3 was not created properly.") if log_level: print_error() sys.exit(1) if log_level: show_drift_fc3(phono3py.get_fc3()) # fc2 if read_fc2: if input_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + input_filename + '.hdf5' file_exists(filename, log_level) if log_level: print("Reading fc2 from %s" % filename) num_atom = phono3py.get_phonon_supercell().get_number_of_atoms() phonon_fc2 = read_fc2_from_hdf5(filename=filename) if phonon_fc2.shape[0] != num_atom: print("Matrix shape of fc2 doesn't agree with supercell size.") if log_level: print_error() sys.exit(1) phono3py.set_fc2(phonon_fc2) else: if log_level: print("Solving fc2") if phonon_supercell_matrix is None: if phono3py.get_fc2() is None: if not _create_phono3py_fc2(phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc2, input_filename, log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) else: if not _create_phono3py_phonon_fc2(phono3py, energy_to_eV, distance_to_A, tsym_type, symmetrize_fc2, input_filename, log_level): print("fc2 was not created properly.") if log_level: print_error() sys.exit(1) if output_filename is None: filename = 'fc2.hdf5' else: filename = 'fc2.' + output_filename + '.hdf5' if log_level: print("Writing fc2 to %s" % filename) write_fc2_to_hdf5(phono3py.get_fc2(), filename=filename) if log_level: show_drift_force_constants(phono3py.get_fc2(), name='fc2')