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)