BiCGSTAB.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2011-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_BICGSTAB_H
12 #define EIGEN_BICGSTAB_H
13 
14 // IWYU pragma: private
15 #include "./InternalHeaderCheck.h"
16 
17 namespace Eigen {
18 
19 namespace internal {
20 
31 template <typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
32 bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x, const Preconditioner& precond, Index& iters,
33  typename Dest::RealScalar& tol_error) {
34  using std::abs;
35  using std::sqrt;
36  typedef typename Dest::RealScalar RealScalar;
37  typedef typename Dest::Scalar Scalar;
39  RealScalar tol = tol_error;
40  Index maxIters = iters;
41 
42  Index n = mat.cols();
43  VectorType r = rhs - mat * x;
44  VectorType r0 = r;
45 
46  RealScalar r0_sqnorm = r0.squaredNorm();
47  RealScalar rhs_sqnorm = rhs.squaredNorm();
48  if (rhs_sqnorm == 0) {
49  x.setZero();
50  return true;
51  }
52  Scalar rho(1);
53  Scalar alpha(1);
54  Scalar w(1);
55 
57  VectorType y(n), z(n);
58  VectorType kt(n), ks(n);
59 
60  VectorType s(n), t(n);
61 
62  RealScalar tol2 = tol * tol * rhs_sqnorm;
64  Index i = 0;
65  Index restarts = 0;
66 
67  while (r.squaredNorm() > tol2 && i < maxIters) {
68  Scalar rho_old = rho;
69 
70  rho = r0.dot(r);
71  if (abs(rho) < eps2 * r0_sqnorm) {
72  // The new residual vector became too orthogonal to the arbitrarily chosen direction r0
73  // Let's restart with a new r0:
74  r = rhs - mat * x;
75  r0 = r;
76  rho = r0_sqnorm = r.squaredNorm();
77  if (restarts++ == 0) i = 0;
78  }
79  Scalar beta = (rho / rho_old) * (alpha / w);
80  p = r + beta * (p - w * v);
81 
82  y = precond.solve(p);
83 
84  v.noalias() = mat * y;
85 
86  alpha = rho / r0.dot(v);
87  s = r - alpha * v;
88 
89  z = precond.solve(s);
90  t.noalias() = mat * z;
91 
92  RealScalar tmp = t.squaredNorm();
93  if (tmp > RealScalar(0))
94  w = t.dot(s) / tmp;
95  else
96  w = Scalar(0);
97  x += alpha * y + w * z;
98  r = s - w * t;
99  ++i;
100  }
101  tol_error = sqrt(r.squaredNorm() / rhs_sqnorm);
102  iters = i;
103  return true;
104 }
105 
106 } // namespace internal
107 
108 template <typename MatrixType_, typename Preconditioner_ = DiagonalPreconditioner<typename MatrixType_::Scalar> >
109 class BiCGSTAB;
110 
111 namespace internal {
112 
113 template <typename MatrixType_, typename Preconditioner_>
114 struct traits<BiCGSTAB<MatrixType_, Preconditioner_> > {
115  typedef MatrixType_ MatrixType;
116  typedef Preconditioner_ Preconditioner;
117 };
118 
119 } // namespace internal
120 
152 template <typename MatrixType_, typename Preconditioner_>
153 class BiCGSTAB : public IterativeSolverBase<BiCGSTAB<MatrixType_, Preconditioner_> > {
155  using Base::m_error;
156  using Base::m_info;
157  using Base::m_isInitialized;
158  using Base::m_iterations;
159  using Base::matrix;
160 
161  public:
162  typedef MatrixType_ MatrixType;
163  typedef typename MatrixType::Scalar Scalar;
165  typedef Preconditioner_ Preconditioner;
166 
167  public:
169  BiCGSTAB() : Base() {}
170 
181  template <typename MatrixDerived>
182  explicit BiCGSTAB(const EigenBase<MatrixDerived>& A) : Base(A.derived()) {}
183 
185 
187  template <typename Rhs, typename Dest>
188  void _solve_vector_with_guess_impl(const Rhs& b, Dest& x) const {
191 
193 
195  }
196 
197  protected:
198 };
199 
200 } // end namespace Eigen
201 
202 #endif // EIGEN_BICGSTAB_H
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
RowVector3d w
Definition: Matrix_resize_int.cpp:3
float * p
Definition: Tutorial_Map_using.cpp:9
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
A bi conjugate gradient stabilized solver for sparse square problems.
Definition: BiCGSTAB.h:153
MatrixType_ MatrixType
Definition: BiCGSTAB.h:162
~BiCGSTAB()
Definition: BiCGSTAB.h:184
ComputationInfo m_info
Definition: IterativeSolverBase.h:389
BiCGSTAB(const EigenBase< MatrixDerived > &A)
Definition: BiCGSTAB.h:182
MatrixType::Scalar Scalar
Definition: BiCGSTAB.h:163
void _solve_vector_with_guess_impl(const Rhs &b, Dest &x) const
Definition: BiCGSTAB.h:188
BiCGSTAB()
Definition: BiCGSTAB.h:169
RealScalar m_error
Definition: IterativeSolverBase.h:387
Index m_iterations
Definition: IterativeSolverBase.h:388
IterativeSolverBase< BiCGSTAB > Base
Definition: BiCGSTAB.h:154
Preconditioner_ Preconditioner
Definition: BiCGSTAB.h:165
MatrixType::RealScalar RealScalar
Definition: BiCGSTAB.h:164
const ActualMatrixType & matrix() const
Definition: IterativeSolverBase.h:374
Base class for linear iterative solvers.
Definition: IterativeSolverBase.h:124
Index maxIterations() const
Definition: IterativeSolverBase.h:251
ComputationInfo m_info
Definition: IterativeSolverBase.h:389
RealScalar m_error
Definition: IterativeSolverBase.h:387
Preconditioner m_preconditioner
Definition: IterativeSolverBase.h:382
Index m_iterations
Definition: IterativeSolverBase.h:388
bool m_isInitialized
Definition: SparseSolverBase.h:110
RealScalar m_tolerance
Definition: IterativeSolverBase.h:385
BiCGSTAB< MatrixType_, Preconditioner_ > & derived()
Definition: SparseSolverBase.h:76
const ActualMatrixType & matrix() const
Definition: IterativeSolverBase.h:374
Index cols() const
Definition: SparseMatrix.h:161
@ NumericalIssue
Definition: Constants.h:442
@ Success
Definition: Constants.h:440
@ NoConvergence
Definition: Constants.h:444
RealScalar s
Definition: level1_cplx_impl.h:130
Eigen::DenseIndex ret
Definition: level1_cplx_impl.h:43
RealScalar alpha
Definition: level1_cplx_impl.h:151
Scalar beta
Definition: level2_cplx_impl.h:36
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
@ Rhs
Definition: TensorContractionMapper.h:20
const Scalar & y
Definition: RandomImpl.h:36
bool bicgstab(const MatrixType &mat, const Rhs &rhs, Dest &x, const Preconditioner &precond, Index &iters, typename Dest::RealScalar &tol_error)
Definition: BiCGSTAB.h:32
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
unsigned Preconditioner
----------------------—Domain Properties------------------------—
Definition: space_time_oscillating_cylinder.cc:725
r
Definition: UniformPSDSelfTest.py:20
Definition: Eigen_Colamd.h:49
double Zero
Definition: pseudosolid_node_update_elements.cc:35
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
list x
Definition: plotDoE.py:28
t
Definition: plotPSD.py:36
Definition: EigenBase.h:33
Preconditioner_ Preconditioner
Definition: BiCGSTAB.h:116
Definition: ForwardDeclarations.h:21
Definition: fft_test_shared.h:66