OGS 6.2.1-499-g3b941532c.dirty.20191012113459
NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard > Class Template Referencefinal

Detailed Description

template<>
class NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >

Time discretized first order implicit quasi-linear ODE; to be solved using the Picard fixpoint iteration method for resolving nonlinearities.

See also
ODESystemTag::FirstOrderImplicitQuasilinear

Definition at line 161 of file TimeDiscretizedODESystem.h.

#include <TimeDiscretizedODESystem.h>

Inheritance diagram for NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >:
Collaboration diagram for NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >:

Public Types

using ODE = ODESystem< ODETag, NonlinearSolverTag::Picard >
 The type of ODE. More...
 
using MatTrans = MatrixTranslator< ODETag >
 
using TimeDisc = TimeDiscretization
 A shortcut for a general time discretization scheme. More...
 

Public Member Functions

 TimeDiscretizedODESystem (const int process_id, ODE &ode, TimeDisc &time_discretization)
 Constructs a new instance. More...
 
 ~TimeDiscretizedODESystem () override
 
void assemble (std::vector< GlobalVector *> const &x_new_timestep, int const process_id) override
 
void getA (GlobalMatrix &A) const override
 
void getRhs (GlobalVector &rhs) const override
 
void computeKnownSolutions (GlobalVector const &x, int const process_id) override
 
void applyKnownSolutions (GlobalVector &x) const override
 
void applyKnownSolutionsPicard (GlobalMatrix &A, GlobalVector &rhs, GlobalVector &x) const override
 
bool isLinear () const override
 
void preIteration (const unsigned iter, GlobalVector const &x) override
 
IterationResult postIteration (GlobalVector const &x) override
 
void pushMatrices () const override
 
TimeDiscgetTimeDiscretization () override
 Exposes the used time discretization scheme. More...
 
MathLib::MatrixSpecifications getMatrixSpecifications (const int process_id) const override
 
- Public Member Functions inherited from NumLib::InternalMatrixStorage
virtual ~InternalMatrixStorage ()=default
 

Static Public Attributes

static const ODESystemTag ODETag
 A tag indicating the type of ODE. More...
 

Private Types

using Index = MathLib::MatrixVectorTraits< GlobalMatrix >::Index
 

Private Attributes

ODE_ode
 ode the ODE being wrapped More...
 
TimeDisc_time_disc
 the time discretization to being used More...
 
std::unique_ptr< MatTrans_mat_trans
 the object used to compute the matrix/vector for the nonlinear solver More...
 
std::vector< NumLib::IndexValueVector< Index > > const * _known_solutions
 stores precomputed values for known solutions More...
 
GlobalMatrix * _M
 Matrix $ M $. More...
 
GlobalMatrix * _K
 Matrix $ K $. More...
 
GlobalVector * _b
 Matrix $ b $. More...
 
std::size_t _M_id = 0u
 ID of the _M matrix. More...
 
std::size_t _K_id = 0u
 ID of the _K matrix. More...
 
std::size_t _b_id = 0u
 ID of the _b vector. More...
 

Member Typedef Documentation

◆ Index

◆ MatTrans

The auxiliary class that computes the matrix/vector used by the nonlinear solver.

Definition at line 174 of file TimeDiscretizedODESystem.h.

◆ ODE

◆ TimeDisc

Constructor & Destructor Documentation

◆ TimeDiscretizedODESystem()

Constructs a new instance.

Definition at line 168 of file TimeDiscretizedODESystem.cpp.

References NumLib::FirstOrderImplicitQuasilinear, NumLib::MatrixProvider::getMatrix(), NumLib::VectorProvider::getVector(), NumLib::GlobalVectorProvider::provider, and NumLib::GlobalMatrixProvider::provider.

170  : _ode(ode),
171  _time_disc(time_discretization),
172  _mat_trans(createMatrixTranslator<ODETag>(time_discretization))
173 {
175  ode.getMatrixSpecifications(process_id), _M_id);
177  ode.getMatrixSpecifications(process_id), _K_id);
179  ode.getMatrixSpecifications(process_id), _b_id);
180 }
virtual GlobalVector & getVector()=0
Get an uninitialized vector.
static NUMLIB_EXPORT MatrixProvider & provider
static NUMLIB_EXPORT VectorProvider & provider
virtual GlobalMatrix & getMatrix()=0
Get an uninitialized matrix.
std::unique_ptr< MatTrans > _mat_trans
the object used to compute the matrix/vector for the nonlinear solver

◆ ~TimeDiscretizedODESystem()

Member Function Documentation

◆ applyKnownSolutions()

void NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >::applyKnownSolutions ( GlobalVector &  x) const
override

Definition at line 225 of file TimeDiscretizedODESystem.cpp.

References detail::applyKnownSolutions(), NumLib::FirstOrderImplicitQuasilinear, and NumLib::Picard.

226 {
228 }
void applyKnownSolutions(std::vector< Solutions > const *const known_solutions, Vector &x)
Applies known solutions to the solution vector x.
std::vector< NumLib::IndexValueVector< Index > > const * _known_solutions
stores precomputed values for known solutions

