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

Class for spectral deferred correction integration. More...

#include <TimeIntegrationSchemeGEM.h>

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

Public Member Functions

 TimeIntegrationSchemeGEM (std::string variant, size_t order, std::vector< NekDouble > freeParams)
 
 ~TimeIntegrationSchemeGEM () override
 Destructor. More...
 
- 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 Attributes

static std::string className
 

Protected Member Functions

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
 
LUE TripleArrayv_UpdateSolutionVector () override
 
LUE void v_SetSolutionVector (const size_t Offset, const DoubleArray &y) override
 
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...
 
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
 

Protected Attributes

NekDouble m_time
 
std::string m_name
 
std::string m_variant
 
std::vector< NekDoublem_freeParams
 
TimeIntegrationSchemeType m_schemeType {eNoTimeIntegrationSchemeType}
 
TimeIntegrationSchemeOperators m_op
 
TripleArray m_Y
 
TripleArray m_T
 Array containing the stage values. More...
 
TripleArray m_T0
 Array containing the solution values. More...
 
DoubleArray m_F
 Array containing the solution values. More...
 
DoubleArray m_F0
 Array corresponding to the stage Derivatives. More...
 
size_t m_order {0}
 Array corresponding to the stage Derivatives. More...
 
size_t m_nvars {0}
 
size_t m_npoints {0}
 
bool m_initialized {false}
 

Detailed Description

Class for spectral deferred correction integration.

Definition at line 50 of file TimeIntegrationSchemeGEM.h.

Constructor & Destructor Documentation

◆ TimeIntegrationSchemeGEM()

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

Definition at line 53 of file TimeIntegrationSchemeGEM.h.

55 : TimeIntegrationScheme(variant, order, freeParams),
56 m_name("ExtrapolationMethod")
57 {
58 ASSERTL0(variant == "" || variant == "ExplicitEuler" ||
59 variant == "ImplicitEuler" || variant == "IMEXEuler" ||
60 variant == "ExplicitMidpoint" ||
61 variant == "ImplicitMidpoint",
62 "Extrapolation Time integration "
63 "scheme bad variant (ExplicitEuler, ImplicitEuler, "
64 "ExplicitMidpoint)")
65
66 if (variant == "IMEXEuler")
67 {
68 std::cerr << "WARNING: IMEX Euler extrapolation method has been "
69 "implemented but its use is not recommended as the "
70 "approach is affected by order-reduction problems."
71 << std::endl;
72 }
73
74 if (variant == "" || variant == "ExplicitEuler" ||
75 variant == "ImplicitEuler" || variant == "IMEXEuler")
76 {
77 ASSERTL0(order >= 1, "Extrapolation Time integration "
78 "scheme bad order numbers (>=1): " +
79 std::to_string(order));
80 }
81 else if (variant == "ExplicitMidpoint" || variant == "ImplicitMidpoint")
82 {
83 ASSERTL0(order >= 2, "Extrapolation Time integration "
84 "scheme bad order numbers (>=2): " +
85 std::to_string(order));
86
87 ASSERTL0(order % 2 == 0,
88 "Extrapolation Time integration "
89 "scheme bad order numbers (even number): " +
90 std::to_string(order));
91 }
92
93 m_variant = variant;
94 m_order = order;
95 m_freeParams = freeParams;
96 if (variant == "ExplicitEuler" || variant == "ExplicitMidpoint")
97 {
99 }
100 else if (variant == "ImplicitEuler" || variant == "ImplicitMidpoint")
101 {
103 }
104 else if (variant == "IMEXEuler")
105 {
107 }
108 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
size_t m_order
Array corresponding to the stage Derivatives.
LUE TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
@ eImplicit
Fully implicit scheme.
@ eExplicit
Formally explicit scheme.
@ eIMEX
Implicit Explicit General Linear Method.

References ASSERTL0, Nektar::LibUtilities::eExplicit, Nektar::LibUtilities::eIMEX, Nektar::LibUtilities::eImplicit, m_freeParams, m_order, m_schemeType, and m_variant.

◆ ~TimeIntegrationSchemeGEM()

Nektar::LibUtilities::TimeIntegrationSchemeGEM::~TimeIntegrationSchemeGEM ( )
inlineoverride

Destructor.

Definition at line 111 of file TimeIntegrationSchemeGEM.h.

112 {
113 }

Member Function Documentation

◆ create()

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

Definition at line 115 of file TimeIntegrationSchemeGEM.h.

117 {
120 variant, order, freeParams);
121
122 return p;
123 }
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_GetFreeParams()

