Nektar++
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | List of all members
Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC Class Reference

#include <ImplicitTimeIntegrationSchemeSDC.h>

Inheritance diagram for Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC:
[legend]

Public Member Functions

 ImplicitTimeIntegrationSchemeSDC (std::string variant, size_t order, std::vector< NekDouble > freeParams)
 
- Public Member Functions inherited from Nektar::LibUtilities::TimeIntegrationSchemeSDC
 TimeIntegrationSchemeSDC (std::string variant, size_t order, std::vector< NekDouble > freeParams)
 
 ~TimeIntegrationSchemeSDC () override
 Destructor. More...
 
LUE void SetPFASST (bool pfasst)
 
LUE void SetTime (double time)
 
LUE size_t GetMaxOrder () const
 
LUE bool HasFirstQuadrature () const
 
LUE bool HasLastQuadrature () const
 
LUE size_t GetQuadPtsNumber () const
 
LUE size_t GetNpoints () const
 
LUE size_t GetNvars () const
 
LUE const PointsKeyGetPointsKey () const
 
LUE const DoubleArrayGetFirstQuadratureSolutionVector () const
 
LUE DoubleArrayUpdateFirstQuadratureSolutionVector ()
 
LUE const DoubleArrayGetLastQuadratureSolutionVector () const
 
LUE DoubleArrayUpdateLastQuadratureSolutionVector ()
 
LUE const TripleArrayGetResidualVector () const
 
LUE TripleArrayUpdateResidualVector ()
 
LUE const TripleArrayGetIntegratedResidualVector () const
 
LUE TripleArrayUpdateIntegratedResidualVector ()
 
LUE const TripleArrayGetFAScorrectionVector () const
 
LUE TripleArrayUpdateFAScorrectionVector ()
 
LUE void ResidualEval (const NekDouble &delta_t, const size_t n)
 
LUE void ResidualEval (const NekDouble &delta_t)
 
LUE void ComputeInitialGuess (const NekDouble &delta_t)
 
LUE void SDCIterationLoop (const NekDouble &delta_t)
 
LUE void UpdateFirstQuadrature (void)
 Worker method that update the first quadrature. More...
 
LUE void UpdateLastQuadrature (void)
 Worker method that update the last quadrature. More...
 
LUE void AddFASCorrectionToSFint (void)
 Worker method that add the FASCorrection. More...
 
LUE void UpdateIntegratedResidualSFint (const NekDouble &delta_t)
 Worker method that compute residual integral. More...
 
LUE void UpdateIntegratedResidualQFint (const NekDouble &delta_t)
 
- Public Member Functions inherited from Nektar::LibUtilities::TimeIntegrationScheme
LUE std::string GetFullName () const
 
LUE std::string GetName () const
 
LUE std::string GetVariant () const
 
LUE size_t GetOrder () const
 
LUE std::vector< NekDoubleGetFreeParams ()
 
LUE TimeIntegrationSchemeType GetIntegrationSchemeType ()
 
LUE NekDouble GetTimeStability () const
 
LUE size_t GetNumIntegrationPhases ()
 
LUE const TripleArrayGetSolutionVector () const
 Gets the solution vector of the ODE. More...
 
LUE TripleArrayUpdateSolutionVector ()
 
LUE void SetSolutionVector (const size_t Offset, const DoubleArray &y)
 Sets the solution vector of the ODE. More...
 
LUE void InitializeScheme (const NekDouble deltaT, ConstDoubleArray &y_0, const NekDouble time, const TimeIntegrationSchemeOperators &op)
 Explicit integration of an ODE. More...
 
LUE ConstDoubleArrayTimeIntegrate (const size_t timestep, const NekDouble delta_t)
 
LUE void print (std::ostream &os) const
 
LUE void printFull (std::ostream &os) const
 

Static Public Member Functions

static TimeIntegrationSchemeSharedPtr create (std::string variant, size_t order, std::vector< NekDouble > freeParams)
 
- Static Public Member Functions inherited from Nektar::LibUtilities::TimeIntegrationSchemeSDC
static TimeIntegrationSchemeSharedPtr create (std::string variant, size_t order, std::vector< NekDouble > freeParams)
 

Public Attributes

DoubleArray m_tmp
 

Static Public Attributes

static std::string className
 
- Static Public Attributes inherited from Nektar::LibUtilities::TimeIntegrationSchemeSDC
static std::string className
 

Protected Member Functions

LUE void v_InitializeScheme (const NekDouble deltaT, ConstDoubleArray &y_0, const NekDouble time, const TimeIntegrationSchemeOperators &op) override
 Array for temporary storage. More...
 
LUE void v_ResidualEval (const NekDouble &delta_t, const size_t n) override
 Worker method to compute the residual. More...
 
