void ath_3d_fft_destroy_plan(struct ath_3d_fft_plan *ath_plan) { if (ath_plan != NULL) { #ifdef FFT_BLOCK_DECOMP fft_3d_destroy_plan(ath_plan->plan); #else /* FFT_BLOCK_DECOMP */ fftw_destroy_plan(ath_plan->plan); #endif /* FFT_BLOCK_DECOMP */ free(ath_plan); } return; }
FFT_DATA *_fwd(cow_dfield *f, double *fx, int start, int stride) { FFT_DATA *Fk = NULL; FFT_DATA *Fx = NULL; if (cow_mpirunning()) { #if (COW_MPI) int nbuf; long long ntot = cow_domain_getnumglobalzones(f->domain, COW_ALL_DIMS); struct fft_plan_3d *plan = call_fft_plan_3d(f->domain, &nbuf); Fx = (FFT_DATA*) malloc(nbuf * sizeof(FFT_DATA)); Fk = (FFT_DATA*) malloc(nbuf * sizeof(FFT_DATA)); for (int n=0; n<nbuf; ++n) { Fx[n][0] = fx[stride * n + start] / ntot; Fx[n][1] = 0.0; } fft_3d(Fx, Fk, FFT_FWD, plan); free(Fx); fft_3d_destroy_plan(plan); #endif // COW_MPI } else { int nbuf = cow_domain_getnumlocalzonesinterior(f->domain, COW_ALL_DIMS); long long ntot = cow_domain_getnumglobalzones(f->domain, COW_ALL_DIMS); Fx = (FFT_DATA*) malloc(nbuf * sizeof(FFT_DATA)); Fk = (FFT_DATA*) malloc(nbuf * sizeof(FFT_DATA)); for (int n=0; n<nbuf; ++n) { Fx[n][0] = fx[stride * n + start] / ntot; Fx[n][1] = 0.0; } int *N = f->domain->L_nint; fftw_plan plan = fftw_plan_many_dft(3, N, 1, Fx, NULL, 1, 0, Fk, NULL, 1, 0, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(plan); fftw_destroy_plan(plan); free(Fx); } return Fk; }
double *_rev(cow_domain *d, FFT_DATA *Fk) { FFT_DATA *Fx = NULL; double *fx = NULL; if (cow_mpirunning()) { #if (COW_MPI) int nbuf; long long ntot = cow_domain_getnumglobalzones(d, COW_ALL_DIMS); struct fft_plan_3d *plan = call_fft_plan_3d(d, &nbuf); fx = (double*) malloc(nbuf * sizeof(double)); Fx = (FFT_DATA*) malloc(nbuf * sizeof(FFT_DATA)); fft_3d(Fk, Fx, FFT_REV, plan); for (int n=0; n<nbuf; ++n) { fx[n] = Fx[n][0] / ntot; } free(Fx); fft_3d_destroy_plan(plan); #endif // COW_MPI } else { int nbuf = cow_domain_getnumlocalzonesinterior(d, COW_ALL_DIMS); long long ntot = cow_domain_getnumglobalzones(d, COW_ALL_DIMS); fx = (double*) malloc(nbuf * sizeof(double)); Fx = (FFT_DATA*) malloc(nbuf * sizeof(FFT_DATA)); int *N = d->L_nint; fftw_plan plan = fftw_plan_many_dft(3, N, 1, Fk, NULL, 1, 0, Fx, NULL, 1, 0, FFTW_BACKWARD, FFTW_ESTIMATE); fftw_execute(plan); for (int n=0; n<nbuf; ++n) { fx[n] = Fx[n][0] / ntot; } free(Fx); fftw_destroy_plan(plan); } return fx; }