Пример #1
0
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
Пример #2
0
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
Пример #3
0
def _create_phono3py_phonon_fc2(phono3py, force_to_eVperA, distance_to_A,
                                symmetrize_fc2, input_filename, is_compact_fc,
                                fc_calculator, fc_calculator_options,
                                log_level):
    file_exists("FORCES_FC2", log_level)
    natom = phono3py.phonon_supercell.get_number_of_atoms()
    disp_dataset = _get_type2_dataset(natom, filename="FORCES_FC2")
    if disp_dataset:
        if log_level:
            print("%d snapshots were found in %s." %
                  (len(disp_dataset['displacements']), "FORCES_FC2"))
        if force_to_eVperA is not None:
            disp_dataset['forces'] *= force_to_eVperA
        if distance_to_A is not None:
            disp_dataset['displacements'] *= distance_to_A
    else:
        if input_filename is None:
            filename = 'disp_fc2.yaml'
        else:
            filename = 'disp_fc2.' + input_filename + '.yaml'
        if log_level:
            print("Displacement dataset is read from %s." % filename)
        file_exists(filename, log_level)
        disp_dataset = parse_disp_fc2_yaml(filename=filename)
        if disp_dataset['natom'] != natom:
            print("Number of atoms in supercell is not consistent with %s" %
                  filename)
            if log_level:
                print_error()
            sys.exit(1)
        _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=True)

        if log_level:
            print("Sets of supercell forces are read from %s." % "FORCES_FC2")

        # forces are stored in disp_dataset.
        parse_FORCES_FC2(disp_dataset, unit_conversion_factor=force_to_eVperA)

    phono3py.produce_fc2(displacement_dataset=disp_dataset,
                         symmetrize_fc2=symmetrize_fc2,
                         is_compact_fc=is_compact_fc,
                         fc_calculator=fc_calculator,
                         fc_calculator_options=fc_calculator_options)

    return True
def _create_phono3py_phonon_fc2(phono3py,
                                force_to_eVperA,
                                distance_to_A,
                                symmetrize_fc2,
                                input_filename,
                                is_compact_fc,
                                use_alm,
                                alm_options,
                                log_level):
    if input_filename is None:
        filename = 'disp_fc2.yaml'
    else:
        filename = 'disp_fc2.' + input_filename + '.yaml'
    if log_level:
        print("Displacement dataset is read from %s." % filename)
    file_exists(filename, log_level)
    disp_dataset = parse_disp_fc2_yaml(filename=filename)
    num_atom = phono3py.get_phonon_supercell().get_number_of_atoms()
    if disp_dataset['natom'] != num_atom:
        print("Number of atoms in supercell is not consistent with %s" %
              filename)
        if log_level:
            print_error()
        sys.exit(1)
    _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=True)

    if log_level:
        print("Sets of supercell forces are read from %s." %
              "FORCES_FC2")
    file_exists("FORCES_FC2", log_level)
    forces_fc2 = parse_FORCES_FC2(disp_dataset)
    if not forces_fc2:
        return False

    _convert_force_unit(forces_fc2, force_to_eVperA)

    phono3py.produce_fc2(
        forces_fc2,
        displacement_dataset=disp_dataset,
        symmetrize_fc2=symmetrize_fc2,
        is_compact_fc=is_compact_fc,
        use_alm=use_alm,
        alm_options=alm_options)

    return True
Пример #5
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)
Пример #6
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)
Пример #7
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)