193 {
195 phase->m_order = order;
196 phase->m_name =
197 std::string("DIRKOrder" + std::to_string(phase->m_order) + variant);
198
199 phase->m_numsteps = 1;
200 char const &stage = variant.back();
201 phase->m_numstages = std::atoi(&stage);
202
203 phase->m_A = Array<OneD, Array<TwoD, NekDouble>>(1);
204 phase->m_B = Array<OneD, Array<TwoD, NekDouble>>(1);
205
206 phase->m_A[0] =
207 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numstages, 0.0);
208 phase->m_B[0] =
209 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numstages, 0.0);
210 phase->m_U =
211 Array<TwoD, NekDouble>(phase->m_numstages, phase->m_numsteps, 1.0);
212 phase->m_V =
213 Array<TwoD, NekDouble>(phase->m_numsteps, phase->m_numsteps, 1.0);
214
216 switch (phase->m_order)
217 {
218 case 3:
219 {
220
221
222
224 std::string("DIRKOrder3_ES" +
225 std::to_string(phase->m_numstages) +
226 " not defined"));
227
229 (freeParams.size()) ? freeParams[0] : 9.0 / 40.0;
230
231 phase->m_A[0][0][0] = 0.0;
232 phase->m_A[0][1][0] = lambda;
233 phase->m_A[0][2][0] = 9.0 * (1.0 + ConstSqrt2) / 80.0;
234 phase->m_A[0][3][0] =
235 (22.0 + 15.0 * ConstSqrt2) / (80.0 * (1.0 + ConstSqrt2));
236 phase->m_A[0][4][0] = (2398.0 + 1205.0 * ConstSqrt2) /
237 (2835.0 * (4.0 + 3.0 * ConstSqrt2));
238
239 phase->m_A[0][1][1] = phase->m_A[0][1][0];
240 phase->m_A[0][2][1] = phase->m_A[0][2][0];
241 phase->m_A[0][3][1] = phase->m_A[0][3][0];
242 phase->m_A[0][4][1] = phase->m_A[0][4][0];
243
244 phase->m_A[0][2][2] = lambda;
245 phase->m_A[0][3][2] = -7.0 / (40.0 * (1.0 + ConstSqrt2));
246 phase->m_A[0][4][2] = -2374.0 * (1.0 + 2.0 * ConstSqrt2) /
247 (2835.0 * (5.0 + 3.0 * ConstSqrt2));
248
249 phase->m_A[0][3][3] = lambda;
250 phase->m_A[0][4][3] = 5827.0 / 7560.0;
251
252 phase->m_A[0][4][4] = lambda;
253
254 phase->m_B[0][0][0] = phase->m_A[0][4][0];
255 phase->m_B[0][0][1] = phase->m_A[0][4][1];
256 phase->m_B[0][0][2] = phase->m_A[0][4][2];
257 phase->m_B[0][0][3] = phase->m_A[0][4][3];
258 phase->m_B[0][0][4] = phase->m_A[0][4][4];
259 }
260 break;
261
262 case 4:
263 {
264
265
266
268 std::string("DIRKOrder4_ES" +
269 std::to_string(phase->m_numstages) +
270 " not defined"));
271
273 (freeParams.size()) ? freeParams[0] : 1.0 / 4.0;
274
275 phase->m_A[0][0][0] = 0.0;
276 phase->m_A[0][1][0] = lambda;
277 phase->m_A[0][2][0] = (1.0 - ConstSqrt2) / 8.0;
278 phase->m_A[0][3][0] = (5.0 - 7.0 * ConstSqrt2) / 64.0;
279 phase->m_A[0][4][0] =
280 (-13796.0 - 54539.0 * ConstSqrt2) / 125000.0;
281 phase->m_A[0][5][0] = (1181.0 - 987.0 * ConstSqrt2) / 13782.0;
282
283 phase->m_A[0][1][1] = phase->m_A[0][1][0];
284 phase->m_A[0][2][1] = phase->m_A[0][2][0];
285 phase->m_A[0][3][1] = phase->m_A[0][3][0];
286 phase->m_A[0][4][1] = phase->m_A[0][4][0];
287 phase->m_A[0][5][1] = phase->m_A[0][5][0];
288
289 phase->m_A[0][2][2] = lambda;
290 phase->m_A[0][3][2] = 7.0 * (1.0 + ConstSqrt2) / 32.0;
291 phase->m_A[0][4][2] =
292 (506605.0 + 132109.0 * ConstSqrt2) / 437500.0;
293 phase->m_A[0][5][2] =
294 47.0 * (-267.0 + 1783.0 * ConstSqrt2) / 273343.0;
295
296 phase->m_A[0][3][3] = lambda;
297 phase->m_A[0][4][3] =
298 166.0 * (-97.0 + 376.0 * ConstSqrt2) / 109375.0;
299 phase->m_A[0][5][3] =
300 -16.0 * (-22922.0 + 3525.0 * ConstSqrt2) / 571953.0;
301
302 phase->m_A[0][4][4] = lambda;
303 phase->m_A[0][5][4] =
304 -15625.0 * (97.0 + 376.0 * ConstSqrt2) / 90749876.0;
305
306 phase->m_A[0][5][5] = lambda;
307
308 phase->m_B[0][0][0] = phase->m_A[0][5][0];
309 phase->m_B[0][0][1] = phase->m_A[0][5][1];
310 phase->m_B[0][0][2] = phase->m_A[0][5][2];
311 phase->m_B[0][0][3] = phase->m_A[0][5][3];
312 phase->m_B[0][0][4] = phase->m_A[0][5][4];
313 phase->m_B[0][0][5] = phase->m_A[0][5][5];
314 }
315 break;
316 default:
317 {
318 ASSERTL0(
false, std::string(
"ESDIRK of order" +
319 std::to_string(phase->m_order) +
320 " not defined"));
321 break;
322 }
323 }
324
325 phase->m_numMultiStepValues = 1;
326 phase->m_numMultiStepImplicitDerivs = 0;
327 phase->m_numMultiStepExplicitDerivs = 0;
328 phase->m_timeLevelOffset = Array<OneD, size_t>(phase->m_numsteps);
329 phase->m_timeLevelOffset[0] = 0;
330
331 phase->CheckAndVerify();
332 }