xref: /petsc/src/ts/impls/arkimex/arkimex.c (revision 3405e92ce0a429885711dcb2a39f6cd8565d5879)
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;
16*3405e92cSStefano Zampini static TSDIRKType     TSDIRKDefault    = TSDIRKES213SAL;
178a381b04SJed Brown static PetscBool      TSARKIMEXRegisterAllCalled;
188a381b04SJed Brown static PetscBool      TSARKIMEXPackageInitialized;
1956dcabbaSDebojyoti Ghosh static PetscErrorCode TSExtrapolate_ARKIMEX(TS, PetscReal, Vec);
208a381b04SJed Brown 
218a381b04SJed Brown typedef struct _ARKTableau *ARKTableau;
228a381b04SJed Brown struct _ARKTableau {
238a381b04SJed Brown   char      *name;
24d27334e2SStefano Zampini   PetscBool  additive;             /* If False, it is a DIRK method */
254f385281SJed Brown   PetscInt   order;                /* Classical approximation order of the method */
264f385281SJed Brown   PetscInt   s;                    /* Number of stages */
27e817cc15SEmil Constantinescu   PetscBool  stiffly_accurate;     /* The implicit part is stiffly accurate */
28e817cc15SEmil Constantinescu   PetscBool  FSAL_implicit;        /* The implicit part is FSAL */
29e817cc15SEmil Constantinescu   PetscBool  explicit_first_stage; /* The implicit part has an explicit first stage */
304f385281SJed Brown   PetscInt   pinterp;              /* Interpolation order */
314f385281SJed Brown   PetscReal *At, *bt, *ct;         /* Stiff tableau */
328a381b04SJed Brown   PetscReal *A, *b, *c;            /* Non-stiff tableau */
33108c343cSJed Brown   PetscReal *bembedt, *bembed;     /* Embedded formula of order one less (order-1) */
34cd652676SJed Brown   PetscReal *binterpt, *binterp;   /* Dense output formula */
35108c343cSJed Brown   PetscReal  ccfl;                 /* Placeholder for CFL coefficient relative to forward Euler */
368a381b04SJed Brown };
378a381b04SJed Brown typedef struct _ARKTableauLink *ARKTableauLink;
388a381b04SJed Brown struct _ARKTableauLink {
398a381b04SJed Brown   struct _ARKTableau tab;
408a381b04SJed Brown   ARKTableauLink     next;
418a381b04SJed Brown };
428a381b04SJed Brown static ARKTableauLink ARKTableauList;
438a381b04SJed Brown 
448a381b04SJed Brown typedef struct {
458a381b04SJed Brown   ARKTableau   tableau;
468a381b04SJed Brown   Vec         *Y;            /* States computed during the step */
478a381b04SJed Brown   Vec         *YdotI;        /* Time derivatives for the stiff part */
488a381b04SJed Brown   Vec         *YdotRHS;      /* Function evaluations for the non-stiff part */
4956dcabbaSDebojyoti Ghosh   Vec         *Y_prev;       /* States computed during the previous time step */
5056dcabbaSDebojyoti Ghosh   Vec         *YdotI_prev;   /* Time derivatives for the stiff part for the previous time step*/
5156dcabbaSDebojyoti Ghosh   Vec         *YdotRHS_prev; /* Function evaluations for the non-stiff part for the previous time step*/
52e817cc15SEmil Constantinescu   Vec          Ydot0;        /* Holds the slope from the previous step in FSAL case */
538a381b04SJed Brown   Vec          Ydot;         /* Work vector holding Ydot during residual evaluation */
548a381b04SJed Brown   Vec          Z;            /* Ydot = shift(Y-Z) */
558a381b04SJed Brown   PetscScalar *work;         /* Scalar work */
56b296d7d5SJed Brown   PetscReal    scoeff;       /* shift = scoeff/dt */
578a381b04SJed Brown   PetscReal    stage_time;
584cc180ffSJed Brown   PetscBool    imex;
5996400bd6SLisandro Dalcin   PetscBool    extrapolate; /* Extrapolate initial guess from previous time-step stage values */
60108c343cSJed Brown   TSStepStatus status;
6180ab5e31SHong Zhang 
6280ab5e31SHong Zhang   /* context for sensitivity analysis */
6380ab5e31SHong Zhang   Vec *VecsDeltaLam;   /* Increment of the adjoint sensitivity w.r.t IC at stage */
6480ab5e31SHong Zhang   Vec *VecsSensiTemp;  /* Vectors to be multiplied with Jacobian transpose */
6580ab5e31SHong Zhang   Vec *VecsSensiPTemp; /* Temporary Vectors to store JacobianP-transpose-vector product */
668a381b04SJed Brown } TS_ARKIMEX;
67d27334e2SStefano Zampini 
681f80e275SEmil Constantinescu /*MC
691f80e275SEmil Constantinescu      TSARKIMEXARS122 - Second order ARK IMEX scheme.
708a381b04SJed Brown 
711f80e275SEmil Constantinescu      This method has one explicit stage and one implicit stage.
721f80e275SEmil Constantinescu 
73bcf0153eSBarry Smith      Options Database Key:
7467b8a455SSatish Balay .      -ts_arkimex_type ars122 - set arkimex type to ars122
759bd3e852SBarry Smith 
76bcf0153eSBarry Smith      Level: advanced
77bcf0153eSBarry Smith 
781f80e275SEmil Constantinescu      References:
79606c0280SSatish Balay .    * - U. Ascher, S. Ruuth, R. J. Spiteri, Implicit explicit Runge Kutta methods for time dependent Partial Differential Equations. Appl. Numer. Math. 25, (1997).
801f80e275SEmil Constantinescu 
811cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
821f80e275SEmil Constantinescu M*/
83d27334e2SStefano Zampini 
841f80e275SEmil Constantinescu /*MC
851f80e275SEmil Constantinescu      TSARKIMEXA2 - Second order ARK IMEX scheme with A-stable implicit part.
861f80e275SEmil Constantinescu 
871f80e275SEmil 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.
881f80e275SEmil Constantinescu 
89bcf0153eSBarry Smith      Options Database Key:
9067b8a455SSatish Balay .      -ts_arkimex_type a2 - set arkimex type to a2
919bd3e852SBarry Smith 
921f80e275SEmil Constantinescu      Level: advanced
931f80e275SEmil Constantinescu 
941cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
951f80e275SEmil Constantinescu M*/
96d27334e2SStefano Zampini 
971f80e275SEmil Constantinescu /*MC
981f80e275SEmil Constantinescu      TSARKIMEXL2 - Second order ARK IMEX scheme with L-stable implicit part.
991f80e275SEmil Constantinescu 
1001f80e275SEmil Constantinescu      This method has two implicit stages, and L-stable implicit scheme.
1011f80e275SEmil Constantinescu 
102bcf0153eSBarry Smith      Options Database Key:
10367b8a455SSatish Balay .      -ts_arkimex_type l2 - set arkimex type to l2
1049bd3e852SBarry Smith 
105bcf0153eSBarry Smith      Level: advanced
106bcf0153eSBarry Smith 
1071f80e275SEmil Constantinescu     References:
108606c0280SSatish Balay .   * - L. Pareschi, G. Russo, Implicit Explicit Runge Kutta schemes and applications to hyperbolic systems with relaxations. Journal of Scientific Computing Volume: 25, Issue: 1, October, 2005.
1091f80e275SEmil Constantinescu 
1101cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
1111f80e275SEmil Constantinescu M*/
112d27334e2SStefano Zampini 
1131f80e275SEmil Constantinescu /*MC
114c79dcfbdSBarry Smith      TSARKIMEX1BEE - First order backward Euler represented as an ARK IMEX scheme with extrapolation as error estimator. This is a 3-stage method.
115e817cc15SEmil Constantinescu 
116e817cc15SEmil Constantinescu      This method is aimed at starting the integration of implicit DAEs when explicit first-stage ARK methods are used.
117e817cc15SEmil Constantinescu 
118bcf0153eSBarry Smith      Options Database Key:
11967b8a455SSatish Balay .      -ts_arkimex_type 1bee - set arkimex type to 1bee
1209bd3e852SBarry Smith 
121e817cc15SEmil Constantinescu      Level: advanced
122e817cc15SEmil Constantinescu 
1231cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
124e817cc15SEmil Constantinescu M*/
125d27334e2SStefano Zampini 
126e817cc15SEmil Constantinescu /*MC
1271f80e275SEmil Constantinescu      TSARKIMEX2C - Second order ARK IMEX scheme with L-stable implicit part.
1281f80e275SEmil Constantinescu 
1291f80e275SEmil 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.
1301f80e275SEmil Constantinescu 
131bcf0153eSBarry Smith      Options Database Key:
13267b8a455SSatish Balay .      -ts_arkimex_type 2c - set arkimex type to 2c
1339bd3e852SBarry Smith 
1341f80e275SEmil Constantinescu      Level: advanced
1351f80e275SEmil Constantinescu 
1361cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
1371f80e275SEmil Constantinescu M*/
138d27334e2SStefano Zampini 
13964f491ddSJed Brown /*MC
14064f491ddSJed Brown      TSARKIMEX2D - Second order ARK IMEX scheme with L-stable implicit part.
14164f491ddSJed Brown 
142da81f932SPierre 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.
14364f491ddSJed Brown 
144bcf0153eSBarry Smith      Options Database Key:
14567b8a455SSatish Balay .      -ts_arkimex_type 2d - set arkimex type to 2d
1469bd3e852SBarry Smith 
147b330ce4dSSatish Balay      Level: advanced
148b330ce4dSSatish Balay 
1491cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
15064f491ddSJed Brown M*/
151d27334e2SStefano Zampini 
15264f491ddSJed Brown /*MC
15364f491ddSJed Brown      TSARKIMEX2E - Second order ARK IMEX scheme with L-stable implicit part.
15464f491ddSJed Brown 
15564f491ddSJed Brown      This method has one explicit stage and two implicit stages. It is is an optimal method developed by Emil Constantinescu.
15664f491ddSJed Brown 
157bcf0153eSBarry Smith      Options Database Key:
15867b8a455SSatish Balay .      -ts_arkimex_type 2e - set arkimex type to 2e
1599bd3e852SBarry Smith 
160b330ce4dSSatish Balay     Level: advanced
161b330ce4dSSatish Balay 
1621cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
16364f491ddSJed Brown M*/
164d27334e2SStefano Zampini 
16564f491ddSJed Brown /*MC
1666cf0794eSJed Brown      TSARKIMEXPRSSP2 - Second order SSP ARK IMEX scheme.
1676cf0794eSJed Brown 
1686cf0794eSJed Brown      This method has three implicit stages.
1696cf0794eSJed Brown 
1706cf0794eSJed Brown      References:
171606c0280SSatish Balay .    * - L. Pareschi, G. Russo, Implicit Explicit Runge Kutta schemes and applications to hyperbolic systems with relaxations. Journal of Scientific Computing Volume: 25, Issue: 1, October, 2005.
1726cf0794eSJed Brown 
173a8d69d7bSBarry Smith      This method is referred to as SSP2-(3,3,2) in https://arxiv.org/abs/1110.4375
1746cf0794eSJed Brown 
175bcf0153eSBarry Smith      Options Database Key:
17667b8a455SSatish Balay .      -ts_arkimex_type prssp2 - set arkimex type to prssp2
1779bd3e852SBarry Smith 
1786cf0794eSJed Brown      Level: advanced
1796cf0794eSJed Brown 
1801cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
1816cf0794eSJed Brown M*/
182d27334e2SStefano Zampini 
1836cf0794eSJed Brown /*MC
18464f491ddSJed Brown      TSARKIMEX3 - Third order ARK IMEX scheme with L-stable implicit part.
18564f491ddSJed Brown 
18664f491ddSJed Brown      This method has one explicit stage and three implicit stages.
18764f491ddSJed Brown 
188bcf0153eSBarry Smith      Options Database Key:
18967b8a455SSatish Balay .      -ts_arkimex_type 3 - set arkimex type to 3
1909bd3e852SBarry Smith 
191bcf0153eSBarry Smith      Level: advanced
192bcf0153eSBarry Smith 
19364f491ddSJed Brown      References:
194606c0280SSatish Balay .    * - Kennedy and Carpenter 2003.
19564f491ddSJed Brown 
1961cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
19764f491ddSJed Brown M*/
198d27334e2SStefano Zampini 
19964f491ddSJed Brown /*MC
2006cf0794eSJed Brown      TSARKIMEXARS443 - Third order ARK IMEX scheme.
2016cf0794eSJed Brown 
2026cf0794eSJed Brown      This method has one explicit stage and four implicit stages.
2036cf0794eSJed Brown 
204bcf0153eSBarry Smith      Options Database Key:
20567b8a455SSatish Balay .      -ts_arkimex_type ars443 - set arkimex type to ars443
2069bd3e852SBarry Smith 
207bcf0153eSBarry Smith      Level: advanced
208bcf0153eSBarry Smith 
2096cf0794eSJed Brown      References:
210606c0280SSatish Balay +    * - U. Ascher, S. Ruuth, R. J. Spiteri, Implicit explicit Runge Kutta methods for time dependent Partial Differential Equations. Appl. Numer. Math. 25, (1997).
211606c0280SSatish Balay -    * - This method is referred to as ARS(4,4,3) in https://arxiv.org/abs/1110.4375
2126cf0794eSJed Brown 
2131cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
2146cf0794eSJed Brown M*/
215d27334e2SStefano Zampini 
2166cf0794eSJed Brown /*MC
2176cf0794eSJed Brown      TSARKIMEXBPR3 - Third order ARK IMEX scheme.
2186cf0794eSJed Brown 
2196cf0794eSJed Brown      This method has one explicit stage and four implicit stages.
2206cf0794eSJed Brown 
221bcf0153eSBarry Smith      Options Database Key:
22267b8a455SSatish Balay .      -ts_arkimex_type bpr3 - set arkimex type to bpr3
2239bd3e852SBarry Smith 
224bcf0153eSBarry Smith      Level: advanced
225bcf0153eSBarry Smith 
2266cf0794eSJed Brown      References:
227606c0280SSatish Balay .    * - This method is referred to as ARK3 in https://arxiv.org/abs/1110.4375
2286cf0794eSJed Brown 
2291cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
2306cf0794eSJed Brown M*/
231d27334e2SStefano Zampini 
2326cf0794eSJed Brown /*MC
23364f491ddSJed Brown      TSARKIMEX4 - Fourth order ARK IMEX scheme with L-stable implicit part.
23464f491ddSJed Brown 
23564f491ddSJed Brown      This method has one explicit stage and four implicit stages.
23664f491ddSJed Brown 
237bcf0153eSBarry Smith      Options Database Key:
23867b8a455SSatish Balay .      -ts_arkimex_type 4 - set arkimex type to4
2399bd3e852SBarry Smith 
240bcf0153eSBarry Smith      Level: advanced
241bcf0153eSBarry Smith 
24264f491ddSJed Brown      References:
243606c0280SSatish Balay .    * - Kennedy and Carpenter 2003.
24464f491ddSJed Brown 
2451cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
24664f491ddSJed Brown M*/
247d27334e2SStefano Zampini 
24864f491ddSJed Brown /*MC
24964f491ddSJed Brown      TSARKIMEX5 - Fifth order ARK IMEX scheme with L-stable implicit part.
25064f491ddSJed Brown 
25164f491ddSJed Brown      This method has one explicit stage and five implicit stages.
25264f491ddSJed Brown 
253bcf0153eSBarry Smith      Options Database Key:
25467b8a455SSatish Balay .      -ts_arkimex_type 5 - set arkimex type to 5
2559bd3e852SBarry Smith 
256bcf0153eSBarry Smith      Level: advanced
257bcf0153eSBarry Smith 
25864f491ddSJed Brown      References:
259606c0280SSatish Balay .    * - Kennedy and Carpenter 2003.
26064f491ddSJed Brown 
2611cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()`
26264f491ddSJed Brown M*/
26364f491ddSJed Brown 
264*3405e92cSStefano Zampini /*MC
265*3405e92cSStefano Zampini      TSDIRKS212 - Second order DIRK scheme.
266*3405e92cSStefano Zampini 
267*3405e92cSStefano Zampini      This method has two implicit stages with an embedded method of other 1.
268*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
269*3405e92cSStefano Zampini 
270*3405e92cSStefano Zampini      Options Database Key:
271*3405e92cSStefano Zampini .      -ts_dirk_type s212 - select this method.
272*3405e92cSStefano Zampini 
273*3405e92cSStefano Zampini      Level: advanced
274*3405e92cSStefano Zampini 
275*3405e92cSStefano Zampini      Note:
276*3405e92cSStefano Zampini      This is the default DIRK scheme in SUNDIALS.
277*3405e92cSStefano Zampini 
278*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
279*3405e92cSStefano Zampini M*/
280*3405e92cSStefano Zampini 
281*3405e92cSStefano Zampini /*MC
282*3405e92cSStefano Zampini      TSDIRKES122SAL - First order DIRK scheme.
283*3405e92cSStefano Zampini 
284*3405e92cSStefano Zampini      Uses backward Euler as advancing method and trapezoidal rule as embedded method. See `TSDIRK` for additional details.
285*3405e92cSStefano Zampini 
286*3405e92cSStefano Zampini      Options Database Key:
287*3405e92cSStefano Zampini .      -ts_dirk_type es122sal - select this method.
288*3405e92cSStefano Zampini 
289*3405e92cSStefano Zampini      Level: advanced
290*3405e92cSStefano Zampini 
291*3405e92cSStefano Zampini      References:
292*3405e92cSStefano Zampini .    * - https://arxiv.org/abs/1803.01613
293*3405e92cSStefano Zampini 
294*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
295*3405e92cSStefano Zampini M*/
296*3405e92cSStefano Zampini 
297*3405e92cSStefano Zampini /*MC
298*3405e92cSStefano Zampini      TSDIRKES213SAL - Second order DIRK scheme.
299*3405e92cSStefano Zampini 
300*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
301*3405e92cSStefano Zampini 
302*3405e92cSStefano Zampini      Options Database Key:
303*3405e92cSStefano Zampini .      -ts_dirk_type es213sal - select this method.
304*3405e92cSStefano Zampini 
305*3405e92cSStefano Zampini      Level: advanced
306*3405e92cSStefano Zampini 
307*3405e92cSStefano Zampini      Note:
308*3405e92cSStefano Zampini      This is the default DIRK scheme used in PETSc.
309*3405e92cSStefano Zampini 
310*3405e92cSStefano Zampini      References:
311*3405e92cSStefano Zampini +    * - Kennedy and Carpenter, Diagonally Implicit Runge-Kutta methods for stiff ODEs (2016), https://ntrs.nasa.gov/api/citations/20160005923/downloads/20160005923.pdf
312*3405e92cSStefano Zampini -    * - This method is also known as TR-BDF2, see M.E. Hosea and L.F. Shampine, Analysis and implementation of TR-BDF2, Appl. Numer. Math., 20(1) (1996) 21-37.
313*3405e92cSStefano Zampini 
314*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
315*3405e92cSStefano Zampini M*/
316*3405e92cSStefano Zampini 
317*3405e92cSStefano Zampini /*MC
318*3405e92cSStefano Zampini      TSDIRKES324SAL - Third order DIRK scheme.
319*3405e92cSStefano Zampini 
320*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
321*3405e92cSStefano Zampini 
322*3405e92cSStefano Zampini      Options Database Key:
323*3405e92cSStefano Zampini .      -ts_dirk_type es324sal - select this method.
324*3405e92cSStefano Zampini 
325*3405e92cSStefano Zampini      Level: advanced
326*3405e92cSStefano Zampini 
327*3405e92cSStefano Zampini      References:
328*3405e92cSStefano Zampini .    * - Kennedy and Carpenter, Diagonally Implicit Runge-Kutta methods for stiff ODEs (2016), https://ntrs.nasa.gov/api/citations/20160005923/downloads/20160005923.pdf
329*3405e92cSStefano Zampini 
330*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
331*3405e92cSStefano Zampini M*/
332*3405e92cSStefano Zampini 
333*3405e92cSStefano Zampini /*MC
334*3405e92cSStefano Zampini      TSDIRKES325SAL - Third order DIRK scheme.
335*3405e92cSStefano Zampini 
336*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
337*3405e92cSStefano Zampini 
338*3405e92cSStefano Zampini      Options Database Key:
339*3405e92cSStefano Zampini .      -ts_dirk_type es325sal - select this method.
340*3405e92cSStefano Zampini 
341*3405e92cSStefano Zampini      Level: advanced
342*3405e92cSStefano Zampini 
343*3405e92cSStefano Zampini      References:
344*3405e92cSStefano Zampini .    * - Kennedy and Carpenter, Diagonally Implicit Runge-Kutta methods for stiff ODEs (2016), https://ntrs.nasa.gov/api/citations/20160005923/downloads/20160005923.pdf
345*3405e92cSStefano Zampini 
346*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
347*3405e92cSStefano Zampini M*/
348*3405e92cSStefano Zampini 
349*3405e92cSStefano Zampini /*MC
350*3405e92cSStefano Zampini      TSDIRK657A - Sixth order DIRK scheme.
351*3405e92cSStefano Zampini 
352*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
353*3405e92cSStefano Zampini 
354*3405e92cSStefano Zampini      Options Database Key:
355*3405e92cSStefano Zampini .      -ts_dirk_type 657a - select this method.
356*3405e92cSStefano Zampini 
357*3405e92cSStefano Zampini      Level: advanced
358*3405e92cSStefano Zampini 
359*3405e92cSStefano Zampini      References:
360*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
361*3405e92cSStefano Zampini 
362*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
363*3405e92cSStefano Zampini M*/
364*3405e92cSStefano Zampini 
365*3405e92cSStefano Zampini /*MC
366*3405e92cSStefano Zampini      TSDIRKES648SA - Sixth order DIRK scheme.
367*3405e92cSStefano Zampini 
368*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
369*3405e92cSStefano Zampini 
370*3405e92cSStefano Zampini      Options Database Key:
371*3405e92cSStefano Zampini .      -ts_dirk_type es648sa - select this method.
372*3405e92cSStefano Zampini 
373*3405e92cSStefano Zampini      Level: advanced
374*3405e92cSStefano Zampini 
375*3405e92cSStefano Zampini      References:
376*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
377*3405e92cSStefano Zampini 
378*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
379*3405e92cSStefano Zampini M*/
380*3405e92cSStefano Zampini 
381*3405e92cSStefano Zampini /*MC
382*3405e92cSStefano Zampini      TSDIRK658A - Sixth order DIRK scheme.
383*3405e92cSStefano Zampini 
384*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
385*3405e92cSStefano Zampini 
386*3405e92cSStefano Zampini      Options Database Key:
387*3405e92cSStefano Zampini .      -ts_dirk_type 658a - select this method.
388*3405e92cSStefano Zampini 
389*3405e92cSStefano Zampini      Level: advanced
390*3405e92cSStefano Zampini 
391*3405e92cSStefano Zampini      References:
392*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
393*3405e92cSStefano Zampini 
394*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
395*3405e92cSStefano Zampini M*/
396*3405e92cSStefano Zampini 
397*3405e92cSStefano Zampini /*MC
398*3405e92cSStefano Zampini      TSDIRKS659A - Sixth order DIRK scheme.
399*3405e92cSStefano Zampini 
400*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
401*3405e92cSStefano Zampini 
402*3405e92cSStefano Zampini      Options Database Key:
403*3405e92cSStefano Zampini .      -ts_dirk_type s659a - select this method.
404*3405e92cSStefano Zampini 
405*3405e92cSStefano Zampini      Level: advanced
406*3405e92cSStefano Zampini 
407*3405e92cSStefano Zampini      References:
408*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
409*3405e92cSStefano Zampini 
410*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
411*3405e92cSStefano Zampini M*/
412*3405e92cSStefano Zampini 
413*3405e92cSStefano Zampini /*MC
414*3405e92cSStefano Zampini      TSDIRK7510SAL - Seventh order DIRK scheme.
415*3405e92cSStefano Zampini 
416*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
417*3405e92cSStefano Zampini 
418*3405e92cSStefano Zampini      Options Database Key:
419*3405e92cSStefano Zampini .      -ts_dirk_type 7510sal - select this method.
420*3405e92cSStefano Zampini 
421*3405e92cSStefano Zampini      Level: advanced
422*3405e92cSStefano Zampini 
423*3405e92cSStefano Zampini      References:
424*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
425*3405e92cSStefano Zampini 
426*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
427*3405e92cSStefano Zampini M*/
428*3405e92cSStefano Zampini 
429*3405e92cSStefano Zampini /*MC
430*3405e92cSStefano Zampini      TSDIRKES7510SA - Seventh order DIRK scheme.
431*3405e92cSStefano Zampini 
432*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
433*3405e92cSStefano Zampini 
434*3405e92cSStefano Zampini      Options Database Key:
435*3405e92cSStefano Zampini .      -ts_dirk_type es7510sa - select this method.
436*3405e92cSStefano Zampini 
437*3405e92cSStefano Zampini      Level: advanced
438*3405e92cSStefano Zampini 
439*3405e92cSStefano Zampini      References:
440*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
441*3405e92cSStefano Zampini 
442*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
443*3405e92cSStefano Zampini M*/
444*3405e92cSStefano Zampini 
445*3405e92cSStefano Zampini /*MC
446*3405e92cSStefano Zampini      TSDIRK759A - Seventh order DIRK scheme.
447*3405e92cSStefano Zampini 
448*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
449*3405e92cSStefano Zampini 
450*3405e92cSStefano Zampini      Options Database Key:
451*3405e92cSStefano Zampini .      -ts_dirk_type 759a - select this method.
452*3405e92cSStefano Zampini 
453*3405e92cSStefano Zampini      Level: advanced
454*3405e92cSStefano Zampini 
455*3405e92cSStefano Zampini      References:
456*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
457*3405e92cSStefano Zampini 
458*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
459*3405e92cSStefano Zampini M*/
460*3405e92cSStefano Zampini 
461*3405e92cSStefano Zampini /*MC
462*3405e92cSStefano Zampini      TSDIRKS7511SAL - Seventh order DIRK scheme.
463*3405e92cSStefano Zampini 
464*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
465*3405e92cSStefano Zampini 
466*3405e92cSStefano Zampini      Options Database Key:
467*3405e92cSStefano Zampini .      -ts_dirk_type s7511sal - select this method.
468*3405e92cSStefano Zampini 
469*3405e92cSStefano Zampini      Level: advanced
470*3405e92cSStefano Zampini 
471*3405e92cSStefano Zampini      References:
472*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
473*3405e92cSStefano Zampini 
474*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
475*3405e92cSStefano Zampini M*/
476*3405e92cSStefano Zampini 
477*3405e92cSStefano Zampini /*MC
478*3405e92cSStefano Zampini      TSDIRK8614A - Eighth order DIRK scheme.
479*3405e92cSStefano Zampini 
480*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
481*3405e92cSStefano Zampini 
482*3405e92cSStefano Zampini      Options Database Key:
483*3405e92cSStefano Zampini .      -ts_dirk_type 8614a - select this method.
484*3405e92cSStefano Zampini 
485*3405e92cSStefano Zampini      Level: advanced
486*3405e92cSStefano Zampini 
487*3405e92cSStefano Zampini      References:
488*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
489*3405e92cSStefano Zampini 
490*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
491*3405e92cSStefano Zampini M*/
492*3405e92cSStefano Zampini 
493*3405e92cSStefano Zampini /*MC
494*3405e92cSStefano Zampini      TSDIRK8616SAL - Eighth order DIRK scheme.
495*3405e92cSStefano Zampini 
496*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
497*3405e92cSStefano Zampini 
498*3405e92cSStefano Zampini      Options Database Key:
499*3405e92cSStefano Zampini .      -ts_dirk_type 8616sal - select this method.
500*3405e92cSStefano Zampini 
501*3405e92cSStefano Zampini      Level: advanced
502*3405e92cSStefano Zampini 
503*3405e92cSStefano Zampini      References:
504*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
505*3405e92cSStefano Zampini 
506*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
507*3405e92cSStefano Zampini M*/
508*3405e92cSStefano Zampini 
509*3405e92cSStefano Zampini /*MC
510*3405e92cSStefano Zampini      TSDIRKES8516SAL - Eighth order DIRK scheme.
511*3405e92cSStefano Zampini 
512*3405e92cSStefano Zampini      See `TSDIRK` for additional details.
513*3405e92cSStefano Zampini 
514*3405e92cSStefano Zampini      Options Database Key:
515*3405e92cSStefano Zampini .      -ts_dirk_type es8516sal - select this method.
516*3405e92cSStefano Zampini 
517*3405e92cSStefano Zampini      Level: advanced
518*3405e92cSStefano Zampini 
519*3405e92cSStefano Zampini      References:
520*3405e92cSStefano Zampini .    * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
521*3405e92cSStefano Zampini 
522*3405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()`
523*3405e92cSStefano Zampini M*/
524*3405e92cSStefano Zampini 
525d27334e2SStefano Zampini static PetscErrorCode TSHasRHSFunction(TS ts, PetscBool *has)
526d27334e2SStefano Zampini {
527d27334e2SStefano Zampini   TSRHSFunction func;
528d27334e2SStefano Zampini 
529d27334e2SStefano Zampini   PetscFunctionBegin;
530d27334e2SStefano Zampini   *has = PETSC_FALSE;
531d27334e2SStefano Zampini   PetscCall(DMTSGetRHSFunction(ts->dm, &func, NULL));
532d27334e2SStefano Zampini   if (func) *has = PETSC_TRUE;
533d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
534d27334e2SStefano Zampini }
535d27334e2SStefano Zampini 
5368a381b04SJed Brown /*@C
537bcf0153eSBarry Smith   TSARKIMEXRegisterAll - Registers all of the additive Runge-Kutta implicit-explicit methods in `TSARKIMEX`
5388a381b04SJed Brown 
539fca742c7SJed Brown   Not Collective, but should be called by all processes which will need the schemes to be registered
5408a381b04SJed Brown 
5418a381b04SJed Brown   Level: advanced
5428a381b04SJed Brown 
5431cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSARKIMEX`, `TSARKIMEXRegisterDestroy()`
5448a381b04SJed Brown @*/
545d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterAll(void)
546d71ae5a4SJacob Faibussowitsch {
5478a381b04SJed Brown   PetscFunctionBegin;
5483ba16761SJacob Faibussowitsch   if (TSARKIMEXRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
5498a381b04SJed Brown   TSARKIMEXRegisterAllCalled = PETSC_TRUE;
550e817cc15SEmil Constantinescu 
551d27334e2SStefano Zampini #define RC  PetscRealConstant
552d27334e2SStefano Zampini #define s2  RC(1.414213562373095048802)  /* PetscSqrtReal((PetscReal)2.0) */
553d27334e2SStefano Zampini #define us2 RC(0.2928932188134524755992) /* 1.0-1.0/PetscSqrtReal((PetscReal)2.0); */
554d27334e2SStefano Zampini 
555d27334e2SStefano Zampini   /* Diagonally implicit methods */
556e817cc15SEmil Constantinescu   {
557d27334e2SStefano Zampini     /* DIRK212, default of SUNDIALS */
558d27334e2SStefano Zampini     const PetscReal A[2][2] = {
559d27334e2SStefano Zampini       {RC(1.0),  RC(0.0)},
560d27334e2SStefano Zampini       {RC(-1.0), RC(1.0)}
561d27334e2SStefano Zampini     };
562d27334e2SStefano Zampini     const PetscReal b[2]      = {RC(0.5), RC(0.5)};
563d27334e2SStefano Zampini     const PetscReal bembed[2] = {RC(1.0), RC(0.0)};
564d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKS212, 2, 2, &A[0][0], b, NULL, bembed, 1, b));
565d27334e2SStefano Zampini   }
566d27334e2SStefano Zampini 
5679371c9d4SSatish Balay   {
568d27334e2SStefano Zampini     /* ESDIRK12 from https://arxiv.org/pdf/1803.01613.pdf */
569d27334e2SStefano Zampini     const PetscReal A[2][2] = {
570d27334e2SStefano Zampini       {RC(0.0), RC(0.0)},
571d27334e2SStefano Zampini       {RC(0.0), RC(1.0)}
572d27334e2SStefano Zampini     };
573d27334e2SStefano Zampini     const PetscReal b[2]      = {RC(0.0), RC(1.0)};
574d27334e2SStefano Zampini     const PetscReal bembed[2] = {RC(0.5), RC(0.5)};
575*3405e92cSStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES122SAL, 1, 2, &A[0][0], b, NULL, bembed, 1, b));
576d27334e2SStefano Zampini   }
577d27334e2SStefano Zampini 
578d27334e2SStefano Zampini   {
579d27334e2SStefano Zampini     /* ESDIRK213L[2]SA from KC16.
580*3405e92cSStefano Zampini        TR-BDF2 from Hosea and Shampine
581*3405e92cSStefano Zampini        ESDIRK23 in https://arxiv.org/pdf/1803.01613.pdf */
582d27334e2SStefano Zampini     const PetscReal A[3][3] = {
583d27334e2SStefano Zampini       {RC(0.0),      RC(0.0),      RC(0.0)},
584d27334e2SStefano Zampini       {us2,          us2,          RC(0.0)},
585d27334e2SStefano Zampini       {s2 / RC(4.0), s2 / RC(4.0), us2    },
586d27334e2SStefano Zampini     };
587d27334e2SStefano Zampini     const PetscReal b[3]      = {s2 / RC(4.0), s2 / RC(4.0), us2};
588d27334e2SStefano 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)};
589d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES213SAL, 2, 3, &A[0][0], b, NULL, bembed, 1, b));
590d27334e2SStefano Zampini   }
591d27334e2SStefano Zampini 
592d27334e2SStefano Zampini   {
593d27334e2SStefano Zampini #define g   RC(0.43586652150845899941601945)
594d27334e2SStefano Zampini #define g2  PetscSqr(g)
595d27334e2SStefano Zampini #define g3  g *g2
596d27334e2SStefano Zampini #define g4  PetscSqr(g2)
597d27334e2SStefano Zampini #define g5  g *g4
598d27334e2SStefano Zampini #define c3  RC(1.0)
599d27334e2SStefano Zampini #define a32 c3 *(c3 - RC(2.0) * g) / (RC(4.0) * g)
600d27334e2SStefano 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))
601d27334e2SStefano Zampini #define b3  (RC(1.0) - RC(6.0) * g + RC(6.0) * g2) / (RC(3.0) * c3 * (c3 - RC(2.0) * g))
602d27334e2SStefano Zampini #if 0
603d27334e2SStefano Zampini /* This is for c3 = 3/5 */
604d27334e2SStefano Zampini   #define bh2 \
605d27334e2SStefano 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))
606d27334e2SStefano 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))
607d27334e2SStefano 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)
608d27334e2SStefano Zampini #else
609d27334e2SStefano Zampini   /* This is for c3 = 1.0 */
610d27334e2SStefano Zampini   #define bh2 a32
611d27334e2SStefano Zampini   #define bh3 g
612d27334e2SStefano Zampini   #define bh4 RC(0.0)
613d27334e2SStefano Zampini #endif
614d27334e2SStefano Zampini     /* ESDIRK3(2I)4L[2]SA from KC16 with c3 = 1.0 */
615d27334e2SStefano Zampini     /* Given by Kvaerno https://link.springer.com/article/10.1023/b:bitn.0000046811.70614.38 */
616d27334e2SStefano Zampini     const PetscReal A[4][4] = {
617d27334e2SStefano Zampini       {RC(0.0),               RC(0.0), RC(0.0), RC(0.0)},
618d27334e2SStefano Zampini       {g,                     g,       RC(0.0), RC(0.0)},
619d27334e2SStefano Zampini       {c3 - a32 - g,          a32,     g,       RC(0.0)},
620d27334e2SStefano Zampini       {RC(1.0) - b2 - b3 - g, b2,      b3,      g      },
621d27334e2SStefano Zampini     };
622d27334e2SStefano Zampini     const PetscReal b[4]      = {RC(1.0) - b2 - b3 - g, b2, b3, g};
623d27334e2SStefano Zampini     const PetscReal bembed[4] = {RC(1.0) - bh2 - bh3 - bh4, bh2, bh3, bh4};
624d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES324SAL, 3, 4, &A[0][0], b, NULL, bembed, 1, b));
625d27334e2SStefano Zampini #undef g
626d27334e2SStefano Zampini #undef g2
627d27334e2SStefano Zampini #undef g3
628d27334e2SStefano Zampini #undef c3
629d27334e2SStefano Zampini #undef a32
630d27334e2SStefano Zampini #undef b2
631d27334e2SStefano Zampini #undef b3
632d27334e2SStefano Zampini #undef bh2
633d27334e2SStefano Zampini #undef bh3
634d27334e2SStefano Zampini #undef bh4
635d27334e2SStefano Zampini   }
636d27334e2SStefano Zampini 
637d27334e2SStefano Zampini   {
638d27334e2SStefano Zampini     /* ESDIRK3(2I)5L[2]SA from KC16 */
639d27334e2SStefano Zampini     const PetscReal A[5][5] = {
640d27334e2SStefano Zampini       {RC(0.0),                  RC(0.0),                  RC(0.0),                 RC(0.0),                   RC(0.0)           },
641d27334e2SStefano Zampini       {RC(9.0) / RC(40.0),       RC(9.0) / RC(40.0),       RC(0.0),                 RC(0.0),                   RC(0.0)           },
642d27334e2SStefano 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)           },
643d27334e2SStefano 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)           },
644d27334e2SStefano 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)},
645d27334e2SStefano Zampini     };
646d27334e2SStefano 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)};
647d27334e2SStefano 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)};
648d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES325SAL, 3, 5, &A[0][0], b, NULL, bembed, 1, b));
649d27334e2SStefano Zampini   }
650d27334e2SStefano Zampini 
651d27334e2SStefano Zampini   {
652d27334e2SStefano Zampini     // DIRK(6,6)[1]A[(7,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
653d27334e2SStefano Zampini     const PetscReal A[7][7] = {
654d27334e2SStefano Zampini       {RC(0.303487844706747),    RC(0.0),                RC(0.0),                   RC(0.0),                   RC(0.0),                 RC(0.0),                RC(0.0)              },
655d27334e2SStefano Zampini       {RC(-0.279756492709814),   RC(0.500032236020747),  RC(0.0),                   RC(0.0),                   RC(0.0),                 RC(0.0),                RC(0.0)              },
656d27334e2SStefano Zampini       {RC(0.280583215743895),    RC(-0.438560061586751), RC(0.217250734515736),     RC(0.0),                   RC(0.0),                 RC(0.0),                RC(0.0)              },
657d27334e2SStefano Zampini       {RC(-0.0677678738539846),  RC(0.984312781232293),  RC(-0.266720192540149),    RC(0.2476680834526),       RC(0.0),                 RC(0.0),                RC(0.0)              },
658d27334e2SStefano Zampini       {RC(0.125671616147993),    RC(-0.995401751002415), RC(0.761333109549059),     RC(-0.210281837202208),    RC(0.866743712636936),   RC(0.0),                RC(0.0)              },
659d27334e2SStefano Zampini       {RC(-0.368056238801488),   RC(-0.999928082701516), RC(0.534734253232519),     RC(-0.174856916279082),    RC(0.615007160285509),   RC(0.696549912132029),  RC(0.0)              },
660d27334e2SStefano Zampini       {RC(-0.00570546839653984), RC(-0.113110431835656), RC(-0.000965563207671587), RC(-0.000130490084629567), RC(0.00111737736895673), RC(-0.279385587378871), RC(0.618455906845342)}
661d27334e2SStefano Zampini     };
662d27334e2SStefano 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)};
663d27334e2SStefano 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)};
664d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK657A, 6, 7, &A[0][0], b, NULL, bembed, 1, b));
665d27334e2SStefano Zampini   }
666d27334e2SStefano Zampini   {
667d27334e2SStefano Zampini     // ESDIRK(8,6)[2]SA[(8,4)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
668d27334e2SStefano Zampini     const PetscReal A[8][8] = {
669d27334e2SStefano Zampini       {RC(0.0),                RC(0.0),                 RC(0.0),                 RC(0.0),               RC(0.0),                RC(0.0),                RC(0.0),               RC(0.0)              },
670d27334e2SStefano 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)              },
671d27334e2SStefano 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)              },
672d27334e2SStefano 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)              },
673d27334e2SStefano 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)              },
674d27334e2SStefano 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)              },
675d27334e2SStefano 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)              },
676d27334e2SStefano 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)}
677d27334e2SStefano Zampini     };
678d27334e2SStefano 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)};
679d27334e2SStefano 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)};
680d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES648SA, 6, 8, &A[0][0], b, NULL, bembed, 1, b));
681d27334e2SStefano Zampini   }
682d27334e2SStefano Zampini   {
683d27334e2SStefano Zampini     // DIRK(8,6)[1]SAL[(8,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
684d27334e2SStefano Zampini     const PetscReal A[8][8] = {
685d27334e2SStefano 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)              },
686d27334e2SStefano 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)              },
687d27334e2SStefano 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)              },
688d27334e2SStefano 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)              },
689d27334e2SStefano 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)              },
690d27334e2SStefano 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)              },
691d27334e2SStefano 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)              },
692d27334e2SStefano 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)}
693d27334e2SStefano Zampini     };
694d27334e2SStefano 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)};
695d27334e2SStefano 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)};
696d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK658A, 6, 8, &A[0][0], b, NULL, bembed, 1, b));
697d27334e2SStefano Zampini   }
698d27334e2SStefano Zampini   {
699d27334e2SStefano Zampini     // SDIRK(9,6)[1]SAL[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
700d27334e2SStefano Zampini     const PetscReal A[9][9] = {
701d27334e2SStefano 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)              },
702d27334e2SStefano 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)              },
703d27334e2SStefano 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)              },
704d27334e2SStefano 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)              },
705d27334e2SStefano 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)              },
706d27334e2SStefano 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)              },
707d27334e2SStefano 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)              },
708d27334e2SStefano 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)              },
709d27334e2SStefano 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)}
710d27334e2SStefano Zampini     };
711d27334e2SStefano 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)};
712d27334e2SStefano 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)};
713d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKS659A, 6, 9, &A[0][0], b, NULL, bembed, 1, b));
714d27334e2SStefano Zampini   }
715d27334e2SStefano Zampini   {
716d27334e2SStefano Zampini     // DIRK(10,7)[1]SAL[(10,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
717d27334e2SStefano Zampini     const PetscReal A[10][10] = {
718d27334e2SStefano 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)              },
719d27334e2SStefano 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)              },
720d27334e2SStefano 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)              },
721d27334e2SStefano 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)              },
722d27334e2SStefano 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)              },
723d27334e2SStefano 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)              },
724d27334e2SStefano 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)              },
725d27334e2SStefano 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)              },
726d27334e2SStefano 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)              },
727d27334e2SStefano 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)}
728d27334e2SStefano Zampini     };
729d27334e2SStefano 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)};
730d27334e2SStefano Zampini     const PetscReal bembed[10] =
731d27334e2SStefano 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)};
732d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK7510SAL, 7, 10, &A[0][0], b, NULL, bembed, 1, b));
733d27334e2SStefano Zampini   }
734d27334e2SStefano Zampini   {
735d27334e2SStefano Zampini     // ESDIRK(10,7)[2]SA[(10,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
736d27334e2SStefano Zampini     const PetscReal A[10][10] = {
737d27334e2SStefano 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)              },
738d27334e2SStefano 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)              },
739d27334e2SStefano 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)              },
740d27334e2SStefano 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)              },
741d27334e2SStefano 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)              },
742d27334e2SStefano 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)              },
743d27334e2SStefano 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)              },
744d27334e2SStefano 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)              },
745d27334e2SStefano 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)              },
746d27334e2SStefano 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)}
747d27334e2SStefano Zampini     };
748d27334e2SStefano Zampini     const PetscReal b[10]      = {RC(0.0705997961586714),   RC(-0.0281516061956374), RC(0.314600470734633),   RC(-0.0907057557963371), RC(0.168078953957742),
749d27334e2SStefano Zampini                                   RC(-0.00655694984590575), RC(0.0505384497804303),  RC(-0.0569572058725042), RC(0.368498056875488),   RC(0.210055790203419)};
750d27334e2SStefano Zampini     const PetscReal bembed[10] = {RC(-0.015494246543626), RC(0.167657963820093), RC(0.269858958144236),  RC(-0.0443258997755156), RC(0.150049236875266),
751d27334e2SStefano Zampini                                   RC(0.259452082755846),  RC(0.244624573502521), RC(-0.215528446920284), RC(0.0487601760292619),  RC(0.134945602112201)};
752d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES7510SA, 7, 10, &A[0][0], b, NULL, bembed, 1, b));
753d27334e2SStefano Zampini   }
754d27334e2SStefano Zampini   {
755d27334e2SStefano Zampini     // DIRK(9,7)[1]A[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
756d27334e2SStefano Zampini     const PetscReal A[9][9] = {
757d27334e2SStefano 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)               },
758d27334e2SStefano 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)               },
759d27334e2SStefano 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)               },
760d27334e2SStefano 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)               },
761d27334e2SStefano 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)               },
762d27334e2SStefano 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)               },
763d27334e2SStefano 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)               },
764d27334e2SStefano 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)               },
765d27334e2SStefano 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)}
766d27334e2SStefano Zampini     };
767d27334e2SStefano Zampini 
768d27334e2SStefano 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)};
769d27334e2SStefano 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)};
770d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK759A, 7, 9, &A[0][0], b, NULL, bembed, 1, b));
771d27334e2SStefano Zampini   }
772d27334e2SStefano Zampini   {
773d27334e2SStefano Zampini     // SDIRK(11,7)[1]SAL[(11,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
774d27334e2SStefano Zampini     const PetscReal A[11][11] = {
775d27334e2SStefano 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)              },
776d27334e2SStefano 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)              },
777d27334e2SStefano 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)              },
778d27334e2SStefano 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)              },
779d27334e2SStefano 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)              },
780d27334e2SStefano 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)              },
781d27334e2SStefano 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)              },
782d27334e2SStefano 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)              },
783d27334e2SStefano 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)              },
784d27334e2SStefano 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)              },
785d27334e2SStefano 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)}
786d27334e2SStefano Zampini     };
787d27334e2SStefano Zampini     const PetscReal b[11] =
788d27334e2SStefano 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)};
789d27334e2SStefano Zampini     const PetscReal bembed[11] =
790d27334e2SStefano 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)};
791d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKS7511SAL, 7, 11, &A[0][0], b, NULL, bembed, 1, b));
792d27334e2SStefano Zampini   }
793d27334e2SStefano Zampini   {
794d27334e2SStefano Zampini     // DIRK(13,8)[1]A[(14,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
795d27334e2SStefano Zampini     const PetscReal A[14][14] = {
796d27334e2SStefano 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)               },
797d27334e2SStefano 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)               },
798d27334e2SStefano 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)               },
799d27334e2SStefano 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)               },
800d27334e2SStefano 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)               },
801d27334e2SStefano 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)               },
802d27334e2SStefano 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)               },
803d27334e2SStefano 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)               },
804d27334e2SStefano 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)               },
805d27334e2SStefano 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)               },
806d27334e2SStefano 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)               },
807d27334e2SStefano 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)               },
808d27334e2SStefano 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)               },
809d27334e2SStefano 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)}
810d27334e2SStefano Zampini     };
811d27334e2SStefano 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)};
812d27334e2SStefano 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),
813d27334e2SStefano Zampini                                   RC(0.0417664613347638),   RC(0.223636394275293), RC(0.231569156867596), RC(0.240526201277663),   RC(-0.222933582911926),  RC(-0.0111479879597561), RC(0.19915314335888)};
814d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK8614A, 8, 14, &A[0][0], b, NULL, bembed, 1, b));
815d27334e2SStefano Zampini   }
816d27334e2SStefano Zampini   {
817d27334e2SStefano Zampini     // DIRK(15,8)[1]SAL[(16,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
818d27334e2SStefano Zampini     const PetscReal A[16][16] = {
819d27334e2SStefano 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)              },
820d27334e2SStefano 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)              },
821d27334e2SStefano 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)              },
822d27334e2SStefano 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)              },
823d27334e2SStefano 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)              },
824d27334e2SStefano 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)              },
825d27334e2SStefano 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)              },
826d27334e2SStefano 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)              },
827d27334e2SStefano 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)              },
828d27334e2SStefano 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)              },
829d27334e2SStefano 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)              },
830d27334e2SStefano 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)              },
831d27334e2SStefano 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)              },
832d27334e2SStefano 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)              },
833d27334e2SStefano 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)              },
834d27334e2SStefano 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)}
835d27334e2SStefano Zampini     };
836d27334e2SStefano 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)};
837d27334e2SStefano 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),
838d27334e2SStefano 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)};
839d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRK8616SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b));
840d27334e2SStefano Zampini   }
841d27334e2SStefano Zampini   {
842d27334e2SStefano Zampini     // ESDIRK(16,8)[2]SAL[(16,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs
843d27334e2SStefano Zampini     const PetscReal A[16][16] = {
844d27334e2SStefano 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)              },
845d27334e2SStefano 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)              },
846d27334e2SStefano 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)              },
847d27334e2SStefano 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)              },
848d27334e2SStefano 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)              },
849d27334e2SStefano 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)              },
850d27334e2SStefano 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)              },
851d27334e2SStefano 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)              },
852d27334e2SStefano 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)              },
853d27334e2SStefano 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)              },
854d27334e2SStefano 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)              },
855d27334e2SStefano 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)              },
856d27334e2SStefano 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)              },
857d27334e2SStefano 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)              },
858d27334e2SStefano 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)              },
859d27334e2SStefano 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)}
860d27334e2SStefano Zampini     };
861d27334e2SStefano 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),
862d27334e2SStefano 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)};
863d27334e2SStefano 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),
864d27334e2SStefano 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)};
865d27334e2SStefano Zampini     PetscCall(TSDIRKRegister(TSDIRKES8516SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b));
866d27334e2SStefano Zampini   }
867d27334e2SStefano Zampini 
868d27334e2SStefano Zampini   /* Additive methods */
869d27334e2SStefano Zampini   {
870d27334e2SStefano Zampini     const PetscReal A[3][3] = {
871e817cc15SEmil Constantinescu       {0.0, 0.0, 0.0},
8729371c9d4SSatish Balay       {0.0, 0.0, 0.0},
8739371c9d4SSatish Balay       {0.0, 0.5, 0.0}
874d27334e2SStefano Zampini     };
875d27334e2SStefano Zampini     const PetscReal At[3][3] = {
876d27334e2SStefano Zampini       {1.0, 0.0, 0.0},
877d27334e2SStefano Zampini       {0.0, 0.5, 0.0},
878d27334e2SStefano Zampini       {0.0, 0.5, 0.5}
879d27334e2SStefano Zampini     };
880d27334e2SStefano Zampini     const PetscReal b[3]       = {0.0, 0.5, 0.5};
881d27334e2SStefano Zampini     const PetscReal bembedt[3] = {1.0, 0.0, 0.0};
8829566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX1BEE, 2, 3, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL));
883e817cc15SEmil Constantinescu   }
8848a381b04SJed Brown   {
885d27334e2SStefano Zampini     const PetscReal A[2][2] = {
8869371c9d4SSatish Balay       {0.0, 0.0},
8879371c9d4SSatish Balay       {0.5, 0.0}
888d27334e2SStefano Zampini     };
889d27334e2SStefano Zampini     const PetscReal At[2][2] = {
890d27334e2SStefano Zampini       {0.0, 0.0},
891d27334e2SStefano Zampini       {0.0, 0.5}
892d27334e2SStefano Zampini     };
893d27334e2SStefano Zampini     const PetscReal b[2]       = {0.0, 1.0};
894d27334e2SStefano Zampini     const PetscReal bembedt[2] = {0.5, 0.5};
8951f80e275SEmil 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 */
8969566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXARS122, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL));
8971f80e275SEmil Constantinescu   }
8981f80e275SEmil Constantinescu   {
899d27334e2SStefano Zampini     const PetscReal A[2][2] = {
9009371c9d4SSatish Balay       {0.0, 0.0},
9019371c9d4SSatish Balay       {1.0, 0.0}
902d27334e2SStefano Zampini     };
903d27334e2SStefano Zampini     const PetscReal At[2][2] = {
904d27334e2SStefano Zampini       {0.0, 0.0},
905d27334e2SStefano Zampini       {0.5, 0.5}
906d27334e2SStefano Zampini     };
907d27334e2SStefano Zampini     const PetscReal b[2]       = {0.5, 0.5};
908d27334e2SStefano Zampini     const PetscReal bembedt[2] = {0.0, 1.0};
9091f80e275SEmil 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 */
9109566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXA2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL));
9111f80e275SEmil Constantinescu   }
9121f80e275SEmil Constantinescu   {
913d27334e2SStefano Zampini     const PetscReal A[2][2] = {
9149371c9d4SSatish Balay       {0.0, 0.0},
9159371c9d4SSatish Balay       {1.0, 0.0}
916d27334e2SStefano Zampini     };
917d27334e2SStefano Zampini     const PetscReal At[2][2] = {
918d27334e2SStefano Zampini       {us2,             0.0},
919d27334e2SStefano Zampini       {1.0 - 2.0 * us2, us2}
920d27334e2SStefano Zampini     };
921d27334e2SStefano Zampini     const PetscReal b[2]           = {0.5, 0.5};
922d27334e2SStefano Zampini     const PetscReal bembedt[2]     = {0.0, 1.0};
923d27334e2SStefano Zampini     const PetscReal binterpt[2][2] = {
924d27334e2SStefano Zampini       {(us2 - 1.0) / (2.0 * us2 - 1.0),     -1 / (2.0 * (1.0 - 2.0 * us2))},
925d27334e2SStefano Zampini       {1 - (us2 - 1.0) / (2.0 * us2 - 1.0), -1 / (2.0 * (1.0 - 2.0 * us2))}
926d27334e2SStefano Zampini     };
927d27334e2SStefano Zampini     const PetscReal binterp[2][2] = {
928d27334e2SStefano Zampini       {1.0, -0.5},
929d27334e2SStefano Zampini       {0.0, 0.5 }
930d27334e2SStefano Zampini     };
9319566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXL2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 2, binterpt[0], binterp[0]));
9321f80e275SEmil Constantinescu   }
9331f80e275SEmil Constantinescu   {
934d27334e2SStefano Zampini     const PetscReal A[3][3] = {
9359371c9d4SSatish Balay       {0,      0,   0},
936d27334e2SStefano Zampini       {2 - s2, 0,   0},
9379371c9d4SSatish Balay       {0.5,    0.5, 0}
938d27334e2SStefano Zampini     };
939d27334e2SStefano Zampini     const PetscReal At[3][3] = {
940d27334e2SStefano Zampini       {0,            0,            0         },
941d27334e2SStefano Zampini       {1 - 1 / s2,   1 - 1 / s2,   0         },
942d27334e2SStefano Zampini       {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2}
943d27334e2SStefano Zampini     };
944d27334e2SStefano Zampini     const PetscReal bembedt[3]     = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)};
945d27334e2SStefano Zampini     const PetscReal binterpt[3][2] = {
946d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
947d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
948d27334e2SStefano Zampini       {1.0 - s2, 1.0 / s2         }
949d27334e2SStefano Zampini     };
9509566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX2C, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
9511f80e275SEmil Constantinescu   }
9521f80e275SEmil Constantinescu   {
953d27334e2SStefano Zampini     const PetscReal A[3][3] = {
9549371c9d4SSatish Balay       {0,      0,    0},
955d27334e2SStefano Zampini       {2 - s2, 0,    0},
9569371c9d4SSatish Balay       {0.75,   0.25, 0}
957d27334e2SStefano Zampini     };
958d27334e2SStefano Zampini     const PetscReal At[3][3] = {
959d27334e2SStefano Zampini       {0,            0,            0         },
960d27334e2SStefano Zampini       {1 - 1 / s2,   1 - 1 / s2,   0         },
961d27334e2SStefano Zampini       {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2}
962d27334e2SStefano Zampini     };
963d27334e2SStefano Zampini     const PetscReal bembedt[3]     = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)};
964d27334e2SStefano Zampini     const PetscReal binterpt[3][2] = {
965d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
966d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
967d27334e2SStefano Zampini       {1.0 - s2, 1.0 / s2         }
968d27334e2SStefano Zampini     };
9699566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX2D, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
9708a381b04SJed Brown   }
97106db7b1cSJed Brown   { /* Optimal for linear implicit part */
972d27334e2SStefano Zampini     const PetscReal A[3][3] = {
9739371c9d4SSatish Balay       {0,                0,                0},
974d27334e2SStefano Zampini       {2 - s2,           0,                0},
975d27334e2SStefano Zampini       {(3 - 2 * s2) / 6, (3 + 2 * s2) / 6, 0}
976d27334e2SStefano Zampini     };
977d27334e2SStefano Zampini     const PetscReal At[3][3] = {
978d27334e2SStefano Zampini       {0,            0,            0         },
979d27334e2SStefano Zampini       {1 - 1 / s2,   1 - 1 / s2,   0         },
980d27334e2SStefano Zampini       {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2}
981d27334e2SStefano Zampini     };
982d27334e2SStefano Zampini     const PetscReal bembedt[3]     = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)};
983d27334e2SStefano Zampini     const PetscReal binterpt[3][2] = {
984d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
985d27334e2SStefano Zampini       {1.0 / s2, -1.0 / (2.0 * s2)},
986d27334e2SStefano Zampini       {1.0 - s2, 1.0 / s2         }
987d27334e2SStefano Zampini     };
9889566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX2E, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
989a3a57f36SJed Brown   }
9906cf0794eSJed Brown   { /* Optimal for linear implicit part */
991d27334e2SStefano Zampini     const PetscReal A[3][3] = {
9929371c9d4SSatish Balay       {0,   0,   0},
9936cf0794eSJed Brown       {0.5, 0,   0},
9949371c9d4SSatish Balay       {0.5, 0.5, 0}
995d27334e2SStefano Zampini     };
996d27334e2SStefano Zampini     const PetscReal At[3][3] = {
997d27334e2SStefano Zampini       {0.25,   0,      0     },
998d27334e2SStefano Zampini       {0,      0.25,   0     },
999d27334e2SStefano Zampini       {1. / 3, 1. / 3, 1. / 3}
1000d27334e2SStefano Zampini     };
10019566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEXPRSSP2, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL));
10026cf0794eSJed Brown   }
1003a3a57f36SJed Brown   {
1004d27334e2SStefano Zampini     const PetscReal A[4][4] = {
10059371c9d4SSatish Balay       {0,                                0,                                0,                                 0},
10064040e9f2SJed Brown       {1767732205903. / 2027836641118.,  0,                                0,                                 0},
10074040e9f2SJed Brown       {5535828885825. / 10492691773637., 788022342437. / 10882634858940.,  0,                                 0},
10089371c9d4SSatish Balay       {6485989280629. / 16251701735622., -4246266847089. / 9704473918619., 10755448449292. / 10357097424841., 0}
1009d27334e2SStefano Zampini     };
1010d27334e2SStefano Zampini     const PetscReal At[4][4] = {
1011d27334e2SStefano Zampini       {0,                                0,                                0,                                 0                              },
1012d27334e2SStefano Zampini       {1767732205903. / 4055673282236.,  1767732205903. / 4055673282236.,  0,                                 0                              },
1013d27334e2SStefano Zampini       {2746238789719. / 10658868560708., -640167445237. / 6845629431997.,  1767732205903. / 4055673282236.,   0                              },
1014d27334e2SStefano Zampini       {1471266399579. / 7840856788654.,  -4482444167858. / 7529755066697., 11266239266428. / 11593286722821., 1767732205903. / 4055673282236.}
1015d27334e2SStefano Zampini     };
1016d27334e2SStefano Zampini     const PetscReal bembedt[4]     = {2756255671327. / 12835298489170., -10771552573575. / 22201958757719., 9247589265047. / 10645013368117., 2193209047091. / 5459859503100.};
1017d27334e2SStefano Zampini     const PetscReal binterpt[4][2] = {
1018d27334e2SStefano Zampini       {4655552711362. / 22874653954995.,  -215264564351. / 13552729205753.  },
1019d27334e2SStefano Zampini       {-18682724506714. / 9892148508045., 17870216137069. / 13817060693119. },
1020d27334e2SStefano Zampini       {34259539580243. / 13192909600954., -28141676662227. / 17317692491321.},
1021d27334e2SStefano Zampini       {584795268549. / 6622622206610.,    2508943948391. / 7218656332882.   }
1022d27334e2SStefano Zampini     };
10239566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX3, 3, 4, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL));
1024a3a57f36SJed Brown   }
1025a3a57f36SJed Brown   {
1026d27334e2SStefano Zampini     const PetscReal A[5][5] = {
10279371c9d4SSatish Balay       {0,        0,       0,      0,       0},
10286cf0794eSJed Brown       {1. / 2,   0,       0,      0,       0},
10296cf0794eSJed Brown       {11. / 18, 1. / 18, 0,      0,       0},
10306cf0794eSJed Brown       {5. / 6,   -5. / 6, .5,     0,       0},
10319371c9d4SSatish Balay       {1. / 4,   7. / 4,  3. / 4, -7. / 4, 0}
1032d27334e2SStefano Zampini     };
1033d27334e2SStefano Zampini     const PetscReal At[5][5] = {
1034d27334e2SStefano Zampini       {0, 0,       0,       0,      0     },
1035d27334e2SStefano Zampini       {0, 1. / 2,  0,       0,      0     },
1036d27334e2SStefano Zampini       {0, 1. / 6,  1. / 2,  0,      0     },
1037d27334e2SStefano Zampini       {0, -1. / 2, 1. / 2,  1. / 2, 0     },
1038d27334e2SStefano Zampini       {0, 3. / 2,  -3. / 2, 1. / 2, 1. / 2}
1039d27334e2SStefano Zampini     };
1040d27334e2SStefano Zampini     PetscCall(TSARKIMEXRegister(TSARKIMEXARS443, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL));
10416cf0794eSJed Brown   }
10426cf0794eSJed Brown   {
1043d27334e2SStefano Zampini     const PetscReal A[5][5] = {
10449371c9d4SSatish Balay       {0,      0,      0,      0, 0},
10456cf0794eSJed Brown       {1,      0,      0,      0, 0},
10466cf0794eSJed Brown       {4. / 9, 2. / 9, 0,      0, 0},
10476cf0794eSJed Brown       {1. / 4, 0,      3. / 4, 0, 0},
10489371c9d4SSatish Balay       {1. / 4, 0,      3. / 5, 0, 0}
1049d27334e2SStefano Zampini     };
1050d27334e2SStefano Zampini     const PetscReal At[5][5] = {
1051d27334e2SStefano Zampini       {0,       0,       0,   0,   0 },
1052d27334e2SStefano Zampini       {.5,      .5,      0,   0,   0 },
1053d27334e2SStefano Zampini       {5. / 18, -1. / 9, .5,  0,   0 },
1054d27334e2SStefano Zampini       {.5,      0,       0,   .5,  0 },
1055d27334e2SStefano Zampini       {.25,     0,       .75, -.5, .5}
1056d27334e2SStefano Zampini     };
1057d27334e2SStefano Zampini     PetscCall(TSARKIMEXRegister(TSARKIMEXBPR3, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL));
10586cf0794eSJed Brown   }
10596cf0794eSJed Brown   {
1060d27334e2SStefano Zampini     const PetscReal A[6][6] = {
10619371c9d4SSatish Balay       {0,                               0,                                 0,                                 0,                                0,              0},
1062a3a57f36SJed Brown       {1. / 2,                          0,                                 0,                                 0,                                0,              0},
10634040e9f2SJed Brown       {13861. / 62500.,                 6889. / 62500.,                    0,                                 0,                                0,              0},
10644040e9f2SJed Brown       {-116923316275. / 2393684061468., -2731218467317. / 15368042101831., 9408046702089. / 11113171139209.,  0,                                0,              0},
10654040e9f2SJed Brown       {-451086348788. / 2902428689909., -2682348792572. / 7519795681897.,  12662868775082. / 11960479115383., 3355817975965. / 11060851509271., 0,              0},
10669371c9d4SSatish Balay       {647845179188. / 3216320057751.,  73281519250. / 8382639484533.,     552539513391. / 3454668386233.,    3354512671639. / 8306763924573.,  4040. / 17871., 0}
1067d27334e2SStefano Zampini     };
1068d27334e2SStefano Zampini     const PetscReal At[6][6] = {
1069d27334e2SStefano Zampini       {0,                            0,                       0,                       0,                   0,             0     },
1070d27334e2SStefano Zampini       {1. / 4,                       1. / 4,                  0,                       0,                   0,             0     },
1071d27334e2SStefano Zampini       {8611. / 62500.,               -1743. / 31250.,         1. / 4,                  0,                   0,             0     },
1072d27334e2SStefano Zampini       {5012029. / 34652500.,         -654441. / 2922500.,     174375. / 388108.,       1. / 4,              0,             0     },
1073d27334e2SStefano Zampini       {15267082809. / 155376265600., -71443401. / 120774400., 730878875. / 902184768., 2285395. / 8070912., 1. / 4,        0     },
1074d27334e2SStefano Zampini       {82889. / 524892.,             0,                       15625. / 83664.,         69875. / 102672.,    -2260. / 8211, 1. / 4}
1075d27334e2SStefano Zampini     };
1076d27334e2SStefano Zampini     const PetscReal bembedt[6]     = {4586570599. / 29645900160., 0, 178811875. / 945068544., 814220225. / 1159782912., -3700637. / 11593932., 61727. / 225920.};
1077d27334e2SStefano Zampini     const PetscReal binterpt[6][3] = {
1078d27334e2SStefano Zampini       {6943876665148. / 7220017795957.,   -54480133. / 30881146., 6818779379841. / 7100303317025.  },
1079d27334e2SStefano Zampini       {0,                                 0,                      0                                },
1080d27334e2SStefano Zampini       {7640104374378. / 9702883013639.,   -11436875. / 14766696., 2173542590792. / 12501825683035. },
1081d27334e2SStefano Zampini       {-20649996744609. / 7521556579894., 174696575. / 18121608., -31592104683404. / 5083833661969.},
1082d27334e2SStefano Zampini       {8854892464581. / 2390941311638.,   -12120380. / 966161.,   61146701046299. / 7138195549469. },
1083d27334e2SStefano Zampini       {-11397109935349. / 6675773540249., 3843. / 706.,           -17219254887155. / 4939391667607.}
1084d27334e2SStefano Zampini     };
10859566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX4, 4, 6, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL));
1086a3a57f36SJed Brown   }
1087a3a57f36SJed Brown   {
1088d27334e2SStefano Zampini     const PetscReal A[8][8] = {
10899371c9d4SSatish Balay       {0,                                  0,                              0,                                 0,                                  0,                               0,                                 0,                               0},
1090a3a57f36SJed Brown       {41. / 100,                          0,                              0,                                 0,                                  0,                               0,                                 0,                               0},
10914040e9f2SJed Brown       {367902744464. / 2072280473677.,     677623207551. / 8224143866563., 0,                                 0,                                  0,                               0,                                 0,                               0},
10924040e9f2SJed Brown       {1268023523408. / 10340822734521.,   0,                              1029933939417. / 13636558850479.,  0,                                  0,                               0,                                 0,                               0},
10934040e9f2SJed Brown       {14463281900351. / 6315353703477.,   0,                              66114435211212. / 5879490589093.,  -54053170152839. / 4284798021562.,  0,                               0,                                 0,                               0},
10944040e9f2SJed Brown       {14090043504691. / 34967701212078.,  0,                              15191511035443. / 11219624916014., -18461159152457. / 12425892160975., -281667163811. / 9011619295870., 0,                                 0,                               0},
10954040e9f2SJed Brown       {19230459214898. / 13134317526959.,  0,                              21275331358303. / 2942455364971.,  -38145345988419. / 4862620318723.,  -1. / 8,                         -1. / 8,                           0,                               0},
10969371c9d4SSatish Balay       {-19977161125411. / 11928030595625., 0,                              -40795976796054. / 6384907823539., 177454434618887. / 12078138498510., 782672205425. / 8267701900261.,  -69563011059811. / 9646580694205., 7356628210526. / 4942186776405., 0}
1097d27334e2SStefano Zampini     };
1098d27334e2SStefano Zampini     const PetscReal At[8][8] = {
1099d27334e2SStefano Zampini       {0,                                0,                                0,                                 0,                                  0,                                0,                                  0,                                 0         },
1100d27334e2SStefano Zampini       {41. / 200.,                       41. / 200.,                       0,                                 0,                                  0,                                0,                                  0,                                 0         },
1101d27334e2SStefano Zampini       {41. / 400.,                       -567603406766. / 11931857230679., 41. / 200.,                        0,                                  0,                                0,                                  0,                                 0         },
1102d27334e2SStefano Zampini       {683785636431. / 9252920307686.,   0,                                -110385047103. / 1367015193373.,   41. / 200.,                         0,                                0,                                  0,                                 0         },
1103d27334e2SStefano Zampini       {3016520224154. / 10081342136671., 0,                                30586259806659. / 12414158314087., -22760509404356. / 11113319521817., 41. / 200.,                       0,                                  0,                                 0         },
1104d27334e2SStefano Zampini       {218866479029. / 1489978393911.,   0,                                638256894668. / 5436446318841.,    -1179710474555. / 5321154724896.,   -60928119172. / 8023461067671.,   41. / 200.,                         0,                                 0         },
1105d27334e2SStefano Zampini       {1020004230633. / 5715676835656.,  0,                                25762820946817. / 25263940353407., -2161375909145. / 9755907335909.,   -211217309593. / 5846859502534.,  -4269925059573. / 7827059040749.,   41. / 200,                         0         },
1106d27334e2SStefano Zampini       {-872700587467. / 9133579230613.,  0,                                0,                                 22348218063261. / 9555858737531.,   -1143369518992. / 8141816002931., -39379526789629. / 19018526304540., 32727382324388. / 42900044865799., 41. / 200.}
1107d27334e2SStefano Zampini     };
1108d27334e2SStefano Zampini     const PetscReal bembedt[8]     = {-975461918565. / 9796059967033., 0, 0, 78070527104295. / 32432590147079., -548382580838. / 3424219808633., -33438840321285. / 15594753105479., 3629800801594. / 4656183773603., 4035322873751. / 18575991585200.};
1109d27334e2SStefano Zampini     const PetscReal binterpt[8][3] = {
1110d27334e2SStefano Zampini       {-17674230611817. / 10670229744614., 43486358583215. / 12773830924787.,  -9257016797708. / 5021505065439. },
1111d27334e2SStefano Zampini       {0,                                  0,                                  0                                },
1112d27334e2SStefano Zampini       {0,                                  0,                                  0                                },
1113d27334e2SStefano Zampini       {65168852399939. / 7868540260826.,   -91478233927265. / 11067650958493., 26096422576131. / 11239449250142.},
1114d27334e2SStefano Zampini       {15494834004392. / 5936557850923.,   -79368583304911. / 10890268929626., 92396832856987. / 20362823103730.},
1115d27334e2SStefano Zampini       {-99329723586156. / 26959484932159., -12239297817655. / 9152339842473.,  30029262896817. / 10175596800299.},
1116d27334e2SStefano Zampini       {-19024464361622. / 5461577185407.,  115839755401235. / 10719374521269., -26136350496073. / 3983972220547.},
1117d27334e2SStefano Zampini       {-6511271360970. / 6095937251113.,   5843115559534. / 2180450260947.,    -5289405421727. / 3760307252460. }
1118d27334e2SStefano Zampini     };
11199566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXRegister(TSARKIMEX5, 5, 8, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL));
1120a3a57f36SJed Brown   }
1121d27334e2SStefano Zampini #undef RC
1122d27334e2SStefano Zampini #undef us2
1123d27334e2SStefano Zampini #undef s2
11243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11258a381b04SJed Brown }
11268a381b04SJed Brown 
11278a381b04SJed Brown /*@C
1128bcf0153eSBarry Smith   TSARKIMEXRegisterDestroy - Frees the list of schemes that were registered by `TSARKIMEXRegister()`.
11298a381b04SJed Brown 
11308a381b04SJed Brown   Not Collective
11318a381b04SJed Brown 
11328a381b04SJed Brown   Level: advanced
11338a381b04SJed Brown 
11341cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXRegister()`, `TSARKIMEXRegisterAll()`
11358a381b04SJed Brown @*/
1136d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterDestroy(void)
1137d71ae5a4SJacob Faibussowitsch {
11388a381b04SJed Brown   ARKTableauLink link;
11398a381b04SJed Brown 
11408a381b04SJed Brown   PetscFunctionBegin;
11418a381b04SJed Brown   while ((link = ARKTableauList)) {
11428a381b04SJed Brown     ARKTableau t   = &link->tab;
11438a381b04SJed Brown     ARKTableauList = link->next;
11449566063dSJacob Faibussowitsch     PetscCall(PetscFree6(t->At, t->bt, t->ct, t->A, t->b, t->c));
11459566063dSJacob Faibussowitsch     PetscCall(PetscFree2(t->bembedt, t->bembed));
11469566063dSJacob Faibussowitsch     PetscCall(PetscFree2(t->binterpt, t->binterp));
11479566063dSJacob Faibussowitsch     PetscCall(PetscFree(t->name));
11489566063dSJacob Faibussowitsch     PetscCall(PetscFree(link));
11498a381b04SJed Brown   }
11508a381b04SJed Brown   TSARKIMEXRegisterAllCalled = PETSC_FALSE;
11513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11528a381b04SJed Brown }
11538a381b04SJed Brown 
11548a381b04SJed Brown /*@C
1155bcf0153eSBarry Smith   TSARKIMEXInitializePackage - This function initializes everything in the `TSARKIMEX` package. It is called
1156bcf0153eSBarry Smith   from `TSInitializePackage()`.
11578a381b04SJed Brown 
11588a381b04SJed Brown   Level: developer
11598a381b04SJed Brown 
11601cc06b55SBarry Smith .seealso: [](ch_ts), `PetscInitialize()`, `TSARKIMEXFinalizePackage()`
11618a381b04SJed Brown @*/
1162d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXInitializePackage(void)
1163d71ae5a4SJacob Faibussowitsch {
11648a381b04SJed Brown   PetscFunctionBegin;
11653ba16761SJacob Faibussowitsch   if (TSARKIMEXPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
11668a381b04SJed Brown   TSARKIMEXPackageInitialized = PETSC_TRUE;
11679566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRegisterAll());
11689566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(TSARKIMEXFinalizePackage));
11693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11708a381b04SJed Brown }
11718a381b04SJed Brown 
11728a381b04SJed Brown /*@C
1173bcf0153eSBarry Smith   TSARKIMEXFinalizePackage - This function destroys everything in the `TSARKIMEX` package. It is
1174bcf0153eSBarry Smith   called from `PetscFinalize()`.
11758a381b04SJed Brown 
11768a381b04SJed Brown   Level: developer
11778a381b04SJed Brown 
11781cc06b55SBarry Smith .seealso: [](ch_ts), `PetscFinalize()`, `TSARKIMEXInitializePackage()`
11798a381b04SJed Brown @*/
1180d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXFinalizePackage(void)
1181d71ae5a4SJacob Faibussowitsch {
11828a381b04SJed Brown   PetscFunctionBegin;
11838a381b04SJed Brown   TSARKIMEXPackageInitialized = PETSC_FALSE;
11849566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRegisterDestroy());
11853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11868a381b04SJed Brown }
11878a381b04SJed Brown 
1188cd652676SJed Brown /*@C
1189bcf0153eSBarry Smith   TSARKIMEXRegister - register a `TSARKIMEX` scheme by providing the entries in the Butcher tableau and optionally embedded approximations and interpolation
1190cd652676SJed Brown 
1191d27334e2SStefano Zampini   Logically Collective.
1192cd652676SJed Brown 
1193cd652676SJed Brown   Input Parameters:
1194cd652676SJed Brown + name     - identifier for method
1195cd652676SJed Brown . order    - approximation order of method
1196cd652676SJed Brown . s        - number of stages, this is the dimension of the matrices below
1197cd652676SJed Brown . At       - Butcher table of stage coefficients for stiff part (dimension s*s, row-major)
11980298fd71SBarry Smith . bt       - Butcher table for completing the stiff part of the step (dimension s; NULL to use the last row of At)
11990298fd71SBarry Smith . ct       - Abscissa of each stiff stage (dimension s, NULL to use row sums of At)
1200cd652676SJed Brown . A        - Non-stiff stage coefficients (dimension s*s, row-major)
12010298fd71SBarry Smith . b        - Non-stiff step completion table (dimension s; NULL to use last row of At)
12020298fd71SBarry Smith . c        - Non-stiff abscissa (dimension s; NULL to use row sums of A)
12030298fd71SBarry Smith . bembedt  - Stiff part of completion table for embedded method (dimension s; NULL if not available)
12040298fd71SBarry Smith . bembed   - Non-stiff part of completion table for embedded method (dimension s; NULL to use bembedt if provided)
1205cd652676SJed Brown . pinterp  - Order of the interpolation scheme, equal to the number of columns of binterpt and binterp
1206cd652676SJed Brown . binterpt - Coefficients of the interpolation formula for the stiff part (dimension s*pinterp)
12070298fd71SBarry Smith - binterp  - Coefficients of the interpolation formula for the non-stiff part (dimension s*pinterp; NULL to reuse binterpt)
1208cd652676SJed Brown 
1209cd652676SJed Brown   Level: advanced
1210cd652676SJed Brown 
1211bcf0153eSBarry Smith   Note:
1212bcf0153eSBarry Smith   Several `TSARKIMEX` methods are provided, this function is only needed to create new methods.
1213bcf0153eSBarry Smith 
12141cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSType`, `TS`
1215cd652676SJed Brown @*/
1216d71ae5a4SJacob 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[])
1217d71ae5a4SJacob Faibussowitsch {
12188a381b04SJed Brown   ARKTableauLink link;
12198a381b04SJed Brown   ARKTableau     t;
12208a381b04SJed Brown   PetscInt       i, j;
12218a381b04SJed Brown 
12228a381b04SJed Brown   PetscFunctionBegin;
12239566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXInitializePackage());
1224d27334e2SStefano Zampini   for (link = ARKTableauList; link; link = link->next) {
1225d27334e2SStefano Zampini     PetscBool match;
1226d27334e2SStefano Zampini 
1227d27334e2SStefano Zampini     PetscCall(PetscStrcmp(link->tab.name, name, &match));
1228d27334e2SStefano Zampini     PetscCheck(!match, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Method with name \"%s\" already registered", name);
1229d27334e2SStefano Zampini   }
12309566063dSJacob Faibussowitsch   PetscCall(PetscNew(&link));
12318a381b04SJed Brown   t = &link->tab;
12329566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &t->name));
12338a381b04SJed Brown   t->order = order;
12348a381b04SJed Brown   t->s     = s;
12359566063dSJacob Faibussowitsch   PetscCall(PetscMalloc6(s * s, &t->At, s, &t->bt, s, &t->ct, s * s, &t->A, s, &t->b, s, &t->c));
12369566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(t->At, At, s * s));
1237d27334e2SStefano Zampini   if (A) {
12389566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(t->A, A, s * s));
1239d27334e2SStefano Zampini     t->additive = PETSC_TRUE;
1240d27334e2SStefano Zampini   }
1241d27334e2SStefano Zampini 
12429566063dSJacob Faibussowitsch   if (bt) PetscCall(PetscArraycpy(t->bt, bt, s));
12439371c9d4SSatish Balay   else
12449371c9d4SSatish Balay     for (i = 0; i < s; i++) t->bt[i] = At[(s - 1) * s + i];
1245d27334e2SStefano Zampini 
1246d27334e2SStefano Zampini   if (t->additive) {
12479566063dSJacob Faibussowitsch     if (b) PetscCall(PetscArraycpy(t->b, b, s));
12489371c9d4SSatish Balay     else
12499371c9d4SSatish Balay       for (i = 0; i < s; i++) t->b[i] = t->bt[i];
1250d27334e2SStefano Zampini   } else PetscCall(PetscArrayzero(t->b, s));
1251d27334e2SStefano Zampini 
12529566063dSJacob Faibussowitsch   if (ct) PetscCall(PetscArraycpy(t->ct, ct, s));
12539371c9d4SSatish Balay   else
12549371c9d4SSatish Balay     for (i = 0; i < s; i++)
12559371c9d4SSatish Balay       for (j = 0, t->ct[i] = 0; j < s; j++) t->ct[i] += At[i * s + j];
1256d27334e2SStefano Zampini 
1257d27334e2SStefano Zampini   if (t->additive) {
12589566063dSJacob Faibussowitsch     if (c) PetscCall(PetscArraycpy(t->c, c, s));
12599371c9d4SSatish Balay     else
12609371c9d4SSatish Balay       for (i = 0; i < s; i++)
12619371c9d4SSatish Balay         for (j = 0, t->c[i] = 0; j < s; j++) t->c[i] += A[i * s + j];
1262d27334e2SStefano Zampini   } else PetscCall(PetscArrayzero(t->c, s));
1263d27334e2SStefano Zampini 
1264e817cc15SEmil Constantinescu   t->stiffly_accurate = PETSC_TRUE;
12659371c9d4SSatish Balay   for (i = 0; i < s; i++)
12669371c9d4SSatish Balay     if (t->At[(s - 1) * s + i] != t->bt[i]) t->stiffly_accurate = PETSC_FALSE;
1267d27334e2SStefano Zampini 
1268e817cc15SEmil Constantinescu   t->explicit_first_stage = PETSC_TRUE;
12699371c9d4SSatish Balay   for (i = 0; i < s; i++)
12709371c9d4SSatish Balay     if (t->At[i] != 0.0) t->explicit_first_stage = PETSC_FALSE;
1271d27334e2SStefano Zampini 
1272e817cc15SEmil Constantinescu   /* def of FSAL can be made more precise */
12734e9d4bf5SJed Brown   t->FSAL_implicit = (PetscBool)(t->explicit_first_stage && t->stiffly_accurate);
1274d27334e2SStefano Zampini 
1275108c343cSJed Brown   if (bembedt) {
12769566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(s, &t->bembedt, s, &t->bembed));
12779566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(t->bembedt, bembedt, s));
12789566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(t->bembed, bembed ? bembed : bembedt, s));
1279108c343cSJed Brown   }
1280108c343cSJed Brown 
12814f385281SJed Brown   t->pinterp = pinterp;
12829566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(s * pinterp, &t->binterpt, s * pinterp, &t->binterp));
12839566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(t->binterpt, binterpt, s * pinterp));
12849566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(t->binterp, binterp ? binterp : binterpt, s * pinterp));
1285d27334e2SStefano Zampini 
12868a381b04SJed Brown   link->next     = ARKTableauList;
12878a381b04SJed Brown   ARKTableauList = link;
12883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12898a381b04SJed Brown }
12908a381b04SJed Brown 
1291d27334e2SStefano Zampini /*@C
1292d27334e2SStefano Zampini   TSDIRKRegister - register a `TSDIRK` scheme by providing the entries in its Butcher tableau and, optionally, embedded approximations and interpolation
1293d27334e2SStefano Zampini 
1294d27334e2SStefano Zampini   Logically Collective.
1295d27334e2SStefano Zampini 
1296d27334e2SStefano Zampini   Input Parameters:
1297d27334e2SStefano Zampini + name     - identifier for method
1298d27334e2SStefano Zampini . order    - approximation order of method
1299d27334e2SStefano Zampini . s        - number of stages, this is the dimension of the matrices below
1300d27334e2SStefano Zampini . At       - Butcher table of stage coefficients (dimension `s`*`s`, row-major order)
1301d27334e2SStefano Zampini . bt       - Butcher table for completing the step (dimension `s`; pass `NULL` to use the last row of `At`)
1302d27334e2SStefano Zampini . ct       - Abscissa of each stage (dimension s, NULL to use row sums of At)
1303d27334e2SStefano Zampini . bembedt  - Stiff part of completion table for embedded method (dimension s; `NULL` if not available)
1304d27334e2SStefano Zampini . pinterp  - Order of the interpolation scheme, equal to the number of columns of `binterpt` and `binterp`
1305d27334e2SStefano Zampini - binterpt - Coefficients of the interpolation formula (dimension s*pinterp)
1306d27334e2SStefano Zampini 
1307d27334e2SStefano Zampini   Level: advanced
1308d27334e2SStefano Zampini 
1309d27334e2SStefano Zampini   Note:
1310d27334e2SStefano Zampini   Several `TSDIRK` methods are provided, the use of this function is only needed to create new methods.
1311d27334e2SStefano Zampini 
1312d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSType`, `TS`
1313d27334e2SStefano Zampini @*/
1314d27334e2SStefano 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[])
1315d27334e2SStefano Zampini {
1316d27334e2SStefano Zampini   PetscFunctionBegin;
1317d27334e2SStefano Zampini   PetscCall(TSARKIMEXRegister(name, order, s, At, bt, ct, NULL, NULL, NULL, bembedt, NULL, pinterp, binterpt, NULL));
1318d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
1319d27334e2SStefano Zampini }
1320d27334e2SStefano Zampini 
1321108c343cSJed Brown /*
1322108c343cSJed Brown  The step completion formula is
1323108c343cSJed Brown 
1324108c343cSJed Brown  x1 = x0 - h bt^T YdotI + h b^T YdotRHS
1325108c343cSJed Brown 
1326108c343cSJed Brown  This function can be called before or after ts->vec_sol has been updated.
1327108c343cSJed Brown  Suppose we have a completion formula (bt,b) and an embedded formula (bet,be) of different order.
1328108c343cSJed Brown  We can write
1329108c343cSJed Brown 
1330108c343cSJed Brown  x1e = x0 - h bet^T YdotI + h be^T YdotRHS
1331108c343cSJed Brown      = x1 + h bt^T YdotI - h b^T YdotRHS - h bet^T YdotI + h be^T YdotRHS
1332108c343cSJed Brown      = x1 - h (bet - bt)^T YdotI + h (be - b)^T YdotRHS
1333108c343cSJed Brown 
1334108c343cSJed Brown  so we can evaluate the method with different order even after the step has been optimistically completed.
1335108c343cSJed Brown */
1336d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSEvaluateStep_ARKIMEX(TS ts, PetscInt order, Vec X, PetscBool *done)
1337d71ae5a4SJacob Faibussowitsch {
1338108c343cSJed Brown   TS_ARKIMEX  *ark = (TS_ARKIMEX *)ts->data;
1339108c343cSJed Brown   ARKTableau   tab = ark->tableau;
1340108c343cSJed Brown   PetscScalar *w   = ark->work;
1341108c343cSJed Brown   PetscReal    h;
1342108c343cSJed Brown   PetscInt     s = tab->s, j;
1343d27334e2SStefano Zampini   PetscBool    hasE;
1344108c343cSJed Brown 
1345108c343cSJed Brown   PetscFunctionBegin;
1346108c343cSJed Brown   switch (ark->status) {
1347108c343cSJed Brown   case TS_STEP_INCOMPLETE:
1348d71ae5a4SJacob Faibussowitsch   case TS_STEP_PENDING:
1349d71ae5a4SJacob Faibussowitsch     h = ts->time_step;
1350d71ae5a4SJacob Faibussowitsch     break;
1351d71ae5a4SJacob Faibussowitsch   case TS_STEP_COMPLETE:
1352d71ae5a4SJacob Faibussowitsch     h = ts->ptime - ts->ptime_prev;
1353d71ae5a4SJacob Faibussowitsch     break;
1354d71ae5a4SJacob Faibussowitsch   default:
1355d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus");
1356108c343cSJed Brown   }
1357108c343cSJed Brown   if (order == tab->order) {
1358e817cc15SEmil Constantinescu     if (ark->status == TS_STEP_INCOMPLETE) {
1359740132f1SEmil Constantinescu       if (!ark->imex && tab->stiffly_accurate) { /* Only the stiffly accurate implicit formula is used */
13609566063dSJacob Faibussowitsch         PetscCall(VecCopy(ark->Y[s - 1], X));
1361e817cc15SEmil Constantinescu       } else { /* Use the standard completion formula (bt,b) */
13629566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, X));
1363e817cc15SEmil Constantinescu         for (j = 0; j < s; j++) w[j] = h * tab->bt[j];
13649566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(X, s, w, ark->YdotI));
1365d27334e2SStefano Zampini         if (tab->additive && ark->imex) { /* Method is IMEX, complete the explicit formula */
1366d27334e2SStefano Zampini           PetscCall(TSHasRHSFunction(ts, &hasE));
1367d27334e2SStefano Zampini           if (hasE) {
1368108c343cSJed Brown             for (j = 0; j < s; j++) w[j] = h * tab->b[j];
13699566063dSJacob Faibussowitsch             PetscCall(VecMAXPY(X, s, w, ark->YdotRHS));
1370e817cc15SEmil Constantinescu           }
1371e817cc15SEmil Constantinescu         }
1372d27334e2SStefano Zampini       }
13739566063dSJacob Faibussowitsch     } else PetscCall(VecCopy(ts->vec_sol, X));
1374108c343cSJed Brown     if (done) *done = PETSC_TRUE;
13753ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
1376108c343cSJed Brown   } else if (order == tab->order - 1) {
1377108c343cSJed Brown     if (!tab->bembedt) goto unavailable;
1378108c343cSJed Brown     if (ark->status == TS_STEP_INCOMPLETE) { /* Complete with the embedded method (bet,be) */
13799566063dSJacob Faibussowitsch       PetscCall(VecCopy(ts->vec_sol, X));
1380e817cc15SEmil Constantinescu       for (j = 0; j < s; j++) w[j] = h * tab->bembedt[j];
13819566063dSJacob Faibussowitsch       PetscCall(VecMAXPY(X, s, w, ark->YdotI));
1382d27334e2SStefano Zampini       if (tab->additive) {
1383d27334e2SStefano Zampini         PetscCall(TSHasRHSFunction(ts, &hasE));
1384d27334e2SStefano Zampini         if (hasE) {
1385108c343cSJed Brown           for (j = 0; j < s; j++) w[j] = h * tab->bembed[j];
13869566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(X, s, w, ark->YdotRHS));
1387d27334e2SStefano Zampini         }
1388d27334e2SStefano Zampini       }
1389108c343cSJed Brown     } else { /* Rollback and re-complete using (bet-be,be-b) */
13909566063dSJacob Faibussowitsch       PetscCall(VecCopy(ts->vec_sol, X));
1391e817cc15SEmil Constantinescu       for (j = 0; j < s; j++) w[j] = h * (tab->bembedt[j] - tab->bt[j]);
13929566063dSJacob Faibussowitsch       PetscCall(VecMAXPY(X, tab->s, w, ark->YdotI));
1393d27334e2SStefano Zampini       if (tab->additive) {
1394d27334e2SStefano Zampini         PetscCall(TSHasRHSFunction(ts, &hasE));
1395d27334e2SStefano Zampini         if (hasE) {
1396108c343cSJed Brown           for (j = 0; j < s; j++) w[j] = h * (tab->bembed[j] - tab->b[j]);
13979566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(X, s, w, ark->YdotRHS));
1398108c343cSJed Brown         }
1399d27334e2SStefano Zampini       }
1400d27334e2SStefano Zampini     }
1401108c343cSJed Brown     if (done) *done = PETSC_TRUE;
14023ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
1403108c343cSJed Brown   }
1404108c343cSJed Brown unavailable:
1405108c343cSJed Brown   if (done) *done = PETSC_FALSE;
14069371c9d4SSatish Balay   else
14079371c9d4SSatish 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,
14089371c9d4SSatish Balay             tab->order, order);
14093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1410108c343cSJed Brown }
1411108c343cSJed Brown 
1412d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTestMassIdentity(TS ts, PetscBool *id)
1413d71ae5a4SJacob Faibussowitsch {
1414c79dcfbdSBarry Smith   Vec         Udot, Y1, Y2;
1415c79dcfbdSBarry Smith   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1416c79dcfbdSBarry Smith   PetscReal   norm;
1417c79dcfbdSBarry Smith 
1418c79dcfbdSBarry Smith   PetscFunctionBegin;
14199566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &Udot));
14209566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &Y1));
14219566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &Y2));
14229566063dSJacob Faibussowitsch   PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y1, ark->imex));
14239566063dSJacob Faibussowitsch   PetscCall(VecSetRandom(Udot, NULL));
14249566063dSJacob Faibussowitsch   PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y2, ark->imex));
14259566063dSJacob Faibussowitsch   PetscCall(VecAXPY(Y2, -1.0, Y1));
14269566063dSJacob Faibussowitsch   PetscCall(VecAXPY(Y2, -1.0, Udot));
14279566063dSJacob Faibussowitsch   PetscCall(VecNorm(Y2, NORM_2, &norm));
1428c79dcfbdSBarry Smith   if (norm < 100.0 * PETSC_MACHINE_EPSILON) {
1429c79dcfbdSBarry Smith     *id = PETSC_TRUE;
1430c79dcfbdSBarry Smith   } else {
1431c79dcfbdSBarry Smith     *id = PETSC_FALSE;
14329566063dSJacob 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));
1433c79dcfbdSBarry Smith   }
14349566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Udot));
14359566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Y1));
14369566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Y2));
14373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1438c79dcfbdSBarry Smith }
1439c79dcfbdSBarry Smith 
1440d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSRollBack_ARKIMEX(TS ts)
1441d71ae5a4SJacob Faibussowitsch {
144224655328SShri   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
144324655328SShri   ARKTableau       tab = ark->tableau;
144424655328SShri   const PetscInt   s   = tab->s;
144524655328SShri   const PetscReal *bt = tab->bt, *b = tab->b;
144624655328SShri   PetscScalar     *w     = ark->work;
144724655328SShri   Vec             *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS;
144824655328SShri   PetscInt         j;
1449be5899b3SLisandro Dalcin   PetscReal        h;
145024655328SShri 
145124655328SShri   PetscFunctionBegin;
1452be5899b3SLisandro Dalcin   switch (ark->status) {
1453be5899b3SLisandro Dalcin   case TS_STEP_INCOMPLETE:
1454d71ae5a4SJacob Faibussowitsch   case TS_STEP_PENDING:
1455d71ae5a4SJacob Faibussowitsch     h = ts->time_step;
1456d71ae5a4SJacob Faibussowitsch     break;
1457d71ae5a4SJacob Faibussowitsch   case TS_STEP_COMPLETE:
1458d71ae5a4SJacob Faibussowitsch     h = ts->ptime - ts->ptime_prev;
1459d71ae5a4SJacob Faibussowitsch     break;
1460d71ae5a4SJacob Faibussowitsch   default:
1461d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus");
1462be5899b3SLisandro Dalcin   }
146324655328SShri   for (j = 0; j < s; j++) w[j] = -h * bt[j];
14649566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(ts->vec_sol, s, w, YdotI));
1465d27334e2SStefano Zampini   if (tab->additive) {
1466d27334e2SStefano Zampini     PetscBool hasE;
1467d27334e2SStefano Zampini 
1468d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1469d27334e2SStefano Zampini     if (hasE) {
147024655328SShri       for (j = 0; j < s; j++) w[j] = -h * b[j];
14719566063dSJacob Faibussowitsch       PetscCall(VecMAXPY(ts->vec_sol, s, w, YdotRHS));
1472d27334e2SStefano Zampini     }
1473d27334e2SStefano Zampini   }
14743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
147524655328SShri }
147624655328SShri 
1477d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSStep_ARKIMEX(TS ts)
1478d71ae5a4SJacob Faibussowitsch {
14798a381b04SJed Brown   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
14808a381b04SJed Brown   ARKTableau       tab = ark->tableau;
14818a381b04SJed Brown   const PetscInt   s   = tab->s;
148224655328SShri   const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c;
1483406d0ec2SJed Brown   PetscScalar     *w = ark->work;
14841297b224SEmil Constantinescu   Vec             *Y = ark->Y, *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS, Ydot = ark->Ydot, Ydot0 = ark->Ydot0, Z = ark->Z;
148596400bd6SLisandro Dalcin   PetscBool        extrapolate = ark->extrapolate;
1486108c343cSJed Brown   TSAdapt          adapt;
14878a381b04SJed Brown   SNES             snes;
1488fecfb714SLisandro Dalcin   PetscInt         i, j, its, lits;
1489be5899b3SLisandro Dalcin   PetscInt         rejections = 0;
1490d27334e2SStefano Zampini   PetscBool        hasE = PETSC_FALSE, dirk = (PetscBool)(!tab->additive), stageok, accept = PETSC_TRUE;
149196400bd6SLisandro Dalcin   PetscReal        next_time_step = ts->time_step;
14928a381b04SJed Brown 
14938a381b04SJed Brown   PetscFunctionBegin;
149496400bd6SLisandro Dalcin   if (ark->extrapolate && !ark->Y_prev) {
14959566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev));
14969566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev));
1497d27334e2SStefano Zampini     if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev));
149896400bd6SLisandro Dalcin   }
149996400bd6SLisandro Dalcin 
1500d27334e2SStefano Zampini   if (!dirk) PetscCall(TSHasRHSFunction(ts, &hasE));
1501d27334e2SStefano Zampini   if (!hasE) dirk = PETSC_TRUE;
1502d27334e2SStefano Zampini 
150396400bd6SLisandro Dalcin   if (!ts->steprollback) {
1504d27334e2SStefano Zampini     if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { /* Save the initial slope for the next step */
15059566063dSJacob Faibussowitsch       PetscCall(VecCopy(YdotI[s - 1], Ydot0));
150696400bd6SLisandro Dalcin     }
1507fecfb714SLisandro Dalcin     if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initial guess */
150896400bd6SLisandro Dalcin       for (i = 0; i < s; i++) {
15099566063dSJacob Faibussowitsch         PetscCall(VecCopy(Y[i], ark->Y_prev[i]));
15109566063dSJacob Faibussowitsch         PetscCall(VecCopy(YdotI[i], ark->YdotI_prev[i]));
1511d27334e2SStefano Zampini         if (tab->additive && hasE) PetscCall(VecCopy(YdotRHS[i], ark->YdotRHS_prev[i]));
151296400bd6SLisandro Dalcin       }
151396400bd6SLisandro Dalcin     }
151496400bd6SLisandro Dalcin   }
151596400bd6SLisandro Dalcin 
1516d27334e2SStefano Zampini   /* For fully implicit formulations we can solve the equations
1517d27334e2SStefano Zampini        F(tn,xn,xdot) = 0
1518d27334e2SStefano Zampini      for the explicit first stage */
1519d27334e2SStefano Zampini   if (dirk && tab->explicit_first_stage && ts->steprestart) {
1520d27334e2SStefano Zampini     ark->scoeff = 0.0;
1521d27334e2SStefano Zampini     PetscCall(VecCopy(ts->vec_sol, Z));
1522d27334e2SStefano Zampini     PetscCall(TSGetSNES(ts, &snes));
1523d27334e2SStefano Zampini     PetscCall(SNESSolve(snes, NULL, Ydot0));
1524d27334e2SStefano Zampini   }
1525d27334e2SStefano Zampini 
1526d27334e2SStefano Zampini   /* For IMEX we compute a step */
1527d27334e2SStefano Zampini   if (!dirk && ts->equation_type >= TS_EQ_IMPLICIT && tab->explicit_first_stage && ts->steprestart) {
152896400bd6SLisandro Dalcin     TS ts_start;
1529d27334e2SStefano Zampini     if (PetscDefined(USE_DEBUG) && hasE) {
1530c79dcfbdSBarry Smith       PetscBool id = PETSC_FALSE;
15319566063dSJacob Faibussowitsch       PetscCall(TSARKIMEXTestMassIdentity(ts, &id));
1532d27334e2SStefano Zampini       PetscCheck(id, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "This scheme requires an identity mass matrix, however the TSIFunction you provided does not utilize an identity mass matrix");
1533c79dcfbdSBarry Smith     }
15349566063dSJacob Faibussowitsch     PetscCall(TSClone(ts, &ts_start));
15359566063dSJacob Faibussowitsch     PetscCall(TSSetSolution(ts_start, ts->vec_sol));
15369566063dSJacob Faibussowitsch     PetscCall(TSSetTime(ts_start, ts->ptime));
15379566063dSJacob Faibussowitsch     PetscCall(TSSetMaxSteps(ts_start, ts->steps + 1));
15389566063dSJacob Faibussowitsch     PetscCall(TSSetMaxTime(ts_start, ts->ptime + ts->time_step));
15399566063dSJacob Faibussowitsch     PetscCall(TSSetExactFinalTime(ts_start, TS_EXACTFINALTIME_STEPOVER));
15409566063dSJacob Faibussowitsch     PetscCall(TSSetTimeStep(ts_start, ts->time_step));
15419566063dSJacob Faibussowitsch     PetscCall(TSSetType(ts_start, TSARKIMEX));
15429566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetFullyImplicit(ts_start, PETSC_TRUE));
15439566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetType(ts_start, TSARKIMEX1BEE));
154434561852SEmil Constantinescu 
15459566063dSJacob Faibussowitsch     PetscCall(TSRestartStep(ts_start));
15469566063dSJacob Faibussowitsch     PetscCall(TSSolve(ts_start, ts->vec_sol));
15479566063dSJacob Faibussowitsch     PetscCall(TSGetTime(ts_start, &ts->ptime));
15489566063dSJacob Faibussowitsch     PetscCall(TSGetTimeStep(ts_start, &ts->time_step));
1549bbd56ea5SKarl Rupp 
155085fc7851SLisandro Dalcin     { /* Save the initial slope for the next step */
155185fc7851SLisandro Dalcin       TS_ARKIMEX *ark_start = (TS_ARKIMEX *)ts_start->data;
15529566063dSJacob Faibussowitsch       PetscCall(VecCopy(ark_start->YdotI[ark_start->tableau->s - 1], Ydot0));
155385fc7851SLisandro Dalcin     }
155496400bd6SLisandro Dalcin     ts->steps++;
155534561852SEmil Constantinescu 
1556d15a3a53SEmil Constantinescu     /* Set the correct TS in SNES */
1557d15a3a53SEmil Constantinescu     /* We'll try to bypass this by changing the method on the fly */
155896400bd6SLisandro Dalcin     {
15599566063dSJacob Faibussowitsch       PetscCall(TSGetSNES(ts, &snes));
15609566063dSJacob Faibussowitsch       PetscCall(TSSetSNES(ts, snes));
156196400bd6SLisandro Dalcin     }
15629566063dSJacob Faibussowitsch     PetscCall(TSDestroy(&ts_start));
1563e817cc15SEmil Constantinescu   }
1564e817cc15SEmil Constantinescu 
1565108c343cSJed Brown   ark->status = TS_STEP_INCOMPLETE;
156696400bd6SLisandro Dalcin   while (!ts->reason && ark->status != TS_STEP_COMPLETE) {
156796400bd6SLisandro Dalcin     PetscReal t = ts->ptime;
1568108c343cSJed Brown     PetscReal h = ts->time_step;
15698a381b04SJed Brown     for (i = 0; i < s; i++) {
15709be3e283SDebojyoti Ghosh       ark->stage_time = t + h * ct[i];
15719566063dSJacob Faibussowitsch       PetscCall(TSPreStage(ts, ark->stage_time));
15728a381b04SJed Brown       if (At[i * s + i] == 0) { /* This stage is explicit */
15733c633725SBarry 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");
15749566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, Y[i]));
1575e817cc15SEmil Constantinescu         for (j = 0; j < i; j++) w[j] = h * At[i * s + j];
15769566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(Y[i], i, w, YdotI));
1577d27334e2SStefano Zampini         if (tab->additive && hasE) {
15788a381b04SJed Brown           for (j = 0; j < i; j++) w[j] = h * A[i * s + j];
15799566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(Y[i], i, w, YdotRHS));
1580d27334e2SStefano Zampini         }
15818a381b04SJed Brown       } else {
1582b296d7d5SJed Brown         ark->scoeff = 1. / At[i * s + i];
15838a381b04SJed Brown         /* Ydot = shift*(Y-Z) */
15849566063dSJacob Faibussowitsch         PetscCall(VecCopy(ts->vec_sol, Z));
1585e817cc15SEmil Constantinescu         for (j = 0; j < i; j++) w[j] = h * At[i * s + j];
15869566063dSJacob Faibussowitsch         PetscCall(VecMAXPY(Z, i, w, YdotI));
1587d27334e2SStefano Zampini         if (tab->additive && hasE) {
1588c58d1302SEmil Constantinescu           for (j = 0; j < i; j++) w[j] = h * A[i * s + j];
15899566063dSJacob Faibussowitsch           PetscCall(VecMAXPY(Z, i, w, YdotRHS));
1590d27334e2SStefano Zampini         }
1591fecfb714SLisandro Dalcin         if (extrapolate && !ts->steprestart) {
159256dcabbaSDebojyoti Ghosh           /* Initial guess extrapolated from previous time step stage values */
15939566063dSJacob Faibussowitsch           PetscCall(TSExtrapolate_ARKIMEX(ts, c[i], Y[i]));
159456dcabbaSDebojyoti Ghosh         } else {
15958a381b04SJed Brown           /* Initial guess taken from last stage */
15969566063dSJacob Faibussowitsch           PetscCall(VecCopy(i > 0 ? Y[i - 1] : ts->vec_sol, Y[i]));
159756dcabbaSDebojyoti Ghosh         }
15989566063dSJacob Faibussowitsch         PetscCall(TSGetSNES(ts, &snes));
15999566063dSJacob Faibussowitsch         PetscCall(SNESSolve(snes, NULL, Y[i]));
16009566063dSJacob Faibussowitsch         PetscCall(SNESGetIterationNumber(snes, &its));
16019566063dSJacob Faibussowitsch         PetscCall(SNESGetLinearSolveIterations(snes, &lits));
16029371c9d4SSatish Balay         ts->snes_its += its;
16039371c9d4SSatish Balay         ts->ksp_its += lits;
16049566063dSJacob Faibussowitsch         PetscCall(TSGetAdapt(ts, &adapt));
16059566063dSJacob Faibussowitsch         PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok));
160696400bd6SLisandro Dalcin         if (!stageok) {
16071be93e3eSJed Brown           /* We are likely rejecting the step because of solver or function domain problems so we should not attempt to
16081be93e3eSJed Brown            * use extrapolation to initialize the solves on the next attempt. */
160996400bd6SLisandro Dalcin           extrapolate = PETSC_FALSE;
16101be93e3eSJed Brown           goto reject_step;
16111be93e3eSJed Brown         }
16128a381b04SJed Brown       }
1613d27334e2SStefano Zampini       if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) {
1614e817cc15SEmil Constantinescu         if (i == 0 && tab->explicit_first_stage) {
1615d27334e2SStefano 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",
1616d27334e2SStefano Zampini                      ((PetscObject)ts)->type_name, ark->tableau->name);
16179566063dSJacob Faibussowitsch           PetscCall(VecCopy(Ydot0, YdotI[0])); /* YdotI = YdotI(tn-1) */
1618e817cc15SEmil Constantinescu         } else {
16199566063dSJacob Faibussowitsch           PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */
1620e817cc15SEmil Constantinescu         }
1621e817cc15SEmil Constantinescu       } else {
16225eca1a21SEmil Constantinescu         if (i == 0 && tab->explicit_first_stage) {
16239566063dSJacob Faibussowitsch           PetscCall(VecZeroEntries(Ydot));
16249566063dSJacob Faibussowitsch           PetscCall(TSComputeIFunction(ts, t + h * ct[i], Y[i], Ydot, YdotI[i], ark->imex)); /* YdotI = -G(t,Y,0)   */
16259566063dSJacob Faibussowitsch           PetscCall(VecScale(YdotI[i], -1.0));
16265eca1a21SEmil Constantinescu         } else {
16279566063dSJacob Faibussowitsch           PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */
16285eca1a21SEmil Constantinescu         }
1629d27334e2SStefano Zampini         if (hasE) {
16304cc180ffSJed Brown           if (ark->imex) {
16319566063dSJacob Faibussowitsch             PetscCall(TSComputeRHSFunction(ts, t + h * c[i], Y[i], YdotRHS[i]));
16324cc180ffSJed Brown           } else {
16339566063dSJacob Faibussowitsch             PetscCall(VecZeroEntries(YdotRHS[i]));
16344cc180ffSJed Brown           }
16358a381b04SJed Brown         }
1636d27334e2SStefano Zampini       }
16379566063dSJacob Faibussowitsch       PetscCall(TSPostStage(ts, ark->stage_time, i, Y));
1638e817cc15SEmil Constantinescu     }
163996400bd6SLisandro Dalcin 
1640be5899b3SLisandro Dalcin     ark->status = TS_STEP_INCOMPLETE;
16419566063dSJacob Faibussowitsch     PetscCall(TSEvaluateStep_ARKIMEX(ts, tab->order, ts->vec_sol, NULL));
1642108c343cSJed Brown     ark->status = TS_STEP_PENDING;
16439566063dSJacob Faibussowitsch     PetscCall(TSGetAdapt(ts, &adapt));
16449566063dSJacob Faibussowitsch     PetscCall(TSAdaptCandidatesClear(adapt));
16459566063dSJacob Faibussowitsch     PetscCall(TSAdaptCandidateAdd(adapt, tab->name, tab->order, 1, tab->ccfl, (PetscReal)tab->s, PETSC_TRUE));
16469566063dSJacob Faibussowitsch     PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept));
164796400bd6SLisandro Dalcin     ark->status = accept ? TS_STEP_COMPLETE : TS_STEP_INCOMPLETE;
164896400bd6SLisandro Dalcin     if (!accept) { /* Roll back the current step */
16499566063dSJacob Faibussowitsch       PetscCall(TSRollBack_ARKIMEX(ts));
1650be5899b3SLisandro Dalcin       ts->time_step = next_time_step;
1651be5899b3SLisandro Dalcin       goto reject_step;
165296400bd6SLisandro Dalcin     }
165396400bd6SLisandro Dalcin 
16548a381b04SJed Brown     ts->ptime += ts->time_step;
1655cdbf8f93SLisandro Dalcin     ts->time_step = next_time_step;
1656108c343cSJed Brown     break;
165796400bd6SLisandro Dalcin 
165896400bd6SLisandro Dalcin   reject_step:
16599371c9d4SSatish Balay     ts->reject++;
16609371c9d4SSatish Balay     accept = PETSC_FALSE;
1661be5899b3SLisandro Dalcin     if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) {
166296400bd6SLisandro Dalcin       ts->reason = TS_DIVERGED_STEP_REJECTED;
166363a3b9bcSJacob Faibussowitsch       PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than current TS allowed, stopping solve\n", ts->steps, rejections));
1664108c343cSJed Brown     }
1665f85781f1SEmil Constantinescu   }
16663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
16678a381b04SJed Brown }
1668d27334e2SStefano Zampini 
166980ab5e31SHong Zhang /*
167080ab5e31SHong Zhang   This adjoint step function assumes the partitioned ODE system has an identity mass matrix and thus can be represented in the form
167180ab5e31SHong Zhang   Udot = H(t,U) + G(t,U)
167280ab5e31SHong Zhang   This corresponds to F(t,U,Udot) = Udot-H(t,U).
167380ab5e31SHong Zhang 
167480ab5e31SHong Zhang   The complete adjoint equations are
167580ab5e31SHong Zhang   (shift*I - dHdu) lambda_s[i]   = 1/at[i][i] (
167680ab5e31SHong Zhang     (b_i dGdU + bt[i] dHdU) lambda_{n+1} + dGdU \sum_{j=i+1}^s a[j][i] lambda_s[j]
167780ab5e31SHong Zhang     + dHdU \sum_{j=i+1}^s at[j][i] lambda_s[j]),  i = s-1,...,0
167880ab5e31SHong Zhang   lambda_n = lambda_{n+1} + \sum_{j=1}^s lambda_s[j]
167980ab5e31SHong Zhang   mu_{n+1}[i]   = h (at[i][i] dHdP lambda_s[i]
168080ab5e31SHong Zhang     + (b_i dGdP + bt[i] dHdP) lambda_{n+1} + dGdP \sum_{j=i+1}^s a[j][i] lambda_s[j]
168180ab5e31SHong Zhang     + dHdP \sum_{j=i+1}^s at[j][i] lambda_s[j]), i = s-1,...,0
168280ab5e31SHong Zhang   mu_n = mu_{n+1} + \sum_{j=1}^s mu_{n+1}[j]
168380ab5e31SHong Zhang   where shift = 1/(at[i][i]*h)
168480ab5e31SHong Zhang 
168580ab5e31SHong Zhang   If at[i][i] is 0, the first equation falls back to
168680ab5e31SHong Zhang   lambda_s[i] = h (
168780ab5e31SHong Zhang     (b_i dGdU + bt[i] dHdU) lambda_{n+1} + dGdU \sum_{j=i+1}^s a[j][i] lambda_s[j]
168880ab5e31SHong Zhang     + dHdU \sum_{j=i+1}^s at[j][i] lambda_s[j])
168980ab5e31SHong Zhang 
169080ab5e31SHong Zhang */
169180ab5e31SHong Zhang static PetscErrorCode TSAdjointStep_ARKIMEX(TS ts)
169280ab5e31SHong Zhang {
169380ab5e31SHong Zhang   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
169480ab5e31SHong Zhang   ARKTableau       tab = ark->tableau;
169580ab5e31SHong Zhang   const PetscInt   s   = tab->s;
169680ab5e31SHong Zhang   const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c, *b = tab->b, *bt = tab->bt;
169780ab5e31SHong Zhang   PetscScalar     *w = ark->work;
169880ab5e31SHong Zhang   Vec             *Y = ark->Y, Ydot = ark->Ydot, *VecsDeltaLam = ark->VecsDeltaLam, *VecsSensiTemp = ark->VecsSensiTemp, *VecsSensiPTemp = ark->VecsSensiPTemp;
169980ab5e31SHong Zhang   Mat              Jex, Jim, Jimpre;
170080ab5e31SHong Zhang   PetscInt         i, j, nadj;
170180ab5e31SHong Zhang   PetscReal        t                 = ts->ptime, stage_time_ex;
170280ab5e31SHong Zhang   PetscReal        adjoint_time_step = -ts->time_step; /* always positive since ts->time_step is negative */
170380ab5e31SHong Zhang   KSP              ksp;
170480ab5e31SHong Zhang 
170580ab5e31SHong Zhang   PetscFunctionBegin;
170680ab5e31SHong Zhang   ark->status = TS_STEP_INCOMPLETE;
170780ab5e31SHong Zhang   PetscCall(SNESGetKSP(ts->snes, &ksp));
170880ab5e31SHong Zhang   PetscCall(TSGetRHSMats_Private(ts, &Jex, NULL));
170980ab5e31SHong Zhang   PetscCall(TSGetIJacobian(ts, &Jim, &Jimpre, NULL, NULL));
171080ab5e31SHong Zhang 
171180ab5e31SHong Zhang   for (i = s - 1; i >= 0; i--) {
171280ab5e31SHong Zhang     ark->stage_time = t - adjoint_time_step * (1.0 - ct[i]);
171380ab5e31SHong Zhang     stage_time_ex   = t - adjoint_time_step * (1.0 - c[i]);
171480ab5e31SHong Zhang     if (At[i * s + i] == 0) { // This stage is explicit
171580ab5e31SHong Zhang       ark->scoeff = 0.;
171680ab5e31SHong Zhang     } else {
171780ab5e31SHong Zhang       ark->scoeff = -1. / At[i * s + i]; // this makes shift=ark->scoeff/ts->time_step positive since ts->time_step is negative
171880ab5e31SHong Zhang     }
171980ab5e31SHong Zhang     PetscCall(TSComputeSNESJacobian(ts, Y[i], Jim, Jimpre));
172080ab5e31SHong Zhang     PetscCall(TSComputeRHSJacobian(ts, stage_time_ex, Y[i], Jex, Jex));
172180ab5e31SHong Zhang     if (ts->vecs_sensip) {
172280ab5e31SHong 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
172380ab5e31SHong Zhang       PetscCall(TSComputeRHSJacobianP(ts, stage_time_ex, Y[i], ts->Jacprhs));                                                 // get dGdP
172480ab5e31SHong Zhang     }
172580ab5e31SHong Zhang     for (nadj = 0; nadj < ts->numcost; nadj++) {
172680ab5e31SHong Zhang       /* Build RHS (stored in VecsDeltaLam) for first-order adjoint */
172780ab5e31SHong Zhang       if (s - i - 1 > 0) {
172880ab5e31SHong Zhang         /* Temp = -\sum_{j=i+1}^s at[j][i] lambda_s[j] */
172980ab5e31SHong Zhang         for (j = i + 1; j < s; j++) w[j - i - 1] = -At[j * s + i];
173080ab5e31SHong Zhang         PetscCall(VecSet(VecsSensiTemp[nadj], 0));
173180ab5e31SHong Zhang         PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1]));
173280ab5e31SHong Zhang         /* (shift I - dHdU) Temp */
173380ab5e31SHong Zhang         PetscCall(MatMultTranspose(Jim, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i]));
173480ab5e31SHong Zhang         /* cancel out shift Temp where shift=-scoeff/h */
173580ab5e31SHong Zhang         PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], ark->scoeff / adjoint_time_step, VecsSensiTemp[nadj]));
173680ab5e31SHong Zhang         if (ts->vecs_sensip) {
173780ab5e31SHong Zhang           /* - dHdP Temp */
173880ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, VecsSensiTemp[nadj], VecsSensiPTemp[nadj]));
173980ab5e31SHong Zhang           /* mu_n += h dHdP Temp */
174080ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], -adjoint_time_step, VecsSensiPTemp[nadj]));
174180ab5e31SHong Zhang         }
174280ab5e31SHong Zhang         /* Temp = \sum_{j=i+1}^s a[j][i] lambda_s[j] */
174380ab5e31SHong Zhang         for (j = i + 1; j < s; j++) w[j - i - 1] = A[j * s + i];
174480ab5e31SHong Zhang         PetscCall(VecSet(VecsSensiTemp[nadj], 0));
174580ab5e31SHong Zhang         PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1]));
174680ab5e31SHong Zhang         /* dGdU Temp */
174780ab5e31SHong Zhang         PetscCall(MatMultTransposeAdd(Jex, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i]));
174880ab5e31SHong Zhang         if (ts->vecs_sensip) {
174980ab5e31SHong Zhang           /* dGdP Temp */
175080ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecsSensiPTemp[nadj]));
175180ab5e31SHong Zhang           /* mu_n += h dGdP Temp */
175280ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj]));
175380ab5e31SHong Zhang         }
175480ab5e31SHong Zhang       } else {
175580ab5e31SHong Zhang         PetscCall(VecSet(VecsDeltaLam[nadj * s + i], 0)); // make sure it is initialized
175680ab5e31SHong Zhang       }
175780ab5e31SHong Zhang       if (bt[i]) { // bt[i] dHdU lambda_{n+1}
175880ab5e31SHong Zhang         /* (shift I - dHdU)^T lambda_{n+1} */
175980ab5e31SHong Zhang         PetscCall(MatMultTranspose(Jim, ts->vecs_sensi[nadj], VecsSensiTemp[nadj]));
176080ab5e31SHong Zhang         /* -bt[i] (shift I - dHdU)^T lambda_{n+1} */
176180ab5e31SHong Zhang         PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], -bt[i], VecsSensiTemp[nadj]));
176280ab5e31SHong Zhang         /* cancel out -bt[i] shift lambda_{n+1} */
176380ab5e31SHong Zhang         PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], -bt[i] * ark->scoeff / adjoint_time_step, ts->vecs_sensi[nadj]));
176480ab5e31SHong Zhang         if (ts->vecs_sensip) {
176580ab5e31SHong Zhang           /* -dHdP lambda_{n+1} */
176680ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, ts->vecs_sensi[nadj], VecsSensiPTemp[nadj]));
176780ab5e31SHong Zhang           /* mu_n += h bt[i] dHdP lambda_{n+1} */
176880ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], -bt[i] * adjoint_time_step, VecsSensiPTemp[nadj]));
176980ab5e31SHong Zhang         }
177080ab5e31SHong Zhang       }
177180ab5e31SHong Zhang       if (b[i]) { // b[i] dGdU lambda_{n+1}
177280ab5e31SHong Zhang         /* dGdU lambda_{n+1} */
177380ab5e31SHong Zhang         PetscCall(MatMultTranspose(Jex, ts->vecs_sensi[nadj], VecsSensiTemp[nadj]));
177480ab5e31SHong Zhang         /* b[i] dGdU lambda_{n+1} */
177580ab5e31SHong Zhang         PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], b[i], VecsSensiTemp[nadj]));
177680ab5e31SHong Zhang         if (ts->vecs_sensip) {
177780ab5e31SHong Zhang           /* dGdP lambda_{n+1} */
177880ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacprhs, ts->vecs_sensi[nadj], VecsSensiPTemp[nadj]));
177980ab5e31SHong Zhang           /* mu_n += h b[i] dGdP lambda_{n+1} */
178080ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], b[i] * adjoint_time_step, VecsSensiPTemp[nadj]));
178180ab5e31SHong Zhang         }
178280ab5e31SHong Zhang       }
178380ab5e31SHong Zhang       /* Build LHS for first-order adjoint */
178480ab5e31SHong Zhang       if (At[i * s + i] == 0) { // This stage is explicit
178580ab5e31SHong Zhang         PetscCall(VecScale(VecsDeltaLam[nadj * s + i], adjoint_time_step));
178680ab5e31SHong Zhang       } else {
178780ab5e31SHong Zhang         KSP                ksp;
178880ab5e31SHong Zhang         KSPConvergedReason kspreason;
178980ab5e31SHong Zhang         PetscCall(SNESGetKSP(ts->snes, &ksp));
179080ab5e31SHong Zhang         PetscCall(KSPSetOperators(ksp, Jim, Jimpre));
179180ab5e31SHong Zhang         PetscCall(VecScale(VecsDeltaLam[nadj * s + i], 1. / At[i * s + i]));
179280ab5e31SHong Zhang         PetscCall(KSPSolveTranspose(ksp, VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i]));
179380ab5e31SHong Zhang         PetscCall(KSPGetConvergedReason(ksp, &kspreason));
179480ab5e31SHong Zhang         if (kspreason < 0) {
179580ab5e31SHong Zhang           ts->reason = TSADJOINT_DIVERGED_LINEAR_SOLVE;
179680ab5e31SHong 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));
179780ab5e31SHong Zhang         }
179880ab5e31SHong Zhang         if (ts->vecs_sensip) {
179980ab5e31SHong Zhang           /* -dHdP lambda_s[i] */
180080ab5e31SHong Zhang           PetscCall(MatMultTranspose(ts->Jacp, VecsDeltaLam[nadj * s + i], VecsSensiPTemp[nadj]));
180180ab5e31SHong Zhang           /* mu_n += h at[i][i] dHdP lambda_s[i] */
180280ab5e31SHong Zhang           PetscCall(VecAXPY(ts->vecs_sensip[nadj], -At[i * s + i] * adjoint_time_step, VecsSensiPTemp[nadj]));
180380ab5e31SHong Zhang         }
180480ab5e31SHong Zhang       }
180580ab5e31SHong Zhang     }
180680ab5e31SHong Zhang   }
180780ab5e31SHong Zhang   for (j = 0; j < s; j++) w[j] = 1.0;
180880ab5e31SHong Zhang   for (nadj = 0; nadj < ts->numcost; nadj++) // no need to do this for mu's
180980ab5e31SHong Zhang     PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s]));
181080ab5e31SHong Zhang   ark->status = TS_STEP_COMPLETE;
181180ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
181280ab5e31SHong Zhang }
18138a381b04SJed Brown 
1814d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSInterpolate_ARKIMEX(TS ts, PetscReal itime, Vec X)
1815d71ae5a4SJacob Faibussowitsch {
1816cd652676SJed Brown   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
1817d27334e2SStefano Zampini   ARKTableau       tab = ark->tableau;
1818d27334e2SStefano Zampini   PetscInt         s = tab->s, pinterp = tab->pinterp, i, j;
1819108c343cSJed Brown   PetscReal        h;
1820108c343cSJed Brown   PetscReal        tt, t;
1821d27334e2SStefano Zampini   PetscScalar     *bt = ark->work, *b = ark->work + s;
1822d27334e2SStefano Zampini   const PetscReal *Bt = tab->binterpt, *B = tab->binterp;
1823cd652676SJed Brown 
1824cd652676SJed Brown   PetscFunctionBegin;
1825d27334e2SStefano 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);
1826108c343cSJed Brown   switch (ark->status) {
1827108c343cSJed Brown   case TS_STEP_INCOMPLETE:
1828108c343cSJed Brown   case TS_STEP_PENDING:
1829108c343cSJed Brown     h = ts->time_step;
1830108c343cSJed Brown     t = (itime - ts->ptime) / h;
1831108c343cSJed Brown     break;
1832108c343cSJed Brown   case TS_STEP_COMPLETE:
1833be5899b3SLisandro Dalcin     h = ts->ptime - ts->ptime_prev;
1834108c343cSJed Brown     t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */
1835108c343cSJed Brown     break;
1836d71ae5a4SJacob Faibussowitsch   default:
1837d71ae5a4SJacob Faibussowitsch     SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus");
1838108c343cSJed Brown   }
1839cd652676SJed Brown   for (i = 0; i < s; i++) bt[i] = b[i] = 0;
18404f385281SJed Brown   for (j = 0, tt = t; j < pinterp; j++, tt *= t) {
1841cd652676SJed Brown     for (i = 0; i < s; i++) {
1842c1758d98SDebojyoti Ghosh       bt[i] += h * Bt[i * pinterp + j] * tt;
1843108c343cSJed Brown       b[i] += h * B[i * pinterp + j] * tt;
1844cd652676SJed Brown     }
1845cd652676SJed Brown   }
18469566063dSJacob Faibussowitsch   PetscCall(VecCopy(ark->Y[0], X));
18479566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(X, s, bt, ark->YdotI));
1848d27334e2SStefano Zampini   if (tab->additive) {
1849d27334e2SStefano Zampini     PetscBool hasE;
1850d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1851d27334e2SStefano Zampini     if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS));
1852d27334e2SStefano Zampini   }
18533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1854cd652676SJed Brown }
1855cd652676SJed Brown 
1856d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSExtrapolate_ARKIMEX(TS ts, PetscReal c, Vec X)
1857d71ae5a4SJacob Faibussowitsch {
185856dcabbaSDebojyoti Ghosh   TS_ARKIMEX      *ark = (TS_ARKIMEX *)ts->data;
1859d27334e2SStefano Zampini   ARKTableau       tab = ark->tableau;
1860d27334e2SStefano Zampini   PetscInt         s = tab->s, pinterp = tab->pinterp, i, j;
1861be5899b3SLisandro Dalcin   PetscReal        h, h_prev, t, tt;
1862d27334e2SStefano Zampini   PetscScalar     *bt = ark->work, *b = ark->work + s;
1863d27334e2SStefano Zampini   const PetscReal *Bt = tab->binterpt, *B = tab->binterp;
186456dcabbaSDebojyoti Ghosh 
186556dcabbaSDebojyoti Ghosh   PetscFunctionBegin;
18663c633725SBarry Smith   PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name);
186781d12688SDebojyoti Ghosh   h      = ts->time_step;
1868be5899b3SLisandro Dalcin   h_prev = ts->ptime - ts->ptime_prev;
1869be5899b3SLisandro Dalcin   t      = 1 + h / h_prev * c;
1870d27334e2SStefano Zampini   for (i = 0; i < s; i++) bt[i] = b[i] = 0;
187156dcabbaSDebojyoti Ghosh   for (j = 0, tt = t; j < pinterp; j++, tt *= t) {
187256dcabbaSDebojyoti Ghosh     for (i = 0; i < s; i++) {
187381d12688SDebojyoti Ghosh       bt[i] += h * Bt[i * pinterp + j] * tt;
187456dcabbaSDebojyoti Ghosh       b[i] += h * B[i * pinterp + j] * tt;
187556dcabbaSDebojyoti Ghosh     }
187656dcabbaSDebojyoti Ghosh   }
18773c633725SBarry Smith   PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous step have not been stored");
18789566063dSJacob Faibussowitsch   PetscCall(VecCopy(ark->Y_prev[0], X));
18799566063dSJacob Faibussowitsch   PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev));
1880d27334e2SStefano Zampini   if (tab->additive) {
1881d27334e2SStefano Zampini     PetscBool hasE;
1882d27334e2SStefano Zampini     PetscCall(TSHasRHSFunction(ts, &hasE));
1883d27334e2SStefano Zampini     if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev));
1884d27334e2SStefano Zampini   }
18853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
188656dcabbaSDebojyoti Ghosh }
188756dcabbaSDebojyoti Ghosh 
1888d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauReset(TS ts)
1889d71ae5a4SJacob Faibussowitsch {
189096400bd6SLisandro Dalcin   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
189196400bd6SLisandro Dalcin   ARKTableau  tab = ark->tableau;
189296400bd6SLisandro Dalcin 
189396400bd6SLisandro Dalcin   PetscFunctionBegin;
18943ba16761SJacob Faibussowitsch   if (!tab) PetscFunctionReturn(PETSC_SUCCESS);
18959566063dSJacob Faibussowitsch   PetscCall(PetscFree(ark->work));
18969566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->Y));
18979566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotI));
18989566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS));
18999566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev));
19009566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev));
19019566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev));
19023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
190396400bd6SLisandro Dalcin }
190496400bd6SLisandro Dalcin 
1905d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSReset_ARKIMEX(TS ts)
1906d71ae5a4SJacob Faibussowitsch {
19078a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
19088a381b04SJed Brown 
19098a381b04SJed Brown   PetscFunctionBegin;
19109566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXTableauReset(ts));
19119566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Ydot));
19129566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Ydot0));
19139566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ark->Z));
19143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19158a381b04SJed Brown }
19168a381b04SJed Brown 
191780ab5e31SHong Zhang static PetscErrorCode TSAdjointReset_ARKIMEX(TS ts)
191880ab5e31SHong Zhang {
191980ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
192080ab5e31SHong Zhang   ARKTableau  tab = ark->tableau;
192180ab5e31SHong Zhang 
192280ab5e31SHong Zhang   PetscFunctionBegin;
192380ab5e31SHong Zhang   PetscCall(VecDestroyVecs(tab->s * ts->numcost, &ark->VecsDeltaLam));
192480ab5e31SHong Zhang   PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiTemp));
192580ab5e31SHong Zhang   PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiPTemp));
192680ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
192780ab5e31SHong Zhang }
192880ab5e31SHong Zhang 
1929d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetVecs(TS ts, DM dm, Vec *Z, Vec *Ydot)
1930d71ae5a4SJacob Faibussowitsch {
1931d5e6173cSPeter Brune   TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data;
1932d5e6173cSPeter Brune 
1933d5e6173cSPeter Brune   PetscFunctionBegin;
1934d5e6173cSPeter Brune   if (Z) {
1935d5e6173cSPeter Brune     if (dm && dm != ts->dm) {
19369566063dSJacob Faibussowitsch       PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Z", Z));
1937d5e6173cSPeter Brune     } else *Z = ax->Z;
1938d5e6173cSPeter Brune   }
1939d5e6173cSPeter Brune   if (Ydot) {
1940d5e6173cSPeter Brune     if (dm && dm != ts->dm) {
19419566063dSJacob Faibussowitsch       PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot));
1942d5e6173cSPeter Brune     } else *Ydot = ax->Ydot;
1943d5e6173cSPeter Brune   }
19443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1945d5e6173cSPeter Brune }
1946d5e6173cSPeter Brune 
1947d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXRestoreVecs(TS ts, DM dm, Vec *Z, Vec *Ydot)
1948d71ae5a4SJacob Faibussowitsch {
1949d5e6173cSPeter Brune   PetscFunctionBegin;
1950d5e6173cSPeter Brune   if (Z) {
195148a46eb9SPierre Jolivet     if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Z", Z));
1952d5e6173cSPeter Brune   }
1953d5e6173cSPeter Brune   if (Ydot) {
195448a46eb9SPierre Jolivet     if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot));
1955d5e6173cSPeter Brune   }
19563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1957d5e6173cSPeter Brune }
1958d5e6173cSPeter Brune 
19598a381b04SJed Brown /*
19608a381b04SJed Brown   This defines the nonlinear equation that is to be solved with SNES
19618a381b04SJed Brown   G(U) = F[t0+Theta*dt, U, (U-U0)*shift] = 0
19628a381b04SJed Brown */
1963d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormFunction_ARKIMEX(SNES snes, Vec X, Vec F, TS ts)
1964d71ae5a4SJacob Faibussowitsch {
19658a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1966d5e6173cSPeter Brune   DM          dm, dmsave;
1967d5e6173cSPeter Brune   Vec         Z, Ydot;
1968b296d7d5SJed Brown   PetscReal   shift = ark->scoeff / ts->time_step;
19698a381b04SJed Brown 
19708a381b04SJed Brown   PetscFunctionBegin;
19719566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes, &dm));
19729566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot));
1973d5e6173cSPeter Brune   dmsave = ts->dm;
1974d5e6173cSPeter Brune   ts->dm = dm;
1975740132f1SEmil Constantinescu 
1976d27334e2SStefano Zampini   if (ark->scoeff == 0.0) {
1977d27334e2SStefano Zampini     /* We are solving F(t,x_n,xdot) = 0 to start the method */
1978d27334e2SStefano Zampini     PetscCall(TSComputeIFunction(ts, ark->stage_time, Z, X, F, ark->imex));
1979d27334e2SStefano Zampini   } else {
1980d27334e2SStefano Zampini     PetscCall(VecAXPBYPCZ(Ydot, -shift, shift, 0, Z, X)); /* Ydot = shift*(X-Z) */
19819566063dSJacob Faibussowitsch     PetscCall(TSComputeIFunction(ts, ark->stage_time, X, Ydot, F, ark->imex));
1982d27334e2SStefano Zampini   }
1983e817cc15SEmil Constantinescu 
1984d5e6173cSPeter Brune   ts->dm = dmsave;
19859566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot));
19863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19878a381b04SJed Brown }
19888a381b04SJed Brown 
1989d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormJacobian_ARKIMEX(SNES snes, Vec X, Mat A, Mat B, TS ts)
1990d71ae5a4SJacob Faibussowitsch {
19918a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
1992d5e6173cSPeter Brune   DM          dm, dmsave;
1993d27334e2SStefano Zampini   Vec         Ydot, Z;
1994b296d7d5SJed Brown   PetscReal   shift = ark->scoeff / ts->time_step;
19958a381b04SJed Brown 
19968a381b04SJed Brown   PetscFunctionBegin;
19979566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes, &dm));
1998d27334e2SStefano Zampini   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot));
19998a381b04SJed Brown   /* ark->Ydot has already been computed in SNESTSFormFunction_ARKIMEX (SNES guarantees this) */
2000d5e6173cSPeter Brune   dmsave = ts->dm;
2001d5e6173cSPeter Brune   ts->dm = dm;
2002740132f1SEmil Constantinescu 
2003d27334e2SStefano Zampini   if (ark->scoeff == 0.0) {
2004d27334e2SStefano Zampini     /* We are solving F(t,x_n,xdot) = 0 to start the method, we only only dF/dXdot
2005d27334e2SStefano Zampini        Jed's proposal is to compute with a very large shift and scale back the matrix */
2006d27334e2SStefano Zampini     shift = 1.0 / PETSC_MACHINE_EPSILON;
2007d27334e2SStefano Zampini     PetscCall(TSComputeIJacobian(ts, ark->stage_time, Z, X, shift, A, B, ark->imex));
2008d27334e2SStefano Zampini     PetscCall(MatScale(B, PETSC_MACHINE_EPSILON));
2009d27334e2SStefano Zampini     if (A != B) PetscCall(MatScale(A, PETSC_MACHINE_EPSILON));
2010d27334e2SStefano Zampini   } else {
20119566063dSJacob Faibussowitsch     PetscCall(TSComputeIJacobian(ts, ark->stage_time, X, Ydot, shift, A, B, ark->imex));
2012d27334e2SStefano Zampini   }
2013d5e6173cSPeter Brune   ts->dm = dmsave;
2014d27334e2SStefano Zampini   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot));
20153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2016d5e6173cSPeter Brune }
2017d5e6173cSPeter Brune 
201880ab5e31SHong Zhang static PetscErrorCode TSGetStages_ARKIMEX(TS ts, PetscInt *ns, Vec *Y[])
201980ab5e31SHong Zhang {
202080ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
202180ab5e31SHong Zhang 
202280ab5e31SHong Zhang   PetscFunctionBegin;
202380ab5e31SHong Zhang   if (ns) *ns = ark->tableau->s;
202480ab5e31SHong Zhang   if (Y) *Y = ark->Y;
202580ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
202680ab5e31SHong Zhang }
202780ab5e31SHong Zhang 
2028d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_TSARKIMEX(DM fine, DM coarse, void *ctx)
2029d71ae5a4SJacob Faibussowitsch {
2030d5e6173cSPeter Brune   PetscFunctionBegin;
20313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2032d5e6173cSPeter Brune }
2033d5e6173cSPeter Brune 
2034d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_TSARKIMEX(DM fine, Mat restrct, Vec rscale, Mat inject, DM coarse, void *ctx)
2035d71ae5a4SJacob Faibussowitsch {
2036d5e6173cSPeter Brune   TS  ts = (TS)ctx;
2037d5e6173cSPeter Brune   Vec Z, Z_c;
2038d5e6173cSPeter Brune 
2039d5e6173cSPeter Brune   PetscFunctionBegin;
20409566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, fine, &Z, NULL));
20419566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, coarse, &Z_c, NULL));
20429566063dSJacob Faibussowitsch   PetscCall(MatRestrict(restrct, Z, Z_c));
20439566063dSJacob Faibussowitsch   PetscCall(VecPointwiseMult(Z_c, rscale, Z_c));
20449566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, fine, &Z, NULL));
20459566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, coarse, &Z_c, NULL));
20463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20478a381b04SJed Brown }
20488a381b04SJed Brown 
2049d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_TSARKIMEX(DM dm, DM subdm, void *ctx)
2050d71ae5a4SJacob Faibussowitsch {
2051cdb298fcSPeter Brune   PetscFunctionBegin;
20523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2053cdb298fcSPeter Brune }
2054cdb298fcSPeter Brune 
2055d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_TSARKIMEX(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx)
2056d71ae5a4SJacob Faibussowitsch {
2057cdb298fcSPeter Brune   TS  ts = (TS)ctx;
2058cdb298fcSPeter Brune   Vec Z, Z_c;
2059cdb298fcSPeter Brune 
2060cdb298fcSPeter Brune   PetscFunctionBegin;
20619566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, NULL));
20629566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXGetVecs(ts, subdm, &Z_c, NULL));
2063cdb298fcSPeter Brune 
20649566063dSJacob Faibussowitsch   PetscCall(VecScatterBegin(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD));
20659566063dSJacob Faibussowitsch   PetscCall(VecScatterEnd(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD));
2066cdb298fcSPeter Brune 
20679566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, NULL));
20689566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXRestoreVecs(ts, subdm, &Z_c, NULL));
20693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2070cdb298fcSPeter Brune }
2071cdb298fcSPeter Brune 
2072d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauSetUp(TS ts)
2073d71ae5a4SJacob Faibussowitsch {
207496400bd6SLisandro Dalcin   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
207596400bd6SLisandro Dalcin   ARKTableau  tab = ark->tableau;
207696400bd6SLisandro Dalcin 
207796400bd6SLisandro Dalcin   PetscFunctionBegin;
2078d27334e2SStefano Zampini   PetscCall(PetscMalloc1(2 * tab->s, &ark->work));
20799566063dSJacob Faibussowitsch   PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y));
20809566063dSJacob Faibussowitsch   PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI));
2081d27334e2SStefano Zampini   if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS));
208296400bd6SLisandro Dalcin   if (ark->extrapolate) {
20839566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev));
20849566063dSJacob Faibussowitsch     PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev));
2085d27334e2SStefano Zampini     if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev));
208696400bd6SLisandro Dalcin   }
20873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
208896400bd6SLisandro Dalcin }
208996400bd6SLisandro Dalcin 
2090d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetUp_ARKIMEX(TS ts)
2091d71ae5a4SJacob Faibussowitsch {
20928a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2093d5e6173cSPeter Brune   DM          dm;
209496400bd6SLisandro Dalcin   SNES        snes;
2095f9c1d6abSBarry Smith 
20968a381b04SJed Brown   PetscFunctionBegin;
20979566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXTableauSetUp(ts));
20989566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot));
20999566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot0));
21009566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(ts->vec_sol, &ark->Z));
21019566063dSJacob Faibussowitsch   PetscCall(TSGetDM(ts, &dm));
21029566063dSJacob Faibussowitsch   PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts));
21039566063dSJacob Faibussowitsch   PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts));
21049566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts, &snes));
21053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21068a381b04SJed Brown }
21078a381b04SJed Brown 
210880ab5e31SHong Zhang static PetscErrorCode TSAdjointSetUp_ARKIMEX(TS ts)
210980ab5e31SHong Zhang {
211080ab5e31SHong Zhang   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
211180ab5e31SHong Zhang   ARKTableau  tab = ark->tableau;
211280ab5e31SHong Zhang 
211380ab5e31SHong Zhang   PetscFunctionBegin;
211480ab5e31SHong Zhang   PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], tab->s * ts->numcost, &ark->VecsDeltaLam));
211580ab5e31SHong Zhang   PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &ark->VecsSensiTemp));
211680ab5e31SHong Zhang   if (ts->vecs_sensip) { PetscCall(VecDuplicateVecs(ts->vecs_sensip[0], ts->numcost, &ark->VecsSensiPTemp)); }
211780ab5e31SHong Zhang   if (PetscDefined(USE_DEBUG)) {
211880ab5e31SHong Zhang     PetscBool id = PETSC_FALSE;
211980ab5e31SHong Zhang     PetscCall(TSARKIMEXTestMassIdentity(ts, &id));
2120d27334e2SStefano Zampini     PetscCheck(id, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "Adjoint ARKIMEX requires an identity mass matrix, however the TSIFunction you provided does not utilize an identity mass matrix");
212180ab5e31SHong Zhang   }
212280ab5e31SHong Zhang   PetscFunctionReturn(PETSC_SUCCESS);
212380ab5e31SHong Zhang }
212480ab5e31SHong Zhang 
2125d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetFromOptions_ARKIMEX(TS ts, PetscOptionItems *PetscOptionsObject)
2126d71ae5a4SJacob Faibussowitsch {
21274cc180ffSJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2128d27334e2SStefano Zampini   PetscBool   dirk;
21298a381b04SJed Brown 
21308a381b04SJed Brown   PetscFunctionBegin;
2131d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
2132d27334e2SStefano Zampini   PetscOptionsHeadBegin(PetscOptionsObject, dirk ? "DIRK ODE solver options" : "ARKIMEX ODE solver options");
21338a381b04SJed Brown   {
21348a381b04SJed Brown     ARKTableauLink link;
21358a381b04SJed Brown     PetscInt       count, choice;
21368a381b04SJed Brown     PetscBool      flg;
21378a381b04SJed Brown     const char   **namelist;
2138d27334e2SStefano Zampini     for (link = ARKTableauList, count = 0; link; link = link->next) {
2139d27334e2SStefano Zampini       if (!dirk && link->tab.additive) count++;
2140d27334e2SStefano Zampini       if (dirk && !link->tab.additive) count++;
2141d27334e2SStefano Zampini     }
21429566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(count, (char ***)&namelist));
2143d27334e2SStefano Zampini     for (link = ARKTableauList, count = 0; link; link = link->next) {
2144d27334e2SStefano Zampini       if (!dirk && link->tab.additive) namelist[count++] = link->tab.name;
2145d27334e2SStefano Zampini       if (dirk && !link->tab.additive) namelist[count++] = link->tab.name;
2146d27334e2SStefano Zampini     }
2147d27334e2SStefano Zampini     if (dirk) {
2148d27334e2SStefano Zampini       PetscCall(PetscOptionsEList("-ts_dirk_type", "Family of DIRK method", "TSDIRKSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg));
2149d27334e2SStefano Zampini       if (flg) PetscCall(TSDIRKSetType(ts, namelist[choice]));
2150d27334e2SStefano Zampini     } else {
21519566063dSJacob Faibussowitsch       PetscCall(PetscOptionsEList("-ts_arkimex_type", "Family of ARK IMEX method", "TSARKIMEXSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg));
21529566063dSJacob Faibussowitsch       if (flg) PetscCall(TSARKIMEXSetType(ts, namelist[choice]));
21534cc180ffSJed Brown       flg = (PetscBool)!ark->imex;
21549566063dSJacob Faibussowitsch       PetscCall(PetscOptionsBool("-ts_arkimex_fully_implicit", "Solve the problem fully implicitly", "TSARKIMEXSetFullyImplicit", flg, &flg, NULL));
21554cc180ffSJed Brown       ark->imex = (PetscBool)!flg;
2156d27334e2SStefano Zampini     }
2157d27334e2SStefano Zampini     PetscCall(PetscFree(namelist));
21589566063dSJacob 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));
21598a381b04SJed Brown   }
2160d0609cedSBarry Smith   PetscOptionsHeadEnd();
21613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21628a381b04SJed Brown }
21638a381b04SJed Brown 
2164d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSView_ARKIMEX(TS ts, PetscViewer viewer)
2165d71ae5a4SJacob Faibussowitsch {
21668a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2167d27334e2SStefano Zampini   PetscBool   iascii, dirk;
21688a381b04SJed Brown 
21698a381b04SJed Brown   PetscFunctionBegin;
2170d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
21719566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
21728a381b04SJed Brown   if (iascii) {
2173d27334e2SStefano Zampini     PetscViewerFormat format;
21749c334d8fSLisandro Dalcin     ARKTableau        tab = ark->tableau;
217519fd82e9SBarry Smith     TSARKIMEXType     arktype;
2176d27334e2SStefano Zampini     char              buf[2048];
21773a28c0e5SStefano Zampini     PetscBool         flg;
21783a28c0e5SStefano Zampini 
21799566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXGetType(ts, &arktype));
21809566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXGetFullyImplicit(ts, &flg));
2181d27334e2SStefano Zampini     PetscCall(PetscViewerASCIIPrintf(viewer, "  %s %s\n", dirk ? "DIRK" : "ARK IMEX", arktype));
21829566063dSJacob Faibussowitsch     PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->ct));
2183d27334e2SStefano Zampini     PetscCall(PetscViewerASCIIPrintf(viewer, "  %sabscissa       ct = %s\n", dirk ? "" : "Stiff ", buf));
2184d27334e2SStefano Zampini     PetscCall(PetscViewerGetFormat(viewer, &format));
2185d27334e2SStefano Zampini     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
2186d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sAt =\n", dirk ? "" : "Stiff "));
2187d27334e2SStefano Zampini       for (PetscInt i = 0; i < tab->s; i++) {
2188d27334e2SStefano Zampini         PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->At + i * tab->s));
2189d27334e2SStefano Zampini         PetscCall(PetscViewerASCIIPrintf(viewer, "    %s\n", buf));
2190d27334e2SStefano Zampini       }
2191d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bt));
2192d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sbt = %s\n", dirk ? "" : "Stiff ", buf));
2193d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bembedt));
2194d27334e2SStefano Zampini       PetscCall(PetscViewerASCIIPrintf(viewer, "  %sbet = %s\n", dirk ? "" : "Stiff ", buf));
2195d27334e2SStefano Zampini     }
21969566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fully implicit: %s\n", flg ? "yes" : "no"));
21979566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Stiffly accurate: %s\n", tab->stiffly_accurate ? "yes" : "no"));
21989566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Explicit first stage: %s\n", tab->explicit_first_stage ? "yes" : "no"));
21999566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "FSAL property: %s\n", tab->FSAL_implicit ? "yes" : "no"));
2200d27334e2SStefano Zampini     if (!dirk) {
2201d27334e2SStefano Zampini       PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->c));
22029566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  Nonstiff abscissa     c = %s\n", buf));
22038a381b04SJed Brown     }
2204d27334e2SStefano Zampini   }
22053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22068a381b04SJed Brown }
22078a381b04SJed Brown 
2208d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSLoad_ARKIMEX(TS ts, PetscViewer viewer)
2209d71ae5a4SJacob Faibussowitsch {
2210f2c2a1b9SBarry Smith   SNES    snes;
22119c334d8fSLisandro Dalcin   TSAdapt adapt;
2212f2c2a1b9SBarry Smith 
2213f2c2a1b9SBarry Smith   PetscFunctionBegin;
22149566063dSJacob Faibussowitsch   PetscCall(TSGetAdapt(ts, &adapt));
22159566063dSJacob Faibussowitsch   PetscCall(TSAdaptLoad(adapt, viewer));
22169566063dSJacob Faibussowitsch   PetscCall(TSGetSNES(ts, &snes));
22179566063dSJacob Faibussowitsch   PetscCall(SNESLoad(snes, viewer));
2218ad6bc421SBarry Smith   /* function and Jacobian context for SNES when used with TS is always ts object */
22199566063dSJacob Faibussowitsch   PetscCall(SNESSetFunction(snes, NULL, NULL, ts));
22209566063dSJacob Faibussowitsch   PetscCall(SNESSetJacobian(snes, NULL, NULL, NULL, ts));
22213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2222f2c2a1b9SBarry Smith }
2223f2c2a1b9SBarry Smith 
22248a381b04SJed Brown /*@C
2225bcf0153eSBarry Smith   TSARKIMEXSetType - Set the type of `TSARKIMEX` scheme
22268a381b04SJed Brown 
222720f4b53cSBarry Smith   Logically Collective
22288a381b04SJed Brown 
2229d8d19677SJose E. Roman   Input Parameters:
22308a381b04SJed Brown + ts      - timestepping context
2231bcf0153eSBarry Smith - arktype - type of `TSARKIMEX` scheme
22328a381b04SJed Brown 
2233bcf0153eSBarry Smith   Options Database Key:
2234bcf0153eSBarry Smith . -ts_arkimex_type <1bee,a2,l2,ars122,2c,2d,2e,prssp2,3,bpr3,ars443,4,5> - set `TSARKIMEX` scheme type
22359bd3e852SBarry Smith 
22368a381b04SJed Brown   Level: intermediate
22378a381b04SJed Brown 
22381cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEX1BEE`, `TSARKIMEXA2`, `TSARKIMEXL2`, `TSARKIMEXARS122`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEXPRSSP2`,
2239db781477SPatrick Sanan           `TSARKIMEX3`, `TSARKIMEXBPR3`, `TSARKIMEXARS443`, `TSARKIMEX4`, `TSARKIMEX5`
22408a381b04SJed Brown @*/
2241d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetType(TS ts, TSARKIMEXType arktype)
2242d71ae5a4SJacob Faibussowitsch {
22438a381b04SJed Brown   PetscFunctionBegin;
22448a381b04SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22454f572ea9SToby Isaac   PetscAssertPointer(arktype, 2);
2246cac4c232SBarry Smith   PetscTryMethod(ts, "TSARKIMEXSetType_C", (TS, TSARKIMEXType), (ts, arktype));
22473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22488a381b04SJed Brown }
22498a381b04SJed Brown 
22508a381b04SJed Brown /*@C
2251bcf0153eSBarry Smith   TSARKIMEXGetType - Get the type of `TSARKIMEX` scheme
22528a381b04SJed Brown 
225320f4b53cSBarry Smith   Logically Collective
22548a381b04SJed Brown 
22558a381b04SJed Brown   Input Parameter:
22568a381b04SJed Brown . ts - timestepping context
22578a381b04SJed Brown 
22588a381b04SJed Brown   Output Parameter:
2259bcf0153eSBarry Smith . arktype - type of `TSARKIMEX` scheme
22608a381b04SJed Brown 
22618a381b04SJed Brown   Level: intermediate
22628a381b04SJed Brown 
226342747ad1SJacob Faibussowitsch .seealso: [](ch_ts), `TSARKIMEXc`
22648a381b04SJed Brown @*/
2265d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetType(TS ts, TSARKIMEXType *arktype)
2266d71ae5a4SJacob Faibussowitsch {
22678a381b04SJed Brown   PetscFunctionBegin;
22688a381b04SJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2269cac4c232SBarry Smith   PetscUseMethod(ts, "TSARKIMEXGetType_C", (TS, TSARKIMEXType *), (ts, arktype));
22703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22718a381b04SJed Brown }
22728a381b04SJed Brown 
227316353aafSBarry Smith /*@
2274bcf0153eSBarry Smith   TSARKIMEXSetFullyImplicit - Solve both parts of the equation implicitly, including the part that is normally solved explicitly
22754cc180ffSJed Brown 
227620f4b53cSBarry Smith   Logically Collective
22774cc180ffSJed Brown 
2278d8d19677SJose E. Roman   Input Parameters:
22794cc180ffSJed Brown + ts  - timestepping context
2280bcf0153eSBarry Smith - flg - `PETSC_TRUE` for fully implicit
22814cc180ffSJed Brown 
22824cc180ffSJed Brown   Level: intermediate
22834cc180ffSJed Brown 
22841cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXGetType()`, `TSARKIMEXGetFullyImplicit()`
22854cc180ffSJed Brown @*/
2286d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetFullyImplicit(TS ts, PetscBool flg)
2287d71ae5a4SJacob Faibussowitsch {
22884cc180ffSJed Brown   PetscFunctionBegin;
22894cc180ffSJed Brown   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
22903a28c0e5SStefano Zampini   PetscValidLogicalCollectiveBool(ts, flg, 2);
2291cac4c232SBarry Smith   PetscTryMethod(ts, "TSARKIMEXSetFullyImplicit_C", (TS, PetscBool), (ts, flg));
22923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22934cc180ffSJed Brown }
22944cc180ffSJed Brown 
22953a28c0e5SStefano Zampini /*@
22963a28c0e5SStefano Zampini   TSARKIMEXGetFullyImplicit - Inquires if both parts of the equation are solved implicitly
22973a28c0e5SStefano Zampini 
229820f4b53cSBarry Smith   Logically Collective
22993a28c0e5SStefano Zampini 
23003a28c0e5SStefano Zampini   Input Parameter:
23013a28c0e5SStefano Zampini . ts - timestepping context
23023a28c0e5SStefano Zampini 
23037a7aea1fSJed Brown   Output Parameter:
2304bcf0153eSBarry Smith . flg - `PETSC_TRUE` for fully implicit
23053a28c0e5SStefano Zampini 
23063a28c0e5SStefano Zampini   Level: intermediate
23073a28c0e5SStefano Zampini 
23081cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`
23093a28c0e5SStefano Zampini @*/
2310d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetFullyImplicit(TS ts, PetscBool *flg)
2311d71ae5a4SJacob Faibussowitsch {
23123a28c0e5SStefano Zampini   PetscFunctionBegin;
23133a28c0e5SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
23144f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
2315cac4c232SBarry Smith   PetscUseMethod(ts, "TSARKIMEXGetFullyImplicit_C", (TS, PetscBool *), (ts, flg));
23163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23173a28c0e5SStefano Zampini }
23183a28c0e5SStefano Zampini 
2319d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetType_ARKIMEX(TS ts, TSARKIMEXType *arktype)
2320d71ae5a4SJacob Faibussowitsch {
23218a381b04SJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
23228a381b04SJed Brown 
23238a381b04SJed Brown   PetscFunctionBegin;
23248a381b04SJed Brown   *arktype = ark->tableau->name;
23253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23268a381b04SJed Brown }
2327d27334e2SStefano Zampini 
2328d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetType_ARKIMEX(TS ts, TSARKIMEXType arktype)
2329d71ae5a4SJacob Faibussowitsch {
23308a381b04SJed Brown   TS_ARKIMEX    *ark = (TS_ARKIMEX *)ts->data;
23318a381b04SJed Brown   PetscBool      match;
23328a381b04SJed Brown   ARKTableauLink link;
23338a381b04SJed Brown 
23348a381b04SJed Brown   PetscFunctionBegin;
23358a381b04SJed Brown   if (ark->tableau) {
23369566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(ark->tableau->name, arktype, &match));
23373ba16761SJacob Faibussowitsch     if (match) PetscFunctionReturn(PETSC_SUCCESS);
23388a381b04SJed Brown   }
23398a381b04SJed Brown   for (link = ARKTableauList; link; link = link->next) {
23409566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(link->tab.name, arktype, &match));
23418a381b04SJed Brown     if (match) {
23429566063dSJacob Faibussowitsch       if (ts->setupcalled) PetscCall(TSARKIMEXTableauReset(ts));
23438a381b04SJed Brown       ark->tableau = &link->tab;
23449566063dSJacob Faibussowitsch       if (ts->setupcalled) PetscCall(TSARKIMEXTableauSetUp(ts));
23452ffb9264SLisandro Dalcin       ts->default_adapt_type = ark->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE;
23463ba16761SJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
23478a381b04SJed Brown     }
23488a381b04SJed Brown   }
234998921bdaSJacob Faibussowitsch   SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", arktype);
23508a381b04SJed Brown }
2351e0877f53SBarry Smith 
2352d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetFullyImplicit_ARKIMEX(TS ts, PetscBool flg)
2353d71ae5a4SJacob Faibussowitsch {
23544cc180ffSJed Brown   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
23554cc180ffSJed Brown 
23564cc180ffSJed Brown   PetscFunctionBegin;
23574cc180ffSJed Brown   ark->imex = (PetscBool)!flg;
23583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23594cc180ffSJed Brown }
23608a381b04SJed Brown 
2361d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetFullyImplicit_ARKIMEX(TS ts, PetscBool *flg)
2362d71ae5a4SJacob Faibussowitsch {
23633a28c0e5SStefano Zampini   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
23643a28c0e5SStefano Zampini 
23653a28c0e5SStefano Zampini   PetscFunctionBegin;
23663a28c0e5SStefano Zampini   *flg = (PetscBool)!ark->imex;
23673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23683a28c0e5SStefano Zampini }
23693a28c0e5SStefano Zampini 
2370d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSDestroy_ARKIMEX(TS ts)
2371d71ae5a4SJacob Faibussowitsch {
2372b3a6b972SJed Brown   PetscFunctionBegin;
23739566063dSJacob Faibussowitsch   PetscCall(TSReset_ARKIMEX(ts));
2374b3a6b972SJed Brown   if (ts->dm) {
23759566063dSJacob Faibussowitsch     PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts));
23769566063dSJacob Faibussowitsch     PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts));
2377b3a6b972SJed Brown   }
23789566063dSJacob Faibussowitsch   PetscCall(PetscFree(ts->data));
2379d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", NULL));
2380d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", NULL));
23819566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", NULL));
23829566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", NULL));
23839566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", NULL));
23842e956fe4SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", NULL));
23853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2386b3a6b972SJed Brown }
2387b3a6b972SJed Brown 
23888a381b04SJed Brown /* ------------------------------------------------------------ */
23898a381b04SJed Brown /*MC
2390c79dcfbdSBarry Smith       TSARKIMEX - ODE and DAE solver using additive Runge-Kutta IMEX schemes
23918a381b04SJed Brown 
2392fca742c7SJed Brown   These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly
2393fca742c7SJed Brown   nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part
2394bcf0153eSBarry Smith   of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`.
2395d0685a90SJed Brown 
23968a381b04SJed Brown   Level: beginner
23978a381b04SJed Brown 
2398bcf0153eSBarry Smith   Notes:
2399bcf0153eSBarry Smith   The default is `TSARKIMEX3`, it can be changed with `TSARKIMEXSetType()` or -ts_arkimex_type
24008a381b04SJed Brown 
2401bcf0153eSBarry Smith   If the equation is implicit or a DAE, then `TSSetEquationType()` needs to be set accordingly. Refer to the manual for further information.
2402bcf0153eSBarry Smith 
2403bcf0153eSBarry 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).
2404bcf0153eSBarry Smith 
2405bcf0153eSBarry Smith   Consider trying `TSROSW` if the stiff part is linear or weakly nonlinear.
2406bcf0153eSBarry Smith 
24071cc06b55SBarry Smith .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSARKIMEXSetType()`, `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`, `TSARKIMEXGetFullyImplicit()`,
2408bcf0153eSBarry Smith           `TSARKIMEX1BEE`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEX3`, `TSARKIMEXL2`, `TSARKIMEXA2`, `TSARKIMEXARS122`,
2409bcf0153eSBarry Smith           `TSARKIMEX4`, `TSARKIMEX5`, `TSARKIMEXPRSSP2`, `TSARKIMEXARS443`, `TSARKIMEXBPR3`, `TSARKIMEXType`, `TSARKIMEXRegister()`, `TSType`
24108a381b04SJed Brown M*/
2411d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSCreate_ARKIMEX(TS ts)
2412d71ae5a4SJacob Faibussowitsch {
241380ab5e31SHong Zhang   TS_ARKIMEX *ark;
2414d27334e2SStefano Zampini   PetscBool   dirk;
24158a381b04SJed Brown 
24168a381b04SJed Brown   PetscFunctionBegin;
24179566063dSJacob Faibussowitsch   PetscCall(TSARKIMEXInitializePackage());
2418d27334e2SStefano Zampini   PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk));
24198a381b04SJed Brown 
24208a381b04SJed Brown   ts->ops->reset          = TSReset_ARKIMEX;
242180ab5e31SHong Zhang   ts->ops->adjointreset   = TSAdjointReset_ARKIMEX;
24228a381b04SJed Brown   ts->ops->destroy        = TSDestroy_ARKIMEX;
24238a381b04SJed Brown   ts->ops->view           = TSView_ARKIMEX;
2424f2c2a1b9SBarry Smith   ts->ops->load           = TSLoad_ARKIMEX;
24258a381b04SJed Brown   ts->ops->setup          = TSSetUp_ARKIMEX;
242680ab5e31SHong Zhang   ts->ops->adjointsetup   = TSAdjointSetUp_ARKIMEX;
24278a381b04SJed Brown   ts->ops->step           = TSStep_ARKIMEX;
2428cd652676SJed Brown   ts->ops->interpolate    = TSInterpolate_ARKIMEX;
2429108c343cSJed Brown   ts->ops->evaluatestep   = TSEvaluateStep_ARKIMEX;
243024655328SShri   ts->ops->rollback       = TSRollBack_ARKIMEX;
24318a381b04SJed Brown   ts->ops->setfromoptions = TSSetFromOptions_ARKIMEX;
24328a381b04SJed Brown   ts->ops->snesfunction   = SNESTSFormFunction_ARKIMEX;
24338a381b04SJed Brown   ts->ops->snesjacobian   = SNESTSFormJacobian_ARKIMEX;
243480ab5e31SHong Zhang   ts->ops->getstages      = TSGetStages_ARKIMEX;
243580ab5e31SHong Zhang   ts->ops->adjointstep    = TSAdjointStep_ARKIMEX;
24368a381b04SJed Brown 
2437efd4aadfSBarry Smith   ts->usessnes = PETSC_TRUE;
2438efd4aadfSBarry Smith 
243980ab5e31SHong Zhang   PetscCall(PetscNew(&ark));
244080ab5e31SHong Zhang   ts->data  = (void *)ark;
2441d27334e2SStefano Zampini   ark->imex = dirk ? PETSC_FALSE : PETSC_TRUE;
244280ab5e31SHong Zhang 
244380ab5e31SHong Zhang   ark->VecsDeltaLam   = NULL;
244480ab5e31SHong Zhang   ark->VecsSensiTemp  = NULL;
244580ab5e31SHong Zhang   ark->VecsSensiPTemp = NULL;
24468a381b04SJed Brown 
24479566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", TSARKIMEXGetType_ARKIMEX));
2448d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", TSARKIMEXGetFullyImplicit_ARKIMEX));
2449d27334e2SStefano Zampini   if (!dirk) {
24509566063dSJacob Faibussowitsch     PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", TSARKIMEXSetType_ARKIMEX));
24519566063dSJacob Faibussowitsch     PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", TSARKIMEXSetFullyImplicit_ARKIMEX));
24529566063dSJacob Faibussowitsch     PetscCall(TSARKIMEXSetType(ts, TSARKIMEXDefault));
2453d27334e2SStefano Zampini   }
2454d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2455d27334e2SStefano Zampini }
2456d27334e2SStefano Zampini 
2457d27334e2SStefano Zampini /* ------------------------------------------------------------ */
2458d27334e2SStefano Zampini 
2459d27334e2SStefano Zampini static PetscErrorCode TSDIRKSetType_DIRK(TS ts, TSDIRKType dirktype)
2460d27334e2SStefano Zampini {
2461d27334e2SStefano Zampini   TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data;
2462d27334e2SStefano Zampini 
2463d27334e2SStefano Zampini   PetscFunctionBegin;
2464d27334e2SStefano Zampini   PetscCall(TSARKIMEXSetType_ARKIMEX(ts, dirktype));
2465d27334e2SStefano Zampini   PetscCheck(!ark->tableau->additive, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONG, "Method \"%s\" is not DIRK", dirktype);
2466d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2467d27334e2SStefano Zampini }
2468d27334e2SStefano Zampini 
2469d27334e2SStefano Zampini /*@C
2470d27334e2SStefano Zampini   TSDIRKSetType - Set the type of `TSDIRK` scheme
2471d27334e2SStefano Zampini 
2472d27334e2SStefano Zampini   Logically Collective
2473d27334e2SStefano Zampini 
2474d27334e2SStefano Zampini   Input Parameters:
2475d27334e2SStefano Zampini + ts       - timestepping context
2476d27334e2SStefano Zampini - dirktype - type of `TSDIRK` scheme
2477d27334e2SStefano Zampini 
2478d27334e2SStefano Zampini   Options Database Key:
2479d27334e2SStefano Zampini . -ts_dirkimex_type - set `TSDIRK` scheme type
2480d27334e2SStefano Zampini 
2481d27334e2SStefano Zampini   Level: intermediate
2482d27334e2SStefano Zampini 
2483d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKGetType()`, `TSDIRK`, `TSDIRKType`
2484d27334e2SStefano Zampini @*/
2485d27334e2SStefano Zampini PetscErrorCode TSDIRKSetType(TS ts, TSDIRKType dirktype)
2486d27334e2SStefano Zampini {
2487d27334e2SStefano Zampini   PetscFunctionBegin;
2488d27334e2SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2489d27334e2SStefano Zampini   PetscAssertPointer(dirktype, 2);
2490d27334e2SStefano Zampini   PetscTryMethod(ts, "TSDIRKSetType_C", (TS, TSDIRKType), (ts, dirktype));
2491d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2492d27334e2SStefano Zampini }
2493d27334e2SStefano Zampini 
2494d27334e2SStefano Zampini /*@C
2495d27334e2SStefano Zampini   TSDIRKGetType - Get the type of `TSDIRK` scheme
2496d27334e2SStefano Zampini 
2497d27334e2SStefano Zampini   Logically Collective
2498d27334e2SStefano Zampini 
2499d27334e2SStefano Zampini   Input Parameter:
2500d27334e2SStefano Zampini . ts - timestepping context
2501d27334e2SStefano Zampini 
2502d27334e2SStefano Zampini   Output Parameter:
2503d27334e2SStefano Zampini . dirktype - type of `TSDIRK` scheme
2504d27334e2SStefano Zampini 
2505d27334e2SStefano Zampini   Level: intermediate
2506d27334e2SStefano Zampini 
2507d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKSetType()`
2508d27334e2SStefano Zampini @*/
2509d27334e2SStefano Zampini PetscErrorCode TSDIRKGetType(TS ts, TSDIRKType *dirktype)
2510d27334e2SStefano Zampini {
2511d27334e2SStefano Zampini   PetscFunctionBegin;
2512d27334e2SStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
2513d27334e2SStefano Zampini   PetscUseMethod(ts, "TSDIRKGetType_C", (TS, TSDIRKType *), (ts, dirktype));
2514d27334e2SStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
2515d27334e2SStefano Zampini }
2516d27334e2SStefano Zampini 
2517d27334e2SStefano Zampini /*MC
2518*3405e92cSStefano Zampini       TSDIRK - ODE and DAE solver using Diagonally implicit Runge-Kutta schemes.
2519d27334e2SStefano Zampini 
2520d27334e2SStefano Zampini   Level: beginner
2521d27334e2SStefano Zampini 
2522d27334e2SStefano Zampini   Notes:
2523*3405e92cSStefano Zampini   The default is `TSDIRKES213SAL`, it can be changed with `TSDIRKSetType()` or -ts_dirk_type.
2524*3405e92cSStefano Zampini   The convention used in PETSc to name the DIRK methods is TSDIRK[E][S]PQS[SA][L][A] with:
2525*3405e92cSStefano Zampini + E - whether the method has an explicit first stage
2526*3405e92cSStefano Zampini . S - whether the method is single diagonal
2527*3405e92cSStefano Zampini . P - order of the advancing method
2528*3405e92cSStefano Zampini . Q - order of the embedded method
2529*3405e92cSStefano Zampini . S - number of stages
2530*3405e92cSStefano Zampini . SA - whether the method is stiffly accurate
2531*3405e92cSStefano Zampini . L - whether the method is L-stable
2532*3405e92cSStefano Zampini - A - whether the method is A-stable
2533d27334e2SStefano Zampini 
2534d27334e2SStefano Zampini .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSDIRKSetType()`, `TSDIRKGetType()`, `TSDIRKRegister()`.
2535d27334e2SStefano Zampini M*/
2536d27334e2SStefano Zampini PETSC_EXTERN PetscErrorCode TSCreate_DIRK(TS ts)
2537d27334e2SStefano Zampini {
2538d27334e2SStefano Zampini   PetscFunctionBegin;
2539d27334e2SStefano Zampini   PetscCall(TSCreate_ARKIMEX(ts));
2540d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", TSARKIMEXGetType_ARKIMEX));
2541d27334e2SStefano Zampini   PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", TSDIRKSetType_DIRK));
2542d27334e2SStefano Zampini   PetscCall(TSDIRKSetType(ts, TSDIRKDefault));
25433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
25448a381b04SJed Brown }
2545