21 using namespace Hermes::Algebra::DenseMatrixOperations;
31 Table::Table(
unsigned int size)
36 this->A = new_matrix<double>(size, size);
37 for (
unsigned int i = 0; i < size; i++)
39 for (
unsigned int j = 0; j < size; j++) this->A[i][j] = 0;
43 void Table::alloc(
unsigned int size)
48 this->A = new_matrix<double>(size, size);
49 for (
unsigned int i = 0; i < size; i++)
51 for (
unsigned int j = 0; j < size; j++) this->A[i][j] = 0;
55 unsigned int Table::get_size()
60 double Table::get_A(
unsigned int i,
unsigned int j)
66 void Table::set_A(
unsigned int i,
unsigned int j,
double val)
72 ButcherTable::ButcherTable() : Table()
79 ButcherTable::ButcherTable(
unsigned int size) : Table(size)
82 this->B =
new double[size];
83 for (
unsigned int j = 0; j < size; j++) this->B[j] = 0;
85 this->B2 =
new double[size];
86 for (
unsigned int j = 0; j < size; j++) this->B2[j] = 0;
88 this->C =
new double[size];
89 for (
unsigned int j = 0; j < size; j++) this->C[j] = 0;
94 switch (butcher_table)
107 this->set_A(1, 0, 2./3.);
108 this->set_A(1, 1, 0.);
109 this->set_B(0, 1./4.);
110 this->set_B(1, 3./4.);
111 this->set_C(0, 2./3.);
117 this->set_A(1, 0, 1./2.);
118 this->set_A(2, 0, -1.);
119 this->set_A(2, 1, 2.);
120 this->set_B(0, 1./6.);
121 this->set_B(1, 2./3.);
122 this->set_B(2, 1./6.);
123 this->set_C(1, 1./2.);
130 this->set_A(1, 0, 1./2.);
131 this->set_A(2, 1, 1./2.);
132 this->set_A(3, 2, 1.);
133 this->set_B(0, 1./6.);
134 this->set_B(1, 1./3.);
135 this->set_B(2, 1./3.);
136 this->set_B(3, 1./6.);
137 this->set_C(1, 1./2.);
138 this->set_C(2, 1./2.);
147 this->set_A(0, 0, 1.);
155 this->set_A(0, 0, 1./2.);
156 this->set_A(0, 1, 1./2.);
157 this->set_B(0, 1./2.);
158 this->set_B(1, 1./2.);
165 this->set_A(0, 0, (5. - 3.*sqrt(2.))/4.);
166 this->set_A(0, 1, (7. - 5.*sqrt(2.))/4.);
167 this->set_A(1, 0, (1. + 1.*sqrt(2.))/4.);
168 this->set_A(1, 1, (3. - 1.*sqrt(2.))/4.);
169 this->set_B(0, (1. + 1.*sqrt(2.))/4.);
170 this->set_B(1, (3. - 1.*sqrt(2.))/4.);
171 this->set_C(0, 3. - 2.*sqrt(2.));
178 this->set_A(0, 0, (9. - 6.*sqrt(2.))/4.);
179 this->set_A(0, 1, (-3. + 2.*sqrt(2.))/4.);
180 this->set_A(1, 0, (11. - 6.*sqrt(2.))/4.);
181 this->set_A(1, 1, (-1. + 2.*sqrt(2.))/4.);
182 this->set_B(0, 2. - sqrt(2.0));
183 this->set_B(1, -1. + sqrt(2.0));
190 this->set_A(0, 0, 1. - 1./sqrt(2.));
191 this->set_A(1, 0, 1./sqrt(2.));
192 this->set_A(1, 1, 1. - 1./sqrt(2.));
193 this->set_B(0, 1./sqrt(2.));
194 this->set_B(1, 1. - 1./sqrt(2.));
195 this->set_C(0, 1. - 1./sqrt(2.));
202 this->set_A(1, 0, 1./2.);
203 this->set_A(1, 1, 1./2.);
204 this->set_B(0, 1./2.);
205 this->set_B(1, 1./2.);
212 this->set_A(0, 0, 1./2.);
213 this->set_A(0, 1, 1./2.);
214 this->set_B(0, 1./2.);
215 this->set_B(1, 1./2.);
216 this->set_C(0, 1./2.);
217 this->set_C(1, 1./2.);
223 this->set_A(0, 0, 1./2.);
224 this->set_A(0, 1, -1./2.);
225 this->set_A(1, 0, 1./2.);
226 this->set_A(1, 1, 1./2.);
227 this->set_B(0, 1./2.);
228 this->set_B(1, 1./2.);
235 this->set_A(1, 0, 5./24.);
236 this->set_A(2, 0, 1./6.);
237 this->set_A(1, 1, 1./3.);
238 this->set_A(2, 1, 2./3.);
239 this->set_A(1, 2, -1./24.);
240 this->set_A(2, 2, 1./6.);
241 this->set_B(0, 1./6.);
242 this->set_B(1, 2./3.);
243 this->set_B(2, 1./6.);
244 this->set_C(1, 1./2.);
251 this->set_A(0, 0, 1./6.);
252 this->set_A(1, 0, 1./6.);
253 this->set_A(2, 0, 1./6.);
254 this->set_A(0, 1, -1./6.);
255 this->set_A(1, 1, 1./3.);
256 this->set_A(2, 1, 5./6.);
257 this->set_B(0, 1./6.);
258 this->set_B(1, 2./3.);
259 this->set_B(2, 1./6.);
260 this->set_C(1, 1./2.);
267 this->set_A(0, 0, 1./6.);
268 this->set_A(1, 0, 1./6.);
269 this->set_A(2, 0, 1./6.);
270 this->set_A(0, 1, -1./3.);
271 this->set_A(1, 1, 5./12.);
272 this->set_A(2, 1, 2./3.);
273 this->set_A(0, 2, 1./6.);
274 this->set_A(1, 2, -1./12.);
275 this->set_A(2, 2, 1./6.);
276 this->set_B(0, 1./6.);
277 this->set_B(1, 2./3.);
278 this->set_B(2, 1./6.);
279 this->set_C(1, 1./2.);
286 this->set_A(0, 0, (88. - 7*sqrt((
double)6)) / 360 );
287 this->set_A(1, 0, (296 + 169 * sqrt((
double)6)) / 1800 );
288 this->set_A(2, 0, (16. - sqrt((
double)6)) / 36 );
289 this->set_A(0, 1, (296 - 169 * sqrt((
double)6)) / 1800);
290 this->set_A(1, 1, (88. + 7*sqrt((
double)6)) / 360);
291 this->set_A(2, 1, (16. + sqrt((
double)6)) / 36);
292 this->set_A(0, 2, (-2. + 3 * sqrt((
double)6)) / 225 );
293 this->set_A(1, 2, (-2. - 3 * sqrt((
double)6)) / 225 );
294 this->set_A(2, 2, 1./9.);
295 this->set_B(0, (16. - sqrt((
double)6)) / 36 );
296 this->set_B(1, (16. + sqrt((
double)6)) / 36 );
297 this->set_B(2, 1./9.);
298 this->set_C(0, (4. - sqrt((
double)6)) / 10 );
299 this->set_C(1, (4. + sqrt((
double)6)) / 10 );
306 this->set_A(0, 0, 1./4.);
307 this->set_A(1, 0, 1./2.);
308 this->set_A(1, 1, 1./4.);
309 this->set_A(2, 0, 17./50.);
310 this->set_A(2, 1, -1./25.);
311 this->set_A(2, 2, 1./4.);
312 this->set_A(3, 0, 371./1360.);
313 this->set_A(3, 1, -137./2720.);
314 this->set_A(3, 2, 15./544.);
315 this->set_A(3, 3, 1./4.);
316 this->set_A(4, 0, 25./24.);
317 this->set_A(4, 1, -49./48.);
318 this->set_A(4, 2, 125./16.);
319 this->set_A(4, 3, -85./12.);
320 this->set_A(4, 4, 1./4.);
321 this->set_B(0, 25./24.);
322 this->set_B(1, -49./48.);
323 this->set_B(2, 125./16.);
324 this->set_B(3, -85./12.);
325 this->set_B(4, 1./4.);
326 this->set_C(0, 1./4.);
327 this->set_C(1, 3./4.);
328 this->set_C(2, 11./20.);
329 this->set_C(3, 1./2.);
338 this->set_A(1, 0, 1.0);
341 this->set_B2(0, 1.0);
342 this->set_B2(1, 0.0);
350 this->set_A(1, 0, 1./2.);
351 this->set_A(3, 0, 2./9.);
352 this->set_A(2, 1, 3./4.);
353 this->set_A(3, 1, 1./3.);
354 this->set_A(3, 2, 4./9.);
355 this->set_B(0, 2./9.);
356 this->set_B(1, 1./3.);
357 this->set_B(2, 4./9.);
359 this->set_B2(0, 7./24.);
360 this->set_B2(1, 1./4.);
361 this->set_B2(2, 1./3.);
362 this->set_B2(3, 1./8.);
363 this->set_C(1, 1./2.);
364 this->set_C(2, 3./4.);
371 this->set_A(1, 0, 1./4.);
372 this->set_A(2, 0, 3./32.);
373 this->set_A(3, 0, 1932./2197.);
374 this->set_A(4, 0, 439./216.);
375 this->set_A(5, 0, -8./27.);
376 this->set_A(2, 1, 9./32.);
377 this->set_A(3, 1, -7200./2197.);
378 this->set_A(4, 1, -8.);
379 this->set_A(5, 1, 2.);
380 this->set_A(3, 2, 7296./2197.);
381 this->set_A(4, 2, 3680./513.);
382 this->set_A(5, 2, -3544./2565.);
383 this->set_A(4, 3, -845./4104.);
384 this->set_A(5, 3, 1859./4104.);
385 this->set_A(5, 4, -11./40.);
386 this->set_B(0, 16./135.);
388 this->set_B(2, 6656./12825.);
389 this->set_B(3, 28561./56430.);
390 this->set_B(4, -9./50.);
391 this->set_B(5, 2./55.);
392 this->set_B2(0, 25./216.);
394 this->set_B2(2, 1408./2565.);
395 this->set_B2(3, 2197./4104.);
396 this->set_B2(4, -1./5.);
397 this->set_C(1, 1./4.);
398 this->set_C(2, 3./8.);
399 this->set_C(3, 12./13.);
401 this->set_C(5, 1./2.);
407 this->set_A(1, 0, 1./5.);
408 this->set_A(2, 0, 3./40.);
409 this->set_A(3, 0, 3./10.);
410 this->set_A(4, 0, -11./54.);
411 this->set_A(5, 0, 1631./55296.);
412 this->set_A(2, 1, 9./40.);
413 this->set_A(3, 1, -9./10.);
414 this->set_A(4, 1, 5./2.);
415 this->set_A(5, 1, 175./512.);
416 this->set_A(3, 2, 6./5.);
417 this->set_A(4, 2, -70./27.);
418 this->set_A(5, 2, 575./13824.);
419 this->set_A(4, 3, 35./27.);
420 this->set_A(5, 3, 44275./110592.);
421 this->set_A(5, 4, 253./4096.);
422 this->set_B(0, 37./378.);
424 this->set_B(2, 250./621.);
425 this->set_B(3, 125./594.);
427 this->set_B(5, 512./1771.);
428 this->set_B2(0, 2825./27648.);
430 this->set_B2(2, 18575./48384.);
431 this->set_B2(3, 13525./55296.);
432 this->set_B2(4, 277./14336.);
433 this->set_B2(5, 1./4.);
434 this->set_C(1, 1./5.);
435 this->set_C(2, 3./10.);
436 this->set_C(3, 3./5.);
438 this->set_C(5, 7./8.);
444 this->set_A(1, 0, 1./5.);
445 this->set_A(2, 0, 3./40.);
446 this->set_A(3, 0, 44./45.);
447 this->set_A(4, 0, 19372./6561.);
448 this->set_A(5, 0, 9017./3168.);
449 this->set_A(6, 0, 35./384.);
450 this->set_A(2, 1, 9./40.);
451 this->set_A(3, 1, -56./15.);
452 this->set_A(4, 1, -25360./2187.);
453 this->set_A(5, 1, -355./33.);
454 this->set_A(6, 1, 0.);
455 this->set_A(3, 2, 32./9.);
456 this->set_A(4, 2, 64448./6561.);
457 this->set_A(5, 2, 46732./5247.);
458 this->set_A(6, 2, 500./1113.);
459 this->set_A(4, 3, -212./729.);
460 this->set_A(5, 3, 49./176.);
461 this->set_A(6, 3, 125./192.);
462 this->set_A(5, 4, -5103./18656.);
463 this->set_A(6, 4, -2187./6784.);
464 this->set_A(6, 5, 11./84.);
465 this->set_B(0, 35./384.);
467 this->set_B(2, 500./1113.);
468 this->set_B(3, 125./192.);
469 this->set_B(4, -2187./6784.);
470 this->set_B(5, 11./84.);
472 this->set_B2(0, 5179./57600.);
474 this->set_B2(2, 7571./16695.);
475 this->set_B2(3, 393./640.);
476 this->set_B2(4, -92097./339200.);
477 this->set_B2(5, 187./2100.);
478 this->set_B2(6, 1./40.);
479 this->set_C(1, 1./5.);
480 this->set_C(2, 3./10.);
481 this->set_C(3, 4./5.);
482 this->set_C(4, 8./9.);
491 this->set_A(1, 0, (2 - sqrt((
double)2)) / 2.);
492 this->set_A(2, 0, sqrt((
double)2) / 4.);
493 this->set_A(1, 1, (2 - sqrt((
double)2)) / 2.);
494 this->set_A(2, 1, sqrt((
double)2) / 4.);
495 this->set_A(2, 2, (2 - sqrt((
double)2)) / 2.);
496 this->set_B(0, sqrt((
double)2) / 4.);
497 this->set_B(1, sqrt((
double)2) / 4.);
498 this->set_B(2, (2 - sqrt((
double)2)) / 2.);
499 this->set_B2(0, (1 - sqrt((
double)2)/4.) / 3.);
500 this->set_B2(1, (3 * sqrt((
double)2) / 4. + 1.) / 3.);
501 this->set_B2(2, (2 - sqrt((
double)2)) / 6.);
502 this->set_C(1, 2 - sqrt((
double)2));
508 this->set_A(1, 0, 0.25);
509 this->set_A(2, 0, 0.25);
510 this->set_A(1, 1, 0.25);
511 this->set_A(2, 1, 0.5);
512 this->set_A(2, 2, 0.25);
513 this->set_B(0, 0.25);
515 this->set_B(2, 0.25);
516 this->set_B2(0, 1./6.);
517 this->set_B2(1, 2./3.);
518 this->set_B2(2, 1./6.);
525 this->set_A(0, 0, 0.435866521508);
526 this->set_A(1, 0, 0.2820667320);
527 this->set_A(2, 0, 1.208496649);
528 this->set_A(1, 1, 0.435866521508);
529 this->set_A(2, 1, -0.6443632015);
530 this->set_A(2, 2, 0.435866521508);
531 this->set_B(0, 1.208496649);
532 this->set_B(1, -0.6443632015);
533 this->set_B(2, 0.435866521508);
534 this->set_B2(0, 0.77263013745746);
535 this->set_B2(1, 0.22736986254254);
536 this->set_C(0, 0.435866521508);
537 this->set_C(1, 0.717933260755);
543 this->set_A(0, 0, 0.292893218813);
544 this->set_A(1, 0, 0.798989873223);
545 this->set_A(2, 0, 0.740789228841);
546 this->set_A(1, 1, 0.292893218813);
547 this->set_A(2, 1, 0.259210771159);
548 this->set_A(2, 2, 0.292893218813);
549 this->set_B(0, 0.691665115992);
550 this->set_B(1, 0.503597029883);
551 this->set_B(2, -0.195262145876);
552 this->set_B2(0, 0.740789228840);
553 this->set_B2(1, 0.259210771159);
554 this->set_C(0, 0.292893218813);
555 this->set_C(1, 1.091883092037);
556 this->set_C(2, 1.292893218813);
561 this->set_A(0, 0, 0.435866521508);
562 this->set_A(1, 0, -1.13586652150);
563 this->set_A(2, 0, 1.08543330679);
564 this->set_A(3, 0, 0.416349501547);
565 this->set_A(4, 0, 0.896869652944);
566 this->set_A(1, 1, 0.435866521508);
567 this->set_A(2, 1, -0.721299828287);
568 this->set_A(3, 1, 0.190984004184);
569 this->set_A(4, 1, 0.0182725272734);
570 this->set_A(2, 2, 0.435866521508);
571 this->set_A(3, 2, -0.118643265417);
572 this->set_A(4, 2, -0.0845900310706);
573 this->set_A(3, 3, 0.435866521508);
574 this->set_A(4, 3, -0.266418670647);
575 this->set_A(4, 4, 0.435866521508);
576 this->set_B(0, 0.896869652944);
577 this->set_B(1, 0.0182725272734);
578 this->set_B(2, -0.0845900310706);
579 this->set_B(3, -0.266418670647);
580 this->set_B(4, 0.435866521508);
581 this->set_B2(0, (-0.7 - 0.5) / (-0.7 - 0.435866521508));
582 this->set_B2(1, (0.5 - 0.435866521508) / (-0.7 - 0.435866521508));
583 this->set_B2(2, 0.0);
584 this->set_B2(3, 0.0);
585 this->set_B2(4, 0.0);
586 this->set_C(0, 0.435866521508);
587 this->set_C(1, -0.7);
589 this->set_C(3, 0.924556761814);
595 this->set_A(0, 0, 0.435866521508);
596 this->set_A(1, 0, -1.13586652150);
597 this->set_A(2, 0, 1.08543330679);
598 this->set_A(3, 0, 0.416349501547);
599 this->set_A(4, 0, 0.896869652944);
600 this->set_A(1, 1, 0.435866521508);
601 this->set_A(2, 1, -0.721299828287);
602 this->set_A(3, 1, 0.190984004184);
603 this->set_A(4, 1, 0.0182725272734);
604 this->set_A(2, 2, 0.435866521508);
605 this->set_A(3, 2, -0.118643265417);
606 this->set_A(4, 2, -0.0845900310706);
607 this->set_A(3, 3, 0.435866521508);
608 this->set_A(4, 3, -0.266418670647);
609 this->set_A(4, 4, 0.435866521508);
610 this->set_B(0, 0.896869652944);
611 this->set_B(1, 0.0182725272734);
612 this->set_B(2, -0.0845900310706);
613 this->set_B(3, -0.266418670647);
614 this->set_B(4, 0.435866521508);
615 this->set_B2(0, 0.776691932910);
616 this->set_B2(1, 0.0297472791484);
617 this->set_B2(2, -0.0267440239074);
618 this->set_B2(3, 0.220304811849);
619 this->set_B2(4, 0.0);
620 this->set_C(0, 0.435866521508);
621 this->set_C(1, -0.7);
623 this->set_C(3, 0.924556761814);
629 this->set_A(0, 0, 0);
630 this->set_A(1, 0, 0.28589);
631 this->set_A(2, 0, 0.142945);
632 this->set_A(3, 0, 0.16803599);
633 this->set_A(4, 0, 0.182315);
634 this->set_A(5, 0, 0.24756392);
635 this->set_A(6, 0, 0.13001804);
636 this->set_A(1, 1, 0.28589);
637 this->set_A(2, 1, 0.924011005);
638 this->set_A(3, 1, -0.049416510);
639 this->set_A(4, 1, -0.112951603);
640 this->set_A(5, 1, -0.425378071);
641 this->set_A(6, 1, 0);
642 this->set_A(2, 2, 0.28589);
643 this->set_A(3, 2, -0.004509476);
644 this->set_A(4, 2, -0.027793233);
645 this->set_A(5, 2, -0.107036282);
646 this->set_A(6, 2, -0.019290177);
647 this->set_A(3, 3, 0.28589);
648 this->set_A(4, 3, 0.422539833);
649 this->set_A(5, 3, 0.395700134);
650 this->set_A(6, 3, 0.535386266);
651 this->set_A(4, 4, 0.28589);
652 this->set_A(5, 4, 0.503260302);
653 this->set_A(6, 4, 0.234313169);
654 this->set_A(5, 5, 0.28589);
655 this->set_A(6, 5, -0.166317293);
656 this->set_A(6, 6, 0.28589);
657 this->set_B(0, 0.13001804);
659 this->set_B(2, -0.019290177);
660 this->set_B(3, 0.535386266);
661 this->set_B(4, 0.234313169);
662 this->set_B(5, -0.166317293);
663 this->set_B(6, 0.28589);
664 this->set_B2(0, 0.094388663);
666 this->set_B2(2, -0.039782614 );
667 this->set_B2(3, 0.745608552);
668 this->set_B2(4, -0.505129807);
669 this->set_B2(5, 0.704915206);
672 this->set_C(1, 0.57178);
673 this->set_C(2, 1.352846);
675 this->set_C(4, 0.75);
684 void ButcherTable::alloc(
unsigned int size)
689 this->A = new_matrix<double>(size, size);
690 for (
unsigned int i = 0; i < size; i++)
692 for (
unsigned int j = 0; j < size; j++) this->A[i][j] = 0;
695 this->B =
new double[size];
696 for (
unsigned int j = 0; j < size; j++) this->B[j] = 0;
698 this->B2 =
new double[size];
699 for (
unsigned int j = 0; j < size; j++) this->B2[j] = 0;
701 this->C =
new double[size];
702 for (
unsigned int j = 0; j < size; j++) this->C[j] = 0;
705 double ButcherTable::get_B(
unsigned int i)
711 double ButcherTable::get_B2(
unsigned int i)
717 double ButcherTable::get_C(
unsigned int i)
723 void ButcherTable::set_B(
unsigned int i,
double val)
729 void ButcherTable::set_B2(
unsigned int i,
double val)
735 void ButcherTable::set_C(
unsigned int i,
double val)
741 bool ButcherTable::is_explicit()
744 for (
unsigned int i = 0; i<size; i++)
746 for (
unsigned int j = 0; j<size; j++)
748 double val_ij = get_A(i, j);
749 if(j >= i && fabs(val_ij) > 1e-12) result =
false;
756 bool ButcherTable::is_diagonally_implicit()
759 for (
unsigned int i = 0; i < size; i++)
761 for (
unsigned int j = 0; j < size; j++)
763 double val_ij = get_A(i, j);
764 if(j > i && fabs(val_ij) > 1e-12) result =
false;
771 bool ButcherTable::is_fully_implicit()
774 for (
unsigned int i = 0; i < size; i++)
776 for (
unsigned int j = 0; j < size; j++)
778 double val_ij = get_A(i, j);
779 if(j > i && fabs(val_ij) > 1e-12) result =
true;
786 bool ButcherTable::is_embedded()
790 for (
unsigned int i = 0; i < size; i++) sum += fabs(B2[i]);
791 if(sum < 1e-10)
return false;
795 void ButcherTable::switch_B_rows()
798 if(this->is_embedded() ==
false)
802 for (
unsigned int i = 0; i < size; i++)