Пример #1
0
def get_imag_self_energy(interaction,
                         grid_points,
                         sigmas,
                         frequency_step=None,
                         num_frequency_points=None,
                         temperatures=None,
                         scattering_event_class=None, # class 1 or 2
                         run_with_g=True,
                         write_details=False,
                         log_level=0):
    """Imaginary part of self energy at frequency points

    Band indices to be calculated at are kept in Interaction instance.

    Args:
        interaction: Ph-ph interaction
        grid_points: Grid-point indices to be caclculated on
        sigmas:
            A set of sigmas. simga=None means to use tetrahedron method,
            otherwise smearing method with real positive value of sigma.
        frequency_step: Pitch of frequency to be sampled.
        num_frequency_points: Number of sampling sampling points to be used
            instead of frequency_step.
        temperatures: Temperatures to be calculated at.
        scattering_event_class:
            Extract scattering event class 1 or 2. This can be enabled only when
            run_with_g is True.
        run_with_g:
            Integration weigths are calculated from gaussian smearing function.
            More memory space is required, but a consistent routine can be used
            both in tetrahedron method and smearing method.
        log_level: Log level. 0 or non 0 in this method.

    Returns:
        Tuple: (Imaginary part of self energy, sampling frequency points)

    """
    if temperatures is None:
        temperatures = [0.0, 300.0]

    if temperatures is None:
        print("Temperatures have to be set.")
        return False

    mesh = interaction.get_mesh_numbers()
    ise = ImagSelfEnergy(interaction, in_details=write_details)
    imag_self_energy = []
    frequency_points = []
    for i, gp in enumerate(grid_points):
        ise.set_grid_point(gp)
        if log_level:
            weights = interaction.get_triplets_at_q()[1]
            print("------------------- Imaginary part of self energy (%d/%d) "
                  "-------------------" % (i + 1, len(grid_points)))
            print("Grid point: %d" % gp)
            print("Number of ir-triplets: "
                  "%d / %d" % (len(weights), weights.sum()))
        ise.run_interaction()
        frequencies = interaction.get_phonons()[0]
        max_phonon_freq = np.amax(frequencies)

        if log_level:
            adrs = interaction.get_grid_address()[gp]
            q = adrs.astype('double') / mesh
            print("q-point: %s" % q)
            print("Phonon frequency:")
            text = "[ "
            for i, freq in enumerate(frequencies[gp]):
                if i % 6 == 0 and i != 0:
                    text += "\n"
                text += "%8.4f " % freq
            text += "]"
            print(text)

        gamma_sigmas = []
        fp_sigmas = []
        if write_details:
            triplets, weights, _, _ = interaction.get_triplets_at_q()

        for j, sigma in enumerate(sigmas):
            if log_level:
                if sigma:
                    print("Sigma: %s" % sigma)
                else:
                    print("Tetrahedron method")

            ise.set_sigma(sigma)
            if sigma:
                fmax = max_phonon_freq * 2 + sigma * 4
            else:
                fmax = max_phonon_freq * 2
            fmax *= 1.005
            fmin = 0
            frequency_points_at_sigma = get_frequency_points(
                fmin,
                fmax,
                frequency_step=frequency_step,
                num_frequency_points=num_frequency_points)
            fp_sigmas.append(frequency_points_at_sigma)
            gamma = np.zeros(
                (len(temperatures), len(frequency_points_at_sigma),
                 len(interaction.get_band_indices())), dtype='double')

            if write_details:
                num_band0 = len(interaction.get_band_indices())
                num_band = frequencies.shape[1]
                detailed_gamma = np.zeros(
                    (len(temperatures), len(frequency_points_at_sigma),
                     num_band0, num_band, num_band, len(weights)),
                    dtype='double')
                 
            for k, freq_point in enumerate(frequency_points_at_sigma):
                ise.set_frequency_points([freq_point])
                if sigma is None or run_with_g:
                    ise.set_integration_weights(
                        scattering_event_class=scattering_event_class)

                for l, t in enumerate(temperatures):
                    ise.set_temperature(t)
                    ise.run()
                    gamma[l, k] = ise.get_imag_self_energy()[0]
                    if write_details:
                        detailed_gamma[l, k] = np.transpose(
                            ise.get_detailed_imag_self_energy()[0],
                            axes=(1, 2, 3, 0))

            gamma_sigmas.append(gamma)

            if write_details:
                filename = write_detailed_gamma_to_hdf5(
                    detailed_gamma,
                    temperatures,
                    mesh,
                    gp,
                    sigma,
                    triplets,
                    weights,
                    frequency_points=frequency_points_at_sigma)

                if log_level:
                    print("Contribution of each triplet to imaginary part of "
                          "self energy is written in\n\"%s\"." % filename)
            
        imag_self_energy.append(gamma_sigmas)
        frequency_points.append(fp_sigmas)
                
    return imag_self_energy, frequency_points
Пример #2
0
def get_linewidth(interaction,
                  grid_points,
                  sigmas,
                  temperatures=np.arange(0, 1001, 10, dtype='double'),
                  run_with_g=True,
                  write_details=False,
                  log_level=0):
    ise = ImagSelfEnergy(interaction, in_details=write_details)
    band_indices = interaction.get_band_indices()
    mesh = interaction.get_mesh_numbers()
    gamma = np.zeros(
        (len(grid_points), len(sigmas), len(temperatures), len(band_indices)),
        dtype='double')
    
    for i, gp in enumerate(grid_points):
        ise.set_grid_point(gp)
        if log_level:
            weights = interaction.get_triplets_at_q()[1]
            print("------ Linewidth ------")
            print("Grid point: %d" % gp)
            print("Number of ir-triplets: "
                  "%d / %d" % (len(weights), weights.sum()))
        ise.run_interaction()
        frequencies = interaction.get_phonons()[0]
        if log_level:
            adrs = interaction.get_grid_address()[gp]
            q = adrs.astype('double') / mesh
            print("q-point: %s" % q)
            print("Phonon frequency:")
            print("%s" % frequencies[gp])

        if write_details:
            triplets, weights, _, _ = interaction.get_triplets_at_q()
        
        for j, sigma in enumerate(sigmas):
            if log_level:
                if sigma:
                    print("Sigma: %s" % sigma)
                else:
                    print("Tetrahedron method")
            ise.set_sigma(sigma)
            if sigma is None or run_with_g:
                ise.set_integration_weights()

            if write_details:
                num_band0 = len(interaction.get_band_indices())
                num_band = frequencies.shape[1]
                num_temp = len(temperatures)
                detailed_gamma = np.zeros(
                    (num_temp, num_band0, num_band, num_band, len(weights)),
                    dtype='double')

            for k, t in enumerate(temperatures):
                ise.set_temperature(t)
                ise.run()
                gamma[i, j, k] = ise.get_imag_self_energy()
                if write_details:
                    detailed_gamma[k] = np.transpose(
                        ise.get_detailed_imag_self_energy(),
                        axes=(1, 2, 3, 0))

            if write_details:
                filename = write_detailed_gamma_to_hdf5(
                    detailed_gamma,
                    temperatures,
                    mesh,
                    gp,
                    sigma,
                    triplets,
                    weights)

                if log_level:
                    print("Contribution of each triplet to imaginary part of "
                          "self energy is written in\n\"%s\"." % filename)


    return gamma