LUE void v_ResidualEval (const NekDouble &delta_t) override
 
LUE void v_ComputeInitialGuess (const NekDouble &delta_t) override
 Worker method to compute the initial SDC guess. More...
 
LUE void v_SDCIterationLoop (const NekDouble &delta_t) override
 Worker method to compute the SDC iteration. More...
 
- Protected Member Functions inherited from Nektar::LibUtilities::TimeIntegrationSchemeSDC
LUE std::string v_GetName () const override
 
LUE std::string v_GetVariant () const override
 
LUE size_t v_GetOrder () const override
 
LUE std::vector< NekDoublev_GetFreeParams () const override
 
LUE TimeIntegrationSchemeType v_GetIntegrationSchemeType () const override
 
LUE NekDouble v_GetTimeStability () const override
 
LUE size_t v_GetNumIntegrationPhases () const override
 
LUE const TripleArrayv_GetSolutionVector () const override
 Gets the solution vector of the ODE. More...
 
LUE TripleArrayv_UpdateSolutionVector () override
 
LUE void v_SetSolutionVector (const size_t Offset, const DoubleArray &y) override
 Sets the solution vector of the ODE. More...
 
LUE void v_InitializeScheme (const NekDouble deltaT, ConstDoubleArray &y_0, const NekDouble time, const TimeIntegrationSchemeOperators &op) override
 Worker method to initialize the integration scheme. More...
 
LUE ConstDoubleArrayv_TimeIntegrate (const size_t timestep, const NekDouble delta_t) override
 Worker method that performs the time integration. More...
 
virtual LUE void v_ResidualEval (const NekDouble &delta_t, const size_t n)
 
virtual LUE void v_ResidualEval (const NekDouble &delta_t)
 
virtual LUE void v_ComputeInitialGuess (const NekDouble &delta_t)
 
virtual LUE void v_SDCIterationLoop (const NekDouble &delta_t)
 
LUE void v_print (std::ostream &os) const override
 Worker method to print details on the integration scheme. More...
 
LUE void v_printFull (std::ostream &os) const override
 
- Protected Member Functions inherited from Nektar::LibUtilities::TimeIntegrationScheme
virtual LUE std::string v_GetFullName () const
 
virtual LUE std::string v_GetName () const =0
 
virtual LUE std::string v_GetVariant () const =0
 
virtual LUE size_t v_GetOrder () const =0
 
virtual LUE std::vector< NekDoublev_GetFreeParams () const =0
 
virtual LUE TimeIntegrationSchemeType v_GetIntegrationSchemeType () const =0
 
virtual LUE NekDouble v_GetTimeStability () const =0
 
virtual LUE size_t v_GetNumIntegrationPhases () const =0
 
virtual LUE const TripleArrayv_GetSolutionVector () const =0
 
virtual LUE TripleArrayv_UpdateSolutionVector ()=0
 
virtual LUE void v_SetSolutionVector (const size_t Offset, const DoubleArray &y)=0
 
virtual LUE void v_InitializeScheme (const NekDouble deltaT, ConstDoubleArray &y_0, const NekDouble time, const TimeIntegrationSchemeOperators &op)=0
 
virtual LUE ConstDoubleArrayv_TimeIntegrate (const size_t timestep, const NekDouble delta_t)=0
 
virtual LUE void v_print (std::ostream &os) const =0
 
virtual LUE void v_printFull (std::ostream &os) const =0
 
LUE TimeIntegrationScheme (std::string variant, size_t order, std::vector< NekDouble > freeParams)
 
LUE TimeIntegrationScheme (const TimeIntegrationScheme &in)=delete
 
virtual ~TimeIntegrationScheme ()=default
 

Additional Inherited Members

- Protected Attributes inherited from Nektar::LibUtilities::TimeIntegrationSchemeSDC
NekDouble m_time
 
std::string m_name
 
std::string m_variant
 
std::vector< NekDoublem_freeParams
 
TimeIntegrationSchemeType m_schemeType {eNoTimeIntegrationSchemeType}
 
TimeIntegrationSchemeOperators m_op
 
PointsKey m_pointsKey
 
SingleArray m_tau
 Object containing quadrature data. More...
 
DoubleArray m_Y_f
 Array containing the quadrature points. More...
 
TripleArray m_Y
 Array containing the last stage values. More...
 
TripleArray m_F
 Array containing the stage values. More...
 
TripleArray m_FAScorr
 Array containing the stage derivatives. More...
 
TripleArray m_SFint
 Array containing the FAS correction term. More...
 
TripleArray m_QFint
 Array containing the integrated residual term. More...
 
SingleArray m_QMat
 Array containing the integrated residual term. More...
 
SingleArray m_interp
 Array containing the integration matrix. More...
 
NekDouble m_theta {1.0}
 Array containing the interpolation coefficients. More...
 
