37 static int comp1(
const void *x,
const void *y)
39 return ((* (
double*) x)<(* (
double*) y)?-1:1);
42 static int comp2(
const void *x,
const void *y)
45 nx0=global_n*(* ((
double*)x+0));
46 nx1=global_n*(* ((
double*)x+1));
47 ny0=global_n*(* ((
double*)y+0));
48 ny1=global_n*(* ((
double*)y+1));
62 static int comp3(
const void *x,
const void *y)
64 int nx0,nx1,nx2,ny0,ny1,ny2;
65 nx0=global_n*(* ((
double*)x+0));
66 nx1=global_n*(* ((
double*)x+1));
67 nx2=global_n*(* ((
double*)x+2));
68 ny0=global_n*(* ((
double*)y+0));
69 ny1=global_n*(* ((
double*)y+1));
70 ny2=global_n*(* ((
double*)y+2));
90 void measure_time_nfft(
int d,
int N,
unsigned test_ndft)
92 int r, M, NN[d], nn[d];
93 double t, t_fft, t_ndft, t_nfft;
99 printf(
"\\verb+%d+&\t",(
int)(log(N)/log(2)*d+0.5));
108 nfft_init_guru(&p, d, NN, M, nn, 2,
110 PRE_FULL_PSI| MALLOC_F_HAT| MALLOC_X| MALLOC_F|
111 FFTW_INIT| FFT_OUT_OF_PLACE,
112 FFTW_MEASURE| FFTW_DESTROY_INPUT);
114 p_fft=fftw_plan_dft(d, NN, p.
f_hat, p.
f, FFTW_FORWARD, FFTW_MEASURE);
123 case 1: { qsort(p.
x,p.
M_total,d*
sizeof(
double),comp1);
break; }
124 case 2: { qsort(p.
x,p.
M_total,d*
sizeof(
double),comp2);
break; }
125 case 3: { qsort(p.
x,p.
M_total,d*
sizeof(
double),comp3);
break; }
128 nfft_precompute_one_psi(&p);
142 t = nfft_elapsed_seconds(t1,t0);
148 printf(
"\\verb+%.1e+ &\t",t_fft);
159 nfft_trafo_direct(&p);
161 t = nfft_elapsed_seconds(t1,t0);
166 printf(
"\\verb+%.1e+ &\t",t_ndft);
170 printf(
"\\verb+*+\t&\t");
181 case 1: { nfft_trafo_1d(&p);
break; }
182 case 2: { nfft_trafo_2d(&p);
break; }
183 case 3: { nfft_trafo_3d(&p);
break; }
187 t = nfft_elapsed_seconds(t1,t0);
193 printf(
"\\verb+%.1e+ & \\verb+(%3.1f)+\\\\\n",t_nfft,t_nfft/t_fft);
195 fftw_destroy_plan(p_fft);
199 void measure_time_nfft_XXX2(
int d,
int N,
unsigned test_ndft)
201 int r, M, NN[d], nn[d];
202 double t, t_fft, t_ndft, t_nfft;
208 printf(
"%d\t",(
int)(log(N)/log(2)*d+0.5)); fflush(stdout);
217 nfft_init_guru(&p, d, NN, M, nn, 2,
220 MALLOC_F_HAT| MALLOC_X| MALLOC_F|
221 FFTW_INIT| FFT_OUT_OF_PLACE,
222 FFTW_MEASURE| FFTW_DESTROY_INPUT);
224 p_fft=fftw_plan_dft(d, NN, p.
f_hat, p.
f, FFTW_FORWARD, FFTW_MEASURE);
226 double _Complex *swapndft=(
double _Complex*)
nfft_malloc(p.
M_total*
sizeof(
double _Complex));
231 qsort(p.
x,p.
M_total,d*
sizeof(
double),comp1);
234 nfft_precompute_one_psi(&p);
248 t = nfft_elapsed_seconds(t1,t0);
253 printf(
"%.1e\t",t_fft);
265 nfft_trafo_direct(&p);
267 t = nfft_elapsed_seconds(t1,t0);
271 printf(
"%.1e\t",t_ndft);
286 t = nfft_elapsed_seconds(t1,t0);
290 printf(
"%.1e\t",t_nfft);
292 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f, p.
M_total));
303 t = nfft_elapsed_seconds(t1,t0);
307 printf(
"%.1e\t",t_nfft);
309 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f, p.
M_total));
314 fftw_destroy_plan(p_fft);
318 void measure_time_nfft_XXX3(
int d,
int N,
unsigned test_ndft)
320 int r, M, NN[d], nn[d];
321 double t, t_fft, t_ndft, t_nfft;
327 printf(
"%d\t",(
int)(log(N)/log(2)*d+0.5)); fflush(stdout);
336 nfft_init_guru(&p, d, NN, M, nn, 2,
339 MALLOC_F_HAT| MALLOC_X| MALLOC_F|
340 FFTW_INIT| FFT_OUT_OF_PLACE,
341 FFTW_MEASURE| FFTW_DESTROY_INPUT);
343 p_fft=fftw_plan_dft(d, NN, p.
f, p.
f_hat, FFTW_BACKWARD, FFTW_MEASURE);
345 double _Complex *swapndft=(
double _Complex*)
nfft_malloc(p.
N_total*
sizeof(
double _Complex));
350 qsort(p.
x,p.
M_total,d*
sizeof(
double),comp1);
353 nfft_precompute_one_psi(&p);
367 t = nfft_elapsed_seconds(t1,t0);
372 printf(
"%.1e\t",t_fft);
384 nfft_adjoint_direct(&p);
386 t = nfft_elapsed_seconds(t1,t0);
390 printf(
"%.1e\t",t_ndft);
405 t = nfft_elapsed_seconds(t1,t0);
409 printf(
"%.1e\t",t_nfft);
411 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f_hat, p.
N_total));
422 t = nfft_elapsed_seconds(t1,t0);
426 printf(
"%.1e\t",t_nfft);
428 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f_hat, p.
N_total));
433 fftw_destroy_plan(p_fft);
440 void measure_time_nfft_XXX4(
int d,
int N,
unsigned test_ndft)
442 int r, M, NN[d], nn[d];
443 double t, t_fft, t_ndft, t_nfft;
449 printf(
"%d\t",(
int)(log(N)/log(2)*d+0.5)); fflush(stdout);
458 nfft_init_guru(&p, d, NN, M, nn, 4,
461 MALLOC_F_HAT| MALLOC_X| MALLOC_F|
462 FFTW_INIT| FFT_OUT_OF_PLACE,
463 FFTW_MEASURE| FFTW_DESTROY_INPUT);
465 p_fft=fftw_plan_dft(d, NN, p.
f_hat, p.
f, FFTW_FORWARD, FFTW_MEASURE);
467 double _Complex *swapndft=(
double _Complex*)
nfft_malloc(p.
M_total*
sizeof(
double _Complex));
478 nfft_precompute_one_psi(&p);
492 t = nfft_elapsed_seconds(t1,t0);
497 printf(
"%.1e\t",t_fft);
512 nfft_trafo_direct(&p);
514 t = nfft_elapsed_seconds(t1,t0);
518 printf(
"%.1e\t",t_ndft);
536 t = nfft_elapsed_seconds(t1,t0);
540 printf(
"%.1e\t",t_nfft);
542 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f, p.
M_total));
555 t = nfft_elapsed_seconds(t1,t0);
559 printf(
"%.1e\t",t_nfft);
561 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f, p.
M_total));
568 fftw_destroy_plan(p_fft);
573 void measure_time_nfft_XXX5(
int d,
int N,
unsigned test_ndft)
575 int r, M, NN[d], nn[d];
576 double t, t_fft, t_ndft, t_nfft;
582 printf(
"%d\t",(
int)(log(N)/log(2)*d+0.5)); fflush(stdout);
591 nfft_init_guru(&p, d, NN, M, nn, 4,
594 MALLOC_F_HAT| MALLOC_X| MALLOC_F|
595 FFTW_INIT| FFT_OUT_OF_PLACE,
596 FFTW_MEASURE| FFTW_DESTROY_INPUT);
598 p_fft=fftw_plan_dft(d, NN, p.
f, p.
f_hat, FFTW_FORWARD, FFTW_MEASURE);
600 double _Complex *swapndft=(
double _Complex*)
nfft_malloc(p.
N_total*
sizeof(
double _Complex));
607 nfft_precompute_one_psi(&p);
621 t = nfft_elapsed_seconds(t1,t0);
626 printf(
"%.1e\t",t_fft);
641 nfft_adjoint_direct(&p);
643 t = nfft_elapsed_seconds(t1,t0);
647 printf(
"%.1e\t",t_ndft);
665 t = nfft_elapsed_seconds(t1,t0);
669 printf(
"%.1e\t",t_nfft);
671 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f_hat, p.
N_total));
684 t = nfft_elapsed_seconds(t1,t0);
688 printf(
"%.1e\t",t_nfft);
690 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f_hat, p.
N_total));
697 fftw_destroy_plan(p_fft);
702 void measure_time_nfft_XXX6(
int d,
int N,
unsigned test_ndft)
704 int r, M, NN[d], nn[d];
705 double t, t_fft, t_ndft, t_nfft;
711 printf(
"%d\t",(
int)(log(N)/log(2)*d+0.5)); fflush(stdout);
720 nfft_init_guru(&p, d, NN, M, nn, 2,
723 MALLOC_F_HAT| MALLOC_X| MALLOC_F|
724 FFTW_INIT| FFT_OUT_OF_PLACE,
725 FFTW_MEASURE| FFTW_DESTROY_INPUT);
727 p_fft=fftw_plan_dft(d, NN, p.
f_hat, p.
f, FFTW_FORWARD, FFTW_MEASURE);
729 double _Complex *swapndft=(
double _Complex*)
nfft_malloc(p.
M_total*
sizeof(
double _Complex));
737 nfft_precompute_one_psi(&p);
751 t = nfft_elapsed_seconds(t1,t0);
756 printf(
"%.1e\t",t_fft);
771 nfft_trafo_direct(&p);
773 t = nfft_elapsed_seconds(t1,t0);
777 printf(
"%.1e\t",t_ndft);
795 t = nfft_elapsed_seconds(t1,t0);
799 printf(
"%.1e\t",t_nfft);
801 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f, p.
M_total));
814 t = nfft_elapsed_seconds(t1,t0);
818 printf(
"%.1e\t",t_nfft);
820 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f, p.
M_total));
827 fftw_destroy_plan(p_fft);
832 void measure_time_nfft_XXX7(
int d,
int N,
unsigned test_ndft)
834 int r, M, NN[d], nn[d];
835 double t, t_fft, t_ndft, t_nfft;
841 printf(
"%d\t",(
int)(log(N)/log(2)*d+0.5)); fflush(stdout);
850 nfft_init_guru(&p, d, NN, M, nn, 2,
853 MALLOC_F_HAT| MALLOC_X| MALLOC_F|
854 FFTW_INIT| FFT_OUT_OF_PLACE,
855 FFTW_MEASURE| FFTW_DESTROY_INPUT);
857 p_fft=fftw_plan_dft(d, NN, p.
f, p.
f_hat, FFTW_FORWARD, FFTW_MEASURE);
859 double _Complex *swapndft=(
double _Complex*)
nfft_malloc(p.
N_total*
sizeof(
double _Complex));
866 nfft_precompute_one_psi(&p);
880 t = nfft_elapsed_seconds(t1,t0);
885 printf(
"%.1e\t",t_fft);
900 nfft_adjoint_direct(&p);
902 t = nfft_elapsed_seconds(t1,t0);
906 printf(
"%.1e\t",t_ndft);
924 t = nfft_elapsed_seconds(t1,t0);
928 printf(
"%.1e\t",t_nfft);
930 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f_hat, p.
N_total));
943 t = nfft_elapsed_seconds(t1,t0);
947 printf(
"%.1e\t",t_nfft);
949 printf(
"(%.1e)\t",X(error_l_2_complex)(swapndft, p.
f_hat, p.
N_total));
956 fftw_destroy_plan(p_fft);
970 measure_time_nfft_XXX6(d,(1U<< (logIN/d)),1);
971 measure_time_nfft_XXX7(d,(1U<< (logIN/d)),1);
975 measure_time_nfft_XXX6(d,(1U<< (logIN/d)),0);
976 measure_time_nfft_XXX7(d,(1U<< (logIN/d)),0);
989 measure_time_nfft_XXX4(d,(1U<< (logIN/d)),1);
990 measure_time_nfft_XXX5(d,(1U<< (logIN/d)),1);
994 measure_time_nfft_XXX4(d,(1U<< (logIN/d)),0);
995 measure_time_nfft_XXX5(d,(1U<< (logIN/d)),0);
1006 measure_time_nfft_XXX2(1,(1U<< (logIN)),1);
1007 measure_time_nfft_XXX3(1,(1U<< (logIN)),1);
1011 measure_time_nfft_XXX2(1,(1U<< (logIN)),0);
1012 measure_time_nfft_XXX3(1,(1U<< (logIN)),0);
1023 printf(
"\\hline $l_N$ & FFT & NDFT & NFFT & NFFT/FFT\\\\\n");
1024 printf(
"\\hline \\hline \\multicolumn{5}{|c|}{$d=1$} \\\\ \\hline\n");
1030 measure_time_nfft(d,(1U<< (logIN/d)),1);
1032 measure_time_nfft(d,(1U<< (logIN/d)),0);
1037 printf(
"\\hline $l_N$ & FFT & NDFT & NFFT & NFFT/FFT\\\\\n");
1038 printf(
"\\hline \\hline \\multicolumn{5}{|c|}{$d=2$} \\\\ \\hline\n");
1044 measure_time_nfft(d,(1U<< (logIN/d)),1);
1046 measure_time_nfft(d,(1U<< (logIN/d)),0);
1051 printf(
"\\hline \\hline \\multicolumn{5}{|c|}{$d=3$} \\\\ \\hline\n");
1057 measure_time_nfft(d,(1U<< (logIN/d)),1);
1059 measure_time_nfft(d,(1U<< (logIN/d)),0);