00001 #include <stdio.h>
00002 #include <math.h>
00003 #include <string.h>
00004 #include <stdlib.h>
00005 #include "util.h"
00006 #include "nfft3.h"
00007
00008 void simple_test_nfft_1d()
00009 {
00010 int j,k;
00011 nfft_plan my_plan;
00013 int N[1],n[1];
00014 N[0]=14; n[0]=32;
00015
00017 nfft_init_guru(&my_plan, 1, N, 19, n, 6,
00018 PRE_PHI_HUT| PRE_LIN_PSI| MALLOC_X| MALLOC_F_HAT| MALLOC_F|
00019 FFTW_INIT| FFT_OUT_OF_PLACE,
00020 FFTW_ESTIMATE| FFTW_DESTROY_INPUT);
00021
00023 for(j=0;j<my_plan.M_total;j++)
00024 {
00025 my_plan.x[j]=((double)rand())/RAND_MAX-0.5;
00026 }
00027
00029 if(my_plan.nfft_flags & PRE_ONE_PSI)
00030 nfft_precompute_one_psi(&my_plan);
00031
00033 for(k=0;k<my_plan.N_total;k++)
00034 my_plan.f_hat[k] = ((double)rand())/RAND_MAX + I* ((double)rand())/RAND_MAX;
00035
00036 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"given Fourier coefficients, vector f_hat");
00037
00039 ndft_trafo(&my_plan);
00040 nfft_vpr_complex(my_plan.f,my_plan.M_total,"ndft, vector f");
00041
00043 nfft_trafo(&my_plan);
00044 nfft_vpr_complex(my_plan.f,my_plan.M_total,"nfft, vector f");
00045
00047 ndft_adjoint(&my_plan);
00048 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint ndft, vector f_hat");
00049
00051 nfft_adjoint(&my_plan);
00052 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nfft, vector f_hat");
00053
00055 nfft_finalize(&my_plan);
00056 }
00057
00058 void simple_test_nfft_2d()
00059 {
00060 int j,k;
00061 nfft_plan my_plan;
00063 int N[2],n[2];
00064 N[0]=10; n[0]=32;
00065 N[1]=10; n[1]=64;
00066
00068
00069 nfft_init_guru(&my_plan, 2, N, 19, n, 4,
00070 PRE_PHI_HUT| PRE_LIN_PSI| MALLOC_X| MALLOC_F_HAT| MALLOC_F|
00071 FFTW_INIT, FFTW_ESTIMATE| FFTW_DESTROY_INPUT);
00072
00074 for(j=0;j<my_plan.M_total;j++)
00075 {
00076 my_plan.x[2*j]=((double)rand())/RAND_MAX-0.5;
00077 my_plan.x[2*j+1]=((double)rand())/RAND_MAX-0.5;
00078 }
00079
00081 if(my_plan.nfft_flags & PRE_ONE_PSI)
00082 nfft_precompute_one_psi(&my_plan);
00083
00085 for(k=0;k<my_plan.N_total;k++)
00086 my_plan.f_hat[k] = ((double)rand())/RAND_MAX + I* ((double)rand())/RAND_MAX;
00087
00088 nfft_vpr_complex(my_plan.f_hat,12,
00089 "given Fourier coefficients, vector f_hat (first 12 entries)");
00090
00092 ndft_trafo(&my_plan);
00093 nfft_vpr_complex(my_plan.f,my_plan.M_total,"ndft, vector f");
00094
00096 nfft_trafo(&my_plan);
00097 nfft_vpr_complex(my_plan.f,my_plan.M_total,"nfft, vector f");
00098
00100 ndft_adjoint(&my_plan);
00101 nfft_vpr_complex(my_plan.f_hat,12,"adjoint ndft, vector f_hat (first 12 entries)");
00102
00104 nfft_adjoint(&my_plan);
00105 nfft_vpr_complex(my_plan.f_hat,12,"adjoint nfft, vector f_hat (first 12 entries)");
00106
00108 nfft_finalize(&my_plan);
00109 }
00110
00111 void simple_test_nfft_2d_huge()
00112 {
00113 int j,k;
00114 nfft_plan my_plan;
00116 int N[2],n[2];
00117 N[0]=2050; n[0]=4096;
00118 N[1]=2050; n[1]=4096;
00119
00122 nfft_init_guru(&my_plan, 2, N, 10, n,
00123 6, PRE_PHI_HUT| PRE_PSI| MALLOC_F_HAT| MALLOC_X| MALLOC_F |
00124 FFTW_INIT| FFT_OUT_OF_PLACE,
00125 FFTW_ESTIMATE| FFTW_DESTROY_INPUT);
00126
00128 for(j=0;j<my_plan.M_total;j++)
00129 {
00130 my_plan.x[2*j]=((double)rand())/RAND_MAX-0.5;
00131 my_plan.x[2*j+1]=((double)rand())/RAND_MAX-0.5;
00132 }
00133
00135 if(my_plan.nfft_flags & PRE_ONE_PSI)
00136 nfft_precompute_one_psi(&my_plan);
00137
00139 for(k=0;k<my_plan.N_total;k++)
00140 my_plan.f_hat[k] = ((double)rand())/RAND_MAX + I* ((double)rand())/RAND_MAX;
00141
00142 nfft_vpr_complex(my_plan.f_hat,12,
00143 "given Fourier coefficients, vector f_hat (first 12 entries)");
00144
00146 ndft_trafo(&my_plan);
00147 nfft_vpr_complex(my_plan.f,my_plan.M_total,"ndft, vector f");
00148
00150 nfft_trafo(&my_plan);
00151 nfft_vpr_complex(my_plan.f,my_plan.M_total,"nfft, vector f");
00152
00154 ndft_adjoint(&my_plan);
00155 nfft_vpr_complex(my_plan.f_hat,12,"adjoint ndft, vector f_hat (first 12 entries)");
00156
00158 nfft_adjoint(&my_plan);
00159 nfft_vpr_complex(my_plan.f_hat,12,"adjoint nfft, vector f_hat (first 12 entries)");
00160
00162 nfft_finalize(&my_plan);
00163 }
00164
00165
00166
00167 void measure_time_nfft_1d()
00168 {
00169 int j,k;
00170 nfft_plan my_plan;
00171 int my_N;
00172 double t;
00173
00174 for(my_N=16; my_N<=1024*1024; my_N*=2)
00175 {
00176 nfft_init_1d(&my_plan,my_N,my_N);
00177
00178 for(j=0;j<my_plan.M_total;j++)
00179 my_plan.x[j]=((double)rand())/RAND_MAX-0.5;
00180
00181 if(my_plan.nfft_flags & PRE_ONE_PSI)
00182 nfft_precompute_one_psi(&my_plan);
00183
00184 for(k=0;k<my_plan.N_total;k++)
00185 my_plan.f_hat[k]=((double)rand())/RAND_MAX + I*((double)rand())/RAND_MAX;
00186
00187 if(my_N<=8192)
00188 {
00189 t=nfft_second();
00190 ndft_trafo(&my_plan);
00191 t=nfft_second()-t;
00192 printf("t_ndft=%e,\t",t);
00193 }
00194 else
00195 printf("t_ndft=nan\t");
00196
00197 t=nfft_second();
00198 nfft_trafo(&my_plan);
00199 t=nfft_second()-t;
00200 printf("t_nfft=%e\t",t);
00201
00202 printf("(N=M_total=%d)\n",my_N);
00203
00204 nfft_finalize(&my_plan);
00205 }
00206 }
00207
00208 void simple_test_infft_1d()
00209 {
00210 int j,k,l;
00211 nfft_plan my_plan;
00212 infft_plan my_iplan;
00215 nfft_init_1d(&my_plan, 8, 4);
00216
00218 infft_init(&my_iplan,&my_plan);
00219
00221 nfft_vrand_shifted_unit_double(my_plan.x,my_plan.M_total);
00222
00224 if(my_plan.nfft_flags & PRE_ONE_PSI)
00225 nfft_precompute_one_psi(&my_plan);
00226
00228 nfft_vrand_unit_complex(my_iplan.y,my_plan.M_total);
00229
00230 nfft_vpr_complex(my_iplan.y,my_plan.M_total,"given data, vector y");
00231
00233 for(k=0;k<my_plan.N_total;k++)
00234 my_iplan.f_hat_iter[k]=0;
00235
00236 nfft_vpr_complex(my_iplan.f_hat_iter,my_plan.N_total,
00237 "approximate solution, vector f_hat_iter");
00238
00240 infft_before_loop(&my_iplan);
00241 for(l=0;l<3;l++)
00242 {
00243 printf("iteration l=%d\n",l);
00244 infft_loop_one_step(&my_iplan);
00245 nfft_vpr_complex(my_iplan.f_hat_iter,my_plan.N_total,
00246 "approximate solution, vector f_hat_iter");
00247
00248 NFFT_SWAP_complex(my_iplan.f_hat_iter,my_plan.f_hat);
00249 nfft_trafo(&my_plan);
00250 nfft_vpr_complex(my_plan.f,my_plan.M_total,"fitting the data, vector f");
00251 NFFT_SWAP_complex(my_iplan.f_hat_iter,my_plan.f_hat);
00252 }
00253
00254 infft_finalize(&my_iplan);
00255 nfft_finalize(&my_plan);
00256 }
00257
00258 int main()
00259 {
00260 int l,m;
00261
00262 printf("%d, %d\n",sizeof(int), sizeof(double));
00263 exit(-1);
00264
00265 system("clear");
00266 printf("1) computing an one dimensional ndft, nfft and an adjoint nfft\n\n");
00267 simple_test_nfft_1d();
00268
00269 getc(stdin);
00270
00271 system("clear");
00272 printf("2) computing a two dimensional ndft, nfft and an adjoint nfft\n\n");
00273 simple_test_nfft_2d();
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 return 1;
00288 }