00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ITL_CGS_INCLUDE
00013 #define ITL_CGS_INCLUDE
00014
00015 namespace itl {
00016
00017
00018 template < typename LinearOperator, typename Vector,
00019 typename Preconditioner, typename Iteration >
00020 int cgs(const LinearOperator &A, Vector &x, const Vector &b,
00021 const Preconditioner &M, Iteration& iter)
00022 {
00023 typedef typename mtl::Collection<Vector>::value_type Scalar;
00024 Scalar rho_1(0), rho_2(0), alpha(0), beta(0);
00025 Vector p(size(x)), phat(size(x)), q(size(x)), qhat(size(x)), vhat(size(x)),
00026 u(size(x)), uhat(size(x)), r(b - A * x), rtilde= r;
00027
00028
00029 while (! iter.finished(r)) {
00030 rho_1= dot(rtilde, r);
00031
00032 if (rho_1 == 0.) {
00033 iter.fail(2, "cgs breakdown");
00034 break;
00035 }
00036
00037 if (iter.first())
00038 p= u= r;
00039 else {
00040 beta = rho_1 / rho_2;
00041 u= r + beta * q;
00042 p= u + beta * (q + beta * p);
00043 }
00044
00045 vhat= A * solve(M, p);
00046 alpha = rho_1 / dot(rtilde, vhat);
00047 q= u - alpha * vhat;
00048
00049 u+= q;
00050 uhat= solve(M, u);
00051
00052 x+= alpha * uhat;
00053 qhat= A * uhat;
00054 r-= alpha * qhat;
00055
00056 rho_2 = rho_1;
00057
00058 ++iter;
00059 }
00060 return iter.error_code();
00061 }
00062
00063 }
00064
00065 #endif // ITL_CGS_INCLUDE
00066
00067
00068