OGS
NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear > Class Reference

Detailed Description

General matrix translator for first order implicit quasi-linear ODEs, used with time discretization schemes that have no special needs.

See also
ODESystemTag::FirstOrderImplicitQuasilinear
Remarks
You might also want read the remarks on time discretization.

Definition at line 83 of file MatrixTranslator.h.

#include <MatrixTranslator.h>

Inheritance diagram for NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >:
[legend]
Collaboration diagram for NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >:
[legend]

Public Member Functions

 MatrixTranslatorGeneral (TimeDiscretization const &timeDisc)
void computeA (GlobalMatrix const &M, GlobalMatrix const &K, GlobalMatrix &A) const override
 Computes \( A = M \cdot \alpha + K \).
void computeRhs (const GlobalMatrix &M, const GlobalMatrix &, const GlobalVector &b, const GlobalVector &x_prev, GlobalVector &rhs) const override
 Computes \( \mathtt{rhs} = M \cdot x_O + b \).
void normalizeAandRhs (GlobalMatrix &A, GlobalVector &b) const override
void computeResidual (GlobalMatrix const &M, GlobalMatrix const &K, GlobalVector const &b, double dt, GlobalVector const &x_curr, GlobalVector const &x_prev, GlobalVector &res) const override
 Computes \( r = M \cdot \hat x + K \cdot x_C - b \).
void computeJacobian (GlobalMatrix const &Jac_in, GlobalMatrix &Jac_out) const override
Public Member Functions inherited from NumLib::MatrixTranslator< ODESystemTag::FirstOrderImplicitQuasilinear >
virtual ~MatrixTranslator ()=default

Private Attributes

TimeDiscretization const & _time_disc
 the time discretization used.
std::size_t _tmp_id = 0u
 ID of the vector storing intermediate computations.

Constructor & Destructor Documentation

◆ MatrixTranslatorGeneral()

NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >::MatrixTranslatorGeneral ( TimeDiscretization const & timeDisc)
inlineexplicit

Constructs a new instance.

Parameters
timeDiscthe time discretization scheme to be used.

Definition at line 91 of file MatrixTranslator.h.

References _time_disc.

Referenced by computeA(), computeJacobian(), computeResidual(), computeRhs(), and normalizeAandRhs().

Member Function Documentation

◆ computeA()

void NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >::computeA ( GlobalMatrix const & M,
GlobalMatrix const & K,
GlobalMatrix & A ) const
overridevirtual

Computes \( A = M \cdot \alpha + K \).

Implements NumLib::MatrixTranslator< ODESystemTag::FirstOrderImplicitQuasilinear >.

Definition at line 10 of file MatrixTranslator.cpp.

13{
14 namespace LinAlg = MathLib::LinAlg;
15
16 double const dt = _time_disc.getCurrentTimeIncrement();
17
18 // A = M * 1/dt + K
20 LinAlg::axpy(A, 1. / dt, M);
21}
void copy(PETScVector const &x, PETScVector &y)
Definition LinAlg.cpp:30
void axpy(PETScVector &y, PetscScalar const a, PETScVector const &x)
Definition LinAlg.cpp:50

References MatrixTranslatorGeneral(), _time_disc, MathLib::LinAlg::axpy(), and MathLib::LinAlg::copy().

◆ computeJacobian()

void NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >::computeJacobian ( GlobalMatrix const & Jac_in,
GlobalMatrix & Jac_out ) const
overridevirtual

Writes Jac_in to Jac_out.

Todo
Do not copy.

Implements NumLib::MatrixTranslator< ODESystemTag::FirstOrderImplicitQuasilinear >.

Definition at line 76 of file MatrixTranslator.cpp.

78{
79 namespace LinAlg = MathLib::LinAlg;
80
82}

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

◆ computeResidual()

void NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >::computeResidual ( GlobalMatrix const & M,
GlobalMatrix const & K,
GlobalVector const & b,
double dt,
GlobalVector const & x_curr,
GlobalVector const & x_prev,
GlobalVector & res ) const
overridevirtual

