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) 663 #define FPT_NO_INIT_FPT_DATA (1U << 7) 666 #define FPT_FUNCTION_VALUES (1U << 5) 667 #define FPT_AL_SYMMETRY (1U << 6) 672 #define NFSOFT_MANGLE_DOUBLE(name) NFFT_CONCAT(nfsoft_, name) 673 #define NFSOFT_MANGLE_FLOAT(name) NFFT_CONCAT(nfsoftf_, name) 674 #define NFSOFT_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(nfsoftl_, name) 684 #define NFSOFT_DEFINE_API(X,Y,Z,R,C) \ 685 typedef struct X(plan_)\ 694 unsigned int flags; \ 696 Z(set) *internal_fpt_set; \ 700 NFFT_EXTERN void X(precompute)(X(plan) *plan); \ 701 NFFT_EXTERN Z(set) X(SO3_single_fpt_init)(int l, int k, int m, unsigned int flags, int kappa); \ 702 NFFT_EXTERN void X(SO3_fpt)(C *coeffs, Z(set) set, int l, int k, int m, unsigned int nfsoft_flags); \ 703 NFFT_EXTERN void X(SO3_fpt_transposed)(C *coeffs, Z(set) set,int l, int k, int m,unsigned int nfsoft_flags); \ 704 NFFT_EXTERN void X(init)(X(plan) *plan, int N, int M); \ 705 NFFT_EXTERN void X(init_advanced)(X(plan) *plan, int N, int M,unsigned int nfsoft_flags); \ 706 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); \ 707 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); \ 708 NFFT_EXTERN void X(trafo)(X(plan) *plan_nfsoft); \ 709 NFFT_EXTERN void X(adjoint)(X(plan) *plan_nfsoft); \ 710 NFFT_EXTERN void X(finalize)(X(plan) *plan); \ 711 NFFT_EXTERN int X(posN)(int n,int m, int B); 714 NFSOFT_DEFINE_API(NFSOFT_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,FPT_MANGLE_FLOAT,
float,fftwf_complex)
715 NFSOFT_DEFINE_API(NFSOFT_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,FPT_MANGLE_DOUBLE,
double,fftw_complex)
716 NFSOFT_DEFINE_API(NFSOFT_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,FPT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
719 #define NFSOFT_NORMALIZED (1U << 0) 720 #define NFSOFT_USE_NDFT (1U << 1) 721 #define NFSOFT_USE_DPT (1U << 2) 722 #define NFSOFT_MALLOC_X (1U << 3) 723 #define NFSOFT_REPRESENT (1U << 4) 724 #define NFSOFT_MALLOC_F_HAT (1U << 5) 725 #define NFSOFT_MALLOC_F (1U << 6) 726 #define NFSOFT_PRESERVE_F_HAT (1U << 7) 727 #define NFSOFT_PRESERVE_X (1U << 8) 728 #define NFSOFT_PRESERVE_F (1U << 9) 729 #define NFSOFT_DESTROY_F_HAT (1U << 10) 730 #define NFSOFT_DESTROY_X (1U << 11) 731 #define NFSOFT_DESTROY_F (1U << 12) 734 #define NFSOFT_NO_STABILIZATION (1U << 13) 735 #define NFSOFT_CHOOSE_DPT (1U << 14) 736 #define NFSOFT_SOFT (1U << 15) 737 #define NFSOFT_ZERO_F_HAT (1U << 16) 740 #define NFSOFT_INDEX(m,n,l,B) (((l)+((B)+1))+(2*(B)+2)*(((n)+((B)+1))+(2*(B)+2)*((m)+((B)+1)))) 741 #define NFSOFT_F_HAT_SIZE(B) (((B)+1)*(4*((B)+1)*((B)+1)-1)/3) 746 #define SOLVER_MANGLE_DOUBLE(name) NFFT_CONCAT(solver_, name) 747 #define SOLVER_MANGLE_FLOAT(name) NFFT_CONCAT(solverf_, name) 748 #define SOLVER_MANGLE_LONG_DOUBLE(name) NFFT_CONCAT(solverl_, name) 757 #define SOLVER_DEFINE_API(X,Y,R,C)\ 761 Y(mv_plan_complex) *mv; \ 776 R dot_z_hat_iter_old; \ 781 NFFT_EXTERN void X(init_advanced_complex)(X(plan_complex)* ths, Y(mv_plan_complex) *mv, unsigned flags);\ 782 NFFT_EXTERN void X(init_complex)(X(plan_complex)* ths, Y(mv_plan_complex) *mv);\ 783 NFFT_EXTERN void X(before_loop_complex)(X(plan_complex)* ths);\ 784 NFFT_EXTERN void X(loop_one_step_complex)(X(plan_complex) *ths);\ 785 NFFT_EXTERN void X(finalize_complex)(X(plan_complex) *ths);\ 790 Y(mv_plan_double) *mv; \ 805 R dot_z_hat_iter_old; \ 810 NFFT_EXTERN void X(init_advanced_double)(X(plan_double)* ths, Y(mv_plan_double) *mv, unsigned flags);\ 811 NFFT_EXTERN void X(init_double)(X(plan_double)* ths, Y(mv_plan_double) *mv);\ 812 NFFT_EXTERN void X(before_loop_double)(X(plan_double)* ths);\ 813 NFFT_EXTERN void X(loop_one_step_double)(X(plan_double) *ths);\ 814 NFFT_EXTERN void X(finalize_double)(X(plan_double) *ths); 817 SOLVER_DEFINE_API(SOLVER_MANGLE_FLOAT,NFFT_MANGLE_FLOAT,
float,fftwf_complex)
818 SOLVER_DEFINE_API(SOLVER_MANGLE_DOUBLE,NFFT_MANGLE_DOUBLE,
double,fftw_complex)
819 SOLVER_DEFINE_API(SOLVER_MANGLE_LONG_DOUBLE,NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)
822 #define LANDWEBER (1U<< 0) 823 #define STEEPEST_DESCENT (1U<< 1) 824 #define CGNR (1U<< 2) 825 #define CGNE (1U<< 3) 826 #define NORMS_FOR_LANDWEBER (1U<< 4) 827 #define PRECOMPUTE_WEIGHT (1U<< 5) 828 #define PRECOMPUTE_DAMP (1U<< 6) 838 #define NFFT_DEFINE_UTIL_API(Y,R,C) \ 840 R Y(drand48)(void); \ 841 void Y(srand48)(long int seed); \ 845 void Y(vrand_unit_complex)(C *x, const NFFT_INT n); \ 849 void Y(vrand_shifted_unit_double)(R *x, const NFFT_INT n); \ 851 void Y(vrand_real)(R *x, const NFFT_INT n, const R a, const R b); \ 855 void Y(vpr_double)(R *x, const NFFT_INT n, const char *text); \ 858 void Y(vpr_complex)(C *x, const NFFT_INT n, const char *text); \ 860 NFFT_INT Y(get_num_threads)(void); \ 862 R Y(clock_gettime_seconds)(void); \ 864 R Y(error_l_infty_complex)(const C *x, const C *y, const NFFT_INT n); \ 865 R Y(error_l_infty_1_complex)(const C *x, const C *y, const NFFT_INT n, \ 866 const C *z, const NFFT_INT m); \ 868 NFFT_INT Y(exp2i)(const NFFT_INT a); \ 869 NFFT_INT Y(next_power_of_2)(const NFFT_INT N); \ 872 R Y(dot_complex)(C *x, NFFT_INT n); \ 875 void Y(upd_axpy_complex)(C *x, R a, C *y, NFFT_INT n); \ 877 void Y(fftshift_complex)(C *x, NFFT_INT d, NFFT_INT* N); \ 878 void Y(fftshift_complex_int)(C *x, int d, int* N); \ 880 void Y(get_version)(unsigned *major, unsigned *minor, unsigned *patch); \ 886 const char *Y(get_window_name)(); \ 887 NFFT_INT Y(get_default_window_cut_off)(); 889 NFFT_DEFINE_UTIL_API(NFFT_MANGLE_FLOAT,
float,fftwf_complex)
890 NFFT_DEFINE_UTIL_API(NFFT_MANGLE_DOUBLE,
double,fftw_complex)
891 NFFT_DEFINE_UTIL_API(NFFT_MANGLE_LONG_DOUBLE,
long double,fftwl_complex)