22#ifndef INCLUDE_EXADG_TIME_INTEGRATION_SSP_RUNGE_KUTTA_H_
23#define INCLUDE_EXADG_TIME_INTEGRATION_SSP_RUNGE_KUTTA_H_
26#include <deal.II/lac/full_matrix.h>
29#include <exadg/time_integration/explicit_runge_kutta.h>
42template<
typename Operator,
typename VectorType>
43class SSPRK :
public ExplicitTimeIntegrator<Operator, VectorType>
46 SSPRK(std::shared_ptr<Operator>
const operator_in,
47 unsigned int const order_in,
48 unsigned int const stages_in)
49 : ExplicitTimeIntegrator<Operator, VectorType>(operator_in), order(order_in)
51 initialize_coeffs(stages_in);
58 double const time_step)
final;
61 get_order()
const final
68 initialize_coeffs(
unsigned int const stages);
70 dealii::FullMatrix<double> A, B;
71 std::vector<double> c;
72 unsigned int const order;
74 std::vector<VectorType> u_vec, F_vec;
77template<
typename Operator,
typename VectorType>
79SSPRK<Operator, VectorType>::solve_timestep(
VectorType & vec_np,
82 double const time_step)
84 unsigned int const stages = A.m();
87 if(u_vec.empty() or not(u_vec[0].partitioners_are_globally_compatible(*vec_n.get_partitioner())))
89 u_vec.resize(stages + 1);
90 for(
unsigned int d = 0; d < u_vec.size(); ++d)
91 u_vec[d].reinit(vec_n);
94 for(
unsigned int d = 0; d < F_vec.size(); ++d)
95 F_vec[d].reinit(vec_n,
true);
100 for(
unsigned int s = 1; s <= stages; ++s)
102 this->underlying_operator->evaluate(F_vec[s - 1], u_vec[s - 1], time + c[s - 1] * time_step);
105 for(
unsigned int l = 0; l < s; ++l)
107 u_vec[s].add(A[s - 1][l], u_vec[l], B[s - 1][l] * time_step, F_vec[l]);
111 vec_np = u_vec[stages];
114template<
typename Operator,
typename VectorType>
116SSPRK<Operator, VectorType>::initialize_coeffs(
unsigned int const stages)
118 A.reinit(stages, stages);
119 B.reinit(stages, stages);
121 bool coefficients_are_initialized =
false;
131 A[1][0] = 0.522361915162541;
132 A[1][1] = 0.477638084837459;
135 A[2][0] = 0.368530939472566;
137 A[2][2] = 0.631469060527434;
139 A[3][0] = 0.334082932462285;
140 A[3][1] = 0.006966183666289;
142 A[3][3] = 0.658950883871426;
144 B[0][0] = 0.594057152884440;
149 B[1][1] = 0.283744320787718;
152 B[2][0] = 0.000000038023030;
154 B[2][2] = 0.375128712231540;
156 B[3][0] = 0.116941419604231;
157 B[3][1] = 0.004138311235266;
159 B[3][3] = 0.391454485963345;
161 coefficients_are_initialized =
true;
170 A[1][0] = 0.495124140877703;
171 A[1][1] = 0.504875859122297;
175 A[2][0] = 0.105701991897526;
177 A[2][2] = 0.894298008102474;
180 A[3][0] = 0.411551205755676;
181 A[3][1] = 0.011170516177380;
183 A[3][3] = 0.577278278066944;
185 A[4][0] = 0.186911123548222;
186 A[4][1] = 0.013354480555382;
187 A[4][2] = 0.012758264566319;
189 A[4][4] = 0.786976131330077;
191 B[0][0] = 0.418883109982196;
197 B[1][1] = 0.211483970024081;
201 B[2][0] = 0.000000000612488;
203 B[2][2] = 0.374606330884848;
206 B[3][0] = 0.046744815663888;
207 B[3][1] = 0.004679140556487;
209 B[3][3] = 0.241812120441849;
211 B[4][0] = 0.071938257223857;
212 B[4][1] = 0.005593966347235;
213 B[4][2] = 0.005344221539515;
215 B[4][4] = 0.329651009373300;
217 coefficients_are_initialized =
true;
227 A[1][0] = 0.271376652410776;
228 A[1][1] = 0.728623347589224;
233 A[2][0] = 0.003607665467954;
235 A[2][2] = 0.996392334532046;
239 A[3][0] = 0.295174024904477;
240 A[3][1] = 0.104490494022953;
242 A[3][3] = 0.600335481072570;
245 A[4][0] = 0.300088895805571;
246 A[4][1] = 0.000000004174982;
247 A[4][2] = 0.000038417983374;
249 A[4][4] = 0.699872682036073;
251 A[5][0] = 0.057902281374384;
252 A[5][1] = 0.003951957060919;
253 A[5][2] = 0.179481122980769;
254 A[5][3] = 0.126656280556504;
256 A[5][5] = 0.632008358027424;
258 B[0][0] = 0.325620674236780;
265 B[1][1] = 0.237254825706663;
270 B[2][0] = 0.000014278868889;
272 B[2][2] = 0.324445943775684;
276 B[3][0] = 0.000000008816565;
277 B[3][1] = 0.034024265115088;
279 B[3][3] = 0.195481644115112;
283 B[4][1] = 0.000000001359460;
284 B[4][2] = 0.000012509689649;
286 B[4][4] = 0.227893014604489;
288 B[5][0] = 0.033480821651945;
289 B[5][1] = 0.001286838922731;
290 B[5][2] = 0.058442764277772;
291 B[5][3] = 0.041241903471131;
293 B[5][5] = 0.205794987664170;
295 coefficients_are_initialized =
true;
306 A[1][0] = 0.412429019730110;
307 A[1][1] = 0.587570980269890;
313 A[2][0] = 0.005800594241485;
315 A[2][2] = 0.994199405758515;
320 A[3][0] = 0.162485678538202;
321 A[3][1] = 0.000000000270334;
323 A[3][3] = 0.837514321191464;
327 A[4][0] = 0.205239611567914;
328 A[4][1] = 0.000000000554433;
329 A[4][2] = 0.001461982584386;
331 A[4][4] = 0.793298405293266;
334 A[5][0] = 0.246951813330533;
335 A[5][1] = 0.000686077138452;
336 A[5][2] = 0.098274672761128;
337 A[5][3] = 0.125080337194733;
339 A[5][5] = 0.529007099575153;
341 A[6][0] = 0.003515397992512;
342 A[6][1] = 0.002051029751004;
343 A[6][2] = 0.037621575915744;
344 A[6][3] = 0.113733937331291;
345 A[6][4] = 0.000552268540167;
347 A[6][6] = 0.842525790469282;
349 B[0][0] = 0.267322588523961;
357 B[1][1] = 0.157070995387308;
363 B[2][0] = 0.019051847781300;
365 B[2][2] = 0.265771958656350;
370 B[3][0] = 0.014327744686556;
371 B[3][1] = 0.000000000072266;
373 B[3][3] = 0.223886496266790;
377 B[4][0] = 0.030979976588062;
378 B[4][1] = 0.000000000148213;
379 B[4][2] = 0.000390820968835;
381 B[4][4] = 0.212066583174926;
384 B[5][0] = 0.004054481853252;
385 B[5][1] = 0.000183403916578;
386 B[5][2] = 0.026271039908850;
387 B[5][3] = 0.033436799512346;
389 B[5][5] = 0.141415547205983;
391 B[6][0] = 0.021050441338920;
392 B[6][1] = 0.000548286582178;
393 B[6][2] = 0.010057097058147;
394 B[6][3] = 0.030403650530423;
395 B[6][4] = 0.000147633855718;
397 B[6][6] = 0.225226175206445;
399 coefficients_are_initialized =
true;
411 A[1][0] = 0.108675201424538;
412 A[1][1] = 0.891324798575462;
419 A[2][0] = 0.008159777689219;
421 A[2][2] = 0.991840222310781;
427 A[3][0] = 0.000075204616622;
428 A[3][1] = 0.000017473454611;
430 A[3][3] = 0.999907321928768;
435 A[4][0] = 0.275083494553101;
436 A[4][1] = 0.013251614514063;
437 A[4][2] = 0.333930523474093;
439 A[4][4] = 0.377734367458743;
443 A[5][0] = 0.172210423641858;
444 A[5][1] = 0.067723791902171;
445 A[5][2] = 0.031061316699451;
446 A[5][3] = 0.018868041432255;
448 A[5][5] = 0.710136426324266;
451 A[6][0] = 0.155954681117895;
453 A[6][2] = 0.000000000164948;
454 A[6][3] = 0.000000000009768;
455 A[6][4] = 0.000000000001983;
457 A[6][6] = 0.844045318705406;
459 A[7][0] = 0.021413729448041;
460 A[7][1] = 0.000000000008708;
461 A[7][2] = 0.000000000028479;
462 A[7][3] = 0.072111559681400;
463 A[7][4] = 0.109489249417096;
464 A[7][5] = 0.046882143587611;
466 A[7][7] = 0.750103317828665;
468 B[0][0] = 0.227519284497891;
477 B[1][1] = 0.202793580427116;
484 B[2][0] = 0.026257801089696;
486 B[2][2] = 0.225662777716378;
492 B[3][0] = 0.000000000064040;
493 B[3][1] = 0.000003975547891;
495 B[3][3] = 0.227498198449436;
500 B[4][0] = 0.006914605853513;
501 B[4][1] = 0.003014997852682;
502 B[4][2] = 0.075975633772832;
504 B[4][4] = 0.085941853014477;
508 B[5][0] = 0.000733937709508;
509 B[5][1] = 0.015408468677066;
510 B[5][2] = 0.007067048551022;
511 B[5][3] = 0.004292843286543;
513 B[5][5] = 0.161569731613186;
516 B[6][0] = 0.000000000000089;
518 B[6][2] = 0.000000000037529;
519 B[6][3] = 0.000000000002222;
520 B[6][4] = 0.000000000000451;
522 B[6][6] = 0.192036586995649;
524 B[7][0] = 0.024945755721405;
525 B[7][1] = 0.000000000001981;
526 B[7][2] = 0.000000000006480;
527 B[7][3] = 0.016406770462739;
528 B[7][4] = 0.024910915687589;
529 B[7][5] = 0.010666591764781;
531 B[7][7] = 0.170662970171872;
533 coefficients_are_initialized =
true;
537 AssertThrow(
false, dealii::ExcNotImplemented());
549 A[1][0] = 0.261216512493821;
550 A[1][1] = 0.738783487506179;
554 A[2][0] = 0.623613752757655;
556 A[2][2] = 0.376386247242345;
559 A[3][0] = 0.444745181201454;
560 A[3][1] = 0.120932584902288;
562 A[3][3] = 0.434322233896258;
564 A[4][0] = 0.213357715199957;
565 A[4][1] = 0.209928473023448;
566 A[4][2] = 0.063353148180384;
568 A[4][4] = 0.513360663596212;
570 B[0][0] = 0.605491839566400;
576 B[1][1] = 0.447327372891397;
580 B[2][0] = 0.000000844149769;
582 B[2][2] = 0.227898801230261;
585 B[3][0] = 0.002856233144485;
586 B[3][1] = 0.073223693296006;
588 B[3][3] = 0.262978568366434;
590 B[4][0] = 0.002362549760441;
591 B[4][1] = 0.127109977308333;
592 B[4][2] = 0.038359814234063;
594 B[4][4] = 0.310835692561898;
596 coefficients_are_initialized =
true;
606 A[1][0] = 0.441581886978406;
607 A[1][1] = 0.558418113021594;
612 A[2][0] = 0.496140382330059;
614 A[2][2] = 0.503859617669941;
618 A[3][0] = 0.392013998230666;
619 A[3][1] = 0.001687525300458;
621 A[3][3] = 0.606298476468875;
624 A[4][0] = 0.016884674246355;
625 A[4][1] = 0.000000050328214;
626 A[4][2] = 0.000018549175549;
628 A[4][4] = 0.983096726249882;
630 A[5][0] = 0.128599802059752;
631 A[5][1] = 0.150433518466544;
632 A[5][2] = 0.179199506866483;
633 A[5][3] = 0.173584325551242;
635 A[5][5] = 0.368182847055979;
637 B[0][0] = 0.448860018455995;
644 B[1][1] = 0.250651564517035;
649 B[2][0] = 0.004050697317371;
651 B[2][2] = 0.226162437286560;
655 B[3][0] = 0.000000073512372;
656 B[3][1] = 0.000757462637509;
658 B[3][3] = 0.272143145337661;
661 B[4][0] = 0.000592927398846;
662 B[4][1] = 0.000000022590323;
663 B[4][2] = 0.000008325983279;
665 B[4][4] = 0.441272814688551;
667 B[5][0] = 0.000000009191468;
668 B[5][1] = 0.067523591875293;
669 B[5][2] = 0.080435493959395;
670 B[5][3] = 0.077915063570602;
672 B[5][5] = 0.165262559524728;
674 coefficients_are_initialized =
true;
685 A[1][0] = 0.277584603405600;
686 A[1][1] = 0.722415396594400;
692 A[2][0] = 0.528403304637363;
693 A[2][1] = 0.018109310473034;
694 A[2][2] = 0.453487384889603;
699 A[3][0] = 0.363822566916605;
700 A[3][1] = 0.025636760093079;
701 A[3][2] = 0.000072932527637;
702 A[3][3] = 0.610467740462679;
706 A[4][0] = 0.080433061177282;
707 A[4][1] = 0.000000001538366;
708 A[4][2] = 0.000000000000020;
709 A[4][3] = 0.000000000036824;
710 A[4][4] = 0.919566937247508;
713 A[5][0] = 0.305416318145737;
714 A[5][1] = 0.017282647045059;
715 A[5][2] = 0.214348299745317;
716 A[5][3] = 0.001174022148498;
717 A[5][4] = 0.003799138070873;
718 A[5][5] = 0.457979574844515;
720 A[6][0] = 0.112741543203136;
721 A[6][1] = 0.042888410429255;
722 A[6][2] = 0.185108001868376;
723 A[6][3] = 0.000003952121250;
724 A[6][4] = 0.230275526732661;
725 A[6][5] = 0.110240916986851;
726 A[6][6] = 0.318741648658470;
728 B[0][0] = 0.236998129331275;
735 B[1][0] = 0.001205136607466;
736 B[1][1] = 0.310012922173259;
742 B[2][0] = 0.000000000029361;
743 B[2][1] = 0.007771318668946;
744 B[2][2] = 0.194606801046999;
749 B[3][0] = 0.001612059039346;
750 B[3][1] = 0.011001602331536;
751 B[3][2] = 0.000031297818569;
752 B[3][3] = 0.261972390131100;
756 B[4][0] = 0.000000000027723;
757 B[4][1] = 0.000000000660165;
758 B[4][2] = 0.000000000000009;
759 B[4][3] = 0.000000000015802;
760 B[4][4] = 0.394617327778342;
763 B[5][0] = 0.115125889382648;
764 B[5][1] = 0.007416569384575;
765 B[5][2] = 0.091984117559200;
766 B[5][3] = 0.000503812679890;
767 B[5][4] = 0.001630338861330;
768 B[5][5] = 0.196534551952426;
770 B[6][0] = 0.000102167855778;
771 B[6][1] = 0.018404869978158;
772 B[6][2] = 0.079436115076445;
773 B[6][3] = 0.000001695989127;
774 B[6][4] = 0.098819030275264;
775 B[6][5] = 0.047308112450629;
776 B[6][6] = 0.136782840433305;
778 coefficients_are_initialized =
true;
790 A[1][0] = 0.538569155333175;
791 A[1][1] = 0.461430844666825;
798 A[2][0] = 0.004485387460763;
800 A[2][2] = 0.995514612539237;
806 A[3][0] = 0.164495299288580;
807 A[3][1] = 0.016875060685979;
809 A[3][3] = 0.818629640025440;
814 A[4][0] = 0.426933682982668;
815 A[4][1] = 0.157047028197878;
816 A[4][2] = 0.023164224070770;
818 A[4][4] = 0.392855064748685;
822 A[5][0] = 0.082083400476958;
823 A[5][1] = 0.000000039091042;
824 A[5][2] = 0.033974171137350;
825 A[5][3] = 0.005505195713107;
827 A[5][5] = 0.878437193581543;
830 A[6][0] = 0.006736365648625;
831 A[6][1] = 0.010581829625529;
832 A[6][2] = 0.009353386191951;
833 A[6][3] = 0.101886062556838;
834 A[6][4] = 0.000023428364930;
836 A[6][6] = 0.871418927612128;
838 A[7][0] = 0.071115287415749;
839 A[7][1] = 0.018677648343953;
840 A[7][2] = 0.007902408660034;
841 A[7][3] = 0.319384027162348;
842 A[7][4] = 0.007121989995845;
843 A[7][5] = 0.001631615692736;
845 A[7][7] = 0.574167022729334;
847 B[0][0] = 0.282318339066479;
856 B[1][1] = 0.130270389660380;
863 B[2][0] = 0.003963092203460;
865 B[2][2] = 0.281052031928487;
871 B[3][0] = 0.000038019518678;
872 B[3][1] = 0.004764139104512;
874 B[3][3] = 0.231114160282572;
879 B[4][0] = 0.000019921336144;
880 B[4][1] = 0.044337256156151;
881 B[4][2] = 0.006539685265423;
883 B[4][4] = 0.110910189373703;
887 B[5][0] = 0.000000034006679;
888 B[5][1] = 0.000000011036118;
889 B[5][2] = 0.009591531566657;
890 B[5][3] = 0.001554217709960;
892 B[5][5] = 0.247998929466160;
895 B[6][0] = 0.013159891155054;
896 B[6][1] = 0.002987444564164;
897 B[6][2] = 0.002640632454359;
898 B[6][3] = 0.028764303955070;
899 B[6][4] = 0.000006614257074;
901 B[6][6] = 0.246017544274548;
903 B[7][0] = 0.000000010647874;
904 B[7][1] = 0.005273042658132;
905 B[7][2] = 0.002230994887525;
906 B[7][3] = 0.090167968072837;
907 B[7][4] = 0.002010668386475;
908 B[7][5] = 0.000460635032368;
910 B[7][7] = 0.162097880203691;
912 coefficients_are_initialized =
true;
916 AssertThrow(
false, dealii::ExcNotImplemented());
921 AssertThrow(
false, dealii::ExcNotImplemented());
924 AssertThrow(coefficients_are_initialized, dealii::ExcNotImplemented());
928 dealii::FullMatrix<double> crk;
929 crk.reinit(stages, stages);
931 for(
unsigned int k = 0; k < stages; ++k)
933 for(
unsigned int i = 0; i < stages; ++i)
936 for(
unsigned int l = k + 1; l < i + 1; ++l)
938 csum = csum + crk[l - 1][k] * A[i][l];
940 crk[i][k] = B[i][k] + csum;
946 for(
unsigned int k = 1; k < stages; ++k)
949 for(
unsigned int l = 0; l < k + 1; ++l)
951 c[k] = c[k] + crk[k - 1][l];