18a381b04SJed Brown /* 2d27334e2SStefano Zampini Code for timestepping with additive Runge-Kutta IMEX method or Diagonally Implicit Runge-Kutta methods. 38a381b04SJed Brown 48a381b04SJed Brown Notes: 5d27334e2SStefano Zampini For ARK, the general system is written as 68a381b04SJed Brown 7f9c1d6abSBarry Smith F(t,U,Udot) = G(t,U) 88a381b04SJed Brown 98a381b04SJed Brown where F represents the stiff part of the physics and G represents the non-stiff part. 108a381b04SJed Brown 118a381b04SJed Brown */ 12af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 131e25c274SJed Brown #include <petscdm.h> 148a381b04SJed Brown 1519fd82e9SBarry Smith static TSARKIMEXType TSARKIMEXDefault = TSARKIMEX3; 163405e92cSStefano Zampini static TSDIRKType TSDIRKDefault = TSDIRKES213SAL; 178a381b04SJed Brown static PetscBool TSARKIMEXRegisterAllCalled; 188a381b04SJed Brown static PetscBool TSARKIMEXPackageInitialized; 1956dcabbaSDebojyoti Ghosh static PetscErrorCode TSExtrapolate_ARKIMEX(TS, PetscReal, Vec); 208a381b04SJed Brown 218a381b04SJed Brown typedef struct _ARKTableau *ARKTableau; 228a381b04SJed Brown struct _ARKTableau { 238a381b04SJed Brown char *name; 24d27334e2SStefano Zampini PetscBool additive; /* If False, it is a DIRK method */ 254f385281SJed Brown PetscInt order; /* Classical approximation order of the method */ 264f385281SJed Brown PetscInt s; /* Number of stages */ 27e817cc15SEmil Constantinescu PetscBool stiffly_accurate; /* The implicit part is stiffly accurate */ 28e817cc15SEmil Constantinescu PetscBool FSAL_implicit; /* The implicit part is FSAL */ 29e817cc15SEmil Constantinescu PetscBool explicit_first_stage; /* The implicit part has an explicit first stage */ 304f385281SJed Brown PetscInt pinterp; /* Interpolation order */ 314f385281SJed Brown PetscReal *At, *bt, *ct; /* Stiff tableau */ 328a381b04SJed Brown PetscReal *A, *b, *c; /* Non-stiff tableau */ 33108c343cSJed Brown PetscReal *bembedt, *bembed; /* Embedded formula of order one less (order-1) */ 34cd652676SJed Brown PetscReal *binterpt, *binterp; /* Dense output formula */ 35108c343cSJed Brown PetscReal ccfl; /* Placeholder for CFL coefficient relative to forward Euler */ 368a381b04SJed Brown }; 378a381b04SJed Brown typedef struct _ARKTableauLink *ARKTableauLink; 388a381b04SJed Brown struct _ARKTableauLink { 398a381b04SJed Brown struct _ARKTableau tab; 408a381b04SJed Brown ARKTableauLink next; 418a381b04SJed Brown }; 428a381b04SJed Brown static ARKTableauLink ARKTableauList; 438a381b04SJed Brown 448a381b04SJed Brown typedef struct { 458a381b04SJed Brown ARKTableau tableau; 468a381b04SJed Brown Vec *Y; /* States computed during the step */ 478a381b04SJed Brown Vec *YdotI; /* Time derivatives for the stiff part */ 488a381b04SJed Brown Vec *YdotRHS; /* Function evaluations for the non-stiff part */ 4956dcabbaSDebojyoti Ghosh Vec *Y_prev; /* States computed during the previous time step */ 5056dcabbaSDebojyoti Ghosh Vec *YdotI_prev; /* Time derivatives for the stiff part for the previous time step*/ 5156dcabbaSDebojyoti Ghosh Vec *YdotRHS_prev; /* Function evaluations for the non-stiff part for the previous time step*/ 52e817cc15SEmil Constantinescu Vec Ydot0; /* Holds the slope from the previous step in FSAL case */ 538a381b04SJed Brown Vec Ydot; /* Work vector holding Ydot during residual evaluation */ 548a381b04SJed Brown Vec Z; /* Ydot = shift(Y-Z) */ 558a381b04SJed Brown PetscScalar *work; /* Scalar work */ 56b296d7d5SJed Brown PetscReal scoeff; /* shift = scoeff/dt */ 578a381b04SJed Brown PetscReal stage_time; 584cc180ffSJed Brown PetscBool imex; 5996400bd6SLisandro Dalcin PetscBool extrapolate; /* Extrapolate initial guess from previous time-step stage values */ 60108c343cSJed Brown TSStepStatus status; 6180ab5e31SHong Zhang 6280ab5e31SHong Zhang /* context for sensitivity analysis */ 6380ab5e31SHong Zhang Vec *VecsDeltaLam; /* Increment of the adjoint sensitivity w.r.t IC at stage */ 6480ab5e31SHong Zhang Vec *VecsSensiTemp; /* Vectors to be multiplied with Jacobian transpose */ 6580ab5e31SHong Zhang Vec *VecsSensiPTemp; /* Temporary Vectors to store JacobianP-transpose-vector product */ 668a381b04SJed Brown } TS_ARKIMEX; 67d27334e2SStefano Zampini 681f80e275SEmil Constantinescu /*MC 691d27aa22SBarry Smith TSARKIMEXARS122 - Second order ARK IMEX scheme, {cite}`ascher_1997` 708a381b04SJed Brown 711f80e275SEmil Constantinescu This method has one explicit stage and one implicit stage. 721f80e275SEmil Constantinescu 73bcf0153eSBarry Smith Options Database Key: 7467b8a455SSatish Balay . -ts_arkimex_type ars122 - set arkimex type to ars122 759bd3e852SBarry Smith 76bcf0153eSBarry Smith Level: advanced 77bcf0153eSBarry Smith 781cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 791f80e275SEmil Constantinescu M*/ 80d27334e2SStefano Zampini 811f80e275SEmil Constantinescu /*MC 821f80e275SEmil Constantinescu TSARKIMEXA2 - Second order ARK IMEX scheme with A-stable implicit part. 831f80e275SEmil Constantinescu 841f80e275SEmil Constantinescu This method has an explicit stage and one implicit stage, and has an A-stable implicit scheme. This method was provided by Emil Constantinescu. 851f80e275SEmil Constantinescu 86bcf0153eSBarry Smith Options Database Key: 8767b8a455SSatish Balay . -ts_arkimex_type a2 - set arkimex type to a2 889bd3e852SBarry Smith 891f80e275SEmil Constantinescu Level: advanced 901f80e275SEmil Constantinescu 911cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 921f80e275SEmil Constantinescu M*/ 93d27334e2SStefano Zampini 941f80e275SEmil Constantinescu /*MC 951d27aa22SBarry Smith TSARKIMEXL2 - Second order ARK IMEX scheme with L-stable implicit part, {cite}`pareschi_2005` 961f80e275SEmil Constantinescu 971f80e275SEmil Constantinescu This method has two implicit stages, and L-stable implicit scheme. 981f80e275SEmil Constantinescu 99bcf0153eSBarry Smith Options Database Key: 10067b8a455SSatish Balay . -ts_arkimex_type l2 - set arkimex type to l2 1019bd3e852SBarry Smith 102bcf0153eSBarry Smith Level: advanced 103bcf0153eSBarry Smith 1041cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 1051f80e275SEmil Constantinescu M*/ 106d27334e2SStefano Zampini 1071f80e275SEmil Constantinescu /*MC 108c79dcfbdSBarry Smith TSARKIMEX1BEE - First order backward Euler represented as an ARK IMEX scheme with extrapolation as error estimator. This is a 3-stage method. 109e817cc15SEmil Constantinescu 110e817cc15SEmil Constantinescu This method is aimed at starting the integration of implicit DAEs when explicit first-stage ARK methods are used. 111e817cc15SEmil Constantinescu 112bcf0153eSBarry Smith Options Database Key: 11367b8a455SSatish Balay . -ts_arkimex_type 1bee - set arkimex type to 1bee 1149bd3e852SBarry Smith 115e817cc15SEmil Constantinescu Level: advanced 116e817cc15SEmil Constantinescu 1171cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 118e817cc15SEmil Constantinescu M*/ 119d27334e2SStefano Zampini 120e817cc15SEmil Constantinescu /*MC 1211f80e275SEmil Constantinescu TSARKIMEX2C - Second order ARK IMEX scheme with L-stable implicit part. 1221f80e275SEmil Constantinescu 1231f80e275SEmil Constantinescu This method has one explicit stage and two implicit stages. The implicit part is the same as in TSARKIMEX2D and TSARKIMEX2E, but the explicit part has a larger stability region on the negative real axis. This method was provided by Emil Constantinescu. 1241f80e275SEmil Constantinescu 125bcf0153eSBarry Smith Options Database Key: 12667b8a455SSatish Balay . -ts_arkimex_type 2c - set arkimex type to 2c 1279bd3e852SBarry Smith 1281f80e275SEmil Constantinescu Level: advanced 1291f80e275SEmil Constantinescu 1301cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 1311f80e275SEmil Constantinescu M*/ 132d27334e2SStefano Zampini 13364f491ddSJed Brown /*MC 13464f491ddSJed Brown TSARKIMEX2D - Second order ARK IMEX scheme with L-stable implicit part. 13564f491ddSJed Brown 136da81f932SPierre Jolivet This method has one explicit stage and two implicit stages. The stability function is independent of the explicit part in the infinity limit of the implicit component. This method was provided by Emil Constantinescu. 13764f491ddSJed Brown 138bcf0153eSBarry Smith Options Database Key: 13967b8a455SSatish Balay . -ts_arkimex_type 2d - set arkimex type to 2d 1409bd3e852SBarry Smith 141b330ce4dSSatish Balay Level: advanced 142b330ce4dSSatish Balay 1431cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 14464f491ddSJed Brown M*/ 145d27334e2SStefano Zampini 14664f491ddSJed Brown /*MC 14764f491ddSJed Brown TSARKIMEX2E - Second order ARK IMEX scheme with L-stable implicit part. 14864f491ddSJed Brown 14964f491ddSJed Brown This method has one explicit stage and two implicit stages. It is is an optimal method developed by Emil Constantinescu. 15064f491ddSJed Brown 151bcf0153eSBarry Smith Options Database Key: 15267b8a455SSatish Balay . -ts_arkimex_type 2e - set arkimex type to 2e 1539bd3e852SBarry Smith 154b330ce4dSSatish Balay Level: advanced 155b330ce4dSSatish Balay 1561cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 15764f491ddSJed Brown M*/ 158d27334e2SStefano Zampini 15964f491ddSJed Brown /*MC 1601d27aa22SBarry Smith TSARKIMEXPRSSP2 - Second order SSP ARK IMEX scheme, {cite}`pareschi_2005` 1616cf0794eSJed Brown 1626cf0794eSJed Brown This method has three implicit stages. 1636cf0794eSJed Brown 1641d27aa22SBarry Smith This method is referred to as SSP2-(3,3,2) in <https://arxiv.org/abs/1110.4375> 1656cf0794eSJed Brown 166bcf0153eSBarry Smith Options Database Key: 16767b8a455SSatish Balay . -ts_arkimex_type prssp2 - set arkimex type to prssp2 1689bd3e852SBarry Smith 1696cf0794eSJed Brown Level: advanced 1706cf0794eSJed Brown 1711cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 1726cf0794eSJed Brown M*/ 173d27334e2SStefano Zampini 1746cf0794eSJed Brown /*MC 1751d27aa22SBarry Smith TSARKIMEX3 - Third order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003` 17664f491ddSJed Brown 17764f491ddSJed Brown This method has one explicit stage and three implicit stages. 17864f491ddSJed Brown 179bcf0153eSBarry Smith Options Database Key: 18067b8a455SSatish Balay . -ts_arkimex_type 3 - set arkimex type to 3 1819bd3e852SBarry Smith 182bcf0153eSBarry Smith Level: advanced 183bcf0153eSBarry Smith 1841cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 18564f491ddSJed Brown M*/ 186d27334e2SStefano Zampini 18764f491ddSJed Brown /*MC 1881d27aa22SBarry Smith TSARKIMEXARS443 - Third order ARK IMEX scheme, {cite}`ascher_1997` 1896cf0794eSJed Brown 1906cf0794eSJed Brown This method has one explicit stage and four implicit stages. 1916cf0794eSJed Brown 192bcf0153eSBarry Smith Options Database Key: 19367b8a455SSatish Balay . -ts_arkimex_type ars443 - set arkimex type to ars443 1949bd3e852SBarry Smith 195bcf0153eSBarry Smith Level: advanced 196bcf0153eSBarry Smith 1971d27aa22SBarry Smith Notes: 1981d27aa22SBarry Smith This method is referred to as ARS(4,4,3) in <https://arxiv.org/abs/1110.4375> 1996cf0794eSJed Brown 2001cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 2016cf0794eSJed Brown M*/ 202d27334e2SStefano Zampini 2036cf0794eSJed Brown /*MC 2041d27aa22SBarry Smith TSARKIMEXBPR3 - Third order ARK IMEX scheme. Referred to as ARK3 in <https://arxiv.org/abs/1110.4375> 2056cf0794eSJed Brown 2066cf0794eSJed Brown This method has one explicit stage and four implicit stages. 2076cf0794eSJed Brown 208bcf0153eSBarry Smith Options Database Key: 20967b8a455SSatish Balay . -ts_arkimex_type bpr3 - set arkimex type to bpr3 2109bd3e852SBarry Smith 211bcf0153eSBarry Smith Level: advanced 212bcf0153eSBarry Smith 2131cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 2146cf0794eSJed Brown M*/ 215d27334e2SStefano Zampini 2166cf0794eSJed Brown /*MC 2171d27aa22SBarry Smith TSARKIMEX4 - Fourth order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`. 21864f491ddSJed Brown 21964f491ddSJed Brown This method has one explicit stage and four implicit stages. 22064f491ddSJed Brown 221bcf0153eSBarry Smith Options Database Key: 22267b8a455SSatish Balay . -ts_arkimex_type 4 - set arkimex type to4 2239bd3e852SBarry Smith 224bcf0153eSBarry Smith Level: advanced 225bcf0153eSBarry Smith 2261cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 22764f491ddSJed Brown M*/ 228d27334e2SStefano Zampini 22964f491ddSJed Brown /*MC 2301d27aa22SBarry Smith TSARKIMEX5 - Fifth order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`. 23164f491ddSJed Brown 23264f491ddSJed Brown This method has one explicit stage and five implicit stages. 23364f491ddSJed Brown 234bcf0153eSBarry Smith Options Database Key: 23567b8a455SSatish Balay . -ts_arkimex_type 5 - set arkimex type to 5 2369bd3e852SBarry Smith 237bcf0153eSBarry Smith Level: advanced 238bcf0153eSBarry Smith 2391cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 24064f491ddSJed Brown M*/ 24164f491ddSJed Brown 2423405e92cSStefano Zampini /*MC 2433405e92cSStefano Zampini TSDIRKS212 - Second order DIRK scheme. 2443405e92cSStefano Zampini 2453405e92cSStefano Zampini This method has two implicit stages with an embedded method of other 1. 2463405e92cSStefano Zampini See `TSDIRK` for additional details. 2473405e92cSStefano Zampini 2483405e92cSStefano Zampini Options Database Key: 2493405e92cSStefano Zampini . -ts_dirk_type s212 - select this method. 2503405e92cSStefano Zampini 2513405e92cSStefano Zampini Level: advanced 2523405e92cSStefano Zampini 2533405e92cSStefano Zampini Note: 2543405e92cSStefano Zampini This is the default DIRK scheme in SUNDIALS. 2553405e92cSStefano Zampini 2563405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2573405e92cSStefano Zampini M*/ 2583405e92cSStefano Zampini 2593405e92cSStefano Zampini /*MC 2601d27aa22SBarry Smith TSDIRKES122SAL - First order DIRK scheme <https://arxiv.org/abs/1803.01613> 2613405e92cSStefano Zampini 2623405e92cSStefano Zampini Uses backward Euler as advancing method and trapezoidal rule as embedded method. See `TSDIRK` for additional details. 2633405e92cSStefano Zampini 2643405e92cSStefano Zampini Options Database Key: 2653405e92cSStefano Zampini . -ts_dirk_type es122sal - select this method. 2663405e92cSStefano Zampini 2673405e92cSStefano Zampini Level: advanced 2683405e92cSStefano Zampini 2693405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2703405e92cSStefano Zampini M*/ 2713405e92cSStefano Zampini 2723405e92cSStefano Zampini /*MC 2731d27aa22SBarry Smith TSDIRKES213SAL - Second order DIRK scheme {cite}`kennedy2019diagonally`. Also known as TR-BDF2, see{cite}`hosea1996analysis` 2743405e92cSStefano Zampini 2753405e92cSStefano Zampini See `TSDIRK` for additional details. 2763405e92cSStefano Zampini 2773405e92cSStefano Zampini Options Database Key: 2783405e92cSStefano Zampini . -ts_dirk_type es213sal - select this method. 2793405e92cSStefano Zampini 2803405e92cSStefano Zampini Level: advanced 2813405e92cSStefano Zampini 2823405e92cSStefano Zampini Note: 2833405e92cSStefano Zampini This is the default DIRK scheme used in PETSc. 2843405e92cSStefano Zampini 2853405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2863405e92cSStefano Zampini M*/ 2873405e92cSStefano Zampini 2883405e92cSStefano Zampini /*MC 2891d27aa22SBarry Smith TSDIRKES324SAL - Third order DIRK scheme, {cite}`kennedy2019diagonally` 2903405e92cSStefano Zampini 2913405e92cSStefano Zampini See `TSDIRK` for additional details. 2923405e92cSStefano Zampini 2933405e92cSStefano Zampini Options Database Key: 2943405e92cSStefano Zampini . -ts_dirk_type es324sal - select this method. 2953405e92cSStefano Zampini 2963405e92cSStefano Zampini Level: advanced 2973405e92cSStefano Zampini 2983405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2993405e92cSStefano Zampini M*/ 3003405e92cSStefano Zampini 3013405e92cSStefano Zampini /*MC 3021d27aa22SBarry Smith TSDIRKES325SAL - Third order DIRK scheme {cite}`kennedy2019diagonally`. 3033405e92cSStefano Zampini 3043405e92cSStefano Zampini See `TSDIRK` for additional details. 3053405e92cSStefano Zampini 3063405e92cSStefano Zampini Options Database Key: 3073405e92cSStefano Zampini . -ts_dirk_type es325sal - select this method. 3083405e92cSStefano Zampini 3093405e92cSStefano Zampini Level: advanced 3103405e92cSStefano Zampini 3113405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3123405e92cSStefano Zampini M*/ 3133405e92cSStefano Zampini 3143405e92cSStefano Zampini /*MC 3151d27aa22SBarry Smith TSDIRK657A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3163405e92cSStefano Zampini 3173405e92cSStefano Zampini See `TSDIRK` for additional details. 3183405e92cSStefano Zampini 3193405e92cSStefano Zampini Options Database Key: 3203405e92cSStefano Zampini . -ts_dirk_type 657a - select this method. 3213405e92cSStefano Zampini 3223405e92cSStefano Zampini Level: advanced 3233405e92cSStefano Zampini 3243405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3253405e92cSStefano Zampini M*/ 3263405e92cSStefano Zampini 3273405e92cSStefano Zampini /*MC 3281d27aa22SBarry Smith TSDIRKES648SA - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3293405e92cSStefano Zampini 3303405e92cSStefano Zampini See `TSDIRK` for additional details. 3313405e92cSStefano Zampini 3323405e92cSStefano Zampini Options Database Key: 3333405e92cSStefano Zampini . -ts_dirk_type es648sa - select this method. 3343405e92cSStefano Zampini 3353405e92cSStefano Zampini Level: advanced 3363405e92cSStefano Zampini 3373405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3383405e92cSStefano Zampini M*/ 3393405e92cSStefano Zampini 3403405e92cSStefano Zampini /*MC 3411d27aa22SBarry Smith TSDIRK658A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3423405e92cSStefano Zampini 3433405e92cSStefano Zampini See `TSDIRK` for additional details. 3443405e92cSStefano Zampini 3453405e92cSStefano Zampini Options Database Key: 3463405e92cSStefano Zampini . -ts_dirk_type 658a - select this method. 3473405e92cSStefano Zampini 3483405e92cSStefano Zampini Level: advanced 3493405e92cSStefano Zampini 3503405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3513405e92cSStefano Zampini M*/ 3523405e92cSStefano Zampini 3533405e92cSStefano Zampini /*MC 3541d27aa22SBarry Smith TSDIRKS659A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3553405e92cSStefano Zampini 3563405e92cSStefano Zampini See `TSDIRK` for additional details. 3573405e92cSStefano Zampini 3583405e92cSStefano Zampini Options Database Key: 3593405e92cSStefano Zampini . -ts_dirk_type s659a - select this method. 3603405e92cSStefano Zampini 3613405e92cSStefano Zampini Level: advanced 3623405e92cSStefano Zampini 3633405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3643405e92cSStefano Zampini M*/ 3653405e92cSStefano Zampini 3663405e92cSStefano Zampini /*MC 3671d27aa22SBarry Smith TSDIRK7510SAL - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3683405e92cSStefano Zampini 3693405e92cSStefano Zampini See `TSDIRK` for additional details. 3703405e92cSStefano Zampini 3713405e92cSStefano Zampini Options Database Key: 3723405e92cSStefano Zampini . -ts_dirk_type 7510sal - select this method. 3733405e92cSStefano Zampini 3743405e92cSStefano Zampini Level: advanced 3753405e92cSStefano Zampini 3763405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3773405e92cSStefano Zampini M*/ 3783405e92cSStefano Zampini 3793405e92cSStefano Zampini /*MC 3801d27aa22SBarry Smith TSDIRKES7510SA - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3813405e92cSStefano Zampini 3823405e92cSStefano Zampini See `TSDIRK` for additional details. 3833405e92cSStefano Zampini 3843405e92cSStefano Zampini Options Database Key: 3853405e92cSStefano Zampini . -ts_dirk_type es7510sa - select this method. 3863405e92cSStefano Zampini 3873405e92cSStefano Zampini Level: advanced 3883405e92cSStefano Zampini 3893405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3903405e92cSStefano Zampini M*/ 3913405e92cSStefano Zampini 3923405e92cSStefano Zampini /*MC 3931d27aa22SBarry Smith TSDIRK759A - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3943405e92cSStefano Zampini 3953405e92cSStefano Zampini See `TSDIRK` for additional details. 3963405e92cSStefano Zampini 3973405e92cSStefano Zampini Options Database Key: 3983405e92cSStefano Zampini . -ts_dirk_type 759a - select this method. 3993405e92cSStefano Zampini 4003405e92cSStefano Zampini Level: advanced 4013405e92cSStefano Zampini 4023405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4033405e92cSStefano Zampini M*/ 4043405e92cSStefano Zampini 4053405e92cSStefano Zampini /*MC 4061d27aa22SBarry Smith TSDIRKS7511SAL - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4073405e92cSStefano Zampini 4083405e92cSStefano Zampini See `TSDIRK` for additional details. 4093405e92cSStefano Zampini 4103405e92cSStefano Zampini Options Database Key: 4113405e92cSStefano Zampini . -ts_dirk_type s7511sal - select this method. 4123405e92cSStefano Zampini 4133405e92cSStefano Zampini Level: advanced 4143405e92cSStefano Zampini 4153405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4163405e92cSStefano Zampini M*/ 4173405e92cSStefano Zampini 4183405e92cSStefano Zampini /*MC 4191d27aa22SBarry Smith TSDIRK8614A - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4203405e92cSStefano Zampini 4213405e92cSStefano Zampini See `TSDIRK` for additional details. 4223405e92cSStefano Zampini 4233405e92cSStefano Zampini Options Database Key: 4243405e92cSStefano Zampini . -ts_dirk_type 8614a - select this method. 4253405e92cSStefano Zampini 4263405e92cSStefano Zampini Level: advanced 4273405e92cSStefano Zampini 4283405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4293405e92cSStefano Zampini M*/ 4303405e92cSStefano Zampini 4313405e92cSStefano Zampini /*MC 4321d27aa22SBarry Smith TSDIRK8616SAL - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4333405e92cSStefano Zampini 4343405e92cSStefano Zampini See `TSDIRK` for additional details. 4353405e92cSStefano Zampini 4363405e92cSStefano Zampini Options Database Key: 4373405e92cSStefano Zampini . -ts_dirk_type 8616sal - select this method. 4383405e92cSStefano Zampini 4393405e92cSStefano Zampini Level: advanced 4403405e92cSStefano Zampini 4413405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4423405e92cSStefano Zampini M*/ 4433405e92cSStefano Zampini 4443405e92cSStefano Zampini /*MC 4451d27aa22SBarry Smith TSDIRKES8516SAL - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4463405e92cSStefano Zampini 4473405e92cSStefano Zampini See `TSDIRK` for additional details. 4483405e92cSStefano Zampini 4493405e92cSStefano Zampini Options Database Key: 4503405e92cSStefano Zampini . -ts_dirk_type es8516sal - select this method. 4513405e92cSStefano Zampini 4523405e92cSStefano Zampini Level: advanced 4533405e92cSStefano Zampini 4543405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4553405e92cSStefano Zampini M*/ 4563405e92cSStefano Zampini 457d27334e2SStefano Zampini static PetscErrorCode TSHasRHSFunction(TS ts, PetscBool *has) 458d27334e2SStefano Zampini { 459*8434afd1SBarry Smith TSRHSFunctionFn *func; 460d27334e2SStefano Zampini 461d27334e2SStefano Zampini PetscFunctionBegin; 462d27334e2SStefano Zampini *has = PETSC_FALSE; 463d27334e2SStefano Zampini PetscCall(DMTSGetRHSFunction(ts->dm, &func, NULL)); 464d27334e2SStefano Zampini if (func) *has = PETSC_TRUE; 465d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 466d27334e2SStefano Zampini } 467d27334e2SStefano Zampini 4688a381b04SJed Brown /*@C 469bcf0153eSBarry Smith TSARKIMEXRegisterAll - Registers all of the additive Runge-Kutta implicit-explicit methods in `TSARKIMEX` 4708a381b04SJed Brown 471fca742c7SJed Brown Not Collective, but should be called by all processes which will need the schemes to be registered 4728a381b04SJed Brown 4738a381b04SJed Brown Level: advanced 4748a381b04SJed Brown 4751cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSARKIMEX`, `TSARKIMEXRegisterDestroy()` 4768a381b04SJed Brown @*/ 477d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterAll(void) 478d71ae5a4SJacob Faibussowitsch { 4798a381b04SJed Brown PetscFunctionBegin; 4803ba16761SJacob Faibussowitsch if (TSARKIMEXRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 4818a381b04SJed Brown TSARKIMEXRegisterAllCalled = PETSC_TRUE; 482e817cc15SEmil Constantinescu 483d27334e2SStefano Zampini #define RC PetscRealConstant 484d27334e2SStefano Zampini #define s2 RC(1.414213562373095048802) /* PetscSqrtReal((PetscReal)2.0) */ 485d27334e2SStefano Zampini #define us2 RC(0.2928932188134524755992) /* 1.0-1.0/PetscSqrtReal((PetscReal)2.0); */ 486d27334e2SStefano Zampini 487d27334e2SStefano Zampini /* Diagonally implicit methods */ 488e817cc15SEmil Constantinescu { 489d27334e2SStefano Zampini /* DIRK212, default of SUNDIALS */ 490d27334e2SStefano Zampini const PetscReal A[2][2] = { 491d27334e2SStefano Zampini {RC(1.0), RC(0.0)}, 492d27334e2SStefano Zampini {RC(-1.0), RC(1.0)} 493d27334e2SStefano Zampini }; 494d27334e2SStefano Zampini const PetscReal b[2] = {RC(0.5), RC(0.5)}; 495d27334e2SStefano Zampini const PetscReal bembed[2] = {RC(1.0), RC(0.0)}; 496d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKS212, 2, 2, &A[0][0], b, NULL, bembed, 1, b)); 497d27334e2SStefano Zampini } 498d27334e2SStefano Zampini 4999371c9d4SSatish Balay { 500d27334e2SStefano Zampini /* ESDIRK12 from https://arxiv.org/pdf/1803.01613.pdf */ 501d27334e2SStefano Zampini const PetscReal A[2][2] = { 502d27334e2SStefano Zampini {RC(0.0), RC(0.0)}, 503d27334e2SStefano Zampini {RC(0.0), RC(1.0)} 504d27334e2SStefano Zampini }; 505d27334e2SStefano Zampini const PetscReal b[2] = {RC(0.0), RC(1.0)}; 506d27334e2SStefano Zampini const PetscReal bembed[2] = {RC(0.5), RC(0.5)}; 5073405e92cSStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES122SAL, 1, 2, &A[0][0], b, NULL, bembed, 1, b)); 508d27334e2SStefano Zampini } 509d27334e2SStefano Zampini 510d27334e2SStefano Zampini { 511d27334e2SStefano Zampini /* ESDIRK213L[2]SA from KC16. 5123405e92cSStefano Zampini TR-BDF2 from Hosea and Shampine 5133405e92cSStefano Zampini ESDIRK23 in https://arxiv.org/pdf/1803.01613.pdf */ 514d27334e2SStefano Zampini const PetscReal A[3][3] = { 515d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0)}, 516d27334e2SStefano Zampini {us2, us2, RC(0.0)}, 517d27334e2SStefano Zampini {s2 / RC(4.0), s2 / RC(4.0), us2 }, 518d27334e2SStefano Zampini }; 519d27334e2SStefano Zampini const PetscReal b[3] = {s2 / RC(4.0), s2 / RC(4.0), us2}; 520d27334e2SStefano Zampini const PetscReal bembed[3] = {(RC(1.0) - s2 / RC(4.0)) / RC(3.0), (RC(3.0) * s2 / RC(4.0) + RC(1.0)) / RC(3.0), us2 / RC(3.0)}; 521d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES213SAL, 2, 3, &A[0][0], b, NULL, bembed, 1, b)); 522d27334e2SStefano Zampini } 523d27334e2SStefano Zampini 524d27334e2SStefano Zampini { 525d27334e2SStefano Zampini #define g RC(0.43586652150845899941601945) 526d27334e2SStefano Zampini #define g2 PetscSqr(g) 527d27334e2SStefano Zampini #define g3 g *g2 528d27334e2SStefano Zampini #define g4 PetscSqr(g2) 529d27334e2SStefano Zampini #define g5 g *g4 530d27334e2SStefano Zampini #define c3 RC(1.0) 531d27334e2SStefano Zampini #define a32 c3 *(c3 - RC(2.0) * g) / (RC(4.0) * g) 532d27334e2SStefano Zampini #define b2 (-RC(2.0) + RC(3.0) * c3 + RC(6.0) * g * (RC(1.0) - c3)) / (RC(12.0) * g * (c3 - RC(2.0) * g)) 533d27334e2SStefano Zampini #define b3 (RC(1.0) - RC(6.0) * g + RC(6.0) * g2) / (RC(3.0) * c3 * (c3 - RC(2.0) * g)) 534d27334e2SStefano Zampini #if 0 535d27334e2SStefano Zampini /* This is for c3 = 3/5 */ 536d27334e2SStefano Zampini #define bh2 \ 537d27334e2SStefano Zampini c3 * (-RC(1.0) + RC(6.0) * g - RC(23.0) * g3 + RC(12.0) * g4 - RC(6.0) * g5) / (RC(4.0) * (RC(2.0) * g - c3) * (RC(1.0) - RC(6.0) * g + RC(6.0) * g2)) + (RC(3.0) - RC(27.0) * g + RC(68.0) * g2 - RC(55.0) * g3 + RC(21.0) * g4 - RC(6.0) * g5) / (RC(2.0) * (RC(2.0) * g - c3) * (RC(1.0) - RC(6.0) * g + RC(6.0) * g2)) 538d27334e2SStefano Zampini #define bh3 -g * (-RC(2.0) + RC(21.0) * g - RC(68.0) * g2 + RC(79.0) * g3 - RC(33.0) * g4 + RC(12.0) * g5) / (RC(2.0) * (RC(2.0) * g - c3) * (RC(1.0) - RC(6.0) * g + RC(6.0) * g2)) 539d27334e2SStefano Zampini #define bh4 -RC(3.0) * g2 * (-RC(1.0) + RC(4.0) * g - RC(2.0) * g2 + g3) / (RC(1.0) - RC(6.0) * g + RC(6.0) * g2) 540d27334e2SStefano Zampini #else 541d27334e2SStefano Zampini /* This is for c3 = 1.0 */ 542d27334e2SStefano Zampini #define bh2 a32 543d27334e2SStefano Zampini #define bh3 g 544d27334e2SStefano Zampini #define bh4 RC(0.0) 545d27334e2SStefano Zampini #endif 546d27334e2SStefano Zampini /* ESDIRK3(2I)4L[2]SA from KC16 with c3 = 1.0 */ 547d27334e2SStefano Zampini /* Given by Kvaerno https://link.springer.com/article/10.1023/b:bitn.0000046811.70614.38 */ 548d27334e2SStefano Zampini const PetscReal A[4][4] = { 549d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0)}, 550d27334e2SStefano Zampini {g, g, RC(0.0), RC(0.0)}, 551d27334e2SStefano Zampini {c3 - a32 - g, a32, g, RC(0.0)}, 552d27334e2SStefano Zampini {RC(1.0) - b2 - b3 - g, b2, b3, g }, 553d27334e2SStefano Zampini }; 554d27334e2SStefano Zampini const PetscReal b[4] = {RC(1.0) - b2 - b3 - g, b2, b3, g}; 555d27334e2SStefano Zampini const PetscReal bembed[4] = {RC(1.0) - bh2 - bh3 - bh4, bh2, bh3, bh4}; 556d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES324SAL, 3, 4, &A[0][0], b, NULL, bembed, 1, b)); 557d27334e2SStefano Zampini #undef g 558d27334e2SStefano Zampini #undef g2 559d27334e2SStefano Zampini #undef g3 560d27334e2SStefano Zampini #undef c3 561d27334e2SStefano Zampini #undef a32 562d27334e2SStefano Zampini #undef b2 563d27334e2SStefano Zampini #undef b3 564d27334e2SStefano Zampini #undef bh2 565d27334e2SStefano Zampini #undef bh3 566d27334e2SStefano Zampini #undef bh4 567d27334e2SStefano Zampini } 568d27334e2SStefano Zampini 569d27334e2SStefano Zampini { 570d27334e2SStefano Zampini /* ESDIRK3(2I)5L[2]SA from KC16 */ 571d27334e2SStefano Zampini const PetscReal A[5][5] = { 572d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 573d27334e2SStefano Zampini {RC(9.0) / RC(40.0), RC(9.0) / RC(40.0), RC(0.0), RC(0.0), RC(0.0) }, 574d27334e2SStefano Zampini {RC(19.0) / RC(72.0), RC(14.0) / RC(45.0), RC(9.0) / RC(40.0), RC(0.0), RC(0.0) }, 575d27334e2SStefano Zampini {RC(3337.0) / RC(11520.0), RC(233.0) / RC(720.0), RC(207.0) / RC(1280.0), RC(9.0) / RC(40.0), RC(0.0) }, 576d27334e2SStefano Zampini {RC(7415.0) / RC(34776.0), RC(9920.0) / RC(30429.0), RC(4845.0) / RC(9016.0), -RC(5827.0) / RC(19320.0), RC(9.0) / RC(40.0)}, 577d27334e2SStefano Zampini }; 578d27334e2SStefano Zampini const PetscReal b[5] = {RC(7415.0) / RC(34776.0), RC(9920.0) / RC(30429.0), RC(4845.0) / RC(9016.0), -RC(5827.0) / RC(19320.0), RC(9.0) / RC(40.0)}; 579d27334e2SStefano Zampini const PetscReal bembed[5] = {RC(23705.0) / RC(104328.0), RC(29720.0) / RC(91287.0), RC(4225.0) / RC(9016.0), -RC(69304987.0) / RC(337732920.0), RC(42843.0) / RC(233080.0)}; 580d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES325SAL, 3, 5, &A[0][0], b, NULL, bembed, 1, b)); 581d27334e2SStefano Zampini } 582d27334e2SStefano Zampini 583d27334e2SStefano Zampini { 584d27334e2SStefano Zampini // DIRK(6,6)[1]A[(7,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 585d27334e2SStefano Zampini const PetscReal A[7][7] = { 586d27334e2SStefano Zampini {RC(0.303487844706747), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 587d27334e2SStefano Zampini {RC(-0.279756492709814), RC(0.500032236020747), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 588d27334e2SStefano Zampini {RC(0.280583215743895), RC(-0.438560061586751), RC(0.217250734515736), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 589d27334e2SStefano Zampini {RC(-0.0677678738539846), RC(0.984312781232293), RC(-0.266720192540149), RC(0.2476680834526), RC(0.0), RC(0.0), RC(0.0) }, 590d27334e2SStefano Zampini {RC(0.125671616147993), RC(-0.995401751002415), RC(0.761333109549059), RC(-0.210281837202208), RC(0.866743712636936), RC(0.0), RC(0.0) }, 591d27334e2SStefano Zampini {RC(-0.368056238801488), RC(-0.999928082701516), RC(0.534734253232519), RC(-0.174856916279082), RC(0.615007160285509), RC(0.696549912132029), RC(0.0) }, 592d27334e2SStefano Zampini {RC(-0.00570546839653984), RC(-0.113110431835656), RC(-0.000965563207671587), RC(-0.000130490084629567), RC(0.00111737736895673), RC(-0.279385587378871), RC(0.618455906845342)} 593d27334e2SStefano Zampini }; 594d27334e2SStefano Zampini const PetscReal b[7] = {RC(0.257561510484877), RC(0.234281287047716), RC(0.126658904241469), RC(0.252363215441784), RC(0.396701083526306), RC(-0.267566000742152), RC(0.0)}; 595d27334e2SStefano Zampini const PetscReal bembed[7] = {RC(0.257561510484945), RC(0.387312822934391), RC(0.126658904241468), RC(0.252363215441784), RC(0.396701083526306), RC(-0.267566000742225), RC(-0.153031535886669)}; 596d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK657A, 6, 7, &A[0][0], b, NULL, bembed, 1, b)); 597d27334e2SStefano Zampini } 598d27334e2SStefano Zampini { 599d27334e2SStefano Zampini // ESDIRK(8,6)[2]SA[(8,4)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 600d27334e2SStefano Zampini const PetscReal A[8][8] = { 601d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 602d27334e2SStefano Zampini {RC(0.333222149217725), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 603d27334e2SStefano Zampini {RC(0.0639743773182214), RC(-0.0830330224410214), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 604d27334e2SStefano Zampini {RC(-0.728522201369326), RC(-0.210414479522485), RC(0.532519916559342), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 605d27334e2SStefano Zampini {RC(-0.175135269272067), RC(0.666675582067552), RC(-0.304400907370867), RC(0.656797712445756), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0) }, 606d27334e2SStefano Zampini {RC(0.222695802705462), RC(-0.0948971794681061), RC(-0.0234336346686545), RC(-0.45385925012042), RC(0.0283910313826958), RC(0.333222149217725), RC(0.0), RC(0.0) }, 607d27334e2SStefano Zampini {RC(-0.132534078051299), RC(0.702597935004879), RC(-0.433316453128078), RC(0.893717488547587), RC(0.057381454791406), RC(-0.207798411552402), RC(0.333222149217725), RC(0.0) }, 608d27334e2SStefano Zampini {RC(0.0802253121418085), RC(0.281196044671022), RC(0.406758926172157), RC(-0.01945708512416), RC(-0.41785600088526), RC(0.0545342658870322), RC(0.281376387919675), RC(0.333222149217725)} 609d27334e2SStefano Zampini }; 610d27334e2SStefano Zampini const PetscReal b[8] = {RC(0.0802253121418085), RC(0.281196044671022), RC(0.406758926172157), RC(-0.01945708512416), RC(-0.41785600088526), RC(0.0545342658870322), RC(0.281376387919675), RC(0.333222149217725)}; 611d27334e2SStefano Zampini const PetscReal bembed[8] = {RC(0.0), RC(0.292331064554014), RC(0.409676102283681), RC(-0.002094718084982), RC(-0.282771520835975), RC(0.113862336644901), RC(0.181973572260693), RC(0.287023163177669)}; 612d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES648SA, 6, 8, &A[0][0], b, NULL, bembed, 1, b)); 613d27334e2SStefano Zampini } 614d27334e2SStefano Zampini { 615d27334e2SStefano Zampini // DIRK(8,6)[1]SAL[(8,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 616d27334e2SStefano Zampini const PetscReal A[8][8] = { 617d27334e2SStefano Zampini {RC(0.477264457385826), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 618d27334e2SStefano Zampini {RC(-0.197052588415002), RC(0.476363428459584), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 619d27334e2SStefano Zampini {RC(-0.0347674430372966), RC(0.633051807335483), RC(0.193634310075028), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 620d27334e2SStefano Zampini {RC(0.0967797668578702), RC(-0.193533526466535), RC(-0.000207622945800473), RC(0.159572204849431), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 621d27334e2SStefano Zampini {RC(0.162527231819875), RC(-0.249672513547382), RC(-0.0459079972041795), RC(0.36579476400859), RC(0.255752838307699), RC(0.0), RC(0.0), RC(0.0) }, 622d27334e2SStefano Zampini {RC(-0.00707603197171262), RC(0.846299854860295), RC(0.344020016925018), RC(-0.0720926054548865), RC(-0.215492331980875), RC(0.104341097622161), RC(0.0), RC(0.0) }, 623d27334e2SStefano Zampini {RC(0.00176857935179744), RC(0.0779960013127515), RC(0.303333277564557), RC(0.213160806732836), RC(0.351769320319038), RC(-0.381545894386538), RC(0.433517909105558), RC(0.0) }, 624d27334e2SStefano Zampini {RC(0.0), RC(0.22732353410559), RC(0.308415837980118), RC(0.157263419573007), RC(0.243551137152275), RC(-0.120953626732831), RC(-0.0802678473399899), RC(0.264667545261832)} 625d27334e2SStefano Zampini }; 626d27334e2SStefano Zampini const PetscReal b[8] = {RC(0.0), RC(0.22732353410559), RC(0.308415837980118), RC(0.157263419573007), RC(0.243551137152275), RC(-0.120953626732831), RC(-0.0802678473399899), RC(0.264667545261832)}; 627d27334e2SStefano Zampini const PetscReal bembed[8] = {RC(0.0), RC(0.22732353410559), RC(0.308415837980118), RC(0.157263419573007), RC(0.243551137152275), RC(-0.103483943222765), RC(-0.0103721771642262), RC(0.177302191576001)}; 628d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK658A, 6, 8, &A[0][0], b, NULL, bembed, 1, b)); 629d27334e2SStefano Zampini } 630d27334e2SStefano Zampini { 631d27334e2SStefano Zampini // SDIRK(9,6)[1]SAL[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 632d27334e2SStefano Zampini const PetscReal A[9][9] = { 633d27334e2SStefano Zampini {RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 634d27334e2SStefano Zampini {RC(-0.0903514856119419), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 635d27334e2SStefano Zampini {RC(0.172952039138937), RC(-0.35365501036282), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 636d27334e2SStefano Zampini {RC(0.511999875919193), RC(0.0289640332201925), RC(-0.0144030945657094), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 637d27334e2SStefano Zampini {RC(0.00465303495506782), RC(-0.075635818766597), RC(0.217273030786712), RC(-0.0206519428725472), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 638d27334e2SStefano Zampini {RC(0.896145501762472), RC(0.139267327700498), RC(-0.186920979752805), RC(0.0672971012371723), RC(-0.350891963442176), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0) }, 639d27334e2SStefano Zampini {RC(0.552959701885751), RC(-0.439360579793662), RC(0.333704002325091), RC(-0.0339426520778416), RC(-0.151947445912595), RC(0.0213825661026943), RC(0.218127781944908), RC(0.0), RC(0.0) }, 640d27334e2SStefano Zampini {RC(0.631360374036476), RC(0.724733619641466), RC(-0.432170625425258), RC(0.598611382182477), RC(-0.709087197034345), RC(-0.483986685696934), RC(0.378391562905131), RC(0.218127781944908), RC(0.0) }, 641d27334e2SStefano Zampini {RC(0.0), RC(-0.15504452530869), RC(0.194518478660789), RC(0.63515640279203), RC(0.81172278664173), RC(0.110736108691585), RC(-0.495304692414479), RC(-0.319912341007872), RC(0.218127781944908)} 642d27334e2SStefano Zampini }; 643d27334e2SStefano Zampini const PetscReal b[9] = {RC(0.0), RC(-0.15504452530869), RC(0.194518478660789), RC(0.63515640279203), RC(0.81172278664173), RC(0.110736108691585), RC(-0.495304692414479), RC(-0.319912341007872), RC(0.218127781944908)}; 644d27334e2SStefano Zampini const PetscReal bembed[9] = {RC(3.62671059311602e-16), RC(0.0736615558278942), RC(0.103527397262229), RC(1.00247481935499), RC(0.361377289250057), RC(-0.785425929961365), RC(-0.0170499047960784), RC(0.296321252214769), RC(-0.0348864791524953)}; 645d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKS659A, 6, 9, &A[0][0], b, NULL, bembed, 1, b)); 646d27334e2SStefano Zampini } 647d27334e2SStefano Zampini { 648d27334e2SStefano Zampini // DIRK(10,7)[1]SAL[(10,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 649d27334e2SStefano Zampini const PetscReal A[10][10] = { 650d27334e2SStefano Zampini {RC(0.233704632125264), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 651d27334e2SStefano Zampini {RC(-0.0739324813149407), RC(0.200056838146104), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 652d27334e2SStefano Zampini {RC(0.0943790344044812), RC(0.264056067701605), RC(0.133245202456465), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 653d27334e2SStefano Zampini {RC(0.269084810601201), RC(-0.503479002548384), RC(-0.00486736469695022), RC(0.251518716213569), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 654d27334e2SStefano Zampini {RC(0.145665801918423), RC(0.204983170463176), RC(0.407154634069484), RC(-0.0121039135200389), RC(0.190243622486334), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 655d27334e2SStefano Zampini {RC(0.985450198547345), RC(0.806942652811456), RC(-0.808130934167263), RC(-0.669035819439391), RC(0.0269384406756128), RC(0.462144080607327), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 656d27334e2SStefano Zampini {RC(0.163902957809563), RC(0.228315094960095), RC(0.0745971021260249), RC(0.000509793400156559), RC(0.0166533681378294), RC(-0.0229383879045797), RC(0.103505486637336), RC(0.0), RC(0.0), RC(0.0) }, 657d27334e2SStefano Zampini {RC(-0.162694156858437), RC(0.0453478837428434), RC(0.997443481211424), RC(0.200251514941093), RC(-0.000161755458839048), RC(-0.0848134335980281), RC(-0.36438666566666), RC(0.158604420136055), RC(0.0), RC(0.0) }, 658d27334e2SStefano Zampini {RC(0.200733156477425), RC(0.239686443444433), RC(0.303837014418929), RC(-0.0534390596279896), RC(0.0314067599640569), RC(-0.00764032790448536), RC(0.0609191260198661), RC(-0.0736319201590642), RC(0.204602530607021), RC(0.0) }, 659d27334e2SStefano Zampini {RC(0.0), RC(0.235563761744267), RC(0.658651488684319), RC(0.0308877804992098), RC(-0.906514945595336), RC(-0.0248488551739974), RC(-0.309967582365257), RC(0.191663316925525), RC(0.923933712199542), RC(0.200631323081727)} 660d27334e2SStefano Zampini }; 661d27334e2SStefano Zampini const PetscReal b[10] = {RC(0.0), RC(0.235563761744267), RC(0.658651488684319), RC(0.0308877804992098), RC(-0.906514945595336), RC(-0.0248488551739974), RC(-0.309967582365257), RC(0.191663316925525), RC(0.923933712199542), RC(0.200631323081727)}; 662d27334e2SStefano Zampini const PetscReal bembed[10] = 663d27334e2SStefano Zampini {RC(0.0), RC(0.222929376486581), RC(0.950668440138169), RC(0.0342694607044032), RC(0.362875840545746), RC(0.223572979288581), RC(-0.764361723526727), RC(0.563476909230026), RC(-0.690896961894185), RC(0.0974656790270323)}; 664d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK7510SAL, 7, 10, &A[0][0], b, NULL, bembed, 1, b)); 665d27334e2SStefano Zampini } 666d27334e2SStefano Zampini { 667d27334e2SStefano Zampini // ESDIRK(10,7)[2]SA[(10,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 668d27334e2SStefano Zampini const PetscReal A[10][10] = { 669d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 670d27334e2SStefano Zampini {RC(0.210055790203419), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 671d27334e2SStefano Zampini {RC(0.255781739921086), RC(0.239850916980976), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 672d27334e2SStefano Zampini {RC(0.286789624880437), RC(0.230494748834778), RC(0.263925149885491), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 673d27334e2SStefano Zampini {RC(-0.0219118128774335), RC(0.897684380345907), RC(-0.657954605498907), RC(0.124962304722633), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 674d27334e2SStefano Zampini {RC(-0.065614879584776), RC(-0.0565630711859497), RC(0.0254881105065311), RC(-0.00368981790650006), RC(-0.0115178258446329), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 675d27334e2SStefano Zampini {RC(0.399860851232098), RC(0.915588469718705), RC(-0.0758429094934412), RC(-0.263369154872759), RC(0.719687583564526), RC(-0.787410407015369), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0) }, 676d27334e2SStefano Zampini {RC(0.51693616104628), RC(1.00000540846973), RC(-0.0485110663289207), RC(-0.315208041581942), RC(0.749742806451587), RC(-0.990975090921248), RC(0.0159279583407308), RC(0.210055790203419), RC(0.0), RC(0.0) }, 677d27334e2SStefano Zampini {RC(-0.0303062129076945), RC(-0.297035174659034), RC(0.184724697462164), RC(-0.0351876079516183), RC(-0.00324668230690761), RC(0.216151004053531), RC(-0.126676252098317), RC(0.114040254365262), RC(0.210055790203419), RC(0.0) }, 678d27334e2SStefano Zampini {RC(0.0705997961586714), RC(-0.0281516061956374), RC(0.314600470734633), RC(-0.0907057557963371), RC(0.168078953957742), RC(-0.00655694984590575), RC(0.0505384497804303), RC(-0.0569572058725042), RC(0.368498056875488), RC(0.210055790203419)} 679d27334e2SStefano Zampini }; 680d27334e2SStefano Zampini const PetscReal b[10] = {RC(0.0705997961586714), RC(-0.0281516061956374), RC(0.314600470734633), RC(-0.0907057557963371), RC(0.168078953957742), 681d27334e2SStefano Zampini RC(-0.00655694984590575), RC(0.0505384497804303), RC(-0.0569572058725042), RC(0.368498056875488), RC(0.210055790203419)}; 682d27334e2SStefano Zampini const PetscReal bembed[10] = {RC(-0.015494246543626), RC(0.167657963820093), RC(0.269858958144236), RC(-0.0443258997755156), RC(0.150049236875266), 683d27334e2SStefano Zampini RC(0.259452082755846), RC(0.244624573502521), RC(-0.215528446920284), RC(0.0487601760292619), RC(0.134945602112201)}; 684d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES7510SA, 7, 10, &A[0][0], b, NULL, bembed, 1, b)); 685d27334e2SStefano Zampini } 686d27334e2SStefano Zampini { 687d27334e2SStefano Zampini // DIRK(9,7)[1]A[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 688d27334e2SStefano Zampini const PetscReal A[9][9] = { 689d27334e2SStefano Zampini {RC(0.179877789855839), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 690d27334e2SStefano Zampini {RC(-0.100405844885157), RC(0.214948590644819), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 691d27334e2SStefano Zampini {RC(0.112251360198995), RC(-0.206162139150298), RC(0.125159642941958), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 692d27334e2SStefano Zampini {RC(-0.0335164000768257), RC(0.999942349946143), RC(-0.491470853833294), RC(0.19820086325566), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 693d27334e2SStefano Zampini {RC(-0.0417345265478321), RC(0.187864510308215), RC(0.0533789224305102), RC(-0.00822060284862916), RC(0.127670843671646), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 694d27334e2SStefano Zampini {RC(-0.0278257925239257), RC(0.600979340683382), RC(-0.242632273241134), RC(-0.11318753652081), RC(0.164326917632931), RC(0.284116597781395), RC(0.0), RC(0.0), RC(0.0) }, 695d27334e2SStefano Zampini {RC(0.041465583858922), RC(0.429657872601836), RC(-0.381323410582524), RC(0.391934277498434), RC(-0.245918275501241), RC(-0.35960669741231), RC(0.184000022289158), RC(0.0), RC(0.0) }, 696d27334e2SStefano Zampini {RC(-0.105565651574538), RC(-0.0557833155018609), RC(0.358967568942643), RC(-0.13489263413921), RC(0.129553247260677), RC(0.0992493795371489), RC(-0.15716610563461), RC(0.17918862279814), RC(0.0) }, 697d27334e2SStefano Zampini {RC(0.00439696079965225), RC(0.960250486570491), RC(0.143558372286706), RC(0.0819015241056593), RC(0.999562318563625), RC(0.325203439314358), RC(-0.679013149331228), RC(-0.990589559837246), RC(0.0773648037639896)} 698d27334e2SStefano Zampini }; 699d27334e2SStefano Zampini 700d27334e2SStefano Zampini const PetscReal b[9] = {RC(0.0), RC(0.179291520437966), RC(0.115310295273026), RC(-0.857943261453138), RC(0.654911318641998), RC(1.18713633508094), RC(-0.0949482361570542), RC(-0.37661430946407), RC(0.19285633764033)}; 701d27334e2SStefano Zampini const PetscReal bembed[9] = {RC(0.0), RC(0.1897135479408), RC(0.127461414808862), RC(-0.835810807663404), RC(0.665114177777166), RC(1.16481046518346), RC(-0.11661858889792), RC(-0.387303251022099), RC(0.192633041873135)}; 702d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK759A, 7, 9, &A[0][0], b, NULL, bembed, 1, b)); 703d27334e2SStefano Zampini } 704d27334e2SStefano Zampini { 705d27334e2SStefano Zampini // SDIRK(11,7)[1]SAL[(11,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 706d27334e2SStefano Zampini const PetscReal A[11][11] = { 707d27334e2SStefano Zampini {RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 708d27334e2SStefano Zampini {RC(-0.082947368165267), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 709d27334e2SStefano Zampini {RC(0.483452690540751), RC(0.0), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 710d27334e2SStefano Zampini {RC(0.771076453481321), RC(-0.22936926341842), RC(0.289733373208823), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 711d27334e2SStefano Zampini {RC(0.0329683054968892), RC(-0.162397421903366), RC(0.000951777538562805), RC(0.0), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 712d27334e2SStefano Zampini {RC(0.265888743485945), RC(0.606743151103931), RC(0.173443800537369), RC(-0.0433968261546912), RC(-0.385211017224481), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 713d27334e2SStefano Zampini {RC(0.220662294551146), RC(-0.0465078507657608), RC(-0.0333111995282464), RC(0.011801580836998), RC(0.169480801030105), RC(-0.0167974432139385), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 714d27334e2SStefano Zampini {RC(0.323099728365267), RC(0.0288371831672575), RC(-0.0543404318773196), RC(0.0137765831431662), RC(0.0516799019060702), RC(-0.0421359763835713), RC(0.181297932037826), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0) }, 715d27334e2SStefano Zampini {RC(-0.164226696476538), RC(0.187552004946792), RC(0.0628674420973025), RC(-0.0108886582703428), RC(-0.0117628641717889), RC(0.0432176880867965), RC(-0.0315206836275473), RC(-0.0846007021638797), RC(0.200252661187742), RC(0.0), RC(0.0) }, 716d27334e2SStefano Zampini {RC(0.651428598623771), RC(-0.10208078475356), RC(0.198305701801888), RC(-0.0117354096673789), RC(-0.0440385966743686), RC(-0.0358364455795087), RC(-0.0075408087654097), RC(0.160320941654639), RC(0.017940248694499), RC(0.200252661187742), RC(0.0) }, 717d27334e2SStefano Zampini {RC(0.0), RC(-0.266259448580236), RC(-0.615982357748271), RC(0.561474126687165), RC(0.266911112787025), RC(0.219775952207137), RC(0.387847665451514), RC(0.612483137773236), RC(0.330027015806089), RC(-0.6965298655714), RC(0.200252661187742)} 718d27334e2SStefano Zampini }; 719d27334e2SStefano Zampini const PetscReal b[11] = 720d27334e2SStefano Zampini {RC(0.0), RC(-0.266259448580236), RC(-0.615982357748271), RC(0.561474126687165), RC(0.266911112787025), RC(0.219775952207137), RC(0.387847665451514), RC(0.612483137773236), RC(0.330027015806089), RC(-0.6965298655714), RC(0.200252661187742)}; 721d27334e2SStefano Zampini const PetscReal bembed[11] = 722d27334e2SStefano Zampini {RC(0.0), RC(0.180185524442613), RC(-0.628869710835338), RC(0.186185675988647), RC(0.0484716652630425), RC(0.203927720607141), RC(0.44041662512573), RC(0.615710527731245), RC(0.0689648839032607), RC(-0.253599870605903), RC(0.138606958379488)}; 723d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKS7511SAL, 7, 11, &A[0][0], b, NULL, bembed, 1, b)); 724d27334e2SStefano Zampini } 725d27334e2SStefano Zampini { 726d27334e2SStefano Zampini // DIRK(13,8)[1]A[(14,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 727d27334e2SStefano Zampini const PetscReal A[14][14] = { 728d27334e2SStefano Zampini {RC(0.421050745442291), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 729d27334e2SStefano Zampini {RC(-0.0761079419591268), RC(0.264353986580857), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 730d27334e2SStefano Zampini {RC(0.0727106904170694), RC(-0.204265976977285), RC(0.181608196544136), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 731d27334e2SStefano Zampini {RC(0.55763054816611), RC(-0.409773579543499), RC(0.510926516886944), RC(0.259892204518476), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 732d27334e2SStefano Zampini {RC(0.0228083864844437), RC(-0.445569051836454), RC(-0.0915242778636248), RC(0.00450055909321655), RC(0.6397807199983), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 733d27334e2SStefano Zampini {RC(-0.135945849505152), RC(0.0946509646963754), RC(-0.236110197279175), RC(0.00318944206456517), RC(0.255453021028118), RC(0.174805219173446), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 734d27334e2SStefano Zampini {RC(-0.147960260670772), RC(-0.402188192230535), RC(-0.703014530043888), RC(0.00941974677418186), RC(0.885747111289207), RC(0.261314066449028), RC(0.16307697503668), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 735d27334e2SStefano Zampini {RC(0.165597241042244), RC(0.824182962188923), RC(-0.0280136160783609), RC(0.282372386631758), RC(-0.957721354131182), RC(0.489439550159977), RC(0.170094415598103), RC(0.0522519785718563), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 736d27334e2SStefano Zampini {RC(0.0335292011495618), RC(0.575750388029166), RC(0.223289855356637), RC(-0.00317458833242804), RC(-0.112890382135193), RC(-0.419809267954284), RC(0.0466136902102104), RC(-0.00115413813041085), RC(0.109685363692383), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 737d27334e2SStefano Zampini {RC(-0.0512616878252355), RC(0.699261265830807), RC(-0.117939611738769), RC(0.0021745241931243), RC(-0.00932826702640947), RC(-0.267575057469428), RC(0.126949139814065), RC(0.00330353204502163), RC(0.185949445053766), RC(0.0938215615963721), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 738d27334e2SStefano Zampini {RC(-0.106521517960343), RC(0.41835889096168), RC(0.353585905881916), RC(-0.0746474161579599), RC(-0.015450626460289), RC(-0.46224659192275), RC(-0.0576406327329181), RC(-0.00712066942504018), RC(0.377776558014452), RC(0.36890054338294), RC(0.0618488746331837), RC(0.0), RC(0.0), RC(0.0) }, 739d27334e2SStefano Zampini {RC(-0.163079104890997), RC(0.644561721693806), RC(0.636968661639572), RC(-0.122346720085377), RC(-0.333062564990312), RC(-0.3054226490478), RC(-0.357820712828352), RC(-0.0125510510334706), RC(0.371263681186311), RC(0.371979640363694), RC(0.0531090658708968), RC(0.0518279459132049), RC(0.0), RC(0.0) }, 740d27334e2SStefano Zampini {RC(0.579993784455521), RC(-0.188833728676494), RC(0.999975696843775), RC(0.0572810855901161), RC(-0.264374735003671), RC(0.165091739976854), RC(-0.546675809010452), RC(-0.0283821822291982), RC(-0.102639860418374), RC(-0.0343251040446405), RC(0.4762598462591), RC(-0.304153104931261), RC(0.0953911855943621), RC(0.0) }, 741d27334e2SStefano Zampini {RC(0.0848552694007844), RC(0.287193912340074), RC(0.543683503004232), RC(-0.081311059300692), RC(-0.0328661289388557), RC(-0.323456834372922), RC(-0.240378871658975), RC(-0.0189913019930369), RC(0.220663114082036), RC(0.253029984360864), RC(0.252011799370563), RC(-0.154882222605423), RC(0.0315202264687415), RC(0.0514095812104714)} 742d27334e2SStefano Zampini }; 743d27334e2SStefano Zampini const PetscReal b[14] = {RC(0.0), RC(0.516650324205117), RC(0.0773227217357826), RC(-0.12474204666975), RC(-0.0241052115180679), RC(-0.325821145180359), RC(0.0907237460123951), RC(0.0459271880596652), RC(0.221012259404702), RC(0.235510906761942), RC(0.491109674204385), RC(-0.323506525837343), RC(0.119918108821531), RC(0.0)}; 744d27334e2SStefano Zampini const PetscReal bembed[14] = {RC(2.32345691433618e-16), RC(0.499150900944401), RC(0.080991997189243), RC(-0.0359440417166322), RC(-0.0258910397441454), RC(-0.304540350278636), RC(0.0836627473632563), 745d27334e2SStefano Zampini RC(0.0417664613347638), RC(0.223636394275293), RC(0.231569156867596), RC(0.240526201277663), RC(-0.222933582911926), RC(-0.0111479879597561), RC(0.19915314335888)}; 746d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK8614A, 8, 14, &A[0][0], b, NULL, bembed, 1, b)); 747d27334e2SStefano Zampini } 748d27334e2SStefano Zampini { 749d27334e2SStefano Zampini // DIRK(15,8)[1]SAL[(16,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 750d27334e2SStefano Zampini const PetscReal A[16][16] = { 751d27334e2SStefano Zampini {RC(0.498904981271193), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 752d27334e2SStefano Zampini {RC(-0.303806037341816), RC(0.886299445992379), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 753d27334e2SStefano Zampini {RC(-0.581440223471476), RC(0.371003719460259), RC(0.43844717752802), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 754d27334e2SStefano Zampini {RC(0.531852638870051), RC(-0.339363014907108), RC(0.422373239795441), RC(0.223854203543397), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 755d27334e2SStefano Zampini {RC(0.118517891868867), RC(-0.0756235584174296), RC(-0.0864284870668712), RC(0.000536692838658312), RC(0.10101418329932), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 756d27334e2SStefano Zampini {RC(0.218733626116401), RC(-0.139568928299635), RC(0.30473612813488), RC(0.00354038623073564), RC(0.0932085751160559), RC(0.140161806097591), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 757d27334e2SStefano Zampini {RC(0.0692944686081835), RC(-0.0442152168939502), RC(-0.0903375348855603), RC(0.00259030241156141), RC(0.204514233679515), RC(-0.0245383758960002), RC(0.199289437094059), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 758d27334e2SStefano Zampini {RC(0.990640016505571), RC(-0.632104756315967), RC(0.856971425234221), RC(0.174494099232246), RC(-0.113715829680145), RC(-0.151494045307366), RC(-0.438268629569005), RC(0.120578398912139), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 759d27334e2SStefano Zampini {RC(-0.099415677713136), RC(0.211832014309207), RC(-0.245998265866888), RC(-0.182249672235861), RC(0.167897635713799), RC(0.212850335030069), RC(-0.391739299440123), RC(-0.0118718506876767), RC(0.526293701659093), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 760d27334e2SStefano Zampini {RC(0.383983914845461), RC(-0.245011361219604), RC(0.46717278554955), RC(-0.0361272447593202), RC(0.0742234660511333), RC(-0.0474816271948766), RC(-0.229859978525756), RC(0.0516283729206322), RC(0.0), RC(0.193823890777594), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 761d27334e2SStefano Zampini {RC(0.0967855003180134), RC(-0.0481037037916184), RC(0.191268138832434), RC(0.234977164564126), RC(0.0620265921753097), RC(0.403432826534738), RC(0.152403846687238), RC(-0.118420429237746), RC(0.0582141598685892), RC(-0.13924540906863), RC(0.106661313117545), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 762d27334e2SStefano Zampini {RC(0.133941307432055), RC(-0.0722076602896254), RC(0.217086297689275), RC(0.00495499602192887), RC(0.0306090174933995), RC(0.26483526755746), RC(0.204442440745605), RC(0.196883395136708), RC(0.056527012583996), RC(-0.150216381356784), RC(-0.217209415757333), RC(0.330353722743315), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 763d27334e2SStefano Zampini {RC(0.157014274561299), RC(-0.0883810256381874), RC(0.117193033885034), RC(-0.0362304243769466), RC(0.0169030211466111), RC(-0.169835753576141), RC(0.399749979234113), RC(0.31806704093008), RC(0.050340008347693), RC(0.120284837472214), RC(-0.235313193645423), RC(0.232488522208926), RC(0.117719679450729), RC(0.0), RC(0.0), RC(0.0) }, 764d27334e2SStefano Zampini {RC(0.00276453816875833), RC(-0.00366028255231782), RC(-0.331078914515559), RC(0.623377549031949), RC(0.167618142989491), RC(0.0748467945312516), RC(0.797629286699677), RC(-0.390714256799583), RC(-0.00808553925131555), RC(0.014840324980952), RC(-0.0856180410248133), RC(0.602943304937827), RC(-0.5771359338496), RC(0.112273026653282), RC(0.0), RC(0.0) }, 765d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.085283971980307), RC(0.51334393454179), RC(0.144355978013514), RC(0.255379109487853), RC(0.225075750790524), RC(-0.343241323394982), RC(0.0), RC(0.0798250392218852), RC(0.0528824734082655), RC(-0.0830350888900362), RC(0.022567388707279), RC(-0.0592631119040204), RC(0.106825878037621), RC(0.0) }, 766d27334e2SStefano Zampini {RC(0.173784481207652), RC(-0.110887906116241), RC(0.190052513365204), RC(-0.0688345422674029), RC(0.10326505079603), RC(0.267127097115219), RC(0.141703423176897), RC(0.0117966866651728), RC(-6.65650091812762e-15), RC(-0.0213725083662519), RC(-0.00931148598712566), RC(-0.10007679077114), RC(0.123471797451553), RC(0.00203684241073055), RC(-0.0294320891781173), RC(0.195746619921528)} 767d27334e2SStefano Zampini }; 768d27334e2SStefano Zampini const PetscReal b[16] = {RC(0.0), RC(0.0), RC(0.085283971980307), RC(0.51334393454179), RC(0.144355978013514), RC(0.255379109487853), RC(0.225075750790524), RC(-0.343241323394982), RC(0.0), RC(0.0798250392218852), RC(0.0528824734082655), RC(-0.0830350888900362), RC(0.022567388707279), RC(-0.0592631119040204), RC(0.106825878037621), RC(0.0)}; 769d27334e2SStefano Zampini const PetscReal bembed[16] = {RC(-1.31988512519898e-15), RC(7.53606601764004e-16), RC(0.0886789133915965), RC(0.0968726531622137), RC(0.143815375874267), RC(0.335214773313601), RC(0.221862366978063), RC(-0.147408947987273), 770d27334e2SStefano Zampini RC(4.16297599203445e-16), RC(0.000727276166520566), RC(-0.00284892677941246), RC(0.00512492274297611), RC(-0.000275595071215218), RC(0.0136014719350733), RC(0.0165190013607726), RC(0.228116714912817)}; 771d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK8616SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b)); 772d27334e2SStefano Zampini } 773d27334e2SStefano Zampini { 774d27334e2SStefano Zampini // ESDIRK(16,8)[2]SAL[(16,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 775d27334e2SStefano Zampini const PetscReal A[16][16] = { 776d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 777d27334e2SStefano Zampini {RC(0.117318819358521), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 778d27334e2SStefano Zampini {RC(0.0557014605974616), RC(0.385525646638742), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 779d27334e2SStefano Zampini {RC(0.063493276428895), RC(0.373556126263681), RC(0.0082994166438953), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 780d27334e2SStefano Zampini {RC(0.0961351856230088), RC(0.335558324517178), RC(0.207077765910132), RC(-0.0581917140797146), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 781d27334e2SStefano Zampini {RC(0.0497669214238319), RC(0.384288616546039), RC(0.0821728117583936), RC(0.120337007107103), RC(0.202262782645888), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 782d27334e2SStefano Zampini {RC(0.00626710666809847), RC(0.496491452640725), RC(-0.111303249827358), RC(0.170478821683603), RC(0.166517073971103), RC(-0.0328669811542241), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 783d27334e2SStefano Zampini {RC(0.0463439767281591), RC(0.00306724391019652), RC(-0.00816305222386205), RC(-0.0353302599538294), RC(0.0139313601702569), RC(-0.00992014507967429), RC(0.0210087909090165), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 784d27334e2SStefano Zampini {RC(0.111574049232048), RC(0.467639166482209), RC(0.237773114804619), RC(0.0798895699267508), RC(0.109580615914593), RC(0.0307353103825936), RC(-0.0404391509541147), RC(-0.16942110744293), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 785d27334e2SStefano Zampini {RC(-0.0107072484863877), RC(-0.231376703354252), RC(0.017541113036611), RC(0.144871527682418), RC(-0.041855459769806), RC(0.0841832168332261), RC(-0.0850020937282192), RC(0.486170343825899), RC(-0.0526717116822739), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 786d27334e2SStefano Zampini {RC(-0.0142238262314935), RC(0.14752923682514), RC(0.238235830732566), RC(0.037950291904103), RC(0.252075123381518), RC(0.0474266904224567), RC(-0.00363139069342027), RC(0.274081442388563), RC(-0.0599166970745255), RC(-0.0527138812389185), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 787d27334e2SStefano Zampini {RC(-0.11837020183211), RC(-0.635712481821264), RC(0.239738832602538), RC(0.330058936651707), RC(-0.325784087988237), RC(-0.0506514314589253), RC(-0.281914404487009), RC(0.852596345144291), RC(0.651444614298805), RC(-0.103476387303591), RC(-0.354835880209975), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 788d27334e2SStefano Zampini {RC(-0.00458164025442349), RC(0.296219694015248), RC(0.322146049419995), RC(0.15917778285238), RC(0.284864871688843), RC(0.185509526463076), RC(-0.0784621067883274), RC(0.166312223692047), RC(-0.284152486083397), RC(-0.357125104338944), RC(0.078437074055306), RC(0.0884129667114481), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0) }, 789d27334e2SStefano Zampini {RC(-0.0545561913848106), RC(0.675785423442753), RC(0.423066443201941), RC(-0.000165300126841193), RC(0.104252994793763), RC(-0.105763019303021), RC(-0.15988308809318), RC(0.0515050001032011), RC(0.56013979290924), RC(-0.45781539708603), RC(-0.255870699752664), RC(0.026960254296416), RC(-0.0721245985053681), RC(0.117318819358521), RC(0.0), RC(0.0) }, 790d27334e2SStefano Zampini {RC(0.0649253995775223), RC(-0.0216056457922249), RC(-0.073738139377975), RC(0.0931033310077225), RC(-0.0194339577299149), RC(-0.0879623837313009), RC(0.057125517179467), RC(0.205120850488097), RC(0.132576503537441), RC(0.489416890627328), RC(-0.1106765720501), RC(-0.081038793996096), RC(0.0606031613503788), RC(-0.00241467937442272), RC(0.117318819358521), RC(0.0) }, 791d27334e2SStefano Zampini {RC(0.0459979286336779), RC(0.0780075394482806), RC(0.015021874148058), RC(0.195180277284195), RC(-0.00246643310153235), RC(0.0473977117068314), RC(-0.0682773558610363), RC(0.19568019123878), RC(-0.0876765449323747), RC(0.177874852409192), RC(-0.337519251582222), RC(-0.0123255553640736), RC(0.311573291192553), RC(0.0458604327754991), RC(0.278352222645651), RC(0.117318819358521)} 792d27334e2SStefano Zampini }; 793d27334e2SStefano Zampini const PetscReal b[16] = {RC(0.0459979286336779), RC(0.0780075394482806), RC(0.015021874148058), RC(0.195180277284195), RC(-0.00246643310153235), RC(0.0473977117068314), RC(-0.0682773558610363), RC(0.19568019123878), 794d27334e2SStefano Zampini RC(-0.0876765449323747), RC(0.177874852409192), RC(-0.337519251582222), RC(-0.0123255553640736), RC(0.311573291192553), RC(0.0458604327754991), RC(0.278352222645651), RC(0.117318819358521)}; 795d27334e2SStefano Zampini const PetscReal bembed[16] = {RC(0.0603373529853206), RC(0.175453809423998), RC(0.0537707777611352), RC(0.195309248607308), RC(0.0135893741970232), RC(-0.0221160259296707), RC(-0.00726526156430691), RC(0.102961059369124), 796d27334e2SStefano Zampini RC(0.000900215457460583), RC(0.0547959465692338), RC(-0.334995726863153), RC(0.0464409662093384), RC(0.301388101652194), RC(0.00524851570622031), RC(0.229538601845236), RC(0.124643044573514)}; 797d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES8516SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b)); 798d27334e2SStefano Zampini } 799d27334e2SStefano Zampini 800d27334e2SStefano Zampini /* Additive methods */ 801d27334e2SStefano Zampini { 802d27334e2SStefano Zampini const PetscReal A[3][3] = { 803e817cc15SEmil Constantinescu {0.0, 0.0, 0.0}, 8049371c9d4SSatish Balay {0.0, 0.0, 0.0}, 8059371c9d4SSatish Balay {0.0, 0.5, 0.0} 806d27334e2SStefano Zampini }; 807d27334e2SStefano Zampini const PetscReal At[3][3] = { 808d27334e2SStefano Zampini {1.0, 0.0, 0.0}, 809d27334e2SStefano Zampini {0.0, 0.5, 0.0}, 810d27334e2SStefano Zampini {0.0, 0.5, 0.5} 811d27334e2SStefano Zampini }; 812d27334e2SStefano Zampini const PetscReal b[3] = {0.0, 0.5, 0.5}; 813d27334e2SStefano Zampini const PetscReal bembedt[3] = {1.0, 0.0, 0.0}; 8149566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX1BEE, 2, 3, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL)); 815e817cc15SEmil Constantinescu } 8168a381b04SJed Brown { 817d27334e2SStefano Zampini const PetscReal A[2][2] = { 8189371c9d4SSatish Balay {0.0, 0.0}, 8199371c9d4SSatish Balay {0.5, 0.0} 820d27334e2SStefano Zampini }; 821d27334e2SStefano Zampini const PetscReal At[2][2] = { 822d27334e2SStefano Zampini {0.0, 0.0}, 823d27334e2SStefano Zampini {0.0, 0.5} 824d27334e2SStefano Zampini }; 825d27334e2SStefano Zampini const PetscReal b[2] = {0.0, 1.0}; 826d27334e2SStefano Zampini const PetscReal bembedt[2] = {0.5, 0.5}; 8271f80e275SEmil Constantinescu /* binterpt[2][2] = {{1.0,-1.0},{0.0,1.0}}; second order dense output has poor stability properties and hence it is not currently in use */ 8289566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXARS122, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL)); 8291f80e275SEmil Constantinescu } 8301f80e275SEmil Constantinescu { 831d27334e2SStefano Zampini const PetscReal A[2][2] = { 8329371c9d4SSatish Balay {0.0, 0.0}, 8339371c9d4SSatish Balay {1.0, 0.0} 834d27334e2SStefano Zampini }; 835d27334e2SStefano Zampini const PetscReal At[2][2] = { 836d27334e2SStefano Zampini {0.0, 0.0}, 837d27334e2SStefano Zampini {0.5, 0.5} 838d27334e2SStefano Zampini }; 839d27334e2SStefano Zampini const PetscReal b[2] = {0.5, 0.5}; 840d27334e2SStefano Zampini const PetscReal bembedt[2] = {0.0, 1.0}; 8411f80e275SEmil Constantinescu /* binterpt[2][2] = {{1.0,-0.5},{0.0,0.5}} second order dense output has poor stability properties and hence it is not currently in use */ 8429566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXA2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL)); 8431f80e275SEmil Constantinescu } 8441f80e275SEmil Constantinescu { 845d27334e2SStefano Zampini const PetscReal A[2][2] = { 8469371c9d4SSatish Balay {0.0, 0.0}, 8479371c9d4SSatish Balay {1.0, 0.0} 848d27334e2SStefano Zampini }; 849d27334e2SStefano Zampini const PetscReal At[2][2] = { 850d27334e2SStefano Zampini {us2, 0.0}, 851d27334e2SStefano Zampini {1.0 - 2.0 * us2, us2} 852d27334e2SStefano Zampini }; 853d27334e2SStefano Zampini const PetscReal b[2] = {0.5, 0.5}; 854d27334e2SStefano Zampini const PetscReal bembedt[2] = {0.0, 1.0}; 855d27334e2SStefano Zampini const PetscReal binterpt[2][2] = { 856d27334e2SStefano Zampini {(us2 - 1.0) / (2.0 * us2 - 1.0), -1 / (2.0 * (1.0 - 2.0 * us2))}, 857d27334e2SStefano Zampini {1 - (us2 - 1.0) / (2.0 * us2 - 1.0), -1 / (2.0 * (1.0 - 2.0 * us2))} 858d27334e2SStefano Zampini }; 859d27334e2SStefano Zampini const PetscReal binterp[2][2] = { 860d27334e2SStefano Zampini {1.0, -0.5}, 861d27334e2SStefano Zampini {0.0, 0.5 } 862d27334e2SStefano Zampini }; 8639566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXL2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 2, binterpt[0], binterp[0])); 8641f80e275SEmil Constantinescu } 8651f80e275SEmil Constantinescu { 866d27334e2SStefano Zampini const PetscReal A[3][3] = { 8679371c9d4SSatish Balay {0, 0, 0}, 868d27334e2SStefano Zampini {2 - s2, 0, 0}, 8699371c9d4SSatish Balay {0.5, 0.5, 0} 870d27334e2SStefano Zampini }; 871d27334e2SStefano Zampini const PetscReal At[3][3] = { 872d27334e2SStefano Zampini {0, 0, 0 }, 873d27334e2SStefano Zampini {1 - 1 / s2, 1 - 1 / s2, 0 }, 874d27334e2SStefano Zampini {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2} 875d27334e2SStefano Zampini }; 876d27334e2SStefano Zampini const PetscReal bembedt[3] = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)}; 877d27334e2SStefano Zampini const PetscReal binterpt[3][2] = { 878d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 879d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 880d27334e2SStefano Zampini {1.0 - s2, 1.0 / s2 } 881d27334e2SStefano Zampini }; 8829566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX2C, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 8831f80e275SEmil Constantinescu } 8841f80e275SEmil Constantinescu { 885d27334e2SStefano Zampini const PetscReal A[3][3] = { 8869371c9d4SSatish Balay {0, 0, 0}, 887d27334e2SStefano Zampini {2 - s2, 0, 0}, 8889371c9d4SSatish Balay {0.75, 0.25, 0} 889d27334e2SStefano Zampini }; 890d27334e2SStefano Zampini const PetscReal At[3][3] = { 891d27334e2SStefano Zampini {0, 0, 0 }, 892d27334e2SStefano Zampini {1 - 1 / s2, 1 - 1 / s2, 0 }, 893d27334e2SStefano Zampini {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2} 894d27334e2SStefano Zampini }; 895d27334e2SStefano Zampini const PetscReal bembedt[3] = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)}; 896d27334e2SStefano Zampini const PetscReal binterpt[3][2] = { 897d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 898d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 899d27334e2SStefano Zampini {1.0 - s2, 1.0 / s2 } 900d27334e2SStefano Zampini }; 9019566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX2D, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 9028a381b04SJed Brown } 90306db7b1cSJed Brown { /* Optimal for linear implicit part */ 904d27334e2SStefano Zampini const PetscReal A[3][3] = { 9059371c9d4SSatish Balay {0, 0, 0}, 906d27334e2SStefano Zampini {2 - s2, 0, 0}, 907d27334e2SStefano Zampini {(3 - 2 * s2) / 6, (3 + 2 * s2) / 6, 0} 908d27334e2SStefano Zampini }; 909d27334e2SStefano Zampini const PetscReal At[3][3] = { 910d27334e2SStefano Zampini {0, 0, 0 }, 911d27334e2SStefano Zampini {1 - 1 / s2, 1 - 1 / s2, 0 }, 912d27334e2SStefano Zampini {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2} 913d27334e2SStefano Zampini }; 914d27334e2SStefano Zampini const PetscReal bembedt[3] = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)}; 915d27334e2SStefano Zampini const PetscReal binterpt[3][2] = { 916d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 917d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 918d27334e2SStefano Zampini {1.0 - s2, 1.0 / s2 } 919d27334e2SStefano Zampini }; 9209566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX2E, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 921a3a57f36SJed Brown } 9226cf0794eSJed Brown { /* Optimal for linear implicit part */ 923d27334e2SStefano Zampini const PetscReal A[3][3] = { 9249371c9d4SSatish Balay {0, 0, 0}, 9256cf0794eSJed Brown {0.5, 0, 0}, 9269371c9d4SSatish Balay {0.5, 0.5, 0} 927d27334e2SStefano Zampini }; 928d27334e2SStefano Zampini const PetscReal At[3][3] = { 929d27334e2SStefano Zampini {0.25, 0, 0 }, 930d27334e2SStefano Zampini {0, 0.25, 0 }, 931d27334e2SStefano Zampini {1. / 3, 1. / 3, 1. / 3} 932d27334e2SStefano Zampini }; 9339566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXPRSSP2, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL)); 9346cf0794eSJed Brown } 935a3a57f36SJed Brown { 936d27334e2SStefano Zampini const PetscReal A[4][4] = { 9379371c9d4SSatish Balay {0, 0, 0, 0}, 9384040e9f2SJed Brown {1767732205903. / 2027836641118., 0, 0, 0}, 9394040e9f2SJed Brown {5535828885825. / 10492691773637., 788022342437. / 10882634858940., 0, 0}, 9409371c9d4SSatish Balay {6485989280629. / 16251701735622., -4246266847089. / 9704473918619., 10755448449292. / 10357097424841., 0} 941d27334e2SStefano Zampini }; 942d27334e2SStefano Zampini const PetscReal At[4][4] = { 943d27334e2SStefano Zampini {0, 0, 0, 0 }, 944d27334e2SStefano Zampini {1767732205903. / 4055673282236., 1767732205903. / 4055673282236., 0, 0 }, 945d27334e2SStefano Zampini {2746238789719. / 10658868560708., -640167445237. / 6845629431997., 1767732205903. / 4055673282236., 0 }, 946d27334e2SStefano Zampini {1471266399579. / 7840856788654., -4482444167858. / 7529755066697., 11266239266428. / 11593286722821., 1767732205903. / 4055673282236.} 947d27334e2SStefano Zampini }; 948d27334e2SStefano Zampini const PetscReal bembedt[4] = {2756255671327. / 12835298489170., -10771552573575. / 22201958757719., 9247589265047. / 10645013368117., 2193209047091. / 5459859503100.}; 949d27334e2SStefano Zampini const PetscReal binterpt[4][2] = { 950d27334e2SStefano Zampini {4655552711362. / 22874653954995., -215264564351. / 13552729205753. }, 951d27334e2SStefano Zampini {-18682724506714. / 9892148508045., 17870216137069. / 13817060693119. }, 952d27334e2SStefano Zampini {34259539580243. / 13192909600954., -28141676662227. / 17317692491321.}, 953d27334e2SStefano Zampini {584795268549. / 6622622206610., 2508943948391. / 7218656332882. } 954d27334e2SStefano Zampini }; 9559566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX3, 3, 4, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 956a3a57f36SJed Brown } 957a3a57f36SJed Brown { 958d27334e2SStefano Zampini const PetscReal A[5][5] = { 9599371c9d4SSatish Balay {0, 0, 0, 0, 0}, 9606cf0794eSJed Brown {1. / 2, 0, 0, 0, 0}, 9616cf0794eSJed Brown {11. / 18, 1. / 18, 0, 0, 0}, 9626cf0794eSJed Brown {5. / 6, -5. / 6, .5, 0, 0}, 9639371c9d4SSatish Balay {1. / 4, 7. / 4, 3. / 4, -7. / 4, 0} 964d27334e2SStefano Zampini }; 965d27334e2SStefano Zampini const PetscReal At[5][5] = { 966d27334e2SStefano Zampini {0, 0, 0, 0, 0 }, 967d27334e2SStefano Zampini {0, 1. / 2, 0, 0, 0 }, 968d27334e2SStefano Zampini {0, 1. / 6, 1. / 2, 0, 0 }, 969d27334e2SStefano Zampini {0, -1. / 2, 1. / 2, 1. / 2, 0 }, 970d27334e2SStefano Zampini {0, 3. / 2, -3. / 2, 1. / 2, 1. / 2} 971d27334e2SStefano Zampini }; 972d27334e2SStefano Zampini PetscCall(TSARKIMEXRegister(TSARKIMEXARS443, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL)); 9736cf0794eSJed Brown } 9746cf0794eSJed Brown { 975d27334e2SStefano Zampini const PetscReal A[5][5] = { 9769371c9d4SSatish Balay {0, 0, 0, 0, 0}, 9776cf0794eSJed Brown {1, 0, 0, 0, 0}, 9786cf0794eSJed Brown {4. / 9, 2. / 9, 0, 0, 0}, 9796cf0794eSJed Brown {1. / 4, 0, 3. / 4, 0, 0}, 9809371c9d4SSatish Balay {1. / 4, 0, 3. / 5, 0, 0} 981d27334e2SStefano Zampini }; 982d27334e2SStefano Zampini const PetscReal At[5][5] = { 983d27334e2SStefano Zampini {0, 0, 0, 0, 0 }, 984d27334e2SStefano Zampini {.5, .5, 0, 0, 0 }, 985d27334e2SStefano Zampini {5. / 18, -1. / 9, .5, 0, 0 }, 986d27334e2SStefano Zampini {.5, 0, 0, .5, 0 }, 987d27334e2SStefano Zampini {.25, 0, .75, -.5, .5} 988d27334e2SStefano Zampini }; 989d27334e2SStefano Zampini PetscCall(TSARKIMEXRegister(TSARKIMEXBPR3, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL)); 9906cf0794eSJed Brown } 9916cf0794eSJed Brown { 992d27334e2SStefano Zampini const PetscReal A[6][6] = { 9939371c9d4SSatish Balay {0, 0, 0, 0, 0, 0}, 994a3a57f36SJed Brown {1. / 2, 0, 0, 0, 0, 0}, 9954040e9f2SJed Brown {13861. / 62500., 6889. / 62500., 0, 0, 0, 0}, 9964040e9f2SJed Brown {-116923316275. / 2393684061468., -2731218467317. / 15368042101831., 9408046702089. / 11113171139209., 0, 0, 0}, 9974040e9f2SJed Brown {-451086348788. / 2902428689909., -2682348792572. / 7519795681897., 12662868775082. / 11960479115383., 3355817975965. / 11060851509271., 0, 0}, 9989371c9d4SSatish Balay {647845179188. / 3216320057751., 73281519250. / 8382639484533., 552539513391. / 3454668386233., 3354512671639. / 8306763924573., 4040. / 17871., 0} 999d27334e2SStefano Zampini }; 1000d27334e2SStefano Zampini const PetscReal At[6][6] = { 1001d27334e2SStefano Zampini {0, 0, 0, 0, 0, 0 }, 1002d27334e2SStefano Zampini {1. / 4, 1. / 4, 0, 0, 0, 0 }, 1003d27334e2SStefano Zampini {8611. / 62500., -1743. / 31250., 1. / 4, 0, 0, 0 }, 1004d27334e2SStefano Zampini {5012029. / 34652500., -654441. / 2922500., 174375. / 388108., 1. / 4, 0, 0 }, 1005d27334e2SStefano Zampini {15267082809. / 155376265600., -71443401. / 120774400., 730878875. / 902184768., 2285395. / 8070912., 1. / 4, 0 }, 1006d27334e2SStefano Zampini {82889. / 524892., 0, 15625. / 83664., 69875. / 102672., -2260. / 8211, 1. / 4} 1007d27334e2SStefano Zampini }; 1008d27334e2SStefano Zampini const PetscReal bembedt[6] = {4586570599. / 29645900160., 0, 178811875. / 945068544., 814220225. / 1159782912., -3700637. / 11593932., 61727. / 225920.}; 1009d27334e2SStefano Zampini const PetscReal binterpt[6][3] = { 1010d27334e2SStefano Zampini {6943876665148. / 7220017795957., -54480133. / 30881146., 6818779379841. / 7100303317025. }, 1011d27334e2SStefano Zampini {0, 0, 0 }, 1012d27334e2SStefano Zampini {7640104374378. / 9702883013639., -11436875. / 14766696., 2173542590792. / 12501825683035. }, 1013d27334e2SStefano Zampini {-20649996744609. / 7521556579894., 174696575. / 18121608., -31592104683404. / 5083833661969.}, 1014d27334e2SStefano Zampini {8854892464581. / 2390941311638., -12120380. / 966161., 61146701046299. / 7138195549469. }, 1015d27334e2SStefano Zampini {-11397109935349. / 6675773540249., 3843. / 706., -17219254887155. / 4939391667607.} 1016d27334e2SStefano Zampini }; 10179566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX4, 4, 6, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL)); 1018a3a57f36SJed Brown } 1019a3a57f36SJed Brown { 1020d27334e2SStefano Zampini const PetscReal A[8][8] = { 10219371c9d4SSatish Balay {0, 0, 0, 0, 0, 0, 0, 0}, 1022a3a57f36SJed Brown {41. / 100, 0, 0, 0, 0, 0, 0, 0}, 10234040e9f2SJed Brown {367902744464. / 2072280473677., 677623207551. / 8224143866563., 0, 0, 0, 0, 0, 0}, 10244040e9f2SJed Brown {1268023523408. / 10340822734521., 0, 1029933939417. / 13636558850479., 0, 0, 0, 0, 0}, 10254040e9f2SJed Brown {14463281900351. / 6315353703477., 0, 66114435211212. / 5879490589093., -54053170152839. / 4284798021562., 0, 0, 0, 0}, 10264040e9f2SJed Brown {14090043504691. / 34967701212078., 0, 15191511035443. / 11219624916014., -18461159152457. / 12425892160975., -281667163811. / 9011619295870., 0, 0, 0}, 10274040e9f2SJed Brown {19230459214898. / 13134317526959., 0, 21275331358303. / 2942455364971., -38145345988419. / 4862620318723., -1. / 8, -1. / 8, 0, 0}, 10289371c9d4SSatish Balay {-19977161125411. / 11928030595625., 0, -40795976796054. / 6384907823539., 177454434618887. / 12078138498510., 782672205425. / 8267701900261., -69563011059811. / 9646580694205., 7356628210526. / 4942186776405., 0} 1029d27334e2SStefano Zampini }; 1030d27334e2SStefano Zampini const PetscReal At[8][8] = { 1031d27334e2SStefano Zampini {0, 0, 0, 0, 0, 0, 0, 0 }, 1032d27334e2SStefano Zampini {41. / 200., 41. / 200., 0, 0, 0, 0, 0, 0 }, 1033d27334e2SStefano Zampini {41. / 400., -567603406766. / 11931857230679., 41. / 200., 0, 0, 0, 0, 0 }, 1034d27334e2SStefano Zampini {683785636431. / 9252920307686., 0, -110385047103. / 1367015193373., 41. / 200., 0, 0, 0, 0 }, 1035d27334e2SStefano Zampini {3016520224154. / 10081342136671., 0, 30586259806659. / 12414158314087., -22760509404356. / 11113319521817., 41. / 200., 0, 0, 0 }, 1036d27334e2SStefano Zampini {218866479029. / 1489978393911., 0, 638256894668. / 5436446318841., -1179710474555. / 5321154724896., -60928119172. / 8023461067671., 41. / 200., 0, 0 }, 1037d27334e2SStefano Zampini {1020004230633. / 5715676835656., 0, 25762820946817. / 25263940353407., -2161375909145. / 9755907335909., -211217309593. / 5846859502534., -4269925059573. / 7827059040749., 41. / 200, 0 }, 1038d27334e2SStefano Zampini {-872700587467. / 9133579230613., 0, 0, 22348218063261. / 9555858737531., -1143369518992. / 8141816002931., -39379526789629. / 19018526304540., 32727382324388. / 42900044865799., 41. / 200.} 1039d27334e2SStefano Zampini }; 1040d27334e2SStefano Zampini const PetscReal bembedt[8] = {-975461918565. / 9796059967033., 0, 0, 78070527104295. / 32432590147079., -548382580838. / 3424219808633., -33438840321285. / 15594753105479., 3629800801594. / 4656183773603., 4035322873751. / 18575991585200.}; 1041d27334e2SStefano Zampini const PetscReal binterpt[8][3] = { 1042d27334e2SStefano Zampini {-17674230611817. / 10670229744614., 43486358583215. / 12773830924787., -9257016797708. / 5021505065439. }, 1043d27334e2SStefano Zampini {0, 0, 0 }, 1044d27334e2SStefano Zampini {0, 0, 0 }, 1045d27334e2SStefano Zampini {65168852399939. / 7868540260826., -91478233927265. / 11067650958493., 26096422576131. / 11239449250142.}, 1046d27334e2SStefano Zampini {15494834004392. / 5936557850923., -79368583304911. / 10890268929626., 92396832856987. / 20362823103730.}, 1047d27334e2SStefano Zampini {-99329723586156. / 26959484932159., -12239297817655. / 9152339842473., 30029262896817. / 10175596800299.}, 1048d27334e2SStefano Zampini {-19024464361622. / 5461577185407., 115839755401235. / 10719374521269., -26136350496073. / 3983972220547.}, 1049d27334e2SStefano Zampini {-6511271360970. / 6095937251113., 5843115559534. / 2180450260947., -5289405421727. / 3760307252460. } 1050d27334e2SStefano Zampini }; 10519566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX5, 5, 8, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL)); 1052a3a57f36SJed Brown } 1053d27334e2SStefano Zampini #undef RC 1054d27334e2SStefano Zampini #undef us2 1055d27334e2SStefano Zampini #undef s2 10563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10578a381b04SJed Brown } 10588a381b04SJed Brown 10598a381b04SJed Brown /*@C 1060bcf0153eSBarry Smith TSARKIMEXRegisterDestroy - Frees the list of schemes that were registered by `TSARKIMEXRegister()`. 10618a381b04SJed Brown 10628a381b04SJed Brown Not Collective 10638a381b04SJed Brown 10648a381b04SJed Brown Level: advanced 10658a381b04SJed Brown 10661cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXRegister()`, `TSARKIMEXRegisterAll()` 10678a381b04SJed Brown @*/ 1068d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterDestroy(void) 1069d71ae5a4SJacob Faibussowitsch { 10708a381b04SJed Brown ARKTableauLink link; 10718a381b04SJed Brown 10728a381b04SJed Brown PetscFunctionBegin; 10738a381b04SJed Brown while ((link = ARKTableauList)) { 10748a381b04SJed Brown ARKTableau t = &link->tab; 10758a381b04SJed Brown ARKTableauList = link->next; 10769566063dSJacob Faibussowitsch PetscCall(PetscFree6(t->At, t->bt, t->ct, t->A, t->b, t->c)); 10779566063dSJacob Faibussowitsch PetscCall(PetscFree2(t->bembedt, t->bembed)); 10789566063dSJacob Faibussowitsch PetscCall(PetscFree2(t->binterpt, t->binterp)); 10799566063dSJacob Faibussowitsch PetscCall(PetscFree(t->name)); 10809566063dSJacob Faibussowitsch PetscCall(PetscFree(link)); 10818a381b04SJed Brown } 10828a381b04SJed Brown TSARKIMEXRegisterAllCalled = PETSC_FALSE; 10833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10848a381b04SJed Brown } 10858a381b04SJed Brown 10868a381b04SJed Brown /*@C 1087bcf0153eSBarry Smith TSARKIMEXInitializePackage - This function initializes everything in the `TSARKIMEX` package. It is called 1088bcf0153eSBarry Smith from `TSInitializePackage()`. 10898a381b04SJed Brown 10908a381b04SJed Brown Level: developer 10918a381b04SJed Brown 10921cc06b55SBarry Smith .seealso: [](ch_ts), `PetscInitialize()`, `TSARKIMEXFinalizePackage()` 10938a381b04SJed Brown @*/ 1094d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXInitializePackage(void) 1095d71ae5a4SJacob Faibussowitsch { 10968a381b04SJed Brown PetscFunctionBegin; 10973ba16761SJacob Faibussowitsch if (TSARKIMEXPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 10988a381b04SJed Brown TSARKIMEXPackageInitialized = PETSC_TRUE; 10999566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegisterAll()); 11009566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(TSARKIMEXFinalizePackage)); 11013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11028a381b04SJed Brown } 11038a381b04SJed Brown 11048a381b04SJed Brown /*@C 1105bcf0153eSBarry Smith TSARKIMEXFinalizePackage - This function destroys everything in the `TSARKIMEX` package. It is 1106bcf0153eSBarry Smith called from `PetscFinalize()`. 11078a381b04SJed Brown 11088a381b04SJed Brown Level: developer 11098a381b04SJed Brown 11101cc06b55SBarry Smith .seealso: [](ch_ts), `PetscFinalize()`, `TSARKIMEXInitializePackage()` 11118a381b04SJed Brown @*/ 1112d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXFinalizePackage(void) 1113d71ae5a4SJacob Faibussowitsch { 11148a381b04SJed Brown PetscFunctionBegin; 11158a381b04SJed Brown TSARKIMEXPackageInitialized = PETSC_FALSE; 11169566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegisterDestroy()); 11173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11188a381b04SJed Brown } 11198a381b04SJed Brown 1120cd652676SJed Brown /*@C 1121bcf0153eSBarry Smith TSARKIMEXRegister - register a `TSARKIMEX` scheme by providing the entries in the Butcher tableau and optionally embedded approximations and interpolation 1122cd652676SJed Brown 1123d27334e2SStefano Zampini Logically Collective. 1124cd652676SJed Brown 1125cd652676SJed Brown Input Parameters: 1126cd652676SJed Brown + name - identifier for method 1127cd652676SJed Brown . order - approximation order of method 1128cd652676SJed Brown . s - number of stages, this is the dimension of the matrices below 1129cd652676SJed Brown . At - Butcher table of stage coefficients for stiff part (dimension s*s, row-major) 11300298fd71SBarry Smith . bt - Butcher table for completing the stiff part of the step (dimension s; NULL to use the last row of At) 11310298fd71SBarry Smith . ct - Abscissa of each stiff stage (dimension s, NULL to use row sums of At) 1132cd652676SJed Brown . A - Non-stiff stage coefficients (dimension s*s, row-major) 11330298fd71SBarry Smith . b - Non-stiff step completion table (dimension s; NULL to use last row of At) 11340298fd71SBarry Smith . c - Non-stiff abscissa (dimension s; NULL to use row sums of A) 11350298fd71SBarry Smith . bembedt - Stiff part of completion table for embedded method (dimension s; NULL if not available) 11360298fd71SBarry Smith . bembed - Non-stiff part of completion table for embedded method (dimension s; NULL to use bembedt if provided) 1137cd652676SJed Brown . pinterp - Order of the interpolation scheme, equal to the number of columns of binterpt and binterp 1138cd652676SJed Brown . binterpt - Coefficients of the interpolation formula for the stiff part (dimension s*pinterp) 11390298fd71SBarry Smith - binterp - Coefficients of the interpolation formula for the non-stiff part (dimension s*pinterp; NULL to reuse binterpt) 1140cd652676SJed Brown 1141cd652676SJed Brown Level: advanced 1142cd652676SJed Brown 1143bcf0153eSBarry Smith Note: 1144bcf0153eSBarry Smith Several `TSARKIMEX` methods are provided, this function is only needed to create new methods. 1145bcf0153eSBarry Smith 11461cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSType`, `TS` 1147cd652676SJed Brown @*/ 1148d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegister(TSARKIMEXType name, PetscInt order, PetscInt s, const PetscReal At[], const PetscReal bt[], const PetscReal ct[], const PetscReal A[], const PetscReal b[], const PetscReal c[], const PetscReal bembedt[], const PetscReal bembed[], PetscInt pinterp, const PetscReal binterpt[], const PetscReal binterp[]) 1149d71ae5a4SJacob Faibussowitsch { 11508a381b04SJed Brown ARKTableauLink link; 11518a381b04SJed Brown ARKTableau t; 11528a381b04SJed Brown PetscInt i, j; 11538a381b04SJed Brown 11548a381b04SJed Brown PetscFunctionBegin; 11559566063dSJacob Faibussowitsch PetscCall(TSARKIMEXInitializePackage()); 1156d27334e2SStefano Zampini for (link = ARKTableauList; link; link = link->next) { 1157d27334e2SStefano Zampini PetscBool match; 1158d27334e2SStefano Zampini 1159d27334e2SStefano Zampini PetscCall(PetscStrcmp(link->tab.name, name, &match)); 1160d27334e2SStefano Zampini PetscCheck(!match, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Method with name \"%s\" already registered", name); 1161d27334e2SStefano Zampini } 11629566063dSJacob Faibussowitsch PetscCall(PetscNew(&link)); 11638a381b04SJed Brown t = &link->tab; 11649566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &t->name)); 11658a381b04SJed Brown t->order = order; 11668a381b04SJed Brown t->s = s; 11679566063dSJacob Faibussowitsch PetscCall(PetscMalloc6(s * s, &t->At, s, &t->bt, s, &t->ct, s * s, &t->A, s, &t->b, s, &t->c)); 11689566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->At, At, s * s)); 1169d27334e2SStefano Zampini if (A) { 11709566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->A, A, s * s)); 1171d27334e2SStefano Zampini t->additive = PETSC_TRUE; 1172d27334e2SStefano Zampini } 1173d27334e2SStefano Zampini 11749566063dSJacob Faibussowitsch if (bt) PetscCall(PetscArraycpy(t->bt, bt, s)); 11759371c9d4SSatish Balay else 11769371c9d4SSatish Balay for (i = 0; i < s; i++) t->bt[i] = At[(s - 1) * s + i]; 1177d27334e2SStefano Zampini 1178d27334e2SStefano Zampini if (t->additive) { 11799566063dSJacob Faibussowitsch if (b) PetscCall(PetscArraycpy(t->b, b, s)); 11809371c9d4SSatish Balay else 11819371c9d4SSatish Balay for (i = 0; i < s; i++) t->b[i] = t->bt[i]; 1182d27334e2SStefano Zampini } else PetscCall(PetscArrayzero(t->b, s)); 1183d27334e2SStefano Zampini 11849566063dSJacob Faibussowitsch if (ct) PetscCall(PetscArraycpy(t->ct, ct, s)); 11859371c9d4SSatish Balay else 11869371c9d4SSatish Balay for (i = 0; i < s; i++) 11879371c9d4SSatish Balay for (j = 0, t->ct[i] = 0; j < s; j++) t->ct[i] += At[i * s + j]; 1188d27334e2SStefano Zampini 1189d27334e2SStefano Zampini if (t->additive) { 11909566063dSJacob Faibussowitsch if (c) PetscCall(PetscArraycpy(t->c, c, s)); 11919371c9d4SSatish Balay else 11929371c9d4SSatish Balay for (i = 0; i < s; i++) 11939371c9d4SSatish Balay for (j = 0, t->c[i] = 0; j < s; j++) t->c[i] += A[i * s + j]; 1194d27334e2SStefano Zampini } else PetscCall(PetscArrayzero(t->c, s)); 1195d27334e2SStefano Zampini 1196e817cc15SEmil Constantinescu t->stiffly_accurate = PETSC_TRUE; 11979371c9d4SSatish Balay for (i = 0; i < s; i++) 11989371c9d4SSatish Balay if (t->At[(s - 1) * s + i] != t->bt[i]) t->stiffly_accurate = PETSC_FALSE; 1199d27334e2SStefano Zampini 1200e817cc15SEmil Constantinescu t->explicit_first_stage = PETSC_TRUE; 12019371c9d4SSatish Balay for (i = 0; i < s; i++) 12029371c9d4SSatish Balay if (t->At[i] != 0.0) t->explicit_first_stage = PETSC_FALSE; 1203d27334e2SStefano Zampini 1204e817cc15SEmil Constantinescu /* def of FSAL can be made more precise */ 12054e9d4bf5SJed Brown t->FSAL_implicit = (PetscBool)(t->explicit_first_stage && t->stiffly_accurate); 1206d27334e2SStefano Zampini 1207108c343cSJed Brown if (bembedt) { 12089566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(s, &t->bembedt, s, &t->bembed)); 12099566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->bembedt, bembedt, s)); 12109566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->bembed, bembed ? bembed : bembedt, s)); 1211108c343cSJed Brown } 1212108c343cSJed Brown 12134f385281SJed Brown t->pinterp = pinterp; 12149566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(s * pinterp, &t->binterpt, s * pinterp, &t->binterp)); 12159566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->binterpt, binterpt, s * pinterp)); 12169566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->binterp, binterp ? binterp : binterpt, s * pinterp)); 1217d27334e2SStefano Zampini 12188a381b04SJed Brown link->next = ARKTableauList; 12198a381b04SJed Brown ARKTableauList = link; 12203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12218a381b04SJed Brown } 12228a381b04SJed Brown 1223d27334e2SStefano Zampini /*@C 1224d27334e2SStefano Zampini TSDIRKRegister - register a `TSDIRK` scheme by providing the entries in its Butcher tableau and, optionally, embedded approximations and interpolation 1225d27334e2SStefano Zampini 1226d27334e2SStefano Zampini Logically Collective. 1227d27334e2SStefano Zampini 1228d27334e2SStefano Zampini Input Parameters: 1229d27334e2SStefano Zampini + name - identifier for method 1230d27334e2SStefano Zampini . order - approximation order of method 1231d27334e2SStefano Zampini . s - number of stages, this is the dimension of the matrices below 1232d27334e2SStefano Zampini . At - Butcher table of stage coefficients (dimension `s`*`s`, row-major order) 1233d27334e2SStefano Zampini . bt - Butcher table for completing the step (dimension `s`; pass `NULL` to use the last row of `At`) 1234d27334e2SStefano Zampini . ct - Abscissa of each stage (dimension s, NULL to use row sums of At) 1235d27334e2SStefano Zampini . bembedt - Stiff part of completion table for embedded method (dimension s; `NULL` if not available) 1236d27334e2SStefano Zampini . pinterp - Order of the interpolation scheme, equal to the number of columns of `binterpt` and `binterp` 1237d27334e2SStefano Zampini - binterpt - Coefficients of the interpolation formula (dimension s*pinterp) 1238d27334e2SStefano Zampini 1239d27334e2SStefano Zampini Level: advanced 1240d27334e2SStefano Zampini 1241d27334e2SStefano Zampini Note: 1242d27334e2SStefano Zampini Several `TSDIRK` methods are provided, the use of this function is only needed to create new methods. 1243d27334e2SStefano Zampini 1244d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSType`, `TS` 1245d27334e2SStefano Zampini @*/ 1246d27334e2SStefano Zampini PetscErrorCode TSDIRKRegister(TSDIRKType name, PetscInt order, PetscInt s, const PetscReal At[], const PetscReal bt[], const PetscReal ct[], const PetscReal bembedt[], PetscInt pinterp, const PetscReal binterpt[]) 1247d27334e2SStefano Zampini { 1248d27334e2SStefano Zampini PetscFunctionBegin; 1249d27334e2SStefano Zampini PetscCall(TSARKIMEXRegister(name, order, s, At, bt, ct, NULL, NULL, NULL, bembedt, NULL, pinterp, binterpt, NULL)); 1250d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 1251d27334e2SStefano Zampini } 1252d27334e2SStefano Zampini 1253108c343cSJed Brown /* 1254108c343cSJed Brown The step completion formula is 1255108c343cSJed Brown 1256108c343cSJed Brown x1 = x0 - h bt^T YdotI + h b^T YdotRHS 1257108c343cSJed Brown 1258108c343cSJed Brown This function can be called before or after ts->vec_sol has been updated. 1259108c343cSJed Brown Suppose we have a completion formula (bt,b) and an embedded formula (bet,be) of different order. 1260108c343cSJed Brown We can write 1261108c343cSJed Brown 1262108c343cSJed Brown x1e = x0 - h bet^T YdotI + h be^T YdotRHS 1263108c343cSJed Brown = x1 + h bt^T YdotI - h b^T YdotRHS - h bet^T YdotI + h be^T YdotRHS 1264108c343cSJed Brown = x1 - h (bet - bt)^T YdotI + h (be - b)^T YdotRHS 1265108c343cSJed Brown 1266108c343cSJed Brown so we can evaluate the method with different order even after the step has been optimistically completed. 1267108c343cSJed Brown */ 1268d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSEvaluateStep_ARKIMEX(TS ts, PetscInt order, Vec X, PetscBool *done) 1269d71ae5a4SJacob Faibussowitsch { 1270108c343cSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1271108c343cSJed Brown ARKTableau tab = ark->tableau; 1272108c343cSJed Brown PetscScalar *w = ark->work; 1273108c343cSJed Brown PetscReal h; 1274108c343cSJed Brown PetscInt s = tab->s, j; 1275d27334e2SStefano Zampini PetscBool hasE; 1276108c343cSJed Brown 1277108c343cSJed Brown PetscFunctionBegin; 1278108c343cSJed Brown switch (ark->status) { 1279108c343cSJed Brown case TS_STEP_INCOMPLETE: 1280d71ae5a4SJacob Faibussowitsch case TS_STEP_PENDING: 1281d71ae5a4SJacob Faibussowitsch h = ts->time_step; 1282d71ae5a4SJacob Faibussowitsch break; 1283d71ae5a4SJacob Faibussowitsch case TS_STEP_COMPLETE: 1284d71ae5a4SJacob Faibussowitsch h = ts->ptime - ts->ptime_prev; 1285d71ae5a4SJacob Faibussowitsch break; 1286d71ae5a4SJacob Faibussowitsch default: 1287d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); 1288108c343cSJed Brown } 1289108c343cSJed Brown if (order == tab->order) { 1290e817cc15SEmil Constantinescu if (ark->status == TS_STEP_INCOMPLETE) { 1291740132f1SEmil Constantinescu if (!ark->imex && tab->stiffly_accurate) { /* Only the stiffly accurate implicit formula is used */ 12929566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y[s - 1], X)); 1293e817cc15SEmil Constantinescu } else { /* Use the standard completion formula (bt,b) */ 12949566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, X)); 1295e817cc15SEmil Constantinescu for (j = 0; j < s; j++) w[j] = h * tab->bt[j]; 12969566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotI)); 1297d27334e2SStefano Zampini if (tab->additive && ark->imex) { /* Method is IMEX, complete the explicit formula */ 1298d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1299d27334e2SStefano Zampini if (hasE) { 1300108c343cSJed Brown for (j = 0; j < s; j++) w[j] = h * tab->b[j]; 13019566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotRHS)); 1302e817cc15SEmil Constantinescu } 1303e817cc15SEmil Constantinescu } 1304d27334e2SStefano Zampini } 13059566063dSJacob Faibussowitsch } else PetscCall(VecCopy(ts->vec_sol, X)); 1306108c343cSJed Brown if (done) *done = PETSC_TRUE; 13073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1308108c343cSJed Brown } else if (order == tab->order - 1) { 1309108c343cSJed Brown if (!tab->bembedt) goto unavailable; 1310108c343cSJed Brown if (ark->status == TS_STEP_INCOMPLETE) { /* Complete with the embedded method (bet,be) */ 13119566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, X)); 1312e817cc15SEmil Constantinescu for (j = 0; j < s; j++) w[j] = h * tab->bembedt[j]; 13139566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotI)); 1314d27334e2SStefano Zampini if (tab->additive) { 1315d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1316d27334e2SStefano Zampini if (hasE) { 1317108c343cSJed Brown for (j = 0; j < s; j++) w[j] = h * tab->bembed[j]; 13189566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotRHS)); 1319d27334e2SStefano Zampini } 1320d27334e2SStefano Zampini } 1321108c343cSJed Brown } else { /* Rollback and re-complete using (bet-be,be-b) */ 13229566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, X)); 1323e817cc15SEmil Constantinescu for (j = 0; j < s; j++) w[j] = h * (tab->bembedt[j] - tab->bt[j]); 13249566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, tab->s, w, ark->YdotI)); 1325d27334e2SStefano Zampini if (tab->additive) { 1326d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1327d27334e2SStefano Zampini if (hasE) { 1328108c343cSJed Brown for (j = 0; j < s; j++) w[j] = h * (tab->bembed[j] - tab->b[j]); 13299566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotRHS)); 1330108c343cSJed Brown } 1331d27334e2SStefano Zampini } 1332d27334e2SStefano Zampini } 1333108c343cSJed Brown if (done) *done = PETSC_TRUE; 13343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1335108c343cSJed Brown } 1336108c343cSJed Brown unavailable: 1337108c343cSJed Brown if (done) *done = PETSC_FALSE; 13389371c9d4SSatish Balay else 13399371c9d4SSatish Balay SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "ARKIMEX '%s' of order %" PetscInt_FMT " cannot evaluate step at order %" PetscInt_FMT ". Consider using -ts_adapt_type none or a different method that has an embedded estimate.", tab->name, 13409371c9d4SSatish Balay tab->order, order); 13413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1342108c343cSJed Brown } 1343108c343cSJed Brown 1344d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTestMassIdentity(TS ts, PetscBool *id) 1345d71ae5a4SJacob Faibussowitsch { 1346c79dcfbdSBarry Smith Vec Udot, Y1, Y2; 1347c79dcfbdSBarry Smith TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1348c79dcfbdSBarry Smith PetscReal norm; 1349c79dcfbdSBarry Smith 1350c79dcfbdSBarry Smith PetscFunctionBegin; 13519566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &Udot)); 13529566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &Y1)); 13539566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &Y2)); 13549566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y1, ark->imex)); 13559566063dSJacob Faibussowitsch PetscCall(VecSetRandom(Udot, NULL)); 13569566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y2, ark->imex)); 13579566063dSJacob Faibussowitsch PetscCall(VecAXPY(Y2, -1.0, Y1)); 13589566063dSJacob Faibussowitsch PetscCall(VecAXPY(Y2, -1.0, Udot)); 13599566063dSJacob Faibussowitsch PetscCall(VecNorm(Y2, NORM_2, &norm)); 1360c79dcfbdSBarry Smith if (norm < 100.0 * PETSC_MACHINE_EPSILON) { 1361c79dcfbdSBarry Smith *id = PETSC_TRUE; 1362c79dcfbdSBarry Smith } else { 1363c79dcfbdSBarry Smith *id = PETSC_FALSE; 13649566063dSJacob Faibussowitsch PetscCall(PetscInfo((PetscObject)ts, "IFunction(Udot = random) - IFunction(Udot = 0) is not near Udot, %g, suspect mass matrix implied in IFunction() is not the identity as required\n", (double)norm)); 1365c79dcfbdSBarry Smith } 13669566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Udot)); 13679566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Y1)); 13689566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Y2)); 13693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1370c79dcfbdSBarry Smith } 1371c79dcfbdSBarry Smith 1372d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSRollBack_ARKIMEX(TS ts) 1373d71ae5a4SJacob Faibussowitsch { 137424655328SShri TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 137524655328SShri ARKTableau tab = ark->tableau; 137624655328SShri const PetscInt s = tab->s; 137724655328SShri const PetscReal *bt = tab->bt, *b = tab->b; 137824655328SShri PetscScalar *w = ark->work; 137924655328SShri Vec *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS; 138024655328SShri PetscInt j; 1381be5899b3SLisandro Dalcin PetscReal h; 138224655328SShri 138324655328SShri PetscFunctionBegin; 1384be5899b3SLisandro Dalcin switch (ark->status) { 1385be5899b3SLisandro Dalcin case TS_STEP_INCOMPLETE: 1386d71ae5a4SJacob Faibussowitsch case TS_STEP_PENDING: 1387d71ae5a4SJacob Faibussowitsch h = ts->time_step; 1388d71ae5a4SJacob Faibussowitsch break; 1389d71ae5a4SJacob Faibussowitsch case TS_STEP_COMPLETE: 1390d71ae5a4SJacob Faibussowitsch h = ts->ptime - ts->ptime_prev; 1391d71ae5a4SJacob Faibussowitsch break; 1392d71ae5a4SJacob Faibussowitsch default: 1393d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); 1394be5899b3SLisandro Dalcin } 139524655328SShri for (j = 0; j < s; j++) w[j] = -h * bt[j]; 13969566063dSJacob Faibussowitsch PetscCall(VecMAXPY(ts->vec_sol, s, w, YdotI)); 1397d27334e2SStefano Zampini if (tab->additive) { 1398d27334e2SStefano Zampini PetscBool hasE; 1399d27334e2SStefano Zampini 1400d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1401d27334e2SStefano Zampini if (hasE) { 140224655328SShri for (j = 0; j < s; j++) w[j] = -h * b[j]; 14039566063dSJacob Faibussowitsch PetscCall(VecMAXPY(ts->vec_sol, s, w, YdotRHS)); 1404d27334e2SStefano Zampini } 1405d27334e2SStefano Zampini } 14063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 140724655328SShri } 140824655328SShri 1409d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSStep_ARKIMEX(TS ts) 1410d71ae5a4SJacob Faibussowitsch { 14118a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 14128a381b04SJed Brown ARKTableau tab = ark->tableau; 14138a381b04SJed Brown const PetscInt s = tab->s; 141424655328SShri const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c; 1415406d0ec2SJed Brown PetscScalar *w = ark->work; 14161297b224SEmil Constantinescu Vec *Y = ark->Y, *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS, Ydot = ark->Ydot, Ydot0 = ark->Ydot0, Z = ark->Z; 141796400bd6SLisandro Dalcin PetscBool extrapolate = ark->extrapolate; 1418108c343cSJed Brown TSAdapt adapt; 14198a381b04SJed Brown SNES snes; 1420fecfb714SLisandro Dalcin PetscInt i, j, its, lits; 1421be5899b3SLisandro Dalcin PetscInt rejections = 0; 1422d27334e2SStefano Zampini PetscBool hasE = PETSC_FALSE, dirk = (PetscBool)(!tab->additive), stageok, accept = PETSC_TRUE; 142396400bd6SLisandro Dalcin PetscReal next_time_step = ts->time_step; 14248a381b04SJed Brown 14258a381b04SJed Brown PetscFunctionBegin; 142696400bd6SLisandro Dalcin if (ark->extrapolate && !ark->Y_prev) { 14279566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev)); 14289566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev)); 1429d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev)); 143096400bd6SLisandro Dalcin } 143196400bd6SLisandro Dalcin 1432d27334e2SStefano Zampini if (!dirk) PetscCall(TSHasRHSFunction(ts, &hasE)); 1433d27334e2SStefano Zampini if (!hasE) dirk = PETSC_TRUE; 1434d27334e2SStefano Zampini 143596400bd6SLisandro Dalcin if (!ts->steprollback) { 1436d27334e2SStefano Zampini if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { /* Save the initial slope for the next step */ 14379566063dSJacob Faibussowitsch PetscCall(VecCopy(YdotI[s - 1], Ydot0)); 143896400bd6SLisandro Dalcin } 1439fecfb714SLisandro Dalcin if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initial guess */ 144096400bd6SLisandro Dalcin for (i = 0; i < s; i++) { 14419566063dSJacob Faibussowitsch PetscCall(VecCopy(Y[i], ark->Y_prev[i])); 14429566063dSJacob Faibussowitsch PetscCall(VecCopy(YdotI[i], ark->YdotI_prev[i])); 1443d27334e2SStefano Zampini if (tab->additive && hasE) PetscCall(VecCopy(YdotRHS[i], ark->YdotRHS_prev[i])); 144496400bd6SLisandro Dalcin } 144596400bd6SLisandro Dalcin } 144696400bd6SLisandro Dalcin } 144796400bd6SLisandro Dalcin 14483b98415fSStefano Zampini /* 14493b98415fSStefano Zampini For fully implicit formulations we must solve the equations 14503b98415fSStefano Zampini 14513b98415fSStefano Zampini F(t_n,x_n,xdot) = 0 14523b98415fSStefano Zampini 14533b98415fSStefano Zampini for the explicit first stage. 14543b98415fSStefano Zampini Here we call SNESSolve using PETSC_MAX_REAL as shift to flag it. 14553b98415fSStefano Zampini Special handling is inside SNESTSFormFunction_ARKIMEX and SNESTSFormJacobian_ARKIMEX 14563b98415fSStefano Zampini */ 1457d27334e2SStefano Zampini if (dirk && tab->explicit_first_stage && ts->steprestart) { 145898940a98SHong Zhang ark->scoeff = PETSC_MAX_REAL; 1459d27334e2SStefano Zampini PetscCall(VecCopy(ts->vec_sol, Z)); 1460d27334e2SStefano Zampini PetscCall(TSGetSNES(ts, &snes)); 1461d27334e2SStefano Zampini PetscCall(SNESSolve(snes, NULL, Ydot0)); 1462d27334e2SStefano Zampini } 1463d27334e2SStefano Zampini 1464d27334e2SStefano Zampini /* For IMEX we compute a step */ 1465d27334e2SStefano Zampini if (!dirk && ts->equation_type >= TS_EQ_IMPLICIT && tab->explicit_first_stage && ts->steprestart) { 146696400bd6SLisandro Dalcin TS ts_start; 1467d27334e2SStefano Zampini if (PetscDefined(USE_DEBUG) && hasE) { 1468c79dcfbdSBarry Smith PetscBool id = PETSC_FALSE; 14699566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTestMassIdentity(ts, &id)); 1470*8434afd1SBarry Smith PetscCheck(id, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "This scheme requires an identity mass matrix, however the TSIFunctionFn you provided does not utilize an identity mass matrix"); 1471c79dcfbdSBarry Smith } 14729566063dSJacob Faibussowitsch PetscCall(TSClone(ts, &ts_start)); 14739566063dSJacob Faibussowitsch PetscCall(TSSetSolution(ts_start, ts->vec_sol)); 14749566063dSJacob Faibussowitsch PetscCall(TSSetTime(ts_start, ts->ptime)); 14759566063dSJacob Faibussowitsch PetscCall(TSSetMaxSteps(ts_start, ts->steps + 1)); 14769566063dSJacob Faibussowitsch PetscCall(TSSetMaxTime(ts_start, ts->ptime + ts->time_step)); 14779566063dSJacob Faibussowitsch PetscCall(TSSetExactFinalTime(ts_start, TS_EXACTFINALTIME_STEPOVER)); 14789566063dSJacob Faibussowitsch PetscCall(TSSetTimeStep(ts_start, ts->time_step)); 14799566063dSJacob Faibussowitsch PetscCall(TSSetType(ts_start, TSARKIMEX)); 14809566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetFullyImplicit(ts_start, PETSC_TRUE)); 14819566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetType(ts_start, TSARKIMEX1BEE)); 148234561852SEmil Constantinescu 14839566063dSJacob Faibussowitsch PetscCall(TSRestartStep(ts_start)); 14849566063dSJacob Faibussowitsch PetscCall(TSSolve(ts_start, ts->vec_sol)); 14859566063dSJacob Faibussowitsch PetscCall(TSGetTime(ts_start, &ts->ptime)); 14869566063dSJacob Faibussowitsch PetscCall(TSGetTimeStep(ts_start, &ts->time_step)); 1487bbd56ea5SKarl Rupp 148885fc7851SLisandro Dalcin { /* Save the initial slope for the next step */ 148985fc7851SLisandro Dalcin TS_ARKIMEX *ark_start = (TS_ARKIMEX *)ts_start->data; 14909566063dSJacob Faibussowitsch PetscCall(VecCopy(ark_start->YdotI[ark_start->tableau->s - 1], Ydot0)); 149185fc7851SLisandro Dalcin } 149296400bd6SLisandro Dalcin ts->steps++; 149334561852SEmil Constantinescu 1494d15a3a53SEmil Constantinescu /* Set the correct TS in SNES */ 1495d15a3a53SEmil Constantinescu /* We'll try to bypass this by changing the method on the fly */ 149696400bd6SLisandro Dalcin { 14979566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 14989566063dSJacob Faibussowitsch PetscCall(TSSetSNES(ts, snes)); 149996400bd6SLisandro Dalcin } 15009566063dSJacob Faibussowitsch PetscCall(TSDestroy(&ts_start)); 1501e817cc15SEmil Constantinescu } 1502e817cc15SEmil Constantinescu 1503108c343cSJed Brown ark->status = TS_STEP_INCOMPLETE; 150496400bd6SLisandro Dalcin while (!ts->reason && ark->status != TS_STEP_COMPLETE) { 150596400bd6SLisandro Dalcin PetscReal t = ts->ptime; 1506108c343cSJed Brown PetscReal h = ts->time_step; 15078a381b04SJed Brown for (i = 0; i < s; i++) { 15089be3e283SDebojyoti Ghosh ark->stage_time = t + h * ct[i]; 15099566063dSJacob Faibussowitsch PetscCall(TSPreStage(ts, ark->stage_time)); 15108a381b04SJed Brown if (At[i * s + i] == 0) { /* This stage is explicit */ 15113c633725SBarry Smith PetscCheck(i == 0 || ts->equation_type < TS_EQ_IMPLICIT, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Explicit stages other than the first one are not supported for implicit problems"); 15129566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, Y[i])); 1513e817cc15SEmil Constantinescu for (j = 0; j < i; j++) w[j] = h * At[i * s + j]; 15149566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Y[i], i, w, YdotI)); 1515d27334e2SStefano Zampini if (tab->additive && hasE) { 15168a381b04SJed Brown for (j = 0; j < i; j++) w[j] = h * A[i * s + j]; 15179566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Y[i], i, w, YdotRHS)); 1518d27334e2SStefano Zampini } 15198a381b04SJed Brown } else { 1520b296d7d5SJed Brown ark->scoeff = 1. / At[i * s + i]; 15218a381b04SJed Brown /* Ydot = shift*(Y-Z) */ 15229566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, Z)); 1523e817cc15SEmil Constantinescu for (j = 0; j < i; j++) w[j] = h * At[i * s + j]; 15249566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Z, i, w, YdotI)); 1525d27334e2SStefano Zampini if (tab->additive && hasE) { 1526c58d1302SEmil Constantinescu for (j = 0; j < i; j++) w[j] = h * A[i * s + j]; 15279566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Z, i, w, YdotRHS)); 1528d27334e2SStefano Zampini } 1529fecfb714SLisandro Dalcin if (extrapolate && !ts->steprestart) { 153056dcabbaSDebojyoti Ghosh /* Initial guess extrapolated from previous time step stage values */ 15319566063dSJacob Faibussowitsch PetscCall(TSExtrapolate_ARKIMEX(ts, c[i], Y[i])); 153256dcabbaSDebojyoti Ghosh } else { 15338a381b04SJed Brown /* Initial guess taken from last stage */ 15349566063dSJacob Faibussowitsch PetscCall(VecCopy(i > 0 ? Y[i - 1] : ts->vec_sol, Y[i])); 153556dcabbaSDebojyoti Ghosh } 15369566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 15379566063dSJacob Faibussowitsch PetscCall(SNESSolve(snes, NULL, Y[i])); 15389566063dSJacob Faibussowitsch PetscCall(SNESGetIterationNumber(snes, &its)); 15399566063dSJacob Faibussowitsch PetscCall(SNESGetLinearSolveIterations(snes, &lits)); 15409371c9d4SSatish Balay ts->snes_its += its; 15419371c9d4SSatish Balay ts->ksp_its += lits; 15429566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 15439566063dSJacob Faibussowitsch PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok)); 154496400bd6SLisandro Dalcin if (!stageok) { 15451be93e3eSJed Brown /* We are likely rejecting the step because of solver or function domain problems so we should not attempt to 15461be93e3eSJed Brown * use extrapolation to initialize the solves on the next attempt. */ 154796400bd6SLisandro Dalcin extrapolate = PETSC_FALSE; 15481be93e3eSJed Brown goto reject_step; 15491be93e3eSJed Brown } 15508a381b04SJed Brown } 1551d27334e2SStefano Zampini if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { 1552e817cc15SEmil Constantinescu if (i == 0 && tab->explicit_first_stage) { 1553d27334e2SStefano Zampini PetscCheck(tab->stiffly_accurate, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "%s %s is not stiffly accurate and therefore explicit-first stage methods cannot be used if the equation is implicit because the slope cannot be evaluated", 1554d27334e2SStefano Zampini ((PetscObject)ts)->type_name, ark->tableau->name); 15559566063dSJacob Faibussowitsch PetscCall(VecCopy(Ydot0, YdotI[0])); /* YdotI = YdotI(tn-1) */ 1556e817cc15SEmil Constantinescu } else { 15579566063dSJacob Faibussowitsch PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */ 1558e817cc15SEmil Constantinescu } 1559e817cc15SEmil Constantinescu } else { 15605eca1a21SEmil Constantinescu if (i == 0 && tab->explicit_first_stage) { 15619566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(Ydot)); 15629566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, t + h * ct[i], Y[i], Ydot, YdotI[i], ark->imex)); /* YdotI = -G(t,Y,0) */ 15639566063dSJacob Faibussowitsch PetscCall(VecScale(YdotI[i], -1.0)); 15645eca1a21SEmil Constantinescu } else { 15659566063dSJacob Faibussowitsch PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */ 15665eca1a21SEmil Constantinescu } 1567d27334e2SStefano Zampini if (hasE) { 15684cc180ffSJed Brown if (ark->imex) { 15699566063dSJacob Faibussowitsch PetscCall(TSComputeRHSFunction(ts, t + h * c[i], Y[i], YdotRHS[i])); 15704cc180ffSJed Brown } else { 15719566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(YdotRHS[i])); 15724cc180ffSJed Brown } 15738a381b04SJed Brown } 1574d27334e2SStefano Zampini } 15759566063dSJacob Faibussowitsch PetscCall(TSPostStage(ts, ark->stage_time, i, Y)); 1576e817cc15SEmil Constantinescu } 157796400bd6SLisandro Dalcin 1578be5899b3SLisandro Dalcin ark->status = TS_STEP_INCOMPLETE; 15799566063dSJacob Faibussowitsch PetscCall(TSEvaluateStep_ARKIMEX(ts, tab->order, ts->vec_sol, NULL)); 1580108c343cSJed Brown ark->status = TS_STEP_PENDING; 15819566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 15829566063dSJacob Faibussowitsch PetscCall(TSAdaptCandidatesClear(adapt)); 15839566063dSJacob Faibussowitsch PetscCall(TSAdaptCandidateAdd(adapt, tab->name, tab->order, 1, tab->ccfl, (PetscReal)tab->s, PETSC_TRUE)); 15849566063dSJacob Faibussowitsch PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept)); 158596400bd6SLisandro Dalcin ark->status = accept ? TS_STEP_COMPLETE : TS_STEP_INCOMPLETE; 158696400bd6SLisandro Dalcin if (!accept) { /* Roll back the current step */ 15879566063dSJacob Faibussowitsch PetscCall(TSRollBack_ARKIMEX(ts)); 1588be5899b3SLisandro Dalcin ts->time_step = next_time_step; 1589be5899b3SLisandro Dalcin goto reject_step; 159096400bd6SLisandro Dalcin } 159196400bd6SLisandro Dalcin 15928a381b04SJed Brown ts->ptime += ts->time_step; 1593cdbf8f93SLisandro Dalcin ts->time_step = next_time_step; 1594108c343cSJed Brown break; 159596400bd6SLisandro Dalcin 159696400bd6SLisandro Dalcin reject_step: 15979371c9d4SSatish Balay ts->reject++; 15989371c9d4SSatish Balay accept = PETSC_FALSE; 1599be5899b3SLisandro Dalcin if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) { 160096400bd6SLisandro Dalcin ts->reason = TS_DIVERGED_STEP_REJECTED; 160163a3b9bcSJacob Faibussowitsch PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than current TS allowed, stopping solve\n", ts->steps, rejections)); 1602108c343cSJed Brown } 1603f85781f1SEmil Constantinescu } 16043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 16058a381b04SJed Brown } 1606d27334e2SStefano Zampini 160780ab5e31SHong Zhang /* 160880ab5e31SHong Zhang This adjoint step function assumes the partitioned ODE system has an identity mass matrix and thus can be represented in the form 160980ab5e31SHong Zhang Udot = H(t,U) + G(t,U) 161080ab5e31SHong Zhang This corresponds to F(t,U,Udot) = Udot-H(t,U). 161180ab5e31SHong Zhang 161280ab5e31SHong Zhang The complete adjoint equations are 161380ab5e31SHong Zhang (shift*I - dHdu) lambda_s[i] = 1/at[i][i] ( 16145d7a6ebeSHong Zhang dGdU (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j]) 16155d7a6ebeSHong Zhang + dHdU (bt[i] lambda_{n+1} + \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0 161680ab5e31SHong Zhang lambda_n = lambda_{n+1} + \sum_{j=1}^s lambda_s[j] 161780ab5e31SHong Zhang mu_{n+1}[i] = h (at[i][i] dHdP lambda_s[i] 16185d7a6ebeSHong Zhang + dGdP (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j]) 16195d7a6ebeSHong Zhang + dHdP (bt[i] lambda_{n+1} + \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0 162080ab5e31SHong Zhang mu_n = mu_{n+1} + \sum_{j=1}^s mu_{n+1}[j] 162180ab5e31SHong Zhang where shift = 1/(at[i][i]*h) 162280ab5e31SHong Zhang 162380ab5e31SHong Zhang If at[i][i] is 0, the first equation falls back to 162480ab5e31SHong Zhang lambda_s[i] = h ( 162580ab5e31SHong Zhang (b_i dGdU + bt[i] dHdU) lambda_{n+1} + dGdU \sum_{j=i+1}^s a[j][i] lambda_s[j] 162680ab5e31SHong Zhang + dHdU \sum_{j=i+1}^s at[j][i] lambda_s[j]) 162780ab5e31SHong Zhang 162880ab5e31SHong Zhang */ 162980ab5e31SHong Zhang static PetscErrorCode TSAdjointStep_ARKIMEX(TS ts) 163080ab5e31SHong Zhang { 163180ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 163280ab5e31SHong Zhang ARKTableau tab = ark->tableau; 163380ab5e31SHong Zhang const PetscInt s = tab->s; 163480ab5e31SHong Zhang const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c, *b = tab->b, *bt = tab->bt; 163580ab5e31SHong Zhang PetscScalar *w = ark->work; 163680ab5e31SHong Zhang Vec *Y = ark->Y, Ydot = ark->Ydot, *VecsDeltaLam = ark->VecsDeltaLam, *VecsSensiTemp = ark->VecsSensiTemp, *VecsSensiPTemp = ark->VecsSensiPTemp; 163780ab5e31SHong Zhang Mat Jex, Jim, Jimpre; 163880ab5e31SHong Zhang PetscInt i, j, nadj; 163980ab5e31SHong Zhang PetscReal t = ts->ptime, stage_time_ex; 164080ab5e31SHong Zhang PetscReal adjoint_time_step = -ts->time_step; /* always positive since ts->time_step is negative */ 164180ab5e31SHong Zhang KSP ksp; 164280ab5e31SHong Zhang 164380ab5e31SHong Zhang PetscFunctionBegin; 164480ab5e31SHong Zhang ark->status = TS_STEP_INCOMPLETE; 164580ab5e31SHong Zhang PetscCall(SNESGetKSP(ts->snes, &ksp)); 164680ab5e31SHong Zhang PetscCall(TSGetRHSMats_Private(ts, &Jex, NULL)); 164780ab5e31SHong Zhang PetscCall(TSGetIJacobian(ts, &Jim, &Jimpre, NULL, NULL)); 164880ab5e31SHong Zhang 164980ab5e31SHong Zhang for (i = s - 1; i >= 0; i--) { 165080ab5e31SHong Zhang ark->stage_time = t - adjoint_time_step * (1.0 - ct[i]); 165180ab5e31SHong Zhang stage_time_ex = t - adjoint_time_step * (1.0 - c[i]); 165280ab5e31SHong Zhang if (At[i * s + i] == 0) { // This stage is explicit 165380ab5e31SHong Zhang ark->scoeff = 0.; 165480ab5e31SHong Zhang } else { 165580ab5e31SHong Zhang ark->scoeff = -1. / At[i * s + i]; // this makes shift=ark->scoeff/ts->time_step positive since ts->time_step is negative 165680ab5e31SHong Zhang } 165780ab5e31SHong Zhang PetscCall(TSComputeSNESJacobian(ts, Y[i], Jim, Jimpre)); 165880ab5e31SHong Zhang PetscCall(TSComputeRHSJacobian(ts, stage_time_ex, Y[i], Jex, Jex)); 165980ab5e31SHong Zhang if (ts->vecs_sensip) { 166080ab5e31SHong Zhang PetscCall(TSComputeIJacobianP(ts, ark->stage_time, Y[i], Ydot, ark->scoeff / adjoint_time_step, ts->Jacp, PETSC_TRUE)); // get dFdP (-dHdP), Ydot not really used since mass matrix is identity 166180ab5e31SHong Zhang PetscCall(TSComputeRHSJacobianP(ts, stage_time_ex, Y[i], ts->Jacprhs)); // get dGdP 166280ab5e31SHong Zhang } 166380ab5e31SHong Zhang /* Build RHS (stored in VecsDeltaLam) for first-order adjoint */ 16645d7a6ebeSHong Zhang for (nadj = 0; nadj < ts->numcost; nadj++) { 16655d7a6ebeSHong Zhang /* build implicit part */ 16665d7a6ebeSHong Zhang PetscCall(VecSet(VecsSensiTemp[nadj], 0)); 166780ab5e31SHong Zhang if (s - i - 1 > 0) { 166880ab5e31SHong Zhang /* Temp = -\sum_{j=i+1}^s at[j][i] lambda_s[j] */ 166980ab5e31SHong Zhang for (j = i + 1; j < s; j++) w[j - i - 1] = -At[j * s + i]; 167080ab5e31SHong Zhang PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1])); 16715d7a6ebeSHong Zhang } 16725d7a6ebeSHong Zhang /* Temp = Temp - bt[i] lambda_{n+1} */ 16735d7a6ebeSHong Zhang PetscCall(VecAXPY(VecsSensiTemp[nadj], -bt[i], ts->vecs_sensi[nadj])); 16745d7a6ebeSHong Zhang if (bt[i] || s - i - 1 > 0) { 167580ab5e31SHong Zhang /* (shift I - dHdU) Temp */ 167680ab5e31SHong Zhang PetscCall(MatMultTranspose(Jim, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i])); 167780ab5e31SHong Zhang /* cancel out shift Temp where shift=-scoeff/h */ 167880ab5e31SHong Zhang PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], ark->scoeff / adjoint_time_step, VecsSensiTemp[nadj])); 167980ab5e31SHong Zhang if (ts->vecs_sensip) { 168080ab5e31SHong Zhang /* - dHdP Temp */ 168180ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacp, VecsSensiTemp[nadj], VecsSensiPTemp[nadj])); 16825d7a6ebeSHong Zhang /* mu_n += -h dHdP Temp */ 16835d7a6ebeSHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj])); 168480ab5e31SHong Zhang } 16855d7a6ebeSHong Zhang } else { 16865d7a6ebeSHong Zhang PetscCall(VecSet(VecsDeltaLam[nadj * s + i], 0)); // make sure it is initialized 16875d7a6ebeSHong Zhang } 16885d7a6ebeSHong Zhang /* build explicit part */ 16895d7a6ebeSHong Zhang PetscCall(VecSet(VecsSensiTemp[nadj], 0)); 16905d7a6ebeSHong Zhang if (s - i - 1 > 0) { 169180ab5e31SHong Zhang /* Temp = \sum_{j=i+1}^s a[j][i] lambda_s[j] */ 169280ab5e31SHong Zhang for (j = i + 1; j < s; j++) w[j - i - 1] = A[j * s + i]; 169380ab5e31SHong Zhang PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1])); 16945d7a6ebeSHong Zhang } 16955d7a6ebeSHong Zhang /* Temp = Temp + b[i] lambda_{n+1} */ 16965d7a6ebeSHong Zhang PetscCall(VecAXPY(VecsSensiTemp[nadj], b[i], ts->vecs_sensi[nadj])); 16975d7a6ebeSHong Zhang if (b[i] || s - i - 1 > 0) { 169880ab5e31SHong Zhang /* dGdU Temp */ 169980ab5e31SHong Zhang PetscCall(MatMultTransposeAdd(Jex, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i])); 170080ab5e31SHong Zhang if (ts->vecs_sensip) { 170180ab5e31SHong Zhang /* dGdP Temp */ 170280ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecsSensiPTemp[nadj])); 170380ab5e31SHong Zhang /* mu_n += h dGdP Temp */ 170480ab5e31SHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj])); 170580ab5e31SHong Zhang } 170680ab5e31SHong Zhang } 170780ab5e31SHong Zhang /* Build LHS for first-order adjoint */ 170880ab5e31SHong Zhang if (At[i * s + i] == 0) { // This stage is explicit 170980ab5e31SHong Zhang PetscCall(VecScale(VecsDeltaLam[nadj * s + i], adjoint_time_step)); 171080ab5e31SHong Zhang } else { 171180ab5e31SHong Zhang KSP ksp; 171280ab5e31SHong Zhang KSPConvergedReason kspreason; 171380ab5e31SHong Zhang PetscCall(SNESGetKSP(ts->snes, &ksp)); 171480ab5e31SHong Zhang PetscCall(KSPSetOperators(ksp, Jim, Jimpre)); 171580ab5e31SHong Zhang PetscCall(VecScale(VecsDeltaLam[nadj * s + i], 1. / At[i * s + i])); 171680ab5e31SHong Zhang PetscCall(KSPSolveTranspose(ksp, VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i])); 171780ab5e31SHong Zhang PetscCall(KSPGetConvergedReason(ksp, &kspreason)); 171880ab5e31SHong Zhang if (kspreason < 0) { 171980ab5e31SHong Zhang ts->reason = TSADJOINT_DIVERGED_LINEAR_SOLVE; 172080ab5e31SHong Zhang PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", %" PetscInt_FMT "th cost function, transposed linear solve fails, stopping 1st-order adjoint solve\n", ts->steps, nadj)); 172180ab5e31SHong Zhang } 172280ab5e31SHong Zhang if (ts->vecs_sensip) { 172380ab5e31SHong Zhang /* -dHdP lambda_s[i] */ 172480ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacp, VecsDeltaLam[nadj * s + i], VecsSensiPTemp[nadj])); 172580ab5e31SHong Zhang /* mu_n += h at[i][i] dHdP lambda_s[i] */ 172680ab5e31SHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], -At[i * s + i] * adjoint_time_step, VecsSensiPTemp[nadj])); 172780ab5e31SHong Zhang } 172880ab5e31SHong Zhang } 172980ab5e31SHong Zhang } 173080ab5e31SHong Zhang } 173180ab5e31SHong Zhang for (j = 0; j < s; j++) w[j] = 1.0; 173280ab5e31SHong Zhang for (nadj = 0; nadj < ts->numcost; nadj++) // no need to do this for mu's 173380ab5e31SHong Zhang PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s])); 173480ab5e31SHong Zhang ark->status = TS_STEP_COMPLETE; 173580ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 173680ab5e31SHong Zhang } 17378a381b04SJed Brown 1738d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSInterpolate_ARKIMEX(TS ts, PetscReal itime, Vec X) 1739d71ae5a4SJacob Faibussowitsch { 1740cd652676SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1741d27334e2SStefano Zampini ARKTableau tab = ark->tableau; 1742d27334e2SStefano Zampini PetscInt s = tab->s, pinterp = tab->pinterp, i, j; 1743108c343cSJed Brown PetscReal h; 1744108c343cSJed Brown PetscReal tt, t; 1745d27334e2SStefano Zampini PetscScalar *bt = ark->work, *b = ark->work + s; 1746d27334e2SStefano Zampini const PetscReal *Bt = tab->binterpt, *B = tab->binterp; 1747cd652676SJed Brown 1748cd652676SJed Brown PetscFunctionBegin; 1749d27334e2SStefano Zampini PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "%s %s does not have an interpolation formula", ((PetscObject)ts)->type_name, ark->tableau->name); 1750108c343cSJed Brown switch (ark->status) { 1751108c343cSJed Brown case TS_STEP_INCOMPLETE: 1752108c343cSJed Brown case TS_STEP_PENDING: 1753108c343cSJed Brown h = ts->time_step; 1754108c343cSJed Brown t = (itime - ts->ptime) / h; 1755108c343cSJed Brown break; 1756108c343cSJed Brown case TS_STEP_COMPLETE: 1757be5899b3SLisandro Dalcin h = ts->ptime - ts->ptime_prev; 1758108c343cSJed Brown t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */ 1759108c343cSJed Brown break; 1760d71ae5a4SJacob Faibussowitsch default: 1761d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); 1762108c343cSJed Brown } 1763cd652676SJed Brown for (i = 0; i < s; i++) bt[i] = b[i] = 0; 17644f385281SJed Brown for (j = 0, tt = t; j < pinterp; j++, tt *= t) { 1765cd652676SJed Brown for (i = 0; i < s; i++) { 1766c1758d98SDebojyoti Ghosh bt[i] += h * Bt[i * pinterp + j] * tt; 1767108c343cSJed Brown b[i] += h * B[i * pinterp + j] * tt; 1768cd652676SJed Brown } 1769cd652676SJed Brown } 17709566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y[0], X)); 17719566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, bt, ark->YdotI)); 1772d27334e2SStefano Zampini if (tab->additive) { 1773d27334e2SStefano Zampini PetscBool hasE; 1774d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1775d27334e2SStefano Zampini if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS)); 1776d27334e2SStefano Zampini } 17773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1778cd652676SJed Brown } 1779cd652676SJed Brown 1780d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSExtrapolate_ARKIMEX(TS ts, PetscReal c, Vec X) 1781d71ae5a4SJacob Faibussowitsch { 178256dcabbaSDebojyoti Ghosh TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1783d27334e2SStefano Zampini ARKTableau tab = ark->tableau; 1784d27334e2SStefano Zampini PetscInt s = tab->s, pinterp = tab->pinterp, i, j; 1785be5899b3SLisandro Dalcin PetscReal h, h_prev, t, tt; 1786d27334e2SStefano Zampini PetscScalar *bt = ark->work, *b = ark->work + s; 1787d27334e2SStefano Zampini const PetscReal *Bt = tab->binterpt, *B = tab->binterp; 178856dcabbaSDebojyoti Ghosh 178956dcabbaSDebojyoti Ghosh PetscFunctionBegin; 17903c633725SBarry Smith PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name); 179181d12688SDebojyoti Ghosh h = ts->time_step; 1792be5899b3SLisandro Dalcin h_prev = ts->ptime - ts->ptime_prev; 1793be5899b3SLisandro Dalcin t = 1 + h / h_prev * c; 1794d27334e2SStefano Zampini for (i = 0; i < s; i++) bt[i] = b[i] = 0; 179556dcabbaSDebojyoti Ghosh for (j = 0, tt = t; j < pinterp; j++, tt *= t) { 179656dcabbaSDebojyoti Ghosh for (i = 0; i < s; i++) { 179781d12688SDebojyoti Ghosh bt[i] += h * Bt[i * pinterp + j] * tt; 179856dcabbaSDebojyoti Ghosh b[i] += h * B[i * pinterp + j] * tt; 179956dcabbaSDebojyoti Ghosh } 180056dcabbaSDebojyoti Ghosh } 18013c633725SBarry Smith PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous step have not been stored"); 18029566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y_prev[0], X)); 18039566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev)); 1804d27334e2SStefano Zampini if (tab->additive) { 1805d27334e2SStefano Zampini PetscBool hasE; 1806d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1807d27334e2SStefano Zampini if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev)); 1808d27334e2SStefano Zampini } 18093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 181056dcabbaSDebojyoti Ghosh } 181156dcabbaSDebojyoti Ghosh 1812d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauReset(TS ts) 1813d71ae5a4SJacob Faibussowitsch { 181496400bd6SLisandro Dalcin TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 181596400bd6SLisandro Dalcin ARKTableau tab = ark->tableau; 181696400bd6SLisandro Dalcin 181796400bd6SLisandro Dalcin PetscFunctionBegin; 18183ba16761SJacob Faibussowitsch if (!tab) PetscFunctionReturn(PETSC_SUCCESS); 18199566063dSJacob Faibussowitsch PetscCall(PetscFree(ark->work)); 18209566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->Y)); 18219566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotI)); 18229566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS)); 18239566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev)); 18249566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev)); 18259566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev)); 18263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 182796400bd6SLisandro Dalcin } 182896400bd6SLisandro Dalcin 1829d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSReset_ARKIMEX(TS ts) 1830d71ae5a4SJacob Faibussowitsch { 18318a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 18328a381b04SJed Brown 18338a381b04SJed Brown PetscFunctionBegin; 18349566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTableauReset(ts)); 18359566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Ydot)); 18369566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Ydot0)); 18379566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Z)); 18383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18398a381b04SJed Brown } 18408a381b04SJed Brown 184180ab5e31SHong Zhang static PetscErrorCode TSAdjointReset_ARKIMEX(TS ts) 184280ab5e31SHong Zhang { 184380ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 184480ab5e31SHong Zhang ARKTableau tab = ark->tableau; 184580ab5e31SHong Zhang 184680ab5e31SHong Zhang PetscFunctionBegin; 184780ab5e31SHong Zhang PetscCall(VecDestroyVecs(tab->s * ts->numcost, &ark->VecsDeltaLam)); 184880ab5e31SHong Zhang PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiTemp)); 184980ab5e31SHong Zhang PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiPTemp)); 185080ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 185180ab5e31SHong Zhang } 185280ab5e31SHong Zhang 1853d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetVecs(TS ts, DM dm, Vec *Z, Vec *Ydot) 1854d71ae5a4SJacob Faibussowitsch { 1855d5e6173cSPeter Brune TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data; 1856d5e6173cSPeter Brune 1857d5e6173cSPeter Brune PetscFunctionBegin; 1858d5e6173cSPeter Brune if (Z) { 1859d5e6173cSPeter Brune if (dm && dm != ts->dm) { 18609566063dSJacob Faibussowitsch PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Z", Z)); 1861d5e6173cSPeter Brune } else *Z = ax->Z; 1862d5e6173cSPeter Brune } 1863d5e6173cSPeter Brune if (Ydot) { 1864d5e6173cSPeter Brune if (dm && dm != ts->dm) { 18659566063dSJacob Faibussowitsch PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot)); 1866d5e6173cSPeter Brune } else *Ydot = ax->Ydot; 1867d5e6173cSPeter Brune } 18683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1869d5e6173cSPeter Brune } 1870d5e6173cSPeter Brune 1871d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXRestoreVecs(TS ts, DM dm, Vec *Z, Vec *Ydot) 1872d71ae5a4SJacob Faibussowitsch { 1873d5e6173cSPeter Brune PetscFunctionBegin; 1874d5e6173cSPeter Brune if (Z) { 187548a46eb9SPierre Jolivet if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Z", Z)); 1876d5e6173cSPeter Brune } 1877d5e6173cSPeter Brune if (Ydot) { 187848a46eb9SPierre Jolivet if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot)); 1879d5e6173cSPeter Brune } 18803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1881d5e6173cSPeter Brune } 1882d5e6173cSPeter Brune 18833b98415fSStefano Zampini PETSC_SINGLE_LIBRARY_INTERN PetscErrorCode MatFindNonzeroRowsOrCols_Basic(Mat, PetscBool, PetscReal, IS *); 18843b98415fSStefano Zampini 18853b98415fSStefano Zampini /* This defines the nonlinear equation that is to be solved with SNES */ 1886d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormFunction_ARKIMEX(SNES snes, Vec X, Vec F, TS ts) 1887d71ae5a4SJacob Faibussowitsch { 18888a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1889d5e6173cSPeter Brune DM dm, dmsave; 1890d5e6173cSPeter Brune Vec Z, Ydot; 18918a381b04SJed Brown 18928a381b04SJed Brown PetscFunctionBegin; 18939566063dSJacob Faibussowitsch PetscCall(SNESGetDM(snes, &dm)); 18949566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot)); 1895d5e6173cSPeter Brune dmsave = ts->dm; 1896d5e6173cSPeter Brune ts->dm = dm; 1897740132f1SEmil Constantinescu 189898940a98SHong Zhang if (ark->scoeff == PETSC_MAX_REAL) { 18993b98415fSStefano Zampini /* We are solving F(t_n,x_n,xdot) = 0 to start the method */ 1900d27334e2SStefano Zampini PetscCall(TSComputeIFunction(ts, ark->stage_time, Z, X, F, ark->imex)); 1901d27334e2SStefano Zampini } else { 190298940a98SHong Zhang PetscReal shift = ark->scoeff / ts->time_step; 1903d27334e2SStefano Zampini PetscCall(VecAXPBYPCZ(Ydot, -shift, shift, 0, Z, X)); /* Ydot = shift*(X-Z) */ 19049566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ark->stage_time, X, Ydot, F, ark->imex)); 1905d27334e2SStefano Zampini } 1906e817cc15SEmil Constantinescu 1907d5e6173cSPeter Brune ts->dm = dmsave; 19089566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot)); 19093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19108a381b04SJed Brown } 19118a381b04SJed Brown 1912d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormJacobian_ARKIMEX(SNES snes, Vec X, Mat A, Mat B, TS ts) 1913d71ae5a4SJacob Faibussowitsch { 19148a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1915d5e6173cSPeter Brune DM dm, dmsave; 1916d27334e2SStefano Zampini Vec Ydot, Z; 191798940a98SHong Zhang PetscReal shift; 19188a381b04SJed Brown 19198a381b04SJed Brown PetscFunctionBegin; 19209566063dSJacob Faibussowitsch PetscCall(SNESGetDM(snes, &dm)); 1921d27334e2SStefano Zampini PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot)); 19228a381b04SJed Brown /* ark->Ydot has already been computed in SNESTSFormFunction_ARKIMEX (SNES guarantees this) */ 1923d5e6173cSPeter Brune dmsave = ts->dm; 1924d5e6173cSPeter Brune ts->dm = dm; 1925740132f1SEmil Constantinescu 192698940a98SHong Zhang if (ark->scoeff == PETSC_MAX_REAL) { 19273b98415fSStefano Zampini PetscBool hasZeroRows; 19283b98415fSStefano Zampini IS alg_is; 19293b98415fSStefano Zampini 19303b98415fSStefano Zampini /* We are solving F(t_n,x_n,xdot) = 0 to start the method 19313b98415fSStefano Zampini Jed's proposal is to compute with a very large shift and then scale back the matrix */ 1932d27334e2SStefano Zampini shift = 1.0 / PETSC_MACHINE_EPSILON; 1933d27334e2SStefano Zampini PetscCall(TSComputeIJacobian(ts, ark->stage_time, Z, X, shift, A, B, ark->imex)); 1934d27334e2SStefano Zampini PetscCall(MatScale(B, PETSC_MACHINE_EPSILON)); 19353b98415fSStefano Zampini /* DAEs need special handling for preconditioning purposes only. 19363b98415fSStefano Zampini We need to locate the algebraic variables and modify the preconditioning matrix by 19373b98415fSStefano Zampini calling MatZeroRows with identity on these variables. 19383b98415fSStefano Zampini We must store the IS in the DM since this function can be called by multilevel solvers. 19393b98415fSStefano Zampini */ 19403b98415fSStefano Zampini PetscCall(PetscObjectQuery((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject *)&alg_is)); 19413b98415fSStefano Zampini if (!alg_is) { 19423b98415fSStefano Zampini PetscInt m, n; 19433b98415fSStefano Zampini IS nonzeroRows; 19443b98415fSStefano Zampini 19453b98415fSStefano Zampini PetscCall(MatViewFromOptions(B, (PetscObject)snes, "-ts_arkimex_alg_mat_view_pre")); 19463b98415fSStefano Zampini PetscCall(MatFindNonzeroRowsOrCols_Basic(B, PETSC_FALSE, 100 * PETSC_MACHINE_EPSILON, &nonzeroRows)); 19473b98415fSStefano Zampini if (nonzeroRows) PetscCall(ISViewFromOptions(nonzeroRows, (PetscObject)snes, "-ts_arkimex_alg_is_view_pre")); 19483b98415fSStefano Zampini PetscCall(MatGetOwnershipRange(B, &m, &n)); 19493b98415fSStefano Zampini if (nonzeroRows) PetscCall(ISComplement(nonzeroRows, m, n, &alg_is)); 19503b98415fSStefano Zampini else PetscCall(ISCreateStride(PetscObjectComm((PetscObject)snes), 0, m, 1, &alg_is)); 19513b98415fSStefano Zampini PetscCall(ISDestroy(&nonzeroRows)); 19523b98415fSStefano Zampini PetscCall(PetscObjectCompose((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject)alg_is)); 19533b98415fSStefano Zampini PetscCall(ISDestroy(&alg_is)); 19543b98415fSStefano Zampini } 19553b98415fSStefano Zampini PetscCall(PetscObjectQuery((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject *)&alg_is)); 19563b98415fSStefano Zampini PetscCall(ISViewFromOptions(alg_is, (PetscObject)snes, "-ts_arkimex_alg_is_view")); 19573b98415fSStefano Zampini PetscCall(MatHasOperation(B, MATOP_ZERO_ROWS, &hasZeroRows)); 19583b98415fSStefano Zampini if (hasZeroRows) { 19593b98415fSStefano Zampini /* the default of AIJ is to not keep the pattern! We should probably change it someday */ 19603b98415fSStefano Zampini PetscCall(MatSetOption(B, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE)); 19613b98415fSStefano Zampini PetscCall(MatZeroRowsIS(B, alg_is, 1.0, NULL, NULL)); 19623b98415fSStefano Zampini } 19633b98415fSStefano Zampini PetscCall(MatViewFromOptions(B, (PetscObject)snes, "-ts_arkimex_alg_mat_view")); 1964d27334e2SStefano Zampini if (A != B) PetscCall(MatScale(A, PETSC_MACHINE_EPSILON)); 1965d27334e2SStefano Zampini } else { 196698940a98SHong Zhang shift = ark->scoeff / ts->time_step; 19679566063dSJacob Faibussowitsch PetscCall(TSComputeIJacobian(ts, ark->stage_time, X, Ydot, shift, A, B, ark->imex)); 1968d27334e2SStefano Zampini } 1969d5e6173cSPeter Brune ts->dm = dmsave; 1970d27334e2SStefano Zampini PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot)); 19713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1972d5e6173cSPeter Brune } 1973d5e6173cSPeter Brune 197480ab5e31SHong Zhang static PetscErrorCode TSGetStages_ARKIMEX(TS ts, PetscInt *ns, Vec *Y[]) 197580ab5e31SHong Zhang { 197680ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 197780ab5e31SHong Zhang 197880ab5e31SHong Zhang PetscFunctionBegin; 197980ab5e31SHong Zhang if (ns) *ns = ark->tableau->s; 198080ab5e31SHong Zhang if (Y) *Y = ark->Y; 198180ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 198280ab5e31SHong Zhang } 198380ab5e31SHong Zhang 1984d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_TSARKIMEX(DM fine, DM coarse, void *ctx) 1985d71ae5a4SJacob Faibussowitsch { 1986d5e6173cSPeter Brune PetscFunctionBegin; 19873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1988d5e6173cSPeter Brune } 1989d5e6173cSPeter Brune 1990d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_TSARKIMEX(DM fine, Mat restrct, Vec rscale, Mat inject, DM coarse, void *ctx) 1991d71ae5a4SJacob Faibussowitsch { 1992d5e6173cSPeter Brune TS ts = (TS)ctx; 1993d5e6173cSPeter Brune Vec Z, Z_c; 1994d5e6173cSPeter Brune 1995d5e6173cSPeter Brune PetscFunctionBegin; 19969566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, fine, &Z, NULL)); 19979566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, coarse, &Z_c, NULL)); 19989566063dSJacob Faibussowitsch PetscCall(MatRestrict(restrct, Z, Z_c)); 19999566063dSJacob Faibussowitsch PetscCall(VecPointwiseMult(Z_c, rscale, Z_c)); 20009566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, fine, &Z, NULL)); 20019566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, coarse, &Z_c, NULL)); 20023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20038a381b04SJed Brown } 20048a381b04SJed Brown 2005d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_TSARKIMEX(DM dm, DM subdm, void *ctx) 2006d71ae5a4SJacob Faibussowitsch { 2007cdb298fcSPeter Brune PetscFunctionBegin; 20083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2009cdb298fcSPeter Brune } 2010cdb298fcSPeter Brune 2011d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_TSARKIMEX(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx) 2012d71ae5a4SJacob Faibussowitsch { 2013cdb298fcSPeter Brune TS ts = (TS)ctx; 2014cdb298fcSPeter Brune Vec Z, Z_c; 2015cdb298fcSPeter Brune 2016cdb298fcSPeter Brune PetscFunctionBegin; 20179566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, NULL)); 20189566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, subdm, &Z_c, NULL)); 2019cdb298fcSPeter Brune 20209566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD)); 20219566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD)); 2022cdb298fcSPeter Brune 20239566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, NULL)); 20249566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, subdm, &Z_c, NULL)); 20253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2026cdb298fcSPeter Brune } 2027cdb298fcSPeter Brune 2028d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauSetUp(TS ts) 2029d71ae5a4SJacob Faibussowitsch { 203096400bd6SLisandro Dalcin TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 203196400bd6SLisandro Dalcin ARKTableau tab = ark->tableau; 203296400bd6SLisandro Dalcin 203396400bd6SLisandro Dalcin PetscFunctionBegin; 2034d27334e2SStefano Zampini PetscCall(PetscMalloc1(2 * tab->s, &ark->work)); 20359566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y)); 20369566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI)); 2037d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS)); 203896400bd6SLisandro Dalcin if (ark->extrapolate) { 20399566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev)); 20409566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev)); 2041d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev)); 204296400bd6SLisandro Dalcin } 20433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 204496400bd6SLisandro Dalcin } 204596400bd6SLisandro Dalcin 2046d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetUp_ARKIMEX(TS ts) 2047d71ae5a4SJacob Faibussowitsch { 20488a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2049d5e6173cSPeter Brune DM dm; 205096400bd6SLisandro Dalcin SNES snes; 2051f9c1d6abSBarry Smith 20528a381b04SJed Brown PetscFunctionBegin; 20539566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTableauSetUp(ts)); 20549566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot)); 20559566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot0)); 20569566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Z)); 20579566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 20589566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts)); 20599566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts)); 20609566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 20613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20628a381b04SJed Brown } 20638a381b04SJed Brown 206480ab5e31SHong Zhang static PetscErrorCode TSAdjointSetUp_ARKIMEX(TS ts) 206580ab5e31SHong Zhang { 206680ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 206780ab5e31SHong Zhang ARKTableau tab = ark->tableau; 206880ab5e31SHong Zhang 206980ab5e31SHong Zhang PetscFunctionBegin; 207080ab5e31SHong Zhang PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], tab->s * ts->numcost, &ark->VecsDeltaLam)); 207180ab5e31SHong Zhang PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &ark->VecsSensiTemp)); 207280ab5e31SHong Zhang if (ts->vecs_sensip) { PetscCall(VecDuplicateVecs(ts->vecs_sensip[0], ts->numcost, &ark->VecsSensiPTemp)); } 207380ab5e31SHong Zhang if (PetscDefined(USE_DEBUG)) { 207480ab5e31SHong Zhang PetscBool id = PETSC_FALSE; 207580ab5e31SHong Zhang PetscCall(TSARKIMEXTestMassIdentity(ts, &id)); 2076*8434afd1SBarry Smith PetscCheck(id, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "Adjoint ARKIMEX requires an identity mass matrix, however the TSIFunctionFn you provided does not utilize an identity mass matrix"); 207780ab5e31SHong Zhang } 207880ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 207980ab5e31SHong Zhang } 208080ab5e31SHong Zhang 2081d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetFromOptions_ARKIMEX(TS ts, PetscOptionItems *PetscOptionsObject) 2082d71ae5a4SJacob Faibussowitsch { 20834cc180ffSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2084d27334e2SStefano Zampini PetscBool dirk; 20858a381b04SJed Brown 20868a381b04SJed Brown PetscFunctionBegin; 2087d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 2088d27334e2SStefano Zampini PetscOptionsHeadBegin(PetscOptionsObject, dirk ? "DIRK ODE solver options" : "ARKIMEX ODE solver options"); 20898a381b04SJed Brown { 20908a381b04SJed Brown ARKTableauLink link; 20918a381b04SJed Brown PetscInt count, choice; 20928a381b04SJed Brown PetscBool flg; 20938a381b04SJed Brown const char **namelist; 2094d27334e2SStefano Zampini for (link = ARKTableauList, count = 0; link; link = link->next) { 2095d27334e2SStefano Zampini if (!dirk && link->tab.additive) count++; 2096d27334e2SStefano Zampini if (dirk && !link->tab.additive) count++; 2097d27334e2SStefano Zampini } 20989566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(count, (char ***)&namelist)); 2099d27334e2SStefano Zampini for (link = ARKTableauList, count = 0; link; link = link->next) { 2100d27334e2SStefano Zampini if (!dirk && link->tab.additive) namelist[count++] = link->tab.name; 2101d27334e2SStefano Zampini if (dirk && !link->tab.additive) namelist[count++] = link->tab.name; 2102d27334e2SStefano Zampini } 2103d27334e2SStefano Zampini if (dirk) { 2104d27334e2SStefano Zampini PetscCall(PetscOptionsEList("-ts_dirk_type", "Family of DIRK method", "TSDIRKSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg)); 2105d27334e2SStefano Zampini if (flg) PetscCall(TSDIRKSetType(ts, namelist[choice])); 2106d27334e2SStefano Zampini } else { 21079566063dSJacob Faibussowitsch PetscCall(PetscOptionsEList("-ts_arkimex_type", "Family of ARK IMEX method", "TSARKIMEXSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg)); 21089566063dSJacob Faibussowitsch if (flg) PetscCall(TSARKIMEXSetType(ts, namelist[choice])); 21094cc180ffSJed Brown flg = (PetscBool)!ark->imex; 21109566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_arkimex_fully_implicit", "Solve the problem fully implicitly", "TSARKIMEXSetFullyImplicit", flg, &flg, NULL)); 21114cc180ffSJed Brown ark->imex = (PetscBool)!flg; 2112d27334e2SStefano Zampini } 2113d27334e2SStefano Zampini PetscCall(PetscFree(namelist)); 21149566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_arkimex_initial_guess_extrapolate", "Extrapolate the initial guess for the stage solution from stage values of the previous time step", "", ark->extrapolate, &ark->extrapolate, NULL)); 21158a381b04SJed Brown } 2116d0609cedSBarry Smith PetscOptionsHeadEnd(); 21173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21188a381b04SJed Brown } 21198a381b04SJed Brown 2120d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSView_ARKIMEX(TS ts, PetscViewer viewer) 2121d71ae5a4SJacob Faibussowitsch { 21228a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2123d27334e2SStefano Zampini PetscBool iascii, dirk; 21248a381b04SJed Brown 21258a381b04SJed Brown PetscFunctionBegin; 2126d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 21279566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 21288a381b04SJed Brown if (iascii) { 2129d27334e2SStefano Zampini PetscViewerFormat format; 21309c334d8fSLisandro Dalcin ARKTableau tab = ark->tableau; 213119fd82e9SBarry Smith TSARKIMEXType arktype; 2132d27334e2SStefano Zampini char buf[2048]; 21333a28c0e5SStefano Zampini PetscBool flg; 21343a28c0e5SStefano Zampini 21359566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetType(ts, &arktype)); 21369566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetFullyImplicit(ts, &flg)); 2137d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %s %s\n", dirk ? "DIRK" : "ARK IMEX", arktype)); 21389566063dSJacob Faibussowitsch PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->ct)); 2139d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sabscissa ct = %s\n", dirk ? "" : "Stiff ", buf)); 2140d27334e2SStefano Zampini PetscCall(PetscViewerGetFormat(viewer, &format)); 2141d27334e2SStefano Zampini if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 2142d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sAt =\n", dirk ? "" : "Stiff ")); 2143d27334e2SStefano Zampini for (PetscInt i = 0; i < tab->s; i++) { 2144d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->At + i * tab->s)); 2145d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %s\n", buf)); 2146d27334e2SStefano Zampini } 2147d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bt)); 2148d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sbt = %s\n", dirk ? "" : "Stiff ", buf)); 2149d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bembedt)); 2150d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sbet = %s\n", dirk ? "" : "Stiff ", buf)); 2151d27334e2SStefano Zampini } 21529566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Fully implicit: %s\n", flg ? "yes" : "no")); 21539566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Stiffly accurate: %s\n", tab->stiffly_accurate ? "yes" : "no")); 21549566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Explicit first stage: %s\n", tab->explicit_first_stage ? "yes" : "no")); 21559566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "FSAL property: %s\n", tab->FSAL_implicit ? "yes" : "no")); 2156d27334e2SStefano Zampini if (!dirk) { 2157d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->c)); 21589566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Nonstiff abscissa c = %s\n", buf)); 21598a381b04SJed Brown } 2160d27334e2SStefano Zampini } 21613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21628a381b04SJed Brown } 21638a381b04SJed Brown 2164d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSLoad_ARKIMEX(TS ts, PetscViewer viewer) 2165d71ae5a4SJacob Faibussowitsch { 2166f2c2a1b9SBarry Smith SNES snes; 21679c334d8fSLisandro Dalcin TSAdapt adapt; 2168f2c2a1b9SBarry Smith 2169f2c2a1b9SBarry Smith PetscFunctionBegin; 21709566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 21719566063dSJacob Faibussowitsch PetscCall(TSAdaptLoad(adapt, viewer)); 21729566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 21739566063dSJacob Faibussowitsch PetscCall(SNESLoad(snes, viewer)); 2174ad6bc421SBarry Smith /* function and Jacobian context for SNES when used with TS is always ts object */ 21759566063dSJacob Faibussowitsch PetscCall(SNESSetFunction(snes, NULL, NULL, ts)); 21769566063dSJacob Faibussowitsch PetscCall(SNESSetJacobian(snes, NULL, NULL, NULL, ts)); 21773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2178f2c2a1b9SBarry Smith } 2179f2c2a1b9SBarry Smith 21808a381b04SJed Brown /*@C 2181bcf0153eSBarry Smith TSARKIMEXSetType - Set the type of `TSARKIMEX` scheme 21828a381b04SJed Brown 218320f4b53cSBarry Smith Logically Collective 21848a381b04SJed Brown 2185d8d19677SJose E. Roman Input Parameters: 21868a381b04SJed Brown + ts - timestepping context 2187bcf0153eSBarry Smith - arktype - type of `TSARKIMEX` scheme 21888a381b04SJed Brown 2189bcf0153eSBarry Smith Options Database Key: 2190bcf0153eSBarry Smith . -ts_arkimex_type <1bee,a2,l2,ars122,2c,2d,2e,prssp2,3,bpr3,ars443,4,5> - set `TSARKIMEX` scheme type 21919bd3e852SBarry Smith 21928a381b04SJed Brown Level: intermediate 21938a381b04SJed Brown 21941cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEX1BEE`, `TSARKIMEXA2`, `TSARKIMEXL2`, `TSARKIMEXARS122`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEXPRSSP2`, 2195db781477SPatrick Sanan `TSARKIMEX3`, `TSARKIMEXBPR3`, `TSARKIMEXARS443`, `TSARKIMEX4`, `TSARKIMEX5` 21968a381b04SJed Brown @*/ 2197d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetType(TS ts, TSARKIMEXType arktype) 2198d71ae5a4SJacob Faibussowitsch { 21998a381b04SJed Brown PetscFunctionBegin; 22008a381b04SJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22014f572ea9SToby Isaac PetscAssertPointer(arktype, 2); 2202cac4c232SBarry Smith PetscTryMethod(ts, "TSARKIMEXSetType_C", (TS, TSARKIMEXType), (ts, arktype)); 22033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22048a381b04SJed Brown } 22058a381b04SJed Brown 22068a381b04SJed Brown /*@C 2207bcf0153eSBarry Smith TSARKIMEXGetType - Get the type of `TSARKIMEX` scheme 22088a381b04SJed Brown 220920f4b53cSBarry Smith Logically Collective 22108a381b04SJed Brown 22118a381b04SJed Brown Input Parameter: 22128a381b04SJed Brown . ts - timestepping context 22138a381b04SJed Brown 22148a381b04SJed Brown Output Parameter: 2215bcf0153eSBarry Smith . arktype - type of `TSARKIMEX` scheme 22168a381b04SJed Brown 22178a381b04SJed Brown Level: intermediate 22188a381b04SJed Brown 221942747ad1SJacob Faibussowitsch .seealso: [](ch_ts), `TSARKIMEXc` 22208a381b04SJed Brown @*/ 2221d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetType(TS ts, TSARKIMEXType *arktype) 2222d71ae5a4SJacob Faibussowitsch { 22238a381b04SJed Brown PetscFunctionBegin; 22248a381b04SJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2225cac4c232SBarry Smith PetscUseMethod(ts, "TSARKIMEXGetType_C", (TS, TSARKIMEXType *), (ts, arktype)); 22263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22278a381b04SJed Brown } 22288a381b04SJed Brown 222916353aafSBarry Smith /*@ 2230bcf0153eSBarry Smith TSARKIMEXSetFullyImplicit - Solve both parts of the equation implicitly, including the part that is normally solved explicitly 22314cc180ffSJed Brown 223220f4b53cSBarry Smith Logically Collective 22334cc180ffSJed Brown 2234d8d19677SJose E. Roman Input Parameters: 22354cc180ffSJed Brown + ts - timestepping context 2236bcf0153eSBarry Smith - flg - `PETSC_TRUE` for fully implicit 22374cc180ffSJed Brown 22384cc180ffSJed Brown Level: intermediate 22394cc180ffSJed Brown 22401cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXGetType()`, `TSARKIMEXGetFullyImplicit()` 22414cc180ffSJed Brown @*/ 2242d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetFullyImplicit(TS ts, PetscBool flg) 2243d71ae5a4SJacob Faibussowitsch { 22444cc180ffSJed Brown PetscFunctionBegin; 22454cc180ffSJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22463a28c0e5SStefano Zampini PetscValidLogicalCollectiveBool(ts, flg, 2); 2247cac4c232SBarry Smith PetscTryMethod(ts, "TSARKIMEXSetFullyImplicit_C", (TS, PetscBool), (ts, flg)); 22483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22494cc180ffSJed Brown } 22504cc180ffSJed Brown 22513a28c0e5SStefano Zampini /*@ 22523a28c0e5SStefano Zampini TSARKIMEXGetFullyImplicit - Inquires if both parts of the equation are solved implicitly 22533a28c0e5SStefano Zampini 225420f4b53cSBarry Smith Logically Collective 22553a28c0e5SStefano Zampini 22563a28c0e5SStefano Zampini Input Parameter: 22573a28c0e5SStefano Zampini . ts - timestepping context 22583a28c0e5SStefano Zampini 22597a7aea1fSJed Brown Output Parameter: 2260bcf0153eSBarry Smith . flg - `PETSC_TRUE` for fully implicit 22613a28c0e5SStefano Zampini 22623a28c0e5SStefano Zampini Level: intermediate 22633a28c0e5SStefano Zampini 22641cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()` 22653a28c0e5SStefano Zampini @*/ 2266d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetFullyImplicit(TS ts, PetscBool *flg) 2267d71ae5a4SJacob Faibussowitsch { 22683a28c0e5SStefano Zampini PetscFunctionBegin; 22693a28c0e5SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22704f572ea9SToby Isaac PetscAssertPointer(flg, 2); 2271cac4c232SBarry Smith PetscUseMethod(ts, "TSARKIMEXGetFullyImplicit_C", (TS, PetscBool *), (ts, flg)); 22723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22733a28c0e5SStefano Zampini } 22743a28c0e5SStefano Zampini 2275d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetType_ARKIMEX(TS ts, TSARKIMEXType *arktype) 2276d71ae5a4SJacob Faibussowitsch { 22778a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 22788a381b04SJed Brown 22798a381b04SJed Brown PetscFunctionBegin; 22808a381b04SJed Brown *arktype = ark->tableau->name; 22813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22828a381b04SJed Brown } 2283d27334e2SStefano Zampini 2284d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetType_ARKIMEX(TS ts, TSARKIMEXType arktype) 2285d71ae5a4SJacob Faibussowitsch { 22868a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 22878a381b04SJed Brown PetscBool match; 22888a381b04SJed Brown ARKTableauLink link; 22898a381b04SJed Brown 22908a381b04SJed Brown PetscFunctionBegin; 22918a381b04SJed Brown if (ark->tableau) { 22929566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(ark->tableau->name, arktype, &match)); 22933ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 22948a381b04SJed Brown } 22958a381b04SJed Brown for (link = ARKTableauList; link; link = link->next) { 22969566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(link->tab.name, arktype, &match)); 22978a381b04SJed Brown if (match) { 22989566063dSJacob Faibussowitsch if (ts->setupcalled) PetscCall(TSARKIMEXTableauReset(ts)); 22998a381b04SJed Brown ark->tableau = &link->tab; 23009566063dSJacob Faibussowitsch if (ts->setupcalled) PetscCall(TSARKIMEXTableauSetUp(ts)); 23012ffb9264SLisandro Dalcin ts->default_adapt_type = ark->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE; 23023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23038a381b04SJed Brown } 23048a381b04SJed Brown } 230598921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", arktype); 23068a381b04SJed Brown } 2307e0877f53SBarry Smith 2308d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetFullyImplicit_ARKIMEX(TS ts, PetscBool flg) 2309d71ae5a4SJacob Faibussowitsch { 23104cc180ffSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23114cc180ffSJed Brown 23124cc180ffSJed Brown PetscFunctionBegin; 23134cc180ffSJed Brown ark->imex = (PetscBool)!flg; 23143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23154cc180ffSJed Brown } 23168a381b04SJed Brown 2317d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetFullyImplicit_ARKIMEX(TS ts, PetscBool *flg) 2318d71ae5a4SJacob Faibussowitsch { 23193a28c0e5SStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23203a28c0e5SStefano Zampini 23213a28c0e5SStefano Zampini PetscFunctionBegin; 23223a28c0e5SStefano Zampini *flg = (PetscBool)!ark->imex; 23233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23243a28c0e5SStefano Zampini } 23253a28c0e5SStefano Zampini 2326d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSDestroy_ARKIMEX(TS ts) 2327d71ae5a4SJacob Faibussowitsch { 2328b3a6b972SJed Brown PetscFunctionBegin; 23299566063dSJacob Faibussowitsch PetscCall(TSReset_ARKIMEX(ts)); 2330b3a6b972SJed Brown if (ts->dm) { 23319566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts)); 23329566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts)); 2333b3a6b972SJed Brown } 23349566063dSJacob Faibussowitsch PetscCall(PetscFree(ts->data)); 2335d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", NULL)); 2336d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", NULL)); 23379566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", NULL)); 23389566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", NULL)); 23399566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", NULL)); 23402e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", NULL)); 23413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2342b3a6b972SJed Brown } 2343b3a6b972SJed Brown 23448a381b04SJed Brown /* ------------------------------------------------------------ */ 23458a381b04SJed Brown /*MC 2346c79dcfbdSBarry Smith TSARKIMEX - ODE and DAE solver using additive Runge-Kutta IMEX schemes 23478a381b04SJed Brown 2348fca742c7SJed Brown These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly 2349fca742c7SJed Brown nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part 2350bcf0153eSBarry Smith of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`. 2351d0685a90SJed Brown 23528a381b04SJed Brown Level: beginner 23538a381b04SJed Brown 2354bcf0153eSBarry Smith Notes: 2355bcf0153eSBarry Smith The default is `TSARKIMEX3`, it can be changed with `TSARKIMEXSetType()` or -ts_arkimex_type 23568a381b04SJed Brown 2357bcf0153eSBarry Smith If the equation is implicit or a DAE, then `TSSetEquationType()` needs to be set accordingly. Refer to the manual for further information. 2358bcf0153eSBarry Smith 2359bcf0153eSBarry Smith Methods with an explicit stage can only be used with ODE in which the stiff part G(t,X,Xdot) has the form Xdot + Ghat(t,X). 2360bcf0153eSBarry Smith 2361bcf0153eSBarry Smith Consider trying `TSROSW` if the stiff part is linear or weakly nonlinear. 2362bcf0153eSBarry Smith 23631cc06b55SBarry Smith .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSARKIMEXSetType()`, `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`, `TSARKIMEXGetFullyImplicit()`, 2364bcf0153eSBarry Smith `TSARKIMEX1BEE`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEX3`, `TSARKIMEXL2`, `TSARKIMEXA2`, `TSARKIMEXARS122`, 2365bcf0153eSBarry Smith `TSARKIMEX4`, `TSARKIMEX5`, `TSARKIMEXPRSSP2`, `TSARKIMEXARS443`, `TSARKIMEXBPR3`, `TSARKIMEXType`, `TSARKIMEXRegister()`, `TSType` 23668a381b04SJed Brown M*/ 2367d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSCreate_ARKIMEX(TS ts) 2368d71ae5a4SJacob Faibussowitsch { 236980ab5e31SHong Zhang TS_ARKIMEX *ark; 2370d27334e2SStefano Zampini PetscBool dirk; 23718a381b04SJed Brown 23728a381b04SJed Brown PetscFunctionBegin; 23739566063dSJacob Faibussowitsch PetscCall(TSARKIMEXInitializePackage()); 2374d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 23758a381b04SJed Brown 23768a381b04SJed Brown ts->ops->reset = TSReset_ARKIMEX; 237780ab5e31SHong Zhang ts->ops->adjointreset = TSAdjointReset_ARKIMEX; 23788a381b04SJed Brown ts->ops->destroy = TSDestroy_ARKIMEX; 23798a381b04SJed Brown ts->ops->view = TSView_ARKIMEX; 2380f2c2a1b9SBarry Smith ts->ops->load = TSLoad_ARKIMEX; 23818a381b04SJed Brown ts->ops->setup = TSSetUp_ARKIMEX; 238280ab5e31SHong Zhang ts->ops->adjointsetup = TSAdjointSetUp_ARKIMEX; 23838a381b04SJed Brown ts->ops->step = TSStep_ARKIMEX; 2384cd652676SJed Brown ts->ops->interpolate = TSInterpolate_ARKIMEX; 2385108c343cSJed Brown ts->ops->evaluatestep = TSEvaluateStep_ARKIMEX; 238624655328SShri ts->ops->rollback = TSRollBack_ARKIMEX; 23878a381b04SJed Brown ts->ops->setfromoptions = TSSetFromOptions_ARKIMEX; 23888a381b04SJed Brown ts->ops->snesfunction = SNESTSFormFunction_ARKIMEX; 23898a381b04SJed Brown ts->ops->snesjacobian = SNESTSFormJacobian_ARKIMEX; 239080ab5e31SHong Zhang ts->ops->getstages = TSGetStages_ARKIMEX; 239180ab5e31SHong Zhang ts->ops->adjointstep = TSAdjointStep_ARKIMEX; 23928a381b04SJed Brown 2393efd4aadfSBarry Smith ts->usessnes = PETSC_TRUE; 2394efd4aadfSBarry Smith 239580ab5e31SHong Zhang PetscCall(PetscNew(&ark)); 239680ab5e31SHong Zhang ts->data = (void *)ark; 2397d27334e2SStefano Zampini ark->imex = dirk ? PETSC_FALSE : PETSC_TRUE; 239880ab5e31SHong Zhang 239980ab5e31SHong Zhang ark->VecsDeltaLam = NULL; 240080ab5e31SHong Zhang ark->VecsSensiTemp = NULL; 240180ab5e31SHong Zhang ark->VecsSensiPTemp = NULL; 24028a381b04SJed Brown 24039566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", TSARKIMEXGetType_ARKIMEX)); 2404d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", TSARKIMEXGetFullyImplicit_ARKIMEX)); 2405d27334e2SStefano Zampini if (!dirk) { 24069566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", TSARKIMEXSetType_ARKIMEX)); 24079566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", TSARKIMEXSetFullyImplicit_ARKIMEX)); 24089566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetType(ts, TSARKIMEXDefault)); 2409d27334e2SStefano Zampini } 2410d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2411d27334e2SStefano Zampini } 2412d27334e2SStefano Zampini 2413d27334e2SStefano Zampini /* ------------------------------------------------------------ */ 2414d27334e2SStefano Zampini 2415d27334e2SStefano Zampini static PetscErrorCode TSDIRKSetType_DIRK(TS ts, TSDIRKType dirktype) 2416d27334e2SStefano Zampini { 2417d27334e2SStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2418d27334e2SStefano Zampini 2419d27334e2SStefano Zampini PetscFunctionBegin; 2420d27334e2SStefano Zampini PetscCall(TSARKIMEXSetType_ARKIMEX(ts, dirktype)); 2421d27334e2SStefano Zampini PetscCheck(!ark->tableau->additive, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONG, "Method \"%s\" is not DIRK", dirktype); 2422d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2423d27334e2SStefano Zampini } 2424d27334e2SStefano Zampini 2425d27334e2SStefano Zampini /*@C 2426d27334e2SStefano Zampini TSDIRKSetType - Set the type of `TSDIRK` scheme 2427d27334e2SStefano Zampini 2428d27334e2SStefano Zampini Logically Collective 2429d27334e2SStefano Zampini 2430d27334e2SStefano Zampini Input Parameters: 2431d27334e2SStefano Zampini + ts - timestepping context 2432d27334e2SStefano Zampini - dirktype - type of `TSDIRK` scheme 2433d27334e2SStefano Zampini 2434d27334e2SStefano Zampini Options Database Key: 2435d27334e2SStefano Zampini . -ts_dirkimex_type - set `TSDIRK` scheme type 2436d27334e2SStefano Zampini 2437d27334e2SStefano Zampini Level: intermediate 2438d27334e2SStefano Zampini 2439d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKGetType()`, `TSDIRK`, `TSDIRKType` 2440d27334e2SStefano Zampini @*/ 2441d27334e2SStefano Zampini PetscErrorCode TSDIRKSetType(TS ts, TSDIRKType dirktype) 2442d27334e2SStefano Zampini { 2443d27334e2SStefano Zampini PetscFunctionBegin; 2444d27334e2SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2445d27334e2SStefano Zampini PetscAssertPointer(dirktype, 2); 2446d27334e2SStefano Zampini PetscTryMethod(ts, "TSDIRKSetType_C", (TS, TSDIRKType), (ts, dirktype)); 2447d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2448d27334e2SStefano Zampini } 2449d27334e2SStefano Zampini 2450d27334e2SStefano Zampini /*@C 2451d27334e2SStefano Zampini TSDIRKGetType - Get the type of `TSDIRK` scheme 2452d27334e2SStefano Zampini 2453d27334e2SStefano Zampini Logically Collective 2454d27334e2SStefano Zampini 2455d27334e2SStefano Zampini Input Parameter: 2456d27334e2SStefano Zampini . ts - timestepping context 2457d27334e2SStefano Zampini 2458d27334e2SStefano Zampini Output Parameter: 2459d27334e2SStefano Zampini . dirktype - type of `TSDIRK` scheme 2460d27334e2SStefano Zampini 2461d27334e2SStefano Zampini Level: intermediate 2462d27334e2SStefano Zampini 2463d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKSetType()` 2464d27334e2SStefano Zampini @*/ 2465d27334e2SStefano Zampini PetscErrorCode TSDIRKGetType(TS ts, TSDIRKType *dirktype) 2466d27334e2SStefano Zampini { 2467d27334e2SStefano Zampini PetscFunctionBegin; 2468d27334e2SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2469d27334e2SStefano Zampini PetscUseMethod(ts, "TSDIRKGetType_C", (TS, TSDIRKType *), (ts, dirktype)); 2470d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2471d27334e2SStefano Zampini } 2472d27334e2SStefano Zampini 2473d27334e2SStefano Zampini /*MC 24743405e92cSStefano Zampini TSDIRK - ODE and DAE solver using Diagonally implicit Runge-Kutta schemes. 2475d27334e2SStefano Zampini 2476d27334e2SStefano Zampini Level: beginner 2477d27334e2SStefano Zampini 2478d27334e2SStefano Zampini Notes: 24793405e92cSStefano Zampini The default is `TSDIRKES213SAL`, it can be changed with `TSDIRKSetType()` or -ts_dirk_type. 24803405e92cSStefano Zampini The convention used in PETSc to name the DIRK methods is TSDIRK[E][S]PQS[SA][L][A] with: 24813405e92cSStefano Zampini + E - whether the method has an explicit first stage 24823405e92cSStefano Zampini . S - whether the method is single diagonal 24833405e92cSStefano Zampini . P - order of the advancing method 24843405e92cSStefano Zampini . Q - order of the embedded method 24853405e92cSStefano Zampini . S - number of stages 24863405e92cSStefano Zampini . SA - whether the method is stiffly accurate 24873405e92cSStefano Zampini . L - whether the method is L-stable 24883405e92cSStefano Zampini - A - whether the method is A-stable 2489d27334e2SStefano Zampini 2490d27334e2SStefano Zampini .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSDIRKSetType()`, `TSDIRKGetType()`, `TSDIRKRegister()`. 2491d27334e2SStefano Zampini M*/ 2492d27334e2SStefano Zampini PETSC_EXTERN PetscErrorCode TSCreate_DIRK(TS ts) 2493d27334e2SStefano Zampini { 2494d27334e2SStefano Zampini PetscFunctionBegin; 2495d27334e2SStefano Zampini PetscCall(TSCreate_ARKIMEX(ts)); 2496d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", TSARKIMEXGetType_ARKIMEX)); 2497d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", TSDIRKSetType_DIRK)); 2498d27334e2SStefano Zampini PetscCall(TSDIRKSetType(ts, TSDIRKDefault)); 24993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 25008a381b04SJed Brown } 2501