71 #ifndef GMM_SOLVER_CG_H__
72 #define GMM_SOLVER_CG_H__
84 template <
typename Matrix,
typename Matps,
typename Precond,
85 typename Vector1,
typename Vector2>
86 void cg(
const Matrix& A, Vector1& x,
const Vector2& b,
const Matps& PS,
87 const Precond &P, iteration &iter) {
89 typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;
90 typedef typename linalg_traits<Vector1>::value_type T;
93 temp_vector p(vect_size(x)), q(vect_size(x)), r(vect_size(x)),
95 iter.set_rhsnorm(gmm::sqrt(gmm::abs(
vect_hp(PS, b, b))));
97 if (iter.get_rhsnorm() == 0.0)
100 mult(A, scaled(x, T(-1)), b, r);
105 while (!iter.finished_vect(r)) {
110 add(z, scaled(p, rho / rho_1), p);
115 add(scaled(p, a), x);
116 add(scaled(q, -a), r);
124 template <
typename Matrix,
typename Matps,
typename Precond,
125 typename Vector1,
typename Vector2>
126 void cg(
const Matrix& A, Vector1& x,
const Vector2& b,
const Matps& PS,
127 const gmm::identity_matrix &, iteration &iter) {
129 typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;
130 typedef typename linalg_traits<Vector1>::value_type T;
133 temp_vector p(vect_size(x)), q(vect_size(x)), r(vect_size(x));
134 iter.set_rhsnorm(gmm::sqrt(gmm::abs(
vect_hp(PS, b, b))));
136 if (iter.get_rhsnorm() == 0.0)
139 mult(A, scaled(x, T(-1)), b, r);
143 while (!iter.finished_vect(r)) {
147 add(r, scaled(p, rho / rho_1), p);
151 add(scaled(p, a), x);
152 add(scaled(q, -a), r);
159 template <
typename Matrix,
typename Matps,
typename Precond,
160 typename Vector1,
typename Vector2>
inline
161 void cg(
const Matrix& A,
const Vector1& x,
const Vector2& b,
const Matps& PS,
162 const Precond &P, iteration &iter)
163 { cg(A, linalg_const_cast(x), b, PS, P, iter); }
165 template <
typename Matrix,
typename Precond,
166 typename Vector1,
typename Vector2>
inline
167 void cg(
const Matrix& A, Vector1& x,
const Vector2& b,
168 const Precond &P, iteration &iter)
169 { cg(A, x , b, identity_matrix(), P, iter); }
171 template <
typename Matrix,
typename Precond,
172 typename Vector1,
typename Vector2>
inline
173 void cg(
const Matrix& A,
const Vector1& x,
const Vector2& b,
174 const Precond &P, iteration &iter)
175 { cg(A, x , b , identity_matrix(), P , iter); }
180 #endif // GMM_SOLVER_CG_H__