42 Vector rho(1), rho_1(1), xi(1), gamma(1), gamma_1(1), theta(1), theta_1(1);
43 Vector eta(1), delta(1), ep(1), beta(1);
45 Vector r, v_tld, y, w_tld, z;
46 Vector v, w, y_tld, z_tld;
47 Vector p, q, p_tld, d, s;
56 if ((resid =
norm(r) / normb) <= tol) {
67 z = M2.trans_solve(w_tld);
74 for (
int i = 1; i <= max_iter; i++) {
82 v = (1. / rho(0)) * v_tld;
83 y = (1. / rho(0)) * y;
85 w = (1. / xi(0)) * w_tld;
93 z_tld = M1.trans_solve(z);
96 p = y_tld - (xi(0) * delta(0) / ep(0)) * p;
97 q = z_tld - (rho(0) * delta(0) / ep(0)) * q;
104 ep(0) =
dot(q, p_tld);
108 beta(0) = ep(0) / delta(0);
112 v_tld = p_tld - beta(0) * v;
117 w_tld = A.trans_mult(q) - beta(0) * w;
118 z = M2.trans_solve(w_tld);
122 gamma_1(0) = gamma(0);
123 theta_1(0) = theta(0);
125 theta(0) = rho(0) / (gamma_1(0) * beta(0));
126 gamma(0) = 1.0 / sqrt(1.0 + theta(0) * theta(0));
131 eta(0) = -eta(0) * rho_1(0) * gamma(0) * gamma(0) /
132 (beta(0) * gamma_1(0) * gamma_1(0));
135 d = eta(0) * p + (theta_1(0) * theta_1(0) * gamma(0) * gamma(0)) * d;
136 s = eta(0) * p_tld + (theta_1(0) * theta_1(0) * gamma(0) * gamma(0)) * s;
145 if ((resid =
norm(r) / normb) <= tol) {
A::value_type dot(const A &a, const B &b)
Dot product of array or expression.
A::value_type norm(const A &a)
Euklidean norm of array or expression.