def _read_phono3py_fc3(phono3py, symmetrize_fc3r, input_filename, log_level): 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.primitive.p2s_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.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.fc3 = fc3
def _read_phono3py_fc2(phono3py, symmetrize_fc2, input_filename, log_level): 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.phonon_supercell.get_number_of_atoms() p2s_map = phono3py.phonon_primitive.p2s_map 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, phono3py.phonon_primitive) phono3py.fc2 = phonon_fc2
def read_phono3py_settings(args, argparse_control, log_level): """Read phono3py settings""" load_phono3py_yaml = argparse_control.get('load_phono3py_yaml', False) if len(args.filename) > 0: file_exists(args.filename[0], log_level) if load_phono3py_yaml: phono3py_conf_parser = Phono3pyConfParser( args=args, default_settings=argparse_control) cell_filename = args.filename[0] else: if is_file_phonopy_yaml(args.filename[0], keyword='phono3py'): phono3py_conf_parser = Phono3pyConfParser(args=args) cell_filename = args.filename[0] else: phono3py_conf_parser = Phono3pyConfParser( filename=args.filename[0], args=args) cell_filename = phono3py_conf_parser.settings.cell_filename else: phono3py_conf_parser = Phono3pyConfParser(args=args) cell_filename = phono3py_conf_parser.settings.cell_filename confs = phono3py_conf_parser.confs.copy() settings = phono3py_conf_parser.settings return settings, confs, cell_filename
def _create_phono3py_phonon_fc2(phono3py, ph3py_yaml, symmetrize_fc2, input_filename, is_compact_fc, fc_calculator, fc_calculator_options, log_level): if input_filename is None: disp_filename = 'disp_fc2.yaml' else: disp_filename = 'disp_fc2.' + input_filename + '.yaml' _ph3py_yaml = _get_ph3py_yaml(disp_filename, ph3py_yaml) try: dataset = parse_forces(phono3py, ph3py_yaml=_ph3py_yaml, force_filename="FORCES_FC2", disp_filename=disp_filename, fc_type='phonon_fc2', log_level=log_level) except RuntimeError as e: if log_level: print(str(e)) print_error() sys.exit(1) except FileNotFoundError as e: file_exists(e.filename, log_level) phono3py.phonon_dataset = dataset phono3py.produce_fc2(symmetrize_fc2=symmetrize_fc2, is_compact_fc=is_compact_fc, fc_calculator=fc_calculator, fc_calculator_options=fc_calculator_options)
def _create_phono3py_fc3( phono3py, ph3py_yaml, symmetrize_fc3r, input_filename, is_compact_fc, cutoff_pair_distance, fc_calculator, fc_calculator_options, log_level, ): """Read or calculate fc3. Note ---- cutoff_pair_distance is the parameter to determine each displaced supercell is included to the computation of fc3. It is assumed that cutoff_pair_distance is stored in the step to create sets of displacements and the value is stored n the displacement dataset and also as the parameter 'included': True or False for each displacement. The parameter cutoff_pair_distance here can be used in the step to create fc3 by overwriting original cutoff_pair_distance value only when the former value is smaller than the later. """ if input_filename is None: disp_filename = "disp_fc3.yaml" else: disp_filename = "disp_fc3." + input_filename + ".yaml" _ph3py_yaml = _get_ph3py_yaml(disp_filename, ph3py_yaml) try: dataset = parse_forces( phono3py, ph3py_yaml=_ph3py_yaml, cutoff_pair_distance=cutoff_pair_distance, force_filename="FORCES_FC3", disp_filename=disp_filename, fc_type="fc3", log_level=log_level, ) except RuntimeError as e: # from _parse_forces_type1 if log_level: print(str(e)) print_error() sys.exit(1) except FileNotFoundError as e: # from _get_type2_dataset file_exists(e.filename, log_level) phono3py.dataset = dataset phono3py.produce_fc3( symmetrize_fc3r=symmetrize_fc3r, is_compact_fc=is_compact_fc, fc_calculator=fc_calculator, fc_calculator_options=fc_calculator_options, )
def create_FORCE_SETS_from_FORCES_FCx_then_exit(phonon_smat, input_filename: Optional[str], cell_filename: Optional[str], log_level): """Convert FORCES_FC3 or FORCES_FC2 to FORCE_SETS.""" if cell_filename is not None: disp_filename = cell_filename elif input_filename is None: disp_filename = "phono3py_disp.yaml" else: disp_filename = f"phono3py_disp.{input_filename}.yaml" if phonon_smat is not None: forces_filename = "FORCES_FC2" else: forces_filename = "FORCES_FC3" if log_level: print(f'Displacement dataset is read from "{disp_filename}".') print(f'Forces are read from "{forces_filename}"') 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) file_exists(forces_filename, log_level) ph3yml = Phono3pyYaml() ph3yml.read(disp_filename) if phonon_smat is None: dataset = copy.deepcopy(ph3yml.dataset) smat = ph3yml.supercell_matrix else: dataset = copy.deepcopy(ph3yml.phonon_dataset) smat = ph3yml.phonon_supercell_matrix if smat is None or (phonon_smat is not None and (phonon_smat != smat).any()): if log_level: print("") print("Supercell matrix is inconsistent.") print(f'Supercell matrix read from "{disp_filename}":') print(smat) print("Supercell matrix given by --dim-fc2:") print(phonon_smat) print_error() sys.exit(1) parse_FORCES_FC2(dataset, filename=forces_filename) write_FORCE_SETS(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_FC2_from_FORCE_SETS_then_exit(log_level): filename = 'FORCE_SETS' file_exists(filename, log_level) disp_dataset = parse_FORCE_SETS(filename=filename) write_FORCES_FC2(disp_dataset) write_disp_fc2_yaml(disp_dataset, None) if log_level: print("FORCES_FC2 and disp_fc2.yaml have been created from " "FORCE_SETS.") print_end() sys.exit(0)
def read_phono3py_settings(args, argparse_control, log_level): """Read phono3py settings. From: * Traditional configuration file. * phono3py.yaml type file * Command line options """ load_phono3py_yaml = argparse_control.get("load_phono3py_yaml", False) if len(args.filename) > 0: file_exists(args.filename[0], log_level) if load_phono3py_yaml: phono3py_conf_parser = Phono3pyConfParser( filename=args.conf_filename, args=args, default_settings=argparse_control, ) cell_filename = args.filename[0] else: if is_file_phonopy_yaml(args.filename[0], keyword="phono3py"): phono3py_conf_parser = Phono3pyConfParser( args=args, default_settings=argparse_control) cell_filename = args.filename[0] else: phono3py_conf_parser = Phono3pyConfParser( filename=args.filename[0], args=args, default_settings=argparse_control, ) cell_filename = phono3py_conf_parser.settings.cell_filename else: if load_phono3py_yaml: phono3py_conf_parser = Phono3pyConfParser( args=args, filename=args.conf_filename, default_settings=argparse_control, ) else: phono3py_conf_parser = Phono3pyConfParser( args=args, default_settings=argparse_control) cell_filename = phono3py_conf_parser.settings.cell_filename confs_dict = phono3py_conf_parser.confs.copy() settings = phono3py_conf_parser.settings return settings, confs_dict, cell_filename
def create_FORCES_FC2_from_FORCE_SETS_then_exit(log_level): """Convert FORCE_SETS to FORCES_FC2.""" filename = "FORCE_SETS" file_exists(filename, log_level) disp_dataset = parse_FORCE_SETS(filename=filename) write_FORCES_FC2(disp_dataset) if log_level: print("") print("FORCES_FC2 has been created from FORCE_SETS.") print("The following yaml lines should replace respective part of") print("phono3py_disp.yaml made with --dim-fc2=dim_of_FORCE_SETS.") print("") print("\n".join(displacements_yaml_lines_type1(disp_dataset))) if log_level: print_end() sys.exit(0)
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)