Esempio n. 1
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):
    if input_filename is None:
        disp_filename = 'disp_fc2.yaml'
    else:
        disp_filename = 'disp_fc2.' + input_filename + '.yaml'
    natom = phono3py.phonon_supercell.get_number_of_atoms()
    try:
        disp_dataset = parse_forces(natom,
                                    force_to_eVperA,
                                    distance_to_A,
                                    force_filename="FORCES_FC2",
                                    disp_filename=disp_filename,
                                    is_fc2=True,
                                    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.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 _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.set_fc2(phonon_fc2)
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.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)
def _create_phono3py_fc2(phono3py, energy_to_eV, distance_to_A, tsym_type,
                         symmetrize_fc2, input_filename, use_alm, log_level):
    if input_filename is None:
        filename = 'disp_fc3.yaml'
    else:
        filename = 'disp_fc3.' + input_filename + '.yaml'
    if log_level:
        print("Displacement dataset is read from %s." % filename)
    file_exists(filename, log_level)
    disp_dataset = parse_disp_fc3_yaml(filename=filename)
    num_atom = phono3py.get_supercell().get_number_of_atoms()
    if disp_dataset['natom'] != num_atom:
        print("Number of atoms in supercell is not consistent with %s" %
              filename)
        if log_level:
            print_error()
        sys.exit(1)
    _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=True)

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

    _convert_force_unit(forces_fc2, energy_to_eV, distance_to_A)

    phono3py.produce_fc2(forces_fc2,
                         displacement_dataset=disp_dataset,
                         is_permutation_symmetry=symmetrize_fc2,
                         translational_symmetry_type=tsym_type,
                         use_alm=use_alm)

    return True
Esempio n. 5
0
def _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A,
                         symmetrize_fc3r, symmetrize_fc2, input_filename,
                         output_filename, is_compact_fc, cutoff_pair_distance,
                         use_alm, alm_options, compression, log_level):
    if input_filename is None:
        filename = 'disp_fc3.yaml'
    else:
        filename = 'disp_fc3.' + input_filename + '.yaml'
    file_exists(filename, log_level)
    if log_level:
        print("Displacement dataset for fc3 is read from %s." % filename)
    disp_dataset = parse_disp_fc3_yaml(filename=filename)
    if cutoff_pair_distance:
        if ('cutoff_distance' not in disp_dataset
                or 'cutoff_distance' in disp_dataset
                and cutoff_pair_distance < disp_dataset['cutoff_distance']):
            disp_dataset['cutoff_distance'] = cutoff_pair_distance
            if log_level:
                print("Cutoff-pair-distance: %f" % cutoff_pair_distance)
    num_atom = phono3py.get_supercell().get_number_of_atoms()
    if disp_dataset['natom'] != num_atom:
        print("Number of atoms in supercell is not consistent with %s" %
              filename)
        if log_level:
            print_error()
        sys.exit(1)
    _convert_displacement_unit(disp_dataset, distance_to_A)

    file_exists("FORCES_FC3", log_level)
    if log_level:
        print("Sets of supercell forces are read from %s." % "FORCES_FC3")
        sys.stdout.flush()
    forces_fc3 = parse_FORCES_FC3(disp_dataset)

    _convert_force_unit(forces_fc3, force_to_eVperA)
    phono3py.produce_fc3(forces_fc3,
                         displacement_dataset=disp_dataset,
                         symmetrize_fc3r=symmetrize_fc3r,
                         is_compact_fc=is_compact_fc,
                         use_alm=use_alm,
                         alm_options=alm_options)

    if output_filename is None:
        filename = 'fc3.hdf5'
    else:
        filename = 'fc3.' + output_filename + '.hdf5'
    if log_level:
        print("Writing fc3 to %s" % filename)
    p2s_map = phono3py.get_primitive().get_primitive_to_supercell_map()
    write_fc3_to_hdf5(phono3py.get_fc3(),
                      filename=filename,
                      p2s_map=p2s_map,
                      compression=compression)

    return True
def _create_phono3py_fc3(phono3py,
                         force_to_eVperA,
                         distance_to_A,
                         tsym_type,
                         symmetrize_fc3_r,
                         symmetrize_fc2,
                         cutoff_distance,
                         input_filename,
                         output_filename,
                         use_alm,
                         log_level):
    if input_filename is None:
        filename = 'disp_fc3.yaml'
    else:
        filename = 'disp_fc3.' + input_filename + '.yaml'
    file_exists(filename, log_level)
    if log_level:
        print("Displacement dataset is read from %s." % filename)
    disp_dataset = parse_disp_fc3_yaml(filename=filename)
    num_atom = phono3py.get_supercell().get_number_of_atoms()
    if disp_dataset['natom'] != num_atom:
        print("Number of atoms in supercell is not consistent with %s" %
              filename)
        if log_level:
            print_error()
        sys.exit(1)
    _convert_displacement_unit(disp_dataset, distance_to_A)

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

    _convert_force_unit(forces_fc3, force_to_eVperA)

    phono3py.produce_fc3(
        forces_fc3,
        displacement_dataset=disp_dataset,
        cutoff_distance=cutoff_distance,
        translational_symmetry_type=tsym_type,
        is_permutation_symmetry=symmetrize_fc3_r,
        is_permutation_symmetry_fc2=symmetrize_fc2,
        use_alm=use_alm)
    if output_filename is None:
        filename = 'fc3.hdf5'
    else:
        filename = 'fc3.' + output_filename + '.hdf5'
    if log_level:
        print("Writing fc3 to %s" % filename)
    write_fc3_to_hdf5(phono3py.get_fc3(), filename=filename)

    return True
