25 #include "nfft3conf.h"
35 #define NFFT_CONCAT(prefix, name) prefix ## name
43 #if defined(NFFT_DLL) && (defined(_WIN32) || defined(__WIN32__))
45 # if defined(COMPILING_NFFT)
46 # define NFFT_EXTERN extern __declspec(dllexport)
48 # define NFFT_EXTERN extern __declspec(dllimport)
51 # define NFFT_EXTERN extern
57 NFFT_EXTERN
void nfft_die(
char *s);
61 typedef void *(*nfft_malloc_type_function) (
size_t n);
63 typedef void (*nfft_die_type_function) (
const char *errString);
66 NFFT_EXTERN nfft_die_type_function nfft_die_hook;
69 #define MACRO_MV_PLAN(RC) \
74 void (*mv_trafo)(void*); \
75 void (*mv_adjoint)(void*);
80 #define NFFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfft_, name)
81 #define NFFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfftf_, name)
82 #define NFFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfftl_, name)
91 #define NFFT_DEFINE_API(X,Y,R,C) \
96 } X(mv_plan_complex); \
101 } X(mv_plan_double); \
122 unsigned nfft_flags; \
127 unsigned fftw_flags; \
132 double MEASURE_TIME_t[3]; \
136 Y(plan) my_fftw_plan1; \
137 Y(plan) my_fftw_plan2; \
156 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths);\
157 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths);\
158 NFFT_EXTERN void X(trafo)(X(plan) *ths);\
159 NFFT_EXTERN void X(trafo_1d)(X(plan) *ths);\
160 NFFT_EXTERN void X(trafo_2d)(X(plan) *ths);\
161 NFFT_EXTERN void X(trafo_3d)(X(plan) *ths);\
162 NFFT_EXTERN void X(adjoint)(X(plan) *ths);\
163 NFFT_EXTERN void X(adjoint_1d)(X(plan) *ths);\
164 NFFT_EXTERN void X(adjoint_2d)(X(plan) *ths);\
165 NFFT_EXTERN void X(adjoint_3d)(X(plan) *ths);\
166 NFFT_EXTERN void X(init_1d)(X(plan) *ths, int N1, int M);\
167 NFFT_EXTERN void X(init_2d)(X(plan) *ths, int N1, int N2, int M);\
168 NFFT_EXTERN void X(init_3d)(X(plan) *ths, int N1, int N2, int N3, int M);\
169 NFFT_EXTERN void X(init)(X(plan) *ths, int d, int *N, int M);\
170 NFFT_EXTERN void X(init_guru)(X(plan) *ths, int d, int *N, int M, int *n, \
171 int m, unsigned nfft_flags, unsigned fftw_flags);\
172 NFFT_EXTERN void X(precompute_one_psi)(X(plan) *ths);\
173 NFFT_EXTERN void X(precompute_full_psi)(X(plan) *ths);\
174 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths);\
175 NFFT_EXTERN void X(precompute_lin_psi)(X(plan) *ths);\
176 NFFT_EXTERN const char* X(check)(X(plan) *ths);\
177 NFFT_EXTERN void X(finalize)(X(plan) *ths);
180 NFFT_DEFINE_API(NFFT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
181 NFFT_DEFINE_API(NFFT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
182 NFFT_DEFINE_API(NFFT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
185 #define PRE_PHI_HUT (1U<< 0)
186 #define FG_PSI (1U<< 1)
187 #define PRE_LIN_PSI (1U<< 2)
188 #define PRE_FG_PSI (1U<< 3)
189 #define PRE_PSI (1U<< 4)
190 #define PRE_FULL_PSI (1U<< 5)
191 #define MALLOC_X (1U<< 6)
192 #define MALLOC_F_HAT (1U<< 7)
193 #define MALLOC_F (1U<< 8)
194 #define FFT_OUT_OF_PLACE (1U<< 9)
195 #define FFTW_INIT (1U<< 10)
196 #define NFFT_SORT_NODES (1U<< 11)
197 #define NFFT_OMP_BLOCKWISE_ADJOINT (1U<<12)
198 #define PRE_ONE_PSI (PRE_LIN_PSI| PRE_FG_PSI| PRE_PSI| PRE_FULL_PSI)
204 #define NFCT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfct_, name)
205 #define NFCT_MANGLE_FLOAT(name) NFFT_CONCAT(nfctf_, name)
206 #define NFCT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfctl_, name)
215 #define NFCT_DEFINE_API(X,Y,R,C) \
227 R nfct_full_psi_eps;\
230 unsigned nfct_flags; \
231 unsigned fftw_flags; \
235 double MEASURE_TIME_t[3]; \
238 Y(plan) my_fftw_r2r_plan; \
239 Y(r2r_kind) *r2r_kind; \
255 NFFT_EXTERN void X(init_1d)(X(plan) *ths_plan, int N0, int M_total); \
256 NFFT_EXTERN void X(init_2d)(X(plan) *ths_plan, int N0, int N1, int M_total); \
257 NFFT_EXTERN void X(init_3d)(X(plan) *ths_plan, int N0, int N1, int N2, int M_total); \
258 NFFT_EXTERN void X(init)(X(plan) *ths_plan, int d, int *N, int M_total); \
259 NFFT_EXTERN void X(init_guru)(X(plan) *ths_plan, int d, int *N, int M_total, int *n, \
260 int m, unsigned nfct_flags, unsigned fftw_flags); \
261 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths_plan); \
262 NFFT_EXTERN void X(trafo)(X(plan) *ths_plan); \
263 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths_plan); \
264 NFFT_EXTERN void X(adjoint)(X(plan) *ths_plan); \
265 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths_plan); \
266 NFFT_EXTERN void X(finalize)(X(plan) *ths_plan); \
267 NFFT_EXTERN R X(phi_hut)(X(plan) *ths_plan, int k, int d); \
268 NFFT_EXTERN R X(phi)(X(plan) *ths_plan, R x, int d);
270 #if defined(HAVE_NFCT)
272 NFCT_DEFINE_API(NFCT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
273 NFCT_DEFINE_API(NFCT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
274 NFCT_DEFINE_API(NFCT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
280 #define NFST_MANGLE_DOUBLE(name) NFFT_CONCAT(nfst_, name)
281 #define NFST_MANGLE_FLOAT(name) NFFT_CONCAT(nfstf_, name)
282 #define NFST_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfstl_, name)
291 #define NFST_DEFINE_API(X,Y,R,C) \
303 R nfst_full_psi_eps;\
306 unsigned nfst_flags; \
307 unsigned fftw_flags; \
311 double MEASURE_TIME_t[3]; \
314 Y(plan) my_fftw_r2r_plan; \
315 Y(r2r_kind) *r2r_kind; \
331 NFFT_EXTERN void X(init_1d)(X(plan) *ths_plan, int N0, int M_total); \
332 NFFT_EXTERN void X(init_2d)(X(plan) *ths_plan, int N0, int N1, int M_total); \
333 NFFT_EXTERN void X(init_3d)(X(plan) *ths_plan, int N0, int N1, int N2, int M_total); \
334 NFFT_EXTERN void X(init)(X(plan) *ths_plan, int d, int *N, int M_total); \
335 NFFT_EXTERN void X(init_m)(X(plan) *ths_plan, int d, int *N, int M_total, int m);\
336 NFFT_EXTERN void X(init_guru)(X(plan) *ths_plan, int d, int *N, int M_total, int *n, \
337 int m, unsigned nfst_flags, unsigned fftw_flags); \
338 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths_plan); \
339 NFFT_EXTERN void X(trafo)(X(plan) *ths_plan); \
340 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths_plan); \
341 NFFT_EXTERN void X(adjoint)(X(plan) *ths_plan); \
342 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths_plan); \
343 NFFT_EXTERN void X(finalize)(X(plan) *ths_plan); \
344 NFFT_EXTERN void X(full_psi)(X(plan) *ths_plan, R eps); \
345 NFFT_EXTERN R X(phi_hut)(X(plan) *ths_plan, int k, int d); \
346 NFFT_EXTERN R X(phi)(X(plan) *ths_plan, R x, int d); \
347 NFFT_EXTERN int X(fftw_2N)(int n); \
348 NFFT_EXTERN int X(fftw_2N_rev)(int n);
352 NFST_DEFINE_API(NFST_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
353 NFST_DEFINE_API(NFST_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
354 NFST_DEFINE_API(NFST_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
360 #define NNFFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nnfft_, name)
361 #define NNFFT_MANGLE_FLOAT(name) NFFT_CONCAT(nnfftf_, name)
362 #define NNFFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nnfftl_, name)
372 #define NNFFT_DEFINE_API(X,Y,Z,R,C) \
388 Z(plan) *direct_plan; \
389 unsigned nnfft_flags; \
402 NFFT_EXTERN void X(init)(X(plan) *ths_plan, int d, int N_total, int M_total, int *N); \
403 NFFT_EXTERN void X(init_guru)(X(plan) *ths_plan, int d, int N_total, int M_total, \
404 int *N, int *N1, int m, unsigned nnfft_flags); \
405 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths_plan); \
406 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths_plan); \
407 NFFT_EXTERN void X(trafo)(X(plan) *ths_plan); \
408 NFFT_EXTERN void X(adjoint)(X(plan) *ths_plan); \
409 NFFT_EXTERN void X(precompute_lin_psi)(X(plan) *ths_plan); \
410 NFFT_EXTERN void X(precompute_psi)(X(plan) *ths_plan); \
411 NFFT_EXTERN void X(precompute_full_psi)(X(plan) *ths_plan); \
412 NFFT_EXTERN void X(precompute_phi_hut)(X(plan) *ths_plan); \
413 NFFT_EXTERN void X(finalize)(X(plan) *ths_plan);
417 NNFFT_DEFINE_API(NNFFT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
418 NNFFT_DEFINE_API(NNFFT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
419 NNFFT_DEFINE_API(NNFFT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
423 #define MALLOC_V (1U<< 11)
427 #define NSFFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nsfft_, name)
428 #define NSFFT_MANGLE_FLOAT(name) NFFT_CONCAT(nsfftf_, name)
429 #define NSFFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nsfftl_, name)
439 #define NSFFT_DEFINE_API(X,Y,Z,R,C) \
450 int *index_sparse_to_full; \
451 int r_act_nfft_plan; \
452 Z(plan) *act_nfft_plan; \
453 Z(plan) *center_nfft_plan; \
454 Y(plan) *set_fftw_plan1; \
455 Y(plan) *set_fftw_plan2; \
456 Z(plan) *set_nfft_plan_1d; \
457 Z(plan) *set_nfft_plan_2d; \
459 R *x_102,*x_201,*x_120,*x_021; \
462 NFFT_EXTERN void X(trafo_direct)(X(plan) *ths); \
463 NFFT_EXTERN void X(adjoint_direct)(X(plan) *ths); \
464 NFFT_EXTERN void X(trafo)(X(plan) *ths); \
465 NFFT_EXTERN void X(adjoint)(X(plan) *ths); \
466 NFFT_EXTERN void X(cp)(X(plan) *ths, Z(plan) *ths_nfft); \
467 NFFT_EXTERN void X(init_random_nodes_coeffs)(X(plan) *ths); \
468 NFFT_EXTERN void X(init)(X(plan) *ths, int d, int J, int M, int m, unsigned flags); \
469 NFFT_EXTERN void X(finalize)(X(plan) *ths);
473 NSFFT_DEFINE_API(NSFFT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
474 NSFFT_DEFINE_API(NSFFT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
475 NSFFT_DEFINE_API(NSFFT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
479 #define NSDFT (1U<< 12)
484 #define MRI_MANGLE_DOUBLE(name) NFFT_CONCAT(mri_, name)
485 #define MRI_MANGLE_FLOAT(name) NFFT_CONCAT(mrif_, name)
486 #define MRI_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(mril_, name)
495 #define MRI_DEFINE_API(X,Z,R,C) \
516 void X(inh_2d1d_trafo)(X(inh_2d1d_plan) *ths); \
517 void X(inh_2d1d_adjoint)(X(inh_2d1d_plan) *ths); \
518 void X(inh_2d1d_init_guru)(X(inh_2d1d_plan) *ths, int *N, int M, int *n, \
519 int m, R sigma, unsigned nfft_flags, unsigned fftw_flags); \
520 void X(inh_2d1d_finalize)(X(inh_2d1d_plan) *ths); \
521 void X(inh_3d_trafo)(X(inh_3d_plan) *ths); \
522 void X(inh_3d_adjoint)(X(inh_3d_plan) *ths); \
523 void X(inh_3d_init_guru)(X(inh_3d_plan) *ths, int *N, int M, int *n, \
524 int m, R sigma, unsigned nfft_flags, unsigned fftw_flags); \
525 void X(inh_3d_finalize)(X(inh_3d_plan) *ths);
529 MRI_DEFINE_API(MRI_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
530 MRI_DEFINE_API(MRI_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
531 MRI_DEFINE_API(MRI_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
537 #define NFSFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfsft_, name)
538 #define NFSFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfsftf_, name)
539 #define NFSFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfsftl_, name)
548 #define NFSFT_DEFINE_API(X,Z,R,C) \
558 unsigned int flags; \
562 double MEASURE_TIME_t[3]; \
566 NFFT_EXTERN void X(init)(X(plan) *plan, int N, int M); \
567 NFFT_EXTERN void X(init_advanced)(X(plan)* plan, int N, int M, unsigned int \
569 NFFT_EXTERN void X(init_guru)(X(plan) *plan, int N, int M, \
570 unsigned int nfsft_flags, unsigned int nfft_flags, int nfft_cutoff); \
571 NFFT_EXTERN void X(precompute)(int N, R kappa, unsigned int nfsft_flags, \
572 unsigned int fpt_flags); \
573 NFFT_EXTERN void X(forget)(void); \
574 NFFT_EXTERN void X(trafo_direct)(X(plan)* plan); \
575 NFFT_EXTERN void X(adjoint_direct)(X(plan)* plan); \
576 NFFT_EXTERN void X(trafo)(X(plan)* plan); \
577 NFFT_EXTERN void X(adjoint)(X(plan)* plan); \
578 NFFT_EXTERN void X(finalize)(X(plan) *plan); \
579 NFFT_EXTERN void X(precompute_x)(X(plan) *plan);
583 NFSFT_DEFINE_API(NFSFT_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
584 NFSFT_DEFINE_API(NFSFT_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
585 NFSFT_DEFINE_API(NFSFT_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
589 #define NFSFT_NORMALIZED (1U << 0)
590 #define NFSFT_USE_NDFT (1U << 1)
591 #define NFSFT_USE_DPT (1U << 2)
592 #define NFSFT_MALLOC_X (1U << 3)
593 #define NFSFT_MALLOC_F_HAT (1U << 5)
594 #define NFSFT_MALLOC_F (1U << 6)
595 #define NFSFT_PRESERVE_F_HAT (1U << 7)
596 #define NFSFT_PRESERVE_X (1U << 8)
597 #define NFSFT_PRESERVE_F (1U << 9)
598 #define NFSFT_DESTROY_F_HAT (1U << 10)
599 #define NFSFT_DESTROY_X (1U << 11)
600 #define NFSFT_DESTROY_F (1U << 12)
603 #define NFSFT_NO_DIRECT_ALGORITHM (1U << 13)
604 #define NFSFT_NO_FAST_ALGORITHM (1U << 14)
605 #define NFSFT_ZERO_F_HAT (1U << 16)
608 #define NFSFT_INDEX(k,n,plan) ((2*(plan)->N+2)*((plan)->N-n+1)+(plan)->N+k+1)
609 #define NFSFT_F_HAT_SIZE(N) ((2*N+2)*(2*N+2))
614 #define FPT_MANGLE_DOUBLE(name) NFFT_CONCAT(fpt_, name)
615 #define FPT_MANGLE_FLOAT(name) NFFT_CONCAT(fptf_, name)
616 #define FPT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(fptl_, name)
624 #define FPT_DEFINE_API(X,Y,R,C) \
625 typedef struct X(set_s_) *X(set); \
628 NFFT_EXTERN X(set) X(init)(const int M, const int t, const unsigned int flags); \
629 NFFT_EXTERN void X(precompute)(X(set) set, const int m, R *alpha, R *beta, \
630 R *gam, int k_start, const R threshold); \
631 NFFT_EXTERN void X(trafo_direct)(X(set) set, const int m, const C *x, C *y, \
632 const int k_end, const unsigned int flags); \
633 NFFT_EXTERN void X(trafo)(X(set) set, const int m, const C *x, C *y, \
634 const int k_end, const unsigned int flags); \
635 NFFT_EXTERN void X(transposed_direct)(X(set) set, const int m, C *x, \
636 C *y, const int k_end, const unsigned int flags); \
637 NFFT_EXTERN void X(transposed)(X(set) set, const int m, C *x, \
638 C *y, const int k_end, const unsigned int flags); \
639 NFFT_EXTERN void X(finalize)(X(set) set);
643 FPT_DEFINE_API(FPT_MANGLE_FLOAT,FFTW_MANGLE_FLOAT,
float,fftwf_complex)
644 FPT_DEFINE_API(FPT_MANGLE_DOUBLE,FFTW_MANGLE_DOUBLE,
double,fftw_complex)
645 FPT_DEFINE_API(FPT_MANGLE_LONG_DOUBLE,FFTW_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
648 #define FPT_NO_STABILIZATION (1U << 0)
649 #define FPT_NO_FAST_ALGORITHM (1U << 2)
650 #define FPT_NO_DIRECT_ALGORITHM (1U << 3)
651 #define FPT_PERSISTENT_DATA (1U << 4)
654 #define FPT_FUNCTION_VALUES (1U << 5)
655 #define FPT_AL_SYMMETRY (1U << 6)
661 #define NFSOFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfsoft_, name)
662 #define NFSOFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfsoftf_, name)
663 #define NFSOFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfsoftl_, name)
673 #define NFSOFT_DEFINE_API(X,Y,Z,R,C) \
674 typedef struct X(plan_)\
685 unsigned int flags; \
687 Z(set) internal_fpt_set; \
691 NFFT_EXTERN void X(precompute)(X(plan) *plan); \
692 NFFT_EXTERN Z(set) X(SO3_single_fpt_init)(int l, int k, int m, unsigned int flags, int kappa); \
693 NFFT_EXTERN void X(SO3_fpt)(C *coeffs, Z(set) set, int l, int k, int m, unsigned int nfsoft_flags); \
694 NFFT_EXTERN void X(SO3_fpt_transposed)(C *coeffs, Z(set) set,int l, int k, int m,unsigned int nfsoft_flags); \
695 NFFT_EXTERN void X(init)(X(plan) *plan, int N, int M); \
696 NFFT_EXTERN void X(init_advanced)(X(plan) *plan, int N, int M,unsigned int nfsoft_flags); \
697 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); \
698 NFFT_EXTERN void X(trafo)(X(plan) *plan_nfsoft); \
699 NFFT_EXTERN void X(adjoint)(X(plan) *plan_nfsoft); \
700 NFFT_EXTERN void X(finalize)(X(plan) *plan); \
701 NFFT_EXTERN int X(posN)(int n,int m, int B);
705 NFSOFT_DEFINE_API(NFSOFT_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,FPT_MANGLE_FLOAT,
float,fftwf_complex)
706 NFSOFT_DEFINE_API(NFSOFT_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,FPT_MANGLE_DOUBLE,
double,fftw_complex)
707 NFSOFT_DEFINE_API(NFSOFT_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,FPT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
710 #define NFSOFT_NORMALIZED (1U << 0)
711 #define NFSOFT_USE_NDFT (1U << 1)
712 #define NFSOFT_USE_DPT (1U << 2)
713 #define NFSOFT_MALLOC_X (1U << 3)
714 #define NFSOFT_REPRESENT (1U << 4)
715 #define NFSOFT_MALLOC_F_HAT (1U << 5)
716 #define NFSOFT_MALLOC_F (1U << 6)
717 #define NFSOFT_PRESERVE_F_HAT (1U << 7)
718 #define NFSOFT_PRESERVE_X (1U << 8)
719 #define NFSOFT_PRESERVE_F (1U << 9)
720 #define NFSOFT_DESTROY_F_HAT (1U << 10)
721 #define NFSOFT_DESTROY_X (1U << 11)
722 #define NFSOFT_DESTROY_F (1U << 12)
725 #define NFSOFT_NO_STABILIZATION (1U << 13)
726 #define NFSOFT_CHOOSE_DPT (1U << 14)
727 #define NFSOFT_SOFT (1U << 15)
728 #define NFSOFT_ZERO_F_HAT (1U << 16)
731 #define NFSOFT_INDEX(m,n,l,B) (((l)+((B)+1))+(2*(B)+2)*(((n)+((B)+1))+(2*(B)+2)*((m)+((B)+1))))
732 #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)))
733 #define NFSOFT_F_HAT_SIZE(B) (((B)+1)*(4*((B)+1)*((B)+1)-1)/3)
740 #define SOLVER_MANGLE_DOUBLE(name) NFFT_CONCAT(solver_, name)
741 #define SOLVER_MANGLE_FLOAT(name) NFFT_CONCAT(solverf_, name)
742 #define SOLVER_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(solverl_, name)
751 #define SOLVER_DEFINE_API(X,Y,R,C)\
754 Y(mv_plan_complex) *mv; \
769 R dot_z_hat_iter_old; \
774 NFFT_EXTERN void X(init_advanced_complex)(X(plan_complex)* ths, Y(mv_plan_complex) *mv, unsigned flags);\
775 NFFT_EXTERN void X(init_complex)(X(plan_complex)* ths, Y(mv_plan_complex) *mv);\
776 NFFT_EXTERN void X(before_loop_complex)(X(plan_complex)* ths);\
777 NFFT_EXTERN void X(loop_one_step_complex)(X(plan_complex) *ths);\
778 NFFT_EXTERN void X(finalize_complex)(X(plan_complex) *ths);\
782 Y(mv_plan_double) *mv; \
797 R dot_z_hat_iter_old; \
802 NFFT_EXTERN void X(init_advanced_double)(X(plan_double)* ths, Y(mv_plan_double) *mv, unsigned flags);\
803 NFFT_EXTERN void X(solver_init_double)(X(plan_double)* ths, Y(mv_plan_double) *mv);\
804 NFFT_EXTERN void X(solver_before_loop_double)(X(plan_double)* ths);\
805 NFFT_EXTERN void X(solver_loop_one_step_double)(X(plan_double) *ths);\
806 NFFT_EXTERN void X(solver_finalize_double)(X(plan_double) *ths);
809 SOLVER_DEFINE_API(SOLVER_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
810 SOLVER_DEFINE_API(SOLVER_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
811 SOLVER_DEFINE_API(SOLVER_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
814 #define LANDWEBER (1U<< 0)
815 #define STEEPEST_DESCENT (1U<< 1)
816 #define CGNR (1U<< 2)
817 #define CGNE (1U<< 3)
818 #define NORMS_FOR_LANDWEBER (1U<< 4)
819 #define PRECOMPUTE_WEIGHT (1U<< 5)
820 #define PRECOMPUTE_DAMP (1U<< 6)