41 #ifndef NEKTAR_LIB_UTILITIES_TIME_INTEGRATION_RK_TIME_INTEGRATION_SCHEME
42 #define NEKTAR_LIB_UTILITIES_TIME_INTEGRATION_RK_TIME_INTEGRATION_SCHEME
44 #define LUE LIB_UTILITIES_EXPORT
51 namespace LibUtilities
61 std::vector<NekDouble> freeParams)
64 ASSERTL1(variant ==
"" || variant ==
"SSP",
65 "Runge Kutta Time integration scheme unknown variant: " +
66 variant +
". Must be blank or 'SSP'");
70 ASSERTL1((variant ==
"" && 1 <= order && order <= 5) ||
71 (variant ==
"SSP" && 1 <= order && order <= 3),
72 "Runge Kutta Time integration scheme bad order, "
73 "Std (1-5) or SSP (1-3): " +
74 std::to_string(order));
89 std::string variant,
unsigned int order,
90 std::vector<NekDouble> freeParams)
94 variant, order, freeParams);
103 return std::string(
"RungeKutta");
119 std::string variant,
unsigned int order,
120 std::vector<NekDouble> freeParams)
122 boost::ignore_unused(freeParams);
124 const unsigned int nStages[6] = {0, 1, 2, 3, 4, 6};
136 const NekDouble Acoefficients[2][6][15] =
137 { { { 0., 0., 0., 0., 0.,
139 0., 0., 0., 0., 0. },
141 { 0., 0., 0., 0., 0.,
143 0., 0., 0., 0., 0. },
148 0., 0., 0., 0., 0. },
154 0., 0., 0., 0., 0. },
160 0., 0., 0., 0., 0. },
165 3./16., -3./8., 3./8., 9./16.,
166 -3./7., 8./7., 6./7., -12./7., 8./7. } },
168 { { 0., 0., 0., 0., 0.,
170 0., 0., 0., 0., 0. },
172 { 0., 0., 0., 0., 0.,
174 0., 0., 0., 0., 0. },
179 0., 0., 0., 0., 0. },
185 0., 0., 0., 0., 0. },
191 0., 0., 0., 0., 0. },
196 3./16., -3./8., 3./8., 9./16.,
197 -3./7., 8./7., 6./7., -12./7., 8./7. } } };
204 { { { 0., 0., 0., 0., 0. },
206 { 1., 0., 0., 0., 0. },
208 { 0., 1., 0., 0., 0. },
210 { 2./9., 3./9., 4./9., 0., 0. },
212 { 1./6., 2./6., 2./6., 1./6., 0. },
214 { 7./90., 32./90., 12./90., 32./90., 7./90. } },
216 { { 0., 0., 0., 0., 0. },
218 { 1., 0., 0., 0., 0. },
220 { 1./2., 1./2., 0., 0., 0. },
222 { 1./6., 1./6., 4./6., 0., 0. },
224 { 1./6., 2./6., 2./6., 1./6., 0. },
226 { 7./90., 32./90., 12./90., 32./90., 7./90. } } };
229 unsigned int index = (variant ==
"SSP" || variant ==
"ImprovedEuler");
232 phase->m_variant = variant;
233 phase->m_order = order;
234 phase->m_name = std::string(
"RungeKutta") + phase->m_variant +
235 std::string(
"Order") + std::to_string(phase->m_order);
237 phase->m_numsteps = 1;
238 phase->m_numstages = nStages[phase->m_order];
257 for (
int s = 1; s < phase->m_numstages; ++s)
259 for (
int i = 0; i < s; ++i)
261 phase->m_A[0][s][i] =
262 Acoefficients[index][phase->m_order][cc++];
267 for (
int n = 0; n < phase->m_order; ++n)
269 phase->m_B[0][0][n] = Bcoefficients[index][phase->m_order][n];
272 phase->m_numMultiStepValues = 1;
273 phase->m_numMultiStepDerivs = 0;
275 phase->m_timeLevelOffset[0] = 0;
277 phase->CheckAndVerify();
288 std::vector<NekDouble> freeParams)
291 boost::ignore_unused(variant);
292 boost::ignore_unused(order);
296 std::string variant,
unsigned int order,
297 std::vector<NekDouble> freeParams)
299 boost::ignore_unused(variant);
300 boost::ignore_unused(order);
318 std::vector<NekDouble> freeParams)
321 boost::ignore_unused(variant);
322 boost::ignore_unused(order);
326 std::string variant,
unsigned int order,
327 std::vector<NekDouble> freeParams)
329 boost::ignore_unused(variant);
330 boost::ignore_unused(order);
346 std::vector<NekDouble> freeParams)
349 boost::ignore_unused(variant);
350 boost::ignore_unused(order);
354 std::string variant,
unsigned int order,
355 std::vector<NekDouble> freeParams)
357 boost::ignore_unused(variant);
358 boost::ignore_unused(order);
375 std::string variant,
unsigned int order,
376 std::vector<NekDouble> freeParams)
379 boost::ignore_unused(variant);
380 boost::ignore_unused(order);
384 std::string variant,
unsigned int order,
385 std::vector<NekDouble> freeParams)
387 boost::ignore_unused(variant);
388 boost::ignore_unused(order);
392 "SSP", 2, freeParams);
406 std::vector<NekDouble> freeParams)
409 boost::ignore_unused(variant);
410 boost::ignore_unused(order);
414 std::string variant,
unsigned int order,
415 std::vector<NekDouble> freeParams)
417 boost::ignore_unused(variant);
418 boost::ignore_unused(order);
422 "SSP", 2, freeParams);
436 std::vector<NekDouble> freeParams)
439 boost::ignore_unused(variant);
440 boost::ignore_unused(order);
444 std::string variant,
unsigned int order,
445 std::vector<NekDouble> freeParams)
447 boost::ignore_unused(variant);
448 boost::ignore_unused(order);
452 "SSP", 3, freeParams);
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
static std::string className
ClassicalRungeKutta4TimeIntegrationScheme(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
RungeKutta2_ImprovedEulerTimeIntegrationScheme(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
RungeKutta2_SSPTimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
RungeKutta2TimeIntegrationScheme(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)
static std::string className
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
RungeKutta3_SSPTimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
RungeKutta5TimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static std::string className
static LUE void SetupSchemeData(TimeIntegrationAlgorithmGLMSharedPtr &phase, std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
virtual LUE NekDouble GetTimeStability() const
static std::string className
virtual LUE std::string GetName() const
virtual ~RungeKuttaTimeIntegrationScheme()
RungeKuttaTimeIntegrationScheme(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
static TimeIntegrationSchemeSharedPtr create(std::string variant, unsigned int order, std::vector< NekDouble > freeParams)
Base class for GLM time integration schemes.
TimeIntegrationAlgorithmGLMVector m_integration_phases
virtual LUE unsigned int GetOrder() const
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
std::shared_ptr< TimeIntegrationAlgorithmGLM > TimeIntegrationAlgorithmGLMSharedPtr
@ eExplicit
Formally explicit scheme.
std::vector< TimeIntegrationAlgorithmGLMSharedPtr > TimeIntegrationAlgorithmGLMVector
std::shared_ptr< TimeIntegrationScheme > TimeIntegrationSchemeSharedPtr
The above copyright notice and this permission notice shall be included.