size_t m_ordermin {0}
 SDC parameter. More...
 
size_t m_ordermax {0}
 Minimum order of the integration scheme. More...
 
size_t m_order {0}
 Maximum order of the integration scheme. More...
 
size_t m_nQuadPts {0}
 Order of the integration scheme. More...
 
size_t m_nvars {0}
 Number of quadrature points. More...
 
size_t m_npoints {0}
 Number of variables in the integration scheme. More...
 
bool m_first_quadrature {true}
 Number of points in the integration scheme. More...
 
bool m_last_quadrature {true}
 
bool m_initialized {false}
 
bool m_PFASST {false}
 

Detailed Description

Definition at line 46 of file ImplicitTimeIntegrationSchemeSDC.h.

Constructor & Destructor Documentation

◆ ImplicitTimeIntegrationSchemeSDC()

Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::ImplicitTimeIntegrationSchemeSDC ( std::string  variant,
size_t  order,
std::vector< NekDouble freeParams 
)
inline

Definition at line 49 of file ImplicitTimeIntegrationSchemeSDC.h.

51 : TimeIntegrationSchemeSDC(variant, order, freeParams)
52 {
54 "Quadrature type that include the left end point (e.g. "
55 "GaussLobattoLegendre) should not be used for ImplicitSDC");
56
57 m_name = "ImplicitSpectralDeferredCorrection";
59 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
bool m_first_quadrature
Number of points in the integration scheme.
TimeIntegrationSchemeSDC(std::string variant, size_t order, std::vector< NekDouble > freeParams)
@ eImplicit
Fully implicit scheme.

References ASSERTL0, Nektar::LibUtilities::eImplicit, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_first_quadrature, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_name, and Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_schemeType.

Member Function Documentation

◆ create()

static TimeIntegrationSchemeSharedPtr Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::create ( std::string  variant,
size_t  order,
std::vector< NekDouble freeParams 
)
inlinestatic

Definition at line 61 of file ImplicitTimeIntegrationSchemeSDC.h.

63 {
66 variant, order, freeParams);
67
68 return p;
69 }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and CellMLToNektar.cellml_metadata::p.

◆ v_ComputeInitialGuess()

void Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::v_ComputeInitialGuess ( const NekDouble delta_t)
overrideprotectedvirtual

Worker method to compute the initial SDC guess.

Reimplemented from Nektar::LibUtilities::TimeIntegrationSchemeSDC.

Definition at line 141 of file ImplicitTimeIntegrationSchemeSDC.h.

143{
144 for (size_t n = 0; n < m_nQuadPts; ++n)
145 {
146 if (n != 0)
147 {
148 NekDouble dtn = delta_t * (m_tau[n] - m_tau[n - 1]);
149
150 // Update solution
151 m_op.DoImplicitSolve(m_Y[n - 1], m_Y[n],
152 m_time + delta_t * m_tau[n], dtn);
153
154 // Compute residual from updated solution
155 for (size_t i = 0; i < m_nvars; ++i)
156 {
157 Vmath::Vsub(m_npoints, m_Y[n][i], 1, m_Y[n - 1][i], 1,
158 m_F[n][i], 1);
159 Vmath::Smul(m_npoints, 1.0 / dtn, m_F[n][i], 1, m_F[n][i], 1);
160 }
161 }
162 }
163}
void DoImplicitSolve(InArrayType &inarray, OutArrayType &outarray, const NekDouble time, const NekDouble lambda) const
TripleArray m_Y
Array containing the last stage values.
size_t m_nQuadPts
Order of the integration scheme.
size_t m_npoints
Number of variables in the integration scheme.
SingleArray m_tau
Object containing quadrature data.
TripleArray m_F
Array containing the stage values.
double NekDouble
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
Definition: Vmath.hpp:100
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.hpp:220

References Nektar::LibUtilities::TimeIntegrationSchemeOperators::DoImplicitSolve(), Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_F, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_npoints, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_nQuadPts, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_nvars, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_op, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_tau, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_time, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_Y, Vmath::Smul(), and Vmath::Vsub().

◆ v_InitializeScheme()

void Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::v_InitializeScheme ( const NekDouble  deltaT,
ConstDoubleArray y_0,
const NekDouble  time,
const TimeIntegrationSchemeOperators op 
)
overrideprotectedvirtual

Array for temporary storage.

Worker method to initialize the integration scheme.

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 92 of file ImplicitTimeIntegrationSchemeSDC.h.