std::vector< NekDouble > Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetFreeParams ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 55 of file TimeIntegrationSchemeGEM.cpp.

56{
57 return m_freeParams;
58}

References m_freeParams.

◆ v_GetIntegrationSchemeType()

TimeIntegrationSchemeType Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetIntegrationSchemeType ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 60 of file TimeIntegrationSchemeGEM.cpp.

62{
63 return m_schemeType;
64}

References m_schemeType.

◆ v_GetName()

std::string Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetName ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 40 of file TimeIntegrationSchemeGEM.cpp.

41{
42 return m_name;
43}

References m_name.

◆ v_GetNumIntegrationPhases()

size_t Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetNumIntegrationPhases ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 71 of file TimeIntegrationSchemeGEM.cpp.

72{
73 return 1;
74}

◆ v_GetOrder()

size_t Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetOrder ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 50 of file TimeIntegrationSchemeGEM.cpp.

51{
52 return m_order;
53}

References m_order.

◆ v_GetSolutionVector()

const TripleArray & Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetSolutionVector ( ) const
overrideprotectedvirtual

◆ v_GetTimeStability()

NekDouble Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetTimeStability ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 66 of file TimeIntegrationSchemeGEM.cpp.

67{
68 return 1.0;
69}

◆ v_GetVariant()

std::string Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_GetVariant ( ) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 45 of file TimeIntegrationSchemeGEM.cpp.

46{
47 return m_variant;
48}

References m_variant.

◆ v_InitializeScheme()

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

Worker method to initialize the integration scheme.

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 95 of file TimeIntegrationSchemeGEM.cpp.

99{
100 if (m_initialized)
101 {
102 m_time = time;
103 for (size_t i = 0; i < m_nvars; ++i)
104 {
105 // Store the initial values as the first previous state.
106 Vmath::Vcopy(m_npoints, y_0[i], 1, m_Y[0][i], 1);
107 }
108 }
109 else
110 {
111 m_op = op;
112 m_time = time;
113 m_nvars = y_0.size();
114 m_npoints = y_0[0].size();
115
116 size_t nodes = m_order;
117 if (m_variant == "ExplicitMidpoint" || m_variant == "ImplicitMidpoint")
118 {
119 nodes /= 2;
120 }
121
122 // Storage of previous states and associated timesteps.
123 m_Y = TripleArray(m_order + 1);
124 m_T = TripleArray(nodes);
125 m_T0 = TripleArray(nodes);
126
127 for (size_t m = 0; m <= m_order; ++m)
128 {
129 m_Y[m] = DoubleArray(m_nvars);
130
131 for (size_t i = 0; i < m_nvars; ++i)
132 {
133 m_Y[m][i] = SingleArray(m_npoints, 0.0);
134
135 // Store the initial values as the first previous state.
136 if (m == 0)
137 {
138 Vmath::Vcopy(m_npoints, y_0[i], 1, m_Y[m][i], 1);
139 }
140 }
141 }
142
143 if (m_variant == "" || m_variant == "ExplicitEuler" ||
144 m_variant == "ExplicitMidpoint")
145 {
146 m_op.DoProjection(m_Y[0], m_Y[0], m_time);
147 }
148
149 for (size_t m = 0; m < nodes; ++m)
150 {
151 m_T[m] = DoubleArray(m_nvars);
153
154 for (size_t i = 0; i < m_nvars; ++i)
155 {
156 m_T[m][i] = SingleArray(m_npoints, 0.0);
157 m_T0[m][i] = SingleArray(m_npoints, 0.0);
158 }
159 }
160
161 // Storage for the stage derivative as the data will be re-used to
162 // update the solution.
165
166 for (size_t i = 0; i < m_nvars; ++i)
167 {
168 m_F[i] = SingleArray(m_npoints, 0.0);
169 m_F0[i] = SingleArray(m_npoints, 0.0);
170 }
171
172 m_initialized = true;
173 }
174}
DoubleArray m_F
Array containing the solution values.
TripleArray m_T
Array containing the stage values.
DoubleArray m_F0
Array corresponding to the stage Derivatives.
TripleArray m_T0
Array containing the solution values.
void DoProjection(InArrayType &inarray, OutArrayType &outarray, const NekDouble time) const
AT< AT< NekDouble > > DoubleArray
AT< AT< AT< NekDouble > > > TripleArray
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.hpp:825

