def _set_gamma_at_sigmas_lowmem(self, i): band_indices = self._pp.get_band_indices() (svecs, multiplicity, p2s, s2p, masses) = self._pp.get_primitive_and_supercell_correspondence() fc3 = self._pp.get_fc3() triplets_at_q, weights_at_q, _, _ = self._pp.get_triplets_at_q() bz_map = self._pp.get_bz_map() symmetrize_fc3_q = 0 reciprocal_lattice = np.linalg.inv(self._pp.get_primitive().get_cell()) thm = TetrahedronMethod(reciprocal_lattice, mesh=self._mesh) # It is assumed that self._sigmas = [None]. for j, sigma in enumerate(self._sigmas): self._collision.set_sigma(sigma) if self._is_N_U: collisions = np.zeros( (2, len(self._temperatures), len(band_indices)), dtype='double', order='C') else: collisions = np.zeros( (len(self._temperatures), len(band_indices)), dtype='double', order='C') import phono3py._phono3py as phono3c phono3c.pp_collision(collisions, thm.get_tetrahedra(), self._frequencies, self._eigenvectors, triplets_at_q, weights_at_q, self._grid_address, bz_map, self._mesh, fc3, svecs, multiplicity, masses, p2s, s2p, band_indices, self._temperatures, self._is_N_U * 1, symmetrize_fc3_q, self._cutoff_frequency) col_unit_conv = self._collision.get_unit_conversion_factor() pp_unit_conv = self._pp.get_unit_conversion_factor() if self._is_N_U: col = collisions.sum(axis=0) col_N = collisions[0] col_U = collisions[1] else: col = collisions for k in range(len(self._temperatures)): self._gamma[j, k, i, :] = average_by_degeneracy( col[k] * col_unit_conv * pp_unit_conv, band_indices, self._frequencies[self._grid_points[i]]) if self._is_N_U: self._gamma_N[j, k, i, :] = average_by_degeneracy( col_N[k] * col_unit_conv * pp_unit_conv, band_indices, self._frequencies[self._grid_points[i]]) self._gamma_U[j, k, i, :] = average_by_degeneracy( col_U[k] * col_unit_conv * pp_unit_conv, band_indices, self._frequencies[self._grid_points[i]])
def _set_gamma_at_sigmas_lowmem(self, i): """Calculate gamma without storing ph-ph interaction strength. `svecs` and `multi` below must not be simply replaced by `self._pp.primitive.get_smallest_vectors()` because they must be in dense format as always so in Interaction class instance. `p2s`, `s2p`, and `masses` have to be also given from Interaction class instance. """ band_indices = self._pp.band_indices ( svecs, multi, p2s, s2p, masses, ) = self._pp.get_primitive_and_supercell_correspondence() fc3 = self._pp.fc3 triplets_at_q, weights_at_q, _, _ = self._pp.get_triplets_at_q() symmetrize_fc3_q = 0 if None in self._sigmas: thm = TetrahedronMethod(self._pp.bz_grid.microzone_lattice) # It is assumed that self._sigmas = [None]. for j, sigma in enumerate(self._sigmas): self._collision.set_sigma(sigma) if self._is_N_U: collisions = np.zeros( (2, len(self._temperatures), len(band_indices)), dtype="double", order="C", ) else: collisions = np.zeros( (len(self._temperatures), len(band_indices)), dtype="double", order="C", ) import phono3py._phono3py as phono3c if sigma is None: phono3c.pp_collision( collisions, np.array( np.dot(thm.get_tetrahedra(), self._pp.bz_grid.P.T), dtype="int_", order="C", ), self._frequencies, self._eigenvectors, triplets_at_q, weights_at_q, self._pp.bz_grid.addresses, self._pp.bz_grid.gp_map, self._pp.bz_grid.store_dense_gp_map * 1 + 1, self._pp.bz_grid.D_diag, self._pp.bz_grid.Q, fc3, svecs, multi, masses, p2s, s2p, band_indices, self._temperatures, self._is_N_U * 1, symmetrize_fc3_q, self._pp.cutoff_frequency, ) else: if self._sigma_cutoff is None: sigma_cutoff = -1 else: sigma_cutoff = float(self._sigma_cutoff) phono3c.pp_collision_with_sigma( collisions, sigma, sigma_cutoff, self._frequencies, self._eigenvectors, triplets_at_q, weights_at_q, self._pp.bz_grid.addresses, self._pp.bz_grid.D_diag, self._pp.bz_grid.Q, fc3, svecs, multi, masses, p2s, s2p, band_indices, self._temperatures, self._is_N_U * 1, symmetrize_fc3_q, self._pp.cutoff_frequency, ) col_unit_conv = self._collision.unit_conversion_factor pp_unit_conv = self._pp.get_unit_conversion_factor() if self._is_N_U: col = collisions.sum(axis=0) col_N = collisions[0] col_U = collisions[1] else: col = collisions for k in range(len(self._temperatures)): self._gamma[j, k, i, :] = average_by_degeneracy( col[k] * col_unit_conv * pp_unit_conv, band_indices, self._frequencies[self._grid_points[i]], ) if self._is_N_U: self._gamma_N[j, k, i, :] = average_by_degeneracy( col_N[k] * col_unit_conv * pp_unit_conv, band_indices, self._frequencies[self._grid_points[i]], ) self._gamma_U[j, k, i, :] = average_by_degeneracy( col_U[k] * col_unit_conv * pp_unit_conv, band_indices, self._frequencies[self._grid_points[i]], )