/** * reconstruct makes a 2d-adjoint-nfft */ static void reconstruct(char* filename, int N, int M, int weight) { int j; /* some variables */ double weights; /* store one weight temporary */ double real,imag; /* to read the real and imag part of a complex number */ nfft_plan my_plan; /* plan for the two dimensional nfft */ FILE* fin; /* input file */ FILE* fweight; /* input file for the weights */ FILE *fout_real; /* output file */ FILE *fout_imag; /* output file */ int my_N[2],my_n[2]; int flags = PRE_PHI_HUT| PRE_PSI |MALLOC_X| MALLOC_F_HAT| MALLOC_F| FFTW_INIT| FFT_OUT_OF_PLACE| FFTW_MEASURE| FFTW_DESTROY_INPUT; /* initialise nfft */ my_N[0]=N; my_n[0]=ceil(N*1.2); my_N[1]=N; my_n[1]=ceil(N*1.2); nfft_init_guru(&my_plan, 2, my_N, M, my_n, 6,flags, FFTW_MEASURE| FFTW_DESTROY_INPUT); fin=fopen(filename,"r"); fweight=fopen("weights.dat","r"); for(j=0;j<my_plan.M_total;j++) { fscanf(fweight,"%le ",&weights); fscanf(fin,"%le %le %le %le",&my_plan.x[2*j+0],&my_plan.x[2*j+1],&real,&imag); my_plan.f[j] = real + _Complex_I*imag; if (weight) my_plan.f[j] = my_plan.f[j] * weights; } fclose(fweight); /* precompute psi */ if(my_plan.nfft_flags & PRE_PSI) nfft_precompute_psi(&my_plan); /* precompute full psi */ if(my_plan.nfft_flags & PRE_FULL_PSI) nfft_precompute_full_psi(&my_plan); /* compute the adjoint nfft */ nfft_adjoint(&my_plan); fout_real=fopen("output_real.dat","w"); fout_imag=fopen("output_imag.dat","w"); for (j=0;j<N*N;j++) { fprintf(fout_real,"%le ",creal(my_plan.f_hat[j])); fprintf(fout_imag,"%le ",cimag(my_plan.f_hat[j])); } fclose(fin); fclose(fout_real); fclose(fout_imag); nfft_finalize(&my_plan); }
/** * reconstruct makes an 2d-adjoint-nfft for every slice */ static void reconstruct(char* filename,int N,int M,int Z, int weight ,fftw_complex *mem) { int j,k,z; /* some variables */ double weights; /* store one weight temporary */ double tmp; /* tmp to read the obsolent z from the input file */ double real,imag; /* to read the real and imag part of a complex number */ nfft_plan my_plan; /* plan for the two dimensional nfft */ int my_N[2],my_n[2]; /* to init the nfft */ FILE* fin; /* input file */ FILE* fweight; /* input file for the weights */ /* initialise my_plan */ my_N[0]=N; my_n[0]=ceil(N*1.2); my_N[1]=N; my_n[1]=ceil(N*1.2); nfft_init_guru(&my_plan, 2, my_N, M/Z, my_n, 6, PRE_PHI_HUT| PRE_PSI| MALLOC_X| MALLOC_F_HAT| MALLOC_F| FFTW_INIT| FFT_OUT_OF_PLACE, FFTW_MEASURE| FFTW_DESTROY_INPUT); /* precompute lin psi if set */ if(my_plan.nfft_flags & PRE_LIN_PSI) nfft_precompute_lin_psi(&my_plan); fin=fopen(filename,"r"); for(z=0;z<Z;z++) { fweight=fopen("weights.dat","r"); for(j=0;j<my_plan.M_total;j++) { fscanf(fweight,"%le ",&weights); fscanf(fin,"%le %le %le %le %le", &my_plan.x[2*j+0],&my_plan.x[2*j+1],&tmp,&real,&imag); my_plan.f[j] = real + _Complex_I*imag; if(weight) my_plan.f[j] = my_plan.f[j] * weights; } fclose(fweight); /* precompute psi if set just one time because the knots equal each slice */ if(z==0 && my_plan.nfft_flags & PRE_PSI) nfft_precompute_psi(&my_plan); /* precompute full psi if set just one time because the knots equal each slice */ if(z==0 && my_plan.nfft_flags & PRE_FULL_PSI) nfft_precompute_full_psi(&my_plan); /* compute the adjoint nfft */ nfft_adjoint(&my_plan); for(k=0;k<my_plan.N_total;k++) { /* write every slice in the memory. here we make an fftshift direct */ mem[(Z*N*N/2+z*N*N+ k)%(Z*N*N)] = my_plan.f_hat[k]; } } fclose(fin); nfft_finalize(&my_plan); }
static void simple_test_nfft_1d(void) { nfft_plan p; double t; int N=14; int M=19; ticks t0, t1; /** init an one dimensional plan */ nfft_init_1d(&p,N,M); /** init pseudo random nodes */ nfft_vrand_shifted_unit_double(p.x,p.M_total); /** precompute psi, the entries of the matrix B */ if(p.nfft_flags & PRE_ONE_PSI) nfft_precompute_one_psi(&p); /** init pseudo random Fourier coefficients and show them */ nfft_vrand_unit_complex(p.f_hat,p.N_total); nfft_vpr_complex(p.f_hat,p.N_total,"given Fourier coefficients, vector f_hat"); /** direct trafo and show the result */ t0 = getticks(); nfft_trafo_direct(&p); t1 = getticks(); t = nfft_elapsed_seconds(t1,t0); nfft_vpr_complex(p.f,p.M_total,"ndft, vector f"); printf(" took %e seconds.\n",t); /** approx. trafo and show the result */ nfft_trafo(&p); nfft_vpr_complex(p.f,p.M_total,"nfft, vector f"); /** approx. adjoint and show the result */ nfft_adjoint_direct(&p); nfft_vpr_complex(p.f_hat,p.N_total,"adjoint ndft, vector f_hat"); /** approx. adjoint and show the result */ nfft_adjoint(&p); nfft_vpr_complex(p.f_hat,p.N_total,"adjoint nfft, vector f_hat"); /** finalise the one dimensional plan */ nfft_finalize(&p); }
void // space to frequency mad_cmat_nfft (const cnum_t x[], const num_t x_node[], cnum_t r[], ssz_t m, ssz_t n, ssz_t nr) { assert( x && r ); int precomp = 0; if (m != p_n1 || n != p_n2 || nr != p_m) { nfft_finalize(&p); nfft_init_2d (&p, m, n, nr); p_n1 = m, p_n2 = n, p_m = nr, precomp = 1; } if (x_node || precomp) { for (ssz_t i=0; i < m*n; i++) // adjoint transform needs -x_node p.x[i] = x_node[i] == -0.5 ? 0.4999999999999999 : -x_node[i]; if(p.flags & PRE_ONE_PSI) nfft_precompute_one_psi(&p); } mad_cvec_copy(x, p.f, m*n); const char *error_str = nfft_check(&p); if (error_str) error("%s", error_str); nfft_adjoint(&p); // nfft_adjoint_direct(&p); // mad_cvec_copy(p.f_hat, r, nr); mad_cvec_copy(p.f_hat+nr/2, r, nr/2); // for compatibility with FFTW ?? (TBC) mad_cvec_copy(p.f_hat, r+nr/2, nr/2); }
/** * Executes the fast Gauss transform. * * \arg ths The pointer to a fgt plan * * \author Stefan Kunis */ void fgt_trafo(fgt_plan *ths) { int l; if(ths->flags & FGT_NDFT) { nfft_adjoint_direct(ths->nplan1); for(l=0; l<ths->n; l++) ths->nplan1->f_hat[l] *= ths->b[l]; nfft_trafo_direct(ths->nplan2); } else { nfft_adjoint(ths->nplan1); for(l=0; l<ths->n; l++) ths->nplan1->f_hat[l] *= ths->b[l]; nfft_trafo(ths->nplan2); } }
/** fast NFFT-based summation */ void fastsum_trafo(fastsum_plan *ths) { int j,k,t; ticks t0, t1; ths->MEASURE_TIME_t[4] = 0.0; ths->MEASURE_TIME_t[5] = 0.0; ths->MEASURE_TIME_t[6] = 0.0; ths->MEASURE_TIME_t[7] = 0.0; #ifdef MEASURE_TIME t0 = getticks(); #endif /** first step of algorithm */ nfft_adjoint(&(ths->mv1)); #ifdef MEASURE_TIME t1 = getticks(); ths->MEASURE_TIME_t[4] += nfft_elapsed_seconds(t1,t0); #endif #ifdef MEASURE_TIME t0 = getticks(); #endif /** second step of algorithm */ #pragma omp parallel for default(shared) private(k) for (k=0; k<ths->mv2.N_total; k++) ths->mv2.f_hat[k] = ths->b[k] * ths->mv1.f_hat[k]; #ifdef MEASURE_TIME t1 = getticks(); ths->MEASURE_TIME_t[5] += nfft_elapsed_seconds(t1,t0); #endif #ifdef MEASURE_TIME t0 = getticks(); #endif /** third step of algorithm */ nfft_trafo(&(ths->mv2)); #ifdef MEASURE_TIME t1 = getticks(); ths->MEASURE_TIME_t[6] += nfft_elapsed_seconds(t1,t0); #endif #ifdef MEASURE_TIME t0 = getticks(); #endif /** add near field */ #pragma omp parallel for default(shared) private(j,k,t) for (j=0; j<ths->M_total; j++) { double ymin[ths->d], ymax[ths->d]; /** limits for d-dimensional near field box */ if (ths->flags & NEARFIELD_BOXES) { ths->f[j] = ths->mv2.f[j] + SearchBox(ths->y + ths->d*j, ths); } else { for (t=0; t<ths->d; t++) { ymin[t] = ths->y[ths->d*j+t] - ths->eps_I; ymax[t] = ths->y[ths->d*j+t] + ths->eps_I; } ths->f[j] = ths->mv2.f[j] + SearchTree(ths->d,0, ths->x, ths->alpha, ymin, ymax, ths->N_total, ths->k, ths->kernel_param, ths->Ad, ths->Add, ths->p, ths->flags); } /* ths->f[j] = ths->mv2.f[j]; */ /* ths->f[j] = SearchTree(ths->d,0, ths->x, ths->alpha, ymin, ymax, ths->N_total, ths->k, ths->kernel_param, ths->Ad, ths->Add, ths->p, ths->flags); */ } #ifdef MEASURE_TIME t1 = getticks(); ths->MEASURE_TIME_t[7] += nfft_elapsed_seconds(t1,t0); #endif }
void FC_FUNC(oct_nfft_adjoint,OCT_NFFT_ADJOINT) (nfft_plan *ths) { nfft_adjoint (ths); }
static void simple_test_nfft_2d(void) { int K,N[2],n[2],M; double t; ticks t0, t1; nfft_plan p; N[0]=32; n[0]=64; N[1]=14; n[1]=32; M=N[0]*N[1]; K=16; t0 = getticks(); /** init a two dimensional plan */ nfft_init_guru(&p, 2, N, M, n, 7, PRE_PHI_HUT| PRE_FULL_PSI| MALLOC_F_HAT| MALLOC_X| MALLOC_F | FFTW_INIT| FFT_OUT_OF_PLACE, FFTW_ESTIMATE| FFTW_DESTROY_INPUT); /** init pseudo random nodes */ nfft_vrand_shifted_unit_double(p.x,p.d*p.M_total); /** precompute psi, the entries of the matrix B */ if(p.nfft_flags & PRE_ONE_PSI) nfft_precompute_one_psi(&p); /** init pseudo random Fourier coefficients and show them */ nfft_vrand_unit_complex(p.f_hat,p.N_total); t1 = getticks(); t = nfft_elapsed_seconds(t1,t0); nfft_vpr_complex(p.f_hat,K, "given Fourier coefficients, vector f_hat (first few entries)"); printf(" ... initialisation took %e seconds.\n",t); /** direct trafo and show the result */ t0 = getticks(); nfft_trafo_direct(&p); t1 = getticks(); t = nfft_elapsed_seconds(t1,t0); nfft_vpr_complex(p.f,K,"ndft, vector f (first few entries)"); printf(" took %e seconds.\n",t); /** approx. trafo and show the result */ t0 = getticks(); nfft_trafo(&p); t1 = getticks(); t = nfft_elapsed_seconds(t1,t0); nfft_vpr_complex(p.f,K,"nfft, vector f (first few entries)"); printf(" took %e seconds.\n",t); /** direct adjoint and show the result */ t0 = getticks(); nfft_adjoint_direct(&p); t1 = getticks(); t = nfft_elapsed_seconds(t1,t0); nfft_vpr_complex(p.f_hat,K,"adjoint ndft, vector f_hat (first few entries)"); printf(" took %e seconds.\n",t); /** approx. adjoint and show the result */ t0 = getticks(); nfft_adjoint(&p); t1 = getticks(); t = nfft_elapsed_seconds(t1,t0); nfft_vpr_complex(p.f_hat,K,"adjoint nfft, vector f_hat (first few entries)"); printf(" took %e seconds.\n",t); /** finalise the two dimensional plan */ nfft_finalize(&p); }
void bench_openmp(FILE *infile, int m, int psi_flag) { nfft_plan p; int *N; int *n; int M, d, trafo_adjoint; int t, j; double re,im; ticks t0, t1; double tt_total, tt_preonepsi; fscanf(infile, "%d %d", &d, &trafo_adjoint); N = malloc(d*sizeof(int)); n = malloc(d*sizeof(int)); for (t=0; t<d; t++) fscanf(infile, "%d", N+t); for (t=0; t<d; t++) fscanf(infile, "%d", n+t); fscanf(infile, "%d", &M); #ifdef _OPENMP fftw_import_wisdom_from_filename("nfft_benchomp_detail_threads.plan"); #else fftw_import_wisdom_from_filename("nfft_benchomp_detail_single.plan"); #endif /** init an d-dimensional plan */ nfft_init_guru(&p, d, N, M, n, m, PRE_PHI_HUT| psi_flag | MALLOC_X | MALLOC_F_HAT| MALLOC_F| FFTW_INIT | FFT_OUT_OF_PLACE, FFTW_MEASURE| FFTW_DESTROY_INPUT); #ifdef _OPENMP fftw_export_wisdom_to_filename("nfft_benchomp_detail_threads.plan"); #else fftw_export_wisdom_to_filename("nfft_benchomp_detail_single.plan"); #endif for (j=0; j < p.M_total; j++) { for (t=0; t < p.d; t++) fscanf(infile, "%lg", p.x+p.d*j+t); } if (trafo_adjoint==0) { for (j=0; j < p.N_total; j++) { fscanf(infile, "%lg %lg", &re, &im); p.f_hat[j] = re + _Complex_I * im; } } else { for (j=0; j < p.M_total; j++) { fscanf(infile, "%lg %lg", &re, &im); p.f[j] = re + _Complex_I * im; } } t0 = getticks(); /** precompute psi, the entries of the matrix B */ if(p.nfft_flags & PRE_ONE_PSI) nfft_precompute_one_psi(&p); t1 = getticks(); tt_preonepsi = nfft_elapsed_seconds(t1,t0); if (trafo_adjoint==0) nfft_trafo(&p); else nfft_adjoint(&p); t1 = getticks(); tt_total = nfft_elapsed_seconds(t1,t0); #ifndef MEASURE_TIME p.MEASURE_TIME_t[0] = 0.0; p.MEASURE_TIME_t[2] = 0.0; #endif #ifndef MEASURE_TIME_FFTW p.MEASURE_TIME_t[1] = 0.0; #endif printf("%.6e %.6e %6e %.6e %.6e %.6e\n", tt_preonepsi, p.MEASURE_TIME_t[0], p.MEASURE_TIME_t[1], p.MEASURE_TIME_t[2], tt_total-tt_preonepsi-p.MEASURE_TIME_t[0]-p.MEASURE_TIME_t[1]-p.MEASURE_TIME_t[2], tt_total); // printf("%.6e\n", tt); free(N); free(n); /** finalise the one dimensional plan */ nfft_finalize(&p); }