59 std::vector<NekDouble> freeParams)
62 if (variant ==
"dirk" || variant ==
"DIRK")
65 "IMEX DIRK Time integration scheme invalid number "
66 "of free parameters, expected two "
67 "<implicit stages, explicit stages>, received " +
68 std::to_string(freeParams.size()));
70 size_t s = freeParams[0];
71 size_t sigma = freeParams[1];
77 if (order == 1 && s == 1 && sigma == 1)
89 else if (variant ==
"")
93 "IMEX Time integration scheme bad order (1-4): " +
94 std::to_string(order));
98 for (
size_t n = 0; n < order; ++n)
123 std::vector<NekDouble>{3, 4});
126 std::vector<NekDouble>{3, 4});
132 std::vector<NekDouble>{3, 4});
135 std::vector<NekDouble>{3, 4});
138 std::vector<NekDouble>{3, 4});
142 ASSERTL1(
false,
"IMEX Time integration scheme bad order: " +
143 std::to_string(order));
148 ASSERTL1(
false,
"IMEX Time integration scheme bad variant: " +
149 variant +
". Must be blank or 'dirk'");
170 constexpr NekDouble ABcoefficients[5] = {0.,
179 constexpr NekDouble UVcoefficients[5][8] =
186 { 4./ 3., -1./ 3., 4./3., -2./ 3.,
189 { 18./11., -9./11., 2./11., 18./11.,
190 -18./11., 6./11., 0., 0. },
192 { 48./25., -36./25., 16./25., -3./25.,
193 48./25., -72./25., 48./25., -12./25. } };
196 phase->m_schemeType =
eIMEX;
197 phase->m_order = order;
199 std::string(
"IMEXOrder" + std::to_string(phase->m_order));
201 phase->m_numsteps = 2 * phase->m_order;
202 phase->m_numstages = 1;
221 phase->m_B[1][phase->m_order][0] = 1.0;
223 phase->m_A[0][0][0] = ABcoefficients[phase->m_order];
224 phase->m_B[0][0][0] = ABcoefficients[phase->m_order];
226 for (
size_t n = 0; n < 2 * phase->m_order; ++n)
228 phase->m_U[0][n] = UVcoefficients[phase->m_order][n];
229 phase->m_V[0][n] = UVcoefficients[phase->m_order][n];
233 for (
size_t n = 1; n < 2 * phase->m_order; ++n)
235 if (n != phase->m_order)
237 phase->m_V[n][n - 1] = 1.0;
241 phase->m_numMultiStepValues = phase->m_order;
242 phase->m_numMultiStepImplicitDerivs = 0;
243 phase->m_numMultiStepExplicitDerivs = phase->m_order;
248 for (
size_t n = 0; n < phase->m_order; ++n)
250 phase->m_timeLevelOffset[n] = n;
251 phase->m_timeLevelOffset[phase->m_order + n] = n;
254 phase->CheckAndVerify();