34 #if defined(NFFT_SINGLE) 35 #define X(name) CONCAT(solverf_,name) 36 #elif defined(NFFT_LDOUBLE) 37 #define X(name) CONCAT(solverl_,name) 39 #define X(name) CONCAT(solver_,name) 42 void X(init_advanced_complex)(
X(plan_complex)* ths, Y(mv_plan_complex) *mv,
48 ths->y = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
49 ths->r_iter = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
50 ths->f_hat_iter = (C*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(C));
51 ths->p_hat_iter = (C*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(C));
53 if(ths->flags & LANDWEBER)
54 ths->z_hat_iter = ths->p_hat_iter;
56 if(ths->flags & STEEPEST_DESCENT)
58 ths->z_hat_iter = ths->p_hat_iter;
59 ths->v_iter = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
64 ths->z_hat_iter = (C*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(C));
65 ths->v_iter = (C*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(C));
69 ths->z_hat_iter = ths->p_hat_iter;
71 if(ths->flags & PRECOMPUTE_WEIGHT)
72 ths->w = (R*) Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
74 if(ths->flags & PRECOMPUTE_DAMP)
75 ths->w_hat = (R*) Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
78 void X(init_complex)(
X(plan_complex)* ths, Y(mv_plan_complex) *mv)
80 X(init_advanced_complex)(ths, mv, CGNR);
83 void X(before_loop_complex)(
X(plan_complex)* ths)
85 Y(cp_complex)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
87 CSWAP(ths->r_iter, ths->mv->f);
88 ths->mv->mv_trafo(ths->mv);
89 CSWAP(ths->r_iter, ths->mv->f);
91 Y(upd_axpy_complex)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
93 if((!(ths->flags & LANDWEBER)) || (ths->flags & NORMS_FOR_LANDWEBER))
95 if(ths->flags & PRECOMPUTE_WEIGHT)
96 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter, ths->w,
99 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
103 if(ths->flags & PRECOMPUTE_WEIGHT)
104 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
106 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
108 CSWAP(ths->z_hat_iter, ths->mv->f_hat);
109 ths->mv->mv_adjoint(ths->mv);
110 CSWAP(ths->z_hat_iter, ths->mv->f_hat);
112 if((!(ths->flags & LANDWEBER)) || (ths->flags & NORMS_FOR_LANDWEBER))
114 if(ths->flags & PRECOMPUTE_DAMP)
115 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
118 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter,
122 if(ths->flags & CGNE)
123 ths->dot_p_hat_iter = ths->dot_z_hat_iter;
125 if(ths->flags & CGNR)
126 Y(cp_complex)(ths->p_hat_iter, ths->z_hat_iter, ths->mv->N_total);
132 if(ths->flags & PRECOMPUTE_DAMP)
133 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
134 ths->z_hat_iter, ths->mv->N_total);
136 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
140 Y(cp_complex)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
142 CSWAP(ths->r_iter,ths->mv->f);
143 ths->mv->mv_trafo(ths->mv);
144 CSWAP(ths->r_iter,ths->mv->f);
146 Y(upd_axpy_complex)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
148 if(ths->flags & NORMS_FOR_LANDWEBER)
150 if(ths->flags & PRECOMPUTE_WEIGHT)
151 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,
154 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
158 if(ths->flags & PRECOMPUTE_WEIGHT)
159 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
161 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
163 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
164 ths->mv->mv_adjoint(ths->mv);
165 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
167 if(ths->flags & NORMS_FOR_LANDWEBER)
169 if(ths->flags & PRECOMPUTE_DAMP)
170 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
173 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter,
181 if(ths->flags & PRECOMPUTE_DAMP)
182 Y(cp_w_complex)(ths->mv->f_hat, ths->w_hat, ths->z_hat_iter,
185 Y(cp_complex)(ths->mv->f_hat, ths->z_hat_iter, ths->mv->N_total);
187 CSWAP(ths->v_iter,ths->mv->f);
188 ths->mv->mv_trafo(ths->mv);
189 CSWAP(ths->v_iter,ths->mv->f);
191 if(ths->flags & PRECOMPUTE_WEIGHT)
192 ths->dot_v_iter = Y(dot_w_complex)(ths->v_iter,ths->w,ths->mv->M_total);
194 ths->dot_v_iter = Y(dot_complex)(ths->v_iter, ths->mv->M_total);
197 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
200 if(ths->flags & PRECOMPUTE_DAMP)
201 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
202 ths->z_hat_iter, ths->mv->N_total);
204 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
208 Y(upd_xpay_complex)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
211 if(ths->flags & PRECOMPUTE_WEIGHT)
212 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,ths->mv->M_total);
214 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
217 if(ths->flags & PRECOMPUTE_WEIGHT)
218 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
220 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
222 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
223 ths->mv->mv_adjoint(ths->mv);
224 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
226 if(ths->flags & PRECOMPUTE_DAMP)
227 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
230 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter, ths->mv->N_total);
236 if(ths->flags & PRECOMPUTE_DAMP)
237 Y(cp_w_complex)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
240 Y(cp_complex)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
242 CSWAP(ths->v_iter,ths->mv->f);
243 ths->mv->mv_trafo(ths->mv);
244 CSWAP(ths->v_iter,ths->mv->f);
246 if(ths->flags & PRECOMPUTE_WEIGHT)
247 ths->dot_v_iter = Y(dot_w_complex)(ths->v_iter,ths->w,ths->mv->M_total);
249 ths->dot_v_iter = Y(dot_complex)(ths->v_iter, ths->mv->M_total);
252 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
255 if(ths->flags & PRECOMPUTE_DAMP)
256 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
257 ths->p_hat_iter, ths->mv->N_total);
259 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
263 Y(upd_xpay_complex)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
266 if(ths->flags & PRECOMPUTE_WEIGHT)
267 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,ths->mv->M_total);
269 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
272 if(ths->flags & PRECOMPUTE_WEIGHT)
273 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
275 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
277 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
278 ths->mv->mv_adjoint(ths->mv);
279 CSWAP(ths->z_hat_iter,ths->mv->f_hat);
281 ths->dot_z_hat_iter_old = ths->dot_z_hat_iter;
282 if(ths->flags & PRECOMPUTE_DAMP)
283 ths->dot_z_hat_iter = Y(dot_w_complex)(ths->z_hat_iter, ths->w_hat,
286 ths->dot_z_hat_iter = Y(dot_complex)(ths->z_hat_iter, ths->mv->N_total);
289 ths->beta_iter = ths->dot_z_hat_iter / ths->dot_z_hat_iter_old;
292 Y(upd_axpy_complex)(ths->p_hat_iter, ths->beta_iter, ths->z_hat_iter,
299 ths->alpha_iter = ths->dot_r_iter / ths->dot_p_hat_iter;
302 if(ths->flags & PRECOMPUTE_DAMP)
303 Y(upd_xpawy_complex)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
304 ths->p_hat_iter, ths->mv->N_total);
306 Y(upd_xpay_complex)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
310 if(ths->flags & PRECOMPUTE_DAMP)
311 Y(cp_w_complex)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
314 Y(cp_complex)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
316 ths->mv->mv_trafo(ths->mv);
318 Y(upd_xpay_complex)(ths->r_iter, -ths->alpha_iter, ths->mv->f,
321 ths->dot_r_iter_old = ths->dot_r_iter;
322 if(ths->flags & PRECOMPUTE_WEIGHT)
323 ths->dot_r_iter = Y(dot_w_complex)(ths->r_iter,ths->w,ths->mv->M_total);
325 ths->dot_r_iter = Y(dot_complex)(ths->r_iter, ths->mv->M_total);
328 ths->beta_iter = ths->dot_r_iter / ths->dot_r_iter_old;
331 if(ths->flags & PRECOMPUTE_WEIGHT)
332 Y(cp_w_complex)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
334 Y(cp_complex)(ths->mv->f, ths->r_iter, ths->mv->M_total);
336 ths->mv->mv_adjoint(ths->mv);
338 Y(upd_axpy_complex)(ths->p_hat_iter, ths->beta_iter, ths->mv->f_hat,
341 if(ths->flags & PRECOMPUTE_DAMP)
342 ths->dot_p_hat_iter = Y(dot_w_complex)(ths->p_hat_iter, ths->w_hat,
345 ths->dot_p_hat_iter = Y(dot_complex)(ths->p_hat_iter, ths->mv->N_total);
349 void X(loop_one_step_complex)(
X(plan_complex) *ths)
351 if(ths->flags & LANDWEBER)
354 if(ths->flags & STEEPEST_DESCENT)
357 if(ths->flags & CGNR)
360 if(ths->flags & CGNE)
365 void X(finalize_complex)(
X(plan_complex) *ths)
367 if(ths->flags & PRECOMPUTE_WEIGHT)
370 if(ths->flags & PRECOMPUTE_DAMP)
373 if(ths->flags & CGNR)
375 Y(free)(ths->v_iter);
376 Y(free)(ths->z_hat_iter);
379 if(ths->flags & STEEPEST_DESCENT)
380 Y(free)(ths->v_iter);
382 Y(free)(ths->p_hat_iter);
383 Y(free)(ths->f_hat_iter);
385 Y(free)(ths->r_iter);
394 void X(init_advanced_double)(
X(plan_double)* ths, Y(mv_plan_double) *mv,
unsigned flags)
399 ths->y = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
400 ths->r_iter = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
401 ths->f_hat_iter = (R*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
402 ths->p_hat_iter = (R*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
404 if(ths->flags & LANDWEBER)
405 ths->z_hat_iter = ths->p_hat_iter;
407 if(ths->flags & STEEPEST_DESCENT)
409 ths->z_hat_iter = ths->p_hat_iter;
410 ths->v_iter = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
413 if(ths->flags & CGNR)
415 ths->z_hat_iter = (R*)Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
416 ths->v_iter = (R*)Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
419 if(ths->flags & CGNE)
420 ths->z_hat_iter = ths->p_hat_iter;
422 if(ths->flags & PRECOMPUTE_WEIGHT)
423 ths->w = (R*) Y(malloc)((size_t)(ths->mv->M_total) *
sizeof(R));
425 if(ths->flags & PRECOMPUTE_DAMP)
426 ths->w_hat = (R*) Y(malloc)((size_t)(ths->mv->N_total) *
sizeof(R));
429 void X(init_double)(
X(plan_double)* ths, Y(mv_plan_double) *mv)
431 X(init_advanced_double)(ths, mv, CGNR);
434 void X(before_loop_double)(
X(plan_double)* ths)
436 Y(cp_double)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
438 RSWAP(ths->r_iter, ths->mv->f);
439 ths->mv->mv_trafo(ths->mv);
440 RSWAP(ths->r_iter, ths->mv->f);
442 Y(upd_axpy_double)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
444 if((!(ths->flags & LANDWEBER)) || (ths->flags & NORMS_FOR_LANDWEBER))
446 if(ths->flags & PRECOMPUTE_WEIGHT)
447 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter, ths->w,
450 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
454 if(ths->flags & PRECOMPUTE_WEIGHT)
455 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
457 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
459 RSWAP(ths->z_hat_iter, ths->mv->f_hat);
460 ths->mv->mv_adjoint(ths->mv);
461 RSWAP(ths->z_hat_iter, ths->mv->f_hat);
463 if((!(ths->flags & LANDWEBER)) || (ths->flags & NORMS_FOR_LANDWEBER))
465 if(ths->flags & PRECOMPUTE_DAMP)
466 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
469 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter,
473 if(ths->flags & CGNE)
474 ths->dot_p_hat_iter = ths->dot_z_hat_iter;
476 if(ths->flags & CGNR)
477 Y(cp_double)(ths->p_hat_iter, ths->z_hat_iter, ths->mv->N_total);
483 if(ths->flags & PRECOMPUTE_DAMP)
484 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
485 ths->z_hat_iter, ths->mv->N_total);
487 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
491 Y(cp_double)(ths->mv->f_hat, ths->f_hat_iter, ths->mv->N_total);
493 RSWAP(ths->r_iter,ths->mv->f);
494 ths->mv->mv_trafo(ths->mv);
495 RSWAP(ths->r_iter,ths->mv->f);
497 Y(upd_axpy_double)(ths->r_iter, K(-1.0), ths->y, ths->mv->M_total);
499 if(ths->flags & NORMS_FOR_LANDWEBER)
501 if(ths->flags & PRECOMPUTE_WEIGHT)
502 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,
505 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
509 if(ths->flags & PRECOMPUTE_WEIGHT)
510 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
512 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
514 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
515 ths->mv->mv_adjoint(ths->mv);
516 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
518 if(ths->flags & NORMS_FOR_LANDWEBER)
520 if(ths->flags & PRECOMPUTE_DAMP)
521 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
524 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter,
532 if(ths->flags & PRECOMPUTE_DAMP)
533 Y(cp_w_double)(ths->mv->f_hat, ths->w_hat, ths->z_hat_iter,
536 Y(cp_double)(ths->mv->f_hat, ths->z_hat_iter, ths->mv->N_total);
538 RSWAP(ths->v_iter,ths->mv->f);
539 ths->mv->mv_trafo(ths->mv);
540 RSWAP(ths->v_iter,ths->mv->f);
542 if(ths->flags & PRECOMPUTE_WEIGHT)
543 ths->dot_v_iter = Y(dot_w_double)(ths->v_iter,ths->w,ths->mv->M_total);
545 ths->dot_v_iter = Y(dot_double)(ths->v_iter, ths->mv->M_total);
548 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
551 if(ths->flags & PRECOMPUTE_DAMP)
552 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
553 ths->z_hat_iter, ths->mv->N_total);
555 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->z_hat_iter,
559 Y(upd_xpay_double)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
562 if(ths->flags & PRECOMPUTE_WEIGHT)
563 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,ths->mv->M_total);
565 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
568 if(ths->flags & PRECOMPUTE_WEIGHT)
569 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
571 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
573 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
574 ths->mv->mv_adjoint(ths->mv);
575 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
577 if(ths->flags & PRECOMPUTE_DAMP)
578 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
581 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter, ths->mv->N_total);
587 if(ths->flags & PRECOMPUTE_DAMP)
588 Y(cp_w_double)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
591 Y(cp_double)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
593 RSWAP(ths->v_iter,ths->mv->f);
594 ths->mv->mv_trafo(ths->mv);
595 RSWAP(ths->v_iter,ths->mv->f);
597 if(ths->flags & PRECOMPUTE_WEIGHT)
598 ths->dot_v_iter = Y(dot_w_double)(ths->v_iter,ths->w,ths->mv->M_total);
600 ths->dot_v_iter = Y(dot_double)(ths->v_iter, ths->mv->M_total);
603 ths->alpha_iter = ths->dot_z_hat_iter / ths->dot_v_iter;
606 if(ths->flags & PRECOMPUTE_DAMP)
607 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
608 ths->p_hat_iter, ths->mv->N_total);
610 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
614 Y(upd_xpay_double)(ths->r_iter, -ths->alpha_iter, ths->v_iter,
617 if(ths->flags & PRECOMPUTE_WEIGHT)
618 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,ths->mv->M_total);
620 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
623 if(ths->flags & PRECOMPUTE_WEIGHT)
624 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
626 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
628 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
629 ths->mv->mv_adjoint(ths->mv);
630 RSWAP(ths->z_hat_iter,ths->mv->f_hat);
632 ths->dot_z_hat_iter_old = ths->dot_z_hat_iter;
633 if(ths->flags & PRECOMPUTE_DAMP)
634 ths->dot_z_hat_iter = Y(dot_w_double)(ths->z_hat_iter, ths->w_hat,
637 ths->dot_z_hat_iter = Y(dot_double)(ths->z_hat_iter, ths->mv->N_total);
640 ths->beta_iter = ths->dot_z_hat_iter / ths->dot_z_hat_iter_old;
643 Y(upd_axpy_double)(ths->p_hat_iter, ths->beta_iter, ths->z_hat_iter,
650 ths->alpha_iter = ths->dot_r_iter / ths->dot_p_hat_iter;
653 if(ths->flags & PRECOMPUTE_DAMP)
654 Y(upd_xpawy_double)(ths->f_hat_iter, ths->alpha_iter, ths->w_hat,
655 ths->p_hat_iter, ths->mv->N_total);
657 Y(upd_xpay_double)(ths->f_hat_iter, ths->alpha_iter, ths->p_hat_iter,
661 if(ths->flags & PRECOMPUTE_DAMP)
662 Y(cp_w_double)(ths->mv->f_hat, ths->w_hat, ths->p_hat_iter,
665 Y(cp_double)(ths->mv->f_hat, ths->p_hat_iter, ths->mv->N_total);
667 ths->mv->mv_trafo(ths->mv);
669 Y(upd_xpay_double)(ths->r_iter, -ths->alpha_iter, ths->mv->f,
672 ths->dot_r_iter_old = ths->dot_r_iter;
673 if(ths->flags & PRECOMPUTE_WEIGHT)
674 ths->dot_r_iter = Y(dot_w_double)(ths->r_iter,ths->w,ths->mv->M_total);
676 ths->dot_r_iter = Y(dot_double)(ths->r_iter, ths->mv->M_total);
679 ths->beta_iter = ths->dot_r_iter / ths->dot_r_iter_old;
682 if(ths->flags & PRECOMPUTE_WEIGHT)
683 Y(cp_w_double)(ths->mv->f, ths->w, ths->r_iter, ths->mv->M_total);
685 Y(cp_double)(ths->mv->f, ths->r_iter, ths->mv->M_total);
687 ths->mv->mv_adjoint(ths->mv);
689 Y(upd_axpy_double)(ths->p_hat_iter, ths->beta_iter, ths->mv->f_hat,
692 if(ths->flags & PRECOMPUTE_DAMP)
693 ths->dot_p_hat_iter = Y(dot_w_double)(ths->p_hat_iter, ths->w_hat,
696 ths->dot_p_hat_iter = Y(dot_double)(ths->p_hat_iter, ths->mv->N_total);
700 void X(loop_one_step_double)(
X(plan_double) *ths)
702 if(ths->flags & LANDWEBER)
705 if(ths->flags & STEEPEST_DESCENT)
708 if(ths->flags & CGNR)
711 if(ths->flags & CGNE)
716 void X(finalize_double)(
X(plan_double) *ths)
718 if(ths->flags & PRECOMPUTE_WEIGHT)
721 if(ths->flags & PRECOMPUTE_DAMP)
724 if(ths->flags & CGNR)
726 Y(free)(ths->v_iter);
727 Y(free)(ths->z_hat_iter);
730 if(ths->flags & STEEPEST_DESCENT)
731 Y(free)(ths->v_iter);
733 Y(free)(ths->p_hat_iter);
734 Y(free)(ths->f_hat_iter);
736 Y(free)(ths->r_iter);
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
static void solver_loop_one_step_steepest_descent_complex(CONCAT(solver_, plan_complex)*ths)
void solver_loop_one_step_steepest_descent
#define CSWAP(x, y)
Swap two vectors.