41 #ifndef NEKTAR_LIB_UTILITIES_TIME_INTEGRATION_IMEX_DIRK_TIME_INTEGRATION_SCHEME
42 #define NEKTAR_LIB_UTILITIES_TIME_INTEGRATION_IMEX_DIRK_TIME_INTEGRATION_SCHEME
44 #define LUE LIB_UTILITIES_EXPORT
51 namespace LibUtilities
63 std::vector<NekDouble> freeParams)
67 "IMEX DIRK Time integration scheme invalid number "
68 "of free parameters, expected two "
69 "<implicit stages, explicit stages>, received " +
70 std::to_string(freeParams.size()));
72 int s = freeParams[0];
73 int sigma = freeParams[1];
79 if (order == 1 && s == 1 && sigma == 1)
97 std::string variant,
unsigned int order,
98 std::vector<NekDouble> freeParams)
102 variant, order, freeParams);
111 std::vector<NekDouble> freeParams)
114 "IMEX DIRK Time integration scheme invalid number "
115 "of free parameters, expected two "
116 "<implicit stages, explicit stages>, received " +
117 std::to_string(freeParams.size()) +
".");
119 int s = freeParams[0];
120 int sigma = freeParams[1];
122 phase->m_schemeType =
eIMEX;
123 phase->m_variant =
"DIRK";
124 phase->m_order = order;
125 phase->m_name =
"IMEX_DIRK"
127 std::to_string(s) +
"_" + std::to_string(sigma) +
"_" +
128 std::to_string(phase->m_order);
130 phase->m_numsteps = 1;
131 phase->m_numstages = s + 1;
149 if (s == 1 && sigma == 2 && order == 1)
153 else if (s == 1 && sigma == 2 && order == 2)
157 else if (s == 2 && sigma == 2 && order == 2)
161 else if (s == 2 && sigma == 3 && order == 2)
165 else if (s == 2 && sigma == 3 && order == 3)
169 else if (s == 3 && sigma == 4 && order == 3)
173 else if (s == 4 && sigma == 4 && order == 3)
180 "IMEX DIRK Time integration scheme bad type "
181 "(s, sigma, order) : (" +
182 std::to_string(s) +
"," + std::to_string(sigma) +
"," +
183 std::to_string(order) +
"). " +
184 "Allowed combinations: (1,1,1), (1,2,1), (1,2,2), "
185 "(2,2,2), (2,3,2), (2,3,3), (3,4,3), (4,4,3)");
188 phase->m_numMultiStepValues = 1;
189 phase->m_numMultiStepImplicitDerivs = 0;
190 phase->m_numMultiStepDerivs = 0;
193 phase->m_timeLevelOffset[0] = 0;
195 phase->CheckAndVerify();
203 phase->m_schemeType =
eIMEX;
206 std::string(
"IMEXdirk_1_1_" + std::to_string(phase->m_order));
208 phase->m_numsteps = 2;
209 phase->m_numstages = 1;
227 phase->m_A[0][0][0] = 1.0;
229 phase->m_B[0][0][0] = 1.0;
230 phase->m_B[1][1][0] = 1.0;
232 phase->m_U[0][0] = 1.0;
233 phase->m_U[0][1] = 1.0;
235 phase->m_V[0][0] = 1.0;
236 phase->m_V[0][1] = 1.0;
238 phase->m_numMultiStepValues = 1;
239 phase->m_numMultiStepImplicitDerivs = 0;
240 phase->m_numMultiStepDerivs = 1;
243 phase->m_timeLevelOffset[0] = 0;
244 phase->m_timeLevelOffset[1] = 0;
246 phase->CheckAndVerify();
255 phase->m_A[0][1][1] = 1.0;
256 phase->m_B[0][0][1] = 1.0;
258 phase->m_A[1][1][0] = 1.0;
259 phase->m_B[1][0][1] = 1.0;
269 phase->m_A[0][1][1] = 1.0 / 2.0;
270 phase->m_B[0][0][1] = 1.0;
272 phase->m_A[1][1][0] = 1.0 / 2.0;
273 phase->m_B[1][0][1] = 1.0;
286 phase->m_A[0][1][1] = glambda;
287 phase->m_A[0][2][1] = 1.0 - glambda;
288 phase->m_A[0][2][2] = glambda;
290 phase->m_B[0][0][1] = 1.0 - glambda;
291 phase->m_B[0][0][2] = glambda;
293 phase->m_A[1][1][0] = glambda;
294 phase->m_A[1][2][0] = gdelta;
295 phase->m_A[1][2][1] = 1.0 - gdelta;
297 phase->m_B[1][0][0] = gdelta;
298 phase->m_B[1][0][1] = 1.0 - gdelta;
311 phase->m_A[0][1][1] = lambda;
312 phase->m_A[0][2][1] = 1.0 - lambda;
313 phase->m_A[0][2][2] = lambda;
315 phase->m_B[0][0][1] = 1.0 - lambda;
316 phase->m_B[0][0][2] = lambda;
318 phase->m_A[1][1][0] = lambda;
319 phase->m_A[1][2][0] = delta;
320 phase->m_A[1][2][1] = 1.0 - delta;
322 phase->m_B[1][0][1] = 1.0 - lambda;
323 phase->m_B[1][0][2] = lambda;
335 phase->m_A[0][1][1] = glambda;
336 phase->m_A[0][2][1] = 1.0 - 2.0 * glambda;
337 phase->m_A[0][2][2] = glambda;
339 phase->m_B[0][0][1] = 0.5;
340 phase->m_B[0][0][2] = 0.5;
342 phase->m_A[1][1][0] = glambda;
343 phase->m_A[1][2][0] = glambda - 1.0;
344 phase->m_A[1][2][1] = 2.0 * (1.0 - glambda);
346 phase->m_B[1][0][1] = 0.5;
347 phase->m_B[1][0][2] = 0.5;
359 phase->m_A[0][1][1] = lambda;
360 phase->m_A[0][2][1] = 0.5 * (1.0 - lambda);
361 phase->m_A[0][2][2] = lambda;
362 phase->m_A[0][3][1] =
363 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
364 phase->m_A[0][3][2] =
365 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
366 phase->m_A[0][3][3] = lambda;
368 phase->m_B[0][0][1] =
369 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
370 phase->m_B[0][0][2] =
371 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
372 phase->m_B[0][0][3] = lambda;
374 phase->m_A[1][1][0] = 0.4358665215;
375 phase->m_A[1][2][0] = 0.3212788860;
376 phase->m_A[1][2][1] = 0.3966543747;
377 phase->m_A[1][3][0] = -0.105858296;
378 phase->m_A[1][3][1] = 0.5529291479;
379 phase->m_A[1][3][2] = 0.5529291479;
381 phase->m_B[1][0][1] =
382 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
383 phase->m_B[1][0][2] =
384 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
385 phase->m_B[1][0][3] = lambda;
395 phase->m_A[0][1][1] = 1.0 / 2.0;
396 phase->m_A[0][2][1] = 1.0 / 6.0;
397 phase->m_A[0][2][2] = 1.0 / 2.0;
398 phase->m_A[0][3][1] = -1.0 / 2.0;
399 phase->m_A[0][3][2] = 1.0 / 2.0;
400 phase->m_A[0][3][3] = 1.0 / 2.0;
401 phase->m_A[0][4][1] = 3.0 / 2.0;
402 phase->m_A[0][4][2] = -3.0 / 2.0;
403 phase->m_A[0][4][3] = 1.0 / 2.0;
404 phase->m_A[0][4][4] = 1.0 / 2.0;
406 phase->m_B[0][0][1] = 3.0 / 2.0;
407 phase->m_B[0][0][2] = -3.0 / 2.0;
408 phase->m_B[0][0][3] = 1.0 / 2.0;
409 phase->m_B[0][0][4] = 1.0 / 2.0;
411 phase->m_A[1][1][0] = 1.0 / 2.0;
412 phase->m_A[1][2][0] = 11.0 / 18.0;
413 phase->m_A[1][2][1] = 1.0 / 18.0;
414 phase->m_A[1][3][0] = 5.0 / 6.0;
415 phase->m_A[1][3][1] = -5.0 / 6.0;
416 phase->m_A[1][3][2] = 1.0 / 2.0;
417 phase->m_A[1][4][0] = 1.0 / 4.0;
418 phase->m_A[1][4][1] = 7.0 / 4.0;
419 phase->m_A[1][4][2] = 3.0 / 4.0;
420 phase->m_A[1][4][3] = -7.0 / 4.0;
422 phase->m_B[1][0][0] = 1.0 / 4.0;
423 phase->m_B[1][0][1] = 7.0 / 4.0;
424 phase->m_B[1][0][2] = 3.0 / 4.0;
425 phase->m_B[1][0][3] = -7.0 / 4.0;
438 return std::string(
"IMEX");
454 std::vector<NekDouble> freeParams)
457 boost::ignore_unused(variant);
458 boost::ignore_unused(order);
459 boost::ignore_unused(freeParams);
467 std::string variant,
unsigned int order,
468 std::vector<NekDouble> freeParams)
470 boost::ignore_unused(variant);
471 boost::ignore_unused(order);
472 boost::ignore_unused(freeParams);
490 std::vector<NekDouble> freeParams)
493 boost::ignore_unused(variant);
494 boost::ignore_unused(order);
495 boost::ignore_unused(freeParams);
503 std::string variant,
unsigned int order,
504 std::vector<NekDouble> freeParams)
506 boost::ignore_unused(variant);
507 boost::ignore_unused(order);
508 boost::ignore_unused(freeParams);
512 "", 1, std::vector<NekDouble>{1, 2});
526 std::vector<NekDouble> freeParams)
529 boost::ignore_unused(variant);
530 boost::ignore_unused(order);
531 boost::ignore_unused(freeParams);
539 std::string variant,
unsigned int order,
540 std::vector<NekDouble> freeParams)
542 boost::ignore_unused(variant);
543 boost::ignore_unused(order);
544 boost::ignore_unused(freeParams);
548 "", 2, std::vector<NekDouble>{1, 2});
562 std::vector<NekDouble> freeParams)
565 boost::ignore_unused(variant);
566 boost::ignore_unused(order);
567 boost::ignore_unused(freeParams);
575 std::string variant,
unsigned int order,
576 std::vector<NekDouble> freeParams)
578 boost::ignore_unused(variant);
579 boost::ignore_unused(order);
580 boost::ignore_unused(freeParams);
598 std::vector<NekDouble> freeParams)
601 boost::ignore_unused(variant);
602 boost::ignore_unused(order);
603 boost::ignore_unused(freeParams);
611 std::string variant,
unsigned int order,
612 std::vector<NekDouble> freeParams)
614 boost::ignore_unused(variant);
615 boost::ignore_unused(order);
616 boost::ignore_unused(freeParams);
620 "", 2, std::vector<NekDouble>{2, 3});
635 std::vector<NekDouble> freeParams)
638 boost::ignore_unused(variant);
639 boost::ignore_unused(order);
640 boost::ignore_unused(freeParams);
648 std::string variant,
unsigned int order,
649 std::vector<NekDouble> freeParams)
651 boost::ignore_unused(variant);
652 boost::ignore_unused(order);
653 boost::ignore_unused(freeParams);
657 "", 3, std::vector<NekDouble>{2, 3});
672 std::vector<NekDouble> freeParams)
675 boost::ignore_unused(variant);
676 boost::ignore_unused(order);
677 boost::ignore_unused(freeParams);
685 std::string variant,
unsigned int order,
686 std::vector<NekDouble> freeParams)
688 boost::ignore_unused(variant);
689 boost::ignore_unused(order);
690 boost::ignore_unused(freeParams);
694 "", 3, std::vector<NekDouble>{3, 4});
709 std::vector<NekDouble> freeParams)
712 boost::ignore_unused(order);
713 boost::ignore_unused(variant);
714 boost::ignore_unused(freeParams);
722 std::string variant,
unsigned int order,
723 std::vector<NekDouble> freeParams)
725 boost::ignore_unused(order);
726 boost::ignore_unused(variant);
727 boost::ignore_unused(freeParams);
731 "", 3, std::vector<NekDouble>{4, 4});
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
virtual ~IMEXdirk_1_1_1TimeIntegrationScheme()
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
IMEXdirk_1_1_1TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static std::string className
static std::string className
virtual ~IMEXdirk_1_2_1TimeIntegrationScheme()
IMEXdirk_1_2_1TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static std::string className
virtual ~IMEXdirk_1_2_2TimeIntegrationScheme()
IMEXdirk_1_2_2TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
virtual ~IMEXdirk_2_2_2TimeIntegrationScheme()
static std::string className
IMEXdirk_2_2_2TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static std::string className
virtual ~IMEXdirk_2_3_2TimeIntegrationScheme()
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
IMEXdirk_2_3_2TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
virtual ~IMEXdirk_2_3_3TimeIntegrationScheme()
static std::string className
IMEXdirk_2_3_3TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
virtual ~IMEXdirk_3_4_3TimeIntegrationScheme()
IMEXdirk_3_4_3TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static std::string className
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
IMEXdirk_4_4_3TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
virtual ~IMEXdirk_4_4_3TimeIntegrationScheme()
static std::string className
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static LUE void SetupSchemeData_2_2_2(TimeIntegrationAlgorithmGLMSharedPtr &phase)
IMEXdirkTimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
virtual LUE std::string v_GetFullName() const override
virtual ~IMEXdirkTimeIntegrationScheme()
static LUE void SetupSchemeData_1_2_2(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_2_3_3(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_2_3_2(TimeIntegrationAlgorithmGLMSharedPtr &phase)
static LUE void SetupSchemeData_3_4_3(TimeIntegrationAlgorithmGLMSharedPtr &phase)
virtual LUE std::string v_GetName() const override
static std::string className
static LUE void SetupSchemeData(TimeIntegrationAlgorithmGLMSharedPtr &phase, unsigned int order, std::vector< NekDouble > freeParams)
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)
virtual LUE NekDouble v_GetTimeStability() const override
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
The above copyright notice and this permission notice shall be included.
scalarT< T > sqrt(scalarT< T > in)