References Nektar::LibUtilities::TimeIntegrationSchemeOperators::DoProjection(), m_F, m_F0, m_initialized, m_npoints, m_nvars, m_op, m_order, m_T, m_T0, m_time, m_variant, m_Y, and Vmath::Vcopy().

◆ v_print()

void Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_print ( std::ostream &  os) const
overrideprotectedvirtual

Worker method to print details on the integration scheme.

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 417 of file TimeIntegrationSchemeGEM.cpp.

418{
419 os << "Time Integration Scheme: " << GetFullName() << std::endl;
420}

References Nektar::LibUtilities::TimeIntegrationScheme::GetFullName().

◆ v_printFull()

void Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_printFull ( std::ostream &  os) const
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 422 of file TimeIntegrationSchemeGEM.cpp.

423{
424 os << "Time Integration Scheme: " << GetFullName() << std::endl;
425}

References Nektar::LibUtilities::TimeIntegrationScheme::GetFullName().

◆ v_SetSolutionVector()

void Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_SetSolutionVector ( const size_t  Offset,
const DoubleArray y 
)
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 86 of file TimeIntegrationSchemeGEM.cpp.

88{
89 m_Y[Offset] = y;
90}

References m_Y.

◆ v_TimeIntegrate()

ConstDoubleArray & Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_TimeIntegrate ( const size_t  timestep,
const NekDouble  delta_t 
)
overrideprotectedvirtual

Worker method that performs the time integration.

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 179 of file TimeIntegrationSchemeGEM.cpp.

