30 #define NFFT_CONCAT(prefix, name) prefix ## name
38 #if defined(NFFT_DLL) && (defined(_WIN32) || defined(__WIN32__))
40 # if defined(COMPILING_NFFT)
41 # define NFFT_EXTERN extern __declspec(dllexport)
43 # define NFFT_EXTERN extern __declspec(dllimport)
46 # define NFFT_EXTERN extern
51 typedef ptrdiff_t NFFT_INT;
54 #define MACRO_MV_PLAN(RC) \
59 void (*mv_trafo)(void*); \
60 void (*mv_adjoint)(void*);
65 #define NFFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfft_, name)
66 #define NFFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfftf_, name)
67 #define NFFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfftl_, name)
69 #define NFFT_DEFINE_MALLOC_API(X) \
71 NFFT_EXTERN void *X(malloc)(size_t n); \
72 NFFT_EXTERN void X(free)(void *p); \
73 NFFT_EXTERN void X(die)(const char *s); \
77 typedef void *(*X(malloc_type_function)) (size_t n); \
78 typedef void (*X(free_type_function)) (void *p); \
79 typedef void (*X(die_type_function)) (const char *errString); \
80 NFFT_EXTERN X(malloc_type_function) X(malloc_hook); \
81 NFFT_EXTERN X(free_type_function) X(free_hook); \
82 NFFT_EXTERN X(die_type_function) X(die_hook);
85 NFFT_DEFINE_MALLOC_API(NFFT_MANGLE_FLOAT)
86 NFFT_DEFINE_MALLOC_API(NFFT_MANGLE_DOUBLE)
87 NFFT_DEFINE_MALLOC_API(NFFT_MANGLE_LONG_DOUBLE)
96 #define NFFT_DEFINE_API(X,Y,R,C) \
101 } X(mv_plan_complex); \
106 } X(mv_plan_double); \
134 unsigned fftw_flags; \
139 R MEASURE_TIME_t[3]; \
143 Y(plan) my_fftw_plan1; \
144 Y(plan) my_fftw_plan2; \
150 NFFT_INT *psi_index_g; \
151 NFFT_INT *psi_index_f; \
163 NFFT_EXTERN void X(trafo_direct)(const X(plan) *ths);\
164 NFFT_EXTERN void X(adjoint_direct)(const X(plan) *ths);\
165 NFFT_EXTERN void X(trafo)(X(plan) *ths);\
166 NFFT_EXTERN void X(trafo_1d)(X(plan) *ths);\
167 NFFT_EXTERN void X(trafo_2d)(X(plan) *ths);\
168 NFFT_EXTERN void X(trafo_3d)(X(plan) *ths);\
169 NFFT_EXTERN void X(adjoint)(X(plan) *ths);\
170 NFFT_EXTERN void X(adjoint_1d)(X(plan) *ths);\
171 NFFT_EXTERN void X(adjoint_2d)(X(plan) *ths);\
172 NFFT_EXTERN void X(adjoint_3d)(X(plan) *ths);\
173 NFFT_EXTERN void X(init_1d)(X(plan) *ths, int N1, int M);\
174 NFFT_EXTERN void X(init_2d)(X(plan) *ths, int N1, int N2, int M);\
175 NFFT_EXTERN void X(init_3d)(X(plan) *ths, int N1, int N2, int N3, int M);\
176 NFFT_EXTERN void X(init)(X(plan) *ths, int d, int *N, int M);\
177 NFFT_EXTERN void X(init_guru)(X(plan) *ths, int d, int *N, int M, int *n, \
178 int m, unsigned flags, unsigned fftw_flags);\
179 NFFT_EXTERN void X(init_lin)(X(plan) *ths, int d, int *N, int M, int *n, \
180 int m, int K, unsigned flags, unsigned fftw_flags); \
181 NFFT_EXTERN void X(precompute_one_psi)(X(plan) *ths);\
182 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths);\
183 NFFT_EXTERN void X(precompute_full_psi)(X(plan) *ths);\
184 NFFT_EXTERN void X(precompute_fg_psi)(X(plan) *ths); \
185 NFFT_EXTERN void X(precompute_lin_psi)(X(plan) *ths);\
186 NFFT_EXTERN const char* X(check)(X(plan) *ths);\
187 NFFT_EXTERN void X(finalize)(X(plan) *ths);
190 NFFT_DEFINE_API(NFFT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
191 NFFT_DEFINE_API(NFFT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
192 NFFT_DEFINE_API(NFFT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
195 #define PRE_PHI_HUT (1U<<0)
196 #define FG_PSI (1U<<1)
197 #define PRE_LIN_PSI (1U<<2)
198 #define PRE_FG_PSI (1U<<3)
199 #define PRE_PSI (1U<<4)
200 #define PRE_FULL_PSI (1U<<5)
201 #define MALLOC_X (1U<<6)
202 #define MALLOC_F_HAT (1U<<7)
203 #define MALLOC_F (1U<<8)
204 #define FFT_OUT_OF_PLACE (1U<<9)
205 #define FFTW_INIT (1U<<10)
206 #define NFFT_SORT_NODES (1U<<11)
207 #define NFFT_OMP_BLOCKWISE_ADJOINT (1U<<12)
208 #define PRE_ONE_PSI (PRE_LIN_PSI| PRE_FG_PSI| PRE_PSI| PRE_FULL_PSI)
213 #define NFCT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfct_, name)
214 #define NFCT_MANGLE_FLOAT(name) NFFT_CONCAT(nfctf_, name)
215 #define NFCT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfctl_, name)
224 #define NFCT_DEFINE_API(X,Y,R,C) \
243 unsigned fftw_flags; \
247 double MEASURE_TIME_t[3]; \
250 Y(plan) my_fftw_r2r_plan; \
251 Y(r2r_kind) *r2r_kind; \
256 NFFT_INT *psi_index_g; \
257 NFFT_INT *psi_index_f; \
267 NFFT_EXTERN void X(init_1d)(X(plan) *ths_plan, int N0, int M_total); \
268 NFFT_EXTERN void X(init_2d)(X(plan) *ths_plan, int N0, int N1, int M_total); \
269 NFFT_EXTERN void X(init_3d)(X(plan) *ths_plan, int N0, int N1, int N2, int M_total); \
270 NFFT_EXTERN void X(init)(X(plan) *ths_plan, int d, int *N, int M_total); \
271 NFFT_EXTERN void X(init_guru)(X(plan) *ths_plan, int d, int *N, int M_total, int *n, \
272 int m, unsigned flags, unsigned fftw_flags); \
273 NFFT_EXTERN void X(precompute_one_psi)(X(plan) *ths);\
274 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths);\
275 NFFT_EXTERN void X(precompute_full_psi)(X(plan) *ths);\
276 NFFT_EXTERN void X(precompute_fg_psi)(X(plan) *ths); \
277 NFFT_EXTERN void X(precompute_lin_psi)(X(plan) *ths);\
278 NFFT_EXTERN void X(trafo)(X(plan) *ths_plan); \
279 NFFT_EXTERN void X(trafo_direct)(const X(plan) *ths_plan); \
280 NFFT_EXTERN void X(adjoint)(X(plan) *ths_plan); \
281 NFFT_EXTERN void X(adjoint_direct)(const X(plan) *ths_plan); \
282 NFFT_EXTERN const char* X(check)(X(plan) *ths);\
283 NFFT_EXTERN void X(finalize)(X(plan) *ths_plan); \
286 NFCT_DEFINE_API(NFCT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
287 NFCT_DEFINE_API(NFCT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
288 NFCT_DEFINE_API(NFCT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
293 #define NFST_MANGLE_DOUBLE(name) NFFT_CONCAT(nfst_, name)
294 #define NFST_MANGLE_FLOAT(name) NFFT_CONCAT(nfstf_, name)
295 #define NFST_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfstl_, name)
304 #define NFST_DEFINE_API(X,Y,R,C) \
323 unsigned fftw_flags; \
327 double MEASURE_TIME_t[3]; \
330 Y(plan) my_fftw_r2r_plan; \
331 Y(r2r_kind) *r2r_kind; \
336 NFFT_INT *psi_index_g; \
337 NFFT_INT *psi_index_f; \
349 NFFT_EXTERN void X(init_1d)(X(plan) *ths_plan, int N0, int M_total); \
350 NFFT_EXTERN void X(init_2d)(X(plan) *ths_plan, int N0, int N1, int M_total); \
351 NFFT_EXTERN void X(init_3d)(X(plan) *ths_plan, int N0, int N1, int N2, int M_total); \
352 NFFT_EXTERN void X(init)(X(plan) *ths_plan, int d, int *N, int M_total); \
353 NFFT_EXTERN void X(init_guru)(X(plan) *ths_plan, int d, int *N, int M_total, int *n, \
354 int m, unsigned flags, unsigned fftw_flags); \
355 NFFT_EXTERN void X(precompute_one_psi)(X(plan) *ths);\
356 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths);\
357 NFFT_EXTERN void X(precompute_full_psi)(X(plan) *ths);\
358 NFFT_EXTERN void X(precompute_fg_psi)(X(plan) *ths); \
359 NFFT_EXTERN void X(precompute_lin_psi)(X(plan) *ths);\
360 NFFT_EXTERN void X(trafo)(X(plan) *ths_plan); \
361 NFFT_EXTERN void X(trafo_direct)(const X(plan) *ths_plan); \
362 NFFT_EXTERN void X(adjoint)(X(plan) *ths_plan); \
363 NFFT_EXTERN void X(adjoint_direct)(const X(plan) *ths_plan); \
364 NFFT_EXTERN const char* X(check)(X(plan) *ths);\
365 NFFT_EXTERN void X(finalize)(X(plan) *ths_plan); \
368 NFST_DEFINE_API(NFST_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
369 NFST_DEFINE_API(NFST_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
370 NFST_DEFINE_API(NFST_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
375 #define NNFFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nnfft_, name)
376 #define NNFFT_MANGLE_FLOAT(name) NFFT_CONCAT(nnfftf_, name)
377 #define NNFFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nnfftl_, name)
387 #define NNFFT_DEFINE_API(X,Y,Z,R,C) \
404 Z(plan) *direct_plan; \
405 unsigned nnfft_flags; \
418 NFFT_EXTERN void X(init)(X(plan) *ths_plan, int d, int N_total, int M_total, int *N); \
419 NFFT_EXTERN void X(init_1d)(X(plan) *ths_plan, int N, int M_total); \
420 NFFT_EXTERN void X(init_guru)(X(plan) *ths_plan, int d, int N_total, int M_total, \
421 int *N, int *N1, int m, unsigned nnfft_flags); \
422 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths_plan); \
423 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths_plan); \
424 NFFT_EXTERN void X(trafo)(X(plan) *ths_plan); \
425 NFFT_EXTERN void X(adjoint)(X(plan) *ths_plan); \
426 NFFT_EXTERN void X(precompute_lin_psi)(X(plan) *ths_plan); \
427 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths_plan); \
428 NFFT_EXTERN void X(precompute_full_psi)(X(plan) *ths_plan); \
429 NFFT_EXTERN void X(precompute_phi_hut)(X(plan) *ths_plan); \
430 NFFT_EXTERN void X(precompute_one_psi)(X(plan) *ths);\
431 NFFT_EXTERN void X(finalize)(X(plan) *ths_plan);
434 NNFFT_DEFINE_API(NNFFT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
435 NNFFT_DEFINE_API(NNFFT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
436 NNFFT_DEFINE_API(NNFFT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
439 #define MALLOC_V (1U<< 11)
443 #define NSFFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nsfft_, name)
444 #define NSFFT_MANGLE_FLOAT(name) NFFT_CONCAT(nsfftf_, name)
445 #define NSFFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nsfftl_, name)
455 #define NSFFT_DEFINE_API(X,Y,Z,R,C) \
467 int *index_sparse_to_full; \
468 int r_act_nfft_plan; \
469 Z(plan) *act_nfft_plan; \
470 Z(plan) *center_nfft_plan; \
471 Y(plan) *set_fftw_plan1; \
472 Y(plan) *set_fftw_plan2; \
473 Z(plan) *set_nfft_plan_1d; \
474 Z(plan) *set_nfft_plan_2d; \
476 R *x_102,*x_201,*x_120,*x_021; \
479 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths); \
480 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths); \
481 NFFT_EXTERN void X(trafo)(X(plan) *ths); \
482 NFFT_EXTERN void X(adjoint)(X(plan) *ths); \
483 NFFT_EXTERN void X(cp)(X(plan) *ths, Z(plan) *ths_nfft); \
484 NFFT_EXTERN void X(init_random_nodes_coeffs)(X(plan) *ths); \
485 NFFT_EXTERN void X(init)(X(plan) *ths, int d, int J, int M, int m, unsigned flags); \
486 NFFT_EXTERN void X(finalize)(X(plan) *ths);
489 NSFFT_DEFINE_API(NSFFT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
490 NSFFT_DEFINE_API(NSFFT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
491 NSFFT_DEFINE_API(NSFFT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
494 #define NSDFT (1U<< 12)
499 #define MRI_MANGLE_DOUBLE(name) NFFT_CONCAT(mri_, name)
500 #define MRI_MANGLE_FLOAT(name) NFFT_CONCAT(mrif_, name)
501 #define MRI_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(mril_, name)
510 #define MRI_DEFINE_API(X,Z,R,C) \
531 void X(inh_2d1d_trafo)(X(inh_2d1d_plan) *ths); \
532 void X(inh_2d1d_adjoint)(X(inh_2d1d_plan) *ths); \
533 void X(inh_2d1d_init_guru)(X(inh_2d1d_plan) *ths, int *N, int M, int *n, \
534 int m, R sigma, unsigned nfft_flags, unsigned fftw_flags); \
535 void X(inh_2d1d_finalize)(X(inh_2d1d_plan) *ths); \
536 void X(inh_3d_trafo)(X(inh_3d_plan) *ths); \
537 void X(inh_3d_adjoint)(X(inh_3d_plan) *ths); \
538 void X(inh_3d_init_guru)(X(inh_3d_plan) *ths, int *N, int M, int *n, \
539 int m, R sigma, unsigned nfft_flags, unsigned fftw_flags); \
540 void X(inh_3d_finalize)(X(inh_3d_plan) *ths);
543 MRI_DEFINE_API(MRI_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
544 MRI_DEFINE_API(MRI_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
545 MRI_DEFINE_API(MRI_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
550 #define NFSFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfsft_, name)
551 #define NFSFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfsftf_, name)
552 #define NFSFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfsftl_, name)
561 #define NFSFT_DEFINE_API(X,Z,R,C) \
572 unsigned int flags; \
576 double MEASURE_TIME_t[3]; \
580 NFFT_EXTERN void X(init)(X(plan) *plan, int N, int M); \
581 NFFT_EXTERN void X(init_advanced)(X(plan)* plan, int N, int M, unsigned int \
583 NFFT_EXTERN void X(init_guru)(X(plan) *plan, int N, int M, \
584 unsigned int nfsft_flags, unsigned int nfft_flags, int nfft_cutoff); \
585 NFFT_EXTERN void X(precompute)(int N, R kappa, unsigned int nfsft_flags, \
586 unsigned int fpt_flags); \
587 NFFT_EXTERN void X(forget)(void); \
588 NFFT_EXTERN void X(trafo_direct)(X(plan)* plan); \
589 NFFT_EXTERN void X(adjoint_direct)(X(plan)* plan); \
590 NFFT_EXTERN void X(trafo)(X(plan)* plan); \
591 NFFT_EXTERN void X(adjoint)(X(plan)* plan); \
592 NFFT_EXTERN void X(finalize)(X(plan) *plan); \
593 NFFT_EXTERN void X(precompute_x)(X(plan) *plan);
596 NFSFT_DEFINE_API(NFSFT_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
597 NFSFT_DEFINE_API(NFSFT_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
598 NFSFT_DEFINE_API(NFSFT_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
601 #define NFSFT_NORMALIZED (1U << 0)
602 #define NFSFT_USE_NDFT (1U << 1)
603 #define NFSFT_USE_DPT (1U << 2)
604 #define NFSFT_MALLOC_X (1U << 3)
605 #define NFSFT_MALLOC_F_HAT (1U << 5)
606 #define NFSFT_MALLOC_F (1U << 6)
607 #define NFSFT_PRESERVE_F_HAT (1U << 7)
608 #define NFSFT_PRESERVE_X (1U << 8)
609 #define NFSFT_PRESERVE_F (1U << 9)
610 #define NFSFT_DESTROY_F_HAT (1U << 10)
611 #define NFSFT_DESTROY_X (1U << 11)
612 #define NFSFT_DESTROY_F (1U << 12)
615 #define NFSFT_NO_DIRECT_ALGORITHM (1U << 13)
616 #define NFSFT_NO_FAST_ALGORITHM (1U << 14)
617 #define NFSFT_ZERO_F_HAT (1U << 16)
620 #define NFSFT_INDEX(k,n,plan) ((2*(plan)->N+2)*((plan)->N-n+1)+(plan)->N+k+1)
621 #define NFSFT_F_HAT_SIZE(N) ((2*N+2)*(2*N+2))
626 #define FPT_MANGLE_DOUBLE(name) NFFT_CONCAT(fpt_, name)
627 #define FPT_MANGLE_FLOAT(name) NFFT_CONCAT(fptf_, name)
628 #define FPT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(fptl_, name)
636 #define FPT_DEFINE_API(X,Y,R,C) \
637 typedef struct X(set_s_) *X(set); \
640 NFFT_EXTERN X(set) X(init)(const int M, const int t, const unsigned int flags); \
641 NFFT_EXTERN void X(precompute)(X(set) set, const int m, R *alpha, R *beta, \
642 R *gam, int k_start, const R threshold); \
643 NFFT_EXTERN void X(trafo_direct)(X(set) set, const int m, const C *x, C *y, \
644 const int k_end, const unsigned int flags); \
645 NFFT_EXTERN void X(trafo)(X(set) set, const int m, const C *x, C *y, \
646 const int k_end, const unsigned int flags); \
647 NFFT_EXTERN void X(transposed_direct)(X(set) set, const int m, C *x, \
648 C *y, const int k_end, const unsigned int flags); \
649 NFFT_EXTERN void X(transposed)(X(set) set, const int m, C *x, \
650 C *y, const int k_end, const unsigned int flags); \
651 NFFT_EXTERN void X(finalize)(X(set) set);
654 FPT_DEFINE_API(FPT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
655 FPT_DEFINE_API(FPT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
656 FPT_DEFINE_API(FPT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
659 #define FPT_NO_STABILIZATION (1U << 0)
660 #define FPT_NO_FAST_ALGORITHM (1U << 2)
661 #define FPT_NO_DIRECT_ALGORITHM (1U << 3)
662 #define FPT_PERSISTENT_DATA (1U << 4)
665 #define FPT_FUNCTION_VALUES (1U << 5)
666 #define FPT_AL_SYMMETRY (1U << 6)
671 #define NFSOFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfsoft_, name)
672 #define NFSOFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfsoftf_, name)
673 #define NFSOFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfsoftl_, name)
683 #define NFSOFT_DEFINE_API(X,Y,Z,R,C) \
684 typedef struct X(plan_)\
695 unsigned int flags; \
697 Z(set) internal_fpt_set; \
701 NFFT_EXTERN void X(precompute)(X(plan) *plan); \
702 NFFT_EXTERN Z(set) X(SO3_single_fpt_init)(int l, int k, int m, unsigned int flags, int kappa); \
703 NFFT_EXTERN void X(SO3_fpt)(C *coeffs, Z(set) set, int l, int k, int m, unsigned int nfsoft_flags); \
704 NFFT_EXTERN void X(SO3_fpt_transposed)(C *coeffs, Z(set) set,int l, int k, int m,unsigned int nfsoft_flags); \
705 NFFT_EXTERN void X(init)(X(plan) *plan, int N, int M); \
706 NFFT_EXTERN void X(init_advanced)(X(plan) *plan, int N, int M,unsigned int nfsoft_flags); \
707 NFFT_EXTERN void X(init_guru)(X(plan) *plan, int N, int M,unsigned int nfsoft_flags,unsigned int nfft_flags,int nfft_cutoff,int fpt_kappa); \
708 NFFT_EXTERN void X(init_guru_advanced)(X(plan) *plan, int N, int M,unsigned int nfsoft_flags,unsigned int nfft_flags,int nfft_cutoff,int fpt_kappa, int nn_oversampled); \
709 NFFT_EXTERN void X(trafo)(X(plan) *plan_nfsoft); \
710 NFFT_EXTERN void X(adjoint)(X(plan) *plan_nfsoft); \
711 NFFT_EXTERN void X(finalize)(X(plan) *plan); \
712 NFFT_EXTERN int X(posN)(int n,int m, int B);
715 NFSOFT_DEFINE_API(NFSOFT_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,FPT_MANGLE_FLOAT,
float,fftwf_complex)
716 NFSOFT_DEFINE_API(NFSOFT_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,FPT_MANGLE_DOUBLE,
double,fftw_complex)
717 NFSOFT_DEFINE_API(NFSOFT_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,FPT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
720 #define NFSOFT_NORMALIZED (1U << 0)
721 #define NFSOFT_USE_NDFT (1U << 1)
722 #define NFSOFT_USE_DPT (1U << 2)
723 #define NFSOFT_MALLOC_X (1U << 3)
724 #define NFSOFT_REPRESENT (1U << 4)
725 #define NFSOFT_MALLOC_F_HAT (1U << 5)
726 #define NFSOFT_MALLOC_F (1U << 6)
727 #define NFSOFT_PRESERVE_F_HAT (1U << 7)
728 #define NFSOFT_PRESERVE_X (1U << 8)
729 #define NFSOFT_PRESERVE_F (1U << 9)
730 #define NFSOFT_DESTROY_F_HAT (1U << 10)
731 #define NFSOFT_DESTROY_X (1U << 11)
732 #define NFSOFT_DESTROY_F (1U << 12)
735 #define NFSOFT_NO_STABILIZATION (1U << 13)
736 #define NFSOFT_CHOOSE_DPT (1U << 14)
737 #define NFSOFT_SOFT (1U << 15)
738 #define NFSOFT_ZERO_F_HAT (1U << 16)
741 #define NFSOFT_INDEX(m,n,l,B) (((l)+((B)+1))+(2*(B)+2)*(((n)+((B)+1))+(2*(B)+2)*((m)+((B)+1))))
742 #define NFSOFT_INDEX_TWO(m,n,l,B) ((B+1)*(B+1)+(B+1)*(B+1)*(m+B)-((m-1)*m*(2*m-1)+(B+1)*(B+2)*(2*B+3))/6)+(posN(n,m,B))+(l-MAX(ABS(m),ABS(n)))
743 #define NFSOFT_F_HAT_SIZE(B) (((B)+1)*(4*((B)+1)*((B)+1)-1)/3)
748 #define SOLVER_MANGLE_DOUBLE(name) NFFT_CONCAT(solver_, name)
749 #define SOLVER_MANGLE_FLOAT(name) NFFT_CONCAT(solverf_, name)
750 #define SOLVER_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(solverl_, name)
759 #define SOLVER_DEFINE_API(X,Y,R,C)\
763 Y(mv_plan_complex) *mv; \
778 R dot_z_hat_iter_old; \
783 NFFT_EXTERN void X(init_advanced_complex)(X(plan_complex)* ths, Y(mv_plan_complex) *mv, unsigned flags);\
784 NFFT_EXTERN void X(init_complex)(X(plan_complex)* ths, Y(mv_plan_complex) *mv);\
785 NFFT_EXTERN void X(before_loop_complex)(X(plan_complex)* ths);\
786 NFFT_EXTERN void X(loop_one_step_complex)(X(plan_complex) *ths);\
787 NFFT_EXTERN void X(finalize_complex)(X(plan_complex) *ths);\
792 Y(mv_plan_double) *mv; \
807 R dot_z_hat_iter_old; \
812 NFFT_EXTERN void X(init_advanced_double)(X(plan_double)* ths, Y(mv_plan_double) *mv, unsigned flags);\
813 NFFT_EXTERN void X(init_double)(X(plan_double)* ths, Y(mv_plan_double) *mv);\
814 NFFT_EXTERN void X(before_loop_double)(X(plan_double)* ths);\
815 NFFT_EXTERN void X(loop_one_step_double)(X(plan_double) *ths);\
816 NFFT_EXTERN void X(finalize_double)(X(plan_double) *ths);
819 SOLVER_DEFINE_API(SOLVER_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
820 SOLVER_DEFINE_API(SOLVER_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
821 SOLVER_DEFINE_API(SOLVER_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
824 #define LANDWEBER (1U<< 0)
825 #define STEEPEST_DESCENT (1U<< 1)
826 #define CGNR (1U<< 2)
827 #define CGNE (1U<< 3)
828 #define NORMS_FOR_LANDWEBER (1U<< 4)
829 #define PRECOMPUTE_WEIGHT (1U<< 5)
830 #define PRECOMPUTE_DAMP (1U<< 6)
840 #define NFFT_DEFINE_UTIL_API(Y,R,C) \
842 R Y(drand48)(void); \
843 void Y(srand48)(long int seed); \
847 void Y(vrand_unit_complex)(C *x, const NFFT_INT n); \
851 void Y(vrand_shifted_unit_double)(R *x, const NFFT_INT n); \
853 void Y(vrand_real)(R *x, const NFFT_INT n, const R a, const R b); \
857 void Y(vpr_double)(R *x, const NFFT_INT n, const char *text); \
860 void Y(vpr_complex)(C *x, const NFFT_INT n, const char *text); \
862 NFFT_INT Y(get_num_threads)(void); \
864 R Y(clock_gettime_seconds)(void); \
866 R Y(error_l_infty_complex)(const C *x, const C *y, const NFFT_INT n); \
867 R Y(error_l_infty_1_complex)(const C *x, const C *y, const NFFT_INT n, \
868 const C *z, const NFFT_INT m); \
870 NFFT_INT Y(exp2i)(const NFFT_INT a); \
871 NFFT_INT Y(next_power_of_2)(const NFFT_INT N); \
874 R Y(dot_complex)(C *x, NFFT_INT n); \
877 void Y(upd_axpy_complex)(C *x, R a, C *y, NFFT_INT n); \
879 void Y(fftshift_complex)(C *x, NFFT_INT d, NFFT_INT* N); \
880 void Y(fftshift_complex_int)(C *x, int d, int* N); \
882 void Y(get_version)(unsigned *major, unsigned *minor, unsigned *patch); \
888 const char *Y(get_window_name)();
890 NFFT_DEFINE_UTIL_API(NFFT_MANGLE_FLOAT,
float,fftwf_complex)
891 NFFT_DEFINE_UTIL_API(NFFT_MANGLE_DOUBLE,
double,fftw_complex)
892 NFFT_DEFINE_UTIL_API(NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)