#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; int PANPHASIA_compute_kspace_field_(size_t relative_level, ptrdiff_t N0_grid, ptrdiff_t local_n0_return, ptrdiff_t local_0_start_return, FFTW_COMPLEX *return_field) { size_t copy_list[Nbasis]; int fdim=1; int pmax = 6; size_t ncopy = (pmax+1)*(pmax+2)*(pmax+3)/6; size_t xorigin=local_0_start_return, yorigin=0, zorigin=0; size_t xextent =local_n0_return, yextent = N0_grid, zextent = N0_grid; int verbose = 1; int flag_output_mode=2; int error; ptrdiff_t size_to_alloc; FFTW_PLAN output_coeff_forward_plan; if (pmax>descriptor_order) return(100000); for (size_t i=0; infft_dim/2) ? ix + local_0_start_return - nfft_dim : ix + local_0_start_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 }else{ phase_shift_and_scale = cexp( (-I)*pi*(double)(kx + ky + kz)/(double)nfft_dim)/pow((double)nfft_dim,1.5); }; return_field[index1] *= phase_shift_and_scale; }; }; printf("Reached here 11!\n"); // Rescale selected Fourier modes to unit amplitude. // By default this part is not executed. if (descriptor_kk_limit>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_return - nfft_dim : ix + local_0_start_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 (ksquared<=descriptor_kk_limit){ index1 = ix*N0_grid*(N0_grid/2+1) + iy*(N0_grid/2+1) + iz; weight = cabs(return_field[index1]); return_field[index1] /= weight; }; }; }; printf("Reached here 12!\n"); if (nfft_dim <128){ int rank; MPI_Comm_rank(MPI_COMM_WORLD,&rank); char filename[100]; sprintf(filename,"output_k_space_field.%d",rank); int xuse,yuse,zuse; FFTW_REAL sign; FILE *fp; fp = fopen(filename,"w"); for (int ix=0; ixnfft_dim/2){ xuse = (nfft_dim-ix)%nfft_dim; yuse = (nfft_dim-iy)%nfft_dim; zuse = (nfft_dim-iz)%nfft_dim; sign = -1.0; }else{ xuse = ix; yuse = iy; zuse = iz; sign = 1.0; }; int index = xuse*N0_grid*(N0_grid/2+1) + yuse*(N0_grid/2+1) + zuse; fprintf(fp,"%6d%6d%6d %14.8lf %14.8lf\n",ix+local_0_start_return,iy,iz, creal(return_field[index]),cimag(sign*return_field[index])); }; fclose(fp); }; printf("Reached here 14!\n"); for (int j=0; j<4; j++){ for (int i=0; i<4; i++) printf("(%lf %lf) ",creal(return_field[j+ i*ncopy]), cimag(return_field[j + i*ncopy])); printf("\n"); }; FFTW_FREE(output_coefficients); FFTW_FREE(sph_bessel_coeff); FFTW_DESTROY_PLAN(output_coeff_forward_plan); printf("Reached here! 3 \n"); return(0); }; //========================================================================================== //==========================================================================================