32 #if defined(NFFT_SINGLE)
33 #define X(name) CONCAT(solverf_,name)
34 #elif defined(NFFT_LDOUBLE)
35 #define X(name) CONCAT(solverl_,name)
37 #define X(name) CONCAT(solver_,name)
40 void X(init_advanced_complex)(
X(plan_complex)* ths, Y(mv_plan_complex) *mv,
46 ths->y = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
47 ths->r_iter = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
48 ths->f_hat_iter = (C*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(C));
49 ths->p_hat_iter = (C*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(C));
52 ths->z_hat_iter = ths->p_hat_iter;
56 ths->z_hat_iter = ths->p_hat_iter;
57 ths->v_iter = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
62 ths->z_hat_iter = (C*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(C));
63 ths->v_iter = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
67 ths->z_hat_iter = ths->p_hat_iter;
70 ths->w = (R*) Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
73 ths->w_hat = (R*) Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
76 void X(init_complex)(
X(plan_complex)* ths, Y(mv_plan_complex) *mv)
78 X(init_advanced_complex)(ths, mv,
CGNR);
81 void X(before_loop_complex)(
X(plan_complex)* ths)
83 Y(cp_complex)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
85 CSWAP(ths->r_iter, ths->mv->f);
86 ths->mv->mv_trafo(ths->mv);
87 CSWAP(ths->r_iter, ths->mv->f);
89 Y(upd_axpy_complex)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
94 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter, ths->w,
97 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
102 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
104 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
106 CSWAP(ths->z_hat_iter, ths->mv->f_hat);
107 ths->mv->mv_adjoint(ths->mv);
108 CSWAP(ths->z_hat_iter, ths->mv->f_hat);
113 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
116 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter,
120 if(ths->flags &
CGNE)
121 ths->dot_p_hat_iter = ths->dot_z_hat_iter;
123 if(ths->flags &
CGNR)
124 Y(cp_complex)(ths->p_hat_iter, ths->z_hat_iter, ths->mv->N_total);
131 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
132 ths->z_hat_iter, ths->mv->N_total);
134 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
138 Y(cp_complex)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
140 CSWAP(ths->r_iter,ths->mv->f);
141 ths->mv->mv_trafo(ths->mv);
142 CSWAP(ths->r_iter,ths->mv->f);
144 Y(upd_axpy_complex)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
149 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,
152 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
157 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
159 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
161 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
162 ths->mv->mv_adjoint(ths->mv);
163 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
168 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
171 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter,
180 Y(cp_w_complex)(ths->mv->f_hat, ths->w_hat, ths->z_hat_iter,
183 Y(cp_complex)(ths->mv->f_hat, ths->z_hat_iter, ths->mv->N_total);
185 CSWAP(ths->v_iter,ths->mv->f);
186 ths->mv->mv_trafo(ths->mv);
187 CSWAP(ths->v_iter,ths->mv->f);
190 ths->dot_v_iter = Y(dot_w_complex)(ths->v_iter,ths->w,ths->mv->M_total);
192 ths->dot_v_iter = Y(dot_complex)(ths->v_iter, ths->mv->M_total);
195 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
199 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
200 ths->z_hat_iter, ths->mv->N_total);
202 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
206 Y(upd_xpay_complex)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
210 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,ths->mv->M_total);
212 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
216 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
218 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
220 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
221 ths->mv->mv_adjoint(ths->mv);
222 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
225 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
228 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter, ths->mv->N_total);
235 Y(cp_w_complex)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
238 Y(cp_complex)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
240 CSWAP(ths->v_iter,ths->mv->f);
241 ths->mv->mv_trafo(ths->mv);
242 CSWAP(ths->v_iter,ths->mv->f);
245 ths->dot_v_iter = Y(dot_w_complex)(ths->v_iter,ths->w,ths->mv->M_total);
247 ths->dot_v_iter = Y(dot_complex)(ths->v_iter, ths->mv->M_total);
250 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
254 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
255 ths->p_hat_iter, ths->mv->N_total);
257 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
261 Y(upd_xpay_complex)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
265 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,ths->mv->M_total);
267 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
271 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
273 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
275 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
276 ths->mv->mv_adjoint(ths->mv);
277 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
279 ths->dot_z_hat_iter_old = ths->dot_z_hat_iter;
281 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
284 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter, ths->mv->N_total);
287 ths->beta_iter = ths->dot_z_hat_iter / ths->dot_z_hat_iter_old;
290 Y(upd_axpy_complex)(ths->p_hat_iter, ths->beta_iter, ths->z_hat_iter,
297 ths->alpha_iter = ths->dot_r_iter / ths->dot_p_hat_iter;
301 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
302 ths->p_hat_iter, ths->mv->N_total);
304 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
309 Y(cp_w_complex)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
312 Y(cp_complex)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
314 ths->mv->mv_trafo(ths->mv);
316 Y(upd_xpay_complex)(ths->r_iter, -ths->alpha_iter, ths->mv->f,
319 ths->dot_r_iter_old = ths->dot_r_iter;
321 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,ths->mv->M_total);
323 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
326 ths->beta_iter = ths->dot_r_iter / ths->dot_r_iter_old;
330 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
332 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
334 ths->mv->mv_adjoint(ths->mv);
336 Y(upd_axpy_complex)(ths->p_hat_iter, ths->beta_iter, ths->mv->f_hat,
340 ths->dot_p_hat_iter = Y(dot_w_complex)(ths->p_hat_iter, ths->w_hat,
343 ths->dot_p_hat_iter = Y(dot_complex)(ths->p_hat_iter, ths->mv->N_total);
347 void X(loop_one_step_complex)(
X(plan_complex) *ths)
355 if(ths->flags &
CGNR)
358 if(ths->flags &
CGNE)
363 void X(finalize_complex)(
X(plan_complex) *ths)
371 if(ths->flags &
CGNR)
373 Y(free)(ths->v_iter);
374 Y(free)(ths->z_hat_iter);
378 Y(free)(ths->v_iter);
380 Y(free)(ths->p_hat_iter);
381 Y(free)(ths->f_hat_iter);
383 Y(free)(ths->r_iter);
392 void X(init_advanced_double)(
X(plan_double)* ths, Y(mv_plan_double) *mv,
unsigned flags)
397 ths->y = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
398 ths->r_iter = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
399 ths->f_hat_iter = (R*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
400 ths->p_hat_iter = (R*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
403 ths->z_hat_iter = ths->p_hat_iter;
407 ths->z_hat_iter = ths->p_hat_iter;
408 ths->v_iter = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
411 if(ths->flags &
CGNR)
413 ths->z_hat_iter = (R*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
414 ths->v_iter = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
417 if(ths->flags &
CGNE)
418 ths->z_hat_iter = ths->p_hat_iter;
421 ths->w = (R*) Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
424 ths->w_hat = (R*) Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
427 void X(init_double)(
X(plan_double)* ths, Y(mv_plan_double) *mv)
429 X(init_advanced_double)(ths, mv,
CGNR);
432 void X(before_loop_double)(
X(plan_double)* ths)
434 Y(cp_double)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
436 RSWAP(ths->r_iter, ths->mv->f);
437 ths->mv->mv_trafo(ths->mv);
438 RSWAP(ths->r_iter, ths->mv->f);
440 Y(upd_axpy_double)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
445 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter, ths->w,
448 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
453 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
455 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
457 RSWAP(ths->z_hat_iter, ths->mv->f_hat);
458 ths->mv->mv_adjoint(ths->mv);
459 RSWAP(ths->z_hat_iter, ths->mv->f_hat);
464 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
467 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter,
471 if(ths->flags &
CGNE)
472 ths->dot_p_hat_iter = ths->dot_z_hat_iter;
474 if(ths->flags &
CGNR)
475 Y(cp_double)(ths->p_hat_iter, ths->z_hat_iter, ths->mv->N_total);
482 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
483 ths->z_hat_iter, ths->mv->N_total);
485 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
489 Y(cp_double)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
491 RSWAP(ths->r_iter,ths->mv->f);
492 ths->mv->mv_trafo(ths->mv);
493 RSWAP(ths->r_iter,ths->mv->f);
495 Y(upd_axpy_double)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
500 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,
503 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
508 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
510 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
512 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
513 ths->mv->mv_adjoint(ths->mv);
514 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
519 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
522 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter,
531 Y(cp_w_double)(ths->mv->f_hat, ths->w_hat, ths->z_hat_iter,
534 Y(cp_double)(ths->mv->f_hat, ths->z_hat_iter, ths->mv->N_total);
536 RSWAP(ths->v_iter,ths->mv->f);
537 ths->mv->mv_trafo(ths->mv);
538 RSWAP(ths->v_iter,ths->mv->f);
541 ths->dot_v_iter = Y(dot_w_double)(ths->v_iter,ths->w,ths->mv->M_total);
543 ths->dot_v_iter = Y(dot_double)(ths->v_iter, ths->mv->M_total);
546 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
550 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
551 ths->z_hat_iter, ths->mv->N_total);
553 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
557 Y(upd_xpay_double)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
561 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,ths->mv->M_total);
563 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
567 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
569 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
571 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
572 ths->mv->mv_adjoint(ths->mv);
573 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
576 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
579 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter, ths->mv->N_total);
586 Y(cp_w_double)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
589 Y(cp_double)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
591 RSWAP(ths->v_iter,ths->mv->f);
592 ths->mv->mv_trafo(ths->mv);
593 RSWAP(ths->v_iter,ths->mv->f);
596 ths->dot_v_iter = Y(dot_w_double)(ths->v_iter,ths->w,ths->mv->M_total);
598 ths->dot_v_iter = Y(dot_double)(ths->v_iter, ths->mv->M_total);
601 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
605 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
606 ths->p_hat_iter, ths->mv->N_total);
608 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
612 Y(upd_xpay_double)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
616 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,ths->mv->M_total);
618 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
622 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
624 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
626 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
627 ths->mv->mv_adjoint(ths->mv);
628 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
630 ths->dot_z_hat_iter_old = ths->dot_z_hat_iter;
632 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
635 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter, ths->mv->N_total);
638 ths->beta_iter = ths->dot_z_hat_iter / ths->dot_z_hat_iter_old;
641 Y(upd_axpy_double)(ths->p_hat_iter, ths->beta_iter, ths->z_hat_iter,
648 ths->alpha_iter = ths->dot_r_iter / ths->dot_p_hat_iter;
652 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
653 ths->p_hat_iter, ths->mv->N_total);
655 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
660 Y(cp_w_double)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
663 Y(cp_double)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
665 ths->mv->mv_trafo(ths->mv);
667 Y(upd_xpay_double)(ths->r_iter, -ths->alpha_iter, ths->mv->f,
670 ths->dot_r_iter_old = ths->dot_r_iter;
672 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,ths->mv->M_total);
674 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
677 ths->beta_iter = ths->dot_r_iter / ths->dot_r_iter_old;
681 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
683 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
685 ths->mv->mv_adjoint(ths->mv);
687 Y(upd_axpy_double)(ths->p_hat_iter, ths->beta_iter, ths->mv->f_hat,
691 ths->dot_p_hat_iter = Y(dot_w_double)(ths->p_hat_iter, ths->w_hat,
694 ths->dot_p_hat_iter = Y(dot_double)(ths->p_hat_iter, ths->mv->N_total);
698 void X(loop_one_step_double)(
X(plan_double) *ths)
706 if(ths->flags &
CGNR)
709 if(ths->flags &
CGNE)
714 void X(finalize_double)(
X(plan_double) *ths)
722 if(ths->flags &
CGNR)
724 Y(free)(ths->v_iter);
725 Y(free)(ths->z_hat_iter);
729 Y(free)(ths->v_iter);
731 Y(free)(ths->p_hat_iter);
732 Y(free)(ths->f_hat_iter);
734 Y(free)(ths->r_iter);
#define PRECOMPUTE_WEIGHT
static void solver_loop_one_step_cgnr_double(CONCAT(solver_, plan_double)*ths)
void solver_loop_one_step_cgnr
static void solver_loop_one_step_cgnr_complex(CONCAT(solver_, plan_complex)*ths)
void solver_loop_one_step_cgnr
static void solver_loop_one_step_cgne_double(CONCAT(solver_, plan_double)*ths)
void solver_loop_one_step_cgne
static void solver_loop_one_step_landweber_complex(CONCAT(solver_, plan_complex)*ths)
void solver_loop_one_step_landweber
#define X(name)
Include header for C99 complex datatype.
#define RSWAP(x, y)
Swap two vectors.
static void solver_loop_one_step_steepest_descent_double(CONCAT(solver_, plan_double)*ths)
void solver_loop_one_step_steepest_descent
static void solver_loop_one_step_landweber_double(CONCAT(solver_, plan_double)*ths)
void solver_loop_one_step_landweber
static void solver_loop_one_step_cgne_complex(CONCAT(solver_, plan_complex)*ths)
void solver_loop_one_step_cgne
#define NORMS_FOR_LANDWEBER
static void solver_loop_one_step_steepest_descent_complex(CONCAT(solver_, plan_complex)*ths)
void solver_loop_one_step_steepest_descent
Header file for the nfft3 library.
#define CSWAP(x, y)
Swap two vectors.