OGS  master
MatrixTranslator.h
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <memory>
14 
15 #include "MathLib/LinAlg/LinAlg.h"
16 #include "TimeDiscretization.h"
17 #include "Types.h"
18 
19 namespace NumLib
20 {
23 
30 template <ODESystemTag ODETag>
32 
39 template <>
41 {
42 public:
44  virtual void computeA(GlobalMatrix const& M, GlobalMatrix const& K,
45  GlobalMatrix& A) const = 0;
46 
48  virtual void computeRhs(const GlobalMatrix& M, const GlobalMatrix& K,
49  const GlobalVector& b, const GlobalVector& x_prev,
50  GlobalVector& rhs) const = 0;
51 
56  virtual void computeResidual(GlobalMatrix const& M, GlobalMatrix const& K,
57  GlobalVector const& b,
58  GlobalVector const& x_curr,
59  GlobalVector const& xdot,
60  GlobalVector& res) const = 0;
61 
63  virtual void computeJacobian(GlobalMatrix const& Jac_in,
64  GlobalMatrix& Jac_out) const = 0;
65 
66  virtual ~MatrixTranslator() = default;
67 };
68 
74 template <ODESystemTag ODETag>
76 
85 template <>
87  : public MatrixTranslator<ODESystemTag::FirstOrderImplicitQuasilinear>
88 {
89 public:
94  explicit MatrixTranslatorGeneral(TimeDiscretization const& timeDisc)
95  : _time_disc(timeDisc)
96  {
97  }
98 
100  void computeA(GlobalMatrix const& M, GlobalMatrix const& K,
101  GlobalMatrix& A) const override;
102 
104  void computeRhs(const GlobalMatrix& M, const GlobalMatrix& /*K*/,
105  const GlobalVector& b, const GlobalVector& x_prev,
106  GlobalVector& rhs) const override;
107 
109  void computeResidual(GlobalMatrix const& M, GlobalMatrix const& K,
110  GlobalVector const& b, GlobalVector const& x_curr,
111  GlobalVector const& xdot,
112  GlobalVector& res) const override;
113 
116  void computeJacobian(GlobalMatrix const& Jac_in,
117  GlobalMatrix& Jac_out) const override;
118 
119 private:
121 
123  mutable std::size_t _tmp_id = 0u;
124 };
125 
128 template <ODESystemTag ODETag>
129 std::unique_ptr<MatrixTranslator<ODETag>> createMatrixTranslator(
130  TimeDiscretization const& timeDisc)
131 {
132  return std::unique_ptr<MatrixTranslator<ODETag>>(
133  new MatrixTranslatorGeneral<ODETag>(timeDisc));
134 }
135 
137 } // namespace NumLib
Global vector based on Eigen vector.
Definition: EigenVector.h:27
TimeDiscretization const & _time_disc
the time discretization used.
virtual void computeJacobian(GlobalMatrix const &Jac_in, GlobalMatrix &Jac_out) const =0
Computes the Jacobian of the residual and writes it to Jac_out.
virtual void computeA(GlobalMatrix const &M, GlobalMatrix const &K, GlobalMatrix &A) const =0
Computes A from M and K.
virtual void computeResidual(GlobalMatrix const &M, GlobalMatrix const &K, GlobalVector const &b, GlobalVector const &x_curr, GlobalVector const &xdot, GlobalVector &res) const =0
virtual void computeRhs(const GlobalMatrix &M, const GlobalMatrix &K, const GlobalVector &b, const GlobalVector &x_prev, GlobalVector &rhs) const =0
Computes rhs from M, K, b and x_prev.
ODESystemTag
Tag used to specify the type of ODE.
Definition: Types.h:27
std::unique_ptr< MatrixTranslator< ODETag > > createMatrixTranslator(TimeDiscretization const &timeDisc)