OGS
TimeDiscretization.h
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <vector>
14 
15 #include "MathLib/LinAlg/LinAlg.h"
17 #include "Types.h"
18 
19 namespace NumLib
20 {
23 
93 {
94 public:
95  TimeDiscretization() = default;
96 
98  virtual void setInitialState(const double t0) = 0;
99 
113  GlobalVector const& x,
114  GlobalVector const& x_old,
115  MathLib::VecNormType norm_type);
116 
123  virtual void nextTimestep(const double t, const double delta_t) = 0;
124 
127  virtual double getCurrentTime() const = 0;
128 
131  virtual double getCurrentTimeIncrement() const = 0;
132 
135  void getXdot(GlobalVector const& x_at_new_timestep,
136  GlobalVector const& x_old,
137  GlobalVector& xdot) const
138  {
139  namespace LinAlg = MathLib::LinAlg;
140 
141  auto const dxdot_dx = getNewXWeight();
142 
143  // xdot = dxdot_dx * x_at_new_timestep - x_old
144  getWeightedOldX(xdot, x_old);
145  LinAlg::axpby(xdot, dxdot_dx, -1.0, x_at_new_timestep);
146  }
147 
149  virtual double getNewXWeight() const = 0;
150 
152  virtual void getWeightedOldX(
153  GlobalVector& y, GlobalVector const& x_old) const = 0; // = x_old
154 
155  virtual ~TimeDiscretization() = default;
156 
157 protected:
158  std::unique_ptr<GlobalVector> _dx;
159 };
160 
162 class BackwardEuler final : public TimeDiscretization
163 {
164 public:
165  void setInitialState(const double t0) override { _t = t0; }
166 
167  void nextTimestep(const double t, const double delta_t) override
168  {
169  _t = t;
170  _delta_t = delta_t;
171  }
172 
173  double getCurrentTime() const override { return _t; }
174  double getCurrentTimeIncrement() const override { return _delta_t; }
175  double getNewXWeight() const override { return 1.0 / _delta_t; }
177  GlobalVector const& x_old) const override
178  {
179  namespace LinAlg = MathLib::LinAlg;
180 
181  // y = x_old / delta_t
182  LinAlg::copy(x_old, y);
183  LinAlg::scale(y, 1.0 / _delta_t);
184  }
185 
186 private:
187  double _t = std::numeric_limits<double>::quiet_NaN();
188  double _delta_t =
189  std::numeric_limits<double>::quiet_NaN();
190 };
191 
193 } // namespace NumLib
Global vector based on Eigen vector.
Definition: EigenVector.h:26
Backward Euler scheme.
double getCurrentTime() const override
void setInitialState(const double t0) override
Sets the initial condition.
void getWeightedOldX(GlobalVector &y, GlobalVector const &x_old) const override
Returns .
double getNewXWeight() const override
Returns .
void nextTimestep(const double t, const double delta_t) override
double _delta_t
the timestep size
double getCurrentTimeIncrement() const override
void getXdot(GlobalVector const &x_at_new_timestep, GlobalVector const &x_old, GlobalVector &xdot) const
double computeRelativeChangeFromPreviousTimestep(GlobalVector const &x, GlobalVector const &x_old, MathLib::VecNormType norm_type)
virtual void setInitialState(const double t0)=0
Sets the initial condition.
virtual double getCurrentTimeIncrement() const =0
virtual void nextTimestep(const double t, const double delta_t)=0
std::unique_ptr< GlobalVector > _dx
Used to store .
virtual double getNewXWeight() const =0
Returns .
virtual double getCurrentTime() const =0
virtual ~TimeDiscretization()=default
virtual void getWeightedOldX(GlobalVector &y, GlobalVector const &x_old) const =0
Returns .
void scale(PETScVector &x, double const a)
Definition: LinAlg.cpp:44
void copy(PETScVector const &x, PETScVector &y)
Definition: LinAlg.cpp:37
void axpby(PETScVector &y, double const a, double const b, PETScVector const &x)
Definition: LinAlg.cpp:64
VecNormType
Norm type. Not declared as class type in order to use the members as integers.
Definition: LinAlgEnums.h:22