Exemple #1
0
/* 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);
    }
  }
}
Exemple #2
0
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);
  }
}