xref: /petsc/src/ts/impls/arkimex/arkimex.c (revision cc4c1da905d89950b196b027190941013bd3e15a)
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 
14915229ffcSPierre Jolivet      This method has one explicit stage and two implicit stages. It 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 {
4598434afd1SBarry 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 
1123*cc4c1da9SBarry Smith   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 TSStep_ARKIMEX(TS ts)
1373d71ae5a4SJacob Faibussowitsch {
13748a381b04SJed Brown   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
13758a381b04SJed Brown   ARKTableau       tab = ark->tableau;
13768a381b04SJed Brown   const PetscInt   s   = tab->s;
137724655328SShri   const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c;
1378406d0ec2SJed Brown   PetscScalar     *w = ark->work;
13791297b224SEmil Constantinescu   Vec             *Y = ark->Y, *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS, Ydot = ark->Ydot, Ydot0 = ark->Ydot0, Z = ark->Z;
138096400bd6SLisandro Dalcin   PetscBool        extrapolate = ark->extrapolate;
1381108c343cSJed Brown   TSAdapt          adapt;
13828a381b04SJed Brown   SNES             snes;
1383fecfb714SLisandro Dalcin   PetscInt         i, j, its, lits;
1384be5899b3SLisandro Dalcin   PetscInt         rejections = 0;
1385d27334e2SStefano Zampini   PetscBool        hasE = PETSC_FALSE, dirk = (PetscBool)(!tab->additive), stageok, accept = PETSC_TRUE;
138696400bd6SLisandro Dalcin   PetscReal        next_time_step = ts->time_step;
13878a381b04SJed Brown 
13888a381b04SJed Brown   PetscFunctionBegin;
138996400bd6SLisandro Dalcin   if (ark->extrapolate && !ark->Y_prev) {
13909566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev));
13919566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev));
1392d27334e2SStefano Zampini     if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev));
139396400bd6SLisandro Dalcin   }
139496400bd6SLisandro Dalcin 
1395d27334e2SStefano Zampini   if (!dirk) PetscCall(TSHasRHSFunction(ts, &hasE));
1396d27334e2SStefano Zampini   if (!hasE) dirk = PETSC_TRUE;
1397d27334e2SStefano Zampini 
139896400bd6SLisandro Dalcin   if (!ts->steprollback) {
1399d27334e2SStefano Zampini     if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { /* Save the initial slope for the next step */
14009566063dSJacob Faibussowitsch       PetscCall(VecCopy(YdotI[s - 1], Ydot0));
140196400bd6SLisandro Dalcin     }
1402fecfb714SLisandro Dalcin     if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initial guess */
140396400bd6SLisandro Dalcin       for (i = 0; i < s; i++) {
14049566063dSJacob Faibussowitsch         PetscCall(VecCopy(Y[i], ark->Y_prev[i]));
14059566063dSJacob Faibussowitsch         PetscCall(VecCopy(YdotI[i], ark->YdotI_prev[i]));
1406d27334e2SStefano Zampini         if (tab->additive && hasE) PetscCall(VecCopy(YdotRHS[i], ark->YdotRHS_prev[i]));
140796400bd6SLisandro Dalcin       }
140896400bd6SLisandro Dalcin     }
140996400bd6SLisandro Dalcin   }
141096400bd6SLisandro Dalcin 
14113b98415fSStefano Zampini   /*
14123b98415fSStefano Zampini      For fully implicit formulations we must solve the equations
14133b98415fSStefano Zampini 
14143b98415fSStefano Zampini        F(t_n,x_n,xdot) = 0
14153b98415fSStefano Zampini 
14163b98415fSStefano Zampini      for the explicit first stage.
14173b98415fSStefano Zampini      Here we call SNESSolve using PETSC_MAX_REAL as shift to flag it.
14183b98415fSStefano Zampini      Special handling is inside SNESTSFormFunction_ARKIMEX and SNESTSFormJacobian_ARKIMEX
14193b98415fSStefano Zampini   */
1420d27334e2SStefano Zampini   if (dirk && tab->explicit_first_stage && ts->steprestart) {
142198940a98SHong Zhang     ark->scoeff = PETSC_MAX_REAL;
1422d27334e2SStefano Zampini     PetscCall(VecCopy(ts->vec_sol, Z));
1423d27334e2SStefano Zampini     PetscCall(TSGetSNES(ts, &snes));
1424d27334e2SStefano Zampini     PetscCall(SNESSolve(snes, NULL, Ydot0));
1425d27334e2SStefano Zampini   }
1426d27334e2SStefano Zampini 
1427d27334e2SStefano Zampini   /* For IMEX we compute a step */
1428d27334e2SStefano Zampini   if (!dirk && ts->equation_type >= TS_EQ_IMPLICIT && tab->explicit_first_stage && ts->steprestart) {
142996400bd6SLisandro Dalcin     TS ts_start;
1430d27334e2SStefano Zampini     if (PetscDefined(USE_DEBUG) && hasE) {
1431c79dcfbdSBarry Smith       PetscBool id = PETSC_FALSE;
14329566063dSJacob Faibussowitsch       PetscCall(TSARKIMEXTestMassIdentity(ts, &id));
14338434afd1SBarry 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");
1434c79dcfbdSBarry Smith     }
14359566063dSJacob Faibussowitsch     PetscCall(TSClone(ts, &ts_start));
14369566063dSJacob Faibussowitsch     PetscCall(TSSetSolution(ts_start, ts->vec_sol));
14379566063dSJacob Faibussowitsch     PetscCall(TSSetTime(ts_start, ts->ptime));
14389566063dSJacob Faibussowitsch     PetscCall(TSSetMaxSteps(ts_start, ts->steps + 1));
14399566063dSJacob Faibussowitsch     PetscCall(TSSetMaxTime(ts_start, ts->ptime + ts->time_step));
14409566063dSJacob Faibussowitsch     PetscCall(TSSetExactFinalTime(ts_start, TS_EXACTFINALTIME_STEPOVER));
14419566063dSJacob Faibussowitsch     PetscCall(TSSetTimeStep(ts_start, ts->time_step));
14429566063dSJacob Faibussowitsch     PetscCall(TSSetType(ts_start, TSARKIMEX));
14439566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetFullyImplicit(ts_start, PETSC_TRUE));
14449566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetType(ts_start, TSARKIMEX1BEE));
144534561852SEmil Constantinescu 
14469566063dSJacob Faibussowitsch     PetscCall(TSRestartStep(ts_start));
14479566063dSJacob Faibussowitsch     PetscCall(TSSolve(ts_start, ts->vec_sol));
14489566063dSJacob Faibussowitsch     PetscCall(TSGetTime(ts_start, &ts->ptime));
14499566063dSJacob Faibussowitsch     PetscCall(TSGetTimeStep(ts_start, &ts->time_step));
1450bbd56ea5SKarl Rupp 
145185fc7851SLisandro Dalcin     { /* Save the initial slope for the next step */
145285fc7851SLisandro Dalcin       TS_ARKIMEX *ark_start = (TS_ARKIMEX *)ts_start->data;
14539566063dSJacob Faibussowitsch       PetscCall(VecCopy(ark_start->YdotI[ark_start->tableau->s - 1], Ydot0));
145485fc7851SLisandro Dalcin     }
145596400bd6SLisandro Dalcin     ts->steps++;
145634561852SEmil Constantinescu 
1457d15a3a53SEmil Constantinescu     /* Set the correct TS in SNES */
1458d15a3a53SEmil Constantinescu     /* We'll try to bypass this by changing the method on the fly */
145996400bd6SLisandro Dalcin     {
14609566063dSJacob Faibussowitsch       PetscCall(TSGetSNES(ts, &snes));
14619566063dSJacob Faibussowitsch       PetscCall(TSSetSNES(ts, snes));
146296400bd6SLisandro Dalcin     }
14639566063dSJacob Faibussowitsch     PetscCall(TSDestroy(&ts_start));
1464e817cc15SEmil Constantinescu   }
1465e817cc15SEmil Constantinescu 
1466108c343cSJed Brown   ark->status = TS_STEP_INCOMPLETE;
146796400bd6SLisandro Dalcin   while (!ts->reason && ark->status != TS_STEP_COMPLETE) {
146896400bd6SLisandro Dalcin     PetscReal t = ts->ptime;
1469108c343cSJed Brown     PetscReal h = ts->time_step;
14708a381b04SJed Brown     for (i = 0; i < s; i++) {
14719be3e283SDebojyoti Ghosh       ark->stage_time = t + h * ct[i];
14729566063dSJacob Faibussowitsch       PetscCall(TSPreStage(ts, ark->stage_time));
14738a381b04SJed Brown       if (At[i * s + i] == 0) { /* This stage is explicit */
14743c633725SBarry 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");
14759566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, Y[i]));
1476e817cc15SEmil Constantinescu         for (j = 0; j < i; j++) w[j] = h * At[i * s + j];
14779566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(Y[i], i, w, YdotI));
1478d27334e2SStefano Zampini         if (tab->additive && hasE) {
14798a381b04SJed Brown           for (j = 0; j < i; j++) w[j] = h * A[i * s + j];
14809566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(Y[i], i, w, YdotRHS));
1481d27334e2SStefano Zampini         }
14828a381b04SJed Brown       } else {
1483b296d7d5SJed Brown         ark->scoeff = 1. / At[i * s + i];
14848a381b04SJed Brown         /* Ydot = shift*(Y-Z) */
14859566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, Z));
1486e817cc15SEmil Constantinescu         for (j = 0; j < i; j++) w[j] = h * At[i * s + j];
14879566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(Z, i, w, YdotI));
1488d27334e2SStefano Zampini         if (tab->additive && hasE) {
1489c58d1302SEmil Constantinescu           for (j = 0; j < i; j++) w[j] = h * A[i * s + j];
14909566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(Z, i, w, YdotRHS));
1491d27334e2SStefano Zampini         }
1492fecfb714SLisandro Dalcin         if (extrapolate && !ts->steprestart) {
149356dcabbaSDebojyoti Ghosh           /* Initial guess extrapolated from previous time step stage values */
14949566063dSJacob Faibussowitsch           PetscCall(TSExtrapolate_ARKIMEX(ts, c[i], Y[i]));
149556dcabbaSDebojyoti Ghosh         } else {
14968a381b04SJed Brown           /* Initial guess taken from last stage */
14979566063dSJacob Faibussowitsch           PetscCall(VecCopy(i > 0 ? Y[i - 1] : ts->vec_sol, Y[i]));
149856dcabbaSDebojyoti Ghosh         }
14999566063dSJacob Faibussowitsch         PetscCall(TSGetSNES(ts, &snes));
15009566063dSJacob Faibussowitsch         PetscCall(SNESSolve(snes, NULL, Y[i]));
15019566063dSJacob Faibussowitsch         PetscCall(SNESGetIterationNumber(snes, &its));
15029566063dSJacob Faibussowitsch         PetscCall(SNESGetLinearSolveIterations(snes, &lits));
15039371c9d4SSatish Balay         ts->snes_its += its;
15049371c9d4SSatish Balay         ts->ksp_its += lits;
15059566063dSJacob Faibussowitsch         PetscCall(TSGetAdapt(ts, &adapt));
15069566063dSJacob Faibussowitsch         PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok));
150796400bd6SLisandro Dalcin         if (!stageok) {
15081be93e3eSJed Brown           /* We are likely rejecting the step because of solver or function domain problems so we should not attempt to
15091be93e3eSJed Brown            * use extrapolation to initialize the solves on the next attempt. */
151096400bd6SLisandro Dalcin           extrapolate = PETSC_FALSE;
15111be93e3eSJed Brown           goto reject_step;
15121be93e3eSJed Brown         }
15138a381b04SJed Brown       }
1514d27334e2SStefano Zampini       if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) {
1515e817cc15SEmil Constantinescu         if (i == 0 && tab->explicit_first_stage) {
1516d27334e2SStefano 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",
1517d27334e2SStefano Zampini                      ((PetscObject)ts)->type_name, ark->tableau->name);
15189566063dSJacob Faibussowitsch           PetscCall(VecCopy(Ydot0, YdotI[0])); /* YdotI = YdotI(tn-1) */
1519e817cc15SEmil Constantinescu         } else {
15209566063dSJacob Faibussowitsch           PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */
1521e817cc15SEmil Constantinescu         }
1522e817cc15SEmil Constantinescu       } else {
15235eca1a21SEmil Constantinescu         if (i == 0 && tab->explicit_first_stage) {
15249566063dSJacob Faibussowitsch           PetscCall(VecZeroEntries(Ydot));
15259566063dSJacob Faibussowitsch           PetscCall(TSComputeIFunction(ts, t + h * ct[i], Y[i], Ydot, YdotI[i], ark->imex)); /* YdotI = -G(t,Y,0)   */
15269566063dSJacob Faibussowitsch           PetscCall(VecScale(YdotI[i], -1.0));
15275eca1a21SEmil Constantinescu         } else {
15289566063dSJacob Faibussowitsch           PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */
15295eca1a21SEmil Constantinescu         }
1530d27334e2SStefano Zampini         if (hasE) {
15314cc180ffSJed Brown           if (ark->imex) {
15329566063dSJacob Faibussowitsch             PetscCall(TSComputeRHSFunction(ts, t + h * c[i], Y[i], YdotRHS[i]));
15334cc180ffSJed Brown           } else {
15349566063dSJacob Faibussowitsch             PetscCall(VecZeroEntries(YdotRHS[i]));
15354cc180ffSJed Brown           }
15368a381b04SJed Brown         }
1537d27334e2SStefano Zampini       }
15389566063dSJacob Faibussowitsch       PetscCall(TSPostStage(ts, ark->stage_time, i, Y));
1539e817cc15SEmil Constantinescu     }
154096400bd6SLisandro Dalcin 
1541be5899b3SLisandro Dalcin     ark->status = TS_STEP_INCOMPLETE;
15429566063dSJacob Faibussowitsch     PetscCall(TSEvaluateStep_ARKIMEX(ts, tab->order, ts->vec_sol, NULL));
1543108c343cSJed Brown     ark->status = TS_STEP_PENDING;
15449566063dSJacob Faibussowitsch     PetscCall(TSGetAdapt(ts, &adapt));
15459566063dSJacob Faibussowitsch     PetscCall(TSAdaptCandidatesClear(adapt));
15469566063dSJacob Faibussowitsch     PetscCall(TSAdaptCandidateAdd(adapt, tab->name, tab->order, 1, tab->ccfl, (PetscReal)tab->s, PETSC_TRUE));
15479566063dSJacob Faibussowitsch     PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept));
154896400bd6SLisandro Dalcin     ark->status = accept ? TS_STEP_COMPLETE : TS_STEP_INCOMPLETE;
154996400bd6SLisandro Dalcin     if (!accept) { /* Roll back the current step */
1550c61711c8SStefano Zampini       PetscCall(VecCopy(ts->vec_sol0, ts->vec_sol));
1551be5899b3SLisandro Dalcin       ts->time_step = next_time_step;
1552be5899b3SLisandro Dalcin       goto reject_step;
155396400bd6SLisandro Dalcin     }
155496400bd6SLisandro Dalcin 
15558a381b04SJed Brown     ts->ptime += ts->time_step;
1556cdbf8f93SLisandro Dalcin     ts->time_step = next_time_step;
1557108c343cSJed Brown     break;
155896400bd6SLisandro Dalcin 
155996400bd6SLisandro Dalcin   reject_step:
15609371c9d4SSatish Balay     ts->reject++;
15619371c9d4SSatish Balay     accept = PETSC_FALSE;
1562be5899b3SLisandro Dalcin     if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) {
156396400bd6SLisandro Dalcin       ts->reason = TS_DIVERGED_STEP_REJECTED;
156463a3b9bcSJacob Faibussowitsch       PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than current TS allowed, stopping solve\n", ts->steps, rejections));
1565108c343cSJed Brown     }
1566f85781f1SEmil Constantinescu   }
15673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
15688a381b04SJed Brown }
1569d27334e2SStefano Zampini 
157080ab5e31SHong Zhang /*
157180ab5e31SHong Zhang   This adjoint step function assumes the partitioned ODE system has an identity mass matrix and thus can be represented in the form
157280ab5e31SHong Zhang   Udot = H(t,U) + G(t,U)
157380ab5e31SHong Zhang   This corresponds to F(t,U,Udot) = Udot-H(t,U).
157480ab5e31SHong Zhang 
157580ab5e31SHong Zhang   The complete adjoint equations are
157680ab5e31SHong Zhang   (shift*I - dHdu) lambda_s[i]   = 1/at[i][i] (
15775d7a6ebeSHong Zhang     dGdU (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j])
15785d7a6ebeSHong Zhang     + dHdU (bt[i] lambda_{n+1} +  \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0
157980ab5e31SHong Zhang   lambda_n = lambda_{n+1} + \sum_{j=1}^s lambda_s[j]
158080ab5e31SHong Zhang   mu_{n+1}[i]   = h (at[i][i] dHdP lambda_s[i]
15815d7a6ebeSHong Zhang     + dGdP (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j])
15825d7a6ebeSHong Zhang     + dHdP (bt[i] lambda_{n+1} + \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0
158380ab5e31SHong Zhang   mu_n = mu_{n+1} + \sum_{j=1}^s mu_{n+1}[j]
158480ab5e31SHong Zhang   where shift = 1/(at[i][i]*h)
158580ab5e31SHong Zhang 
158680ab5e31SHong Zhang   If at[i][i] is 0, the first equation falls back to
158780ab5e31SHong Zhang   lambda_s[i] = h (
158880ab5e31SHong Zhang     (b_i dGdU + bt[i] dHdU) lambda_{n+1} + dGdU \sum_{j=i+1}^s a[j][i] lambda_s[j]
158980ab5e31SHong Zhang     + dHdU \sum_{j=i+1}^s at[j][i] lambda_s[j])
159080ab5e31SHong Zhang 
159180ab5e31SHong Zhang */
159280ab5e31SHong Zhang static PetscErrorCode TSAdjointStep_ARKIMEX(TS ts)
159380ab5e31SHong Zhang {
159480ab5e31SHong Zhang   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
159580ab5e31SHong Zhang   ARKTableau       tab = ark->tableau;
159680ab5e31SHong Zhang   const PetscInt   s   = tab->s;
159780ab5e31SHong Zhang   const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c, *b = tab->b, *bt = tab->bt;
159880ab5e31SHong Zhang   PetscScalar     *w = ark->work;
159980ab5e31SHong Zhang   Vec             *Y = ark->Y, Ydot = ark->Ydot, *VecsDeltaLam = ark->VecsDeltaLam, *VecsSensiTemp = ark->VecsSensiTemp, *VecsSensiPTemp = ark->VecsSensiPTemp;
160080ab5e31SHong Zhang   Mat              Jex, Jim, Jimpre;
160180ab5e31SHong Zhang   PetscInt         i, j, nadj;
160280ab5e31SHong Zhang   PetscReal        t                 = ts->ptime, stage_time_ex;
160380ab5e31SHong Zhang   PetscReal        adjoint_time_step = -ts->time_step; /* always positive since ts->time_step is negative */
160480ab5e31SHong Zhang   KSP              ksp;
160580ab5e31SHong Zhang 
160680ab5e31SHong Zhang   PetscFunctionBegin;
160780ab5e31SHong Zhang   ark->status = TS_STEP_INCOMPLETE;
160880ab5e31SHong Zhang   PetscCall(SNESGetKSP(ts->snes, &ksp));
160980ab5e31SHong Zhang   PetscCall(TSGetRHSMats_Private(ts, &Jex, NULL));
161080ab5e31SHong Zhang   PetscCall(TSGetIJacobian(ts, &Jim, &Jimpre, NULL, NULL));
161180ab5e31SHong Zhang 
161280ab5e31SHong Zhang   for (i = s - 1; i >= 0; i--) {
161380ab5e31SHong Zhang     ark->stage_time = t - adjoint_time_step * (1.0 - ct[i]);
161480ab5e31SHong Zhang     stage_time_ex   = t - adjoint_time_step * (1.0 - c[i]);
161580ab5e31SHong Zhang     if (At[i * s + i] == 0) { // This stage is explicit
161680ab5e31SHong Zhang       ark->scoeff = 0.;
161780ab5e31SHong Zhang     } else {
161880ab5e31SHong Zhang       ark->scoeff = -1. / At[i * s + i]; // this makes shift=ark->scoeff/ts->time_step positive since ts->time_step is negative
161980ab5e31SHong Zhang     }
162080ab5e31SHong Zhang     PetscCall(TSComputeSNESJacobian(ts, Y[i], Jim, Jimpre));
162180ab5e31SHong Zhang     PetscCall(TSComputeRHSJacobian(ts, stage_time_ex, Y[i], Jex, Jex));
162280ab5e31SHong Zhang     if (ts->vecs_sensip) {
162380ab5e31SHong 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
162480ab5e31SHong Zhang       PetscCall(TSComputeRHSJacobianP(ts, stage_time_ex, Y[i], ts->Jacprhs));                                                 // get dGdP
162580ab5e31SHong Zhang     }
162680ab5e31SHong Zhang     /* Build RHS (stored in VecsDeltaLam) for first-order adjoint */
16275d7a6ebeSHong Zhang     for (nadj = 0; nadj < ts->numcost; nadj++) {
16285d7a6ebeSHong Zhang       /* build implicit part */
16295d7a6ebeSHong Zhang       PetscCall(VecSet(VecsSensiTemp[nadj], 0));
163080ab5e31SHong Zhang       if (s - i - 1 > 0) {
163180ab5e31SHong Zhang         /* Temp = -\sum_{j=i+1}^s at[j][i] lambda_s[j] */
163280ab5e31SHong Zhang         for (j = i + 1; j < s; j++) w[j - i - 1] = -At[j * s + i];
163380ab5e31SHong Zhang         PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1]));
16345d7a6ebeSHong Zhang       }
16355d7a6ebeSHong Zhang       /* Temp = Temp - bt[i] lambda_{n+1} */
16365d7a6ebeSHong Zhang       PetscCall(VecAXPY(VecsSensiTemp[nadj], -bt[i], ts->vecs_sensi[nadj]));
16375d7a6ebeSHong Zhang       if (bt[i] || s - i - 1 > 0) {
163880ab5e31SHong Zhang         /* (shift I - dHdU) Temp */
163980ab5e31SHong Zhang         PetscCall(MatMultTranspose(Jim, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i]));
164080ab5e31SHong Zhang         /* cancel out shift Temp where shift=-scoeff/h */
164180ab5e31SHong Zhang         PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], ark->scoeff / adjoint_time_step, VecsSensiTemp[nadj]));
164280ab5e31SHong Zhang         if (ts->vecs_sensip) {
164380ab5e31SHong Zhang           /* - dHdP Temp */
164480ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, VecsSensiTemp[nadj], VecsSensiPTemp[nadj]));
16455d7a6ebeSHong Zhang           /* mu_n += -h dHdP Temp */
16465d7a6ebeSHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj]));
164780ab5e31SHong Zhang         }
16485d7a6ebeSHong Zhang       } else {
16495d7a6ebeSHong Zhang         PetscCall(VecSet(VecsDeltaLam[nadj * s + i], 0)); // make sure it is initialized
16505d7a6ebeSHong Zhang       }
16515d7a6ebeSHong Zhang       /* build explicit part */
16525d7a6ebeSHong Zhang       PetscCall(VecSet(VecsSensiTemp[nadj], 0));
16535d7a6ebeSHong Zhang       if (s - i - 1 > 0) {
165480ab5e31SHong Zhang         /* Temp = \sum_{j=i+1}^s a[j][i] lambda_s[j] */
165580ab5e31SHong Zhang         for (j = i + 1; j < s; j++) w[j - i - 1] = A[j * s + i];
165680ab5e31SHong Zhang         PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1]));
16575d7a6ebeSHong Zhang       }
16585d7a6ebeSHong Zhang       /* Temp = Temp + b[i] lambda_{n+1} */
16595d7a6ebeSHong Zhang       PetscCall(VecAXPY(VecsSensiTemp[nadj], b[i], ts->vecs_sensi[nadj]));
16605d7a6ebeSHong Zhang       if (b[i] || s - i - 1 > 0) {
166180ab5e31SHong Zhang         /* dGdU Temp */
166280ab5e31SHong Zhang         PetscCall(MatMultTransposeAdd(Jex, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i]));
166380ab5e31SHong Zhang         if (ts->vecs_sensip) {
166480ab5e31SHong Zhang           /* dGdP Temp */
166580ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecsSensiPTemp[nadj]));
166680ab5e31SHong Zhang           /* mu_n += h dGdP Temp */
166780ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj]));
166880ab5e31SHong Zhang         }
166980ab5e31SHong Zhang       }
167080ab5e31SHong Zhang       /* Build LHS for first-order adjoint */
167180ab5e31SHong Zhang       if (At[i * s + i] == 0) { // This stage is explicit
167280ab5e31SHong Zhang         PetscCall(VecScale(VecsDeltaLam[nadj * s + i], adjoint_time_step));
167380ab5e31SHong Zhang       } else {
167480ab5e31SHong Zhang         KSP                ksp;
167580ab5e31SHong Zhang         KSPConvergedReason kspreason;
167680ab5e31SHong Zhang         PetscCall(SNESGetKSP(ts->snes, &ksp));
167780ab5e31SHong Zhang         PetscCall(KSPSetOperators(ksp, Jim, Jimpre));
167880ab5e31SHong Zhang         PetscCall(VecScale(VecsDeltaLam[nadj * s + i], 1. / At[i * s + i]));
167980ab5e31SHong Zhang         PetscCall(KSPSolveTranspose(ksp, VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i]));
168080ab5e31SHong Zhang         PetscCall(KSPGetConvergedReason(ksp, &kspreason));
168180ab5e31SHong Zhang         if (kspreason < 0) {
168280ab5e31SHong Zhang           ts->reason = TSADJOINT_DIVERGED_LINEAR_SOLVE;
168380ab5e31SHong 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));
168480ab5e31SHong Zhang         }
168580ab5e31SHong Zhang         if (ts->vecs_sensip) {
168680ab5e31SHong Zhang           /* -dHdP lambda_s[i] */
168780ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, VecsDeltaLam[nadj * s + i], VecsSensiPTemp[nadj]));
168880ab5e31SHong Zhang           /* mu_n += h at[i][i] dHdP lambda_s[i] */
168980ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], -At[i * s + i] * adjoint_time_step, VecsSensiPTemp[nadj]));
169080ab5e31SHong Zhang         }
169180ab5e31SHong Zhang       }
169280ab5e31SHong Zhang     }
169380ab5e31SHong Zhang   }
169480ab5e31SHong Zhang   for (j = 0; j < s; j++) w[j] = 1.0;
169580ab5e31SHong Zhang   for (nadj = 0; nadj < ts->numcost; nadj++) // no need to do this for mu's
169680ab5e31SHong Zhang     PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s]));
169780ab5e31SHong Zhang   ark->status = TS_STEP_COMPLETE;
169880ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
169980ab5e31SHong Zhang }
17008a381b04SJed Brown 
1701d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSInterpolate_ARKIMEX(TS ts, PetscReal itime, Vec X)
1702d71ae5a4SJacob Faibussowitsch {
1703cd652676SJed Brown   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
1704d27334e2SStefano Zampini   ARKTableau       tab = ark->tableau;
1705d27334e2SStefano Zampini   PetscInt         s = tab->s, pinterp = tab->pinterp, i, j;
1706108c343cSJed Brown   PetscReal        h;
1707108c343cSJed Brown   PetscReal        tt, t;
1708d27334e2SStefano Zampini   PetscScalar     *bt = ark->work, *b = ark->work + s;
1709d27334e2SStefano Zampini   const PetscReal *Bt = tab->binterpt, *B = tab->binterp;
1710cd652676SJed Brown 
1711cd652676SJed Brown   PetscFunctionBegin;
1712d27334e2SStefano 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);
1713108c343cSJed Brown   switch (ark->status) {
1714108c343cSJed Brown   case TS_STEP_INCOMPLETE:
1715108c343cSJed Brown   case TS_STEP_PENDING:
1716108c343cSJed Brown     h = ts->time_step;
1717108c343cSJed Brown     t = (itime - ts->ptime) / h;
1718108c343cSJed Brown     break;
1719108c343cSJed Brown   case TS_STEP_COMPLETE:
1720be5899b3SLisandro Dalcin     h = ts->ptime - ts->ptime_prev;
1721108c343cSJed Brown     t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */
1722108c343cSJed Brown     break;
1723d71ae5a4SJacob Faibussowitsch   default:
1724d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus");
1725108c343cSJed Brown   }
1726cd652676SJed Brown   for (i = 0; i < s; i++) bt[i] = b[i] = 0;
17274f385281SJed Brown   for (j = 0, tt = t; j < pinterp; j++, tt *= t) {
1728cd652676SJed Brown     for (i = 0; i < s; i++) {
1729c1758d98SDebojyoti Ghosh       bt[i] += h * Bt[i * pinterp + j] * tt;
1730108c343cSJed Brown       b[i] += h * B[i * pinterp + j] * tt;
1731cd652676SJed Brown     }
1732cd652676SJed Brown   }
17339566063dSJacob Faibussowitsch   PetscCall(VecCopy(ark->Y[0], X));
17349566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(X, s, bt, ark->YdotI));
1735d27334e2SStefano Zampini   if (tab->additive) {
1736d27334e2SStefano Zampini     PetscBool hasE;
1737d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1738d27334e2SStefano Zampini     if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS));
1739d27334e2SStefano Zampini   }
17403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1741cd652676SJed Brown }
1742cd652676SJed Brown 
1743d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSExtrapolate_ARKIMEX(TS ts, PetscReal c, Vec X)
1744d71ae5a4SJacob Faibussowitsch {
174556dcabbaSDebojyoti Ghosh   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
1746d27334e2SStefano Zampini   ARKTableau       tab = ark->tableau;
1747d27334e2SStefano Zampini   PetscInt         s = tab->s, pinterp = tab->pinterp, i, j;
1748be5899b3SLisandro Dalcin   PetscReal        h, h_prev, t, tt;
1749d27334e2SStefano Zampini   PetscScalar     *bt = ark->work, *b = ark->work + s;
1750d27334e2SStefano Zampini   const PetscReal *Bt = tab->binterpt, *B = tab->binterp;
175156dcabbaSDebojyoti Ghosh 
175256dcabbaSDebojyoti Ghosh   PetscFunctionBegin;
17533c633725SBarry Smith   PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name);
175481d12688SDebojyoti Ghosh   h      = ts->time_step;
1755be5899b3SLisandro Dalcin   h_prev = ts->ptime - ts->ptime_prev;
1756be5899b3SLisandro Dalcin   t      = 1 + h / h_prev * c;
1757d27334e2SStefano Zampini   for (i = 0; i < s; i++) bt[i] = b[i] = 0;
175856dcabbaSDebojyoti Ghosh   for (j = 0, tt = t; j < pinterp; j++, tt *= t) {
175956dcabbaSDebojyoti Ghosh     for (i = 0; i < s; i++) {
176081d12688SDebojyoti Ghosh       bt[i] += h * Bt[i * pinterp + j] * tt;
176156dcabbaSDebojyoti Ghosh       b[i] += h * B[i * pinterp + j] * tt;
176256dcabbaSDebojyoti Ghosh     }
176356dcabbaSDebojyoti Ghosh   }
17643c633725SBarry Smith   PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous step have not been stored");
17659566063dSJacob Faibussowitsch   PetscCall(VecCopy(ark->Y_prev[0], X));
17669566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev));
1767d27334e2SStefano Zampini   if (tab->additive) {
1768d27334e2SStefano Zampini     PetscBool hasE;
1769d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1770d27334e2SStefano Zampini     if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev));
1771d27334e2SStefano Zampini   }
17723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
177356dcabbaSDebojyoti Ghosh }
177456dcabbaSDebojyoti Ghosh 
1775d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauReset(TS ts)
1776d71ae5a4SJacob Faibussowitsch {
177796400bd6SLisandro Dalcin   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
177896400bd6SLisandro Dalcin   ARKTableau  tab = ark->tableau;
177996400bd6SLisandro Dalcin 
178096400bd6SLisandro Dalcin   PetscFunctionBegin;
17813ba16761SJacob Faibussowitsch   if (!tab) PetscFunctionReturn(PETSC_SUCCESS);
17829566063dSJacob Faibussowitsch   PetscCall(PetscFree(ark->work));
17839566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->Y));
17849566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotI));
17859566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS));
17869566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev));
17879566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev));
17889566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev));
17893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
179096400bd6SLisandro Dalcin }
179196400bd6SLisandro Dalcin 
1792d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSReset_ARKIMEX(TS ts)
1793d71ae5a4SJacob Faibussowitsch {
17948a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
17958a381b04SJed Brown 
17968a381b04SJed Brown   PetscFunctionBegin;
17979566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXTableauReset(ts));
17989566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Ydot));
17999566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Ydot0));
18009566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Z));
18013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
18028a381b04SJed Brown }
18038a381b04SJed Brown 
180480ab5e31SHong Zhang static PetscErrorCode TSAdjointReset_ARKIMEX(TS ts)
180580ab5e31SHong Zhang {
180680ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
180780ab5e31SHong Zhang   ARKTableau  tab = ark->tableau;
180880ab5e31SHong Zhang 
180980ab5e31SHong Zhang   PetscFunctionBegin;
181080ab5e31SHong Zhang   PetscCall(VecDestroyVecs(tab->s * ts->numcost, &ark->VecsDeltaLam));
181180ab5e31SHong Zhang   PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiTemp));
181280ab5e31SHong Zhang   PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiPTemp));
181380ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
181480ab5e31SHong Zhang }
181580ab5e31SHong Zhang 
1816d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetVecs(TS ts, DM dm, Vec *Z, Vec *Ydot)
1817d71ae5a4SJacob Faibussowitsch {
1818d5e6173cSPeter Brune   TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data;
1819d5e6173cSPeter Brune 
1820d5e6173cSPeter Brune   PetscFunctionBegin;
1821d5e6173cSPeter Brune   if (Z) {
1822d5e6173cSPeter Brune     if (dm && dm != ts->dm) {
18239566063dSJacob Faibussowitsch       PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Z", Z));
1824d5e6173cSPeter Brune     } else *Z = ax->Z;
1825d5e6173cSPeter Brune   }
1826d5e6173cSPeter Brune   if (Ydot) {
1827d5e6173cSPeter Brune     if (dm && dm != ts->dm) {
18289566063dSJacob Faibussowitsch       PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot));
1829d5e6173cSPeter Brune     } else *Ydot = ax->Ydot;
1830d5e6173cSPeter Brune   }
18313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1832d5e6173cSPeter Brune }
1833d5e6173cSPeter Brune 
1834d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXRestoreVecs(TS ts, DM dm, Vec *Z, Vec *Ydot)
1835d71ae5a4SJacob Faibussowitsch {
1836d5e6173cSPeter Brune   PetscFunctionBegin;
1837d5e6173cSPeter Brune   if (Z) {
183848a46eb9SPierre Jolivet     if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Z", Z));
1839d5e6173cSPeter Brune   }
1840d5e6173cSPeter Brune   if (Ydot) {
184148a46eb9SPierre Jolivet     if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot));
1842d5e6173cSPeter Brune   }
18433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1844d5e6173cSPeter Brune }
1845d5e6173cSPeter Brune 
18463b98415fSStefano Zampini PETSC_SINGLE_LIBRARY_INTERN PetscErrorCode MatFindNonzeroRowsOrCols_Basic(Mat, PetscBool, PetscReal, IS *);
18473b98415fSStefano Zampini 
18483b98415fSStefano Zampini /* This defines the nonlinear equation that is to be solved with SNES */
1849d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormFunction_ARKIMEX(SNES snes, Vec X, Vec F, TS ts)
1850d71ae5a4SJacob Faibussowitsch {
18518a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1852d5e6173cSPeter Brune   DM          dm, dmsave;
1853d5e6173cSPeter Brune   Vec         Z, Ydot;
18548a381b04SJed Brown 
18558a381b04SJed Brown   PetscFunctionBegin;
18569566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes, &dm));
18579566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot));
1858d5e6173cSPeter Brune   dmsave = ts->dm;
1859d5e6173cSPeter Brune   ts->dm = dm;
1860740132f1SEmil Constantinescu 
186198940a98SHong Zhang   if (ark->scoeff == PETSC_MAX_REAL) {
18623b98415fSStefano Zampini     /* We are solving F(t_n,x_n,xdot) = 0 to start the method */
1863d27334e2SStefano Zampini     PetscCall(TSComputeIFunction(ts, ark->stage_time, Z, X, F, ark->imex));
1864d27334e2SStefano Zampini   } else {
186598940a98SHong Zhang     PetscReal shift = ark->scoeff / ts->time_step;
1866d27334e2SStefano Zampini     PetscCall(VecAXPBYPCZ(Ydot, -shift, shift, 0, Z, X)); /* Ydot = shift*(X-Z) */
18679566063dSJacob Faibussowitsch     PetscCall(TSComputeIFunction(ts, ark->stage_time, X, Ydot, F, ark->imex));
1868d27334e2SStefano Zampini   }
1869e817cc15SEmil Constantinescu 
1870d5e6173cSPeter Brune   ts->dm = dmsave;
18719566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot));
18723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
18738a381b04SJed Brown }
18748a381b04SJed Brown 
1875d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormJacobian_ARKIMEX(SNES snes, Vec X, Mat A, Mat B, TS ts)
1876d71ae5a4SJacob Faibussowitsch {
18778a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1878d5e6173cSPeter Brune   DM          dm, dmsave;
1879d27334e2SStefano Zampini   Vec         Ydot, Z;
188098940a98SHong Zhang   PetscReal   shift;
18818a381b04SJed Brown 
18828a381b04SJed Brown   PetscFunctionBegin;
18839566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes, &dm));
1884d27334e2SStefano Zampini   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot));
18858a381b04SJed Brown   /* ark->Ydot has already been computed in SNESTSFormFunction_ARKIMEX (SNES guarantees this) */
1886d5e6173cSPeter Brune   dmsave = ts->dm;
1887d5e6173cSPeter Brune   ts->dm = dm;
1888740132f1SEmil Constantinescu 
188998940a98SHong Zhang   if (ark->scoeff == PETSC_MAX_REAL) {
18903b98415fSStefano Zampini     PetscBool hasZeroRows;
18913b98415fSStefano Zampini     IS        alg_is;
18923b98415fSStefano Zampini 
18933b98415fSStefano Zampini     /* We are solving F(t_n,x_n,xdot) = 0 to start the method
18943b98415fSStefano Zampini        Jed's proposal is to compute with a very large shift and then scale back the matrix */
1895d27334e2SStefano Zampini     shift = 1.0 / PETSC_MACHINE_EPSILON;
1896d27334e2SStefano Zampini     PetscCall(TSComputeIJacobian(ts, ark->stage_time, Z, X, shift, A, B, ark->imex));
1897d27334e2SStefano Zampini     PetscCall(MatScale(B, PETSC_MACHINE_EPSILON));
18983b98415fSStefano Zampini     /* DAEs need special handling for preconditioning purposes only.
18993b98415fSStefano Zampini        We need to locate the algebraic variables and modify the preconditioning matrix by
19003b98415fSStefano Zampini        calling MatZeroRows with identity on these variables.
19013b98415fSStefano Zampini        We must store the IS in the DM since this function can be called by multilevel solvers.
19023b98415fSStefano Zampini     */
19033b98415fSStefano Zampini     PetscCall(PetscObjectQuery((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject *)&alg_is));
19043b98415fSStefano Zampini     if (!alg_is) {
19053b98415fSStefano Zampini       PetscInt m, n;
19063b98415fSStefano Zampini       IS       nonzeroRows;
19073b98415fSStefano Zampini 
19083b98415fSStefano Zampini       PetscCall(MatViewFromOptions(B, (PetscObject)snes, "-ts_arkimex_alg_mat_view_pre"));
19093b98415fSStefano Zampini       PetscCall(MatFindNonzeroRowsOrCols_Basic(B, PETSC_FALSE, 100 * PETSC_MACHINE_EPSILON, &nonzeroRows));
19103b98415fSStefano Zampini       if (nonzeroRows) PetscCall(ISViewFromOptions(nonzeroRows, (PetscObject)snes, "-ts_arkimex_alg_is_view_pre"));
19113b98415fSStefano Zampini       PetscCall(MatGetOwnershipRange(B, &m, &n));
19123b98415fSStefano Zampini       if (nonzeroRows) PetscCall(ISComplement(nonzeroRows, m, n, &alg_is));
19133b98415fSStefano Zampini       else PetscCall(ISCreateStride(PetscObjectComm((PetscObject)snes), 0, m, 1, &alg_is));
19143b98415fSStefano Zampini       PetscCall(ISDestroy(&nonzeroRows));
19153b98415fSStefano Zampini       PetscCall(PetscObjectCompose((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject)alg_is));
19163b98415fSStefano Zampini       PetscCall(ISDestroy(&alg_is));
19173b98415fSStefano Zampini     }
19183b98415fSStefano Zampini     PetscCall(PetscObjectQuery((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject *)&alg_is));
19193b98415fSStefano Zampini     PetscCall(ISViewFromOptions(alg_is, (PetscObject)snes, "-ts_arkimex_alg_is_view"));
19203b98415fSStefano Zampini     PetscCall(MatHasOperation(B, MATOP_ZERO_ROWS, &hasZeroRows));
19213b98415fSStefano Zampini     if (hasZeroRows) {
19223b98415fSStefano Zampini       /* the default of AIJ is to not keep the pattern! We should probably change it someday */
19233b98415fSStefano Zampini       PetscCall(MatSetOption(B, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE));
19243b98415fSStefano Zampini       PetscCall(MatZeroRowsIS(B, alg_is, 1.0, NULL, NULL));
19253b98415fSStefano Zampini     }
19263b98415fSStefano Zampini     PetscCall(MatViewFromOptions(B, (PetscObject)snes, "-ts_arkimex_alg_mat_view"));
1927d27334e2SStefano Zampini     if (A != B) PetscCall(MatScale(A, PETSC_MACHINE_EPSILON));
1928d27334e2SStefano Zampini   } else {
192998940a98SHong Zhang     shift = ark->scoeff / ts->time_step;
19309566063dSJacob Faibussowitsch     PetscCall(TSComputeIJacobian(ts, ark->stage_time, X, Ydot, shift, A, B, ark->imex));
1931d27334e2SStefano Zampini   }
1932d5e6173cSPeter Brune   ts->dm = dmsave;
1933d27334e2SStefano Zampini   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot));
19343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1935d5e6173cSPeter Brune }
1936d5e6173cSPeter Brune 
193780ab5e31SHong Zhang static PetscErrorCode TSGetStages_ARKIMEX(TS ts, PetscInt *ns, Vec *Y[])
193880ab5e31SHong Zhang {
193980ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
194080ab5e31SHong Zhang 
194180ab5e31SHong Zhang   PetscFunctionBegin;
194280ab5e31SHong Zhang   if (ns) *ns = ark->tableau->s;
194380ab5e31SHong Zhang   if (Y) *Y = ark->Y;
194480ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
194580ab5e31SHong Zhang }
194680ab5e31SHong Zhang 
1947d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_TSARKIMEX(DM fine, DM coarse, void *ctx)
1948d71ae5a4SJacob Faibussowitsch {
1949d5e6173cSPeter Brune   PetscFunctionBegin;
19503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1951d5e6173cSPeter Brune }
1952d5e6173cSPeter Brune 
1953d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_TSARKIMEX(DM fine, Mat restrct, Vec rscale, Mat inject, DM coarse, void *ctx)
1954d71ae5a4SJacob Faibussowitsch {
1955d5e6173cSPeter Brune   TS  ts = (TS)ctx;
1956d5e6173cSPeter Brune   Vec Z, Z_c;
1957d5e6173cSPeter Brune 
1958d5e6173cSPeter Brune   PetscFunctionBegin;
19599566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, fine, &Z, NULL));
19609566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, coarse, &Z_c, NULL));
19619566063dSJacob Faibussowitsch   PetscCall(MatRestrict(restrct, Z, Z_c));
19629566063dSJacob Faibussowitsch   PetscCall(VecPointwiseMult(Z_c, rscale, Z_c));
19639566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, fine, &Z, NULL));
19649566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, coarse, &Z_c, NULL));
19653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19668a381b04SJed Brown }
19678a381b04SJed Brown 
1968d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_TSARKIMEX(DM dm, DM subdm, void *ctx)
1969d71ae5a4SJacob Faibussowitsch {
1970cdb298fcSPeter Brune   PetscFunctionBegin;
19713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1972cdb298fcSPeter Brune }
1973cdb298fcSPeter Brune 
1974d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_TSARKIMEX(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx)
1975d71ae5a4SJacob Faibussowitsch {
1976cdb298fcSPeter Brune   TS  ts = (TS)ctx;
1977cdb298fcSPeter Brune   Vec Z, Z_c;
1978cdb298fcSPeter Brune 
1979cdb298fcSPeter Brune   PetscFunctionBegin;
19809566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, NULL));
19819566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, subdm, &Z_c, NULL));
1982cdb298fcSPeter Brune 
19839566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD));
19849566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD));
1985cdb298fcSPeter Brune 
19869566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, NULL));
19879566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, subdm, &Z_c, NULL));
19883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1989cdb298fcSPeter Brune }
1990cdb298fcSPeter Brune 
1991d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauSetUp(TS ts)
1992d71ae5a4SJacob Faibussowitsch {
199396400bd6SLisandro Dalcin   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
199496400bd6SLisandro Dalcin   ARKTableau  tab = ark->tableau;
199596400bd6SLisandro Dalcin 
199696400bd6SLisandro Dalcin   PetscFunctionBegin;
1997d27334e2SStefano Zampini   PetscCall(PetscMalloc1(2 * tab->s, &ark->work));
19989566063dSJacob Faibussowitsch   PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y));
19999566063dSJacob Faibussowitsch   PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI));
2000d27334e2SStefano Zampini   if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS));
200196400bd6SLisandro Dalcin   if (ark->extrapolate) {
20029566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev));
20039566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev));
2004d27334e2SStefano Zampini     if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev));
200596400bd6SLisandro Dalcin   }
20063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
200796400bd6SLisandro Dalcin }
200896400bd6SLisandro Dalcin 
2009d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetUp_ARKIMEX(TS ts)
2010d71ae5a4SJacob Faibussowitsch {
20118a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2012d5e6173cSPeter Brune   DM          dm;
201396400bd6SLisandro Dalcin   SNES        snes;
2014f9c1d6abSBarry Smith 
20158a381b04SJed Brown   PetscFunctionBegin;
20169566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXTableauSetUp(ts));
20179566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot));
20189566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot0));
20199566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Z));
20209566063dSJacob Faibussowitsch   PetscCall(TSGetDM(ts, &dm));
20219566063dSJacob Faibussowitsch   PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts));
20229566063dSJacob Faibussowitsch   PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts));
20239566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts, &snes));
20243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20258a381b04SJed Brown }
20268a381b04SJed Brown 
202780ab5e31SHong Zhang static PetscErrorCode TSAdjointSetUp_ARKIMEX(TS ts)
202880ab5e31SHong Zhang {
202980ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
203080ab5e31SHong Zhang   ARKTableau  tab = ark->tableau;
203180ab5e31SHong Zhang 
203280ab5e31SHong Zhang   PetscFunctionBegin;
203380ab5e31SHong Zhang   PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], tab->s * ts->numcost, &ark->VecsDeltaLam));
203480ab5e31SHong Zhang   PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &ark->VecsSensiTemp));
203580ab5e31SHong Zhang   if (ts->vecs_sensip) { PetscCall(VecDuplicateVecs(ts->vecs_sensip[0], ts->numcost, &ark->VecsSensiPTemp)); }
203680ab5e31SHong Zhang   if (PetscDefined(USE_DEBUG)) {
203780ab5e31SHong Zhang     PetscBool id = PETSC_FALSE;
203880ab5e31SHong Zhang     PetscCall(TSARKIMEXTestMassIdentity(ts, &id));
20398434afd1SBarry 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");
204080ab5e31SHong Zhang   }
204180ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
204280ab5e31SHong Zhang }
204380ab5e31SHong Zhang 
2044d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetFromOptions_ARKIMEX(TS ts, PetscOptionItems *PetscOptionsObject)
2045d71ae5a4SJacob Faibussowitsch {
20464cc180ffSJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2047d27334e2SStefano Zampini   PetscBool   dirk;
20488a381b04SJed Brown 
20498a381b04SJed Brown   PetscFunctionBegin;
2050d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
2051d27334e2SStefano Zampini   PetscOptionsHeadBegin(PetscOptionsObject, dirk ? "DIRK ODE solver options" : "ARKIMEX ODE solver options");
20528a381b04SJed Brown   {
20538a381b04SJed Brown     ARKTableauLink link;
20548a381b04SJed Brown     PetscInt       count, choice;
20558a381b04SJed Brown     PetscBool      flg;
20568a381b04SJed Brown     const char   **namelist;
2057d27334e2SStefano Zampini     for (link = ARKTableauList, count = 0; link; link = link->next) {
2058d27334e2SStefano Zampini       if (!dirk && link->tab.additive) count++;
2059d27334e2SStefano Zampini       if (dirk && !link->tab.additive) count++;
2060d27334e2SStefano Zampini     }
20619566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(count, (char ***)&namelist));
2062d27334e2SStefano Zampini     for (link = ARKTableauList, count = 0; link; link = link->next) {
2063d27334e2SStefano Zampini       if (!dirk && link->tab.additive) namelist[count++] = link->tab.name;
2064d27334e2SStefano Zampini       if (dirk && !link->tab.additive) namelist[count++] = link->tab.name;
2065d27334e2SStefano Zampini     }
2066d27334e2SStefano Zampini     if (dirk) {
2067d27334e2SStefano Zampini       PetscCall(PetscOptionsEList("-ts_dirk_type", "Family of DIRK method", "TSDIRKSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg));
2068d27334e2SStefano Zampini       if (flg) PetscCall(TSDIRKSetType(ts, namelist[choice]));
2069d27334e2SStefano Zampini     } else {
20709566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEList("-ts_arkimex_type", "Family of ARK IMEX method", "TSARKIMEXSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg));
20719566063dSJacob Faibussowitsch       if (flg) PetscCall(TSARKIMEXSetType(ts, namelist[choice]));
20724cc180ffSJed Brown       flg = (PetscBool)!ark->imex;
20739566063dSJacob Faibussowitsch       PetscCall(PetscOptionsBool("-ts_arkimex_fully_implicit", "Solve the problem fully implicitly", "TSARKIMEXSetFullyImplicit", flg, &flg, NULL));
20744cc180ffSJed Brown       ark->imex = (PetscBool)!flg;
2075d27334e2SStefano Zampini     }
2076d27334e2SStefano Zampini     PetscCall(PetscFree(namelist));
20779566063dSJacob 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));
20788a381b04SJed Brown   }
2079d0609cedSBarry Smith   PetscOptionsHeadEnd();
20803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20818a381b04SJed Brown }
20828a381b04SJed Brown 
2083d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSView_ARKIMEX(TS ts, PetscViewer viewer)
2084d71ae5a4SJacob Faibussowitsch {
20858a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2086d27334e2SStefano Zampini   PetscBool   iascii, dirk;
20878a381b04SJed Brown 
20888a381b04SJed Brown   PetscFunctionBegin;
2089d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
20909566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
20918a381b04SJed Brown   if (iascii) {
2092d27334e2SStefano Zampini     PetscViewerFormat format;
20939c334d8fSLisandro Dalcin     ARKTableau        tab = ark->tableau;
209419fd82e9SBarry Smith     TSARKIMEXType     arktype;
2095d27334e2SStefano Zampini     char              buf[2048];
20963a28c0e5SStefano Zampini     PetscBool         flg;
20973a28c0e5SStefano Zampini 
20989566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXGetType(ts, &arktype));
20999566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXGetFullyImplicit(ts, &flg));
2100d27334e2SStefano Zampini     PetscCall(PetscViewerASCIIPrintf(viewer, "  %s %s\n", dirk ? "DIRK" : "ARK IMEX", arktype));
21019566063dSJacob Faibussowitsch     PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->ct));
2102d27334e2SStefano Zampini     PetscCall(PetscViewerASCIIPrintf(viewer, "  %sabscissa       ct = %s\n", dirk ? "" : "Stiff ", buf));
2103d27334e2SStefano Zampini     PetscCall(PetscViewerGetFormat(viewer, &format));
2104d27334e2SStefano Zampini     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
2105d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sAt =\n", dirk ? "" : "Stiff "));
2106d27334e2SStefano Zampini       for (PetscInt i = 0; i < tab->s; i++) {
2107d27334e2SStefano Zampini         PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->At + i * tab->s));
2108d27334e2SStefano Zampini         PetscCall(PetscViewerASCIIPrintf(viewer, "    %s\n", buf));
2109d27334e2SStefano Zampini       }
2110d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bt));
2111d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sbt = %s\n", dirk ? "" : "Stiff ", buf));
2112d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bembedt));
2113d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sbet = %s\n", dirk ? "" : "Stiff ", buf));
2114d27334e2SStefano Zampini     }
21159566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fully implicit: %s\n", flg ? "yes" : "no"));
21169566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Stiffly accurate: %s\n", tab->stiffly_accurate ? "yes" : "no"));
21179566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Explicit first stage: %s\n", tab->explicit_first_stage ? "yes" : "no"));
21189566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "FSAL property: %s\n", tab->FSAL_implicit ? "yes" : "no"));
2119d27334e2SStefano Zampini     if (!dirk) {
2120d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->c));
21219566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  Nonstiff abscissa     c = %s\n", buf));
21228a381b04SJed Brown     }
2123d27334e2SStefano Zampini   }
21243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21258a381b04SJed Brown }
21268a381b04SJed Brown 
2127d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSLoad_ARKIMEX(TS ts, PetscViewer viewer)
2128d71ae5a4SJacob Faibussowitsch {
2129f2c2a1b9SBarry Smith   SNES    snes;
21309c334d8fSLisandro Dalcin   TSAdapt adapt;
2131f2c2a1b9SBarry Smith 
2132f2c2a1b9SBarry Smith   PetscFunctionBegin;
21339566063dSJacob Faibussowitsch   PetscCall(TSGetAdapt(ts, &adapt));
21349566063dSJacob Faibussowitsch   PetscCall(TSAdaptLoad(adapt, viewer));
21359566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts, &snes));
21369566063dSJacob Faibussowitsch   PetscCall(SNESLoad(snes, viewer));
2137ad6bc421SBarry Smith   /* function and Jacobian context for SNES when used with TS is always ts object */
21389566063dSJacob Faibussowitsch   PetscCall(SNESSetFunction(snes, NULL, NULL, ts));
21399566063dSJacob Faibussowitsch   PetscCall(SNESSetJacobian(snes, NULL, NULL, NULL, ts));
21403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2141f2c2a1b9SBarry Smith }
2142f2c2a1b9SBarry Smith 
2143*cc4c1da9SBarry Smith /*@
2144bcf0153eSBarry Smith   TSARKIMEXSetType - Set the type of `TSARKIMEX` scheme
21458a381b04SJed Brown 
214620f4b53cSBarry Smith   Logically Collective
21478a381b04SJed Brown 
2148d8d19677SJose E. Roman   Input Parameters:
21498a381b04SJed Brown + ts      - timestepping context
2150bcf0153eSBarry Smith - arktype - type of `TSARKIMEX` scheme
21518a381b04SJed Brown 
2152bcf0153eSBarry Smith   Options Database Key:
2153bcf0153eSBarry Smith . -ts_arkimex_type <1bee,a2,l2,ars122,2c,2d,2e,prssp2,3,bpr3,ars443,4,5> - set `TSARKIMEX` scheme type
21549bd3e852SBarry Smith 
21558a381b04SJed Brown   Level: intermediate
21568a381b04SJed Brown 
21571cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEX1BEE`, `TSARKIMEXA2`, `TSARKIMEXL2`, `TSARKIMEXARS122`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEXPRSSP2`,
2158db781477SPatrick Sanan           `TSARKIMEX3`, `TSARKIMEXBPR3`, `TSARKIMEXARS443`, `TSARKIMEX4`, `TSARKIMEX5`
21598a381b04SJed Brown @*/
2160d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetType(TS ts, TSARKIMEXType arktype)
2161d71ae5a4SJacob Faibussowitsch {
21628a381b04SJed Brown   PetscFunctionBegin;
21638a381b04SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
21644f572ea9SToby Isaac   PetscAssertPointer(arktype, 2);
2165cac4c232SBarry Smith   PetscTryMethod(ts, "TSARKIMEXSetType_C", (TS, TSARKIMEXType), (ts, arktype));
21663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21678a381b04SJed Brown }
21688a381b04SJed Brown 
2169*cc4c1da9SBarry Smith /*@
2170bcf0153eSBarry Smith   TSARKIMEXGetType - Get the type of `TSARKIMEX` scheme
21718a381b04SJed Brown 
217220f4b53cSBarry Smith   Logically Collective
21738a381b04SJed Brown 
21748a381b04SJed Brown   Input Parameter:
21758a381b04SJed Brown . ts - timestepping context
21768a381b04SJed Brown 
21778a381b04SJed Brown   Output Parameter:
2178bcf0153eSBarry Smith . arktype - type of `TSARKIMEX` scheme
21798a381b04SJed Brown 
21808a381b04SJed Brown   Level: intermediate
21818a381b04SJed Brown 
218242747ad1SJacob Faibussowitsch .seealso: [](ch_ts), `TSARKIMEXc`
21838a381b04SJed Brown @*/
2184d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetType(TS ts, TSARKIMEXType *arktype)
2185d71ae5a4SJacob Faibussowitsch {
21868a381b04SJed Brown   PetscFunctionBegin;
21878a381b04SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2188cac4c232SBarry Smith   PetscUseMethod(ts, "TSARKIMEXGetType_C", (TS, TSARKIMEXType *), (ts, arktype));
21893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21908a381b04SJed Brown }
21918a381b04SJed Brown 
219216353aafSBarry Smith /*@
2193bcf0153eSBarry Smith   TSARKIMEXSetFullyImplicit - Solve both parts of the equation implicitly, including the part that is normally solved explicitly
21944cc180ffSJed Brown 
219520f4b53cSBarry Smith   Logically Collective
21964cc180ffSJed Brown 
2197d8d19677SJose E. Roman   Input Parameters:
21984cc180ffSJed Brown + ts  - timestepping context
2199bcf0153eSBarry Smith - flg - `PETSC_TRUE` for fully implicit
22004cc180ffSJed Brown 
22014cc180ffSJed Brown   Level: intermediate
22024cc180ffSJed Brown 
22031cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXGetType()`, `TSARKIMEXGetFullyImplicit()`
22044cc180ffSJed Brown @*/
2205d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetFullyImplicit(TS ts, PetscBool flg)
2206d71ae5a4SJacob Faibussowitsch {
22074cc180ffSJed Brown   PetscFunctionBegin;
22084cc180ffSJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22093a28c0e5SStefano Zampini   PetscValidLogicalCollectiveBool(ts, flg, 2);
2210cac4c232SBarry Smith   PetscTryMethod(ts, "TSARKIMEXSetFullyImplicit_C", (TS, PetscBool), (ts, flg));
22113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22124cc180ffSJed Brown }
22134cc180ffSJed Brown 
22143a28c0e5SStefano Zampini /*@
22153a28c0e5SStefano Zampini   TSARKIMEXGetFullyImplicit - Inquires if both parts of the equation are solved implicitly
22163a28c0e5SStefano Zampini 
221720f4b53cSBarry Smith   Logically Collective
22183a28c0e5SStefano Zampini 
22193a28c0e5SStefano Zampini   Input Parameter:
22203a28c0e5SStefano Zampini . ts - timestepping context
22213a28c0e5SStefano Zampini 
22227a7aea1fSJed Brown   Output Parameter:
2223bcf0153eSBarry Smith . flg - `PETSC_TRUE` for fully implicit
22243a28c0e5SStefano Zampini 
22253a28c0e5SStefano Zampini   Level: intermediate
22263a28c0e5SStefano Zampini 
22271cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`
22283a28c0e5SStefano Zampini @*/
2229d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetFullyImplicit(TS ts, PetscBool *flg)
2230d71ae5a4SJacob Faibussowitsch {
22313a28c0e5SStefano Zampini   PetscFunctionBegin;
22323a28c0e5SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22334f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
2234cac4c232SBarry Smith   PetscUseMethod(ts, "TSARKIMEXGetFullyImplicit_C", (TS, PetscBool *), (ts, flg));
22353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22363a28c0e5SStefano Zampini }
22373a28c0e5SStefano Zampini 
2238d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetType_ARKIMEX(TS ts, TSARKIMEXType *arktype)
2239d71ae5a4SJacob Faibussowitsch {
22408a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
22418a381b04SJed Brown 
22428a381b04SJed Brown   PetscFunctionBegin;
22438a381b04SJed Brown   *arktype = ark->tableau->name;
22443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22458a381b04SJed Brown }
2246d27334e2SStefano Zampini 
2247d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetType_ARKIMEX(TS ts, TSARKIMEXType arktype)
2248d71ae5a4SJacob Faibussowitsch {
22498a381b04SJed Brown   TS_ARKIMEX    *ark = (TS_ARKIMEX *)ts->data;
22508a381b04SJed Brown   PetscBool      match;
22518a381b04SJed Brown   ARKTableauLink link;
22528a381b04SJed Brown 
22538a381b04SJed Brown   PetscFunctionBegin;
22548a381b04SJed Brown   if (ark->tableau) {
22559566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(ark->tableau->name, arktype, &match));
22563ba16761SJacob Faibussowitsch     if (match) PetscFunctionReturn(PETSC_SUCCESS);
22578a381b04SJed Brown   }
22588a381b04SJed Brown   for (link = ARKTableauList; link; link = link->next) {
22599566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(link->tab.name, arktype, &match));
22608a381b04SJed Brown     if (match) {
22619566063dSJacob Faibussowitsch       if (ts->setupcalled) PetscCall(TSARKIMEXTableauReset(ts));
22628a381b04SJed Brown       ark->tableau = &link->tab;
22639566063dSJacob Faibussowitsch       if (ts->setupcalled) PetscCall(TSARKIMEXTableauSetUp(ts));
22642ffb9264SLisandro Dalcin       ts->default_adapt_type = ark->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE;
22653ba16761SJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
22668a381b04SJed Brown     }
22678a381b04SJed Brown   }
226898921bdaSJacob Faibussowitsch   SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", arktype);
22698a381b04SJed Brown }
2270e0877f53SBarry Smith 
2271d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetFullyImplicit_ARKIMEX(TS ts, PetscBool flg)
2272d71ae5a4SJacob Faibussowitsch {
22734cc180ffSJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
22744cc180ffSJed Brown 
22754cc180ffSJed Brown   PetscFunctionBegin;
22764cc180ffSJed Brown   ark->imex = (PetscBool)!flg;
22773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22784cc180ffSJed Brown }
22798a381b04SJed Brown 
2280d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetFullyImplicit_ARKIMEX(TS ts, PetscBool *flg)
2281d71ae5a4SJacob Faibussowitsch {
22823a28c0e5SStefano Zampini   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
22833a28c0e5SStefano Zampini 
22843a28c0e5SStefano Zampini   PetscFunctionBegin;
22853a28c0e5SStefano Zampini   *flg = (PetscBool)!ark->imex;
22863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22873a28c0e5SStefano Zampini }
22883a28c0e5SStefano Zampini 
2289d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSDestroy_ARKIMEX(TS ts)
2290d71ae5a4SJacob Faibussowitsch {
2291b3a6b972SJed Brown   PetscFunctionBegin;
22929566063dSJacob Faibussowitsch   PetscCall(TSReset_ARKIMEX(ts));
2293b3a6b972SJed Brown   if (ts->dm) {
22949566063dSJacob Faibussowitsch     PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts));
22959566063dSJacob Faibussowitsch     PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts));
2296b3a6b972SJed Brown   }
22979566063dSJacob Faibussowitsch   PetscCall(PetscFree(ts->data));
2298d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", NULL));
2299d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", NULL));
23009566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", NULL));
23019566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", NULL));
23029566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", NULL));
23032e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", NULL));
23043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2305b3a6b972SJed Brown }
2306b3a6b972SJed Brown 
23078a381b04SJed Brown /* ------------------------------------------------------------ */
23088a381b04SJed Brown /*MC
2309c79dcfbdSBarry Smith       TSARKIMEX - ODE and DAE solver using additive Runge-Kutta IMEX schemes
23108a381b04SJed Brown 
2311fca742c7SJed Brown   These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly
2312fca742c7SJed Brown   nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part
2313bcf0153eSBarry Smith   of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`.
2314d0685a90SJed Brown 
23158a381b04SJed Brown   Level: beginner
23168a381b04SJed Brown 
2317bcf0153eSBarry Smith   Notes:
2318bcf0153eSBarry Smith   The default is `TSARKIMEX3`, it can be changed with `TSARKIMEXSetType()` or -ts_arkimex_type
23198a381b04SJed Brown 
2320bcf0153eSBarry Smith   If the equation is implicit or a DAE, then `TSSetEquationType()` needs to be set accordingly. Refer to the manual for further information.
2321bcf0153eSBarry Smith 
2322bcf0153eSBarry 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).
2323bcf0153eSBarry Smith 
2324bcf0153eSBarry Smith   Consider trying `TSROSW` if the stiff part is linear or weakly nonlinear.
2325bcf0153eSBarry Smith 
23261cc06b55SBarry Smith .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSARKIMEXSetType()`, `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`, `TSARKIMEXGetFullyImplicit()`,
2327bcf0153eSBarry Smith           `TSARKIMEX1BEE`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEX3`, `TSARKIMEXL2`, `TSARKIMEXA2`, `TSARKIMEXARS122`,
2328bcf0153eSBarry Smith           `TSARKIMEX4`, `TSARKIMEX5`, `TSARKIMEXPRSSP2`, `TSARKIMEXARS443`, `TSARKIMEXBPR3`, `TSARKIMEXType`, `TSARKIMEXRegister()`, `TSType`
23298a381b04SJed Brown M*/
2330d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSCreate_ARKIMEX(TS ts)
2331d71ae5a4SJacob Faibussowitsch {
233280ab5e31SHong Zhang   TS_ARKIMEX *ark;
2333d27334e2SStefano Zampini   PetscBool   dirk;
23348a381b04SJed Brown 
23358a381b04SJed Brown   PetscFunctionBegin;
23369566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXInitializePackage());
2337d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
23388a381b04SJed Brown 
23398a381b04SJed Brown   ts->ops->reset          = TSReset_ARKIMEX;
234080ab5e31SHong Zhang   ts->ops->adjointreset   = TSAdjointReset_ARKIMEX;
23418a381b04SJed Brown   ts->ops->destroy        = TSDestroy_ARKIMEX;
23428a381b04SJed Brown   ts->ops->view           = TSView_ARKIMEX;
2343f2c2a1b9SBarry Smith   ts->ops->load           = TSLoad_ARKIMEX;
23448a381b04SJed Brown   ts->ops->setup          = TSSetUp_ARKIMEX;
234580ab5e31SHong Zhang   ts->ops->adjointsetup   = TSAdjointSetUp_ARKIMEX;
23468a381b04SJed Brown   ts->ops->step           = TSStep_ARKIMEX;
2347cd652676SJed Brown   ts->ops->interpolate    = TSInterpolate_ARKIMEX;
2348108c343cSJed Brown   ts->ops->evaluatestep   = TSEvaluateStep_ARKIMEX;
23498a381b04SJed Brown   ts->ops->setfromoptions = TSSetFromOptions_ARKIMEX;
23508a381b04SJed Brown   ts->ops->snesfunction   = SNESTSFormFunction_ARKIMEX;
23518a381b04SJed Brown   ts->ops->snesjacobian   = SNESTSFormJacobian_ARKIMEX;
235280ab5e31SHong Zhang   ts->ops->getstages      = TSGetStages_ARKIMEX;
235380ab5e31SHong Zhang   ts->ops->adjointstep    = TSAdjointStep_ARKIMEX;
23548a381b04SJed Brown 
2355efd4aadfSBarry Smith   ts->usessnes = PETSC_TRUE;
2356efd4aadfSBarry Smith 
235780ab5e31SHong Zhang   PetscCall(PetscNew(&ark));
235880ab5e31SHong Zhang   ts->data  = (void *)ark;
2359d27334e2SStefano Zampini   ark->imex = dirk ? PETSC_FALSE : PETSC_TRUE;
236080ab5e31SHong Zhang 
236180ab5e31SHong Zhang   ark->VecsDeltaLam   = NULL;
236280ab5e31SHong Zhang   ark->VecsSensiTemp  = NULL;
236380ab5e31SHong Zhang   ark->VecsSensiPTemp = NULL;
23648a381b04SJed Brown 
23659566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", TSARKIMEXGetType_ARKIMEX));
2366d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", TSARKIMEXGetFullyImplicit_ARKIMEX));
2367d27334e2SStefano Zampini   if (!dirk) {
23689566063dSJacob Faibussowitsch     PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", TSARKIMEXSetType_ARKIMEX));
23699566063dSJacob Faibussowitsch     PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", TSARKIMEXSetFullyImplicit_ARKIMEX));
23709566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetType(ts, TSARKIMEXDefault));
2371d27334e2SStefano Zampini   }
2372d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2373d27334e2SStefano Zampini }
2374d27334e2SStefano Zampini 
2375d27334e2SStefano Zampini /* ------------------------------------------------------------ */
2376d27334e2SStefano Zampini 
2377d27334e2SStefano Zampini static PetscErrorCode TSDIRKSetType_DIRK(TS ts, TSDIRKType dirktype)
2378d27334e2SStefano Zampini {
2379d27334e2SStefano Zampini   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2380d27334e2SStefano Zampini 
2381d27334e2SStefano Zampini   PetscFunctionBegin;
2382d27334e2SStefano Zampini   PetscCall(TSARKIMEXSetType_ARKIMEX(ts, dirktype));
2383d27334e2SStefano Zampini   PetscCheck(!ark->tableau->additive, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONG, "Method \"%s\" is not DIRK", dirktype);
2384d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2385d27334e2SStefano Zampini }
2386d27334e2SStefano Zampini 
2387*cc4c1da9SBarry Smith /*@
2388d27334e2SStefano Zampini   TSDIRKSetType - Set the type of `TSDIRK` scheme
2389d27334e2SStefano Zampini 
2390d27334e2SStefano Zampini   Logically Collective
2391d27334e2SStefano Zampini 
2392d27334e2SStefano Zampini   Input Parameters:
2393d27334e2SStefano Zampini + ts       - timestepping context
2394d27334e2SStefano Zampini - dirktype - type of `TSDIRK` scheme
2395d27334e2SStefano Zampini 
2396d27334e2SStefano Zampini   Options Database Key:
2397d27334e2SStefano Zampini . -ts_dirkimex_type - set `TSDIRK` scheme type
2398d27334e2SStefano Zampini 
2399d27334e2SStefano Zampini   Level: intermediate
2400d27334e2SStefano Zampini 
2401d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKGetType()`, `TSDIRK`, `TSDIRKType`
2402d27334e2SStefano Zampini @*/
2403d27334e2SStefano Zampini PetscErrorCode TSDIRKSetType(TS ts, TSDIRKType dirktype)
2404d27334e2SStefano Zampini {
2405d27334e2SStefano Zampini   PetscFunctionBegin;
2406d27334e2SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2407d27334e2SStefano Zampini   PetscAssertPointer(dirktype, 2);
2408d27334e2SStefano Zampini   PetscTryMethod(ts, "TSDIRKSetType_C", (TS, TSDIRKType), (ts, dirktype));
2409d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2410d27334e2SStefano Zampini }
2411d27334e2SStefano Zampini 
2412*cc4c1da9SBarry Smith /*@
2413d27334e2SStefano Zampini   TSDIRKGetType - Get the type of `TSDIRK` scheme
2414d27334e2SStefano Zampini 
2415d27334e2SStefano Zampini   Logically Collective
2416d27334e2SStefano Zampini 
2417d27334e2SStefano Zampini   Input Parameter:
2418d27334e2SStefano Zampini . ts - timestepping context
2419d27334e2SStefano Zampini 
2420d27334e2SStefano Zampini   Output Parameter:
2421d27334e2SStefano Zampini . dirktype - type of `TSDIRK` scheme
2422d27334e2SStefano Zampini 
2423d27334e2SStefano Zampini   Level: intermediate
2424d27334e2SStefano Zampini 
2425d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKSetType()`
2426d27334e2SStefano Zampini @*/
2427d27334e2SStefano Zampini PetscErrorCode TSDIRKGetType(TS ts, TSDIRKType *dirktype)
2428d27334e2SStefano Zampini {
2429d27334e2SStefano Zampini   PetscFunctionBegin;
2430d27334e2SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2431d27334e2SStefano Zampini   PetscUseMethod(ts, "TSDIRKGetType_C", (TS, TSDIRKType *), (ts, dirktype));
2432d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2433d27334e2SStefano Zampini }
2434d27334e2SStefano Zampini 
2435d27334e2SStefano Zampini /*MC
24363405e92cSStefano Zampini       TSDIRK - ODE and DAE solver using Diagonally implicit Runge-Kutta schemes.
2437d27334e2SStefano Zampini 
2438d27334e2SStefano Zampini   Level: beginner
2439d27334e2SStefano Zampini 
2440d27334e2SStefano Zampini   Notes:
24413405e92cSStefano Zampini   The default is `TSDIRKES213SAL`, it can be changed with `TSDIRKSetType()` or -ts_dirk_type.
24423405e92cSStefano Zampini   The convention used in PETSc to name the DIRK methods is TSDIRK[E][S]PQS[SA][L][A] with:
24433405e92cSStefano Zampini + E - whether the method has an explicit first stage
24443405e92cSStefano Zampini . S - whether the method is single diagonal
24453405e92cSStefano Zampini . P - order of the advancing method
24463405e92cSStefano Zampini . Q - order of the embedded method
24473405e92cSStefano Zampini . S - number of stages
24483405e92cSStefano Zampini . SA - whether the method is stiffly accurate
24493405e92cSStefano Zampini . L - whether the method is L-stable
24503405e92cSStefano Zampini - A - whether the method is A-stable
2451d27334e2SStefano Zampini 
2452d27334e2SStefano Zampini .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSDIRKSetType()`, `TSDIRKGetType()`, `TSDIRKRegister()`.
2453d27334e2SStefano Zampini M*/
2454d27334e2SStefano Zampini PETSC_EXTERN PetscErrorCode TSCreate_DIRK(TS ts)
2455d27334e2SStefano Zampini {
2456d27334e2SStefano Zampini   PetscFunctionBegin;
2457d27334e2SStefano Zampini   PetscCall(TSCreate_ARKIMEX(ts));
2458d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", TSARKIMEXGetType_ARKIMEX));
2459d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", TSDIRKSetType_DIRK));
2460d27334e2SStefano Zampini   PetscCall(TSDIRKSetType(ts, TSDIRKDefault));
24613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24628a381b04SJed Brown }
2463