#include #include #include #include #include #include #include #include "PAN_FFTW3.h" #include "panphasia_functions.h" #ifdef USE_OPENMP #include #endif extern const int Nbasis; extern const int irank_p[3][84]; extern size_t descriptor_order; extern size_t descriptor_kk_limit; extern size_t descriptor_base_size; int PANPHASIA_compute_kspace_field_(size_t relative_level, ptrdiff_t N0_fourier_grid, ptrdiff_t local_n0_fourier_return, ptrdiff_t local_0_start_fourier_return, FFTW_COMPLEX *return_field) { size_t copy_list[Nbasis]; int pmax = 6; int nsubdivide = 21; //(pmax%2==0)?pmax+1:pmax+2; size_t ncopy = (pmax+1)*(pmax+2)*(pmax+3)/6; if (ncopy%nsubdivide!=0) return(100010); int nchunk = ncopy/nsubdivide; int verbose = 1; int flag_output_mode=2; int error; ptrdiff_t size_to_alloc_fourier; ptrdiff_t size_to_alloc_pan; ptrdiff_t local_fourier_x_start, local_fourier_x_end; FFTW_PLAN output_coeff_forward_plan; ptrdiff_t N0_pan_grid = descriptor_base_size<descriptor_order) return(100020); for (size_t i=0; infft_dim/2) ? ix + local_0_start_fourier_return - nfft_dim : ix + local_0_start_fourier_return; ky = (iy > nfft_dim/2) ? iy-nfft_dim : iy; kz = (iz > nfft_dim/2) ? iz-nfft_dim : iz; if ( (kx==nfft_dim/2)||(ky==nfft_dim/2)||(kz==nfft_dim/2)){ // Set Nyquist modes to zero - not used by IC_Gen anyway. phase_shift_and_scale = 0.0; //1.0/pow((double)nfft_dim,1.5); // No phase shift ptr_mode_weightings[index1] = 0.0; // Set squared weight to zero }else{ phase_shift_and_scale = sqrt( (double)(fdim*fdim*fdim))* cexp( (double)fdim * (-I)*pi*(double)(kx + ky + kz)/sqrt(ptr_mode_weightings[index1])/ (double)nfft_dim)/pow((double)nfft_dim,1.5); }; return_field[index1] *= phase_shift_and_scale; if (ptr_mode_weightings[index1]0){ size_t index1; complex weight; size_t ksquared; int kx,ky,kz; #ifdef USE_OPENMP #pragma omp parallel for collapse(3) \ private (index1,kx,ky,kz,ksquared,weight) #endif for(int ix=0;ixnfft_dim/2) ? ix + local_0_start_fourier_return - nfft_dim : ix + local_0_start_fourier_return; ky = (iy > nfft_dim/2) ? iy-nfft_dim : iy; kz = (iz > nfft_dim/2) ? iz-nfft_dim : iz; ksquared = kx*kx + ky*ky + kz*kz; if ( (kx!=nfft_dim/2)&&(ky!=nfft_dim/2)&&(kz!=nfft_dim/2)){ //Omit Nyquist modes if ((ksquared<=descriptor_kk_limit)&&(ksquared!=0)){ index1 = ix*N0_fourier_grid*(N0_fourier_grid/2+1) + iy*(N0_fourier_grid/2+1) + iz; weight = cabs(return_field[index1]); return_field[index1] /= weight; }; }; }; }; //printf("Reached here 12!\n"); int rank; MPI_Comm_rank(MPI_COMM_WORLD,&rank); char filename[100]; sprintf(filename,"output_k_space_alt.%d",rank); FILE *fp; if (nfft_dim <-1){ FILE *fp; fp = fopen(filename,"w"); for (int ix=0; ix