예제 #1
0
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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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)
예제 #5
0
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,
    )
예제 #6
0
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)
예제 #7
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)
예제 #8
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
예제 #9
0
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)
예제 #10
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)
예제 #11
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)
예제 #12
0
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)