xref: /petsc/src/ts/impls/arkimex/arkimex.c (revision 0467964bd5b2330a79b8d324d3c3aa91392ecaf5)
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) */
55*0467964bSStefano Zampini   IS           alg_is;       /* Index set for algebraic variables, needed when restarting with DIRK */
568a381b04SJed Brown   PetscScalar *work;         /* Scalar work */
57b296d7d5SJed Brown   PetscReal    scoeff;       /* shift = scoeff/dt */
588a381b04SJed Brown   PetscReal    stage_time;
594cc180ffSJed Brown   PetscBool    imex;
6096400bd6SLisandro Dalcin   PetscBool    extrapolate; /* Extrapolate initial guess from previous time-step stage values */
61108c343cSJed Brown   TSStepStatus status;
6280ab5e31SHong Zhang 
6380ab5e31SHong Zhang   /* context for sensitivity analysis */
6480ab5e31SHong Zhang   Vec *VecsDeltaLam;   /* Increment of the adjoint sensitivity w.r.t IC at stage */
6580ab5e31SHong Zhang   Vec *VecsSensiTemp;  /* Vectors to be multiplied with Jacobian transpose */
6680ab5e31SHong Zhang   Vec *VecsSensiPTemp; /* Temporary Vectors to store JacobianP-transpose-vector product */
678a381b04SJed Brown } TS_ARKIMEX;
68d27334e2SStefano Zampini 
691f80e275SEmil Constantinescu /*MC
701d27aa22SBarry Smith      TSARKIMEXARS122 - Second order ARK IMEX scheme, {cite}`ascher_1997`
718a381b04SJed Brown 
721f80e275SEmil Constantinescu      This method has one explicit stage and one implicit stage.
731f80e275SEmil Constantinescu 
74bcf0153eSBarry Smith      Options Database Key:
7567b8a455SSatish Balay .      -ts_arkimex_type ars122 - set arkimex type to ars122
769bd3e852SBarry Smith 
77bcf0153eSBarry Smith      Level: advanced
78bcf0153eSBarry Smith 
791cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
801f80e275SEmil Constantinescu M*/
81d27334e2SStefano Zampini 
821f80e275SEmil Constantinescu /*MC
831f80e275SEmil Constantinescu      TSARKIMEXA2 - Second order ARK IMEX scheme with A-stable implicit part.
841f80e275SEmil Constantinescu 
851f80e275SEmil 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.
861f80e275SEmil Constantinescu 
87bcf0153eSBarry Smith      Options Database Key:
8867b8a455SSatish Balay .      -ts_arkimex_type a2 - set arkimex type to a2
899bd3e852SBarry Smith 
901f80e275SEmil Constantinescu      Level: advanced
911f80e275SEmil Constantinescu 
921cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
931f80e275SEmil Constantinescu M*/
94d27334e2SStefano Zampini 
951f80e275SEmil Constantinescu /*MC
961d27aa22SBarry Smith      TSARKIMEXL2 - Second order ARK IMEX scheme with L-stable implicit part, {cite}`pareschi_2005`
971f80e275SEmil Constantinescu 
981f80e275SEmil Constantinescu      This method has two implicit stages, and L-stable implicit scheme.
991f80e275SEmil Constantinescu 
100bcf0153eSBarry Smith      Options Database Key:
10167b8a455SSatish Balay .      -ts_arkimex_type l2 - set arkimex type to l2
1029bd3e852SBarry Smith 
103bcf0153eSBarry Smith      Level: advanced
104bcf0153eSBarry Smith 
1051cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
1061f80e275SEmil Constantinescu M*/
107d27334e2SStefano Zampini 
1081f80e275SEmil Constantinescu /*MC
109c79dcfbdSBarry Smith      TSARKIMEX1BEE - First order backward Euler represented as an ARK IMEX scheme with extrapolation as error estimator. This is a 3-stage method.
110e817cc15SEmil Constantinescu 
111e817cc15SEmil Constantinescu      This method is aimed at starting the integration of implicit DAEs when explicit first-stage ARK methods are used.
112e817cc15SEmil Constantinescu 
113bcf0153eSBarry Smith      Options Database Key:
11467b8a455SSatish Balay .      -ts_arkimex_type 1bee - set arkimex type to 1bee
1159bd3e852SBarry Smith 
116e817cc15SEmil Constantinescu      Level: advanced
117e817cc15SEmil Constantinescu 
1181cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
119e817cc15SEmil Constantinescu M*/
120d27334e2SStefano Zampini 
121e817cc15SEmil Constantinescu /*MC
1221f80e275SEmil Constantinescu      TSARKIMEX2C - Second order ARK IMEX scheme with L-stable implicit part.
1231f80e275SEmil Constantinescu 
1241f80e275SEmil 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.
1251f80e275SEmil Constantinescu 
126bcf0153eSBarry Smith      Options Database Key:
12767b8a455SSatish Balay .      -ts_arkimex_type 2c - set arkimex type to 2c
1289bd3e852SBarry Smith 
1291f80e275SEmil Constantinescu      Level: advanced
1301f80e275SEmil Constantinescu 
1311cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
1321f80e275SEmil Constantinescu M*/
133d27334e2SStefano Zampini 
13464f491ddSJed Brown /*MC
13564f491ddSJed Brown      TSARKIMEX2D - Second order ARK IMEX scheme with L-stable implicit part.
13664f491ddSJed Brown 
137da81f932SPierre 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.
13864f491ddSJed Brown 
139bcf0153eSBarry Smith      Options Database Key:
14067b8a455SSatish Balay .      -ts_arkimex_type 2d - set arkimex type to 2d
1419bd3e852SBarry Smith 
142b330ce4dSSatish Balay      Level: advanced
143b330ce4dSSatish Balay 
1441cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
14564f491ddSJed Brown M*/
146d27334e2SStefano Zampini 
14764f491ddSJed Brown /*MC
14864f491ddSJed Brown      TSARKIMEX2E - Second order ARK IMEX scheme with L-stable implicit part.
14964f491ddSJed Brown 
15015229ffcSPierre Jolivet      This method has one explicit stage and two implicit stages. It is an optimal method developed by Emil Constantinescu.
15164f491ddSJed Brown 
152bcf0153eSBarry Smith      Options Database Key:
15367b8a455SSatish Balay .      -ts_arkimex_type 2e - set arkimex type to 2e
1549bd3e852SBarry Smith 
155b330ce4dSSatish Balay     Level: advanced
156b330ce4dSSatish Balay 
1571cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
15864f491ddSJed Brown M*/
159d27334e2SStefano Zampini 
16064f491ddSJed Brown /*MC
1611d27aa22SBarry Smith      TSARKIMEXPRSSP2 - Second order SSP ARK IMEX scheme, {cite}`pareschi_2005`
1626cf0794eSJed Brown 
1636cf0794eSJed Brown      This method has three implicit stages.
1646cf0794eSJed Brown 
1651d27aa22SBarry Smith      This method is referred to as SSP2-(3,3,2) in <https://arxiv.org/abs/1110.4375>
1666cf0794eSJed Brown 
167bcf0153eSBarry Smith      Options Database Key:
16867b8a455SSatish Balay .      -ts_arkimex_type prssp2 - set arkimex type to prssp2
1699bd3e852SBarry Smith 
1706cf0794eSJed Brown      Level: advanced
1716cf0794eSJed Brown 
1721cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
1736cf0794eSJed Brown M*/
174d27334e2SStefano Zampini 
1756cf0794eSJed Brown /*MC
1761d27aa22SBarry Smith      TSARKIMEX3 - Third order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`
17764f491ddSJed Brown 
17864f491ddSJed Brown      This method has one explicit stage and three implicit stages.
17964f491ddSJed Brown 
180bcf0153eSBarry Smith      Options Database Key:
18167b8a455SSatish Balay .      -ts_arkimex_type 3 - set arkimex type to 3
1829bd3e852SBarry Smith 
183bcf0153eSBarry Smith      Level: advanced
184bcf0153eSBarry Smith 
1851cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
18664f491ddSJed Brown M*/
187d27334e2SStefano Zampini 
18864f491ddSJed Brown /*MC
1891d27aa22SBarry Smith      TSARKIMEXARS443 - Third order ARK IMEX scheme, {cite}`ascher_1997`
1906cf0794eSJed Brown 
1916cf0794eSJed Brown      This method has one explicit stage and four implicit stages.
1926cf0794eSJed Brown 
193bcf0153eSBarry Smith      Options Database Key:
19467b8a455SSatish Balay .      -ts_arkimex_type ars443 - set arkimex type to ars443
1959bd3e852SBarry Smith 
196bcf0153eSBarry Smith      Level: advanced
197bcf0153eSBarry Smith 
1981d27aa22SBarry Smith      Notes:
1991d27aa22SBarry Smith      This method is referred to as ARS(4,4,3) in <https://arxiv.org/abs/1110.4375>
2006cf0794eSJed Brown 
2011cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
2026cf0794eSJed Brown M*/
203d27334e2SStefano Zampini 
2046cf0794eSJed Brown /*MC
2051d27aa22SBarry Smith      TSARKIMEXBPR3 - Third order ARK IMEX scheme. Referred to as ARK3 in <https://arxiv.org/abs/1110.4375>
2066cf0794eSJed Brown 
2076cf0794eSJed Brown      This method has one explicit stage and four implicit stages.
2086cf0794eSJed Brown 
209bcf0153eSBarry Smith      Options Database Key:
21067b8a455SSatish Balay .      -ts_arkimex_type bpr3 - set arkimex type to bpr3
2119bd3e852SBarry Smith 
212bcf0153eSBarry Smith      Level: advanced
213bcf0153eSBarry Smith 
2141cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
2156cf0794eSJed Brown M*/
216d27334e2SStefano Zampini 
2176cf0794eSJed Brown /*MC
2181d27aa22SBarry Smith      TSARKIMEX4 - Fourth order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`.
21964f491ddSJed Brown 
22064f491ddSJed Brown      This method has one explicit stage and four implicit stages.
22164f491ddSJed Brown 
222bcf0153eSBarry Smith      Options Database Key:
22367b8a455SSatish Balay .      -ts_arkimex_type 4 - set arkimex type to4
2249bd3e852SBarry Smith 
225bcf0153eSBarry Smith      Level: advanced
226bcf0153eSBarry Smith 
2271cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
22864f491ddSJed Brown M*/
229d27334e2SStefano Zampini 
23064f491ddSJed Brown /*MC
2311d27aa22SBarry Smith      TSARKIMEX5 - Fifth order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`.
23264f491ddSJed Brown 
23364f491ddSJed Brown      This method has one explicit stage and five implicit stages.
23464f491ddSJed Brown 
235bcf0153eSBarry Smith      Options Database Key:
23667b8a455SSatish Balay .      -ts_arkimex_type 5 - set arkimex type to 5
2379bd3e852SBarry Smith 
238bcf0153eSBarry Smith      Level: advanced
239bcf0153eSBarry Smith 
2401cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
24164f491ddSJed Brown M*/
24264f491ddSJed Brown 
2433405e92cSStefano Zampini /*MC
2443405e92cSStefano Zampini      TSDIRKS212 - Second order DIRK scheme.
2453405e92cSStefano Zampini 
2463405e92cSStefano Zampini      This method has two implicit stages with an embedded method of other 1.
2473405e92cSStefano Zampini      See `TSDIRK` for additional details.
2483405e92cSStefano Zampini 
2493405e92cSStefano Zampini      Options Database Key:
2503405e92cSStefano Zampini .      -ts_dirk_type s212 - select this method.
2513405e92cSStefano Zampini 
2523405e92cSStefano Zampini      Level: advanced
2533405e92cSStefano Zampini 
2543405e92cSStefano Zampini      Note:
2553405e92cSStefano Zampini      This is the default DIRK scheme in SUNDIALS.
2563405e92cSStefano Zampini 
2573405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
2583405e92cSStefano Zampini M*/
2593405e92cSStefano Zampini 
2603405e92cSStefano Zampini /*MC
2611d27aa22SBarry Smith      TSDIRKES122SAL - First order DIRK scheme <https://arxiv.org/abs/1803.01613>
2623405e92cSStefano Zampini 
2633405e92cSStefano Zampini      Uses backward Euler as advancing method and trapezoidal rule as embedded method. See `TSDIRK` for additional details.
2643405e92cSStefano Zampini 
2653405e92cSStefano Zampini      Options Database Key:
2663405e92cSStefano Zampini .      -ts_dirk_type es122sal - select this method.
2673405e92cSStefano Zampini 
2683405e92cSStefano Zampini      Level: advanced
2693405e92cSStefano Zampini 
2703405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
2713405e92cSStefano Zampini M*/
2723405e92cSStefano Zampini 
2733405e92cSStefano Zampini /*MC
2741d27aa22SBarry Smith      TSDIRKES213SAL - Second order DIRK scheme {cite}`kennedy2019diagonally`. Also known as TR-BDF2, see{cite}`hosea1996analysis`
2753405e92cSStefano Zampini 
2763405e92cSStefano Zampini      See `TSDIRK` for additional details.
2773405e92cSStefano Zampini 
2783405e92cSStefano Zampini      Options Database Key:
2793405e92cSStefano Zampini .      -ts_dirk_type es213sal - select this method.
2803405e92cSStefano Zampini 
2813405e92cSStefano Zampini      Level: advanced
2823405e92cSStefano Zampini 
2833405e92cSStefano Zampini      Note:
2843405e92cSStefano Zampini      This is the default DIRK scheme used in PETSc.
2853405e92cSStefano Zampini 
2863405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
2873405e92cSStefano Zampini M*/
2883405e92cSStefano Zampini 
2893405e92cSStefano Zampini /*MC
2901d27aa22SBarry Smith      TSDIRKES324SAL - Third order DIRK scheme, {cite}`kennedy2019diagonally`
2913405e92cSStefano Zampini 
2923405e92cSStefano Zampini      See `TSDIRK` for additional details.
2933405e92cSStefano Zampini 
2943405e92cSStefano Zampini      Options Database Key:
2953405e92cSStefano Zampini .      -ts_dirk_type es324sal - select this method.
2963405e92cSStefano Zampini 
2973405e92cSStefano Zampini      Level: advanced
2983405e92cSStefano Zampini 
2993405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3003405e92cSStefano Zampini M*/
3013405e92cSStefano Zampini 
3023405e92cSStefano Zampini /*MC
3031d27aa22SBarry Smith      TSDIRKES325SAL - Third order DIRK scheme {cite}`kennedy2019diagonally`.
3043405e92cSStefano Zampini 
3053405e92cSStefano Zampini      See `TSDIRK` for additional details.
3063405e92cSStefano Zampini 
3073405e92cSStefano Zampini      Options Database Key:
3083405e92cSStefano Zampini .      -ts_dirk_type es325sal - select this method.
3093405e92cSStefano Zampini 
3103405e92cSStefano Zampini      Level: advanced
3113405e92cSStefano Zampini 
3123405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3133405e92cSStefano Zampini M*/
3143405e92cSStefano Zampini 
3153405e92cSStefano Zampini /*MC
3161d27aa22SBarry Smith      TSDIRK657A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3173405e92cSStefano Zampini 
3183405e92cSStefano Zampini      See `TSDIRK` for additional details.
3193405e92cSStefano Zampini 
3203405e92cSStefano Zampini      Options Database Key:
3213405e92cSStefano Zampini .      -ts_dirk_type 657a - select this method.
3223405e92cSStefano Zampini 
3233405e92cSStefano Zampini      Level: advanced
3243405e92cSStefano Zampini 
3253405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3263405e92cSStefano Zampini M*/
3273405e92cSStefano Zampini 
3283405e92cSStefano Zampini /*MC
3291d27aa22SBarry Smith      TSDIRKES648SA - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3303405e92cSStefano Zampini 
3313405e92cSStefano Zampini      See `TSDIRK` for additional details.
3323405e92cSStefano Zampini 
3333405e92cSStefano Zampini      Options Database Key:
3343405e92cSStefano Zampini .      -ts_dirk_type es648sa - select this method.
3353405e92cSStefano Zampini 
3363405e92cSStefano Zampini      Level: advanced
3373405e92cSStefano Zampini 
3383405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3393405e92cSStefano Zampini M*/
3403405e92cSStefano Zampini 
3413405e92cSStefano Zampini /*MC
3421d27aa22SBarry Smith      TSDIRK658A - Sixth order DIRK scheme  <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3433405e92cSStefano Zampini 
3443405e92cSStefano Zampini      See `TSDIRK` for additional details.
3453405e92cSStefano Zampini 
3463405e92cSStefano Zampini      Options Database Key:
3473405e92cSStefano Zampini .      -ts_dirk_type 658a - select this method.
3483405e92cSStefano Zampini 
3493405e92cSStefano Zampini      Level: advanced
3503405e92cSStefano Zampini 
3513405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3523405e92cSStefano Zampini M*/
3533405e92cSStefano Zampini 
3543405e92cSStefano Zampini /*MC
3551d27aa22SBarry Smith      TSDIRKS659A - Sixth order DIRK scheme  <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3563405e92cSStefano Zampini 
3573405e92cSStefano Zampini      See `TSDIRK` for additional details.
3583405e92cSStefano Zampini 
3593405e92cSStefano Zampini      Options Database Key:
3603405e92cSStefano Zampini .      -ts_dirk_type s659a - select this method.
3613405e92cSStefano Zampini 
3623405e92cSStefano Zampini      Level: advanced
3633405e92cSStefano Zampini 
3643405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3653405e92cSStefano Zampini M*/
3663405e92cSStefano Zampini 
3673405e92cSStefano Zampini /*MC
3681d27aa22SBarry Smith      TSDIRK7510SAL - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3693405e92cSStefano Zampini 
3703405e92cSStefano Zampini      See `TSDIRK` for additional details.
3713405e92cSStefano Zampini 
3723405e92cSStefano Zampini      Options Database Key:
3733405e92cSStefano Zampini .      -ts_dirk_type 7510sal - select this method.
3743405e92cSStefano Zampini 
3753405e92cSStefano Zampini      Level: advanced
3763405e92cSStefano Zampini 
3773405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3783405e92cSStefano Zampini M*/
3793405e92cSStefano Zampini 
3803405e92cSStefano Zampini /*MC
3811d27aa22SBarry Smith      TSDIRKES7510SA - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3823405e92cSStefano Zampini 
3833405e92cSStefano Zampini      See `TSDIRK` for additional details.
3843405e92cSStefano Zampini 
3853405e92cSStefano Zampini      Options Database Key:
3863405e92cSStefano Zampini .      -ts_dirk_type es7510sa - select this method.
3873405e92cSStefano Zampini 
3883405e92cSStefano Zampini      Level: advanced
3893405e92cSStefano Zampini 
3903405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
3913405e92cSStefano Zampini M*/
3923405e92cSStefano Zampini 
3933405e92cSStefano Zampini /*MC
3941d27aa22SBarry Smith      TSDIRK759A - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
3953405e92cSStefano Zampini 
3963405e92cSStefano Zampini      See `TSDIRK` for additional details.
3973405e92cSStefano Zampini 
3983405e92cSStefano Zampini      Options Database Key:
3993405e92cSStefano Zampini .      -ts_dirk_type 759a - select this method.
4003405e92cSStefano Zampini 
4013405e92cSStefano Zampini      Level: advanced
4023405e92cSStefano Zampini 
4033405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
4043405e92cSStefano Zampini M*/
4053405e92cSStefano Zampini 
4063405e92cSStefano Zampini /*MC
4071d27aa22SBarry Smith      TSDIRKS7511SAL - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
4083405e92cSStefano Zampini 
4093405e92cSStefano Zampini      See `TSDIRK` for additional details.
4103405e92cSStefano Zampini 
4113405e92cSStefano Zampini      Options Database Key:
4123405e92cSStefano Zampini .      -ts_dirk_type s7511sal - select this method.
4133405e92cSStefano Zampini 
4143405e92cSStefano Zampini      Level: advanced
4153405e92cSStefano Zampini 
4163405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
4173405e92cSStefano Zampini M*/
4183405e92cSStefano Zampini 
4193405e92cSStefano Zampini /*MC
4201d27aa22SBarry Smith      TSDIRK8614A - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
4213405e92cSStefano Zampini 
4223405e92cSStefano Zampini      See `TSDIRK` for additional details.
4233405e92cSStefano Zampini 
4243405e92cSStefano Zampini      Options Database Key:
4253405e92cSStefano Zampini .      -ts_dirk_type 8614a - select this method.
4263405e92cSStefano Zampini 
4273405e92cSStefano Zampini      Level: advanced
4283405e92cSStefano Zampini 
4293405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
4303405e92cSStefano Zampini M*/
4313405e92cSStefano Zampini 
4323405e92cSStefano Zampini /*MC
4331d27aa22SBarry Smith      TSDIRK8616SAL - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
4343405e92cSStefano Zampini 
4353405e92cSStefano Zampini      See `TSDIRK` for additional details.
4363405e92cSStefano Zampini 
4373405e92cSStefano Zampini      Options Database Key:
4383405e92cSStefano Zampini .      -ts_dirk_type 8616sal - select this method.
4393405e92cSStefano Zampini 
4403405e92cSStefano Zampini      Level: advanced
4413405e92cSStefano Zampini 
4423405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
4433405e92cSStefano Zampini M*/
4443405e92cSStefano Zampini 
4453405e92cSStefano Zampini /*MC
4461d27aa22SBarry Smith      TSDIRKES8516SAL - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs>
4473405e92cSStefano Zampini 
4483405e92cSStefano Zampini      See `TSDIRK` for additional details.
4493405e92cSStefano Zampini 
4503405e92cSStefano Zampini      Options Database Key:
4513405e92cSStefano Zampini .      -ts_dirk_type es8516sal - select this method.
4523405e92cSStefano Zampini 
4533405e92cSStefano Zampini      Level: advanced
4543405e92cSStefano Zampini 
4553405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
4563405e92cSStefano Zampini M*/
4573405e92cSStefano Zampini 
458d27334e2SStefano Zampini static PetscErrorCode TSHasRHSFunction(TS ts, PetscBool *has)
459d27334e2SStefano Zampini {
4608434afd1SBarry Smith   TSRHSFunctionFn *func;
461d27334e2SStefano Zampini 
462d27334e2SStefano Zampini   PetscFunctionBegin;
463d27334e2SStefano Zampini   *has = PETSC_FALSE;
464d27334e2SStefano Zampini   PetscCall(DMTSGetRHSFunction(ts->dm, &func, NULL));
465d27334e2SStefano Zampini   if (func) *has = PETSC_TRUE;
466d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
467d27334e2SStefano Zampini }
468d27334e2SStefano Zampini 
4698a381b04SJed Brown /*@C
470bcf0153eSBarry Smith   TSARKIMEXRegisterAll - Registers all of the additive Runge-Kutta implicit-explicit methods in `TSARKIMEX`
4718a381b04SJed Brown 
472fca742c7SJed Brown   Not Collective, but should be called by all processes which will need the schemes to be registered
4738a381b04SJed Brown 
4748a381b04SJed Brown   Level: advanced
4758a381b04SJed Brown 
4761cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSARKIMEX`, `TSARKIMEXRegisterDestroy()`
4778a381b04SJed Brown @*/
478d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterAll(void)
479d71ae5a4SJacob Faibussowitsch {
4808a381b04SJed Brown   PetscFunctionBegin;
4813ba16761SJacob Faibussowitsch   if (TSARKIMEXRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
4828a381b04SJed Brown   TSARKIMEXRegisterAllCalled = PETSC_TRUE;
483e817cc15SEmil Constantinescu 
484d27334e2SStefano Zampini #define RC  PetscRealConstant
485d27334e2SStefano Zampini #define s2  RC(1.414213562373095048802)  /* PetscSqrtReal((PetscReal)2.0) */
486d27334e2SStefano Zampini #define us2 RC(0.2928932188134524755992) /* 1.0-1.0/PetscSqrtReal((PetscReal)2.0); */
487d27334e2SStefano Zampini 
488d27334e2SStefano Zampini   /* Diagonally implicit methods */
489e817cc15SEmil Constantinescu   {
490d27334e2SStefano Zampini     /* DIRK212, default of SUNDIALS */
491d27334e2SStefano Zampini     const PetscReal A[2][2] = {
492d27334e2SStefano Zampini       {RC(1.0),  RC(0.0)},
493d27334e2SStefano Zampini       {RC(-1.0), RC(1.0)}
494d27334e2SStefano Zampini     };
495d27334e2SStefano Zampini     const PetscReal b[2]      = {RC(0.5), RC(0.5)};
496d27334e2SStefano Zampini     const PetscReal bembed[2] = {RC(1.0), RC(0.0)};
497d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKS212, 2, 2, &A[0][0], b, NULL, bembed, 1, b));
498d27334e2SStefano Zampini   }
499d27334e2SStefano Zampini 
5009371c9d4SSatish Balay   {
501d27334e2SStefano Zampini     /* ESDIRK12 from https://arxiv.org/pdf/1803.01613.pdf */
502d27334e2SStefano Zampini     const PetscReal A[2][2] = {
503d27334e2SStefano Zampini       {RC(0.0), RC(0.0)},
504d27334e2SStefano Zampini       {RC(0.0), RC(1.0)}
505d27334e2SStefano Zampini     };
506d27334e2SStefano Zampini     const PetscReal b[2]      = {RC(0.0), RC(1.0)};
507d27334e2SStefano Zampini     const PetscReal bembed[2] = {RC(0.5), RC(0.5)};
5083405e92cSStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES122SAL, 1, 2, &A[0][0], b, NULL, bembed, 1, b));
509d27334e2SStefano Zampini   }
510d27334e2SStefano Zampini 
511d27334e2SStefano Zampini   {
512d27334e2SStefano Zampini     /* ESDIRK213L[2]SA from KC16.
5133405e92cSStefano Zampini        TR-BDF2 from Hosea and Shampine
5143405e92cSStefano Zampini        ESDIRK23 in https://arxiv.org/pdf/1803.01613.pdf */
515d27334e2SStefano Zampini     const PetscReal A[3][3] = {
516d27334e2SStefano Zampini       {RC(0.0),      RC(0.0),      RC(0.0)},
517d27334e2SStefano Zampini       {us2,          us2,          RC(0.0)},
518d27334e2SStefano Zampini       {s2 / RC(4.0), s2 / RC(4.0), us2    },
519d27334e2SStefano Zampini     };
520d27334e2SStefano Zampini     const PetscReal b[3]      = {s2 / RC(4.0), s2 / RC(4.0), us2};
521d27334e2SStefano 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)};
522d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES213SAL, 2, 3, &A[0][0], b, NULL, bembed, 1, b));
523d27334e2SStefano Zampini   }
524d27334e2SStefano Zampini 
525d27334e2SStefano Zampini   {
526d27334e2SStefano Zampini #define g   RC(0.43586652150845899941601945)
527d27334e2SStefano Zampini #define g2  PetscSqr(g)
528d27334e2SStefano Zampini #define g3  g *g2
529d27334e2SStefano Zampini #define g4  PetscSqr(g2)
530d27334e2SStefano Zampini #define g5  g *g4
531d27334e2SStefano Zampini #define c3  RC(1.0)
532d27334e2SStefano Zampini #define a32 c3 *(c3 - RC(2.0) * g) / (RC(4.0) * g)
533d27334e2SStefano 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))
534d27334e2SStefano Zampini #define b3  (RC(1.0) - RC(6.0) * g + RC(6.0) * g2) / (RC(3.0) * c3 * (c3 - RC(2.0) * g))
535d27334e2SStefano Zampini #if 0
536d27334e2SStefano Zampini /* This is for c3 = 3/5 */
537d27334e2SStefano Zampini   #define bh2 \
538d27334e2SStefano 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))
539d27334e2SStefano 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))
540d27334e2SStefano 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)
541d27334e2SStefano Zampini #else
542d27334e2SStefano Zampini   /* This is for c3 = 1.0 */
543d27334e2SStefano Zampini   #define bh2 a32
544d27334e2SStefano Zampini   #define bh3 g
545d27334e2SStefano Zampini   #define bh4 RC(0.0)
546d27334e2SStefano Zampini #endif
547d27334e2SStefano Zampini     /* ESDIRK3(2I)4L[2]SA from KC16 with c3 = 1.0 */
548d27334e2SStefano Zampini     /* Given by Kvaerno https://link.springer.com/article/10.1023/b:bitn.0000046811.70614.38 */
549d27334e2SStefano Zampini     const PetscReal A[4][4] = {
550d27334e2SStefano Zampini       {RC(0.0),               RC(0.0), RC(0.0), RC(0.0)},
551d27334e2SStefano Zampini       {g,                     g,       RC(0.0), RC(0.0)},
552d27334e2SStefano Zampini       {c3 - a32 - g,          a32,     g,       RC(0.0)},
553d27334e2SStefano Zampini       {RC(1.0) - b2 - b3 - g, b2,      b3,      g      },
554d27334e2SStefano Zampini     };
555d27334e2SStefano Zampini     const PetscReal b[4]      = {RC(1.0) - b2 - b3 - g, b2, b3, g};
556d27334e2SStefano Zampini     const PetscReal bembed[4] = {RC(1.0) - bh2 - bh3 - bh4, bh2, bh3, bh4};
557d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES324SAL, 3, 4, &A[0][0], b, NULL, bembed, 1, b));
558d27334e2SStefano Zampini #undef g
559d27334e2SStefano Zampini #undef g2
560d27334e2SStefano Zampini #undef g3
561d27334e2SStefano Zampini #undef c3
562d27334e2SStefano Zampini #undef a32
563d27334e2SStefano Zampini #undef b2
564d27334e2SStefano Zampini #undef b3
565d27334e2SStefano Zampini #undef bh2
566d27334e2SStefano Zampini #undef bh3
567d27334e2SStefano Zampini #undef bh4
568d27334e2SStefano Zampini   }
569d27334e2SStefano Zampini 
570d27334e2SStefano Zampini   {
571d27334e2SStefano Zampini     /* ESDIRK3(2I)5L[2]SA from KC16 */
572d27334e2SStefano Zampini     const PetscReal A[5][5] = {
573d27334e2SStefano Zampini       {RC(0.0),                  RC(0.0),                  RC(0.0),                 RC(0.0),                   RC(0.0)           },
574d27334e2SStefano Zampini       {RC(9.0) / RC(40.0),       RC(9.0) / RC(40.0),       RC(0.0),                 RC(0.0),                   RC(0.0)           },
575d27334e2SStefano 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)           },
576d27334e2SStefano 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)           },
577d27334e2SStefano 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)},
578d27334e2SStefano Zampini     };
579d27334e2SStefano 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)};
580d27334e2SStefano 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)};
581d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES325SAL, 3, 5, &A[0][0], b, NULL, bembed, 1, b));
582d27334e2SStefano Zampini   }
583d27334e2SStefano Zampini 
584d27334e2SStefano Zampini   {
585d27334e2SStefano Zampini     // DIRK(6,6)[1]A[(7,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
586d27334e2SStefano Zampini     const PetscReal A[7][7] = {
587d27334e2SStefano Zampini       {RC(0.303487844706747),    RC(0.0),                RC(0.0),                   RC(0.0),                   RC(0.0),                 RC(0.0),                RC(0.0)              },
588d27334e2SStefano Zampini       {RC(-0.279756492709814),   RC(0.500032236020747),  RC(0.0),                   RC(0.0),                   RC(0.0),                 RC(0.0),                RC(0.0)              },
589d27334e2SStefano Zampini       {RC(0.280583215743895),    RC(-0.438560061586751), RC(0.217250734515736),     RC(0.0),                   RC(0.0),                 RC(0.0),                RC(0.0)              },
590d27334e2SStefano Zampini       {RC(-0.0677678738539846),  RC(0.984312781232293),  RC(-0.266720192540149),    RC(0.2476680834526),       RC(0.0),                 RC(0.0),                RC(0.0)              },
591d27334e2SStefano Zampini       {RC(0.125671616147993),    RC(-0.995401751002415), RC(0.761333109549059),     RC(-0.210281837202208),    RC(0.866743712636936),   RC(0.0),                RC(0.0)              },
592d27334e2SStefano Zampini       {RC(-0.368056238801488),   RC(-0.999928082701516), RC(0.534734253232519),     RC(-0.174856916279082),    RC(0.615007160285509),   RC(0.696549912132029),  RC(0.0)              },
593d27334e2SStefano Zampini       {RC(-0.00570546839653984), RC(-0.113110431835656), RC(-0.000965563207671587), RC(-0.000130490084629567), RC(0.00111737736895673), RC(-0.279385587378871), RC(0.618455906845342)}
594d27334e2SStefano Zampini     };
595d27334e2SStefano 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)};
596d27334e2SStefano 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)};
597d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK657A, 6, 7, &A[0][0], b, NULL, bembed, 1, b));
598d27334e2SStefano Zampini   }
599d27334e2SStefano Zampini   {
600d27334e2SStefano Zampini     // ESDIRK(8,6)[2]SA[(8,4)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
601d27334e2SStefano Zampini     const PetscReal A[8][8] = {
602d27334e2SStefano 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)              },
603d27334e2SStefano 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)              },
604d27334e2SStefano 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)              },
605d27334e2SStefano 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)              },
606d27334e2SStefano 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)              },
607d27334e2SStefano 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)              },
608d27334e2SStefano 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)              },
609d27334e2SStefano 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)}
610d27334e2SStefano Zampini     };
611d27334e2SStefano 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)};
612d27334e2SStefano 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)};
613d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES648SA, 6, 8, &A[0][0], b, NULL, bembed, 1, b));
614d27334e2SStefano Zampini   }
615d27334e2SStefano Zampini   {
616d27334e2SStefano Zampini     // DIRK(8,6)[1]SAL[(8,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
617d27334e2SStefano Zampini     const PetscReal A[8][8] = {
618d27334e2SStefano 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)              },
619d27334e2SStefano 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)              },
620d27334e2SStefano 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)              },
621d27334e2SStefano 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)              },
622d27334e2SStefano 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)              },
623d27334e2SStefano 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)              },
624d27334e2SStefano 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)              },
625d27334e2SStefano 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)}
626d27334e2SStefano Zampini     };
627d27334e2SStefano 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)};
628d27334e2SStefano 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)};
629d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK658A, 6, 8, &A[0][0], b, NULL, bembed, 1, b));
630d27334e2SStefano Zampini   }
631d27334e2SStefano Zampini   {
632d27334e2SStefano Zampini     // SDIRK(9,6)[1]SAL[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
633d27334e2SStefano Zampini     const PetscReal A[9][9] = {
634d27334e2SStefano 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)              },
635d27334e2SStefano 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)              },
636d27334e2SStefano 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)              },
637d27334e2SStefano 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)              },
638d27334e2SStefano 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)              },
639d27334e2SStefano 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)              },
640d27334e2SStefano 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)              },
641d27334e2SStefano 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)              },
642d27334e2SStefano 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)}
643d27334e2SStefano Zampini     };
644d27334e2SStefano 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)};
645d27334e2SStefano 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)};
646d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKS659A, 6, 9, &A[0][0], b, NULL, bembed, 1, b));
647d27334e2SStefano Zampini   }
648d27334e2SStefano Zampini   {
649d27334e2SStefano Zampini     // DIRK(10,7)[1]SAL[(10,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
650d27334e2SStefano Zampini     const PetscReal A[10][10] = {
651d27334e2SStefano 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)              },
652d27334e2SStefano 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)              },
653d27334e2SStefano 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)              },
654d27334e2SStefano 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)              },
655d27334e2SStefano 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)              },
656d27334e2SStefano 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)              },
657d27334e2SStefano 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)              },
658d27334e2SStefano 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)              },
659d27334e2SStefano 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)              },
660d27334e2SStefano 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)}
661d27334e2SStefano Zampini     };
662d27334e2SStefano 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)};
663d27334e2SStefano Zampini     const PetscReal bembed[10] =
664d27334e2SStefano 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)};
665d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK7510SAL, 7, 10, &A[0][0], b, NULL, bembed, 1, b));
666d27334e2SStefano Zampini   }
667d27334e2SStefano Zampini   {
668d27334e2SStefano Zampini     // ESDIRK(10,7)[2]SA[(10,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
669d27334e2SStefano Zampini     const PetscReal A[10][10] = {
670d27334e2SStefano 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)              },
671d27334e2SStefano 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)              },
672d27334e2SStefano 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)              },
673d27334e2SStefano 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)              },
674d27334e2SStefano 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)              },
675d27334e2SStefano 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)              },
676d27334e2SStefano 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)              },
677d27334e2SStefano 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)              },
678d27334e2SStefano 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)              },
679d27334e2SStefano 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)}
680d27334e2SStefano Zampini     };
681d27334e2SStefano Zampini     const PetscReal b[10]      = {RC(0.0705997961586714),   RC(-0.0281516061956374), RC(0.314600470734633),   RC(-0.0907057557963371), RC(0.168078953957742),
682d27334e2SStefano Zampini                                   RC(-0.00655694984590575), RC(0.0505384497804303),  RC(-0.0569572058725042), RC(0.368498056875488),   RC(0.210055790203419)};
683d27334e2SStefano Zampini     const PetscReal bembed[10] = {RC(-0.015494246543626), RC(0.167657963820093), RC(0.269858958144236),  RC(-0.0443258997755156), RC(0.150049236875266),
684d27334e2SStefano Zampini                                   RC(0.259452082755846),  RC(0.244624573502521), RC(-0.215528446920284), RC(0.0487601760292619),  RC(0.134945602112201)};
685d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES7510SA, 7, 10, &A[0][0], b, NULL, bembed, 1, b));
686d27334e2SStefano Zampini   }
687d27334e2SStefano Zampini   {
688d27334e2SStefano Zampini     // DIRK(9,7)[1]A[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
689d27334e2SStefano Zampini     const PetscReal A[9][9] = {
690d27334e2SStefano 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)               },
691d27334e2SStefano 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)               },
692d27334e2SStefano 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)               },
693d27334e2SStefano 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)               },
694d27334e2SStefano 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)               },
695d27334e2SStefano 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)               },
696d27334e2SStefano 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)               },
697d27334e2SStefano 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)               },
698d27334e2SStefano 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)}
699d27334e2SStefano Zampini     };
700d27334e2SStefano Zampini 
701d27334e2SStefano 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)};
702d27334e2SStefano 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)};
703d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK759A, 7, 9, &A[0][0], b, NULL, bembed, 1, b));
704d27334e2SStefano Zampini   }
705d27334e2SStefano Zampini   {
706d27334e2SStefano Zampini     // SDIRK(11,7)[1]SAL[(11,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
707d27334e2SStefano Zampini     const PetscReal A[11][11] = {
708d27334e2SStefano 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)              },
709d27334e2SStefano 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)              },
710d27334e2SStefano 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)              },
711d27334e2SStefano 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)              },
712d27334e2SStefano 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)              },
713d27334e2SStefano 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)              },
714d27334e2SStefano 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)              },
715d27334e2SStefano 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)              },
716d27334e2SStefano 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)              },
717d27334e2SStefano 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)              },
718d27334e2SStefano 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)}
719d27334e2SStefano Zampini     };
720d27334e2SStefano Zampini     const PetscReal b[11] =
721d27334e2SStefano 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)};
722d27334e2SStefano Zampini     const PetscReal bembed[11] =
723d27334e2SStefano 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)};
724d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKS7511SAL, 7, 11, &A[0][0], b, NULL, bembed, 1, b));
725d27334e2SStefano Zampini   }
726d27334e2SStefano Zampini   {
727d27334e2SStefano Zampini     // DIRK(13,8)[1]A[(14,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
728d27334e2SStefano Zampini     const PetscReal A[14][14] = {
729d27334e2SStefano 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)               },
730d27334e2SStefano 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)               },
731d27334e2SStefano 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)               },
732d27334e2SStefano 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)               },
733d27334e2SStefano 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)               },
734d27334e2SStefano 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)               },
735d27334e2SStefano 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)               },
736d27334e2SStefano 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)               },
737d27334e2SStefano 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)               },
738d27334e2SStefano 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)               },
739d27334e2SStefano 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)               },
740d27334e2SStefano 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)               },
741d27334e2SStefano 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)               },
742d27334e2SStefano 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)}
743d27334e2SStefano Zampini     };
744d27334e2SStefano 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)};
745d27334e2SStefano 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),
746d27334e2SStefano Zampini                                   RC(0.0417664613347638),   RC(0.223636394275293), RC(0.231569156867596), RC(0.240526201277663),   RC(-0.222933582911926),  RC(-0.0111479879597561), RC(0.19915314335888)};
747d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK8614A, 8, 14, &A[0][0], b, NULL, bembed, 1, b));
748d27334e2SStefano Zampini   }
749d27334e2SStefano Zampini   {
750d27334e2SStefano Zampini     // DIRK(15,8)[1]SAL[(16,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
751d27334e2SStefano Zampini     const PetscReal A[16][16] = {
752d27334e2SStefano 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)              },
753d27334e2SStefano 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)              },
754d27334e2SStefano 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)              },
755d27334e2SStefano 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)              },
756d27334e2SStefano 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)              },
757d27334e2SStefano 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)              },
758d27334e2SStefano 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)              },
759d27334e2SStefano 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)              },
760d27334e2SStefano 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)              },
761d27334e2SStefano 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)              },
762d27334e2SStefano 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)              },
763d27334e2SStefano 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)              },
764d27334e2SStefano 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)              },
765d27334e2SStefano 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)              },
766d27334e2SStefano 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)              },
767d27334e2SStefano 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)}
768d27334e2SStefano Zampini     };
769d27334e2SStefano 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)};
770d27334e2SStefano 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),
771d27334e2SStefano 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)};
772d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK8616SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b));
773d27334e2SStefano Zampini   }
774d27334e2SStefano Zampini   {
775d27334e2SStefano Zampini     // ESDIRK(16,8)[2]SAL[(16,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
776d27334e2SStefano Zampini     const PetscReal A[16][16] = {
777d27334e2SStefano 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)              },
778d27334e2SStefano 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)              },
779d27334e2SStefano 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)              },
780d27334e2SStefano 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)              },
781d27334e2SStefano 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)              },
782d27334e2SStefano 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)              },
783d27334e2SStefano 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)              },
784d27334e2SStefano 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)              },
785d27334e2SStefano 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)              },
786d27334e2SStefano 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)              },
787d27334e2SStefano 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)              },
788d27334e2SStefano 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)              },
789d27334e2SStefano 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)              },
790d27334e2SStefano 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)              },
791d27334e2SStefano 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)              },
792d27334e2SStefano 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)}
793d27334e2SStefano Zampini     };
794d27334e2SStefano 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),
795d27334e2SStefano 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)};
796d27334e2SStefano 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),
797d27334e2SStefano 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)};
798d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES8516SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b));
799d27334e2SStefano Zampini   }
800d27334e2SStefano Zampini 
801d27334e2SStefano Zampini   /* Additive methods */
802d27334e2SStefano Zampini   {
803d27334e2SStefano Zampini     const PetscReal A[3][3] = {
804e817cc15SEmil Constantinescu       {0.0, 0.0, 0.0},
8059371c9d4SSatish Balay       {0.0, 0.0, 0.0},
8069371c9d4SSatish Balay       {0.0, 0.5, 0.0}
807d27334e2SStefano Zampini     };
808d27334e2SStefano Zampini     const PetscReal At[3][3] = {
809d27334e2SStefano Zampini       {1.0, 0.0, 0.0},
810d27334e2SStefano Zampini       {0.0, 0.5, 0.0},
811d27334e2SStefano Zampini       {0.0, 0.5, 0.5}
812d27334e2SStefano Zampini     };
813d27334e2SStefano Zampini     const PetscReal b[3]       = {0.0, 0.5, 0.5};
814d27334e2SStefano Zampini     const PetscReal bembedt[3] = {1.0, 0.0, 0.0};
8159566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX1BEE, 2, 3, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL));
816e817cc15SEmil Constantinescu   }
8178a381b04SJed Brown   {
818d27334e2SStefano Zampini     const PetscReal A[2][2] = {
8199371c9d4SSatish Balay       {0.0, 0.0},
8209371c9d4SSatish Balay       {0.5, 0.0}
821d27334e2SStefano Zampini     };
822d27334e2SStefano Zampini     const PetscReal At[2][2] = {
823d27334e2SStefano Zampini       {0.0, 0.0},
824d27334e2SStefano Zampini       {0.0, 0.5}
825d27334e2SStefano Zampini     };
826d27334e2SStefano Zampini     const PetscReal b[2]       = {0.0, 1.0};
827d27334e2SStefano Zampini     const PetscReal bembedt[2] = {0.5, 0.5};
8281f80e275SEmil 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 */
8299566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXARS122, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL));
8301f80e275SEmil Constantinescu   }
8311f80e275SEmil Constantinescu   {
832d27334e2SStefano Zampini     const PetscReal A[2][2] = {
8339371c9d4SSatish Balay       {0.0, 0.0},
8349371c9d4SSatish Balay       {1.0, 0.0}
835d27334e2SStefano Zampini     };
836d27334e2SStefano Zampini     const PetscReal At[2][2] = {
837d27334e2SStefano Zampini       {0.0, 0.0},
838d27334e2SStefano Zampini       {0.5, 0.5}
839d27334e2SStefano Zampini     };
840d27334e2SStefano Zampini     const PetscReal b[2]       = {0.5, 0.5};
841d27334e2SStefano Zampini     const PetscReal bembedt[2] = {0.0, 1.0};
8421f80e275SEmil 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 */
8439566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXA2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL));
8441f80e275SEmil Constantinescu   }
8451f80e275SEmil Constantinescu   {
846d27334e2SStefano Zampini     const PetscReal A[2][2] = {
8479371c9d4SSatish Balay       {0.0, 0.0},
8489371c9d4SSatish Balay       {1.0, 0.0}
849d27334e2SStefano Zampini     };
850d27334e2SStefano Zampini     const PetscReal At[2][2] = {
851d27334e2SStefano Zampini       {us2,             0.0},
852d27334e2SStefano Zampini       {1.0 - 2.0 * us2, us2}
853d27334e2SStefano Zampini     };
854d27334e2SStefano Zampini     const PetscReal b[2]           = {0.5, 0.5};
855d27334e2SStefano Zampini     const PetscReal bembedt[2]     = {0.0, 1.0};
856d27334e2SStefano Zampini     const PetscReal binterpt[2][2] = {
857d27334e2SStefano Zampini       {(us2 - 1.0) / (2.0 * us2 - 1.0),     -1 / (2.0 * (1.0 - 2.0 * us2))},
858d27334e2SStefano Zampini       {1 - (us2 - 1.0) / (2.0 * us2 - 1.0), -1 / (2.0 * (1.0 - 2.0 * us2))}
859d27334e2SStefano Zampini     };
860d27334e2SStefano Zampini     const PetscReal binterp[2][2] = {
861d27334e2SStefano Zampini       {1.0, -0.5},
862d27334e2SStefano Zampini       {0.0, 0.5 }
863d27334e2SStefano Zampini     };
8649566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXL2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 2, binterpt[0], binterp[0]));
8651f80e275SEmil Constantinescu   }
8661f80e275SEmil Constantinescu   {
867d27334e2SStefano Zampini     const PetscReal A[3][3] = {
8689371c9d4SSatish Balay       {0,      0,   0},
869d27334e2SStefano Zampini       {2 - s2, 0,   0},
8709371c9d4SSatish Balay       {0.5,    0.5, 0}
871d27334e2SStefano Zampini     };
872d27334e2SStefano Zampini     const PetscReal At[3][3] = {
873d27334e2SStefano Zampini       {0,            0,            0         },
874d27334e2SStefano Zampini       {1 - 1 / s2,   1 - 1 / s2,   0         },
875d27334e2SStefano Zampini       {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2}
876d27334e2SStefano Zampini     };
877d27334e2SStefano Zampini     const PetscReal bembedt[3]     = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)};
878d27334e2SStefano Zampini     const PetscReal binterpt[3][2] = {
879d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
880d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
881d27334e2SStefano Zampini       {1.0 - s2, 1.0 / s2         }
882d27334e2SStefano Zampini     };
8839566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX2C, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
8841f80e275SEmil Constantinescu   }
8851f80e275SEmil Constantinescu   {
886d27334e2SStefano Zampini     const PetscReal A[3][3] = {
8879371c9d4SSatish Balay       {0,      0,    0},
888d27334e2SStefano Zampini       {2 - s2, 0,    0},
8899371c9d4SSatish Balay       {0.75,   0.25, 0}
890d27334e2SStefano Zampini     };
891d27334e2SStefano Zampini     const PetscReal At[3][3] = {
892d27334e2SStefano Zampini       {0,            0,            0         },
893d27334e2SStefano Zampini       {1 - 1 / s2,   1 - 1 / s2,   0         },
894d27334e2SStefano Zampini       {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2}
895d27334e2SStefano Zampini     };
896d27334e2SStefano Zampini     const PetscReal bembedt[3]     = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)};
897d27334e2SStefano Zampini     const PetscReal binterpt[3][2] = {
898d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
899d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
900d27334e2SStefano Zampini       {1.0 - s2, 1.0 / s2         }
901d27334e2SStefano Zampini     };
9029566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX2D, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
9038a381b04SJed Brown   }
90406db7b1cSJed Brown   { /* Optimal for linear implicit part */
905d27334e2SStefano Zampini     const PetscReal A[3][3] = {
9069371c9d4SSatish Balay       {0,                0,                0},
907d27334e2SStefano Zampini       {2 - s2,           0,                0},
908d27334e2SStefano Zampini       {(3 - 2 * s2) / 6, (3 + 2 * s2) / 6, 0}
909d27334e2SStefano Zampini     };
910d27334e2SStefano Zampini     const PetscReal At[3][3] = {
911d27334e2SStefano Zampini       {0,            0,            0         },
912d27334e2SStefano Zampini       {1 - 1 / s2,   1 - 1 / s2,   0         },
913d27334e2SStefano Zampini       {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2}
914d27334e2SStefano Zampini     };
915d27334e2SStefano Zampini     const PetscReal bembedt[3]     = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)};
916d27334e2SStefano Zampini     const PetscReal binterpt[3][2] = {
917d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
918d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
919d27334e2SStefano Zampini       {1.0 - s2, 1.0 / s2         }
920d27334e2SStefano Zampini     };
9219566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX2E, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
922a3a57f36SJed Brown   }
9236cf0794eSJed Brown   { /* Optimal for linear implicit part */
924d27334e2SStefano Zampini     const PetscReal A[3][3] = {
9259371c9d4SSatish Balay       {0,   0,   0},
9266cf0794eSJed Brown       {0.5, 0,   0},
9279371c9d4SSatish Balay       {0.5, 0.5, 0}
928d27334e2SStefano Zampini     };
929d27334e2SStefano Zampini     const PetscReal At[3][3] = {
930d27334e2SStefano Zampini       {0.25,   0,      0     },
931d27334e2SStefano Zampini       {0,      0.25,   0     },
932d27334e2SStefano Zampini       {1. / 3, 1. / 3, 1. / 3}
933d27334e2SStefano Zampini     };
9349566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXPRSSP2, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL));
9356cf0794eSJed Brown   }
936a3a57f36SJed Brown   {
937d27334e2SStefano Zampini     const PetscReal A[4][4] = {
9389371c9d4SSatish Balay       {0,                                0,                                0,                                 0},
9394040e9f2SJed Brown       {1767732205903. / 2027836641118.,  0,                                0,                                 0},
9404040e9f2SJed Brown       {5535828885825. / 10492691773637., 788022342437. / 10882634858940.,  0,                                 0},
9419371c9d4SSatish Balay       {6485989280629. / 16251701735622., -4246266847089. / 9704473918619., 10755448449292. / 10357097424841., 0}
942d27334e2SStefano Zampini     };
943d27334e2SStefano Zampini     const PetscReal At[4][4] = {
944d27334e2SStefano Zampini       {0,                                0,                                0,                                 0                              },
945d27334e2SStefano Zampini       {1767732205903. / 4055673282236.,  1767732205903. / 4055673282236.,  0,                                 0                              },
946d27334e2SStefano Zampini       {2746238789719. / 10658868560708., -640167445237. / 6845629431997.,  1767732205903. / 4055673282236.,   0                              },
947d27334e2SStefano Zampini       {1471266399579. / 7840856788654.,  -4482444167858. / 7529755066697., 11266239266428. / 11593286722821., 1767732205903. / 4055673282236.}
948d27334e2SStefano Zampini     };
949d27334e2SStefano Zampini     const PetscReal bembedt[4]     = {2756255671327. / 12835298489170., -10771552573575. / 22201958757719., 9247589265047. / 10645013368117., 2193209047091. / 5459859503100.};
950d27334e2SStefano Zampini     const PetscReal binterpt[4][2] = {
951d27334e2SStefano Zampini       {4655552711362. / 22874653954995.,  -215264564351. / 13552729205753.  },
952d27334e2SStefano Zampini       {-18682724506714. / 9892148508045., 17870216137069. / 13817060693119. },
953d27334e2SStefano Zampini       {34259539580243. / 13192909600954., -28141676662227. / 17317692491321.},
954d27334e2SStefano Zampini       {584795268549. / 6622622206610.,    2508943948391. / 7218656332882.   }
955d27334e2SStefano Zampini     };
9569566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX3, 3, 4, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
957a3a57f36SJed Brown   }
958a3a57f36SJed Brown   {
959d27334e2SStefano Zampini     const PetscReal A[5][5] = {
9609371c9d4SSatish Balay       {0,        0,       0,      0,       0},
9616cf0794eSJed Brown       {1. / 2,   0,       0,      0,       0},
9626cf0794eSJed Brown       {11. / 18, 1. / 18, 0,      0,       0},
9636cf0794eSJed Brown       {5. / 6,   -5. / 6, .5,     0,       0},
9649371c9d4SSatish Balay       {1. / 4,   7. / 4,  3. / 4, -7. / 4, 0}
965d27334e2SStefano Zampini     };
966d27334e2SStefano Zampini     const PetscReal At[5][5] = {
967d27334e2SStefano Zampini       {0, 0,       0,       0,      0     },
968d27334e2SStefano Zampini       {0, 1. / 2,  0,       0,      0     },
969d27334e2SStefano Zampini       {0, 1. / 6,  1. / 2,  0,      0     },
970d27334e2SStefano Zampini       {0, -1. / 2, 1. / 2,  1. / 2, 0     },
971d27334e2SStefano Zampini       {0, 3. / 2,  -3. / 2, 1. / 2, 1. / 2}
972d27334e2SStefano Zampini     };
973d27334e2SStefano Zampini     PetscCall(TSARKIMEXRegister(TSARKIMEXARS443, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL));
9746cf0794eSJed Brown   }
9756cf0794eSJed Brown   {
976d27334e2SStefano Zampini     const PetscReal A[5][5] = {
9779371c9d4SSatish Balay       {0,      0,      0,      0, 0},
9786cf0794eSJed Brown       {1,      0,      0,      0, 0},
9796cf0794eSJed Brown       {4. / 9, 2. / 9, 0,      0, 0},
9806cf0794eSJed Brown       {1. / 4, 0,      3. / 4, 0, 0},
9819371c9d4SSatish Balay       {1. / 4, 0,      3. / 5, 0, 0}
982d27334e2SStefano Zampini     };
983d27334e2SStefano Zampini     const PetscReal At[5][5] = {
984d27334e2SStefano Zampini       {0,       0,       0,   0,   0 },
985d27334e2SStefano Zampini       {.5,      .5,      0,   0,   0 },
986d27334e2SStefano Zampini       {5. / 18, -1. / 9, .5,  0,   0 },
987d27334e2SStefano Zampini       {.5,      0,       0,   .5,  0 },
988d27334e2SStefano Zampini       {.25,     0,       .75, -.5, .5}
989d27334e2SStefano Zampini     };
990d27334e2SStefano Zampini     PetscCall(TSARKIMEXRegister(TSARKIMEXBPR3, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL));
9916cf0794eSJed Brown   }
9926cf0794eSJed Brown   {
993d27334e2SStefano Zampini     const PetscReal A[6][6] = {
9949371c9d4SSatish Balay       {0,                               0,                                 0,                                 0,                                0,              0},
995a3a57f36SJed Brown       {1. / 2,                          0,                                 0,                                 0,                                0,              0},
9964040e9f2SJed Brown       {13861. / 62500.,                 6889. / 62500.,                    0,                                 0,                                0,              0},
9974040e9f2SJed Brown       {-116923316275. / 2393684061468., -2731218467317. / 15368042101831., 9408046702089. / 11113171139209.,  0,                                0,              0},
9984040e9f2SJed Brown       {-451086348788. / 2902428689909., -2682348792572. / 7519795681897.,  12662868775082. / 11960479115383., 3355817975965. / 11060851509271., 0,              0},
9999371c9d4SSatish Balay       {647845179188. / 3216320057751.,  73281519250. / 8382639484533.,     552539513391. / 3454668386233.,    3354512671639. / 8306763924573.,  4040. / 17871., 0}
1000d27334e2SStefano Zampini     };
1001d27334e2SStefano Zampini     const PetscReal At[6][6] = {
1002d27334e2SStefano Zampini       {0,                            0,                       0,                       0,                   0,             0     },
1003d27334e2SStefano Zampini       {1. / 4,                       1. / 4,                  0,                       0,                   0,             0     },
1004d27334e2SStefano Zampini       {8611. / 62500.,               -1743. / 31250.,         1. / 4,                  0,                   0,             0     },
1005d27334e2SStefano Zampini       {5012029. / 34652500.,         -654441. / 2922500.,     174375. / 388108.,       1. / 4,              0,             0     },
1006d27334e2SStefano Zampini       {15267082809. / 155376265600., -71443401. / 120774400., 730878875. / 902184768., 2285395. / 8070912., 1. / 4,        0     },
1007d27334e2SStefano Zampini       {82889. / 524892.,             0,                       15625. / 83664.,         69875. / 102672.,    -2260. / 8211, 1. / 4}
1008d27334e2SStefano Zampini     };
1009d27334e2SStefano Zampini     const PetscReal bembedt[6]     = {4586570599. / 29645900160., 0, 178811875. / 945068544., 814220225. / 1159782912., -3700637. / 11593932., 61727. / 225920.};
1010d27334e2SStefano Zampini     const PetscReal binterpt[6][3] = {
1011d27334e2SStefano Zampini       {6943876665148. / 7220017795957.,   -54480133. / 30881146., 6818779379841. / 7100303317025.  },
1012d27334e2SStefano Zampini       {0,                                 0,                      0                                },
1013d27334e2SStefano Zampini       {7640104374378. / 9702883013639.,   -11436875. / 14766696., 2173542590792. / 12501825683035. },
1014d27334e2SStefano Zampini       {-20649996744609. / 7521556579894., 174696575. / 18121608., -31592104683404. / 5083833661969.},
1015d27334e2SStefano Zampini       {8854892464581. / 2390941311638.,   -12120380. / 966161.,   61146701046299. / 7138195549469. },
1016d27334e2SStefano Zampini       {-11397109935349. / 6675773540249., 3843. / 706.,           -17219254887155. / 4939391667607.}
1017d27334e2SStefano Zampini     };
10189566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX4, 4, 6, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL));
1019a3a57f36SJed Brown   }
1020a3a57f36SJed Brown   {
1021d27334e2SStefano Zampini     const PetscReal A[8][8] = {
10229371c9d4SSatish Balay       {0,                                  0,                              0,                                 0,                                  0,                               0,                                 0,                               0},
1023a3a57f36SJed Brown       {41. / 100,                          0,                              0,                                 0,                                  0,                               0,                                 0,                               0},
10244040e9f2SJed Brown       {367902744464. / 2072280473677.,     677623207551. / 8224143866563., 0,                                 0,                                  0,                               0,                                 0,                               0},
10254040e9f2SJed Brown       {1268023523408. / 10340822734521.,   0,                              1029933939417. / 13636558850479.,  0,                                  0,                               0,                                 0,                               0},
10264040e9f2SJed Brown       {14463281900351. / 6315353703477.,   0,                              66114435211212. / 5879490589093.,  -54053170152839. / 4284798021562.,  0,                               0,                                 0,                               0},
10274040e9f2SJed Brown       {14090043504691. / 34967701212078.,  0,                              15191511035443. / 11219624916014., -18461159152457. / 12425892160975., -281667163811. / 9011619295870., 0,                                 0,                               0},
10284040e9f2SJed Brown       {19230459214898. / 13134317526959.,  0,                              21275331358303. / 2942455364971.,  -38145345988419. / 4862620318723.,  -1. / 8,                         -1. / 8,                           0,                               0},
10299371c9d4SSatish Balay       {-19977161125411. / 11928030595625., 0,                              -40795976796054. / 6384907823539., 177454434618887. / 12078138498510., 782672205425. / 8267701900261.,  -69563011059811. / 9646580694205., 7356628210526. / 4942186776405., 0}
1030d27334e2SStefano Zampini     };
1031d27334e2SStefano Zampini     const PetscReal At[8][8] = {
1032d27334e2SStefano Zampini       {0,                                0,                                0,                                 0,                                  0,                                0,                                  0,                                 0         },
1033d27334e2SStefano Zampini       {41. / 200.,                       41. / 200.,                       0,                                 0,                                  0,                                0,                                  0,                                 0         },
1034d27334e2SStefano Zampini       {41. / 400.,                       -567603406766. / 11931857230679., 41. / 200.,                        0,                                  0,                                0,                                  0,                                 0         },
1035d27334e2SStefano Zampini       {683785636431. / 9252920307686.,   0,                                -110385047103. / 1367015193373.,   41. / 200.,                         0,                                0,                                  0,                                 0         },
1036d27334e2SStefano Zampini       {3016520224154. / 10081342136671., 0,                                30586259806659. / 12414158314087., -22760509404356. / 11113319521817., 41. / 200.,                       0,                                  0,                                 0         },
1037d27334e2SStefano Zampini       {218866479029. / 1489978393911.,   0,                                638256894668. / 5436446318841.,    -1179710474555. / 5321154724896.,   -60928119172. / 8023461067671.,   41. / 200.,                         0,                                 0         },
1038d27334e2SStefano Zampini       {1020004230633. / 5715676835656.,  0,                                25762820946817. / 25263940353407., -2161375909145. / 9755907335909.,   -211217309593. / 5846859502534.,  -4269925059573. / 7827059040749.,   41. / 200,                         0         },
1039d27334e2SStefano Zampini       {-872700587467. / 9133579230613.,  0,                                0,                                 22348218063261. / 9555858737531.,   -1143369518992. / 8141816002931., -39379526789629. / 19018526304540., 32727382324388. / 42900044865799., 41. / 200.}
1040d27334e2SStefano Zampini     };
1041d27334e2SStefano Zampini     const PetscReal bembedt[8]     = {-975461918565. / 9796059967033., 0, 0, 78070527104295. / 32432590147079., -548382580838. / 3424219808633., -33438840321285. / 15594753105479., 3629800801594. / 4656183773603., 4035322873751. / 18575991585200.};
1042d27334e2SStefano Zampini     const PetscReal binterpt[8][3] = {
1043d27334e2SStefano Zampini       {-17674230611817. / 10670229744614., 43486358583215. / 12773830924787.,  -9257016797708. / 5021505065439. },
1044d27334e2SStefano Zampini       {0,                                  0,                                  0                                },
1045d27334e2SStefano Zampini       {0,                                  0,                                  0                                },
1046d27334e2SStefano Zampini       {65168852399939. / 7868540260826.,   -91478233927265. / 11067650958493., 26096422576131. / 11239449250142.},
1047d27334e2SStefano Zampini       {15494834004392. / 5936557850923.,   -79368583304911. / 10890268929626., 92396832856987. / 20362823103730.},
1048d27334e2SStefano Zampini       {-99329723586156. / 26959484932159., -12239297817655. / 9152339842473.,  30029262896817. / 10175596800299.},
1049d27334e2SStefano Zampini       {-19024464361622. / 5461577185407.,  115839755401235. / 10719374521269., -26136350496073. / 3983972220547.},
1050d27334e2SStefano Zampini       {-6511271360970. / 6095937251113.,   5843115559534. / 2180450260947.,    -5289405421727. / 3760307252460. }
1051d27334e2SStefano Zampini     };
10529566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX5, 5, 8, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL));
1053a3a57f36SJed Brown   }
1054d27334e2SStefano Zampini #undef RC
1055d27334e2SStefano Zampini #undef us2
1056d27334e2SStefano Zampini #undef s2
10573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10588a381b04SJed Brown }
10598a381b04SJed Brown 
10608a381b04SJed Brown /*@C
1061bcf0153eSBarry Smith   TSARKIMEXRegisterDestroy - Frees the list of schemes that were registered by `TSARKIMEXRegister()`.
10628a381b04SJed Brown 
10638a381b04SJed Brown   Not Collective
10648a381b04SJed Brown 
10658a381b04SJed Brown   Level: advanced
10668a381b04SJed Brown 
10671cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXRegister()`, `TSARKIMEXRegisterAll()`
10688a381b04SJed Brown @*/
1069d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterDestroy(void)
1070d71ae5a4SJacob Faibussowitsch {
10718a381b04SJed Brown   ARKTableauLink link;
10728a381b04SJed Brown 
10738a381b04SJed Brown   PetscFunctionBegin;
10748a381b04SJed Brown   while ((link = ARKTableauList)) {
10758a381b04SJed Brown     ARKTableau t   = &link->tab;
10768a381b04SJed Brown     ARKTableauList = link->next;
10779566063dSJacob Faibussowitsch     PetscCall(PetscFree6(t->At, t->bt, t->ct, t->A, t->b, t->c));
10789566063dSJacob Faibussowitsch     PetscCall(PetscFree2(t->bembedt, t->bembed));
10799566063dSJacob Faibussowitsch     PetscCall(PetscFree2(t->binterpt, t->binterp));
10809566063dSJacob Faibussowitsch     PetscCall(PetscFree(t->name));
10819566063dSJacob Faibussowitsch     PetscCall(PetscFree(link));
10828a381b04SJed Brown   }
10838a381b04SJed Brown   TSARKIMEXRegisterAllCalled = PETSC_FALSE;
10843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10858a381b04SJed Brown }
10868a381b04SJed Brown 
10878a381b04SJed Brown /*@C
1088bcf0153eSBarry Smith   TSARKIMEXInitializePackage - This function initializes everything in the `TSARKIMEX` package. It is called
1089bcf0153eSBarry Smith   from `TSInitializePackage()`.
10908a381b04SJed Brown 
10918a381b04SJed Brown   Level: developer
10928a381b04SJed Brown 
10931cc06b55SBarry Smith .seealso: [](ch_ts), `PetscInitialize()`, `TSARKIMEXFinalizePackage()`
10948a381b04SJed Brown @*/
1095d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXInitializePackage(void)
1096d71ae5a4SJacob Faibussowitsch {
10978a381b04SJed Brown   PetscFunctionBegin;
10983ba16761SJacob Faibussowitsch   if (TSARKIMEXPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
10998a381b04SJed Brown   TSARKIMEXPackageInitialized = PETSC_TRUE;
11009566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRegisterAll());
11019566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(TSARKIMEXFinalizePackage));
11023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11038a381b04SJed Brown }
11048a381b04SJed Brown 
11058a381b04SJed Brown /*@C
1106bcf0153eSBarry Smith   TSARKIMEXFinalizePackage - This function destroys everything in the `TSARKIMEX` package. It is
1107bcf0153eSBarry Smith   called from `PetscFinalize()`.
11088a381b04SJed Brown 
11098a381b04SJed Brown   Level: developer
11108a381b04SJed Brown 
11111cc06b55SBarry Smith .seealso: [](ch_ts), `PetscFinalize()`, `TSARKIMEXInitializePackage()`
11128a381b04SJed Brown @*/
1113d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXFinalizePackage(void)
1114d71ae5a4SJacob Faibussowitsch {
11158a381b04SJed Brown   PetscFunctionBegin;
11168a381b04SJed Brown   TSARKIMEXPackageInitialized = PETSC_FALSE;
11179566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRegisterDestroy());
11183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11198a381b04SJed Brown }
11208a381b04SJed Brown 
1121cd652676SJed Brown /*@C
1122bcf0153eSBarry Smith   TSARKIMEXRegister - register a `TSARKIMEX` scheme by providing the entries in the Butcher tableau and optionally embedded approximations and interpolation
1123cd652676SJed Brown 
1124d27334e2SStefano Zampini   Logically Collective.
1125cd652676SJed Brown 
1126cd652676SJed Brown   Input Parameters:
1127cd652676SJed Brown + name     - identifier for method
1128cd652676SJed Brown . order    - approximation order of method
1129cd652676SJed Brown . s        - number of stages, this is the dimension of the matrices below
1130cd652676SJed Brown . At       - Butcher table of stage coefficients for stiff part (dimension s*s, row-major)
11310298fd71SBarry Smith . bt       - Butcher table for completing the stiff part of the step (dimension s; NULL to use the last row of At)
11320298fd71SBarry Smith . ct       - Abscissa of each stiff stage (dimension s, NULL to use row sums of At)
1133cd652676SJed Brown . A        - Non-stiff stage coefficients (dimension s*s, row-major)
11340298fd71SBarry Smith . b        - Non-stiff step completion table (dimension s; NULL to use last row of At)
11350298fd71SBarry Smith . c        - Non-stiff abscissa (dimension s; NULL to use row sums of A)
11360298fd71SBarry Smith . bembedt  - Stiff part of completion table for embedded method (dimension s; NULL if not available)
11370298fd71SBarry Smith . bembed   - Non-stiff part of completion table for embedded method (dimension s; NULL to use bembedt if provided)
1138cd652676SJed Brown . pinterp  - Order of the interpolation scheme, equal to the number of columns of binterpt and binterp
1139cd652676SJed Brown . binterpt - Coefficients of the interpolation formula for the stiff part (dimension s*pinterp)
11400298fd71SBarry Smith - binterp  - Coefficients of the interpolation formula for the non-stiff part (dimension s*pinterp; NULL to reuse binterpt)
1141cd652676SJed Brown 
1142cd652676SJed Brown   Level: advanced
1143cd652676SJed Brown 
1144bcf0153eSBarry Smith   Note:
1145bcf0153eSBarry Smith   Several `TSARKIMEX` methods are provided, this function is only needed to create new methods.
1146bcf0153eSBarry Smith 
11471cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSType`, `TS`
1148cd652676SJed Brown @*/
1149d71ae5a4SJacob 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[])
1150d71ae5a4SJacob Faibussowitsch {
11518a381b04SJed Brown   ARKTableauLink link;
11528a381b04SJed Brown   ARKTableau     t;
11538a381b04SJed Brown   PetscInt       i, j;
11548a381b04SJed Brown 
11558a381b04SJed Brown   PetscFunctionBegin;
1156a748edf9SJed Brown   PetscCheck(s > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Expected number of stages s %" PetscInt_FMT " > 0", s);
11579566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXInitializePackage());
1158d27334e2SStefano Zampini   for (link = ARKTableauList; link; link = link->next) {
1159d27334e2SStefano Zampini     PetscBool match;
1160d27334e2SStefano Zampini 
1161d27334e2SStefano Zampini     PetscCall(PetscStrcmp(link->tab.name, name, &match));
1162d27334e2SStefano Zampini     PetscCheck(!match, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Method with name \"%s\" already registered", name);
1163d27334e2SStefano Zampini   }
11649566063dSJacob Faibussowitsch   PetscCall(PetscNew(&link));
11658a381b04SJed Brown   t = &link->tab;
11669566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &t->name));
11678a381b04SJed Brown   t->order = order;
11688a381b04SJed Brown   t->s     = s;
11699566063dSJacob Faibussowitsch   PetscCall(PetscMalloc6(s * s, &t->At, s, &t->bt, s, &t->ct, s * s, &t->A, s, &t->b, s, &t->c));
11709566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(t->At, At, s * s));
1171d27334e2SStefano Zampini   if (A) {
11729566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(t->A, A, s * s));
1173d27334e2SStefano Zampini     t->additive = PETSC_TRUE;
1174d27334e2SStefano Zampini   }
1175d27334e2SStefano Zampini 
11769566063dSJacob Faibussowitsch   if (bt) PetscCall(PetscArraycpy(t->bt, bt, s));
11779371c9d4SSatish Balay   else
11789371c9d4SSatish Balay     for (i = 0; i < s; i++) t->bt[i] = At[(s - 1) * s + i];
1179d27334e2SStefano Zampini 
1180d27334e2SStefano Zampini   if (t->additive) {
11819566063dSJacob Faibussowitsch     if (b) PetscCall(PetscArraycpy(t->b, b, s));
11829371c9d4SSatish Balay     else
11839371c9d4SSatish Balay       for (i = 0; i < s; i++) t->b[i] = t->bt[i];
1184d27334e2SStefano Zampini   } else PetscCall(PetscArrayzero(t->b, s));
1185d27334e2SStefano Zampini 
11869566063dSJacob Faibussowitsch   if (ct) PetscCall(PetscArraycpy(t->ct, ct, s));
11879371c9d4SSatish Balay   else
11889371c9d4SSatish Balay     for (i = 0; i < s; i++)
11899371c9d4SSatish Balay       for (j = 0, t->ct[i] = 0; j < s; j++) t->ct[i] += At[i * s + j];
1190d27334e2SStefano Zampini 
1191d27334e2SStefano Zampini   if (t->additive) {
11929566063dSJacob Faibussowitsch     if (c) PetscCall(PetscArraycpy(t->c, c, s));
11939371c9d4SSatish Balay     else
11949371c9d4SSatish Balay       for (i = 0; i < s; i++)
11959371c9d4SSatish Balay         for (j = 0, t->c[i] = 0; j < s; j++) t->c[i] += A[i * s + j];
1196d27334e2SStefano Zampini   } else PetscCall(PetscArrayzero(t->c, s));
1197d27334e2SStefano Zampini 
1198e817cc15SEmil Constantinescu   t->stiffly_accurate = PETSC_TRUE;
11999371c9d4SSatish Balay   for (i = 0; i < s; i++)
12009371c9d4SSatish Balay     if (t->At[(s - 1) * s + i] != t->bt[i]) t->stiffly_accurate = PETSC_FALSE;
1201d27334e2SStefano Zampini 
1202e817cc15SEmil Constantinescu   t->explicit_first_stage = PETSC_TRUE;
12039371c9d4SSatish Balay   for (i = 0; i < s; i++)
12049371c9d4SSatish Balay     if (t->At[i] != 0.0) t->explicit_first_stage = PETSC_FALSE;
1205d27334e2SStefano Zampini 
1206e817cc15SEmil Constantinescu   /* def of FSAL can be made more precise */
12074e9d4bf5SJed Brown   t->FSAL_implicit = (PetscBool)(t->explicit_first_stage && t->stiffly_accurate);
1208d27334e2SStefano Zampini 
1209108c343cSJed Brown   if (bembedt) {
12109566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(s, &t->bembedt, s, &t->bembed));
12119566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(t->bembedt, bembedt, s));
12129566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(t->bembed, bembed ? bembed : bembedt, s));
1213108c343cSJed Brown   }
1214108c343cSJed Brown 
12154f385281SJed Brown   t->pinterp = pinterp;
12169566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(s * pinterp, &t->binterpt, s * pinterp, &t->binterp));
12179566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(t->binterpt, binterpt, s * pinterp));
12189566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(t->binterp, binterp ? binterp : binterpt, s * pinterp));
1219d27334e2SStefano Zampini 
12208a381b04SJed Brown   link->next     = ARKTableauList;
12218a381b04SJed Brown   ARKTableauList = link;
12223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12238a381b04SJed Brown }
12248a381b04SJed Brown 
1225d27334e2SStefano Zampini /*@C
1226d27334e2SStefano Zampini   TSDIRKRegister - register a `TSDIRK` scheme by providing the entries in its Butcher tableau and, optionally, embedded approximations and interpolation
1227d27334e2SStefano Zampini 
1228d27334e2SStefano Zampini   Logically Collective.
1229d27334e2SStefano Zampini 
1230d27334e2SStefano Zampini   Input Parameters:
1231d27334e2SStefano Zampini + name     - identifier for method
1232d27334e2SStefano Zampini . order    - approximation order of method
1233d27334e2SStefano Zampini . s        - number of stages, this is the dimension of the matrices below
1234d27334e2SStefano Zampini . At       - Butcher table of stage coefficients (dimension `s`*`s`, row-major order)
1235d27334e2SStefano Zampini . bt       - Butcher table for completing the step (dimension `s`; pass `NULL` to use the last row of `At`)
1236d27334e2SStefano Zampini . ct       - Abscissa of each stage (dimension s, NULL to use row sums of At)
1237d27334e2SStefano Zampini . bembedt  - Stiff part of completion table for embedded method (dimension s; `NULL` if not available)
1238d27334e2SStefano Zampini . pinterp  - Order of the interpolation scheme, equal to the number of columns of `binterpt` and `binterp`
1239d27334e2SStefano Zampini - binterpt - Coefficients of the interpolation formula (dimension s*pinterp)
1240d27334e2SStefano Zampini 
1241d27334e2SStefano Zampini   Level: advanced
1242d27334e2SStefano Zampini 
1243d27334e2SStefano Zampini   Note:
1244d27334e2SStefano Zampini   Several `TSDIRK` methods are provided, the use of this function is only needed to create new methods.
1245d27334e2SStefano Zampini 
1246d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSType`, `TS`
1247d27334e2SStefano Zampini @*/
1248d27334e2SStefano 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[])
1249d27334e2SStefano Zampini {
1250d27334e2SStefano Zampini   PetscFunctionBegin;
1251d27334e2SStefano Zampini   PetscCall(TSARKIMEXRegister(name, order, s, At, bt, ct, NULL, NULL, NULL, bembedt, NULL, pinterp, binterpt, NULL));
1252d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
1253d27334e2SStefano Zampini }
1254d27334e2SStefano Zampini 
1255108c343cSJed Brown /*
1256108c343cSJed Brown  The step completion formula is
1257108c343cSJed Brown 
1258108c343cSJed Brown  x1 = x0 - h bt^T YdotI + h b^T YdotRHS
1259108c343cSJed Brown 
1260108c343cSJed Brown  This function can be called before or after ts->vec_sol has been updated.
1261108c343cSJed Brown  Suppose we have a completion formula (bt,b) and an embedded formula (bet,be) of different order.
1262108c343cSJed Brown  We can write
1263108c343cSJed Brown 
1264108c343cSJed Brown  x1e = x0 - h bet^T YdotI + h be^T YdotRHS
1265108c343cSJed Brown      = x1 + h bt^T YdotI - h b^T YdotRHS - h bet^T YdotI + h be^T YdotRHS
1266108c343cSJed Brown      = x1 - h (bet - bt)^T YdotI + h (be - b)^T YdotRHS
1267108c343cSJed Brown 
1268108c343cSJed Brown  so we can evaluate the method with different order even after the step has been optimistically completed.
1269108c343cSJed Brown */
1270d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSEvaluateStep_ARKIMEX(TS ts, PetscInt order, Vec X, PetscBool *done)
1271d71ae5a4SJacob Faibussowitsch {
1272108c343cSJed Brown   TS_ARKIMEX  *ark = (TS_ARKIMEX *)ts->data;
1273108c343cSJed Brown   ARKTableau   tab = ark->tableau;
1274108c343cSJed Brown   PetscScalar *w   = ark->work;
1275108c343cSJed Brown   PetscReal    h;
1276108c343cSJed Brown   PetscInt     s = tab->s, j;
1277d27334e2SStefano Zampini   PetscBool    hasE;
1278108c343cSJed Brown 
1279108c343cSJed Brown   PetscFunctionBegin;
1280108c343cSJed Brown   switch (ark->status) {
1281108c343cSJed Brown   case TS_STEP_INCOMPLETE:
1282d71ae5a4SJacob Faibussowitsch   case TS_STEP_PENDING:
1283d71ae5a4SJacob Faibussowitsch     h = ts->time_step;
1284d71ae5a4SJacob Faibussowitsch     break;
1285d71ae5a4SJacob Faibussowitsch   case TS_STEP_COMPLETE:
1286d71ae5a4SJacob Faibussowitsch     h = ts->ptime - ts->ptime_prev;
1287d71ae5a4SJacob Faibussowitsch     break;
1288d71ae5a4SJacob Faibussowitsch   default:
1289d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus");
1290108c343cSJed Brown   }
1291108c343cSJed Brown   if (order == tab->order) {
1292e817cc15SEmil Constantinescu     if (ark->status == TS_STEP_INCOMPLETE) {
1293740132f1SEmil Constantinescu       if (!ark->imex && tab->stiffly_accurate) { /* Only the stiffly accurate implicit formula is used */
12949566063dSJacob Faibussowitsch         PetscCall(VecCopy(ark->Y[s - 1], X));
1295e817cc15SEmil Constantinescu       } else { /* Use the standard completion formula (bt,b) */
12969566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, X));
1297e817cc15SEmil Constantinescu         for (j = 0; j < s; j++) w[j] = h * tab->bt[j];
12989566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(X, s, w, ark->YdotI));
1299d27334e2SStefano Zampini         if (tab->additive && ark->imex) { /* Method is IMEX, complete the explicit formula */
1300d27334e2SStefano Zampini           PetscCall(TSHasRHSFunction(ts, &hasE));
1301d27334e2SStefano Zampini           if (hasE) {
1302108c343cSJed Brown             for (j = 0; j < s; j++) w[j] = h * tab->b[j];
13039566063dSJacob Faibussowitsch             PetscCall(VecMAXPY(X, s, w, ark->YdotRHS));
1304e817cc15SEmil Constantinescu           }
1305e817cc15SEmil Constantinescu         }
1306d27334e2SStefano Zampini       }
13079566063dSJacob Faibussowitsch     } else PetscCall(VecCopy(ts->vec_sol, X));
1308108c343cSJed Brown     if (done) *done = PETSC_TRUE;
13093ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
1310108c343cSJed Brown   } else if (order == tab->order - 1) {
1311108c343cSJed Brown     if (!tab->bembedt) goto unavailable;
1312108c343cSJed Brown     if (ark->status == TS_STEP_INCOMPLETE) { /* Complete with the embedded method (bet,be) */
13139566063dSJacob Faibussowitsch       PetscCall(VecCopy(ts->vec_sol, X));
1314e817cc15SEmil Constantinescu       for (j = 0; j < s; j++) w[j] = h * tab->bembedt[j];
13159566063dSJacob Faibussowitsch       PetscCall(VecMAXPY(X, s, w, ark->YdotI));
1316d27334e2SStefano Zampini       if (tab->additive) {
1317d27334e2SStefano Zampini         PetscCall(TSHasRHSFunction(ts, &hasE));
1318d27334e2SStefano Zampini         if (hasE) {
1319108c343cSJed Brown           for (j = 0; j < s; j++) w[j] = h * tab->bembed[j];
13209566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(X, s, w, ark->YdotRHS));
1321d27334e2SStefano Zampini         }
1322d27334e2SStefano Zampini       }
1323108c343cSJed Brown     } else { /* Rollback and re-complete using (bet-be,be-b) */
13249566063dSJacob Faibussowitsch       PetscCall(VecCopy(ts->vec_sol, X));
1325e817cc15SEmil Constantinescu       for (j = 0; j < s; j++) w[j] = h * (tab->bembedt[j] - tab->bt[j]);
13269566063dSJacob Faibussowitsch       PetscCall(VecMAXPY(X, tab->s, w, ark->YdotI));
1327d27334e2SStefano Zampini       if (tab->additive) {
1328d27334e2SStefano Zampini         PetscCall(TSHasRHSFunction(ts, &hasE));
1329d27334e2SStefano Zampini         if (hasE) {
1330108c343cSJed Brown           for (j = 0; j < s; j++) w[j] = h * (tab->bembed[j] - tab->b[j]);
13319566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(X, s, w, ark->YdotRHS));
1332108c343cSJed Brown         }
1333d27334e2SStefano Zampini       }
1334d27334e2SStefano Zampini     }
1335108c343cSJed Brown     if (done) *done = PETSC_TRUE;
13363ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
1337108c343cSJed Brown   }
1338108c343cSJed Brown unavailable:
1339108c343cSJed Brown   if (done) *done = PETSC_FALSE;
13409371c9d4SSatish Balay   else
13419371c9d4SSatish 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,
13429371c9d4SSatish Balay             tab->order, order);
13433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1344108c343cSJed Brown }
1345108c343cSJed Brown 
1346d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTestMassIdentity(TS ts, PetscBool *id)
1347d71ae5a4SJacob Faibussowitsch {
1348c79dcfbdSBarry Smith   Vec         Udot, Y1, Y2;
1349c79dcfbdSBarry Smith   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1350c79dcfbdSBarry Smith   PetscReal   norm;
1351c79dcfbdSBarry Smith 
1352c79dcfbdSBarry Smith   PetscFunctionBegin;
13539566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &Udot));
13549566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &Y1));
13559566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &Y2));
13569566063dSJacob Faibussowitsch   PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y1, ark->imex));
13579566063dSJacob Faibussowitsch   PetscCall(VecSetRandom(Udot, NULL));
13589566063dSJacob Faibussowitsch   PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y2, ark->imex));
13599566063dSJacob Faibussowitsch   PetscCall(VecAXPY(Y2, -1.0, Y1));
13609566063dSJacob Faibussowitsch   PetscCall(VecAXPY(Y2, -1.0, Udot));
13619566063dSJacob Faibussowitsch   PetscCall(VecNorm(Y2, NORM_2, &norm));
1362c79dcfbdSBarry Smith   if (norm < 100.0 * PETSC_MACHINE_EPSILON) {
1363c79dcfbdSBarry Smith     *id = PETSC_TRUE;
1364c79dcfbdSBarry Smith   } else {
1365c79dcfbdSBarry Smith     *id = PETSC_FALSE;
13669566063dSJacob 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));
1367c79dcfbdSBarry Smith   }
13689566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Udot));
13699566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Y1));
13709566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Y2));
13713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1372c79dcfbdSBarry Smith }
1373c79dcfbdSBarry Smith 
1374*0467964bSStefano Zampini static PetscErrorCode TSARKIMEXComputeAlgebraicIS(TS, PetscReal, Vec, IS *);
1375*0467964bSStefano Zampini 
1376d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSStep_ARKIMEX(TS ts)
1377d71ae5a4SJacob Faibussowitsch {
13788a381b04SJed Brown   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
13798a381b04SJed Brown   ARKTableau       tab = ark->tableau;
13808a381b04SJed Brown   const PetscInt   s   = tab->s;
138124655328SShri   const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c;
1382406d0ec2SJed Brown   PetscScalar     *w = ark->work;
13831297b224SEmil Constantinescu   Vec             *Y = ark->Y, *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS, Ydot = ark->Ydot, Ydot0 = ark->Ydot0, Z = ark->Z;
138496400bd6SLisandro Dalcin   PetscBool        extrapolate = ark->extrapolate;
1385108c343cSJed Brown   TSAdapt          adapt;
13868a381b04SJed Brown   SNES             snes;
1387fecfb714SLisandro Dalcin   PetscInt         i, j, its, lits;
1388be5899b3SLisandro Dalcin   PetscInt         rejections = 0;
1389d27334e2SStefano Zampini   PetscBool        hasE = PETSC_FALSE, dirk = (PetscBool)(!tab->additive), stageok, accept = PETSC_TRUE;
139096400bd6SLisandro Dalcin   PetscReal        next_time_step = ts->time_step;
13918a381b04SJed Brown 
13928a381b04SJed Brown   PetscFunctionBegin;
139396400bd6SLisandro Dalcin   if (ark->extrapolate && !ark->Y_prev) {
13949566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev));
13959566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev));
1396d27334e2SStefano Zampini     if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev));
139796400bd6SLisandro Dalcin   }
139896400bd6SLisandro Dalcin 
1399d27334e2SStefano Zampini   if (!dirk) PetscCall(TSHasRHSFunction(ts, &hasE));
1400d27334e2SStefano Zampini   if (!hasE) dirk = PETSC_TRUE;
1401d27334e2SStefano Zampini 
140296400bd6SLisandro Dalcin   if (!ts->steprollback) {
1403d27334e2SStefano Zampini     if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { /* Save the initial slope for the next step */
14049566063dSJacob Faibussowitsch       PetscCall(VecCopy(YdotI[s - 1], Ydot0));
140596400bd6SLisandro Dalcin     }
1406fecfb714SLisandro Dalcin     if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initial guess */
140796400bd6SLisandro Dalcin       for (i = 0; i < s; i++) {
14089566063dSJacob Faibussowitsch         PetscCall(VecCopy(Y[i], ark->Y_prev[i]));
14099566063dSJacob Faibussowitsch         PetscCall(VecCopy(YdotI[i], ark->YdotI_prev[i]));
1410d27334e2SStefano Zampini         if (tab->additive && hasE) PetscCall(VecCopy(YdotRHS[i], ark->YdotRHS_prev[i]));
141196400bd6SLisandro Dalcin       }
141296400bd6SLisandro Dalcin     }
141396400bd6SLisandro Dalcin   }
141496400bd6SLisandro Dalcin 
14153b98415fSStefano Zampini   /*
14163b98415fSStefano Zampini      For fully implicit formulations we must solve the equations
14173b98415fSStefano Zampini 
14183b98415fSStefano Zampini        F(t_n,x_n,xdot) = 0
14193b98415fSStefano Zampini 
14203b98415fSStefano Zampini      for the explicit first stage.
14213b98415fSStefano Zampini      Here we call SNESSolve using PETSC_MAX_REAL as shift to flag it.
14223b98415fSStefano Zampini      Special handling is inside SNESTSFormFunction_ARKIMEX and SNESTSFormJacobian_ARKIMEX
14233b98415fSStefano Zampini   */
1424d27334e2SStefano Zampini   if (dirk && tab->explicit_first_stage && ts->steprestart) {
142598940a98SHong Zhang     ark->scoeff = PETSC_MAX_REAL;
1426d27334e2SStefano Zampini     PetscCall(VecCopy(ts->vec_sol, Z));
1427*0467964bSStefano Zampini     if (!ark->alg_is) {
1428*0467964bSStefano Zampini       PetscCall(TSARKIMEXComputeAlgebraicIS(ts, ts->ptime, Z, &ark->alg_is));
1429*0467964bSStefano Zampini       PetscCall(ISViewFromOptions(ark->alg_is, (PetscObject)ts, "-ts_arkimex_algebraic_is_view"));
1430*0467964bSStefano Zampini     }
1431d27334e2SStefano Zampini     PetscCall(TSGetSNES(ts, &snes));
1432*0467964bSStefano Zampini     PetscCall(PetscObjectIncrementTabLevel((PetscObject)snes, (PetscObject)snes, 1));
1433d27334e2SStefano Zampini     PetscCall(SNESSolve(snes, NULL, Ydot0));
1434*0467964bSStefano Zampini     PetscCall(PetscObjectIncrementTabLevel((PetscObject)snes, (PetscObject)snes, -1));
1435d27334e2SStefano Zampini   }
1436d27334e2SStefano Zampini 
1437d27334e2SStefano Zampini   /* For IMEX we compute a step */
1438d27334e2SStefano Zampini   if (!dirk && ts->equation_type >= TS_EQ_IMPLICIT && tab->explicit_first_stage && ts->steprestart) {
143996400bd6SLisandro Dalcin     TS ts_start;
1440d27334e2SStefano Zampini     if (PetscDefined(USE_DEBUG) && hasE) {
1441c79dcfbdSBarry Smith       PetscBool id = PETSC_FALSE;
14429566063dSJacob Faibussowitsch       PetscCall(TSARKIMEXTestMassIdentity(ts, &id));
14438434afd1SBarry 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");
1444c79dcfbdSBarry Smith     }
14459566063dSJacob Faibussowitsch     PetscCall(TSClone(ts, &ts_start));
14469566063dSJacob Faibussowitsch     PetscCall(TSSetSolution(ts_start, ts->vec_sol));
14479566063dSJacob Faibussowitsch     PetscCall(TSSetTime(ts_start, ts->ptime));
14489566063dSJacob Faibussowitsch     PetscCall(TSSetMaxSteps(ts_start, ts->steps + 1));
14499566063dSJacob Faibussowitsch     PetscCall(TSSetMaxTime(ts_start, ts->ptime + ts->time_step));
14509566063dSJacob Faibussowitsch     PetscCall(TSSetExactFinalTime(ts_start, TS_EXACTFINALTIME_STEPOVER));
14519566063dSJacob Faibussowitsch     PetscCall(TSSetTimeStep(ts_start, ts->time_step));
14529566063dSJacob Faibussowitsch     PetscCall(TSSetType(ts_start, TSARKIMEX));
14539566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetFullyImplicit(ts_start, PETSC_TRUE));
14549566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetType(ts_start, TSARKIMEX1BEE));
145534561852SEmil Constantinescu 
14569566063dSJacob Faibussowitsch     PetscCall(TSRestartStep(ts_start));
14579566063dSJacob Faibussowitsch     PetscCall(TSSolve(ts_start, ts->vec_sol));
14589566063dSJacob Faibussowitsch     PetscCall(TSGetTime(ts_start, &ts->ptime));
14599566063dSJacob Faibussowitsch     PetscCall(TSGetTimeStep(ts_start, &ts->time_step));
1460bbd56ea5SKarl Rupp 
146185fc7851SLisandro Dalcin     { /* Save the initial slope for the next step */
146285fc7851SLisandro Dalcin       TS_ARKIMEX *ark_start = (TS_ARKIMEX *)ts_start->data;
14639566063dSJacob Faibussowitsch       PetscCall(VecCopy(ark_start->YdotI[ark_start->tableau->s - 1], Ydot0));
146485fc7851SLisandro Dalcin     }
146596400bd6SLisandro Dalcin     ts->steps++;
146634561852SEmil Constantinescu 
1467d15a3a53SEmil Constantinescu     /* Set the correct TS in SNES */
1468d15a3a53SEmil Constantinescu     /* We'll try to bypass this by changing the method on the fly */
146996400bd6SLisandro Dalcin     {
14709566063dSJacob Faibussowitsch       PetscCall(TSGetSNES(ts, &snes));
14719566063dSJacob Faibussowitsch       PetscCall(TSSetSNES(ts, snes));
147296400bd6SLisandro Dalcin     }
14739566063dSJacob Faibussowitsch     PetscCall(TSDestroy(&ts_start));
1474e817cc15SEmil Constantinescu   }
1475e817cc15SEmil Constantinescu 
1476108c343cSJed Brown   ark->status = TS_STEP_INCOMPLETE;
147796400bd6SLisandro Dalcin   while (!ts->reason && ark->status != TS_STEP_COMPLETE) {
147896400bd6SLisandro Dalcin     PetscReal t = ts->ptime;
1479108c343cSJed Brown     PetscReal h = ts->time_step;
14808a381b04SJed Brown     for (i = 0; i < s; i++) {
14819be3e283SDebojyoti Ghosh       ark->stage_time = t + h * ct[i];
14829566063dSJacob Faibussowitsch       PetscCall(TSPreStage(ts, ark->stage_time));
14838a381b04SJed Brown       if (At[i * s + i] == 0) { /* This stage is explicit */
14843c633725SBarry 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");
14859566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, Y[i]));
1486e817cc15SEmil Constantinescu         for (j = 0; j < i; j++) w[j] = h * At[i * s + j];
14879566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(Y[i], i, w, YdotI));
1488d27334e2SStefano Zampini         if (tab->additive && hasE) {
14898a381b04SJed Brown           for (j = 0; j < i; j++) w[j] = h * A[i * s + j];
14909566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(Y[i], i, w, YdotRHS));
1491d27334e2SStefano Zampini         }
14928a381b04SJed Brown       } else {
1493b296d7d5SJed Brown         ark->scoeff = 1. / At[i * s + i];
14948a381b04SJed Brown         /* Ydot = shift*(Y-Z) */
14959566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, Z));
1496e817cc15SEmil Constantinescu         for (j = 0; j < i; j++) w[j] = h * At[i * s + j];
14979566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(Z, i, w, YdotI));
1498d27334e2SStefano Zampini         if (tab->additive && hasE) {
1499c58d1302SEmil Constantinescu           for (j = 0; j < i; j++) w[j] = h * A[i * s + j];
15009566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(Z, i, w, YdotRHS));
1501d27334e2SStefano Zampini         }
1502fecfb714SLisandro Dalcin         if (extrapolate && !ts->steprestart) {
150356dcabbaSDebojyoti Ghosh           /* Initial guess extrapolated from previous time step stage values */
15049566063dSJacob Faibussowitsch           PetscCall(TSExtrapolate_ARKIMEX(ts, c[i], Y[i]));
150556dcabbaSDebojyoti Ghosh         } else {
15068a381b04SJed Brown           /* Initial guess taken from last stage */
15079566063dSJacob Faibussowitsch           PetscCall(VecCopy(i > 0 ? Y[i - 1] : ts->vec_sol, Y[i]));
150856dcabbaSDebojyoti Ghosh         }
15099566063dSJacob Faibussowitsch         PetscCall(TSGetSNES(ts, &snes));
15109566063dSJacob Faibussowitsch         PetscCall(SNESSolve(snes, NULL, Y[i]));
15119566063dSJacob Faibussowitsch         PetscCall(SNESGetIterationNumber(snes, &its));
15129566063dSJacob Faibussowitsch         PetscCall(SNESGetLinearSolveIterations(snes, &lits));
15139371c9d4SSatish Balay         ts->snes_its += its;
15149371c9d4SSatish Balay         ts->ksp_its += lits;
15159566063dSJacob Faibussowitsch         PetscCall(TSGetAdapt(ts, &adapt));
15169566063dSJacob Faibussowitsch         PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok));
151796400bd6SLisandro Dalcin         if (!stageok) {
15181be93e3eSJed Brown           /* We are likely rejecting the step because of solver or function domain problems so we should not attempt to
15191be93e3eSJed Brown            * use extrapolation to initialize the solves on the next attempt. */
152096400bd6SLisandro Dalcin           extrapolate = PETSC_FALSE;
15211be93e3eSJed Brown           goto reject_step;
15221be93e3eSJed Brown         }
15238a381b04SJed Brown       }
1524d27334e2SStefano Zampini       if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) {
1525e817cc15SEmil Constantinescu         if (i == 0 && tab->explicit_first_stage) {
1526d27334e2SStefano 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",
1527d27334e2SStefano Zampini                      ((PetscObject)ts)->type_name, ark->tableau->name);
15289566063dSJacob Faibussowitsch           PetscCall(VecCopy(Ydot0, YdotI[0])); /* YdotI = YdotI(tn-1) */
1529e817cc15SEmil Constantinescu         } else {
15309566063dSJacob Faibussowitsch           PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */
1531e817cc15SEmil Constantinescu         }
1532e817cc15SEmil Constantinescu       } else {
15335eca1a21SEmil Constantinescu         if (i == 0 && tab->explicit_first_stage) {
15349566063dSJacob Faibussowitsch           PetscCall(VecZeroEntries(Ydot));
15359566063dSJacob Faibussowitsch           PetscCall(TSComputeIFunction(ts, t + h * ct[i], Y[i], Ydot, YdotI[i], ark->imex)); /* YdotI = -G(t,Y,0)   */
15369566063dSJacob Faibussowitsch           PetscCall(VecScale(YdotI[i], -1.0));
15375eca1a21SEmil Constantinescu         } else {
15389566063dSJacob Faibussowitsch           PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */
15395eca1a21SEmil Constantinescu         }
1540d27334e2SStefano Zampini         if (hasE) {
15414cc180ffSJed Brown           if (ark->imex) {
15429566063dSJacob Faibussowitsch             PetscCall(TSComputeRHSFunction(ts, t + h * c[i], Y[i], YdotRHS[i]));
15434cc180ffSJed Brown           } else {
15449566063dSJacob Faibussowitsch             PetscCall(VecZeroEntries(YdotRHS[i]));
15454cc180ffSJed Brown           }
15468a381b04SJed Brown         }
1547d27334e2SStefano Zampini       }
15489566063dSJacob Faibussowitsch       PetscCall(TSPostStage(ts, ark->stage_time, i, Y));
1549e817cc15SEmil Constantinescu     }
155096400bd6SLisandro Dalcin 
1551be5899b3SLisandro Dalcin     ark->status = TS_STEP_INCOMPLETE;
15529566063dSJacob Faibussowitsch     PetscCall(TSEvaluateStep_ARKIMEX(ts, tab->order, ts->vec_sol, NULL));
1553108c343cSJed Brown     ark->status = TS_STEP_PENDING;
15549566063dSJacob Faibussowitsch     PetscCall(TSGetAdapt(ts, &adapt));
15559566063dSJacob Faibussowitsch     PetscCall(TSAdaptCandidatesClear(adapt));
15569566063dSJacob Faibussowitsch     PetscCall(TSAdaptCandidateAdd(adapt, tab->name, tab->order, 1, tab->ccfl, (PetscReal)tab->s, PETSC_TRUE));
15579566063dSJacob Faibussowitsch     PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept));
155896400bd6SLisandro Dalcin     ark->status = accept ? TS_STEP_COMPLETE : TS_STEP_INCOMPLETE;
155996400bd6SLisandro Dalcin     if (!accept) { /* Roll back the current step */
1560c61711c8SStefano Zampini       PetscCall(VecCopy(ts->vec_sol0, ts->vec_sol));
1561be5899b3SLisandro Dalcin       ts->time_step = next_time_step;
1562be5899b3SLisandro Dalcin       goto reject_step;
156396400bd6SLisandro Dalcin     }
156496400bd6SLisandro Dalcin 
15658a381b04SJed Brown     ts->ptime += ts->time_step;
1566cdbf8f93SLisandro Dalcin     ts->time_step = next_time_step;
1567108c343cSJed Brown     break;
156896400bd6SLisandro Dalcin 
156996400bd6SLisandro Dalcin   reject_step:
15709371c9d4SSatish Balay     ts->reject++;
15719371c9d4SSatish Balay     accept = PETSC_FALSE;
1572be5899b3SLisandro Dalcin     if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) {
157396400bd6SLisandro Dalcin       ts->reason = TS_DIVERGED_STEP_REJECTED;
157463a3b9bcSJacob Faibussowitsch       PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than current TS allowed, stopping solve\n", ts->steps, rejections));
1575108c343cSJed Brown     }
1576f85781f1SEmil Constantinescu   }
15773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
15788a381b04SJed Brown }
1579d27334e2SStefano Zampini 
158080ab5e31SHong Zhang /*
158180ab5e31SHong Zhang   This adjoint step function assumes the partitioned ODE system has an identity mass matrix and thus can be represented in the form
158280ab5e31SHong Zhang   Udot = H(t,U) + G(t,U)
158380ab5e31SHong Zhang   This corresponds to F(t,U,Udot) = Udot-H(t,U).
158480ab5e31SHong Zhang 
158580ab5e31SHong Zhang   The complete adjoint equations are
158680ab5e31SHong Zhang   (shift*I - dHdu) lambda_s[i]   = 1/at[i][i] (
15875d7a6ebeSHong Zhang     dGdU (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j])
15885d7a6ebeSHong Zhang     + dHdU (bt[i] lambda_{n+1} +  \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0
158980ab5e31SHong Zhang   lambda_n = lambda_{n+1} + \sum_{j=1}^s lambda_s[j]
159080ab5e31SHong Zhang   mu_{n+1}[i]   = h (at[i][i] dHdP lambda_s[i]
15915d7a6ebeSHong Zhang     + dGdP (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j])
15925d7a6ebeSHong Zhang     + dHdP (bt[i] lambda_{n+1} + \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0
159380ab5e31SHong Zhang   mu_n = mu_{n+1} + \sum_{j=1}^s mu_{n+1}[j]
159480ab5e31SHong Zhang   where shift = 1/(at[i][i]*h)
159580ab5e31SHong Zhang 
159680ab5e31SHong Zhang   If at[i][i] is 0, the first equation falls back to
159780ab5e31SHong Zhang   lambda_s[i] = h (
159880ab5e31SHong Zhang     (b_i dGdU + bt[i] dHdU) lambda_{n+1} + dGdU \sum_{j=i+1}^s a[j][i] lambda_s[j]
159980ab5e31SHong Zhang     + dHdU \sum_{j=i+1}^s at[j][i] lambda_s[j])
160080ab5e31SHong Zhang 
160180ab5e31SHong Zhang */
160280ab5e31SHong Zhang static PetscErrorCode TSAdjointStep_ARKIMEX(TS ts)
160380ab5e31SHong Zhang {
160480ab5e31SHong Zhang   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
160580ab5e31SHong Zhang   ARKTableau       tab = ark->tableau;
160680ab5e31SHong Zhang   const PetscInt   s   = tab->s;
160780ab5e31SHong Zhang   const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c, *b = tab->b, *bt = tab->bt;
160880ab5e31SHong Zhang   PetscScalar     *w = ark->work;
160980ab5e31SHong Zhang   Vec             *Y = ark->Y, Ydot = ark->Ydot, *VecsDeltaLam = ark->VecsDeltaLam, *VecsSensiTemp = ark->VecsSensiTemp, *VecsSensiPTemp = ark->VecsSensiPTemp;
161080ab5e31SHong Zhang   Mat              Jex, Jim, Jimpre;
161180ab5e31SHong Zhang   PetscInt         i, j, nadj;
161280ab5e31SHong Zhang   PetscReal        t                 = ts->ptime, stage_time_ex;
161380ab5e31SHong Zhang   PetscReal        adjoint_time_step = -ts->time_step; /* always positive since ts->time_step is negative */
161480ab5e31SHong Zhang   KSP              ksp;
161580ab5e31SHong Zhang 
161680ab5e31SHong Zhang   PetscFunctionBegin;
161780ab5e31SHong Zhang   ark->status = TS_STEP_INCOMPLETE;
161880ab5e31SHong Zhang   PetscCall(SNESGetKSP(ts->snes, &ksp));
161980ab5e31SHong Zhang   PetscCall(TSGetRHSMats_Private(ts, &Jex, NULL));
162080ab5e31SHong Zhang   PetscCall(TSGetIJacobian(ts, &Jim, &Jimpre, NULL, NULL));
162180ab5e31SHong Zhang 
162280ab5e31SHong Zhang   for (i = s - 1; i >= 0; i--) {
162380ab5e31SHong Zhang     ark->stage_time = t - adjoint_time_step * (1.0 - ct[i]);
162480ab5e31SHong Zhang     stage_time_ex   = t - adjoint_time_step * (1.0 - c[i]);
162580ab5e31SHong Zhang     if (At[i * s + i] == 0) { // This stage is explicit
162680ab5e31SHong Zhang       ark->scoeff = 0.;
162780ab5e31SHong Zhang     } else {
162880ab5e31SHong Zhang       ark->scoeff = -1. / At[i * s + i]; // this makes shift=ark->scoeff/ts->time_step positive since ts->time_step is negative
162980ab5e31SHong Zhang     }
163080ab5e31SHong Zhang     PetscCall(TSComputeSNESJacobian(ts, Y[i], Jim, Jimpre));
163180ab5e31SHong Zhang     PetscCall(TSComputeRHSJacobian(ts, stage_time_ex, Y[i], Jex, Jex));
163280ab5e31SHong Zhang     if (ts->vecs_sensip) {
163380ab5e31SHong 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
163480ab5e31SHong Zhang       PetscCall(TSComputeRHSJacobianP(ts, stage_time_ex, Y[i], ts->Jacprhs));                                                 // get dGdP
163580ab5e31SHong Zhang     }
163680ab5e31SHong Zhang     /* Build RHS (stored in VecsDeltaLam) for first-order adjoint */
16375d7a6ebeSHong Zhang     for (nadj = 0; nadj < ts->numcost; nadj++) {
16385d7a6ebeSHong Zhang       /* build implicit part */
16395d7a6ebeSHong Zhang       PetscCall(VecSet(VecsSensiTemp[nadj], 0));
164080ab5e31SHong Zhang       if (s - i - 1 > 0) {
164180ab5e31SHong Zhang         /* Temp = -\sum_{j=i+1}^s at[j][i] lambda_s[j] */
164280ab5e31SHong Zhang         for (j = i + 1; j < s; j++) w[j - i - 1] = -At[j * s + i];
164380ab5e31SHong Zhang         PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1]));
16445d7a6ebeSHong Zhang       }
16455d7a6ebeSHong Zhang       /* Temp = Temp - bt[i] lambda_{n+1} */
16465d7a6ebeSHong Zhang       PetscCall(VecAXPY(VecsSensiTemp[nadj], -bt[i], ts->vecs_sensi[nadj]));
16475d7a6ebeSHong Zhang       if (bt[i] || s - i - 1 > 0) {
164880ab5e31SHong Zhang         /* (shift I - dHdU) Temp */
164980ab5e31SHong Zhang         PetscCall(MatMultTranspose(Jim, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i]));
165080ab5e31SHong Zhang         /* cancel out shift Temp where shift=-scoeff/h */
165180ab5e31SHong Zhang         PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], ark->scoeff / adjoint_time_step, VecsSensiTemp[nadj]));
165280ab5e31SHong Zhang         if (ts->vecs_sensip) {
165380ab5e31SHong Zhang           /* - dHdP Temp */
165480ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, VecsSensiTemp[nadj], VecsSensiPTemp[nadj]));
16555d7a6ebeSHong Zhang           /* mu_n += -h dHdP Temp */
16565d7a6ebeSHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj]));
165780ab5e31SHong Zhang         }
16585d7a6ebeSHong Zhang       } else {
16595d7a6ebeSHong Zhang         PetscCall(VecSet(VecsDeltaLam[nadj * s + i], 0)); // make sure it is initialized
16605d7a6ebeSHong Zhang       }
16615d7a6ebeSHong Zhang       /* build explicit part */
16625d7a6ebeSHong Zhang       PetscCall(VecSet(VecsSensiTemp[nadj], 0));
16635d7a6ebeSHong Zhang       if (s - i - 1 > 0) {
166480ab5e31SHong Zhang         /* Temp = \sum_{j=i+1}^s a[j][i] lambda_s[j] */
166580ab5e31SHong Zhang         for (j = i + 1; j < s; j++) w[j - i - 1] = A[j * s + i];
166680ab5e31SHong Zhang         PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1]));
16675d7a6ebeSHong Zhang       }
16685d7a6ebeSHong Zhang       /* Temp = Temp + b[i] lambda_{n+1} */
16695d7a6ebeSHong Zhang       PetscCall(VecAXPY(VecsSensiTemp[nadj], b[i], ts->vecs_sensi[nadj]));
16705d7a6ebeSHong Zhang       if (b[i] || s - i - 1 > 0) {
167180ab5e31SHong Zhang         /* dGdU Temp */
167280ab5e31SHong Zhang         PetscCall(MatMultTransposeAdd(Jex, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i]));
167380ab5e31SHong Zhang         if (ts->vecs_sensip) {
167480ab5e31SHong Zhang           /* dGdP Temp */
167580ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecsSensiPTemp[nadj]));
167680ab5e31SHong Zhang           /* mu_n += h dGdP Temp */
167780ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj]));
167880ab5e31SHong Zhang         }
167980ab5e31SHong Zhang       }
168080ab5e31SHong Zhang       /* Build LHS for first-order adjoint */
168180ab5e31SHong Zhang       if (At[i * s + i] == 0) { // This stage is explicit
168280ab5e31SHong Zhang         PetscCall(VecScale(VecsDeltaLam[nadj * s + i], adjoint_time_step));
168380ab5e31SHong Zhang       } else {
168480ab5e31SHong Zhang         KSP                ksp;
168580ab5e31SHong Zhang         KSPConvergedReason kspreason;
168680ab5e31SHong Zhang         PetscCall(SNESGetKSP(ts->snes, &ksp));
168780ab5e31SHong Zhang         PetscCall(KSPSetOperators(ksp, Jim, Jimpre));
168880ab5e31SHong Zhang         PetscCall(VecScale(VecsDeltaLam[nadj * s + i], 1. / At[i * s + i]));
168980ab5e31SHong Zhang         PetscCall(KSPSolveTranspose(ksp, VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i]));
169080ab5e31SHong Zhang         PetscCall(KSPGetConvergedReason(ksp, &kspreason));
169180ab5e31SHong Zhang         if (kspreason < 0) {
169280ab5e31SHong Zhang           ts->reason = TSADJOINT_DIVERGED_LINEAR_SOLVE;
169380ab5e31SHong 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));
169480ab5e31SHong Zhang         }
169580ab5e31SHong Zhang         if (ts->vecs_sensip) {
169680ab5e31SHong Zhang           /* -dHdP lambda_s[i] */
169780ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, VecsDeltaLam[nadj * s + i], VecsSensiPTemp[nadj]));
169880ab5e31SHong Zhang           /* mu_n += h at[i][i] dHdP lambda_s[i] */
169980ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], -At[i * s + i] * adjoint_time_step, VecsSensiPTemp[nadj]));
170080ab5e31SHong Zhang         }
170180ab5e31SHong Zhang       }
170280ab5e31SHong Zhang     }
170380ab5e31SHong Zhang   }
170480ab5e31SHong Zhang   for (j = 0; j < s; j++) w[j] = 1.0;
170580ab5e31SHong Zhang   for (nadj = 0; nadj < ts->numcost; nadj++) // no need to do this for mu's
170680ab5e31SHong Zhang     PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s]));
170780ab5e31SHong Zhang   ark->status = TS_STEP_COMPLETE;
170880ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
170980ab5e31SHong Zhang }
17108a381b04SJed Brown 
1711d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSInterpolate_ARKIMEX(TS ts, PetscReal itime, Vec X)
1712d71ae5a4SJacob Faibussowitsch {
1713cd652676SJed Brown   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
1714d27334e2SStefano Zampini   ARKTableau       tab = ark->tableau;
1715d27334e2SStefano Zampini   PetscInt         s = tab->s, pinterp = tab->pinterp, i, j;
1716108c343cSJed Brown   PetscReal        h;
1717108c343cSJed Brown   PetscReal        tt, t;
1718d27334e2SStefano Zampini   PetscScalar     *bt = ark->work, *b = ark->work + s;
1719d27334e2SStefano Zampini   const PetscReal *Bt = tab->binterpt, *B = tab->binterp;
1720cd652676SJed Brown 
1721cd652676SJed Brown   PetscFunctionBegin;
1722d27334e2SStefano 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);
1723108c343cSJed Brown   switch (ark->status) {
1724108c343cSJed Brown   case TS_STEP_INCOMPLETE:
1725108c343cSJed Brown   case TS_STEP_PENDING:
1726108c343cSJed Brown     h = ts->time_step;
1727108c343cSJed Brown     t = (itime - ts->ptime) / h;
1728108c343cSJed Brown     break;
1729108c343cSJed Brown   case TS_STEP_COMPLETE:
1730be5899b3SLisandro Dalcin     h = ts->ptime - ts->ptime_prev;
1731108c343cSJed Brown     t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */
1732108c343cSJed Brown     break;
1733d71ae5a4SJacob Faibussowitsch   default:
1734d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus");
1735108c343cSJed Brown   }
1736cd652676SJed Brown   for (i = 0; i < s; i++) bt[i] = b[i] = 0;
17374f385281SJed Brown   for (j = 0, tt = t; j < pinterp; j++, tt *= t) {
1738cd652676SJed Brown     for (i = 0; i < s; i++) {
1739c1758d98SDebojyoti Ghosh       bt[i] += h * Bt[i * pinterp + j] * tt;
1740108c343cSJed Brown       b[i] += h * B[i * pinterp + j] * tt;
1741cd652676SJed Brown     }
1742cd652676SJed Brown   }
17439566063dSJacob Faibussowitsch   PetscCall(VecCopy(ark->Y[0], X));
17449566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(X, s, bt, ark->YdotI));
1745d27334e2SStefano Zampini   if (tab->additive) {
1746d27334e2SStefano Zampini     PetscBool hasE;
1747d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1748d27334e2SStefano Zampini     if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS));
1749d27334e2SStefano Zampini   }
17503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1751cd652676SJed Brown }
1752cd652676SJed Brown 
1753d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSExtrapolate_ARKIMEX(TS ts, PetscReal c, Vec X)
1754d71ae5a4SJacob Faibussowitsch {
175556dcabbaSDebojyoti Ghosh   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
1756d27334e2SStefano Zampini   ARKTableau       tab = ark->tableau;
1757d27334e2SStefano Zampini   PetscInt         s = tab->s, pinterp = tab->pinterp, i, j;
1758be5899b3SLisandro Dalcin   PetscReal        h, h_prev, t, tt;
1759d27334e2SStefano Zampini   PetscScalar     *bt = ark->work, *b = ark->work + s;
1760d27334e2SStefano Zampini   const PetscReal *Bt = tab->binterpt, *B = tab->binterp;
176156dcabbaSDebojyoti Ghosh 
176256dcabbaSDebojyoti Ghosh   PetscFunctionBegin;
17633c633725SBarry Smith   PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name);
176481d12688SDebojyoti Ghosh   h      = ts->time_step;
1765be5899b3SLisandro Dalcin   h_prev = ts->ptime - ts->ptime_prev;
1766be5899b3SLisandro Dalcin   t      = 1 + h / h_prev * c;
1767d27334e2SStefano Zampini   for (i = 0; i < s; i++) bt[i] = b[i] = 0;
176856dcabbaSDebojyoti Ghosh   for (j = 0, tt = t; j < pinterp; j++, tt *= t) {
176956dcabbaSDebojyoti Ghosh     for (i = 0; i < s; i++) {
177081d12688SDebojyoti Ghosh       bt[i] += h * Bt[i * pinterp + j] * tt;
177156dcabbaSDebojyoti Ghosh       b[i] += h * B[i * pinterp + j] * tt;
177256dcabbaSDebojyoti Ghosh     }
177356dcabbaSDebojyoti Ghosh   }
17743c633725SBarry Smith   PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous step have not been stored");
17759566063dSJacob Faibussowitsch   PetscCall(VecCopy(ark->Y_prev[0], X));
17769566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev));
1777d27334e2SStefano Zampini   if (tab->additive) {
1778d27334e2SStefano Zampini     PetscBool hasE;
1779d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1780d27334e2SStefano Zampini     if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev));
1781d27334e2SStefano Zampini   }
17823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
178356dcabbaSDebojyoti Ghosh }
178456dcabbaSDebojyoti Ghosh 
1785d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauReset(TS ts)
1786d71ae5a4SJacob Faibussowitsch {
178796400bd6SLisandro Dalcin   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
178896400bd6SLisandro Dalcin   ARKTableau  tab = ark->tableau;
178996400bd6SLisandro Dalcin 
179096400bd6SLisandro Dalcin   PetscFunctionBegin;
17913ba16761SJacob Faibussowitsch   if (!tab) PetscFunctionReturn(PETSC_SUCCESS);
17929566063dSJacob Faibussowitsch   PetscCall(PetscFree(ark->work));
17939566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->Y));
17949566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotI));
17959566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS));
17969566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev));
17979566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev));
17989566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev));
17993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
180096400bd6SLisandro Dalcin }
180196400bd6SLisandro Dalcin 
1802d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSReset_ARKIMEX(TS ts)
1803d71ae5a4SJacob Faibussowitsch {
18048a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
18058a381b04SJed Brown 
18068a381b04SJed Brown   PetscFunctionBegin;
18079566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXTableauReset(ts));
18089566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Ydot));
18099566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Ydot0));
18109566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Z));
1811*0467964bSStefano Zampini   PetscCall(ISDestroy(&ark->alg_is));
18123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
18138a381b04SJed Brown }
18148a381b04SJed Brown 
181580ab5e31SHong Zhang static PetscErrorCode TSAdjointReset_ARKIMEX(TS ts)
181680ab5e31SHong Zhang {
181780ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
181880ab5e31SHong Zhang   ARKTableau  tab = ark->tableau;
181980ab5e31SHong Zhang 
182080ab5e31SHong Zhang   PetscFunctionBegin;
182180ab5e31SHong Zhang   PetscCall(VecDestroyVecs(tab->s * ts->numcost, &ark->VecsDeltaLam));
182280ab5e31SHong Zhang   PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiTemp));
182380ab5e31SHong Zhang   PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiPTemp));
182480ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
182580ab5e31SHong Zhang }
182680ab5e31SHong Zhang 
1827d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetVecs(TS ts, DM dm, Vec *Z, Vec *Ydot)
1828d71ae5a4SJacob Faibussowitsch {
1829d5e6173cSPeter Brune   TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data;
1830d5e6173cSPeter Brune 
1831d5e6173cSPeter Brune   PetscFunctionBegin;
1832d5e6173cSPeter Brune   if (Z) {
1833d5e6173cSPeter Brune     if (dm && dm != ts->dm) {
18349566063dSJacob Faibussowitsch       PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Z", Z));
1835d5e6173cSPeter Brune     } else *Z = ax->Z;
1836d5e6173cSPeter Brune   }
1837d5e6173cSPeter Brune   if (Ydot) {
1838d5e6173cSPeter Brune     if (dm && dm != ts->dm) {
18399566063dSJacob Faibussowitsch       PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot));
1840d5e6173cSPeter Brune     } else *Ydot = ax->Ydot;
1841d5e6173cSPeter Brune   }
18423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1843d5e6173cSPeter Brune }
1844d5e6173cSPeter Brune 
1845d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXRestoreVecs(TS ts, DM dm, Vec *Z, Vec *Ydot)
1846d71ae5a4SJacob Faibussowitsch {
1847d5e6173cSPeter Brune   PetscFunctionBegin;
1848d5e6173cSPeter Brune   if (Z) {
184948a46eb9SPierre Jolivet     if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Z", Z));
1850d5e6173cSPeter Brune   }
1851d5e6173cSPeter Brune   if (Ydot) {
185248a46eb9SPierre Jolivet     if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot));
1853d5e6173cSPeter Brune   }
18543ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1855d5e6173cSPeter Brune }
1856d5e6173cSPeter Brune 
1857*0467964bSStefano Zampini /*
1858*0467964bSStefano Zampini   DAEs need special handling for algebraic variables when restarting DIRK methods with explicit
1859*0467964bSStefano Zampini   first stage. In particular, we need:
1860*0467964bSStefano Zampini      - to zero the nonlinear function (in case the dual variables are not consistent in the first step)
1861*0467964bSStefano Zampini      - to modify the preconditioning matrix by calling MatZeroRows with identity on these variables.
1862*0467964bSStefano Zampini */
1863*0467964bSStefano Zampini static PetscErrorCode TSARKIMEXComputeAlgebraicIS(TS ts, PetscReal time, Vec X, IS *alg_is)
1864*0467964bSStefano Zampini {
1865*0467964bSStefano Zampini   TS_ARKIMEX        *ark = (TS_ARKIMEX *)ts->data;
1866*0467964bSStefano Zampini   DM                 dm;
1867*0467964bSStefano Zampini   Vec                F, W, Xdot;
1868*0467964bSStefano Zampini   const PetscScalar *w;
1869*0467964bSStefano Zampini   PetscInt           nz = 0, n, st;
1870*0467964bSStefano Zampini   PetscInt          *nzr;
1871*0467964bSStefano Zampini 
1872*0467964bSStefano Zampini   PetscFunctionBegin;
1873*0467964bSStefano Zampini   PetscCall(TSGetDM(ts, &dm)); /* may be already from SNES */
1874*0467964bSStefano Zampini   PetscCall(DMGetGlobalVector(dm, &Xdot));
1875*0467964bSStefano Zampini   PetscCall(DMGetGlobalVector(dm, &F));
1876*0467964bSStefano Zampini   PetscCall(DMGetGlobalVector(dm, &W));
1877*0467964bSStefano Zampini   PetscCall(VecSet(Xdot, 0.0));
1878*0467964bSStefano Zampini   PetscCall(TSComputeIFunction(ts, time, X, Xdot, F, ark->imex));
1879*0467964bSStefano Zampini   PetscCall(VecSetRandom(Xdot, NULL));
1880*0467964bSStefano Zampini   PetscCall(TSComputeIFunction(ts, time, X, Xdot, W, ark->imex));
1881*0467964bSStefano Zampini   PetscCall(VecAXPY(W, -1.0, F));
1882*0467964bSStefano Zampini   PetscCall(VecGetOwnershipRange(W, &st, NULL));
1883*0467964bSStefano Zampini   PetscCall(VecGetLocalSize(W, &n));
1884*0467964bSStefano Zampini   PetscCall(VecGetArrayRead(W, &w));
1885*0467964bSStefano Zampini   for (PetscInt i = 0; i < n; i++)
1886*0467964bSStefano Zampini     if (w[i] == 0.0) nz++;
1887*0467964bSStefano Zampini   PetscCall(PetscMalloc1(nz, &nzr));
1888*0467964bSStefano Zampini   nz = 0;
1889*0467964bSStefano Zampini   for (PetscInt i = 0; i < n; i++)
1890*0467964bSStefano Zampini     if (w[i] == 0.0) nzr[nz++] = i + st;
1891*0467964bSStefano Zampini   PetscCall(VecRestoreArrayRead(W, &w));
1892*0467964bSStefano Zampini   PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), nz, nzr, PETSC_OWN_POINTER, alg_is));
1893*0467964bSStefano Zampini   PetscCall(DMRestoreGlobalVector(dm, &Xdot));
1894*0467964bSStefano Zampini   PetscCall(DMRestoreGlobalVector(dm, &F));
1895*0467964bSStefano Zampini   PetscCall(DMRestoreGlobalVector(dm, &W));
1896*0467964bSStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
1897*0467964bSStefano Zampini }
1898*0467964bSStefano Zampini 
1899*0467964bSStefano Zampini /* As for the method specific Z and Ydot, we store the algebraic IS in the ARKIMEX data structure
1900*0467964bSStefano Zampini    at the finest level, in the DM for coarser solves. */
1901*0467964bSStefano Zampini static PetscErrorCode TSARKIMEXGetAlgebraicIS(TS ts, DM dm, IS *alg_is)
1902*0467964bSStefano Zampini {
1903*0467964bSStefano Zampini   TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data;
1904*0467964bSStefano Zampini 
1905*0467964bSStefano Zampini   PetscFunctionBegin;
1906*0467964bSStefano Zampini   if (dm && dm != ts->dm) {
1907*0467964bSStefano Zampini     PetscCall(PetscObjectQuery((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject *)alg_is));
1908*0467964bSStefano Zampini   } else *alg_is = ax->alg_is;
1909*0467964bSStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
1910*0467964bSStefano Zampini }
19113b98415fSStefano Zampini 
19123b98415fSStefano Zampini /* This defines the nonlinear equation that is to be solved with SNES */
1913d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormFunction_ARKIMEX(SNES snes, Vec X, Vec F, TS ts)
1914d71ae5a4SJacob Faibussowitsch {
19158a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1916d5e6173cSPeter Brune   DM          dm, dmsave;
1917d5e6173cSPeter Brune   Vec         Z, Ydot;
1918*0467964bSStefano Zampini   IS          alg_is;
19198a381b04SJed Brown 
19208a381b04SJed Brown   PetscFunctionBegin;
19219566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes, &dm));
19229566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot));
1923*0467964bSStefano Zampini   if (ark->scoeff == PETSC_MAX_REAL) PetscCall(TSARKIMEXGetAlgebraicIS(ts, dm, &alg_is));
1924*0467964bSStefano Zampini 
1925d5e6173cSPeter Brune   dmsave = ts->dm;
1926d5e6173cSPeter Brune   ts->dm = dm;
1927740132f1SEmil Constantinescu 
192898940a98SHong Zhang   if (ark->scoeff == PETSC_MAX_REAL) {
19293b98415fSStefano Zampini     /* We are solving F(t_n,x_n,xdot) = 0 to start the method */
1930*0467964bSStefano Zampini     if (!alg_is) {
1931*0467964bSStefano Zampini       PetscCheck(dmsave != ts->dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Missing algebraic IS");
1932*0467964bSStefano Zampini       PetscCall(TSARKIMEXComputeAlgebraicIS(ts, ark->stage_time, Z, &alg_is));
1933*0467964bSStefano Zampini       PetscCall(PetscObjectCompose((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject)alg_is));
1934*0467964bSStefano Zampini       PetscCall(PetscObjectDereference((PetscObject)alg_is));
1935*0467964bSStefano Zampini       PetscCall(ISViewFromOptions(alg_is, (PetscObject)snes, "-ts_arkimex_algebraic_is_view"));
1936*0467964bSStefano Zampini     }
1937d27334e2SStefano Zampini     PetscCall(TSComputeIFunction(ts, ark->stage_time, Z, X, F, ark->imex));
1938*0467964bSStefano Zampini     PetscCall(VecISSet(F, alg_is, 0.0));
1939d27334e2SStefano Zampini   } else {
194098940a98SHong Zhang     PetscReal shift = ark->scoeff / ts->time_step;
1941d27334e2SStefano Zampini     PetscCall(VecAXPBYPCZ(Ydot, -shift, shift, 0, Z, X)); /* Ydot = shift*(X-Z) */
19429566063dSJacob Faibussowitsch     PetscCall(TSComputeIFunction(ts, ark->stage_time, X, Ydot, F, ark->imex));
1943d27334e2SStefano Zampini   }
1944e817cc15SEmil Constantinescu 
1945d5e6173cSPeter Brune   ts->dm = dmsave;
19469566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot));
19473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19488a381b04SJed Brown }
19498a381b04SJed Brown 
1950d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormJacobian_ARKIMEX(SNES snes, Vec X, Mat A, Mat B, TS ts)
1951d71ae5a4SJacob Faibussowitsch {
19528a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1953d5e6173cSPeter Brune   DM          dm, dmsave;
1954d27334e2SStefano Zampini   Vec         Ydot, Z;
195598940a98SHong Zhang   PetscReal   shift;
1956*0467964bSStefano Zampini   IS          alg_is;
19578a381b04SJed Brown 
19588a381b04SJed Brown   PetscFunctionBegin;
19599566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes, &dm));
19608a381b04SJed Brown   /* ark->Ydot has already been computed in SNESTSFormFunction_ARKIMEX (SNES guarantees this) */
1961*0467964bSStefano Zampini   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot));
1962*0467964bSStefano Zampini   /* alg_is has been computed in SNESTSFormFunction_ARKIMEX */
1963*0467964bSStefano Zampini   if (ark->scoeff == PETSC_MAX_REAL) PetscCall(TSARKIMEXGetAlgebraicIS(ts, dm, &alg_is));
1964*0467964bSStefano Zampini 
1965d5e6173cSPeter Brune   dmsave = ts->dm;
1966d5e6173cSPeter Brune   ts->dm = dm;
1967740132f1SEmil Constantinescu 
196898940a98SHong Zhang   if (ark->scoeff == PETSC_MAX_REAL) {
19693b98415fSStefano Zampini     PetscBool hasZeroRows;
19703b98415fSStefano Zampini 
19713b98415fSStefano Zampini     /* We are solving F(t_n,x_n,xdot) = 0 to start the method
1972*0467964bSStefano Zampini        We compute with a very large shift and then scale back the matrix */
1973d27334e2SStefano Zampini     shift = 1.0 / PETSC_MACHINE_EPSILON;
1974d27334e2SStefano Zampini     PetscCall(TSComputeIJacobian(ts, ark->stage_time, Z, X, shift, A, B, ark->imex));
1975d27334e2SStefano Zampini     PetscCall(MatScale(B, PETSC_MACHINE_EPSILON));
19763b98415fSStefano Zampini     PetscCall(MatHasOperation(B, MATOP_ZERO_ROWS, &hasZeroRows));
19773b98415fSStefano Zampini     if (hasZeroRows) {
1978*0467964bSStefano Zampini       PetscCheck(alg_is, PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Missing algebraic IS");
19793b98415fSStefano Zampini       /* the default of AIJ is to not keep the pattern! We should probably change it someday */
19803b98415fSStefano Zampini       PetscCall(MatSetOption(B, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE));
19813b98415fSStefano Zampini       PetscCall(MatZeroRowsIS(B, alg_is, 1.0, NULL, NULL));
19823b98415fSStefano Zampini     }
19833b98415fSStefano Zampini     PetscCall(MatViewFromOptions(B, (PetscObject)snes, "-ts_arkimex_alg_mat_view"));
1984d27334e2SStefano Zampini     if (A != B) PetscCall(MatScale(A, PETSC_MACHINE_EPSILON));
1985d27334e2SStefano Zampini   } else {
198698940a98SHong Zhang     shift = ark->scoeff / ts->time_step;
19879566063dSJacob Faibussowitsch     PetscCall(TSComputeIJacobian(ts, ark->stage_time, X, Ydot, shift, A, B, ark->imex));
1988d27334e2SStefano Zampini   }
1989d5e6173cSPeter Brune   ts->dm = dmsave;
1990d27334e2SStefano Zampini   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot));
19913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1992d5e6173cSPeter Brune }
1993d5e6173cSPeter Brune 
199480ab5e31SHong Zhang static PetscErrorCode TSGetStages_ARKIMEX(TS ts, PetscInt *ns, Vec *Y[])
199580ab5e31SHong Zhang {
199680ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
199780ab5e31SHong Zhang 
199880ab5e31SHong Zhang   PetscFunctionBegin;
199980ab5e31SHong Zhang   if (ns) *ns = ark->tableau->s;
200080ab5e31SHong Zhang   if (Y) *Y = ark->Y;
200180ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
200280ab5e31SHong Zhang }
200380ab5e31SHong Zhang 
2004d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_TSARKIMEX(DM fine, DM coarse, void *ctx)
2005d71ae5a4SJacob Faibussowitsch {
2006d5e6173cSPeter Brune   PetscFunctionBegin;
20073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2008d5e6173cSPeter Brune }
2009d5e6173cSPeter Brune 
2010d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_TSARKIMEX(DM fine, Mat restrct, Vec rscale, Mat inject, DM coarse, void *ctx)
2011d71ae5a4SJacob Faibussowitsch {
2012d5e6173cSPeter Brune   TS  ts = (TS)ctx;
2013d5e6173cSPeter Brune   Vec Z, Z_c;
2014d5e6173cSPeter Brune 
2015d5e6173cSPeter Brune   PetscFunctionBegin;
20169566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, fine, &Z, NULL));
20179566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, coarse, &Z_c, NULL));
20189566063dSJacob Faibussowitsch   PetscCall(MatRestrict(restrct, Z, Z_c));
20199566063dSJacob Faibussowitsch   PetscCall(VecPointwiseMult(Z_c, rscale, Z_c));
20209566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, fine, &Z, NULL));
20219566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, coarse, &Z_c, NULL));
20223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20238a381b04SJed Brown }
20248a381b04SJed Brown 
2025d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_TSARKIMEX(DM dm, DM subdm, void *ctx)
2026d71ae5a4SJacob Faibussowitsch {
2027cdb298fcSPeter Brune   PetscFunctionBegin;
20283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2029cdb298fcSPeter Brune }
2030cdb298fcSPeter Brune 
2031d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_TSARKIMEX(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx)
2032d71ae5a4SJacob Faibussowitsch {
2033cdb298fcSPeter Brune   TS  ts = (TS)ctx;
2034cdb298fcSPeter Brune   Vec Z, Z_c;
2035cdb298fcSPeter Brune 
2036cdb298fcSPeter Brune   PetscFunctionBegin;
20379566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, NULL));
20389566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, subdm, &Z_c, NULL));
2039cdb298fcSPeter Brune 
20409566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD));
20419566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD));
2042cdb298fcSPeter Brune 
20439566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, NULL));
20449566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, subdm, &Z_c, NULL));
20453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2046cdb298fcSPeter Brune }
2047cdb298fcSPeter Brune 
2048d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauSetUp(TS ts)
2049d71ae5a4SJacob Faibussowitsch {
205096400bd6SLisandro Dalcin   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
205196400bd6SLisandro Dalcin   ARKTableau  tab = ark->tableau;
205296400bd6SLisandro Dalcin 
205396400bd6SLisandro Dalcin   PetscFunctionBegin;
2054d27334e2SStefano Zampini   PetscCall(PetscMalloc1(2 * tab->s, &ark->work));
20559566063dSJacob Faibussowitsch   PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y));
20569566063dSJacob Faibussowitsch   PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI));
2057d27334e2SStefano Zampini   if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS));
205896400bd6SLisandro Dalcin   if (ark->extrapolate) {
20599566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev));
20609566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev));
2061d27334e2SStefano Zampini     if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev));
206296400bd6SLisandro Dalcin   }
20633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
206496400bd6SLisandro Dalcin }
206596400bd6SLisandro Dalcin 
2066d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetUp_ARKIMEX(TS ts)
2067d71ae5a4SJacob Faibussowitsch {
20688a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2069d5e6173cSPeter Brune   DM          dm;
207096400bd6SLisandro Dalcin   SNES        snes;
2071f9c1d6abSBarry Smith 
20728a381b04SJed Brown   PetscFunctionBegin;
20739566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXTableauSetUp(ts));
20749566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot));
20759566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot0));
20769566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Z));
20779566063dSJacob Faibussowitsch   PetscCall(TSGetDM(ts, &dm));
20789566063dSJacob Faibussowitsch   PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts));
20799566063dSJacob Faibussowitsch   PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts));
20809566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts, &snes));
20813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20828a381b04SJed Brown }
20838a381b04SJed Brown 
208480ab5e31SHong Zhang static PetscErrorCode TSAdjointSetUp_ARKIMEX(TS ts)
208580ab5e31SHong Zhang {
208680ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
208780ab5e31SHong Zhang   ARKTableau  tab = ark->tableau;
208880ab5e31SHong Zhang 
208980ab5e31SHong Zhang   PetscFunctionBegin;
209080ab5e31SHong Zhang   PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], tab->s * ts->numcost, &ark->VecsDeltaLam));
209180ab5e31SHong Zhang   PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &ark->VecsSensiTemp));
209280ab5e31SHong Zhang   if (ts->vecs_sensip) { PetscCall(VecDuplicateVecs(ts->vecs_sensip[0], ts->numcost, &ark->VecsSensiPTemp)); }
209380ab5e31SHong Zhang   if (PetscDefined(USE_DEBUG)) {
209480ab5e31SHong Zhang     PetscBool id = PETSC_FALSE;
209580ab5e31SHong Zhang     PetscCall(TSARKIMEXTestMassIdentity(ts, &id));
20968434afd1SBarry 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");
209780ab5e31SHong Zhang   }
209880ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
209980ab5e31SHong Zhang }
210080ab5e31SHong Zhang 
2101d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetFromOptions_ARKIMEX(TS ts, PetscOptionItems *PetscOptionsObject)
2102d71ae5a4SJacob Faibussowitsch {
21034cc180ffSJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2104d27334e2SStefano Zampini   PetscBool   dirk;
21058a381b04SJed Brown 
21068a381b04SJed Brown   PetscFunctionBegin;
2107d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
2108d27334e2SStefano Zampini   PetscOptionsHeadBegin(PetscOptionsObject, dirk ? "DIRK ODE solver options" : "ARKIMEX ODE solver options");
21098a381b04SJed Brown   {
21108a381b04SJed Brown     ARKTableauLink link;
21118a381b04SJed Brown     PetscInt       count, choice;
21128a381b04SJed Brown     PetscBool      flg;
21138a381b04SJed Brown     const char   **namelist;
2114d27334e2SStefano Zampini     for (link = ARKTableauList, count = 0; link; link = link->next) {
2115d27334e2SStefano Zampini       if (!dirk && link->tab.additive) count++;
2116d27334e2SStefano Zampini       if (dirk && !link->tab.additive) count++;
2117d27334e2SStefano Zampini     }
21189566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(count, (char ***)&namelist));
2119d27334e2SStefano Zampini     for (link = ARKTableauList, count = 0; link; link = link->next) {
2120d27334e2SStefano Zampini       if (!dirk && link->tab.additive) namelist[count++] = link->tab.name;
2121d27334e2SStefano Zampini       if (dirk && !link->tab.additive) namelist[count++] = link->tab.name;
2122d27334e2SStefano Zampini     }
2123d27334e2SStefano Zampini     if (dirk) {
2124d27334e2SStefano Zampini       PetscCall(PetscOptionsEList("-ts_dirk_type", "Family of DIRK method", "TSDIRKSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg));
2125d27334e2SStefano Zampini       if (flg) PetscCall(TSDIRKSetType(ts, namelist[choice]));
2126d27334e2SStefano Zampini     } else {
21279566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEList("-ts_arkimex_type", "Family of ARK IMEX method", "TSARKIMEXSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg));
21289566063dSJacob Faibussowitsch       if (flg) PetscCall(TSARKIMEXSetType(ts, namelist[choice]));
21294cc180ffSJed Brown       flg = (PetscBool)!ark->imex;
21309566063dSJacob Faibussowitsch       PetscCall(PetscOptionsBool("-ts_arkimex_fully_implicit", "Solve the problem fully implicitly", "TSARKIMEXSetFullyImplicit", flg, &flg, NULL));
21314cc180ffSJed Brown       ark->imex = (PetscBool)!flg;
2132d27334e2SStefano Zampini     }
2133d27334e2SStefano Zampini     PetscCall(PetscFree(namelist));
21349566063dSJacob 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));
21358a381b04SJed Brown   }
2136d0609cedSBarry Smith   PetscOptionsHeadEnd();
21373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21388a381b04SJed Brown }
21398a381b04SJed Brown 
2140d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSView_ARKIMEX(TS ts, PetscViewer viewer)
2141d71ae5a4SJacob Faibussowitsch {
21428a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2143d27334e2SStefano Zampini   PetscBool   iascii, dirk;
21448a381b04SJed Brown 
21458a381b04SJed Brown   PetscFunctionBegin;
2146d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
21479566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
21488a381b04SJed Brown   if (iascii) {
2149d27334e2SStefano Zampini     PetscViewerFormat format;
21509c334d8fSLisandro Dalcin     ARKTableau        tab = ark->tableau;
215119fd82e9SBarry Smith     TSARKIMEXType     arktype;
2152d27334e2SStefano Zampini     char              buf[2048];
21533a28c0e5SStefano Zampini     PetscBool         flg;
21543a28c0e5SStefano Zampini 
21559566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXGetType(ts, &arktype));
21569566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXGetFullyImplicit(ts, &flg));
2157d27334e2SStefano Zampini     PetscCall(PetscViewerASCIIPrintf(viewer, "  %s %s\n", dirk ? "DIRK" : "ARK IMEX", arktype));
21589566063dSJacob Faibussowitsch     PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->ct));
2159d27334e2SStefano Zampini     PetscCall(PetscViewerASCIIPrintf(viewer, "  %sabscissa       ct = %s\n", dirk ? "" : "Stiff ", buf));
2160d27334e2SStefano Zampini     PetscCall(PetscViewerGetFormat(viewer, &format));
2161d27334e2SStefano Zampini     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
2162d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sAt =\n", dirk ? "" : "Stiff "));
2163d27334e2SStefano Zampini       for (PetscInt i = 0; i < tab->s; i++) {
2164d27334e2SStefano Zampini         PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->At + i * tab->s));
2165d27334e2SStefano Zampini         PetscCall(PetscViewerASCIIPrintf(viewer, "    %s\n", buf));
2166d27334e2SStefano Zampini       }
2167d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bt));
2168d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sbt = %s\n", dirk ? "" : "Stiff ", buf));
2169d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bembedt));
2170d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sbet = %s\n", dirk ? "" : "Stiff ", buf));
2171d27334e2SStefano Zampini     }
21729566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fully implicit: %s\n", flg ? "yes" : "no"));
21739566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Stiffly accurate: %s\n", tab->stiffly_accurate ? "yes" : "no"));
21749566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Explicit first stage: %s\n", tab->explicit_first_stage ? "yes" : "no"));
21759566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "FSAL property: %s\n", tab->FSAL_implicit ? "yes" : "no"));
2176d27334e2SStefano Zampini     if (!dirk) {
2177d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->c));
21789566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  Nonstiff abscissa     c = %s\n", buf));
21798a381b04SJed Brown     }
2180d27334e2SStefano Zampini   }
21813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21828a381b04SJed Brown }
21838a381b04SJed Brown 
2184d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSLoad_ARKIMEX(TS ts, PetscViewer viewer)
2185d71ae5a4SJacob Faibussowitsch {
2186f2c2a1b9SBarry Smith   SNES    snes;
21879c334d8fSLisandro Dalcin   TSAdapt adapt;
2188f2c2a1b9SBarry Smith 
2189f2c2a1b9SBarry Smith   PetscFunctionBegin;
21909566063dSJacob Faibussowitsch   PetscCall(TSGetAdapt(ts, &adapt));
21919566063dSJacob Faibussowitsch   PetscCall(TSAdaptLoad(adapt, viewer));
21929566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts, &snes));
21939566063dSJacob Faibussowitsch   PetscCall(SNESLoad(snes, viewer));
2194ad6bc421SBarry Smith   /* function and Jacobian context for SNES when used with TS is always ts object */
21959566063dSJacob Faibussowitsch   PetscCall(SNESSetFunction(snes, NULL, NULL, ts));
21969566063dSJacob Faibussowitsch   PetscCall(SNESSetJacobian(snes, NULL, NULL, NULL, ts));
21973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2198f2c2a1b9SBarry Smith }
2199f2c2a1b9SBarry Smith 
22008a381b04SJed Brown /*@C
2201bcf0153eSBarry Smith   TSARKIMEXSetType - Set the type of `TSARKIMEX` scheme
22028a381b04SJed Brown 
220320f4b53cSBarry Smith   Logically Collective
22048a381b04SJed Brown 
2205d8d19677SJose E. Roman   Input Parameters:
22068a381b04SJed Brown + ts      - timestepping context
2207bcf0153eSBarry Smith - arktype - type of `TSARKIMEX` scheme
22088a381b04SJed Brown 
2209bcf0153eSBarry Smith   Options Database Key:
2210bcf0153eSBarry Smith . -ts_arkimex_type <1bee,a2,l2,ars122,2c,2d,2e,prssp2,3,bpr3,ars443,4,5> - set `TSARKIMEX` scheme type
22119bd3e852SBarry Smith 
22128a381b04SJed Brown   Level: intermediate
22138a381b04SJed Brown 
22141cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEX1BEE`, `TSARKIMEXA2`, `TSARKIMEXL2`, `TSARKIMEXARS122`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEXPRSSP2`,
2215db781477SPatrick Sanan           `TSARKIMEX3`, `TSARKIMEXBPR3`, `TSARKIMEXARS443`, `TSARKIMEX4`, `TSARKIMEX5`
22168a381b04SJed Brown @*/
2217d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetType(TS ts, TSARKIMEXType arktype)
2218d71ae5a4SJacob Faibussowitsch {
22198a381b04SJed Brown   PetscFunctionBegin;
22208a381b04SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22214f572ea9SToby Isaac   PetscAssertPointer(arktype, 2);
2222cac4c232SBarry Smith   PetscTryMethod(ts, "TSARKIMEXSetType_C", (TS, TSARKIMEXType), (ts, arktype));
22233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22248a381b04SJed Brown }
22258a381b04SJed Brown 
22268a381b04SJed Brown /*@C
2227bcf0153eSBarry Smith   TSARKIMEXGetType - Get the type of `TSARKIMEX` scheme
22288a381b04SJed Brown 
222920f4b53cSBarry Smith   Logically Collective
22308a381b04SJed Brown 
22318a381b04SJed Brown   Input Parameter:
22328a381b04SJed Brown . ts - timestepping context
22338a381b04SJed Brown 
22348a381b04SJed Brown   Output Parameter:
2235bcf0153eSBarry Smith . arktype - type of `TSARKIMEX` scheme
22368a381b04SJed Brown 
22378a381b04SJed Brown   Level: intermediate
22388a381b04SJed Brown 
223942747ad1SJacob Faibussowitsch .seealso: [](ch_ts), `TSARKIMEXc`
22408a381b04SJed Brown @*/
2241d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetType(TS ts, TSARKIMEXType *arktype)
2242d71ae5a4SJacob Faibussowitsch {
22438a381b04SJed Brown   PetscFunctionBegin;
22448a381b04SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2245cac4c232SBarry Smith   PetscUseMethod(ts, "TSARKIMEXGetType_C", (TS, TSARKIMEXType *), (ts, arktype));
22463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22478a381b04SJed Brown }
22488a381b04SJed Brown 
224916353aafSBarry Smith /*@
2250bcf0153eSBarry Smith   TSARKIMEXSetFullyImplicit - Solve both parts of the equation implicitly, including the part that is normally solved explicitly
22514cc180ffSJed Brown 
225220f4b53cSBarry Smith   Logically Collective
22534cc180ffSJed Brown 
2254d8d19677SJose E. Roman   Input Parameters:
22554cc180ffSJed Brown + ts  - timestepping context
2256bcf0153eSBarry Smith - flg - `PETSC_TRUE` for fully implicit
22574cc180ffSJed Brown 
22584cc180ffSJed Brown   Level: intermediate
22594cc180ffSJed Brown 
22601cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXGetType()`, `TSARKIMEXGetFullyImplicit()`
22614cc180ffSJed Brown @*/
2262d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetFullyImplicit(TS ts, PetscBool flg)
2263d71ae5a4SJacob Faibussowitsch {
22644cc180ffSJed Brown   PetscFunctionBegin;
22654cc180ffSJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22663a28c0e5SStefano Zampini   PetscValidLogicalCollectiveBool(ts, flg, 2);
2267cac4c232SBarry Smith   PetscTryMethod(ts, "TSARKIMEXSetFullyImplicit_C", (TS, PetscBool), (ts, flg));
22683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22694cc180ffSJed Brown }
22704cc180ffSJed Brown 
22713a28c0e5SStefano Zampini /*@
22723a28c0e5SStefano Zampini   TSARKIMEXGetFullyImplicit - Inquires if both parts of the equation are solved implicitly
22733a28c0e5SStefano Zampini 
227420f4b53cSBarry Smith   Logically Collective
22753a28c0e5SStefano Zampini 
22763a28c0e5SStefano Zampini   Input Parameter:
22773a28c0e5SStefano Zampini . ts - timestepping context
22783a28c0e5SStefano Zampini 
22797a7aea1fSJed Brown   Output Parameter:
2280bcf0153eSBarry Smith . flg - `PETSC_TRUE` for fully implicit
22813a28c0e5SStefano Zampini 
22823a28c0e5SStefano Zampini   Level: intermediate
22833a28c0e5SStefano Zampini 
22841cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`
22853a28c0e5SStefano Zampini @*/
2286d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetFullyImplicit(TS ts, PetscBool *flg)
2287d71ae5a4SJacob Faibussowitsch {
22883a28c0e5SStefano Zampini   PetscFunctionBegin;
22893a28c0e5SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22904f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
2291cac4c232SBarry Smith   PetscUseMethod(ts, "TSARKIMEXGetFullyImplicit_C", (TS, PetscBool *), (ts, flg));
22923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22933a28c0e5SStefano Zampini }
22943a28c0e5SStefano Zampini 
2295d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetType_ARKIMEX(TS ts, TSARKIMEXType *arktype)
2296d71ae5a4SJacob Faibussowitsch {
22978a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
22988a381b04SJed Brown 
22998a381b04SJed Brown   PetscFunctionBegin;
23008a381b04SJed Brown   *arktype = ark->tableau->name;
23013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23028a381b04SJed Brown }
2303d27334e2SStefano Zampini 
2304d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetType_ARKIMEX(TS ts, TSARKIMEXType arktype)
2305d71ae5a4SJacob Faibussowitsch {
23068a381b04SJed Brown   TS_ARKIMEX    *ark = (TS_ARKIMEX *)ts->data;
23078a381b04SJed Brown   PetscBool      match;
23088a381b04SJed Brown   ARKTableauLink link;
23098a381b04SJed Brown 
23108a381b04SJed Brown   PetscFunctionBegin;
23118a381b04SJed Brown   if (ark->tableau) {
23129566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(ark->tableau->name, arktype, &match));
23133ba16761SJacob Faibussowitsch     if (match) PetscFunctionReturn(PETSC_SUCCESS);
23148a381b04SJed Brown   }
23158a381b04SJed Brown   for (link = ARKTableauList; link; link = link->next) {
23169566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(link->tab.name, arktype, &match));
23178a381b04SJed Brown     if (match) {
23189566063dSJacob Faibussowitsch       if (ts->setupcalled) PetscCall(TSARKIMEXTableauReset(ts));
23198a381b04SJed Brown       ark->tableau = &link->tab;
23209566063dSJacob Faibussowitsch       if (ts->setupcalled) PetscCall(TSARKIMEXTableauSetUp(ts));
23212ffb9264SLisandro Dalcin       ts->default_adapt_type = ark->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE;
23223ba16761SJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
23238a381b04SJed Brown     }
23248a381b04SJed Brown   }
232598921bdaSJacob Faibussowitsch   SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", arktype);
23268a381b04SJed Brown }
2327e0877f53SBarry Smith 
2328d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetFullyImplicit_ARKIMEX(TS ts, PetscBool flg)
2329d71ae5a4SJacob Faibussowitsch {
23304cc180ffSJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
23314cc180ffSJed Brown 
23324cc180ffSJed Brown   PetscFunctionBegin;
23334cc180ffSJed Brown   ark->imex = (PetscBool)!flg;
23343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23354cc180ffSJed Brown }
23368a381b04SJed Brown 
2337d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetFullyImplicit_ARKIMEX(TS ts, PetscBool *flg)
2338d71ae5a4SJacob Faibussowitsch {
23393a28c0e5SStefano Zampini   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
23403a28c0e5SStefano Zampini 
23413a28c0e5SStefano Zampini   PetscFunctionBegin;
23423a28c0e5SStefano Zampini   *flg = (PetscBool)!ark->imex;
23433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23443a28c0e5SStefano Zampini }
23453a28c0e5SStefano Zampini 
2346d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSDestroy_ARKIMEX(TS ts)
2347d71ae5a4SJacob Faibussowitsch {
2348b3a6b972SJed Brown   PetscFunctionBegin;
23499566063dSJacob Faibussowitsch   PetscCall(TSReset_ARKIMEX(ts));
2350b3a6b972SJed Brown   if (ts->dm) {
23519566063dSJacob Faibussowitsch     PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts));
23529566063dSJacob Faibussowitsch     PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts));
2353b3a6b972SJed Brown   }
23549566063dSJacob Faibussowitsch   PetscCall(PetscFree(ts->data));
2355d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", NULL));
2356d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", NULL));
23579566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", NULL));
23589566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", NULL));
23599566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", NULL));
23602e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", NULL));
23613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2362b3a6b972SJed Brown }
2363b3a6b972SJed Brown 
23648a381b04SJed Brown /* ------------------------------------------------------------ */
23658a381b04SJed Brown /*MC
2366c79dcfbdSBarry Smith       TSARKIMEX - ODE and DAE solver using additive Runge-Kutta IMEX schemes
23678a381b04SJed Brown 
2368fca742c7SJed Brown   These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly
2369fca742c7SJed Brown   nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part
2370bcf0153eSBarry Smith   of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`.
2371d0685a90SJed Brown 
23728a381b04SJed Brown   Level: beginner
23738a381b04SJed Brown 
2374bcf0153eSBarry Smith   Notes:
2375bcf0153eSBarry Smith   The default is `TSARKIMEX3`, it can be changed with `TSARKIMEXSetType()` or -ts_arkimex_type
23768a381b04SJed Brown 
2377bcf0153eSBarry Smith   If the equation is implicit or a DAE, then `TSSetEquationType()` needs to be set accordingly. Refer to the manual for further information.
2378bcf0153eSBarry Smith 
2379bcf0153eSBarry 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).
2380bcf0153eSBarry Smith 
2381bcf0153eSBarry Smith   Consider trying `TSROSW` if the stiff part is linear or weakly nonlinear.
2382bcf0153eSBarry Smith 
23831cc06b55SBarry Smith .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSARKIMEXSetType()`, `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`, `TSARKIMEXGetFullyImplicit()`,
2384bcf0153eSBarry Smith           `TSARKIMEX1BEE`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEX3`, `TSARKIMEXL2`, `TSARKIMEXA2`, `TSARKIMEXARS122`,
2385bcf0153eSBarry Smith           `TSARKIMEX4`, `TSARKIMEX5`, `TSARKIMEXPRSSP2`, `TSARKIMEXARS443`, `TSARKIMEXBPR3`, `TSARKIMEXType`, `TSARKIMEXRegister()`, `TSType`
23868a381b04SJed Brown M*/
2387d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSCreate_ARKIMEX(TS ts)
2388d71ae5a4SJacob Faibussowitsch {
238980ab5e31SHong Zhang   TS_ARKIMEX *ark;
2390d27334e2SStefano Zampini   PetscBool   dirk;
23918a381b04SJed Brown 
23928a381b04SJed Brown   PetscFunctionBegin;
23939566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXInitializePackage());
2394d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
23958a381b04SJed Brown 
23968a381b04SJed Brown   ts->ops->reset          = TSReset_ARKIMEX;
239780ab5e31SHong Zhang   ts->ops->adjointreset   = TSAdjointReset_ARKIMEX;
23988a381b04SJed Brown   ts->ops->destroy        = TSDestroy_ARKIMEX;
23998a381b04SJed Brown   ts->ops->view           = TSView_ARKIMEX;
2400f2c2a1b9SBarry Smith   ts->ops->load           = TSLoad_ARKIMEX;
24018a381b04SJed Brown   ts->ops->setup          = TSSetUp_ARKIMEX;
240280ab5e31SHong Zhang   ts->ops->adjointsetup   = TSAdjointSetUp_ARKIMEX;
24038a381b04SJed Brown   ts->ops->step           = TSStep_ARKIMEX;
2404cd652676SJed Brown   ts->ops->interpolate    = TSInterpolate_ARKIMEX;
2405108c343cSJed Brown   ts->ops->evaluatestep   = TSEvaluateStep_ARKIMEX;
24068a381b04SJed Brown   ts->ops->setfromoptions = TSSetFromOptions_ARKIMEX;
24078a381b04SJed Brown   ts->ops->snesfunction   = SNESTSFormFunction_ARKIMEX;
24088a381b04SJed Brown   ts->ops->snesjacobian   = SNESTSFormJacobian_ARKIMEX;
240980ab5e31SHong Zhang   ts->ops->getstages      = TSGetStages_ARKIMEX;
241080ab5e31SHong Zhang   ts->ops->adjointstep    = TSAdjointStep_ARKIMEX;
24118a381b04SJed Brown 
2412efd4aadfSBarry Smith   ts->usessnes = PETSC_TRUE;
2413efd4aadfSBarry Smith 
241480ab5e31SHong Zhang   PetscCall(PetscNew(&ark));
241580ab5e31SHong Zhang   ts->data  = (void *)ark;
2416d27334e2SStefano Zampini   ark->imex = dirk ? PETSC_FALSE : PETSC_TRUE;
241780ab5e31SHong Zhang 
241880ab5e31SHong Zhang   ark->VecsDeltaLam   = NULL;
241980ab5e31SHong Zhang   ark->VecsSensiTemp  = NULL;
242080ab5e31SHong Zhang   ark->VecsSensiPTemp = NULL;
24218a381b04SJed Brown 
24229566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", TSARKIMEXGetType_ARKIMEX));
2423d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", TSARKIMEXGetFullyImplicit_ARKIMEX));
2424d27334e2SStefano Zampini   if (!dirk) {
24259566063dSJacob Faibussowitsch     PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", TSARKIMEXSetType_ARKIMEX));
24269566063dSJacob Faibussowitsch     PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", TSARKIMEXSetFullyImplicit_ARKIMEX));
24279566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetType(ts, TSARKIMEXDefault));
2428d27334e2SStefano Zampini   }
2429d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2430d27334e2SStefano Zampini }
2431d27334e2SStefano Zampini 
2432d27334e2SStefano Zampini /* ------------------------------------------------------------ */
2433d27334e2SStefano Zampini 
2434d27334e2SStefano Zampini static PetscErrorCode TSDIRKSetType_DIRK(TS ts, TSDIRKType dirktype)
2435d27334e2SStefano Zampini {
2436d27334e2SStefano Zampini   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2437d27334e2SStefano Zampini 
2438d27334e2SStefano Zampini   PetscFunctionBegin;
2439d27334e2SStefano Zampini   PetscCall(TSARKIMEXSetType_ARKIMEX(ts, dirktype));
2440d27334e2SStefano Zampini   PetscCheck(!ark->tableau->additive, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONG, "Method \"%s\" is not DIRK", dirktype);
2441d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2442d27334e2SStefano Zampini }
2443d27334e2SStefano Zampini 
2444d27334e2SStefano Zampini /*@C
2445d27334e2SStefano Zampini   TSDIRKSetType - Set the type of `TSDIRK` scheme
2446d27334e2SStefano Zampini 
2447d27334e2SStefano Zampini   Logically Collective
2448d27334e2SStefano Zampini 
2449d27334e2SStefano Zampini   Input Parameters:
2450d27334e2SStefano Zampini + ts       - timestepping context
2451d27334e2SStefano Zampini - dirktype - type of `TSDIRK` scheme
2452d27334e2SStefano Zampini 
2453d27334e2SStefano Zampini   Options Database Key:
2454d27334e2SStefano Zampini . -ts_dirkimex_type - set `TSDIRK` scheme type
2455d27334e2SStefano Zampini 
2456d27334e2SStefano Zampini   Level: intermediate
2457d27334e2SStefano Zampini 
2458d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKGetType()`, `TSDIRK`, `TSDIRKType`
2459d27334e2SStefano Zampini @*/
2460d27334e2SStefano Zampini PetscErrorCode TSDIRKSetType(TS ts, TSDIRKType dirktype)
2461d27334e2SStefano Zampini {
2462d27334e2SStefano Zampini   PetscFunctionBegin;
2463d27334e2SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2464d27334e2SStefano Zampini   PetscAssertPointer(dirktype, 2);
2465d27334e2SStefano Zampini   PetscTryMethod(ts, "TSDIRKSetType_C", (TS, TSDIRKType), (ts, dirktype));
2466d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2467d27334e2SStefano Zampini }
2468d27334e2SStefano Zampini 
2469d27334e2SStefano Zampini /*@C
2470d27334e2SStefano Zampini   TSDIRKGetType - Get the type of `TSDIRK` scheme
2471d27334e2SStefano Zampini 
2472d27334e2SStefano Zampini   Logically Collective
2473d27334e2SStefano Zampini 
2474d27334e2SStefano Zampini   Input Parameter:
2475d27334e2SStefano Zampini . ts - timestepping context
2476d27334e2SStefano Zampini 
2477d27334e2SStefano Zampini   Output Parameter:
2478d27334e2SStefano Zampini . dirktype - type of `TSDIRK` scheme
2479d27334e2SStefano Zampini 
2480d27334e2SStefano Zampini   Level: intermediate
2481d27334e2SStefano Zampini 
2482d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKSetType()`
2483d27334e2SStefano Zampini @*/
2484d27334e2SStefano Zampini PetscErrorCode TSDIRKGetType(TS ts, TSDIRKType *dirktype)
2485d27334e2SStefano Zampini {
2486d27334e2SStefano Zampini   PetscFunctionBegin;
2487d27334e2SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2488d27334e2SStefano Zampini   PetscUseMethod(ts, "TSDIRKGetType_C", (TS, TSDIRKType *), (ts, dirktype));
2489d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2490d27334e2SStefano Zampini }
2491d27334e2SStefano Zampini 
2492d27334e2SStefano Zampini /*MC
24933405e92cSStefano Zampini       TSDIRK - ODE and DAE solver using Diagonally implicit Runge-Kutta schemes.
2494d27334e2SStefano Zampini 
2495d27334e2SStefano Zampini   Level: beginner
2496d27334e2SStefano Zampini 
2497d27334e2SStefano Zampini   Notes:
24983405e92cSStefano Zampini   The default is `TSDIRKES213SAL`, it can be changed with `TSDIRKSetType()` or -ts_dirk_type.
24993405e92cSStefano Zampini   The convention used in PETSc to name the DIRK methods is TSDIRK[E][S]PQS[SA][L][A] with:
25003405e92cSStefano Zampini + E - whether the method has an explicit first stage
25013405e92cSStefano Zampini . S - whether the method is single diagonal
25023405e92cSStefano Zampini . P - order of the advancing method
25033405e92cSStefano Zampini . Q - order of the embedded method
25043405e92cSStefano Zampini . S - number of stages
25053405e92cSStefano Zampini . SA - whether the method is stiffly accurate
25063405e92cSStefano Zampini . L - whether the method is L-stable
25073405e92cSStefano Zampini - A - whether the method is A-stable
2508d27334e2SStefano Zampini 
2509d27334e2SStefano Zampini .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSDIRKSetType()`, `TSDIRKGetType()`, `TSDIRKRegister()`.
2510d27334e2SStefano Zampini M*/
2511d27334e2SStefano Zampini PETSC_EXTERN PetscErrorCode TSCreate_DIRK(TS ts)
2512d27334e2SStefano Zampini {
2513d27334e2SStefano Zampini   PetscFunctionBegin;
2514d27334e2SStefano Zampini   PetscCall(TSCreate_ARKIMEX(ts));
2515d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", TSARKIMEXGetType_ARKIMEX));
2516d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", TSDIRKSetType_DIRK));
2517d27334e2SStefano Zampini   PetscCall(TSDIRKSetType(ts, TSDIRKDefault));
25183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
25198a381b04SJed Brown }
2520