/* fc3_normal_squared[num_triplets, num_band0, num_band, num_band] */ void get_interaction(Darray *fc3_normal_squared, const Darray *frequencies, const Carray *eigenvectors, const Iarray *triplets, const int *grid_address, const int *mesh, const Darray *fc3, const int *atc, const int *atc_rec, const char* g_skip, const Darray *shortest_vectors, const Iarray *multiplicity, const double *masses, const int *p2s_map, const int *s2p_map, const int *band_indices, const int symmetrize_fc3_q, const double cutoff_frequency, const double cutoff_hfrequency, const double cutoff_delta) { int i, j, k, gp, num_band, num_band0; double *freqs[3]; lapack_complex_double *eigvecs[3]; double q[9]; num_band = frequencies->dims[1]; num_band0 = fc3_normal_squared->dims[1]; #pragma omp parallel for private(j, k, q, gp, freqs, eigvecs) for (i = 0; i < triplets->dims[0]; i++) { for (j = 0; j < 3; j++) { gp = triplets->data[i * 3 + j]; for (k = 0; k < 3; k++) { q[j * 3 + k] = ((double)grid_address[gp * 3 + k]) / mesh[k]; } freqs[j] = frequencies->data + gp * num_band; eigvecs[j] = eigenvectors->data + gp * num_band * num_band; } if (symmetrize_fc3_q) { real_to_normal_sym_q((fc3_normal_squared->data + i * num_band0 * num_band * num_band), freqs, eigvecs, fc3, atc, atc_rec, g_skip + i * num_band0 * num_band * num_band, q, /* q0, q1, q2 */ shortest_vectors, multiplicity, masses, p2s_map, s2p_map, band_indices, num_band0, num_band, cutoff_frequency, cutoff_hfrequency, cutoff_delta); } else { real_to_normal((fc3_normal_squared->data + i * num_band0 * num_band * num_band), freqs[0], freqs[1], freqs[2], eigvecs[0], eigvecs[1], eigvecs[2], fc3, atc, atc_rec, g_skip + i * num_band0 * num_band * num_band, q, /* q0, q1, q2 */ shortest_vectors, multiplicity, masses, p2s_map, s2p_map, band_indices, num_band0, num_band, 0, cutoff_frequency, cutoff_hfrequency, cutoff_delta); } } }
static void get_interaction_at_triplet(Darray *fc3_normal_squared, const int i, const char *g_zero, const Darray *frequencies, const Carray *eigenvectors, const Iarray *triplets, const int *grid_address, const int *mesh, const Darray *fc3, const Darray *shortest_vectors, const Iarray *multiplicity, const double *masses, const int *p2s_map, const int *s2p_map, const int *band_indices, const int symmetrize_fc3_q, const double cutoff_frequency, const int num_triplets, const int openmp_at_bands) { int j, k, gp, num_band, num_band0; double *freqs[3]; lapack_complex_double *eigvecs[3]; double q[9]; num_band = frequencies->dims[1]; num_band0 = fc3_normal_squared->dims[1]; for (j = 0; j < 3; j++) { gp = triplets->data[i * 3 + j]; for (k = 0; k < 3; k++) { q[j * 3 + k] = ((double)grid_address[gp * 3 + k]) / mesh[k]; } freqs[j] = frequencies->data + gp * num_band; eigvecs[j] = eigenvectors->data + gp * num_band * num_band; } if (symmetrize_fc3_q) { real_to_normal_sym_q((fc3_normal_squared->data + i * num_band0 * num_band * num_band), g_zero + i * num_band0 * num_band * num_band, freqs, eigvecs, fc3, q, /* q0, q1, q2 */ shortest_vectors, multiplicity, masses, p2s_map, s2p_map, band_indices, num_band0, num_band, cutoff_frequency, i, num_triplets, openmp_at_bands); } else { real_to_normal((fc3_normal_squared->data + i * num_band0 * num_band * num_band), g_zero + i * num_band0 * num_band * num_band, freqs[0], freqs[1], freqs[2], eigvecs[0], eigvecs[1], eigvecs[2], fc3, q, /* q0, q1, q2 */ shortest_vectors, multiplicity, masses, p2s_map, s2p_map, band_indices, num_band0, num_band, cutoff_frequency, i, num_triplets, openmp_at_bands); } }