181{
182 // Compute initial residual
183 if (m_variant == "" || m_variant == "ExplicitEuler" ||
184 m_variant == "ExplicitMidpoint" || m_variant == "IMEXEuler")
185 {
187 }
188
189 // Euler approach
190 if (m_variant == "" || m_variant == "ExplicitEuler" ||
191 m_variant == "ImplicitEuler" || m_variant == "IMEXEuler")
192 {
193 // Compute first order approximation
194 for (size_t m = 1; m <= m_order; ++m)
195 {
196 for (size_t k = 1; k <= m; ++k)
197 {
198 // Implicit schemes
199 if (m_variant == "ImplicitEuler")
200 {
201 m_op.DoImplicitSolve(m_Y[k - 1], m_Y[k],
202 m_time + k * (delta_t / m),
203 delta_t / m);
204 }
205
206 // Explicit schemes
207 if (m_variant == "" || m_variant == "ExplicitEuler" ||
208 m_variant == "IMEXEuler")
209 {
210 // For the first stage, used pre-computed rhs
211 if (k == 1)
212 {
213 for (size_t i = 0; i < m_nvars; ++i)
214 {
215 Vmath::Svtvp(m_npoints, delta_t / m, m_F0[i], 1,
216 m_Y[k - 1][i], 1, m_Y[k][i], 1);
217 }
218 }
219 // For other stages, compute new rhs
220 else
221 {
222 m_op.DoOdeRhs(m_Y[k - 1], m_F,
223 m_time + (k - 1) * (delta_t / m));
224 for (size_t i = 0; i < m_nvars; ++i)
225 {
226 Vmath::Svtvp(m_npoints, delta_t / m, m_F[i], 1,
227 m_Y[k - 1][i], 1, m_Y[k][i], 1);
228 }
229 }
230 }
231 if (m_variant == "" || m_variant == "ExplicitEuler")
232 {
233 m_op.DoProjection(m_Y[k], m_Y[k],
234 m_time + k * (delta_t / m));
235 }
236
237 // IMEX schemes (NOTE: Order reduction problems)
238 if (m_variant == "IMEXEuler")
239 {
241 m_time + k * (delta_t / m),
242 delta_t / m);
243 }
244 }
245
246 // Save solution to m_T0
247 for (size_t i = 0; i < m_nvars; ++i)
248 {
249 Vmath::Vcopy(m_npoints, m_Y[m][i], 1, m_T0[m - 1][i], 1);
250 }
251 }
252
253 // No extrapolation required for first-order
254 if (m_order == 1)
255 {
256 for (size_t i = 0; i < m_nvars; ++i)
257 {
258 Vmath::Vcopy(m_npoints, m_Y[1][i], 1, m_Y[0][i], 1);
259 }
260 m_time += delta_t;
261 return m_Y[0];
262 }
263
264 // Extrapolate solution
265 for (size_t m = 1; m < m_order; ++m)
266 {
267 // Aitken - Neville formula
268 for (size_t k = m; k < m_order; ++k)
269 {
270 for (size_t i = 0; i < m_nvars; ++i)
271 {
272 Vmath::Vsub(m_npoints, m_T0[k][i], 1, m_T0[k - 1][i], 1,
273 m_T[k][i], 1);
275 (k - m + 1.0) / ((k + 1.0) - (k - m + 1.0)),
276 m_T[k][i], 1, m_T0[k][i], 1, m_T[k][i], 1);
277 }
278 }
279
280 // Copy new values to old values
281 for (size_t k = m; k < m_order; ++k)
282 {
283 for (size_t i = 0; i < m_nvars; ++i)
284 {
285 Vmath::Vcopy(m_npoints, m_T[k][i], 1, m_T0[k][i], 1);
286 }
287 }
288 }
289
290 // Copy final solution
291 for (size_t i = 0; i < m_nvars; ++i)
292 {
293 Vmath::Vcopy(m_npoints, m_T[m_order - 1][i], 1, m_Y[0][i], 1);
294 }
295 }
296 // Midpoint approach
297 else if (m_variant == "ExplicitMidpoint" || m_variant == "ImplicitMidpoint")
298 {
299 // Compute second order approximation
300 for (size_t m = 1; m <= m_order / 2; ++m)
301 {
302 // Implicit midpoint
303 if (m_variant == "ImplicitMidpoint")
304 {
305 for (size_t k = 1; k <= m; ++k)
306 {
307 m_op.DoImplicitSolve(m_Y[2 * k - 2], m_Y[2 * k - 1],
308 m_time +
309 (k - 1 + 0.25) * (delta_t / m),
310 0.25 * delta_t / m);
311 for (size_t i = 0; i < m_nvars; ++i)
312 {
313 Vmath::Svtsvtp(m_npoints, 2.0, m_Y[2 * k - 1][i], 1,
314 -1.0, m_Y[2 * k - 2][i], 1,
315 m_Y[2 * k][i], 1);
316 }
317 m_op.DoImplicitSolve(m_Y[2 * k], m_F,
318 m_time + (k - 0.25) * (delta_t / m),
319 0.25 * delta_t / m);
320 for (size_t i = 0; i < m_nvars; ++i)
321 {
322 Vmath::Vsub(m_npoints, m_F[i], 1, m_Y[2 * k][i], 1,
323 m_F[i], 1);
324 Vmath::Svtvp(m_npoints, 2.0, m_F[i], 1, m_Y[2 * k][i],
325 1, m_Y[2 * k][i], 1);
326 }
327 }
328 }
329
330 // Explicit midpoint
331 if (m_variant == "ExplicitMidpoint")
332 {
333 // Use precomputed rhs for initial Euler stage
334 for (size_t i = 0; i < m_nvars; ++i)
335 {
336 Vmath::Svtvp(m_npoints, delta_t / (2 * m), m_F0[i], 1,
337 m_Y[0][i], 1, m_Y[1][i], 1);
338 }
339 m_op.DoProjection(m_Y[1], m_Y[1], m_time + delta_t / (2 * m));
340
341 // Compute new rhs for midpoint stage
342 for (size_t k = 2; k <= 2 * m; ++k)
343 {
344 m_op.DoOdeRhs(m_Y[k - 1], m_F,
345 m_time + (k - 1) * (delta_t / (2 * m)));
346 for (size_t i = 0; i < m_nvars; ++i)
347 {
348 Vmath::Svtvp(m_npoints, delta_t / m, m_F[i], 1,
349 m_Y[k - 2][i], 1, m_Y[k][i], 1);
350 }
351 m_op.DoProjection(m_Y[k], m_Y[k],
352 m_time + k * (delta_t / (2 * m)));
353 }
354 }
355
356 // Save solution to m_T0
357 for (size_t i = 0; i < m_nvars; ++i)
358 {
359 Vmath::Vcopy(m_npoints, m_Y[2 * m][i], 1, m_T0[m - 1][i], 1);
360 }
361 }
362
363 // No extrapolation required for second-order
364 if (m_order == 2)
365 {
366 for (size_t i = 0; i < m_nvars; ++i)
367 {
368 Vmath::Vcopy(m_npoints, m_Y[2][i], 1, m_Y[0][i], 1);
369 }
370 m_time += delta_t;
371 return m_Y[0];
372 }
373
374 // Extrapolate solution
375 for (size_t m = 1; m < m_order / 2; ++m)
376 {
377 // Aitken - Neville formula
378 for (size_t k = m; k < m_order / 2; ++k)
379 {
380 for (size_t i = 0; i < m_nvars; ++i)
381 {
382 Vmath::Vsub(m_npoints, m_T0[k][i], 1, m_T0[k - 1][i], 1,
383 m_T[k][i], 1);
385 m_npoints,
386 std::pow(k - m + 1.0, 2) /
387 (std::pow(k + 1.0, 2) - std::pow(k - m + 1.0, 2)),
388 m_T[k][i], 1, m_T0[k][i], 1, m_T[k][i], 1);
389 }
390 }
391
392 // Copy new values to old values
393 for (size_t k = m; k < m_order / 2; ++k)
394 {
395 for (size_t i = 0; i < m_nvars; ++i)
396 {
397 Vmath::Vcopy(m_npoints, m_T[k][i], 1, m_T0[k][i], 1);
398 }
399 }
400 }
401
402 // Copy final solution
403 for (size_t i = 0; i < m_nvars; ++i)
404 {
405 Vmath::Vcopy(m_npoints, m_T[m_order / 2 - 1][i], 1, m_Y[0][i], 1);
406 }
407 }
408
409 // Return solution
410 m_time += delta_t;
411 return m_Y[0];
412}
void DoImplicitSolve(InArrayType &inarray, OutArrayType &outarray, const NekDouble time, const NekDouble lambda) const
void DoOdeRhs(InArrayType &inarray, OutArrayType &outarray, const NekDouble time) const
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
Svtsvtp (scalar times vector plus scalar times vector):
Definition: Vmath.hpp:473
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 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::TimeIntegrationSchemeOperators::DoOdeRhs(), Nektar::LibUtilities::TimeIntegrationSchemeOperators::DoProjection(), m_F, m_F0, m_npoints, m_nvars, m_op, m_order, m_T, m_T0, m_time, m_variant, m_Y, Vmath::Svtsvtp(), Vmath::Svtvp(), Vmath::Vcopy(), and Vmath::Vsub().

