104 phase->m_order = order;
106 std::string(
"DIRKOrder" + std::to_string(phase->m_order));
108 phase->m_numsteps = 1;
109 phase->m_numstages = phase->m_order;
123 switch (phase->m_order)
130 phase->m_A[0][0][0] = 1.0;
132 phase->m_B[0][0][0] = 1.0;
144 phase->m_A[0][0][0] = lambda;
145 phase->m_A[0][1][0] = 1.0 - lambda;
146 phase->m_A[0][1][1] = lambda;
148 phase->m_B[0][0][0] = 1.0 - lambda;
149 phase->m_B[0][0][1] = lambda;
157 constexpr NekDouble lambda = 0.4358665215;
159 phase->m_A[0][0][0] = lambda;
160 phase->m_A[0][1][0] = 0.5 * (1.0 - lambda);
161 phase->m_A[0][2][0] =
162 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
164 phase->m_A[0][1][1] = lambda;
166 phase->m_A[0][2][1] =
167 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
168 phase->m_A[0][2][2] = lambda;
170 phase->m_B[0][0][0] =
171 0.25 * (-6.0 * lambda * lambda + 16.0 * lambda - 1.0);
172 phase->m_B[0][0][1] =
173 0.25 * (6.0 * lambda * lambda - 20.0 * lambda + 5.0);
174 phase->m_B[0][0][2] = lambda;
179 phase->m_numMultiStepValues = 1;
180 phase->m_numMultiStepImplicitDerivs = 0;
181 phase->m_numMultiStepExplicitDerivs = 0;
183 phase->m_timeLevelOffset[0] = 0;
185 phase->CheckAndVerify();
190 size_t order, std::vector<NekDouble> freeParams)
193 phase->m_order = order;
195 std::string(
"DIRKOrder" + std::to_string(phase->m_order) + variant);
197 phase->m_numsteps = 1;
198 char const &stage = variant.back();
199 phase->m_numstages = std::atoi(&stage);
214 switch (phase->m_order)
222 std::string(
"DIRKOrder3_ES" +
223 std::to_string(phase->m_numstages) +
227 (freeParams.size()) ? freeParams[0] : 9.0 / 40.0;
229 phase->m_A[0][0][0] = 0.0;
230 phase->m_A[0][1][0] = lambda;
231 phase->m_A[0][2][0] = 9.0 * (1.0 + ConstSqrt2) / 80.0;
232 phase->m_A[0][3][0] =
233 (22.0 + 15.0 * ConstSqrt2) / (80.0 * (1.0 + ConstSqrt2));
234 phase->m_A[0][4][0] = (2398.0 + 1205.0 * ConstSqrt2) /
235 (2835.0 * (4.0 + 3.0 * ConstSqrt2));
237 phase->m_A[0][1][1] = phase->m_A[0][1][0];
238 phase->m_A[0][2][1] = phase->m_A[0][2][0];
239 phase->m_A[0][3][1] = phase->m_A[0][3][0];
240 phase->m_A[0][4][1] = phase->m_A[0][4][0];
242 phase->m_A[0][2][2] = lambda;
243 phase->m_A[0][3][2] = -7.0 / (40.0 * (1.0 + ConstSqrt2));
244 phase->m_A[0][4][2] = -2374.0 * (1.0 + 2.0 * ConstSqrt2) /
245 (2835.0 * (5.0 + 3.0 * ConstSqrt2));
247 phase->m_A[0][3][3] = lambda;
248 phase->m_A[0][4][3] = 5827.0 / 7560.0;
250 phase->m_A[0][4][4] = lambda;
252 phase->m_B[0][0][0] = phase->m_A[0][4][0];
253 phase->m_B[0][0][1] = phase->m_A[0][4][1];
254 phase->m_B[0][0][2] = phase->m_A[0][4][2];
255 phase->m_B[0][0][3] = phase->m_A[0][4][3];
256 phase->m_B[0][0][4] = phase->m_A[0][4][4];
266 std::string(
"DIRKOrder4_ES" +
267 std::to_string(phase->m_numstages) +
271 (freeParams.size()) ? freeParams[0] : 1.0 / 4.0;
273 phase->m_A[0][0][0] = 0.0;
274 phase->m_A[0][1][0] = lambda;
275 phase->m_A[0][2][0] = (1.0 - ConstSqrt2) / 8.0;
276 phase->m_A[0][3][0] = (5.0 - 7.0 * ConstSqrt2) / 64.0;
277 phase->m_A[0][4][0] =
278 (-13796.0 - 54539.0 * ConstSqrt2) / 125000.0;
279 phase->m_A[0][5][0] = (1181.0 - 987.0 * ConstSqrt2) / 13782.0;
281 phase->m_A[0][1][1] = phase->m_A[0][1][0];
282 phase->m_A[0][2][1] = phase->m_A[0][2][0];
283 phase->m_A[0][3][1] = phase->m_A[0][3][0];
284 phase->m_A[0][4][1] = phase->m_A[0][4][0];
285 phase->m_A[0][5][1] = phase->m_A[0][5][0];
287 phase->m_A[0][2][2] = lambda;
288 phase->m_A[0][3][2] = 7.0 * (1.0 + ConstSqrt2) / 32.0;
289 phase->m_A[0][4][2] =
290 (506605.0 + 132109.0 * ConstSqrt2) / 437500.0;
291 phase->m_A[0][5][2] =
292 47.0 * (-267.0 + 1783.0 * ConstSqrt2) / 273343.0;
294 phase->m_A[0][3][3] = lambda;
295 phase->m_A[0][4][3] =
296 166.0 * (-97.0 + 376.0 * ConstSqrt2) / 109375.0;
297 phase->m_A[0][5][3] =
298 -16.0 * (-22922.0 + 3525.0 * ConstSqrt2) / 571953.0;
300 phase->m_A[0][4][4] = lambda;
301 phase->m_A[0][5][4] =
302 -15625.0 * (97.0 + 376.0 * ConstSqrt2) / 90749876.0;
304 phase->m_A[0][5][5] = lambda;
306 phase->m_B[0][0][0] = phase->m_A[0][5][0];
307 phase->m_B[0][0][1] = phase->m_A[0][5][1];
308 phase->m_B[0][0][2] = phase->m_A[0][5][2];
309 phase->m_B[0][0][3] = phase->m_A[0][5][3];
310 phase->m_B[0][0][4] = phase->m_A[0][5][4];
311 phase->m_B[0][0][5] = phase->m_A[0][5][5];
316 ASSERTL0(
false, std::string(
"ESDIRK of order" +
317 std::to_string(phase->m_order) +
323 phase->m_numMultiStepValues = 1;
324 phase->m_numMultiStepImplicitDerivs = 0;
325 phase->m_numMultiStepExplicitDerivs = 0;
327 phase->m_timeLevelOffset[0] = 0;
329 phase->CheckAndVerify();