Computes \( r = M \cdot \hat x + K \cdot x_C - b \).

Implements NumLib::MatrixTranslator< ODESystemTag::FirstOrderImplicitQuasilinear >.

Definition at line 58 of file MatrixTranslator.cpp.

63{
64 namespace LinAlg = MathLib::LinAlg;
65
66 // res = M * x_dot + K * x_curr - b
68 LinAlg::copy(x_curr, x_dot); // x_dot = x
69 LinAlg::axpy(x_dot, -1., x_prev); // x_dot = x - x_prev
70 LinAlg::scale(x_dot, 1. / dt); // x_dot = (x - x_prev)/dt
71 LinAlg::matMult(M, x_dot, res); // res = M*x_dot
72 LinAlg::matMultAdd(K, x_curr, res, res); // res = M*x_dot + K*x
73 LinAlg::axpy(res, -1., b); // res = M*x_dot + X*x - b
74}
void matMult(PETScMatrix const &A, PETScVector const &x, PETScVector &y)
Definition LinAlg.cpp:142
void matMultAdd(PETScMatrix const &A, PETScVector const &v1, PETScVector const &v2, PETScVector &v3)
Definition LinAlg.cpp:152
void scale(PETScVector &x, PetscScalar const a)
Definition LinAlg.cpp:37

References MatrixTranslatorGeneral(), MathLib::LinAlg::axpy(), MathLib::LinAlg::copy(), MathLib::LinAlg::matMult(), MathLib::LinAlg::matMultAdd(), and MathLib::LinAlg::scale().

◆ computeRhs()

void NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >::computeRhs ( const GlobalMatrix & M,
const GlobalMatrix & ,
const GlobalVector & b,
const GlobalVector & x_prev,
GlobalVector & rhs ) const
overridevirtual

Computes \( \mathtt{rhs} = M \cdot x_O + b \).

Implements NumLib::MatrixTranslator< ODESystemTag::FirstOrderImplicitQuasilinear >.

Definition at line 23 of file MatrixTranslator.cpp.

27{
28 namespace LinAlg = MathLib::LinAlg;
29
31 _time_disc.getWeightedOldX(tmp, x_prev);
32
33 // rhs = M * weighted_old_x + b
35
37}
std::size_t _tmp_id
ID of the vector storing intermediate computations.

References MatrixTranslatorGeneral(), _time_disc, _tmp_id, MathLib::LinAlg::matMultAdd(), and NumLib::GlobalVectorProvider::provider.

◆ normalizeAandRhs()

void NumLib::MatrixTranslatorGeneral< ODESystemTag::FirstOrderImplicitQuasilinear >::normalizeAandRhs ( GlobalMatrix & A,
GlobalVector & b ) const
overridevirtual

Computes \( A = A^T \cdot A \), and also \( rhs = A^T \cdot rhs \).

Implements NumLib::MatrixTranslator< ODESystemTag::FirstOrderImplicitQuasilinear >.

Definition at line 39 of file MatrixTranslator.cpp.

41{
42 namespace LinAlg = MathLib::LinAlg;
43
44 // check whether A is square?
45
50 // rhs = A^T * rhs
51 // A = A^T * A
53
56}
void linearSysNormalize(PETScMatrix const &, PETScMatrix &, PETScVector const &, PETScVector &)
Definition LinAlg.cpp:163

References MatrixTranslatorGeneral(), MathLib::LinAlg::copy(), and MathLib::LinAlg::linearSysNormalize().

Member Data Documentation

◆ _time_disc

the time discretization used.

Definition at line 121 of file MatrixTranslator.h.

Referenced by MatrixTranslatorGeneral(), computeA(), and computeRhs().

◆ _tmp_id

ID of the vector storing intermediate computations.

Definition at line 124 of file MatrixTranslator.h.

Referenced by computeRhs().


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