NUMCXX  0.13.20181108
Numerical library for small projects and teaching purposes
bicgstab.hxx
Go to the documentation of this file.
1 namespace netlib
2 {
3 
25 
26 
27  template < class Matrix, class Vector, class Preconditioner, class Real >
28  int
29  BiCGSTAB(const Matrix &A, Vector &x, const Vector &b,
30  const Preconditioner &M, int &max_iter, Real &tol)
31  {
32  Real resid;
33  Vector rho_1(1), rho_2(1), alpha(1), beta(1), omega(1);
34  Vector p, phat, s, shat, t, v;
35 
36  Real normb = norm(b);
37  Vector r = b - A * x;
38  Vector rtilde = r;
39 
40  if (normb == 0.0)
41  normb = 1;
42 
43  if ((resid = norm(r) / normb) <= tol) {
44  tol = resid;
45  max_iter = 0;
46  return 0;
47  }
48 
49  for (int i = 1; i <= max_iter; i++) {
50  rho_1(0) = dot(rtilde, r);
51  if (rho_1(0) == 0) {
52  tol = norm(r) / normb;
53  return 2;
54  }
55  if (i == 1)
56  p = r;
57  else {
58  beta(0) = (rho_1(0)/rho_2(0)) * (alpha(0)/omega(0));
59  p = r + beta(0) * (p - omega(0) * v);
60  }
61  // numcxx: was
62  // phat = M.solve(p);
63  M.solve(phat,p);
64  v = A * phat;
65  alpha(0) = rho_1(0) / dot(rtilde, v);
66  s = r - alpha(0) * v;
67  if ((resid = norm(s)/normb) < tol) {
68  x += alpha(0) * phat;
69  tol = resid;
70  return 0;
71  }
72  // numcxx: was
73  //shat = M.solve(s);
74  M.solve(shat,s);
75  t = A * shat;
76  omega = dot(t,s) / dot(t,t);
77  x += alpha(0) * phat + omega(0) * shat;
78  r = s - omega(0) * t;
79 
80  rho_2(0) = rho_1(0);
81  if ((resid = norm(r) / normb) < tol) {
82  tol = resid;
83  max_iter = i;
84  return 0;
85  }
86  if (omega(0) == 0) {
87  tol = norm(r) / normb;
88  return 3;
89  }
90  }
91 
92  tol = resid;
93  return 1;
94  }
95 }
int BiCGSTAB(const Matrix &A, Vector &x, const Vector &b, const Preconditioner &M, int &max_iter, Real &tol)
Iterative template routine – BiCGSTAB.
Definition: bicgstab.hxx:29
Iterative template routines.
Definition: bicgstab.hxx:1
A::value_type dot(const A &a, const B &b)
Dot product of array or expression.
Definition: util.ixx:91
A::value_type norm(const A &a)
Euklidean norm of array or expression.
Definition: util.hxx:54