◆ v_UpdateSolutionVector()

TripleArray & Nektar::LibUtilities::TimeIntegrationSchemeGEM::v_UpdateSolutionVector ( )
overrideprotectedvirtual

Implements Nektar::LibUtilities::TimeIntegrationScheme.

Definition at line 81 of file TimeIntegrationSchemeGEM.cpp.

82{
83 return m_Y;
84}

References m_Y.

Member Data Documentation

◆ className

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

Definition at line 125 of file TimeIntegrationSchemeGEM.h.

◆ m_F

DoubleArray Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_F
protected

Array containing the solution values.

Definition at line 159 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_F0

DoubleArray Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_F0
protected

Array corresponding to the stage Derivatives.

Definition at line 160 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_freeParams

std::vector<NekDouble> Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_freeParams
protected

Definition at line 151 of file TimeIntegrationSchemeGEM.h.

Referenced by TimeIntegrationSchemeGEM(), and v_GetFreeParams().

◆ m_initialized

bool Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_initialized {false}
protected

Definition at line 166 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme().

◆ m_name

std::string Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_name
protected

Definition at line 149 of file TimeIntegrationSchemeGEM.h.

Referenced by v_GetName().

◆ m_npoints

size_t Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_npoints {0}
protected

Definition at line 165 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_nvars

size_t Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_nvars {0}
protected

Definition at line 164 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_op

TimeIntegrationSchemeOperators Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_op
protected

Definition at line 153 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_order

size_t Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_order {0}
protected

Array corresponding to the stage Derivatives.

Definition at line 163 of file TimeIntegrationSchemeGEM.h.

Referenced by TimeIntegrationSchemeGEM(), v_GetOrder(), v_InitializeScheme(), and v_TimeIntegrate().

◆ m_schemeType

TimeIntegrationSchemeType Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_schemeType {eNoTimeIntegrationSchemeType}
protected

◆ m_T

TripleArray Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_T
protected

Array containing the stage values.

Definition at line 157 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_T0

TripleArray Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_T0
protected

Array containing the solution values.

Definition at line 158 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_time

NekDouble Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_time
protected

Definition at line 148 of file TimeIntegrationSchemeGEM.h.

Referenced by v_InitializeScheme(), and v_TimeIntegrate().

◆ m_variant

std::string Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_variant
protected

◆ m_Y

TripleArray Nektar::LibUtilities::TimeIntegrationSchemeGEM::m_Y
protected