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
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