TBCI Numerical high perf. C++ Library  2.8.0
bicg.h
Go to the documentation of this file.
1 
4 /* $Id: bicg.h,v 1.8.2.6 2019/05/28 11:13:02 garloff Exp $ */
5 
6 #ifndef TBCI_SOLVER_BICG_H
7 #define TBCI_SOLVER_BICG_H
8 
9 #include "tbci/basics.h"
10 
11 #if !defined(NO_GD) && !defined(AUTO_DECL)
12 # include "tbci/solver/bicg_gd.h"
13 #endif
14 
16 
17 INST3(template <typename T, Matrix<T>, Vector<T> > class NN friend \
18 int BiCG(const Matrix<T>&, Vector<T>&, const Vector<T>&,\
19  const Preconditioner_Sig<T, Matrix<T> >&, unsigned int&, double&);)
20 INST3(template <typename T, BdMatrix<T>, Vector<T> > class NN friend \
21 int BiCG(const BdMatrix<T>&, Vector<T>&, const Vector<T>&,\
22  const Preconditioner_Sig<T, BdMatrix<T> >&, unsigned int&, double&);)
23 
45 //Aenderung Marco:
46 template <typename T, typename SysMatrix, typename SysVector>
47 int BiCG(const SysMatrix& A, SysVector& x, const SysVector& b,
48  const Preconditioner_Sig<T, SysMatrix>& M, unsigned int& max_iter, double& tol)
49 {
50  unsigned int dim = A.rows();
51  typename SysVector::value_type rho_1, rho_2(0), alpha, beta;
52  SysVector z(dim), ztilde(dim), p(dim), ptilde(dim), q(dim), qtilde(dim);
53 
54  double residsqr;
55  const double tolsqr = sqr(tol);
56  double normbsqr = b.fabssqr();
57 
58  if (normbsqr < 1e-32)
59  normbsqr = 1e32;
60  else
61  normbsqr = 1.0 / normbsqr;
62 
63  SysVector r(b - A * x);
64  SysVector rtilde(conj(r));
65 
66  if ((residsqr = r.fabssqr() * normbsqr) <= tolsqr) {
67  tol = MATH__ sqrt(residsqr);
68  max_iter = 0;
69  return 0;
70  }
71 
72  for (unsigned int i = 1; i <= max_iter; ++i) {
73  z = M./*trans*/solve(r);
74  ztilde = M.transSolve(rtilde);
75  rho_1 = z * rtilde;
76  if (rho_1 == (typename SysVector::value_type)0) {
77  tol = MATH__ sqrt(r.fabssqr() * normbsqr);
78  max_iter = i;
79  return 2;
80  }
81  if (UNLIKELY(i == 1)) {
82  p = z;
83  ptilde = ztilde;
84  } else {
85  beta = rho_1 / rho_2;
86  p = z + beta * p;
87  ptilde = ztilde + beta * ptilde;
88  }
89 
90  q = A * p;
91  qtilde = A.transMult(ptilde);
92  alpha = rho_1 / (q * ptilde);
93  x += alpha * p;
94  r -= alpha * q;
95  rtilde -= alpha * qtilde;
96 
97  rho_2 = rho_1;
98  if ((residsqr = r.fabssqr() * normbsqr) < tolsqr) {
99  tol = MATH__ sqrt(residsqr);
100  max_iter = i;
101  return 0;
102  }
103  }
104 
105  tol = MATH__ sqrt(residsqr);
106  return 1;
107 }
108 
110 
111 #endif /* TBCI_SOLVER_BICG_H */
const Vector< T > const Vector< T > & x
Definition: LM_fit.h:97
Abstract base class for all Preconditioners.
Definition: precond.h:40
const Vector< T > const Vector< T > const Vector< T > & p
Definition: LM_fit.h:97
The class BdMatrix is an implementation to store and do operations on sparse Matrices with a band str...
Definition: band_matrix.h:103
virtual TVector< T > transSolve(const Vector< T > &) const =0
#define NAMESPACE_TBCI
Definition: basics.h:317
#define UNLIKELY(expr)
Definition: basics.h:101
const Vector< T > Vector< T > Vector< T > Vector< T > Vector< T > & z
Definition: LM_fit.h:172
double sqrt(const int a)
Definition: basics.h:1216
cplx< T > sqr(const cplx< T > &c)
Definition: cplx.h:449
F_TMatrix< T > b
Definition: f_matrix.h:736
int conj(const int arg)
conj for elementary types
Definition: basics.h:1055
#define INST3(x, y, z)
Definition: basics.h:240
Definition: bvector.h:49
int i
Definition: LM_fit.h:71
SysMatrix
Definition: bicgstab.h:90
virtual TVector< T > solve(const Vector< T > &) const =0
NAMESPACE_TBCI Vector< T > class NN friend int BiCG(const BdMatrix< T > &, Vector< T > &, const Vector< T > &, const Preconditioner_Sig< T, BdMatrix< T > > &, unsigned int &, double &)
#define NAMESPACE_END
Definition: basics.h:323
Definition: bvector.h:54
#define T
Definition: bdmatlib.cc:20
#define MATH__
Definition: basics.h:339