105 std::vector<NekDouble> freeParams)
108 "IMEX DIRK Time integration scheme invalid number "
109 "of free parameters, expected two "
110 "<implicit stages, explicit stages>, received " +
111 std::to_string(freeParams.size()) +
".");
113 size_t s = freeParams[0];
114 size_t sigma = freeParams[1];
116 phase->m_schemeType =
eIMEX;
117 phase->m_variant =
"DIRK";
118 phase->m_order = order;
119 phase->m_name =
"IMEX_DIRK"
121 std::to_string(s) +
"_" + std::to_string(sigma) +
"_" +
122 std::to_string(phase->m_order);
124 phase->m_numsteps = 1;
125 phase->m_numstages = s + 1;
143 if (s == 1 && sigma == 2 && order == 1)
147 else if (s == 1 && sigma == 2 && order == 2)
151 else if (s == 2 && sigma == 2 && order == 2)
155 else if (s == 2 && sigma == 3 && order == 2)
159 else if (s == 2 && sigma == 3 && order == 3)
163 else if (s == 3 && sigma == 4 && order == 3)
167 else if (s == 4 && sigma == 4 && order == 3)
174 "IMEX DIRK Time integration scheme bad type "
175 "(s, sigma, order) : (" +
176 std::to_string(s) +
"," + std::to_string(sigma) +
"," +
177 std::to_string(order) +
"). " +
178 "Allowed combinations: (1,1,1), (1,2,1), (1,2,2), "
179 "(2,2,2), (2,3,2), (2,3,3), (3,4,3), (4,4,3)");
182 phase->m_numMultiStepValues = 1;
183 phase->m_numMultiStepImplicitDerivs = 0;
184 phase->m_numMultiStepExplicitDerivs = 0;
186 phase->m_timeLevelOffset[0] = 0;
188 phase->CheckAndVerify();
196 phase->m_schemeType =
eIMEX;
199 std::string(
"IMEXdirk_1_1_" + std::to_string(phase->m_order));
201 phase->m_numsteps = 2;
202 phase->m_numstages = 1;
220 phase->m_A[0][0][0] = 1.0;
222 phase->m_B[0][0][0] = 1.0;
223 phase->m_B[1][1][0] = 1.0;
225 phase->m_U[0][0] = 1.0;
226 phase->m_U[0][1] = 1.0;
228 phase->m_V[0][0] = 1.0;
229 phase->m_V[0][1] = 1.0;
231 phase->m_numMultiStepValues = 1;
232 phase->m_numMultiStepImplicitDerivs = 0;
233 phase->m_numMultiStepExplicitDerivs = 1;
236 phase->m_timeLevelOffset[0] = 0;
237 phase->m_timeLevelOffset[1] = 0;
239 phase->CheckAndVerify();
279 phase->m_A[0][1][1] = glambda;
280 phase->m_A[0][2][1] = 1.0 - glambda;
281 phase->m_A[0][2][2] = glambda;
283 phase->m_B[0][0][1] = 1.0 - glambda;
284 phase->m_B[0][0][2] = glambda;
286 phase->m_A[1][1][0] = glambda;
287 phase->m_A[1][2][0] = gdelta;
288 phase->m_A[1][2][1] = 1.0 - gdelta;
290 phase->m_B[1][0][0] = gdelta;
291 phase->m_B[1][0][1] = 1.0 - gdelta;
304 phase->m_A[0][1][1] = lambda;
305 phase->m_A[0][2][1] = 1.0 - lambda;
306 phase->m_A[0][2][2] = lambda;
308 phase->m_B[0][0][1] = 1.0 - lambda;
309 phase->m_B[0][0][2] = lambda;
311 phase->m_A[1][1][0] = lambda;
312 phase->m_A[1][2][0] = delta;
313 phase->m_A[1][2][1] = 1.0 - delta;
315 phase->m_B[1][0][1] = 1.0 - lambda;
316 phase->m_B[1][0][2] = lambda;
328 phase->m_A[0][1][1] = glambda;
329 phase->m_A[0][2][1] = 1.0 - 2.0 * glambda;
330 phase->m_A[0][2][2] = glambda;
332 phase->m_B[0][0][1] = 0.5;
333 phase->m_B[0][0][2] = 0.5;
335 phase->m_A[1][1][0] = glambda;
336 phase->m_A[1][2][0] = glambda - 1.0;
337 phase->m_A[1][2][1] = 2.0 * (1.0 - glambda);
339 phase->m_B[1][0][1] = 0.5;
340 phase->m_B[1][0][2] = 0.5;
350 constexpr NekDouble lambda = 0.4358665215;
352 phase->m_A[0][1][1] = lambda;
353 phase->m_A[0][2][1] = 0.5 * (1.0 - lambda);
354 phase->m_A[0][2][2] = lambda;
355 phase->m_A[0][3][1] =
356 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
357 phase->m_A[0][3][2] =
358 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
359 phase->m_A[0][3][3] = lambda;
361 phase->m_B[0][0][1] =
362 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
363 phase->m_B[0][0][2] =
364 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
365 phase->m_B[0][0][3] = lambda;
367 phase->m_A[1][1][0] = 0.4358665215;
368 phase->m_A[1][2][0] = 0.3212788860;
369 phase->m_A[1][2][1] = 0.3966543747;
370 phase->m_A[1][3][0] = -0.105858296;
371 phase->m_A[1][3][1] = 0.5529291479;
372 phase->m_A[1][3][2] = 0.5529291479;
374 phase->m_B[1][0][1] =
375 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
376 phase->m_B[1][0][2] =
377 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
378 phase->m_B[1][0][3] = lambda;
388 phase->m_A[0][1][1] = 1.0 / 2.0;
389 phase->m_A[0][2][1] = 1.0 / 6.0;
390 phase->m_A[0][2][2] = 1.0 / 2.0;
391 phase->m_A[0][3][1] = -1.0 / 2.0;
392 phase->m_A[0][3][2] = 1.0 / 2.0;
393 phase->m_A[0][3][3] = 1.0 / 2.0;
394 phase->m_A[0][4][1] = 3.0 / 2.0;
395 phase->m_A[0][4][2] = -3.0 / 2.0;
396 phase->m_A[0][4][3] = 1.0 / 2.0;
397 phase->m_A[0][4][4] = 1.0 / 2.0;
399 phase->m_B[0][0][1] = 3.0 / 2.0;
400 phase->m_B[0][0][2] = -3.0 / 2.0;
401 phase->m_B[0][0][3] = 1.0 / 2.0;
402 phase->m_B[0][0][4] = 1.0 / 2.0;
404 phase->m_A[1][1][0] = 1.0 / 2.0;
405 phase->m_A[1][2][0] = 11.0 / 18.0;
406 phase->m_A[1][2][1] = 1.0 / 18.0;
407 phase->m_A[1][3][0] = 5.0 / 6.0;
408 phase->m_A[1][3][1] = -5.0 / 6.0;
409 phase->m_A[1][3][2] = 1.0 / 2.0;
410 phase->m_A[1][4][0] = 1.0 / 4.0;
411 phase->m_A[1][4][1] = 7.0 / 4.0;
412 phase->m_A[1][4][2] = 3.0 / 4.0;
413 phase->m_A[1][4][3] = -7.0 / 4.0;
415 phase->m_B[1][0][0] = 1.0 / 4.0;
416 phase->m_B[1][0][1] = 7.0 / 4.0;
417 phase->m_B[1][0][2] = 3.0 / 4.0;
418 phase->m_B[1][0][3] = -7.0 / 4.0;