95{
96 if (m_initialized)
97 {
98 m_time = time;
99 for (size_t i = 0; i < m_nvars; ++i)
100 {
101 // Store the initial values as the first previous state.
102 Vmath::Vcopy(m_npoints, y_0[i], 1, m_Y[0][i], 1);
103 }
104 }
105 else
106 {
108
110 for (size_t i = 0; i < m_nvars; ++i)
111 {
112 m_tmp[i] = SingleArray(m_npoints, 0.0);
113 }
114 }
115}
LUE void v_InitializeScheme(const NekDouble deltaT, ConstDoubleArray &y_0, const NekDouble time, const TimeIntegrationSchemeOperators &op) override
Worker method to initialize the integration scheme.
AT< AT< NekDouble > > DoubleArray
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.hpp:825

References Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_initialized, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_npoints, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_nvars, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_time, m_tmp, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_Y, Nektar::LibUtilities::TimeIntegrationSchemeSDC::v_InitializeScheme(), and Vmath::Vcopy().

◆ v_ResidualEval() [1/2]

void Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::v_ResidualEval ( const NekDouble delta_t)
overrideprotectedvirtual

Reimplemented from Nektar::LibUtilities::TimeIntegrationSchemeSDC.

Definition at line 130 of file ImplicitTimeIntegrationSchemeSDC.h.

131{
132 for (size_t n = 0; n < m_nQuadPts; ++n)
133 {
134 v_ResidualEval(delta_t, n);
135 }
136}
LUE void v_ResidualEval(const NekDouble &delta_t, const size_t n) override
Worker method to compute the residual.

References Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_nQuadPts, and v_ResidualEval().

◆ v_ResidualEval() [2/2]

void Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::v_ResidualEval ( const NekDouble delta_t,
const size_t  n 
)
overrideprotectedvirtual

◆ v_SDCIterationLoop()

void Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::v_SDCIterationLoop ( const NekDouble delta_t)
overrideprotectedvirtual

Worker method to compute the SDC iteration.

Reimplemented from Nektar::LibUtilities::TimeIntegrationSchemeSDC.

Definition at line 168 of file ImplicitTimeIntegrationSchemeSDC.h.

170{
171 // Update integrated residual
173
174 // Add FAS correction to integrated residual
176
177 // Loop over quadrature points
178 for (size_t n = 1; n < m_nQuadPts; ++n)
179 {
180 NekDouble dtn = delta_t * (m_tau[n] - m_tau[n - 1]);
181
182 // Add rhs terms
183 for (size_t i = 0; i < m_nvars; ++i)
184 {
185 // Add SFint contribution
186 Vmath::Vadd(m_npoints, m_Y[n - 1][i], 1, m_SFint[n][i], 1, m_tmp[i],
187 1);
188
189 // Add implicit contribution
190 Vmath::Svtvp(m_npoints, -m_theta * dtn, m_F[n][i], 1, m_tmp[i], 1,
191 m_tmp[i], 1);
192 }
193
194 // Solve implicit system
195 m_op.DoImplicitSolve(m_tmp, m_Y[n], m_time + delta_t * m_tau[n],
196 m_theta * dtn);
197
198 // Compute residual from updated solution
199 for (size_t i = 0; i < m_nvars; ++i)
200 {
201 Vmath::Vsub(m_npoints, m_Y[n][i], 1, m_tmp[i], 1, m_F[n][i], 1);
202 Vmath::Smul(m_npoints, 1.0 / (m_theta * dtn), m_F[n][i], 1,
203 m_F[n][i], 1);
204 }
205 }
206}
LUE void UpdateIntegratedResidualSFint(const NekDouble &delta_t)
Worker method that compute residual integral.
LUE void AddFASCorrectionToSFint(void)
Worker method that add the FASCorrection.
TripleArray m_SFint
Array containing the FAS correction term.
NekDouble m_theta
Array containing the interpolation coefficients.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Svtvp (scalar times vector plus vector): z = alpha*x + y.
Definition: Vmath.hpp:396
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.hpp:180

References Nektar::LibUtilities::TimeIntegrationSchemeSDC::AddFASCorrectionToSFint(), Nektar::LibUtilities::TimeIntegrationSchemeOperators::DoImplicitSolve(), Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_F, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_npoints, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_nQuadPts, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_nvars, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_op, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_SFint, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_tau, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_theta, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_time, m_tmp, Nektar::LibUtilities::TimeIntegrationSchemeSDC::m_Y, Vmath::Smul(), Vmath::Svtvp(), Nektar::LibUtilities::TimeIntegrationSchemeSDC::UpdateIntegratedResidualSFint(), Vmath::Vadd(), and Vmath::Vsub().

Member Data Documentation

◆ className

std::string Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::className
static
Initial value:
=
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:197
TimeIntegrationSchemeFactory & GetTimeIntegrationSchemeFactory()

Definition at line 71 of file ImplicitTimeIntegrationSchemeSDC.h.

◆ m_tmp

DoubleArray Nektar::LibUtilities::ImplicitTimeIntegrationSchemeSDC::m_tmp