NFFT Logo 3.2.3
nnfft/simple_test.c
1 /*
2  * Copyright (c) 2002, 2012 Jens Keiner, Stefan Kunis, Daniel Potts
3  *
4  * This program is free software; you can redistribute it and/or modify it under
5  * the terms of the GNU General Public License as published by the Free Software
6  * Foundation; either version 2 of the License, or (at your option) any later
7  * version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
12  * details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc., 51
16  * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18 
19 /* $Id: simple_test.c 3896 2012-10-10 12:19:26Z tovo $ */
20 #include "config.h"
21 
22 #include <stdlib.h>
23 #include <math.h>
24 #ifdef HAVE_COMPLEX_H
25 #include <complex.h>
26 #endif
27 
28 #include "nfft3util.h"
29 #include "nfft3.h"
30 #include "infft.h"
31 
32 void simple_test_nnfft_1d(void)
33 {
34  int j,k;
35  nnfft_plan my_plan;
37  int N[1];
38  N[0]=12;
39 
41  nnfft_init(&my_plan, 1, 3, 19, N);
42 
44  for(j=0;j<my_plan.M_total;j++)
45  {
46  my_plan.x[j]=((double)rand())/((double)RAND_MAX)-0.5;
47  }
49  for(j=0;j<my_plan.N_total;j++)
50  {
51  my_plan.v[j]=((double)rand())/((double)RAND_MAX)-0.5;
52  }
53 
55  if(my_plan.nnfft_flags & PRE_PSI)
56  nnfft_precompute_psi(&my_plan);
57 
58  if(my_plan.nnfft_flags & PRE_FULL_PSI)
59  nnfft_precompute_full_psi(&my_plan);
60 
61  if(my_plan.nnfft_flags & PRE_LIN_PSI)
62  nnfft_precompute_lin_psi(&my_plan);
63 
65  if(my_plan.nnfft_flags & PRE_PHI_HUT)
66  nnfft_precompute_phi_hut(&my_plan);
67 
69  for(k=0;k<my_plan.N_total;k++)
70  my_plan.f_hat[k] = ((double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((double)RAND_MAX);
71 
72  nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"given Fourier coefficients, vector f_hat");
73 
75  nnfft_trafo_direct(&my_plan);
76  nfft_vpr_complex(my_plan.f,my_plan.M_total,"nndft, vector f");
77 
79  nnfft_trafo(&my_plan);
80  nfft_vpr_complex(my_plan.f,my_plan.M_total,"nnfft, vector f");
81 
83  nnfft_finalize(&my_plan);
84 }
85 
86 static void simple_test_adjoint_nnfft_1d(void)
87 {
88  int j;
89  nnfft_plan my_plan;
91  int N[1];
92  N[0]=12;
93 
95  nnfft_init(&my_plan, 1, 20, 33, N);
96 
98  for(j=0;j<my_plan.M_total;j++)
99  {
100  my_plan.x[j]=((double)rand())/((double)RAND_MAX)-0.5;
101  }
103  for(j=0;j<my_plan.N_total;j++)
104  {
105  my_plan.v[j]=((double)rand())/((double)RAND_MAX)-0.5;
106  }
107 
109  if(my_plan.nnfft_flags & PRE_PSI)
110  nnfft_precompute_psi(&my_plan);
111 
112  if(my_plan.nnfft_flags & PRE_FULL_PSI)
113  nnfft_precompute_full_psi(&my_plan);
114 
115  if(my_plan.nnfft_flags & PRE_LIN_PSI)
116  nnfft_precompute_lin_psi(&my_plan);
117 
119  if(my_plan.nnfft_flags & PRE_PHI_HUT)
120  nnfft_precompute_phi_hut(&my_plan);
121 
123  for(j=0;j<my_plan.M_total;j++)
124  my_plan.f[j] = ((double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((double)RAND_MAX);
125 
126  nfft_vpr_complex(my_plan.f,my_plan.M_total,"given Samples, vector f");
127 
129  nnfft_adjoint_direct(&my_plan);
130  nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nndft, vector f_hat");
131 
133  nnfft_adjoint(&my_plan);
134  nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nnfft, vector f_hat");
135 
137  nnfft_finalize(&my_plan);
138 }
139 
140 static void simple_test_nnfft_2d(void)
141 {
142  int j,k;
143  nnfft_plan my_plan;
145  int N[2];
146  N[0]=12;
147  N[1]=14;
148 
150  nnfft_init(&my_plan, 2,12*14,19, N);
151 
153  for(j=0;j<my_plan.M_total;j++)
154  {
155  my_plan.x[2*j]=((double)rand())/((double)RAND_MAX)-0.5;
156  my_plan.x[2*j+1]=((double)rand())/((double)RAND_MAX)-0.5;
157  }
158 
160  for(j=0;j<my_plan.N_total;j++)
161  {
162  my_plan.v[2*j]=((double)rand())/((double)RAND_MAX)-0.5;
163  my_plan.v[2*j+1]=((double)rand())/((double)RAND_MAX)-0.5;
164  }
165 
167  if(my_plan.nnfft_flags & PRE_PSI)
168  nnfft_precompute_psi(&my_plan);
169 
170  if(my_plan.nnfft_flags & PRE_FULL_PSI)
171  nnfft_precompute_full_psi(&my_plan);
172 
173  if(my_plan.nnfft_flags & PRE_LIN_PSI)
174  nnfft_precompute_lin_psi(&my_plan);
175 
177  if(my_plan.nnfft_flags & PRE_PHI_HUT)
178  nnfft_precompute_phi_hut(&my_plan);
179 
181  for(k=0;k<my_plan.N_total;k++)
182  my_plan.f_hat[k] = ((double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((double)RAND_MAX);
183 
184  nfft_vpr_complex(my_plan.f_hat,12,
185  "given Fourier coefficients, vector f_hat (first 12 entries)");
186 
188  nnfft_trafo_direct(&my_plan);
189  nfft_vpr_complex(my_plan.f,my_plan.M_total,"ndft, vector f");
190 
192  nnfft_trafo(&my_plan);
193  nfft_vpr_complex(my_plan.f,my_plan.M_total,"nfft, vector f");
194 
196  nnfft_finalize(&my_plan);
197 }
198 
199 static void simple_test_innfft_1d(void)
200 {
201  int j,k,l,N=8;
202  nnfft_plan my_plan;
203  solver_plan_complex my_iplan;
206  nnfft_init(&my_plan,1 ,8 ,8 ,&N);
207 
209  solver_init_advanced_complex(&my_iplan,(nfft_mv_plan_complex*)(&my_plan),CGNR);
210 
212  for(j=0;j<my_plan.M_total;j++)
213  my_plan.x[j]=((double)rand())/((double)RAND_MAX)-0.5;
214 
216  for(k=0;k<my_plan.N_total;k++)
217  my_plan.v[k]=((double)rand())/((double)RAND_MAX)-0.5;
218 
220  if(my_plan.nnfft_flags & PRE_PSI)
221  nnfft_precompute_psi(&my_plan);
222 
223  if(my_plan.nnfft_flags & PRE_FULL_PSI)
224  nnfft_precompute_full_psi(&my_plan);
225 
227  if(my_plan.nnfft_flags & PRE_PHI_HUT)
228  nnfft_precompute_phi_hut(&my_plan);
229 
231  for(j=0;j<my_plan.M_total;j++)
232  my_iplan.y[j] = ((double)rand())/((double)RAND_MAX);
233 
234  nfft_vpr_complex(my_iplan.y,my_plan.M_total,"given data, vector given_f");
235 
237  for(k=0;k<my_plan.N_total;k++)
238  my_iplan.f_hat_iter[k] = 0.0;
239 
240  nfft_vpr_complex(my_iplan.f_hat_iter,my_plan.N_total,
241  "approximate solution, vector f_hat_iter");
242 
244  solver_before_loop_complex(&my_iplan);
245 
246  for(l=0;l<8;l++)
247  {
248  printf("iteration l=%d\n",l);
249  solver_loop_one_step_complex(&my_iplan);
250  nfft_vpr_complex(my_iplan.f_hat_iter,my_plan.N_total,
251  "approximate solution, vector f_hat_iter");
252 
253  NFFT_SWAP_complex(my_iplan.f_hat_iter,my_plan.f_hat);
254  nnfft_trafo(&my_plan);
255  nfft_vpr_complex(my_plan.f,my_plan.M_total,"fitting the data, vector f");
256  NFFT_SWAP_complex(my_iplan.f_hat_iter,my_plan.f_hat);
257  }
258 
259  solver_finalize_complex(&my_iplan);
260  nnfft_finalize(&my_plan);
261 }
262 
263 static void measure_time_nnfft_1d(void)
264 {
265  int j,k;
266  nnfft_plan my_plan;
267  int my_N,N=4;
268  double t;
269  ticks t0, t1;
270 
271  for(my_N=16; my_N<=16384; my_N*=2)
272  {
273  nnfft_init(&my_plan,1,my_N,my_N,&N);
274 
275  for(j=0;j<my_plan.M_total;j++)
276  my_plan.x[j]=((double)rand())/((double)RAND_MAX)-0.5;
277 
278  for(j=0;j<my_plan.N_total;j++)
279  my_plan.v[j]=((double)rand())/((double)RAND_MAX)-0.5;
280 
281  if(my_plan.nnfft_flags & PRE_PSI)
282  nnfft_precompute_psi(&my_plan);
283 
284  if(my_plan.nnfft_flags & PRE_FULL_PSI)
285  nnfft_precompute_full_psi(&my_plan);
286 
287  if(my_plan.nnfft_flags & PRE_PHI_HUT)
288  nnfft_precompute_phi_hut(&my_plan);
289 
290  for(k=0;k<my_plan.N_total;k++)
291  my_plan.f_hat[k] = ((double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((double)RAND_MAX);
292 
293  t0 = getticks();
294  nnfft_trafo_direct(&my_plan);
295  t1 = getticks();
296  t = nfft_elapsed_seconds(t1,t0);
297  printf("t_nndft=%e,\t",t);
298 
299  t0 = getticks();
300  nnfft_trafo(&my_plan);
301  t1 = getticks();
302  t = nfft_elapsed_seconds(t1,t0);
303  printf("t_nnfft=%e\t",t);
304 
305  printf("(N=M=%d)\n",my_N);
306 
307  nnfft_finalize(&my_plan);
308  }
309 }
310 
311 int main(void)
312 {
313  system("clear");
314  printf("1) computing a one dimensional nndft, nnfft\n\n");
315  simple_test_nnfft_1d();
316 
317  getc(stdin);
318 
319  system("clear");
320  printf("1a) computing a one dimensional adjoint nndft, nnfft\n\n");
321  simple_test_adjoint_nnfft_1d();
322 
323  getc(stdin);
324 
325  system("clear");
326  printf("2) computing a two dimensional nndft, nnfft\n\n");
327  simple_test_nnfft_2d();
328 
329  getc(stdin);
330 
331  system("clear");
332  printf("3) computing a one dimensional innfft\n\n");
333  simple_test_innfft_1d();
334 
335  getc(stdin);
336 
337  system("clear");
338  printf("4) computing times for one dimensional nnfft\n\n");
339  measure_time_nnfft_1d();
340 
341  return 1;
342 }

Generated on Tue Apr 30 2013 by Doxygen 1.8.1