61 psi.Checkerboard() = src.Checkerboard();
64 RealD cp(0), rho(1), rho_prev(0), alpha(1), beta(0), omega(1);
65 RealD a(0), bo(0), b(0), ssq(0);
80 assert(std::isnan(guess) == 0);
90 std::cout <<
GridLogIterative << std::setprecision(8) <<
"BiCGSTAB: guess " << guess << std::endl;
91 std::cout <<
GridLogIterative << std::setprecision(8) <<
"BiCGSTAB: src " << ssq << std::endl;
92 std::cout <<
GridLogIterative << std::setprecision(8) <<
"BiCGSTAB: mp " << b << std::endl;
93 std::cout <<
GridLogIterative << std::setprecision(8) <<
"BiCGSTAB: r " << a << std::endl;
98 if(a <= rsq){
return; }
100 std::cout <<
GridLogIterative << std::setprecision(8) <<
"BiCGSTAB: k=0 residual " << a <<
" target " << rsq << std::endl;
121 beta = (rho / rho_prev) * (alpha / omega);
123 LinearCombTimer.
Start();
130 coalescedWrite(p_v[ss], beta*p_v(ss) - bo*v_v(ss) + r_v(ss));
133 LinearCombTimer.
Stop();
144 alpha = rho / Calpha.real();
146 LinearCombTimer.
Start();
155 coalescedWrite(h_v[ss], alpha*p_v(ss) + psi_v(ss));
158 coalescedWrite(s_v[ss], -alpha*v_v(ss) + r_v(ss));
161 LinearCombTimer.
Stop();
172 omega = Comega.real() /
norm2(t);
174 LinearCombTimer.
Start();
182 coalescedWrite(psi_v[ss], h_v(ss) + omega * s_v(ss));
183 coalescedWrite(r_v[ss], -omega * t_v(ss) + s_v(ss));
186 LinearCombTimer.
Stop();
202 RealD true_residual = resnorm / srcnorm;
204 std::cout <<
GridLogMessage <<
"BiCGSTAB Converged on iteration " << k << std::endl;
206 std::cout <<
GridLogMessage <<
"\tTrue residual " << true_residual << std::endl;
225 std::cout <<
GridLogMessage <<
"BiCGSTAB did NOT converge" << std::endl;