46 #ifdef MEASURE_TIME_FFTW
58 static void flags_cp(NFFT(plan) *dst, NFFT(plan) *src)
61 dst->f_hat = src->f_hat;
65 dst->my_fftw_plan1 = src->my_fftw_plan1;
66 dst->my_fftw_plan2 = src->my_fftw_plan2;
69 static void time_accuracy(
int d,
int N,
int M,
int n,
int m,
unsigned test_ndft,
70 unsigned test_pre_full_psi)
78 NFFT(plan) p_pre_phi_hut;
80 NFFT(plan) p_pre_lin_psi;
81 NFFT(plan) p_pre_fg_psi;
83 NFFT(plan) p_pre_full_psi;
85 printf("%d\t%d\t", d, N);
87 for (r = 0; r < d; r++)
95 swapndft = (C*) NFFT(malloc)((size_t)(M) *
sizeof(C));
97 NFFT(init_guru)(&p, d, NN, M, nn, m,
100 FFTW_MEASURE | FFTW_DESTROY_INPUT);
103 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
105 NFFT(init_guru)(&p_pre_phi_hut, d, NN, M, nn, m,
PRE_PHI_HUT, 0);
106 flags_cp(&p_pre_phi_hut, &p);
107 NFFT(precompute_one_psi)(&p_pre_phi_hut);
111 NFFT(init_guru)(&p_fg_psi, d, NN, M, nn, m,
FG_PSI, 0);
112 flags_cp(&p_fg_psi, &p);
113 NFFT(precompute_one_psi)(&p_fg_psi);
116 NFFT(init_guru)(&p_pre_lin_psi, d, NN, M, nn, m,
PRE_LIN_PSI, 0);
117 flags_cp(&p_pre_lin_psi, &p);
118 NFFT(precompute_one_psi)(&p_pre_lin_psi);
122 NFFT(init_guru)(&p_pre_fg_psi, d, NN, M, nn, m,
PRE_FG_PSI, 0);
123 flags_cp(&p_pre_fg_psi, &p);
124 NFFT(precompute_one_psi)(&p_pre_fg_psi);
127 NFFT(init_guru)(&p_pre_psi, d, NN, M, nn, m,
PRE_PSI, 0);
128 flags_cp(&p_pre_psi, &p);
129 NFFT(precompute_one_psi)(&p_pre_psi);
131 if (test_pre_full_psi)
133 NFFT(init_guru)(&p_pre_full_psi, d, NN, M, nn, m,
PRE_FULL_PSI, 0);
134 flags_cp(&p_pre_full_psi, &p);
135 NFFT(precompute_one_psi)(&p_pre_full_psi);
139 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
144 CSWAP(p.f, swapndft);
148 while (t_ndft < K(0.01))
152 NFFT(trafo_direct)(&p);
154 t = NFFT(elapsed_seconds)(t1, t0);
159 CSWAP(p.f, swapndft);
166 NFFT(trafo)(&p_pre_phi_hut);
168 NFFT(trafo)(&p_fg_psi);
170 p_fg_psi.MEASURE_TIME_t[2] = MKNAN(
"");
171 NFFT(trafo)(&p_pre_lin_psi);
173 NFFT(trafo)(&p_pre_fg_psi);
175 p_pre_fg_psi.MEASURE_TIME_t[2] = MKNAN(
"");
176 NFFT(trafo)(&p_pre_psi);
177 if (test_pre_full_psi)
178 NFFT(trafo)(&p_pre_full_psi);
180 p_pre_full_psi.MEASURE_TIME_t[2] = MKNAN(
"");
183 p.MEASURE_TIME_t[1] = MKNAN(
"");
186 e = NFFT(error_l_2_complex)(swapndft, p.f, p.M_total);
191 "%.2" __FES__
"\t%d\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\t%.2" __FES__
"\n",
192 t_ndft, m, e, p.MEASURE_TIME_t[0], p_pre_phi_hut.MEASURE_TIME_t[0],
193 p.MEASURE_TIME_t[1], p.MEASURE_TIME_t[2], p_fg_psi.MEASURE_TIME_t[2],
194 p_pre_lin_psi.MEASURE_TIME_t[2], p_pre_fg_psi.MEASURE_TIME_t[2],
195 p_pre_psi.MEASURE_TIME_t[2], p_pre_full_psi.MEASURE_TIME_t[2]);
200 if (test_pre_full_psi)
201 NFFT(finalize)(&p_pre_full_psi);
202 NFFT(finalize)(&p_pre_psi);
204 NFFT(finalize)(&p_pre_fg_psi);
205 NFFT(finalize)(&p_pre_lin_psi);
207 NFFT(finalize)(&p_fg_psi);
208 NFFT(finalize)(&p_pre_phi_hut);
212 NFFT(free)(swapndft);
215 static void accuracy_pre_lin_psi(
int d,
int N,
int M,
int n,
int m,
int K)
223 for (r = 0; r < d; r++)
230 swapndft = (C*) NFFT(malloc)((size_t)(M) *
sizeof(C));
232 NFFT(init_guru)(&p, d, NN, M, nn, m,
234 PRE_PHI_HUT | PRE_LIN_PSI |
236 FFTW_MEASURE | FFTW_DESTROY_INPUT);
241 p.psi = (R*) NFFT(malloc)((size_t)((p.K + 1) * p.d) *
sizeof(R));
244 NFFT(precompute_one_psi)(&p);
247 NFFT(vrand_shifted_unit_double)(p.x, p.d * p.M_total);
250 NFFT(vrand_unit_complex)(p.f_hat, p.N_total);
253 CSWAP(p.f, swapndft);
254 NFFT(trafo_direct)(&p);
255 CSWAP(p.f, swapndft);
259 e = NFFT(error_l_2_complex)(swapndft, p.f, p.M_total);
262 printf(
"$%.1" __FES__
"$&\t", e);
268 NFFT(free)(swapndft);
271 int main(
int argc,
char **argv)
277 fprintf(stderr,
"flags type first last trials d m\n");
281 if ((test == 0) && (atoi(argv[1]) < 2))
283 fprintf(stderr,
"MEASURE_TIME in infft.h not set\n");
287 fprintf(stderr,
"Testing different precomputation schemes for the nfft.\n");
288 fprintf(stderr,
"Columns: d, N=M, t_ndft, e_nfft, t_D, t_pre_phi_hut, ");
289 fprintf(stderr,
"t_fftw, t_B, t_fg_psi, t_pre_lin_psi, t_pre_fg_psi, ");
290 fprintf(stderr,
"t_pre_psi, t_pre_full_psi\n\n");
292 int arg2 = atoi(argv[2]);
293 int arg3 = atoi(argv[3]);
294 int arg4 = atoi(argv[4]);
297 if (atoi(argv[1]) == 0)
299 int d = atoi(argv[5]);
300 int m = atoi(argv[6]);
302 for (l = arg2; l <= arg3; l++)
304 int N = (int)(1U << l);
305 int M = (int)(1U << (d * l));
306 for (trial = 0; trial < arg4; trial++)
308 time_accuracy(d, N, M, 2 * N, m, 0, 0);
312 else if (atoi(argv[1]) == 1)
314 int d = atoi(argv[5]);
315 int N = atoi(argv[6]);
318 for (m = arg2; m <= arg3; m++)
320 for (trial = 0; trial < arg4; trial++)
322 time_accuracy(d, N, (
int)(LRINT(POW((R)(N), (R)(d)))), 2 * N, m, 1, 1);
326 else if (atoi(argv[1]) == 2)
328 int d = atoi(argv[5]);
329 int N = atoi(argv[6]);
330 int m = atoi(argv[7]);
332 printf(
"$\\log_2(K/(m+1))$&\t");
334 for (l = arg2; l < arg3; l++)
335 printf(
"$%d$&\t", l);
337 printf(
"$%d$\\\\\n", arg3);
339 printf(
"$\\tilde E_2$&\t");
340 for (l = arg2; l <= arg3; l++)
342 int x = (m + 1) * (
int)(1U << l);
343 accuracy_pre_lin_psi(d, N, (
int)(LRINT(POW((R)(N), (R)(d)))), 2 * N, m, x);
Header file for the nfft3 library.
#define CSWAP(x, y)
Swap two vectors.