◆ applyKnownSolutionsPicard()

void NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >::applyKnownSolutionsPicard ( GlobalMatrix &  A,
GlobalVector &  rhs,
GlobalVector &  x 
) const
override

Definition at line 232 of file TimeDiscretizedODESystem.cpp.

References MathLib::applyKnownSolution(), and MathLib::LinAlg::copy().

235 {
236  if (!_known_solutions)
237  {
238  return;
239  }
240 
242  std::vector<IndexType> ids;
243  std::vector<double> values;
244  for (auto const& bc : *_known_solutions)
245  {
246  std::copy(bc.ids.cbegin(), bc.ids.cend(), std::back_inserter(ids));
247  std::copy(bc.values.cbegin(), bc.values.cend(),
248  std::back_inserter(values));
249  }
250  MathLib::applyKnownSolution(A, rhs, x, ids, values);
251 }
void applyKnownSolution(EigenMatrix &A_, EigenVector &b_, EigenVector &, const std::vector< EigenMatrix::IndexType > &vec_knownX_id, const std::vector< double > &vec_knownX_x, double)
Definition: EigenTools.cpp:20
std::vector< NumLib::IndexValueVector< Index > > const * _known_solutions
stores precomputed values for known solutions
void copy(MatrixOrVector const &x, MatrixOrVector &y)
Copies x to y.
Definition: LinAlg.h:37

◆ assemble()

void NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >::assemble ( std::vector< GlobalVector *> const &  x_new_timestep,
int const  process_id 
)
override

Definition at line 193 of file TimeDiscretizedODESystem.cpp.

References MathLib::LinAlg::finalizeAssembly(), and NumLib::FirstOrderImplicitQuasilinear.

195 {
196  namespace LinAlg = MathLib::LinAlg;
197 
198  auto const t = _time_disc.getCurrentTime();
199  auto const dt = _time_disc.getCurrentTimeIncrement();
200  auto const& x_curr = _time_disc.getCurrentX(*x_new_timestep[process_id]);
201 
202  _M->setZero();
203  _K->setZero();
204  _b->setZero();
205 
206  _ode.preAssemble(t, dt, x_curr);
207  _ode.assemble(t, dt, x_new_timestep, process_id, *_M, *_K, *_b);
208 
212 }
virtual double getCurrentTime() const =0
void finalizeAssembly(Matrix &)
virtual double getCurrentTimeIncrement() const =0
virtual GlobalVector const & getCurrentX(GlobalVector const &x_at_new_timestep) const

◆ computeKnownSolutions()

void NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >::computeKnownSolutions ( GlobalVector const &  x,
int const  process_id 
)
override

Definition at line 216 of file TimeDiscretizedODESystem.cpp.

References NumLib::FirstOrderImplicitQuasilinear.

218 {
220  _ode.getKnownSolutions(_time_disc.getCurrentTime(), x, process_id);
221 }
virtual double getCurrentTime() const =0
std::vector< NumLib::IndexValueVector< Index > > const * _known_solutions
stores precomputed values for known solutions

◆ getA()

◆ getMatrixSpecifications()

Definition at line 226 of file TimeDiscretizedODESystem.h.

228  {
229  return _ode.getMatrixSpecifications(process_id);
230  }

◆ getRhs()

◆ getTimeDiscretization()

◆ isLinear()

◆ postIteration()

◆ preIteration()

void NumLib::TimeDiscretizedODESystem< ODESystemTag::FirstOrderImplicitQuasilinear, NonlinearSolverTag::Picard >::preIteration ( const unsigned  iter,
GlobalVector const &  x 
)
inlineoverride

Definition at line 210 of file TimeDiscretizedODESystem.h.

◆ pushMatrices()

Triggers a refresh of the internal matrix/vector storage.

Remarks
This method is needed in particular to fully implement the interaction of the CrankNicolson scheme with other classes.
Attention
This method must be called (if it is called) from within TimeDiscretization::pushState() after the internal state of the TimeDiscretization has been set to the new solution. Otherwise the pushMatrices() method of MatrixTranslator's will break!

Implements NumLib::InternalMatrixStorage.

Definition at line 220 of file TimeDiscretizedODESystem.h.

Member Data Documentation

◆ _b

◆ _b_id

ID of the _b vector.

Definition at line 249 of file TimeDiscretizedODESystem.h.

◆ _K

◆ _K_id

ID of the _K matrix.

Definition at line 248 of file TimeDiscretizedODESystem.h.

◆ _known_solutions

Initial value:
=
nullptr

stores precomputed values for known solutions

Definition at line 240 of file TimeDiscretizedODESystem.h.

◆ _M

◆ _M_id

ID of the _M matrix.

Definition at line 247 of file TimeDiscretizedODESystem.h.

◆ _mat_trans

the object used to compute the matrix/vector for the nonlinear solver

Definition at line 237 of file TimeDiscretizedODESystem.h.

◆ _ode

◆ _time_disc

the time discretization to being used

Definition at line 234 of file TimeDiscretizedODESystem.h.

◆ ODETag


The documentation for this class was generated from the following files: