57 bool err_on_no_conv =
true)
69 RealD rho, rho_1, xi, gamma, gamma_1, theta, theta_1;
80 LinOp.
Op(x,r); r = b - r;
84 resid =
norm2(r)/normb;
111 v = (1. / rho) * v_tld;
114 w = (1. / xi) * w_tld;
118 std::cout <<
"Zdelta "<<Zdelta<<std::endl;
119 delta = Zdelta.real();
125 p = y_tld - (xi *
delta / ep) * p;
126 q = z_tld - (rho *
delta / ep) * q;
135 std::cout <<
"Zep "<<Zep <<std::endl;
142 v_tld = p_tld - beta * v;
147 LinOp.
AdjOp(q,w_tld);
148 w_tld = w_tld - beta * w;
156 theta = rho / (gamma_1 * beta);
157 gamma = 1.0 /
sqrt(1.0 + theta * theta);
158 std::cout <<
"theta "<<theta<<std::endl;
159 std::cout <<
"gamma "<<gamma<<std::endl;
161 assert(
abs(gamma)> 0.0);
163 eta = -eta * rho_1 * gamma* gamma / (beta * gamma_1 * gamma_1);
166 d = eta * p + (theta_1 * theta_1 * gamma * gamma) * d;
167 s = eta * p_tld + (theta_1 * theta_1 * gamma * gamma) * s;
179 std::cout <<
"Iteration "<<i<<
" resid " << resid<<std::endl;
192 Field p_m(grid), p_m_minus_1(grid), p_m_minus_2(grid);
193 Field v_m(grid), v_m_minus_1(grid), v_m_plus_1(grid);
198 RealD delta_m, delta_m_minus_1;
199 RealD c_m_plus_1, c_m, c_m_minus_1;
200 RealD s_m_plus_1, s_m, s_m_minus_1;
201 RealD alpha, beta, gamma, epsilon;
202 RealD mu, nu, rho, theta, xi, chi;
221 std::cout <<
"QuasiMinimalResidual rho "<< rho<<std::endl;
226 v_m_minus_1 =
Zero();
227 p_m_minus_1 =
Zero();
228 p_m_minus_2 =
Zero();
236 delta_m_minus_1 = 1.0;
254 std::cout <<
"QuasiMinimalResidual delta_m "<< delta_m<<std::endl;
265 alpha = alpha/delta_m ;
266 std::cout <<
"QuasiMinimalResidual alpha "<< alpha<<std::endl;
271 beta = rho * delta_m / delta_m_minus_1;
272 std::cout <<
"QuasiMinimalResidual beta "<< beta<<std::endl;
277 v_m_plus_1 = tmp - alpha*v_m - beta*v_m_minus_1;
283 std::cout <<
"QuasiMinimalResidual rho "<< rho<<std::endl;
288 v_m_plus_1 = (1.0 / rho) * v_m_plus_1;
293 theta = s_m_minus_1 * beta;
294 gamma = c_m_minus_1 * beta;
295 epsilon = c_m * gamma + s_m * alpha;
296 xi = -s_m * gamma + c_m * alpha;
297 nu =
sqrt( xi*xi + rho*rho );
298 c_m_plus_1 = fabs(xi) / nu;
302 s_m_plus_1 = c_m_plus_1 * rho / xi;
304 chi = c_m_plus_1 * xi + s_m_plus_1 * rho;
306 std::cout <<
"QuasiMinimalResidual coeffs "<< theta <<
" "<<gamma<<
" "<< epsilon<<
" "<< xi<<
" "<< nu<<std::endl;
307 std::cout <<
"QuasiMinimalResidual coeffs "<< chi <<std::endl;
312 p_m = (1.0/chi) * v_m - (epsilon/chi) * p_m_minus_1 - (theta/chi) * p_m_minus_2;
317 x = x + ( c_m_plus_1 * mu ) * p_m;
322 mu = -s_m_plus_1 * mu;
323 delta_m_minus_1 = delta_m;
334 p_m_minus_2 = p_m_minus_1;
341 z1 =
RealD(iter+1.0);
343 tau2 = tau2 *( z2 / z1 ) * s_m * s_m;
344 std::cout <<
" QuasiMinimumResidual iteration "<< iter<<std::endl;
345 std::cout <<
" QuasiMinimumResidual tau bound "<< tau2<<std::endl;
349 if ( 1 || (tau2 < (100.0 * target2)) ) {
353 std::cout <<
" QuasiMinimumResidual true residual is "<< mod2r<<std::endl;
357 if ( mod2r < target2 ) {
359 std::cout <<
" QuasiMinimumResidual has converged"<<std::endl;