|
00001 #include <math.h> 00002 #include <stdlib.h> 00003 #include "nfft3.h" 00004 #include "util.h" 00005 00006 void accuracy(int d) 00007 { 00008 int m,t; 00009 nnfft_plan my_plan; 00010 double complex *slow; 00011 00012 int N[d],n[d]; 00013 int M_total,N_total; 00014 M_total=10000;N_total=1; 00015 00016 slow=(double complex*)fftw_malloc(M_total*sizeof(double complex)); 00017 00018 for(t=0; t<d; t++) 00019 { 00020 N[t]=(1<<(12/d)); 00021 n[t]=2*N[t]; 00022 N_total*=N[t]; 00023 } 00024 00026 for(m=0; m<10; m++) 00027 { 00028 nnfft_init_guru(&my_plan, d, N_total, M_total, N, n, m, 00029 PRE_PSI| PRE_PHI_HUT| 00030 MALLOC_X| MALLOC_V| MALLOC_F_HAT| MALLOC_F); 00031 00032 00034 nfft_vrand_shifted_unit_double(my_plan.x, d*my_plan.M_total); 00035 nfft_vrand_shifted_unit_double(my_plan.v, d*my_plan.N_total); 00036 00038 if(my_plan.nnfft_flags & PRE_PSI) 00039 nnfft_precompute_psi(&my_plan); 00040 00041 if(my_plan.nnfft_flags & PRE_LIN_PSI) 00042 nnfft_precompute_lin_psi(&my_plan); 00043 00044 if(my_plan.nnfft_flags & PRE_FULL_PSI) 00045 nnfft_precompute_full_psi(&my_plan); 00046 00048 if(my_plan.nnfft_flags & PRE_PHI_HUT) 00049 nnfft_precompute_phi_hut(&my_plan); 00050 00052 nfft_vrand_unit_complex(my_plan.f_hat, my_plan.N_total); 00053 00055 nndft_trafo(&my_plan); 00056 00057 NFFT_SWAP_complex(my_plan.f,slow); 00058 00060 nnfft_trafo(&my_plan); 00061 00062 printf("%e, %e\n", 00063 nfft_error_l_infty_complex(slow, my_plan.f, M_total), 00064 nfft_error_l_infty_1_complex(slow, my_plan.f, M_total, my_plan.f_hat, 00065 my_plan.N_total)); 00066 00068 nnfft_finalize(&my_plan); 00069 } 00070 } 00071 00072 int main() 00073 { 00074 int d; 00075 for(d=1; d<4; d++) 00076 accuracy(d); 00077 00078 return 1; 00079 }