NiHu  2.0
preconditioner.hpp
1 #ifndef PRECONDITIONER_HPP_INCLUDED
2 #define PRECONDITIONER_HPP_INCLUDED
3 
4 namespace NiHu
5 {
6 namespace fmm
7 {
8 
9 template <class Scalar>
11 {
12 public:
13  typedef Scalar scalar_t;
14  typedef Eigen::Matrix<scalar_t, Eigen::Dynamic, 1> vector_t;
15 
17  {
18  }
19 
20  template<typename MatrixType>
21  explicit diagonal_preconditioner(MatrixType const &mat)
22  : m_inv_diag(mat.cols())
23  {
24  compute(mat);
25  }
26 
27  template<typename MatrixType>
28  diagonal_preconditioner& analyzePattern(const MatrixType&)
29  {
30  return *this;
31  }
32 
33  template<typename MatrixType>
34  diagonal_preconditioner& factorize(MatrixType const &mat)
35  {
36  m_inv_diag = mat.get_diagonal();
37  for (size_t i = 0; i < m_inv_diag.rows(); ++i)
38  m_inv_diag(i, 0) = 1.0 / m_inv_diag(i, 0);
39  return *this;
40  }
41 
42  template<typename MatrixType>
43  diagonal_preconditioner& compute(MatrixType const &mat)
44  {
45  return factorize(mat);
46  }
47 
48  template<typename Rhs>
49  inline vector_t solve(Rhs const &b) const
50  {
51  return m_inv_diag.array() * b.array() ;
52  }
53 
54  Eigen::ComputationInfo info()
55  {
56  return Eigen::Success;
57  }
58 
59 private:
60  vector_t m_inv_diag;
61 };
62 
63 } // end of namespace fmm
64 } // namespace NiHu
65 
66 #endif
NiHu::fmm::diagonal_preconditioner
Definition: preconditioner.hpp:10