def _create_phono3py_fc2(phono3py, force_to_eVperA, distance_to_A,
                         symmetrize_fc2, input_filename, is_compact_fc,
                         fc_calculator, fc_calculator_options, log_level):
    file_exists("FORCES_FC3", log_level)
    natom = phono3py.supercell.get_number_of_atoms()
    disp_dataset = _get_type2_dataset(natom, filename="FORCES_FC3")
    if disp_dataset:
        if log_level:
            print("%d snapshots were found in %s." %
                  (len(disp_dataset['displacements']), "FORCES_FC3"))
        if force_to_eVperA is not None:
            disp_dataset['forces'] *= force_to_eVperA
        if distance_to_A is not None:
            disp_dataset['displacements'] *= distance_to_A
    else:
        if input_filename is None:
            filename = 'disp_fc3.yaml'
        else:
            filename = 'disp_fc3.' + input_filename + '.yaml'
        if log_level:
            print("Displacement dataset for fc2 is read from %s." % filename)
        file_exists(filename, log_level)
        disp_dataset = parse_disp_fc3_yaml(filename=filename)
        if disp_dataset['natom'] != natom:
            print("Number of atoms in supercell is not consistent with %s" %
                  filename)
            if log_level:
                print_error()
            sys.exit(1)
        _convert_displacement_unit(disp_dataset, distance_to_A, is_fc2=True)

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

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

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

    return True
Esempio n. 8
0
def _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A,
                         symmetrize_fc3r, symmetrize_fc2, input_filename,
                         output_filename, is_compact_fc, cutoff_pair_distance,
                         fc_calculator, fc_calculator_options, compression,
                         log_level):
    if input_filename is None:
        disp_filename = 'disp_fc3.yaml'
    else:
        disp_filename = 'disp_fc3.' + input_filename + '.yaml'
    natom = phono3py.supercell.get_number_of_atoms()
    try:
        disp_dataset = parse_forces(natom,
                                    force_to_eVperA,
                                    distance_to_A,
                                    cutoff_pair_distance=cutoff_pair_distance,
                                    force_filename="FORCES_FC3",
                                    disp_filename=disp_filename,
                                    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.produce_fc3(displacement_dataset=disp_dataset,
                         symmetrize_fc3r=symmetrize_fc3r,
                         is_compact_fc=is_compact_fc,
                         fc_calculator=fc_calculator,
                         fc_calculator_options=fc_calculator_options)

    if output_filename is None:
        filename = 'fc3.hdf5'
    else:
        filename = 'fc3.' + output_filename + '.hdf5'
    if log_level:
        print("Writing fc3 to \"%s\"." % filename)

    write_fc3_to_hdf5(phono3py.fc3,
                      filename=filename,
                      p2s_map=phono3py.primitive.p2s_map,
                      compression=compression)

    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
Esempio n. 10
0
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')
Esempio n. 11
0
def _create_phono3py_fc3(phono3py, force_to_eVperA, distance_to_A,
                         symmetrize_fc3r, symmetrize_fc2, input_filename,
                         output_filename, is_compact_fc, cutoff_pair_distance,
                         fc_calculator, fc_calculator_options, compression,
                         log_level):
    file_exists("FORCES_FC3", log_level)
    natom = phono3py.supercell.get_number_of_atoms()
    disp_dataset = _get_type2_dataset(natom, filename="FORCES_FC3")
    if disp_dataset:  # type2
        if log_level:
            print("%d snapshots were found in %s." %
                  (len(disp_dataset['displacements']), "FORCES_FC3"))
        if force_to_eVperA is not None:
            disp_dataset['forces'] *= force_to_eVperA
        if distance_to_A is not None:
            disp_dataset['displacements'] *= distance_to_A
    else:  # type1
        if input_filename is None:
            filename = 'disp_fc3.yaml'
        else:
            filename = 'disp_fc3.' + input_filename + '.yaml'
        file_exists(filename, log_level)
        if log_level:
            print("Displacement dataset for fc3 is read from %s." % filename)
        disp_dataset = parse_disp_fc3_yaml(filename=filename)
        if cutoff_pair_distance:
            if ('cutoff_distance' not in disp_dataset
                    or 'cutoff_distance' in disp_dataset and
                    cutoff_pair_distance < disp_dataset['cutoff_distance']):
                disp_dataset['cutoff_distance'] = cutoff_pair_distance
                if log_level:
                    print("Cutoff-pair-distance: %f" % cutoff_pair_distance)
        num_atom = phono3py.get_supercell().get_number_of_atoms()
        if disp_dataset['natom'] != num_atom:
            print("Number of atoms in supercell is not consistent with %s" %
                  filename)
            if log_level:
                print_error()
            sys.exit(1)
        _convert_displacement_unit(disp_dataset, distance_to_A)
        if log_level:
            print("Sets of supercell forces are read from %s." % "FORCES_FC3")
            sys.stdout.flush()
        # forces are stored in disp_dataset.
        parse_FORCES_FC3(disp_dataset, unit_conversion_factor=force_to_eVperA)

    phono3py.produce_fc3(displacement_dataset=disp_dataset,
                         symmetrize_fc3r=symmetrize_fc3r,
                         is_compact_fc=is_compact_fc,
                         fc_calculator=fc_calculator,
                         fc_calculator_options=fc_calculator_options)

    if output_filename is None:
        filename = 'fc3.hdf5'
    else:
        filename = 'fc3.' + output_filename + '.hdf5'
    if log_level:
        print("Writing fc3 to %s" % filename)

    write_fc3_to_hdf5(phono3py.get_fc3(),
                      filename=filename,
                      p2s_map=phono3py.primitive.p2s_map,
                      compression=compression)

    return True
def create_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')
Esempio n. 13
0
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, settings.get_use_alm(), 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,
                                            settings.get_use_alm(), 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,
                    settings.get_use_alm(), 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')