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
17INST3(template <typename T, Matrix<T>, Vector<T> > class NN friend \
18int BiCG(const Matrix<T>&, Vector<T>&, const Vector<T>&,\
19 const Preconditioner_Sig<T, Matrix<T> >&, unsigned int&, double&);)
20INST3(template <typename T, BdMatrix<T>, Vector<T> > class NN friend \
21int BiCG(const BdMatrix<T>&, Vector<T>&, const Vector<T>&,\
22 const Preconditioner_Sig<T, BdMatrix<T> >&, unsigned int&, double&);)
23
44
45//Aenderung Marco:
46template <typename T, typename SysMatrix, typename SysVector>
47int 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 > const Vector< T > & p
Definition LM_fit.h:98
const Vector< T > const Vector< T > & x
Definition LM_fit.h:97
int i
Definition LM_fit.h:71
#define INST3(x, y, z)
Definition basics.h:240
#define NAMESPACE_END
Definition basics.h:323
#define NAMESPACE_TBCI
Definition basics.h:317
#define UNLIKELY(expr)
Definition basics.h:101
#define MATH__
Definition basics.h:339
#define T
Definition bdmatlib.cc:20
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 &)
SysMatrix
Definition bicgstab.h:90
The class BdMatrix is an implementation to store and do operations on sparse Matrices with a band str...
Abstract base class for all Preconditioners.
Definition precond.h:41
virtual TVector< T > solve(const Vector< T > &) const =0
virtual TVector< T > transSolve(const Vector< T > &) const =0
cplx< T > sqr(const cplx< T > &c)
Definition cplx.h:449
NAMESPACE_END NAMESPACE_CPLX TBCI__ cplx< T > conj(const TBCI__ cplx< T > &c)
Definition cplx.h:663
NAMESPACE_END NAMESPACE_CSTD TBCI__ cplx< T > sqrt(const TBCI__ cplx< T > &z)
Definition cplx.h:751
F_TMatrix< T > b
Definition f_matrix.h:736