26 #define CSWAP(x,y) {double _Complex * NFFT_SWAP_temp__; \
27 NFFT_SWAP_temp__=(x); (x)=(y); (y)=NFFT_SWAP_temp__;}
29 void simple_test_nnfft_1d(
void)
43 my_plan.
x[j]=((double)rand())/((
double)RAND_MAX)-0.5;
48 my_plan.
v[j]=((double)rand())/((
double)RAND_MAX)-0.5;
64 nnfft_precompute_one_psi(&my_plan);
69 my_plan.
f_hat[k] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
71 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"given Fourier coefficients, vector f_hat");
74 nnfft_trafo_direct(&my_plan);
85 static
void simple_test_adjoint_nnfft_1d(
void)
99 my_plan.
x[j]=((double)rand())/((
double)RAND_MAX)-0.5;
104 my_plan.
v[j]=((double)rand())/((
double)RAND_MAX)-0.5;
123 my_plan.
f[j] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
128 nnfft_adjoint_direct(&my_plan);
129 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nndft, vector f_hat");
133 nfft_vpr_complex(my_plan.f_hat,my_plan.N_total,"adjoint nnfft, vector f_hat");
139 static
void simple_test_nnfft_2d(
void)
154 my_plan.
x[2*j]=((double)rand())/((
double)RAND_MAX)-0.5;
155 my_plan.
x[2*j+1]=((double)rand())/((
double)RAND_MAX)-0.5;
161 my_plan.
v[2*j]=((double)rand())/((
double)RAND_MAX)-0.5;
162 my_plan.
v[2*j+1]=((double)rand())/((
double)RAND_MAX)-0.5;
181 my_plan.
f_hat[k] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
184 "given Fourier coefficients, vector f_hat (first 12 entries)");
187 nnfft_trafo_direct(&my_plan);
198 static
void simple_test_innfft_1d(
void)
212 my_plan.
x[j]=((
double)rand())/((double)RAND_MAX)-0.5;
216 my_plan.
v[k]=((
double)rand())/((
double)RAND_MAX)-0.5;
231 my_iplan.
y[j] = ((
double)rand())/((double)RAND_MAX);
240 "approximate solution, vector f_hat_iter");
243 solver_before_loop_complex(&my_iplan);
247 printf(
"iteration l=%d\n",l);
248 solver_loop_one_step_complex(&my_iplan);
250 "approximate solution, vector f_hat_iter");
258 solver_finalize_complex(&my_iplan);
262 static void measure_time_nnfft_1d(
void)
270 for(my_N=16; my_N<=16384; my_N*=2)
275 my_plan.
x[j]=((
double)rand())/((double)RAND_MAX)-0.5;
278 my_plan.
v[j]=((
double)rand())/((
double)RAND_MAX)-0.5;
290 my_plan.
f_hat[k] = ((
double)rand())/((double)RAND_MAX) + _Complex_I*((double)rand())/((
double)RAND_MAX);
292 t0 = nfft_clock_gettime_seconds();
293 nnfft_trafo_direct(&my_plan);
294 t1 = nfft_clock_gettime_seconds();
296 printf("t_nndft=%e,\t",t);
298 t0 = nfft_clock_gettime_seconds();
300 t1 = nfft_clock_gettime_seconds();
302 printf("t_nnfft=%e\t",t);
304 printf("(N=M=%d)\n",my_N);
313 printf(
"1) computing a one dimensional nndft, nnfft\n\n");
314 simple_test_nnfft_1d();
void nnfft_precompute_psi(nnfft_plan *ths_plan)
fftw_complex * f_hat
Fourier coefficients.
unsigned nnfft_flags
flags for precomputation, malloc
void nnfft_init(nnfft_plan *ths_plan, int d, int N_total, int M_total, int *N)
void nnfft_adjoint(nnfft_plan *ths_plan)
double * v
nodes (in fourier domain)
void nnfft_trafo(nnfft_plan *ths_plan)
user routines
void nnfft_precompute_phi_hut(nnfft_plan *ths_plan)
initialisation of direct transform
void nnfft_precompute_full_psi(nnfft_plan *ths_plan)
computes all entries of B explicitly
void nnfft_precompute_lin_psi(nnfft_plan *ths_plan)
create a lookup table
void nfft_vpr_complex(fftw_complex *x, const NFFT_INT n, const char *text)
Print complex vector to standard output.
NFFT_INT M_total
Total number of samples.
data structure for an NNFFT (nonequispaced in time and frequency fast Fourier transform) plan with do...
double * x
nodes (in time/spatial domain)
fftw_complex * y
right hand side, samples
NFFT_INT N_total
Total number of Fourier coefficients.
Header file for the nfft3 library.
data structure for an inverse NFFT plan with double precision
void nnfft_finalize(nnfft_plan *ths_plan)
#define CSWAP(x, y)
Swap two vectors.
fftw_complex * f_hat_iter
iterative solution