Nektar++
IMEXdirkTimeIntegrationSchemes.h
Go to the documentation of this file.
1///////////////////////////////////////////////////////////////////////////////
2//
3// File: IMEXdirkTimeIntegrationSchemes.h
4//
5// For more information, please see: http://www.nektar.info
6//
7// The MIT License
8//
9// Copyright (c) 2018 Division of Applied Mathematics, Brown University (USA),
10// Department of Aeronautics, Imperial College London (UK), and Scientific
11// Computing and Imaging Institute, University of Utah (USA).
12//
13// License for the specific language governing rights and limitations under
14// Permission is hereby granted, free of charge, to any person obtaining a
15// copy of this software and associated documentation files (the "Software"),
16// to deal in the Software without restriction, including without limitation
17// the rights to use, copy, modify, merge, publish, distribute, sublicense,
18// and/or sell copies of the Software, and to permit persons to whom the
19// Software is furnished to do so, subject to the following conditions:
20//
21// The above copyright notice and this permission notice shall be included
22// in all copies or substantial portions of the Software.
23//
24// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
27// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
30// DEALINGS IN THE SOFTWARE.
31//
32// Description: Combined header file for all IMEX Dirk based time integration
33// schemes.
34//
35///////////////////////////////////////////////////////////////////////////////
36
37// Note : If adding a new integrator be sure to register the
38// integrator with the Time Integration Scheme Facatory in
39// SchemeInitializor.cpp.
40
41#ifndef NEKTAR_LIB_UTILITIES_TIME_INTEGRATION_IMEX_DIRK_TIME_INTEGRATION_SCHEME
42#define NEKTAR_LIB_UTILITIES_TIME_INTEGRATION_IMEX_DIRK_TIME_INTEGRATION_SCHEME
43
44#define LUE LIB_UTILITIES_EXPORT
45
46#include <boost/core/ignore_unused.hpp>
47
49
51{
52
53///////////////////////////////////////////////////////////////////////////////
54// IMEXDirk-(s, sigma, p), where s is the number of stages of the
55// implicit scheme, sigma is the number of stages of the explicit
56// scheme and p is the combined order of the scheme.
57
59{
60public:
61 IMEXdirkTimeIntegrationScheme(std::string variant, size_t order,
62 std::vector<NekDouble> freeParams)
63 : TimeIntegrationSchemeGLM(variant, order, freeParams)
64 {
65 ASSERTL1(freeParams.size() == 2,
66 "IMEX DIRK Time integration scheme invalid number "
67 "of free parameters, expected two "
68 "<implicit stages, explicit stages>, received " +
69 std::to_string(freeParams.size()));
70
71 size_t s = freeParams[0];
72 size_t sigma = freeParams[1];
73
77
78 if (order == 1 && s == 1 && sigma == 1)
79 {
80 // This phase is Forward Backward Euler which has two steps.
83 }
84 else
85 {
87 m_integration_phases[0], order, freeParams);
88 }
89 }
90
92 {
93 }
94
96 std::string variant, size_t order, std::vector<NekDouble> freeParams)
97 {
100 variant, order, freeParams);
101
102 return p;
103 }
104
105 static std::string className;
106
108 size_t order,
109 std::vector<NekDouble> freeParams)
110 {
111 ASSERTL1(freeParams.size() == 2,
112 "IMEX DIRK Time integration scheme invalid number "
113 "of free parameters, expected two "
114 "<implicit stages, explicit stages>, received " +
115 std::to_string(freeParams.size()) + ".");
116
117 size_t s = freeParams[0];
118 size_t sigma = freeParams[1];
119
120 phase->m_schemeType = eIMEX;
121 phase->m_variant = "DIRK";
122 phase->m_order = order;
123 phase->m_name = "IMEX_DIRK"
124 "_" +
125 std::to_string(s) + "_" + std::to_string(sigma) + "_" +
126 std::to_string(phase->m_order);
127
128 phase->m_numsteps = 1;
129 phase->m_numstages = s + 1;
130
131 phase->m_A = Array<OneD, Array<TwoD, NekDouble>>(2);
132 phase->m_B = Array<OneD, Array<TwoD, NekDouble>>(2);
133
134 phase->m_A[0] =
135 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numstages, 0.0);
136 phase->m_B[0] =
137 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numstages, 0.0);
138 phase->m_A[1] =
139 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numstages, 0.0);
140 phase->m_B[1] =
141 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numstages, 0.0);
142 phase->m_U =
143 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numsteps, 1.0);
144 phase->m_V =
145 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numsteps, 1.0);
146
147 if (s == 1 && sigma == 2 && order == 1)
148 {
150 }
151 else if (s == 1 && sigma == 2 && order == 2)
152 {
154 }
155 else if (s == 2 && sigma == 2 && order == 2)
156 {
158 }
159 else if (s == 2 && sigma == 3 && order == 2)
160 {
162 }
163 else if (s == 2 && sigma == 3 && order == 3)
164 {
166 }
167 else if (s == 3 && sigma == 4 && order == 3)
168 {
170 }
171 else if (s == 4 && sigma == 4 && order == 3)
172 {
174 }
175 else
176 {
177 ASSERTL1(false,
178 "IMEX DIRK Time integration scheme bad type "
179 "(s, sigma, order) : (" +
180 std::to_string(s) + "," + std::to_string(sigma) + "," +
181 std::to_string(order) + "). " +
182 "Allowed combinations: (1,1,1), (1,2,1), (1,2,2), "
183 "(2,2,2), (2,3,2), (2,3,3), (3,4,3), (4,4,3)");
184 }
185
186 phase->m_numMultiStepValues = 1;
187 phase->m_numMultiStepImplicitDerivs = 0;
188 phase->m_numMultiStepExplicitDerivs = 0;
189 phase->m_timeLevelOffset = Array<OneD, size_t>(phase->m_numsteps);
190 phase->m_timeLevelOffset[0] = 0;
191
192 phase->CheckAndVerify();
193 }
194
195 ///////////////////////////////////////////////////////////////////////////////
196 // IMEX Dirk 1 1 1 : Forward - Backward Euler IMEX
199 {
200 phase->m_schemeType = eIMEX;
201 phase->m_order = 1;
202 phase->m_name =
203 std::string("IMEXdirk_1_1_" + std::to_string(phase->m_order));
204
205 phase->m_numsteps = 2;
206 phase->m_numstages = 1;
207
208 phase->m_A = Array<OneD, Array<TwoD, NekDouble>>(2);
209 phase->m_B = Array<OneD, Array<TwoD, NekDouble>>(2);
210
211 phase->m_A[0] =
212 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numstages, 0.0);
213 phase->m_B[0] =
214 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numstages, 0.0);
215 phase->m_A[1] =
216 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numstages, 0.0);
217 phase->m_B[1] =
218 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numstages, 0.0);
219 phase->m_U =
220 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numsteps, 0.0);
221 phase->m_V =
222 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numsteps, 0.0);
223
224 phase->m_A[0][0][0] = 1.0;
225
226 phase->m_B[0][0][0] = 1.0;
227 phase->m_B[1][1][0] = 1.0;
228
229 phase->m_U[0][0] = 1.0;
230 phase->m_U[0][1] = 1.0;
231
232 phase->m_V[0][0] = 1.0;
233 phase->m_V[0][1] = 1.0;
234
235 phase->m_numMultiStepValues = 1;
236 phase->m_numMultiStepImplicitDerivs = 0;
237 phase->m_numMultiStepExplicitDerivs = 1;
238
239 phase->m_timeLevelOffset = Array<OneD, size_t>(phase->m_numsteps);
240 phase->m_timeLevelOffset[0] = 0;
241 phase->m_timeLevelOffset[1] = 0;
242
243 phase->CheckAndVerify();
244 }
245
246 ///////////////////////////////////////////////////////////////////////////////
247 // IMEX Dirk 1 2 1 : Forward - Backward Euler IMEX w/B implicit == B
248 // explicit
251 {
252 phase->m_A[0][1][1] = 1.0;
253 phase->m_B[0][0][1] = 1.0;
254
255 phase->m_A[1][1][0] = 1.0;
256 phase->m_B[1][0][1] = 1.0;
257
258 // U and V set to 1 when allocated.
259 }
260
261 ////////////////////////////////////////////////////////////////////////////
262 // IMEX Dirk 1 2 2 : Implict-Explicit Midpoint IMEX
265 {
266 phase->m_A[0][1][1] = 1.0 / 2.0;
267 phase->m_B[0][0][1] = 1.0;
268
269 phase->m_A[1][1][0] = 1.0 / 2.0;
270 phase->m_B[1][0][1] = 1.0;
271
272 // U and V set to 1 when allocated.
273 }
274
275 ////////////////////////////////////////////////////////////////////////////
276 // IMEX Dirk 2 2 2 : L Stable, two stage, second order IMEX
279 {
280 const NekDouble glambda = 1.0 - sqrt(2.0) / 2.0;
281 const NekDouble gdelta = -sqrt(2.0) / 2.0;
282
283 phase->m_A[0][1][1] = glambda;
284 phase->m_A[0][2][1] = 1.0 - glambda;
285 phase->m_A[0][2][2] = glambda;
286
287 phase->m_B[0][0][1] = 1.0 - glambda;
288 phase->m_B[0][0][2] = glambda;
289
290 phase->m_A[1][1][0] = glambda;
291 phase->m_A[1][2][0] = gdelta;
292 phase->m_A[1][2][1] = 1.0 - gdelta;
293
294 phase->m_B[1][0][0] = gdelta;
295 phase->m_B[1][0][1] = 1.0 - gdelta;
296
297 // U and V set to 1 when allocated.
298 }
299
300 ////////////////////////////////////////////////////////////////////////////
301 // IMEX Dirk 2 3 2 : L Stable, two stage, second order IMEX
304 {
305 const NekDouble lambda = (2.0 - sqrt(2.0)) / 2.0;
306 const NekDouble delta = -2.0 * sqrt(2.0) / 3.0;
307
308 phase->m_A[0][1][1] = lambda;
309 phase->m_A[0][2][1] = 1.0 - lambda;
310 phase->m_A[0][2][2] = lambda;
311
312 phase->m_B[0][0][1] = 1.0 - lambda;
313 phase->m_B[0][0][2] = lambda;
314
315 phase->m_A[1][1][0] = lambda;
316 phase->m_A[1][2][0] = delta;
317 phase->m_A[1][2][1] = 1.0 - delta;
318
319 phase->m_B[1][0][1] = 1.0 - lambda;
320 phase->m_B[1][0][2] = lambda;
321
322 // U and V set to 1 when allocated.
323 }
324
325 ////////////////////////////////////////////////////////////////////////////
326 // IMEX Dirk 2 3 3 : L Stable, two stage, third order IMEX
329 {
330 const NekDouble glambda = (3.0 + sqrt(3.0)) / 6.0;
331
332 phase->m_A[0][1][1] = glambda;
333 phase->m_A[0][2][1] = 1.0 - 2.0 * glambda;
334 phase->m_A[0][2][2] = glambda;
335
336 phase->m_B[0][0][1] = 0.5;
337 phase->m_B[0][0][2] = 0.5;
338
339 phase->m_A[1][1][0] = glambda;
340 phase->m_A[1][2][0] = glambda - 1.0;
341 phase->m_A[1][2][1] = 2.0 * (1.0 - glambda);
342
343 phase->m_B[1][0][1] = 0.5;
344 phase->m_B[1][0][2] = 0.5;
345
346 // U and V set to 1 when allocated.
347 }
348
349 ////////////////////////////////////////////////////////////////////////////
350 // IMEX Dirk 3 4 3 : L Stable, three stage, third order IMEX
353 {
354 constexpr NekDouble lambda = 0.4358665215;
355
356 phase->m_A[0][1][1] = lambda;
357 phase->m_A[0][2][1] = 0.5 * (1.0 - lambda);
358 phase->m_A[0][2][2] = lambda;
359 phase->m_A[0][3][1] =
360 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
361 phase->m_A[0][3][2] =
362 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
363 phase->m_A[0][3][3] = lambda;
364
365 phase->m_B[0][0][1] =
366 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
367 phase->m_B[0][0][2] =
368 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
369 phase->m_B[0][0][3] = lambda;
370
371 phase->m_A[1][1][0] = 0.4358665215;
372 phase->m_A[1][2][0] = 0.3212788860;
373 phase->m_A[1][2][1] = 0.3966543747;
374 phase->m_A[1][3][0] = -0.105858296;
375 phase->m_A[1][3][1] = 0.5529291479;
376 phase->m_A[1][3][2] = 0.5529291479;
377
378 phase->m_B[1][0][1] =
379 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
380 phase->m_B[1][0][2] =
381 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
382 phase->m_B[1][0][3] = lambda;
383
384 // U and V set to 1 when allocated.
385 }
386
387 ////////////////////////////////////////////////////////////////////////////
388 // IMEX Dirk 4 4 3 : L Stable, four stage, third order IMEX
391 {
392 phase->m_A[0][1][1] = 1.0 / 2.0;
393 phase->m_A[0][2][1] = 1.0 / 6.0;
394 phase->m_A[0][2][2] = 1.0 / 2.0;
395 phase->m_A[0][3][1] = -1.0 / 2.0;
396 phase->m_A[0][3][2] = 1.0 / 2.0;
397 phase->m_A[0][3][3] = 1.0 / 2.0;
398 phase->m_A[0][4][1] = 3.0 / 2.0;
399 phase->m_A[0][4][2] = -3.0 / 2.0;
400 phase->m_A[0][4][3] = 1.0 / 2.0;
401 phase->m_A[0][4][4] = 1.0 / 2.0;
402
403 phase->m_B[0][0][1] = 3.0 / 2.0;
404 phase->m_B[0][0][2] = -3.0 / 2.0;
405 phase->m_B[0][0][3] = 1.0 / 2.0;
406 phase->m_B[0][0][4] = 1.0 / 2.0;
407
408 phase->m_A[1][1][0] = 1.0 / 2.0;
409 phase->m_A[1][2][0] = 11.0 / 18.0;
410 phase->m_A[1][2][1] = 1.0 / 18.0;
411 phase->m_A[1][3][0] = 5.0 / 6.0;
412 phase->m_A[1][3][1] = -5.0 / 6.0;
413 phase->m_A[1][3][2] = 1.0 / 2.0;
414 phase->m_A[1][4][0] = 1.0 / 4.0;
415 phase->m_A[1][4][1] = 7.0 / 4.0;
416 phase->m_A[1][4][2] = 3.0 / 4.0;
417 phase->m_A[1][4][3] = -7.0 / 4.0;
418
419 phase->m_B[1][0][0] = 1.0 / 4.0;
420 phase->m_B[1][0][1] = 7.0 / 4.0;
421 phase->m_B[1][0][2] = 3.0 / 4.0;
422 phase->m_B[1][0][3] = -7.0 / 4.0;
423
424 // U and V set to 1 when allocated.
425 }
426
427protected:
428 LUE std::string v_GetFullName() const override
429 {
430 return m_integration_phases.back()->m_name;
431 }
432
433 LUE std::string v_GetName() const override
434 {
435 return std::string("IMEX");
436 }
437
439 {
440 return 1.0;
441 }
442
443}; // end class IMEXdirkTimeIntegrationScheme
444
445///////////////////////////////////////////////////////////////////////////////
446// IMEX Dirk 1 1 1 : Forward - Backward Euler IMEX
448{
449public:
450 IMEXdirk_1_1_1TimeIntegrationScheme(std::string variant, size_t order,
451 std::vector<NekDouble> freeParams)
452 : IMEXdirkTimeIntegrationScheme("", 1, std::vector<NekDouble>{1, 1})
453 {
454 boost::ignore_unused(variant, order, freeParams);
455 }
456
458 {
459 }
460
462 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
463 [[maybe_unused]] std::vector<NekDouble> freeParams)
464 {
467 AllocateSharedPtr("", 1, std::vector<NekDouble>{1, 1});
468
469 return p;
470 }
471
472 static std::string className;
473
474protected:
476
477}; // end class IMEXdirk_1_1_1TimeIntegrator
478
479// IMEX Dirk 1 2 1 : Forward - Backward Euler IMEX w/B implicit == B explicit
481{
482public:
483 IMEXdirk_1_2_1TimeIntegrationScheme(std::string variant, size_t order,
484 std::vector<NekDouble> freeParams)
485 : IMEXdirkTimeIntegrationScheme("", 1, std::vector<NekDouble>{1, 2})
486 {
487 boost::ignore_unused(variant, order, freeParams);
488 }
489
491 {
492 }
493
495 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
496 [[maybe_unused]] std::vector<NekDouble> freeParams)
497 {
500 "", 1, std::vector<NekDouble>{1, 2});
501
502 return p;
503 }
504
505 static std::string className;
506
507protected:
509
510}; // end class IMEXdirk_1_2_1TimeIntegrator
511
512// IMEX Dirk 1 2 2 : Implict-Explicit Midpoint IMEX
514{
515public:
516 IMEXdirk_1_2_2TimeIntegrationScheme(std::string variant, size_t order,
517 std::vector<NekDouble> freeParams)
518 : IMEXdirkTimeIntegrationScheme("", 2, std::vector<NekDouble>{1, 2})
519 {
520 boost::ignore_unused(variant, order, freeParams);
521 }
522
524 {
525 }
526
528 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
529 [[maybe_unused]] std::vector<NekDouble> freeParams)
530 {
533 "", 2, std::vector<NekDouble>{1, 2});
534
535 return p;
536 }
537
538 static std::string className;
539
540protected:
542
543}; // end class IMEXdirk_1_2_2TimeIntegrator
544
545// IMEX Dirk 2 2 2 : L Stable, two stage, second order IMEX
547{
548public:
549 IMEXdirk_2_2_2TimeIntegrationScheme(std::string variant, size_t order,
550 std::vector<NekDouble> freeParams)
551 : IMEXdirkTimeIntegrationScheme("", 2, std::vector<NekDouble>{2, 2})
552 {
553 boost::ignore_unused(variant, order, freeParams);
554 }
555
557 {
558 }
559
561 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
562 [[maybe_unused]] std::vector<NekDouble> freeParams)
563 {
566 AllocateSharedPtr("", 2, std::vector<NekDouble>{2, 2});
567
568 return p;
569 }
570
571 static std::string className;
572
573protected:
575
576}; // end class IMEXdirk_2_2_2TimeIntegrationScheme
577
578// IMEX Dirk 2 3 2 : L Stable, two stage, second order IMEX
580{
581public:
582 IMEXdirk_2_3_2TimeIntegrationScheme(std::string variant, size_t order,
583 std::vector<NekDouble> freeParams)
584 : IMEXdirkTimeIntegrationScheme("", 2, std::vector<NekDouble>{2, 3})
585 {
586 boost::ignore_unused(variant, order, freeParams);
587 }
588
590 {
591 }
592
594 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
595 [[maybe_unused]] std::vector<NekDouble> freeParams)
596 {
599 "", 2, std::vector<NekDouble>{2, 3});
600
601 return p;
602 }
603
604 static std::string className;
605
606protected:
608
609}; // end class IMEXdirk_2_3_2TimeIntegrationScheme
610
611///////////////////////////////////////////////////////////////////////////////
612// IMEX Dirk 2 3 3 : L Stable, two stage, third order IMEX
614{
615public:
616 IMEXdirk_2_3_3TimeIntegrationScheme(std::string variant, size_t order,
617 std::vector<NekDouble> freeParams)
618 : IMEXdirkTimeIntegrationScheme("", 3, std::vector<NekDouble>{2, 3})
619 {
620 boost::ignore_unused(variant, order, freeParams);
621 }
622
624 {
625 }
626
628 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
629 [[maybe_unused]] std::vector<NekDouble> freeParams)
630 {
633 "", 3, std::vector<NekDouble>{2, 3});
634
635 return p;
636 }
637
638 static std::string className;
639
640protected:
642
643}; // end class IMEXdirk_2_3_3TimeIntegrationScheme
644
645///////////////////////////////////////////////////////////////////////////////
646// IMEX Dirk 3 4 3 : L Stable, three stage, third order IMEX
648{
649public:
650 IMEXdirk_3_4_3TimeIntegrationScheme(std::string variant, size_t order,
651 std::vector<NekDouble> freeParams)
652 : IMEXdirkTimeIntegrationScheme("", 3, std::vector<NekDouble>{3, 4})
653 {
654 boost::ignore_unused(variant, order, freeParams);
655 }
656
658 {
659 }
660
662 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
663 [[maybe_unused]] std::vector<NekDouble> freeParams)
664 {
667 "", 3, std::vector<NekDouble>{3, 4});
668
669 return p;
670 }
671
672 static std::string className;
673
674protected:
676
677}; // end class IMEXdirk_3_4_3TimeIntegrationScheme
678
679///////////////////////////////////////////////////////////////////////////////
680// IMEX Dirk 4 4 3 : L Stable, four stage, third order IMEX
682{
683public:
684 IMEXdirk_4_4_3TimeIntegrationScheme(std::string variant, size_t order,
685 std::vector<NekDouble> freeParams)
686 : IMEXdirkTimeIntegrationScheme("", 3, std::vector<NekDouble>{4, 4})
687 {
688 boost::ignore_unused(variant, order, freeParams);
689 }
690
692 {
693 }
694
696 [[maybe_unused]] std::string variant, [[maybe_unused]] size_t order,
697 [[maybe_unused]] std::vector<NekDouble> freeParams)
698 {
701 "", 3, std::vector<NekDouble>{4, 4});
702
703 return p;
704 }
705
706 static std::string className;
707
708protected:
710
711}; // end class IMEXdirk_4_4_3TimeIntegrationScheme
712
713} // namespace Nektar::LibUtilities
714
715#endif
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Definition: ErrorUtil.hpp:242
IMEXdirk_1_1_1TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_1_2_1TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_1_2_2TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_2_2_2TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_2_3_2TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_2_3_3TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_3_4_3TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
IMEXdirk_4_4_3TimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static LUE void SetupSchemeData(TimeIntegrationAlgorithmGLMSharedPtr &phase, size_t order, std::vector< NekDouble > freeParams)
static LUE void SetupSchemeData_2_2_2(TimeIntegrationAlgorithmGLMSharedPtr &phase)
IMEXdirkTimeIntegrationScheme(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static LUE void SetupSchemeData_1_2_2(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_2_3_3(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static TimeIntegrationSchemeSharedPtr create(std::string variant, size_t order, std::vector< NekDouble > freeParams)
static LUE void SetupSchemeData_2_3_2(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_3_4_3(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_1_1_1(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_4_4_3(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_1_2_1(TimeIntegrationAlgorithmGLMSharedPtr &phase)
Base class for GLM time integration schemes.
TimeIntegrationAlgorithmGLMVector m_integration_phases
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< TimeIntegrationAlgorithmGLM > TimeIntegrationAlgorithmGLMSharedPtr
@ eIMEX
Implicit Explicit General Linear Method.
std::vector< TimeIntegrationAlgorithmGLMSharedPtr > TimeIntegrationAlgorithmGLMVector
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr
double NekDouble
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294