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); }
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; }