70 #ifndef GMM_SOLVER_CG_H__
71 #define GMM_SOLVER_CG_H__
83 template <
typename Matrix,
typename Matps,
typename Precond,
84 typename Vector1,
typename Vector2>
85 void cg(
const Matrix& A, Vector1& x,
const Vector2& b,
const Matps& PS,
86 const Precond &P, iteration &iter) {
88 typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;
89 typedef typename linalg_traits<Vector1>::value_type T;
92 temp_vector p(vect_size(x)), q(vect_size(x)), r(vect_size(x)),
94 iter.set_rhsnorm(gmm::sqrt(gmm::abs(
vect_hp(PS, b, b))));
96 if (iter.get_rhsnorm() == 0.0)
99 mult(A, scaled(x, T(-1)), b, r);
104 while (!iter.finished_vect(r)) {
109 add(z, scaled(p, rho / rho_1), p);
114 add(scaled(p, a), x);
115 add(scaled(q, -a), r);
123 template <
typename Matrix,
typename Matps,
typename Precond,
124 typename Vector1,
typename Vector2>
125 void cg(
const Matrix& A, Vector1& x,
const Vector2& b,
const Matps& PS,
126 const gmm::identity_matrix &, iteration &iter) {
128 typedef typename temporary_dense_vector<Vector1>::vector_type temp_vector;
129 typedef typename linalg_traits<Vector1>::value_type T;
132 temp_vector p(vect_size(x)), q(vect_size(x)), r(vect_size(x));
133 iter.set_rhsnorm(gmm::sqrt(gmm::abs(
vect_hp(PS, b, b))));
135 if (iter.get_rhsnorm() == 0.0)
138 mult(A, scaled(x, T(-1)), b, r);
142 while (!iter.finished_vect(r)) {
146 add(r, scaled(p, rho / rho_1), p);
150 add(scaled(p, a), x);
151 add(scaled(q, -a), r);
158 template <
typename Matrix,
typename Matps,
typename Precond,
159 typename Vector1,
typename Vector2>
inline
160 void cg(
const Matrix& A,
const Vector1& x,
const Vector2& b,
const Matps& PS,
161 const Precond &P, iteration &iter)
162 { cg(A, linalg_const_cast(x), b, PS, P, iter); }
164 template <
typename Matrix,
typename Precond,
165 typename Vector1,
typename Vector2>
inline
166 void cg(
const Matrix& A, Vector1& x,
const Vector2& b,
167 const Precond &P, iteration &iter)
168 { cg(A, x , b, identity_matrix(), P, iter); }
170 template <
typename Matrix,
typename Precond,
171 typename Vector1,
typename Vector2>
inline
172 void cg(
const Matrix& A,
const Vector1& x,
const Vector2& b,
173 const Precond &P, iteration &iter)
174 { cg(A, x , b , identity_matrix(), P , iter); }
void copy(const L1 &l1, L2 &l2)
*/
strongest_value_type< V1, V2 >::value_type vect_hp(const V1 &v1, const V2 &v2)
*/
void clear(L &l)
clear (fill with zeros) a vector or matrix.
void mult(const L1 &l1, const L2 &l2, L3 &l3)
*/
void add(const L1 &l1, L2 &l2)
*/
Include the base gmm files.