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);
116 return std::string(
"IMEX");
126 std::vector<NekDouble> freeParams)
129 "IMEX DIRK Time integration scheme invalid number "
130 "of free parameters, expected two "
131 "<implicit stages, explicit stages>, received " +
132 std::to_string(freeParams.size()) +
".");
134 int s = freeParams[0];
135 int sigma = freeParams[1];
137 phase->m_schemeType =
eIMEX;
138 phase->m_variant =
"DIRK";
139 phase->m_order = order;
140 phase->m_name =
"IMEX_DIRK"
142 std::to_string(s) +
"_" + std::to_string(sigma) +
"_" +
143 std::to_string(phase->m_order);
145 phase->m_numsteps = 1;
146 phase->m_numstages = s + 1;
164 if (s == 1 && sigma == 2 && order == 1)
168 else if (s == 1 && sigma == 2 && order == 2)
172 else if (s == 2 && sigma == 2 && order == 2)
176 else if (s == 2 && sigma == 3 && order == 2)
180 else if (s == 2 && sigma == 3 && order == 3)
184 else if (s == 3 && sigma == 4 && order == 3)
188 else if (s == 4 && sigma == 4 && order == 3)
195 "IMEX DIRK Time integration scheme bad type "
196 "(s, sigma, order) : (" +
197 std::to_string(s) +
"," + std::to_string(sigma) +
"," +
198 std::to_string(order) +
"). " +
199 "Allowed combinations: (1,1,1), (1,2,1), (1,2,2), "
200 "(2,2,2), (2,3,2), (2,3,3), (3,4,3), (4,4,3)");
203 phase->m_numMultiStepValues = 1;
204 phase->m_numMultiStepDerivs = 0;
207 phase->m_timeLevelOffset[0] = 0;
209 phase->CheckAndVerify();
217 phase->m_schemeType =
eIMEX;
220 std::string(
"IMEXdirk_1_1_" + std::to_string(phase->m_order));
222 phase->m_numsteps = 2;
223 phase->m_numstages = 1;
241 phase->m_A[0][0][0] = 1.0;
243 phase->m_B[0][0][0] = 1.0;
244 phase->m_B[1][1][0] = 1.0;
246 phase->m_U[0][0] = 1.0;
247 phase->m_U[0][1] = 1.0;
249 phase->m_V[0][0] = 1.0;
250 phase->m_V[0][1] = 1.0;
252 phase->m_numMultiStepValues = 1;
253 phase->m_numMultiStepDerivs = 1;
256 phase->m_timeLevelOffset[0] = 0;
257 phase->m_timeLevelOffset[1] = 0;
259 phase->CheckAndVerify();
268 phase->m_A[0][1][1] = 1.0;
269 phase->m_B[0][0][1] = 1.0;
271 phase->m_A[1][1][0] = 1.0;
272 phase->m_B[1][0][1] = 1.0;
282 phase->m_A[0][1][1] = 1.0 / 2.0;
283 phase->m_B[0][0][1] = 1.0;
285 phase->m_A[1][1][0] = 1.0 / 2.0;
286 phase->m_B[1][0][1] = 1.0;
296 NekDouble glambda = 0.2928932188134524756;
297 NekDouble gdelta = -0.7071067811865475244;
299 phase->m_A[0][1][1] = glambda;
300 phase->m_A[0][2][1] = 1.0 - glambda;
301 phase->m_A[0][2][2] = glambda;
303 phase->m_B[0][0][1] = 1.0 - glambda;
304 phase->m_B[0][0][2] = glambda;
306 phase->m_A[1][1][0] = glambda;
307 phase->m_A[1][2][0] = gdelta;
308 phase->m_A[1][2][1] = 1.0 - gdelta;
310 phase->m_B[1][0][0] = gdelta;
311 phase->m_B[1][0][1] = 1.0 - gdelta;
324 phase->m_A[0][1][1] = lambda;
325 phase->m_A[0][2][1] = 1.0 - lambda;
326 phase->m_A[0][2][2] = lambda;
328 phase->m_B[0][0][1] = 1.0 - lambda;
329 phase->m_B[0][0][2] = lambda;
331 phase->m_A[1][1][0] = lambda;
332 phase->m_A[1][2][0] = delta;
333 phase->m_A[1][2][1] = 1.0 - delta;
335 phase->m_B[1][0][1] = 1.0 - lambda;
336 phase->m_B[1][0][2] = lambda;
348 phase->m_A[0][1][1] = glambda;
349 phase->m_A[0][2][1] = 1.0 - 2.0 * glambda;
350 phase->m_A[0][2][2] = glambda;
352 phase->m_B[0][0][1] = 0.5;
353 phase->m_B[0][0][2] = 0.5;
355 phase->m_A[1][1][0] = glambda;
356 phase->m_A[1][2][0] = glambda - 1.0;
357 phase->m_A[1][2][1] = 2.0 * (1 - glambda);
359 phase->m_B[1][0][1] = 0.5;
360 phase->m_B[1][0][2] = 0.5;
372 phase->m_A[0][1][1] = lambda;
373 phase->m_A[0][2][1] = 0.5 * (1.0 - lambda);
374 phase->m_A[0][3][1] =
375 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
376 phase->m_A[0][2][2] = lambda;
377 phase->m_A[0][3][2] =
378 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
379 phase->m_A[0][3][3] = lambda;
381 phase->m_B[0][0][1] =
382 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
383 phase->m_B[0][0][2] =
384 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
385 phase->m_B[0][0][3] = lambda;
387 phase->m_A[1][1][0] = 0.4358665215;
388 phase->m_A[1][2][0] = 0.3212788860;
389 phase->m_A[1][2][1] = 0.3966543747;
390 phase->m_A[1][3][0] = -0.105858296;
391 phase->m_A[1][3][1] = 0.5529291479;
392 phase->m_A[1][3][2] = 0.5529291479;
394 phase->m_B[1][0][1] =
395 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
396 phase->m_B[1][0][2] =
397 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
398 phase->m_B[1][0][3] = lambda;
408 phase->m_A[0][1][1] = 1.0 / 2.0;
409 phase->m_A[0][2][1] = 1.0 / 6.0;
410 phase->m_A[0][2][2] = 1.0 / 2.0;
411 phase->m_A[0][3][1] = -1.0 / 2.0;
412 phase->m_A[0][3][2] = 1.0 / 2.0;
413 phase->m_A[0][3][3] = 1.0 / 2.0;
414 phase->m_A[0][4][1] = 3.0 / 2.0;
415 phase->m_A[0][4][2] = -3.0 / 2.0;
416 phase->m_A[0][4][3] = 1.0 / 2.0;
417 phase->m_A[0][4][4] = 1.0 / 2.0;
419 phase->m_B[0][0][1] = 3.0 / 2.0;
420 phase->m_B[0][0][2] = -3.0 / 2.0;
421 phase->m_B[0][0][3] = 1.0 / 2.0;
422 phase->m_B[0][0][4] = 1.0 / 2.0;
424 phase->m_A[1][1][0] = 1.0 / 2.0;
425 phase->m_A[1][2][0] = 11.0 / 18.0;
426 phase->m_A[1][2][1] = 1.0 / 18.0;
427 phase->m_A[1][3][0] = 5.0 / 6.0;
428 phase->m_A[1][3][1] = -5.0 / 6.0;
429 phase->m_A[1][3][2] = 1.0 / 2.0;
430 phase->m_A[1][4][0] = 1.0 / 4.0;
431 phase->m_A[1][4][1] = 7.0 / 4.0;
432 phase->m_A[1][4][2] = 3.0 / 4.0;
433 phase->m_A[1][4][3] = -7.0 / 4.0;
435 phase->m_B[1][0][0] = 1.0 / 4.0;
436 phase->m_B[1][0][1] = 7.0 / 4.0;
437 phase->m_B[1][0][2] = 3.0 / 4.0;
438 phase->m_B[1][0][3] = -7.0 / 4.0;
451 std::vector<NekDouble> freeParams)
454 boost::ignore_unused(variant);
455 boost::ignore_unused(order);
456 boost::ignore_unused(freeParams);
464 std::string variant,
unsigned int order,
465 std::vector<NekDouble> freeParams)
467 boost::ignore_unused(variant);
468 boost::ignore_unused(order);
469 boost::ignore_unused(freeParams);
487 std::vector<NekDouble> freeParams)
490 boost::ignore_unused(variant);
491 boost::ignore_unused(order);
492 boost::ignore_unused(freeParams);
500 std::string variant,
unsigned int order,
501 std::vector<NekDouble> freeParams)
503 boost::ignore_unused(variant);
504 boost::ignore_unused(order);
505 boost::ignore_unused(freeParams);
509 "", 1, std::vector<NekDouble>{1, 2});
523 std::vector<NekDouble> freeParams)
526 boost::ignore_unused(variant);
527 boost::ignore_unused(order);
528 boost::ignore_unused(freeParams);
536 std::string variant,
unsigned int order,
537 std::vector<NekDouble> freeParams)
539 boost::ignore_unused(variant);
540 boost::ignore_unused(order);
541 boost::ignore_unused(freeParams);
545 "", 2, std::vector<NekDouble>{1, 2});
559 std::vector<NekDouble> freeParams)
562 boost::ignore_unused(variant);
563 boost::ignore_unused(order);
564 boost::ignore_unused(freeParams);
572 std::string variant,
unsigned int order,
573 std::vector<NekDouble> freeParams)
575 boost::ignore_unused(variant);
576 boost::ignore_unused(order);
577 boost::ignore_unused(freeParams);
595 std::vector<NekDouble> freeParams)
598 boost::ignore_unused(variant);
599 boost::ignore_unused(order);
600 boost::ignore_unused(freeParams);
608 std::string variant,
unsigned int order,
609 std::vector<NekDouble> freeParams)
611 boost::ignore_unused(variant);
612 boost::ignore_unused(order);
613 boost::ignore_unused(freeParams);
617 "", 2, std::vector<NekDouble>{2, 3});
632 std::vector<NekDouble> freeParams)
635 boost::ignore_unused(variant);
636 boost::ignore_unused(order);
637 boost::ignore_unused(freeParams);
645 std::string variant,
unsigned int order,
646 std::vector<NekDouble> freeParams)
648 boost::ignore_unused(variant);
649 boost::ignore_unused(order);
650 boost::ignore_unused(freeParams);
654 "", 3, std::vector<NekDouble>{2, 3});
669 std::vector<NekDouble> freeParams)
672 boost::ignore_unused(variant);
673 boost::ignore_unused(order);
674 boost::ignore_unused(freeParams);
682 std::string variant,
unsigned int order,
683 std::vector<NekDouble> freeParams)
685 boost::ignore_unused(variant);
686 boost::ignore_unused(order);
687 boost::ignore_unused(freeParams);
691 "", 3, std::vector<NekDouble>{3, 4});
706 std::vector<NekDouble> freeParams)
709 boost::ignore_unused(order);
710 boost::ignore_unused(variant);
711 boost::ignore_unused(freeParams);
719 std::string variant,
unsigned int order,
720 std::vector<NekDouble> freeParams)
722 boost::ignore_unused(order);
723 boost::ignore_unused(variant);
724 boost::ignore_unused(freeParams);
728 "", 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 ~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 NekDouble GetTimeStability() const
virtual LUE std::string GetFullName() const
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 std::string GetName() const
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)