Example #1
0
static void init_array(
    int rnk_n, const INT *n, const INT *local_n, const INT *local_start,
    unsigned arraytype,
    void *data
    )
{
  INT ln_tot;
  INT *kvec_loc, *kvec_glob, *kvec_glob_mirrored;

  kvec_loc  = PX(malloc_INT)(rnk_n);
  kvec_glob = PX(malloc_INT)(rnk_n);
  kvec_glob_mirrored = PX(malloc_INT)(rnk_n);
 
  ln_tot = PX(prod_INT)(rnk_n, local_n);
  for(INT k=0; k<ln_tot; k++){
    vector_index(rnk_n, local_n, k, kvec_loc);
    PX(vadd_INT)(rnk_n, kvec_loc, local_start, kvec_glob);
    PX(vsub_INT)(rnk_n, n, kvec_glob, kvec_glob_mirrored);
    C d1 = init_scalar_periodic(rnk_n, n, kvec_glob);
    C d2 = init_scalar_periodic(rnk_n, n, kvec_glob_mirrored);
    switch (arraytype){
      case PFFTI_ARRAYTYPE_REAL: 
        /* set padding element to zero */
        ((R*)data)[k] = (kvec_glob[rnk_n-1] < n[rnk_n-1]) ? (R) d1 : 0.0; break;
      case PFFTI_ARRAYTYPE_COMPLEX:
        ((C*)data)[k] = d1; break;
      case PFFTI_ARRAYTYPE_HERMITIAN_COMPLEX:
        ((C*)data)[k] = 0.5 * (d1 + conj(d2)); break;
    }
  }

  free(kvec_loc); free(kvec_glob); free(kvec_glob_mirrored);
}
Example #2
0
static R check_array(
    int rnk_n, const INT *n, const INT *local_n, const INT *local_start,
    unsigned arraytype,
    const void *data, MPI_Comm comm
    )
{
  INT ln_tot;
  INT *kvec_loc, *kvec_glob, *kvec_glob_mirrored;
  R err, maxerr, globmaxerr;

  err = maxerr = 0;

  kvec_loc  = PX(malloc_INT)(rnk_n);
  kvec_glob = PX(malloc_INT)(rnk_n);
  kvec_glob_mirrored = PX(malloc_INT)(rnk_n);
 
  ln_tot = PX(prod_INT)(rnk_n, local_n);
  for(INT k=0; k<ln_tot; k++){
    vector_index(rnk_n, local_n, k, kvec_loc);
    PX(vadd_INT)(rnk_n, kvec_loc, local_start, kvec_glob);
    PX(vsub_INT)(rnk_n, n, kvec_glob, kvec_glob_mirrored);
    C d1 = init_scalar_periodic(rnk_n, n, kvec_glob);
    C d2 = init_scalar_periodic(rnk_n, n, kvec_glob_mirrored);
    switch (arraytype){
      case PFFTI_ARRAYTYPE_REAL: 
        /* ignore padding elements */
        err = (kvec_glob[rnk_n-1] < n[rnk_n-1]) ? cabs( ((R*)data)[k] - (R) d1 ) : 0.0; break;
      case PFFTI_ARRAYTYPE_COMPLEX:
        err = cabs( ((C*)data)[k] - d1); break;
      case PFFTI_ARRAYTYPE_HERMITIAN_COMPLEX:
        err = cabs( ((C*)data)[k] - 0.5 * (d1 + conj(d2))); break;
    }

    if( err > maxerr )
      maxerr = err;
  }

  free(kvec_loc); free(kvec_glob); free(kvec_glob_mirrored);

  MPI_Allreduce(&maxerr, &globmaxerr, 1, PFFT_MPI_REAL_TYPE, MPI_MAX, comm);
  return globmaxerr;
}