18a381b04SJed Brown /* 2d27334e2SStefano Zampini Code for timestepping with additive Runge-Kutta IMEX method or Diagonally Implicit Runge-Kutta methods. 38a381b04SJed Brown 48a381b04SJed Brown Notes: 5d27334e2SStefano Zampini For ARK, the general system is written as 68a381b04SJed Brown 7f9c1d6abSBarry Smith F(t,U,Udot) = G(t,U) 88a381b04SJed Brown 98a381b04SJed Brown where F represents the stiff part of the physics and G represents the non-stiff part. 108a381b04SJed Brown 118a381b04SJed Brown */ 12af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 131e25c274SJed Brown #include <petscdm.h> 148a381b04SJed Brown 1519fd82e9SBarry Smith static TSARKIMEXType TSARKIMEXDefault = TSARKIMEX3; 163405e92cSStefano Zampini static TSDIRKType TSDIRKDefault = TSDIRKES213SAL; 178a381b04SJed Brown static PetscBool TSARKIMEXRegisterAllCalled; 188a381b04SJed Brown static PetscBool TSARKIMEXPackageInitialized; 1956dcabbaSDebojyoti Ghosh static PetscErrorCode TSExtrapolate_ARKIMEX(TS, PetscReal, Vec); 208a381b04SJed Brown 218a381b04SJed Brown typedef struct _ARKTableau *ARKTableau; 228a381b04SJed Brown struct _ARKTableau { 238a381b04SJed Brown char *name; 24d27334e2SStefano Zampini PetscBool additive; /* If False, it is a DIRK method */ 254f385281SJed Brown PetscInt order; /* Classical approximation order of the method */ 264f385281SJed Brown PetscInt s; /* Number of stages */ 27e817cc15SEmil Constantinescu PetscBool stiffly_accurate; /* The implicit part is stiffly accurate */ 28e817cc15SEmil Constantinescu PetscBool FSAL_implicit; /* The implicit part is FSAL */ 29e817cc15SEmil Constantinescu PetscBool explicit_first_stage; /* The implicit part has an explicit first stage */ 304f385281SJed Brown PetscInt pinterp; /* Interpolation order */ 314f385281SJed Brown PetscReal *At, *bt, *ct; /* Stiff tableau */ 328a381b04SJed Brown PetscReal *A, *b, *c; /* Non-stiff tableau */ 33108c343cSJed Brown PetscReal *bembedt, *bembed; /* Embedded formula of order one less (order-1) */ 34cd652676SJed Brown PetscReal *binterpt, *binterp; /* Dense output formula */ 35108c343cSJed Brown PetscReal ccfl; /* Placeholder for CFL coefficient relative to forward Euler */ 368a381b04SJed Brown }; 378a381b04SJed Brown typedef struct _ARKTableauLink *ARKTableauLink; 388a381b04SJed Brown struct _ARKTableauLink { 398a381b04SJed Brown struct _ARKTableau tab; 408a381b04SJed Brown ARKTableauLink next; 418a381b04SJed Brown }; 428a381b04SJed Brown static ARKTableauLink ARKTableauList; 438a381b04SJed Brown 448a381b04SJed Brown typedef struct { 458a381b04SJed Brown ARKTableau tableau; 468a381b04SJed Brown Vec *Y; /* States computed during the step */ 478a381b04SJed Brown Vec *YdotI; /* Time derivatives for the stiff part */ 488a381b04SJed Brown Vec *YdotRHS; /* Function evaluations for the non-stiff part */ 4956dcabbaSDebojyoti Ghosh Vec *Y_prev; /* States computed during the previous time step */ 5056dcabbaSDebojyoti Ghosh Vec *YdotI_prev; /* Time derivatives for the stiff part for the previous time step*/ 5156dcabbaSDebojyoti Ghosh Vec *YdotRHS_prev; /* Function evaluations for the non-stiff part for the previous time step*/ 52e817cc15SEmil Constantinescu Vec Ydot0; /* Holds the slope from the previous step in FSAL case */ 538a381b04SJed Brown Vec Ydot; /* Work vector holding Ydot during residual evaluation */ 548a381b04SJed Brown Vec Z; /* Ydot = shift(Y-Z) */ 558a381b04SJed Brown PetscScalar *work; /* Scalar work */ 56b296d7d5SJed Brown PetscReal scoeff; /* shift = scoeff/dt */ 578a381b04SJed Brown PetscReal stage_time; 584cc180ffSJed Brown PetscBool imex; 5996400bd6SLisandro Dalcin PetscBool extrapolate; /* Extrapolate initial guess from previous time-step stage values */ 60108c343cSJed Brown TSStepStatus status; 6180ab5e31SHong Zhang 6280ab5e31SHong Zhang /* context for sensitivity analysis */ 6380ab5e31SHong Zhang Vec *VecsDeltaLam; /* Increment of the adjoint sensitivity w.r.t IC at stage */ 6480ab5e31SHong Zhang Vec *VecsSensiTemp; /* Vectors to be multiplied with Jacobian transpose */ 6580ab5e31SHong Zhang Vec *VecsSensiPTemp; /* Temporary Vectors to store JacobianP-transpose-vector product */ 668a381b04SJed Brown } TS_ARKIMEX; 67d27334e2SStefano Zampini 681f80e275SEmil Constantinescu /*MC 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 2643405e92cSStefano Zampini /*MC 2653405e92cSStefano Zampini TSDIRKS212 - Second order DIRK scheme. 2663405e92cSStefano Zampini 2673405e92cSStefano Zampini This method has two implicit stages with an embedded method of other 1. 2683405e92cSStefano Zampini See `TSDIRK` for additional details. 2693405e92cSStefano Zampini 2703405e92cSStefano Zampini Options Database Key: 2713405e92cSStefano Zampini . -ts_dirk_type s212 - select this method. 2723405e92cSStefano Zampini 2733405e92cSStefano Zampini Level: advanced 2743405e92cSStefano Zampini 2753405e92cSStefano Zampini Note: 2763405e92cSStefano Zampini This is the default DIRK scheme in SUNDIALS. 2773405e92cSStefano Zampini 2783405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2793405e92cSStefano Zampini M*/ 2803405e92cSStefano Zampini 2813405e92cSStefano Zampini /*MC 2823405e92cSStefano Zampini TSDIRKES122SAL - First order DIRK scheme. 2833405e92cSStefano Zampini 2843405e92cSStefano Zampini Uses backward Euler as advancing method and trapezoidal rule as embedded method. See `TSDIRK` for additional details. 2853405e92cSStefano Zampini 2863405e92cSStefano Zampini Options Database Key: 2873405e92cSStefano Zampini . -ts_dirk_type es122sal - select this method. 2883405e92cSStefano Zampini 2893405e92cSStefano Zampini Level: advanced 2903405e92cSStefano Zampini 2913405e92cSStefano Zampini References: 2923405e92cSStefano Zampini . * - https://arxiv.org/abs/1803.01613 2933405e92cSStefano Zampini 2943405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2953405e92cSStefano Zampini M*/ 2963405e92cSStefano Zampini 2973405e92cSStefano Zampini /*MC 2983405e92cSStefano Zampini TSDIRKES213SAL - Second order DIRK scheme. 2993405e92cSStefano Zampini 3003405e92cSStefano Zampini See `TSDIRK` for additional details. 3013405e92cSStefano Zampini 3023405e92cSStefano Zampini Options Database Key: 3033405e92cSStefano Zampini . -ts_dirk_type es213sal - select this method. 3043405e92cSStefano Zampini 3053405e92cSStefano Zampini Level: advanced 3063405e92cSStefano Zampini 3073405e92cSStefano Zampini Note: 3083405e92cSStefano Zampini This is the default DIRK scheme used in PETSc. 3093405e92cSStefano Zampini 3103405e92cSStefano Zampini References: 3113405e92cSStefano Zampini + * - Kennedy and Carpenter, Diagonally Implicit Runge-Kutta methods for stiff ODEs (2016), https://ntrs.nasa.gov/api/citations/20160005923/downloads/20160005923.pdf 3123405e92cSStefano 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. 3133405e92cSStefano Zampini 3143405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3153405e92cSStefano Zampini M*/ 3163405e92cSStefano Zampini 3173405e92cSStefano Zampini /*MC 3183405e92cSStefano Zampini TSDIRKES324SAL - Third order DIRK scheme. 3193405e92cSStefano Zampini 3203405e92cSStefano Zampini See `TSDIRK` for additional details. 3213405e92cSStefano Zampini 3223405e92cSStefano Zampini Options Database Key: 3233405e92cSStefano Zampini . -ts_dirk_type es324sal - select this method. 3243405e92cSStefano Zampini 3253405e92cSStefano Zampini Level: advanced 3263405e92cSStefano Zampini 3273405e92cSStefano Zampini References: 3283405e92cSStefano Zampini . * - Kennedy and Carpenter, Diagonally Implicit Runge-Kutta methods for stiff ODEs (2016), https://ntrs.nasa.gov/api/citations/20160005923/downloads/20160005923.pdf 3293405e92cSStefano Zampini 3303405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3313405e92cSStefano Zampini M*/ 3323405e92cSStefano Zampini 3333405e92cSStefano Zampini /*MC 3343405e92cSStefano Zampini TSDIRKES325SAL - Third order DIRK scheme. 3353405e92cSStefano Zampini 3363405e92cSStefano Zampini See `TSDIRK` for additional details. 3373405e92cSStefano Zampini 3383405e92cSStefano Zampini Options Database Key: 3393405e92cSStefano Zampini . -ts_dirk_type es325sal - select this method. 3403405e92cSStefano Zampini 3413405e92cSStefano Zampini Level: advanced 3423405e92cSStefano Zampini 3433405e92cSStefano Zampini References: 3443405e92cSStefano Zampini . * - Kennedy and Carpenter, Diagonally Implicit Runge-Kutta methods for stiff ODEs (2016), https://ntrs.nasa.gov/api/citations/20160005923/downloads/20160005923.pdf 3453405e92cSStefano Zampini 3463405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3473405e92cSStefano Zampini M*/ 3483405e92cSStefano Zampini 3493405e92cSStefano Zampini /*MC 3503405e92cSStefano Zampini TSDIRK657A - Sixth order DIRK scheme. 3513405e92cSStefano Zampini 3523405e92cSStefano Zampini See `TSDIRK` for additional details. 3533405e92cSStefano Zampini 3543405e92cSStefano Zampini Options Database Key: 3553405e92cSStefano Zampini . -ts_dirk_type 657a - select this method. 3563405e92cSStefano Zampini 3573405e92cSStefano Zampini Level: advanced 3583405e92cSStefano Zampini 3593405e92cSStefano Zampini References: 3603405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 3613405e92cSStefano Zampini 3623405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3633405e92cSStefano Zampini M*/ 3643405e92cSStefano Zampini 3653405e92cSStefano Zampini /*MC 3663405e92cSStefano Zampini TSDIRKES648SA - Sixth order DIRK scheme. 3673405e92cSStefano Zampini 3683405e92cSStefano Zampini See `TSDIRK` for additional details. 3693405e92cSStefano Zampini 3703405e92cSStefano Zampini Options Database Key: 3713405e92cSStefano Zampini . -ts_dirk_type es648sa - select this method. 3723405e92cSStefano Zampini 3733405e92cSStefano Zampini Level: advanced 3743405e92cSStefano Zampini 3753405e92cSStefano Zampini References: 3763405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 3773405e92cSStefano Zampini 3783405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3793405e92cSStefano Zampini M*/ 3803405e92cSStefano Zampini 3813405e92cSStefano Zampini /*MC 3823405e92cSStefano Zampini TSDIRK658A - Sixth order DIRK scheme. 3833405e92cSStefano Zampini 3843405e92cSStefano Zampini See `TSDIRK` for additional details. 3853405e92cSStefano Zampini 3863405e92cSStefano Zampini Options Database Key: 3873405e92cSStefano Zampini . -ts_dirk_type 658a - select this method. 3883405e92cSStefano Zampini 3893405e92cSStefano Zampini Level: advanced 3903405e92cSStefano Zampini 3913405e92cSStefano Zampini References: 3923405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 3933405e92cSStefano Zampini 3943405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3953405e92cSStefano Zampini M*/ 3963405e92cSStefano Zampini 3973405e92cSStefano Zampini /*MC 3983405e92cSStefano Zampini TSDIRKS659A - Sixth order DIRK scheme. 3993405e92cSStefano Zampini 4003405e92cSStefano Zampini See `TSDIRK` for additional details. 4013405e92cSStefano Zampini 4023405e92cSStefano Zampini Options Database Key: 4033405e92cSStefano Zampini . -ts_dirk_type s659a - select this method. 4043405e92cSStefano Zampini 4053405e92cSStefano Zampini Level: advanced 4063405e92cSStefano Zampini 4073405e92cSStefano Zampini References: 4083405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 4093405e92cSStefano Zampini 4103405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4113405e92cSStefano Zampini M*/ 4123405e92cSStefano Zampini 4133405e92cSStefano Zampini /*MC 4143405e92cSStefano Zampini TSDIRK7510SAL - Seventh order DIRK scheme. 4153405e92cSStefano Zampini 4163405e92cSStefano Zampini See `TSDIRK` for additional details. 4173405e92cSStefano Zampini 4183405e92cSStefano Zampini Options Database Key: 4193405e92cSStefano Zampini . -ts_dirk_type 7510sal - select this method. 4203405e92cSStefano Zampini 4213405e92cSStefano Zampini Level: advanced 4223405e92cSStefano Zampini 4233405e92cSStefano Zampini References: 4243405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 4253405e92cSStefano Zampini 4263405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4273405e92cSStefano Zampini M*/ 4283405e92cSStefano Zampini 4293405e92cSStefano Zampini /*MC 4303405e92cSStefano Zampini TSDIRKES7510SA - Seventh order DIRK scheme. 4313405e92cSStefano Zampini 4323405e92cSStefano Zampini See `TSDIRK` for additional details. 4333405e92cSStefano Zampini 4343405e92cSStefano Zampini Options Database Key: 4353405e92cSStefano Zampini . -ts_dirk_type es7510sa - select this method. 4363405e92cSStefano Zampini 4373405e92cSStefano Zampini Level: advanced 4383405e92cSStefano Zampini 4393405e92cSStefano Zampini References: 4403405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 4413405e92cSStefano Zampini 4423405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4433405e92cSStefano Zampini M*/ 4443405e92cSStefano Zampini 4453405e92cSStefano Zampini /*MC 4463405e92cSStefano Zampini TSDIRK759A - Seventh order DIRK scheme. 4473405e92cSStefano Zampini 4483405e92cSStefano Zampini See `TSDIRK` for additional details. 4493405e92cSStefano Zampini 4503405e92cSStefano Zampini Options Database Key: 4513405e92cSStefano Zampini . -ts_dirk_type 759a - select this method. 4523405e92cSStefano Zampini 4533405e92cSStefano Zampini Level: advanced 4543405e92cSStefano Zampini 4553405e92cSStefano Zampini References: 4563405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 4573405e92cSStefano Zampini 4583405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4593405e92cSStefano Zampini M*/ 4603405e92cSStefano Zampini 4613405e92cSStefano Zampini /*MC 4623405e92cSStefano Zampini TSDIRKS7511SAL - Seventh order DIRK scheme. 4633405e92cSStefano Zampini 4643405e92cSStefano Zampini See `TSDIRK` for additional details. 4653405e92cSStefano Zampini 4663405e92cSStefano Zampini Options Database Key: 4673405e92cSStefano Zampini . -ts_dirk_type s7511sal - select this method. 4683405e92cSStefano Zampini 4693405e92cSStefano Zampini Level: advanced 4703405e92cSStefano Zampini 4713405e92cSStefano Zampini References: 4723405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 4733405e92cSStefano Zampini 4743405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4753405e92cSStefano Zampini M*/ 4763405e92cSStefano Zampini 4773405e92cSStefano Zampini /*MC 4783405e92cSStefano Zampini TSDIRK8614A - Eighth order DIRK scheme. 4793405e92cSStefano Zampini 4803405e92cSStefano Zampini See `TSDIRK` for additional details. 4813405e92cSStefano Zampini 4823405e92cSStefano Zampini Options Database Key: 4833405e92cSStefano Zampini . -ts_dirk_type 8614a - select this method. 4843405e92cSStefano Zampini 4853405e92cSStefano Zampini Level: advanced 4863405e92cSStefano Zampini 4873405e92cSStefano Zampini References: 4883405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 4893405e92cSStefano Zampini 4903405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4913405e92cSStefano Zampini M*/ 4923405e92cSStefano Zampini 4933405e92cSStefano Zampini /*MC 4943405e92cSStefano Zampini TSDIRK8616SAL - Eighth order DIRK scheme. 4953405e92cSStefano Zampini 4963405e92cSStefano Zampini See `TSDIRK` for additional details. 4973405e92cSStefano Zampini 4983405e92cSStefano Zampini Options Database Key: 4993405e92cSStefano Zampini . -ts_dirk_type 8616sal - select this method. 5003405e92cSStefano Zampini 5013405e92cSStefano Zampini Level: advanced 5023405e92cSStefano Zampini 5033405e92cSStefano Zampini References: 5043405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 5053405e92cSStefano Zampini 5063405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 5073405e92cSStefano Zampini M*/ 5083405e92cSStefano Zampini 5093405e92cSStefano Zampini /*MC 5103405e92cSStefano Zampini TSDIRKES8516SAL - Eighth order DIRK scheme. 5113405e92cSStefano Zampini 5123405e92cSStefano Zampini See `TSDIRK` for additional details. 5133405e92cSStefano Zampini 5143405e92cSStefano Zampini Options Database Key: 5153405e92cSStefano Zampini . -ts_dirk_type es8516sal - select this method. 5163405e92cSStefano Zampini 5173405e92cSStefano Zampini Level: advanced 5183405e92cSStefano Zampini 5193405e92cSStefano Zampini References: 5203405e92cSStefano Zampini . * - https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 5213405e92cSStefano Zampini 5223405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 5233405e92cSStefano Zampini M*/ 5243405e92cSStefano 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)}; 5753405e92cSStefano 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. 5803405e92cSStefano Zampini TR-BDF2 from Hosea and Shampine 5813405e92cSStefano 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] ( 1676*5d7a6ebeSHong Zhang dGdU (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j]) 1677*5d7a6ebeSHong Zhang + dHdU (bt[i] lambda_{n+1} + \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] 1680*5d7a6ebeSHong Zhang + dGdP (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j]) 1681*5d7a6ebeSHong Zhang + dHdP (bt[i] lambda_{n+1} + \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 /* Build RHS (stored in VecsDeltaLam) for first-order adjoint */ 1726*5d7a6ebeSHong Zhang for (nadj = 0; nadj < ts->numcost; nadj++) { 1727*5d7a6ebeSHong Zhang /* build implicit part */ 1728*5d7a6ebeSHong Zhang PetscCall(VecSet(VecsSensiTemp[nadj], 0)); 172980ab5e31SHong Zhang if (s - i - 1 > 0) { 173080ab5e31SHong Zhang /* Temp = -\sum_{j=i+1}^s at[j][i] lambda_s[j] */ 173180ab5e31SHong Zhang for (j = i + 1; j < s; j++) w[j - i - 1] = -At[j * s + i]; 173280ab5e31SHong Zhang PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1])); 1733*5d7a6ebeSHong Zhang } 1734*5d7a6ebeSHong Zhang /* Temp = Temp - bt[i] lambda_{n+1} */ 1735*5d7a6ebeSHong Zhang PetscCall(VecAXPY(VecsSensiTemp[nadj], -bt[i], ts->vecs_sensi[nadj])); 1736*5d7a6ebeSHong Zhang if (bt[i] || s - i - 1 > 0) { 173780ab5e31SHong Zhang /* (shift I - dHdU) Temp */ 173880ab5e31SHong Zhang PetscCall(MatMultTranspose(Jim, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i])); 173980ab5e31SHong Zhang /* cancel out shift Temp where shift=-scoeff/h */ 174080ab5e31SHong Zhang PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], ark->scoeff / adjoint_time_step, VecsSensiTemp[nadj])); 174180ab5e31SHong Zhang if (ts->vecs_sensip) { 174280ab5e31SHong Zhang /* - dHdP Temp */ 174380ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacp, VecsSensiTemp[nadj], VecsSensiPTemp[nadj])); 1744*5d7a6ebeSHong Zhang /* mu_n += -h dHdP Temp */ 1745*5d7a6ebeSHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj])); 174680ab5e31SHong Zhang } 1747*5d7a6ebeSHong Zhang } else { 1748*5d7a6ebeSHong Zhang PetscCall(VecSet(VecsDeltaLam[nadj * s + i], 0)); // make sure it is initialized 1749*5d7a6ebeSHong Zhang } 1750*5d7a6ebeSHong Zhang /* build explicit part */ 1751*5d7a6ebeSHong Zhang PetscCall(VecSet(VecsSensiTemp[nadj], 0)); 1752*5d7a6ebeSHong Zhang if (s - i - 1 > 0) { 175380ab5e31SHong Zhang /* Temp = \sum_{j=i+1}^s a[j][i] lambda_s[j] */ 175480ab5e31SHong Zhang for (j = i + 1; j < s; j++) w[j - i - 1] = A[j * s + i]; 175580ab5e31SHong Zhang PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1])); 1756*5d7a6ebeSHong Zhang } 1757*5d7a6ebeSHong Zhang /* Temp = Temp + b[i] lambda_{n+1} */ 1758*5d7a6ebeSHong Zhang PetscCall(VecAXPY(VecsSensiTemp[nadj], b[i], ts->vecs_sensi[nadj])); 1759*5d7a6ebeSHong Zhang if (b[i] || s - i - 1 > 0) { 176080ab5e31SHong Zhang /* dGdU Temp */ 176180ab5e31SHong Zhang PetscCall(MatMultTransposeAdd(Jex, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i])); 176280ab5e31SHong Zhang if (ts->vecs_sensip) { 176380ab5e31SHong Zhang /* dGdP Temp */ 176480ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecsSensiPTemp[nadj])); 176580ab5e31SHong Zhang /* mu_n += h dGdP Temp */ 176680ab5e31SHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj])); 176780ab5e31SHong Zhang } 176880ab5e31SHong Zhang } 176980ab5e31SHong Zhang /* Build LHS for first-order adjoint */ 177080ab5e31SHong Zhang if (At[i * s + i] == 0) { // This stage is explicit 177180ab5e31SHong Zhang PetscCall(VecScale(VecsDeltaLam[nadj * s + i], adjoint_time_step)); 177280ab5e31SHong Zhang } else { 177380ab5e31SHong Zhang KSP ksp; 177480ab5e31SHong Zhang KSPConvergedReason kspreason; 177580ab5e31SHong Zhang PetscCall(SNESGetKSP(ts->snes, &ksp)); 177680ab5e31SHong Zhang PetscCall(KSPSetOperators(ksp, Jim, Jimpre)); 177780ab5e31SHong Zhang PetscCall(VecScale(VecsDeltaLam[nadj * s + i], 1. / At[i * s + i])); 177880ab5e31SHong Zhang PetscCall(KSPSolveTranspose(ksp, VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i])); 177980ab5e31SHong Zhang PetscCall(KSPGetConvergedReason(ksp, &kspreason)); 178080ab5e31SHong Zhang if (kspreason < 0) { 178180ab5e31SHong Zhang ts->reason = TSADJOINT_DIVERGED_LINEAR_SOLVE; 178280ab5e31SHong 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)); 178380ab5e31SHong Zhang } 178480ab5e31SHong Zhang if (ts->vecs_sensip) { 178580ab5e31SHong Zhang /* -dHdP lambda_s[i] */ 178680ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacp, VecsDeltaLam[nadj * s + i], VecsSensiPTemp[nadj])); 178780ab5e31SHong Zhang /* mu_n += h at[i][i] dHdP lambda_s[i] */ 178880ab5e31SHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], -At[i * s + i] * adjoint_time_step, VecsSensiPTemp[nadj])); 178980ab5e31SHong Zhang } 179080ab5e31SHong Zhang } 179180ab5e31SHong Zhang } 179280ab5e31SHong Zhang } 179380ab5e31SHong Zhang for (j = 0; j < s; j++) w[j] = 1.0; 179480ab5e31SHong Zhang for (nadj = 0; nadj < ts->numcost; nadj++) // no need to do this for mu's 179580ab5e31SHong Zhang PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s])); 179680ab5e31SHong Zhang ark->status = TS_STEP_COMPLETE; 179780ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 179880ab5e31SHong Zhang } 17998a381b04SJed Brown 1800d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSInterpolate_ARKIMEX(TS ts, PetscReal itime, Vec X) 1801d71ae5a4SJacob Faibussowitsch { 1802cd652676SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1803d27334e2SStefano Zampini ARKTableau tab = ark->tableau; 1804d27334e2SStefano Zampini PetscInt s = tab->s, pinterp = tab->pinterp, i, j; 1805108c343cSJed Brown PetscReal h; 1806108c343cSJed Brown PetscReal tt, t; 1807d27334e2SStefano Zampini PetscScalar *bt = ark->work, *b = ark->work + s; 1808d27334e2SStefano Zampini const PetscReal *Bt = tab->binterpt, *B = tab->binterp; 1809cd652676SJed Brown 1810cd652676SJed Brown PetscFunctionBegin; 1811d27334e2SStefano 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); 1812108c343cSJed Brown switch (ark->status) { 1813108c343cSJed Brown case TS_STEP_INCOMPLETE: 1814108c343cSJed Brown case TS_STEP_PENDING: 1815108c343cSJed Brown h = ts->time_step; 1816108c343cSJed Brown t = (itime - ts->ptime) / h; 1817108c343cSJed Brown break; 1818108c343cSJed Brown case TS_STEP_COMPLETE: 1819be5899b3SLisandro Dalcin h = ts->ptime - ts->ptime_prev; 1820108c343cSJed Brown t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */ 1821108c343cSJed Brown break; 1822d71ae5a4SJacob Faibussowitsch default: 1823d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); 1824108c343cSJed Brown } 1825cd652676SJed Brown for (i = 0; i < s; i++) bt[i] = b[i] = 0; 18264f385281SJed Brown for (j = 0, tt = t; j < pinterp; j++, tt *= t) { 1827cd652676SJed Brown for (i = 0; i < s; i++) { 1828c1758d98SDebojyoti Ghosh bt[i] += h * Bt[i * pinterp + j] * tt; 1829108c343cSJed Brown b[i] += h * B[i * pinterp + j] * tt; 1830cd652676SJed Brown } 1831cd652676SJed Brown } 18329566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y[0], X)); 18339566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, bt, ark->YdotI)); 1834d27334e2SStefano Zampini if (tab->additive) { 1835d27334e2SStefano Zampini PetscBool hasE; 1836d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1837d27334e2SStefano Zampini if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS)); 1838d27334e2SStefano Zampini } 18393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1840cd652676SJed Brown } 1841cd652676SJed Brown 1842d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSExtrapolate_ARKIMEX(TS ts, PetscReal c, Vec X) 1843d71ae5a4SJacob Faibussowitsch { 184456dcabbaSDebojyoti Ghosh TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1845d27334e2SStefano Zampini ARKTableau tab = ark->tableau; 1846d27334e2SStefano Zampini PetscInt s = tab->s, pinterp = tab->pinterp, i, j; 1847be5899b3SLisandro Dalcin PetscReal h, h_prev, t, tt; 1848d27334e2SStefano Zampini PetscScalar *bt = ark->work, *b = ark->work + s; 1849d27334e2SStefano Zampini const PetscReal *Bt = tab->binterpt, *B = tab->binterp; 185056dcabbaSDebojyoti Ghosh 185156dcabbaSDebojyoti Ghosh PetscFunctionBegin; 18523c633725SBarry Smith PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name); 185381d12688SDebojyoti Ghosh h = ts->time_step; 1854be5899b3SLisandro Dalcin h_prev = ts->ptime - ts->ptime_prev; 1855be5899b3SLisandro Dalcin t = 1 + h / h_prev * c; 1856d27334e2SStefano Zampini for (i = 0; i < s; i++) bt[i] = b[i] = 0; 185756dcabbaSDebojyoti Ghosh for (j = 0, tt = t; j < pinterp; j++, tt *= t) { 185856dcabbaSDebojyoti Ghosh for (i = 0; i < s; i++) { 185981d12688SDebojyoti Ghosh bt[i] += h * Bt[i * pinterp + j] * tt; 186056dcabbaSDebojyoti Ghosh b[i] += h * B[i * pinterp + j] * tt; 186156dcabbaSDebojyoti Ghosh } 186256dcabbaSDebojyoti Ghosh } 18633c633725SBarry Smith PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous step have not been stored"); 18649566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y_prev[0], X)); 18659566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev)); 1866d27334e2SStefano Zampini if (tab->additive) { 1867d27334e2SStefano Zampini PetscBool hasE; 1868d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1869d27334e2SStefano Zampini if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev)); 1870d27334e2SStefano Zampini } 18713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 187256dcabbaSDebojyoti Ghosh } 187356dcabbaSDebojyoti Ghosh 1874d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauReset(TS ts) 1875d71ae5a4SJacob Faibussowitsch { 187696400bd6SLisandro Dalcin TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 187796400bd6SLisandro Dalcin ARKTableau tab = ark->tableau; 187896400bd6SLisandro Dalcin 187996400bd6SLisandro Dalcin PetscFunctionBegin; 18803ba16761SJacob Faibussowitsch if (!tab) PetscFunctionReturn(PETSC_SUCCESS); 18819566063dSJacob Faibussowitsch PetscCall(PetscFree(ark->work)); 18829566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->Y)); 18839566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotI)); 18849566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS)); 18859566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev)); 18869566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev)); 18879566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev)); 18883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 188996400bd6SLisandro Dalcin } 189096400bd6SLisandro Dalcin 1891d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSReset_ARKIMEX(TS ts) 1892d71ae5a4SJacob Faibussowitsch { 18938a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 18948a381b04SJed Brown 18958a381b04SJed Brown PetscFunctionBegin; 18969566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTableauReset(ts)); 18979566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Ydot)); 18989566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Ydot0)); 18999566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Z)); 19003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19018a381b04SJed Brown } 19028a381b04SJed Brown 190380ab5e31SHong Zhang static PetscErrorCode TSAdjointReset_ARKIMEX(TS ts) 190480ab5e31SHong Zhang { 190580ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 190680ab5e31SHong Zhang ARKTableau tab = ark->tableau; 190780ab5e31SHong Zhang 190880ab5e31SHong Zhang PetscFunctionBegin; 190980ab5e31SHong Zhang PetscCall(VecDestroyVecs(tab->s * ts->numcost, &ark->VecsDeltaLam)); 191080ab5e31SHong Zhang PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiTemp)); 191180ab5e31SHong Zhang PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiPTemp)); 191280ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 191380ab5e31SHong Zhang } 191480ab5e31SHong Zhang 1915d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetVecs(TS ts, DM dm, Vec *Z, Vec *Ydot) 1916d71ae5a4SJacob Faibussowitsch { 1917d5e6173cSPeter Brune TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data; 1918d5e6173cSPeter Brune 1919d5e6173cSPeter Brune PetscFunctionBegin; 1920d5e6173cSPeter Brune if (Z) { 1921d5e6173cSPeter Brune if (dm && dm != ts->dm) { 19229566063dSJacob Faibussowitsch PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Z", Z)); 1923d5e6173cSPeter Brune } else *Z = ax->Z; 1924d5e6173cSPeter Brune } 1925d5e6173cSPeter Brune if (Ydot) { 1926d5e6173cSPeter Brune if (dm && dm != ts->dm) { 19279566063dSJacob Faibussowitsch PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot)); 1928d5e6173cSPeter Brune } else *Ydot = ax->Ydot; 1929d5e6173cSPeter Brune } 19303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1931d5e6173cSPeter Brune } 1932d5e6173cSPeter Brune 1933d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXRestoreVecs(TS ts, DM dm, Vec *Z, Vec *Ydot) 1934d71ae5a4SJacob Faibussowitsch { 1935d5e6173cSPeter Brune PetscFunctionBegin; 1936d5e6173cSPeter Brune if (Z) { 193748a46eb9SPierre Jolivet if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Z", Z)); 1938d5e6173cSPeter Brune } 1939d5e6173cSPeter Brune if (Ydot) { 194048a46eb9SPierre Jolivet if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot)); 1941d5e6173cSPeter Brune } 19423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1943d5e6173cSPeter Brune } 1944d5e6173cSPeter Brune 19458a381b04SJed Brown /* 19468a381b04SJed Brown This defines the nonlinear equation that is to be solved with SNES 19478a381b04SJed Brown G(U) = F[t0+Theta*dt, U, (U-U0)*shift] = 0 19488a381b04SJed Brown */ 1949d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormFunction_ARKIMEX(SNES snes, Vec X, Vec F, TS ts) 1950d71ae5a4SJacob Faibussowitsch { 19518a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1952d5e6173cSPeter Brune DM dm, dmsave; 1953d5e6173cSPeter Brune Vec Z, Ydot; 1954b296d7d5SJed Brown PetscReal shift = ark->scoeff / ts->time_step; 19558a381b04SJed Brown 19568a381b04SJed Brown PetscFunctionBegin; 19579566063dSJacob Faibussowitsch PetscCall(SNESGetDM(snes, &dm)); 19589566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot)); 1959d5e6173cSPeter Brune dmsave = ts->dm; 1960d5e6173cSPeter Brune ts->dm = dm; 1961740132f1SEmil Constantinescu 1962d27334e2SStefano Zampini if (ark->scoeff == 0.0) { 1963d27334e2SStefano Zampini /* We are solving F(t,x_n,xdot) = 0 to start the method */ 1964d27334e2SStefano Zampini PetscCall(TSComputeIFunction(ts, ark->stage_time, Z, X, F, ark->imex)); 1965d27334e2SStefano Zampini } else { 1966d27334e2SStefano Zampini PetscCall(VecAXPBYPCZ(Ydot, -shift, shift, 0, Z, X)); /* Ydot = shift*(X-Z) */ 19679566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ark->stage_time, X, Ydot, F, ark->imex)); 1968d27334e2SStefano Zampini } 1969e817cc15SEmil Constantinescu 1970d5e6173cSPeter Brune ts->dm = dmsave; 19719566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot)); 19723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19738a381b04SJed Brown } 19748a381b04SJed Brown 1975d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormJacobian_ARKIMEX(SNES snes, Vec X, Mat A, Mat B, TS ts) 1976d71ae5a4SJacob Faibussowitsch { 19778a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1978d5e6173cSPeter Brune DM dm, dmsave; 1979d27334e2SStefano Zampini Vec Ydot, Z; 1980b296d7d5SJed Brown PetscReal shift = ark->scoeff / ts->time_step; 19818a381b04SJed Brown 19828a381b04SJed Brown PetscFunctionBegin; 19839566063dSJacob Faibussowitsch PetscCall(SNESGetDM(snes, &dm)); 1984d27334e2SStefano Zampini PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot)); 19858a381b04SJed Brown /* ark->Ydot has already been computed in SNESTSFormFunction_ARKIMEX (SNES guarantees this) */ 1986d5e6173cSPeter Brune dmsave = ts->dm; 1987d5e6173cSPeter Brune ts->dm = dm; 1988740132f1SEmil Constantinescu 1989d27334e2SStefano Zampini if (ark->scoeff == 0.0) { 1990d27334e2SStefano Zampini /* We are solving F(t,x_n,xdot) = 0 to start the method, we only only dF/dXdot 1991d27334e2SStefano Zampini Jed's proposal is to compute with a very large shift and scale back the matrix */ 1992d27334e2SStefano Zampini shift = 1.0 / PETSC_MACHINE_EPSILON; 1993d27334e2SStefano Zampini PetscCall(TSComputeIJacobian(ts, ark->stage_time, Z, X, shift, A, B, ark->imex)); 1994d27334e2SStefano Zampini PetscCall(MatScale(B, PETSC_MACHINE_EPSILON)); 1995d27334e2SStefano Zampini if (A != B) PetscCall(MatScale(A, PETSC_MACHINE_EPSILON)); 1996d27334e2SStefano Zampini } else { 19979566063dSJacob Faibussowitsch PetscCall(TSComputeIJacobian(ts, ark->stage_time, X, Ydot, shift, A, B, ark->imex)); 1998d27334e2SStefano Zampini } 1999d5e6173cSPeter Brune ts->dm = dmsave; 2000d27334e2SStefano Zampini PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot)); 20013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2002d5e6173cSPeter Brune } 2003d5e6173cSPeter Brune 200480ab5e31SHong Zhang static PetscErrorCode TSGetStages_ARKIMEX(TS ts, PetscInt *ns, Vec *Y[]) 200580ab5e31SHong Zhang { 200680ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 200780ab5e31SHong Zhang 200880ab5e31SHong Zhang PetscFunctionBegin; 200980ab5e31SHong Zhang if (ns) *ns = ark->tableau->s; 201080ab5e31SHong Zhang if (Y) *Y = ark->Y; 201180ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 201280ab5e31SHong Zhang } 201380ab5e31SHong Zhang 2014d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_TSARKIMEX(DM fine, DM coarse, void *ctx) 2015d71ae5a4SJacob Faibussowitsch { 2016d5e6173cSPeter Brune PetscFunctionBegin; 20173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2018d5e6173cSPeter Brune } 2019d5e6173cSPeter Brune 2020d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_TSARKIMEX(DM fine, Mat restrct, Vec rscale, Mat inject, DM coarse, void *ctx) 2021d71ae5a4SJacob Faibussowitsch { 2022d5e6173cSPeter Brune TS ts = (TS)ctx; 2023d5e6173cSPeter Brune Vec Z, Z_c; 2024d5e6173cSPeter Brune 2025d5e6173cSPeter Brune PetscFunctionBegin; 20269566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, fine, &Z, NULL)); 20279566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, coarse, &Z_c, NULL)); 20289566063dSJacob Faibussowitsch PetscCall(MatRestrict(restrct, Z, Z_c)); 20299566063dSJacob Faibussowitsch PetscCall(VecPointwiseMult(Z_c, rscale, Z_c)); 20309566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, fine, &Z, NULL)); 20319566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, coarse, &Z_c, NULL)); 20323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20338a381b04SJed Brown } 20348a381b04SJed Brown 2035d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_TSARKIMEX(DM dm, DM subdm, void *ctx) 2036d71ae5a4SJacob Faibussowitsch { 2037cdb298fcSPeter Brune PetscFunctionBegin; 20383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2039cdb298fcSPeter Brune } 2040cdb298fcSPeter Brune 2041d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_TSARKIMEX(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx) 2042d71ae5a4SJacob Faibussowitsch { 2043cdb298fcSPeter Brune TS ts = (TS)ctx; 2044cdb298fcSPeter Brune Vec Z, Z_c; 2045cdb298fcSPeter Brune 2046cdb298fcSPeter Brune PetscFunctionBegin; 20479566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, NULL)); 20489566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, subdm, &Z_c, NULL)); 2049cdb298fcSPeter Brune 20509566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD)); 20519566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD)); 2052cdb298fcSPeter Brune 20539566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, NULL)); 20549566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, subdm, &Z_c, NULL)); 20553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2056cdb298fcSPeter Brune } 2057cdb298fcSPeter Brune 2058d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauSetUp(TS ts) 2059d71ae5a4SJacob Faibussowitsch { 206096400bd6SLisandro Dalcin TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 206196400bd6SLisandro Dalcin ARKTableau tab = ark->tableau; 206296400bd6SLisandro Dalcin 206396400bd6SLisandro Dalcin PetscFunctionBegin; 2064d27334e2SStefano Zampini PetscCall(PetscMalloc1(2 * tab->s, &ark->work)); 20659566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y)); 20669566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI)); 2067d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS)); 206896400bd6SLisandro Dalcin if (ark->extrapolate) { 20699566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev)); 20709566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev)); 2071d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev)); 207296400bd6SLisandro Dalcin } 20733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 207496400bd6SLisandro Dalcin } 207596400bd6SLisandro Dalcin 2076d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetUp_ARKIMEX(TS ts) 2077d71ae5a4SJacob Faibussowitsch { 20788a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2079d5e6173cSPeter Brune DM dm; 208096400bd6SLisandro Dalcin SNES snes; 2081f9c1d6abSBarry Smith 20828a381b04SJed Brown PetscFunctionBegin; 20839566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTableauSetUp(ts)); 20849566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot)); 20859566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot0)); 20869566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Z)); 20879566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 20889566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts)); 20899566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts)); 20909566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 20913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20928a381b04SJed Brown } 20938a381b04SJed Brown 209480ab5e31SHong Zhang static PetscErrorCode TSAdjointSetUp_ARKIMEX(TS ts) 209580ab5e31SHong Zhang { 209680ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 209780ab5e31SHong Zhang ARKTableau tab = ark->tableau; 209880ab5e31SHong Zhang 209980ab5e31SHong Zhang PetscFunctionBegin; 210080ab5e31SHong Zhang PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], tab->s * ts->numcost, &ark->VecsDeltaLam)); 210180ab5e31SHong Zhang PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &ark->VecsSensiTemp)); 210280ab5e31SHong Zhang if (ts->vecs_sensip) { PetscCall(VecDuplicateVecs(ts->vecs_sensip[0], ts->numcost, &ark->VecsSensiPTemp)); } 210380ab5e31SHong Zhang if (PetscDefined(USE_DEBUG)) { 210480ab5e31SHong Zhang PetscBool id = PETSC_FALSE; 210580ab5e31SHong Zhang PetscCall(TSARKIMEXTestMassIdentity(ts, &id)); 2106d27334e2SStefano 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"); 210780ab5e31SHong Zhang } 210880ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 210980ab5e31SHong Zhang } 211080ab5e31SHong Zhang 2111d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetFromOptions_ARKIMEX(TS ts, PetscOptionItems *PetscOptionsObject) 2112d71ae5a4SJacob Faibussowitsch { 21134cc180ffSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2114d27334e2SStefano Zampini PetscBool dirk; 21158a381b04SJed Brown 21168a381b04SJed Brown PetscFunctionBegin; 2117d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 2118d27334e2SStefano Zampini PetscOptionsHeadBegin(PetscOptionsObject, dirk ? "DIRK ODE solver options" : "ARKIMEX ODE solver options"); 21198a381b04SJed Brown { 21208a381b04SJed Brown ARKTableauLink link; 21218a381b04SJed Brown PetscInt count, choice; 21228a381b04SJed Brown PetscBool flg; 21238a381b04SJed Brown const char **namelist; 2124d27334e2SStefano Zampini for (link = ARKTableauList, count = 0; link; link = link->next) { 2125d27334e2SStefano Zampini if (!dirk && link->tab.additive) count++; 2126d27334e2SStefano Zampini if (dirk && !link->tab.additive) count++; 2127d27334e2SStefano Zampini } 21289566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(count, (char ***)&namelist)); 2129d27334e2SStefano Zampini for (link = ARKTableauList, count = 0; link; link = link->next) { 2130d27334e2SStefano Zampini if (!dirk && link->tab.additive) namelist[count++] = link->tab.name; 2131d27334e2SStefano Zampini if (dirk && !link->tab.additive) namelist[count++] = link->tab.name; 2132d27334e2SStefano Zampini } 2133d27334e2SStefano Zampini if (dirk) { 2134d27334e2SStefano Zampini PetscCall(PetscOptionsEList("-ts_dirk_type", "Family of DIRK method", "TSDIRKSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg)); 2135d27334e2SStefano Zampini if (flg) PetscCall(TSDIRKSetType(ts, namelist[choice])); 2136d27334e2SStefano Zampini } else { 21379566063dSJacob Faibussowitsch PetscCall(PetscOptionsEList("-ts_arkimex_type", "Family of ARK IMEX method", "TSARKIMEXSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg)); 21389566063dSJacob Faibussowitsch if (flg) PetscCall(TSARKIMEXSetType(ts, namelist[choice])); 21394cc180ffSJed Brown flg = (PetscBool)!ark->imex; 21409566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_arkimex_fully_implicit", "Solve the problem fully implicitly", "TSARKIMEXSetFullyImplicit", flg, &flg, NULL)); 21414cc180ffSJed Brown ark->imex = (PetscBool)!flg; 2142d27334e2SStefano Zampini } 2143d27334e2SStefano Zampini PetscCall(PetscFree(namelist)); 21449566063dSJacob 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)); 21458a381b04SJed Brown } 2146d0609cedSBarry Smith PetscOptionsHeadEnd(); 21473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21488a381b04SJed Brown } 21498a381b04SJed Brown 2150d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSView_ARKIMEX(TS ts, PetscViewer viewer) 2151d71ae5a4SJacob Faibussowitsch { 21528a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2153d27334e2SStefano Zampini PetscBool iascii, dirk; 21548a381b04SJed Brown 21558a381b04SJed Brown PetscFunctionBegin; 2156d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 21579566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 21588a381b04SJed Brown if (iascii) { 2159d27334e2SStefano Zampini PetscViewerFormat format; 21609c334d8fSLisandro Dalcin ARKTableau tab = ark->tableau; 216119fd82e9SBarry Smith TSARKIMEXType arktype; 2162d27334e2SStefano Zampini char buf[2048]; 21633a28c0e5SStefano Zampini PetscBool flg; 21643a28c0e5SStefano Zampini 21659566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetType(ts, &arktype)); 21669566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetFullyImplicit(ts, &flg)); 2167d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %s %s\n", dirk ? "DIRK" : "ARK IMEX", arktype)); 21689566063dSJacob Faibussowitsch PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->ct)); 2169d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sabscissa ct = %s\n", dirk ? "" : "Stiff ", buf)); 2170d27334e2SStefano Zampini PetscCall(PetscViewerGetFormat(viewer, &format)); 2171d27334e2SStefano Zampini if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 2172d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sAt =\n", dirk ? "" : "Stiff ")); 2173d27334e2SStefano Zampini for (PetscInt i = 0; i < tab->s; i++) { 2174d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->At + i * tab->s)); 2175d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %s\n", buf)); 2176d27334e2SStefano Zampini } 2177d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bt)); 2178d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sbt = %s\n", dirk ? "" : "Stiff ", buf)); 2179d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bembedt)); 2180d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sbet = %s\n", dirk ? "" : "Stiff ", buf)); 2181d27334e2SStefano Zampini } 21829566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Fully implicit: %s\n", flg ? "yes" : "no")); 21839566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Stiffly accurate: %s\n", tab->stiffly_accurate ? "yes" : "no")); 21849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Explicit first stage: %s\n", tab->explicit_first_stage ? "yes" : "no")); 21859566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "FSAL property: %s\n", tab->FSAL_implicit ? "yes" : "no")); 2186d27334e2SStefano Zampini if (!dirk) { 2187d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->c)); 21889566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Nonstiff abscissa c = %s\n", buf)); 21898a381b04SJed Brown } 2190d27334e2SStefano Zampini } 21913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21928a381b04SJed Brown } 21938a381b04SJed Brown 2194d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSLoad_ARKIMEX(TS ts, PetscViewer viewer) 2195d71ae5a4SJacob Faibussowitsch { 2196f2c2a1b9SBarry Smith SNES snes; 21979c334d8fSLisandro Dalcin TSAdapt adapt; 2198f2c2a1b9SBarry Smith 2199f2c2a1b9SBarry Smith PetscFunctionBegin; 22009566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 22019566063dSJacob Faibussowitsch PetscCall(TSAdaptLoad(adapt, viewer)); 22029566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 22039566063dSJacob Faibussowitsch PetscCall(SNESLoad(snes, viewer)); 2204ad6bc421SBarry Smith /* function and Jacobian context for SNES when used with TS is always ts object */ 22059566063dSJacob Faibussowitsch PetscCall(SNESSetFunction(snes, NULL, NULL, ts)); 22069566063dSJacob Faibussowitsch PetscCall(SNESSetJacobian(snes, NULL, NULL, NULL, ts)); 22073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2208f2c2a1b9SBarry Smith } 2209f2c2a1b9SBarry Smith 22108a381b04SJed Brown /*@C 2211bcf0153eSBarry Smith TSARKIMEXSetType - Set the type of `TSARKIMEX` scheme 22128a381b04SJed Brown 221320f4b53cSBarry Smith Logically Collective 22148a381b04SJed Brown 2215d8d19677SJose E. Roman Input Parameters: 22168a381b04SJed Brown + ts - timestepping context 2217bcf0153eSBarry Smith - arktype - type of `TSARKIMEX` scheme 22188a381b04SJed Brown 2219bcf0153eSBarry Smith Options Database Key: 2220bcf0153eSBarry Smith . -ts_arkimex_type <1bee,a2,l2,ars122,2c,2d,2e,prssp2,3,bpr3,ars443,4,5> - set `TSARKIMEX` scheme type 22219bd3e852SBarry Smith 22228a381b04SJed Brown Level: intermediate 22238a381b04SJed Brown 22241cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEX1BEE`, `TSARKIMEXA2`, `TSARKIMEXL2`, `TSARKIMEXARS122`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEXPRSSP2`, 2225db781477SPatrick Sanan `TSARKIMEX3`, `TSARKIMEXBPR3`, `TSARKIMEXARS443`, `TSARKIMEX4`, `TSARKIMEX5` 22268a381b04SJed Brown @*/ 2227d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetType(TS ts, TSARKIMEXType arktype) 2228d71ae5a4SJacob Faibussowitsch { 22298a381b04SJed Brown PetscFunctionBegin; 22308a381b04SJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22314f572ea9SToby Isaac PetscAssertPointer(arktype, 2); 2232cac4c232SBarry Smith PetscTryMethod(ts, "TSARKIMEXSetType_C", (TS, TSARKIMEXType), (ts, arktype)); 22333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22348a381b04SJed Brown } 22358a381b04SJed Brown 22368a381b04SJed Brown /*@C 2237bcf0153eSBarry Smith TSARKIMEXGetType - Get the type of `TSARKIMEX` scheme 22388a381b04SJed Brown 223920f4b53cSBarry Smith Logically Collective 22408a381b04SJed Brown 22418a381b04SJed Brown Input Parameter: 22428a381b04SJed Brown . ts - timestepping context 22438a381b04SJed Brown 22448a381b04SJed Brown Output Parameter: 2245bcf0153eSBarry Smith . arktype - type of `TSARKIMEX` scheme 22468a381b04SJed Brown 22478a381b04SJed Brown Level: intermediate 22488a381b04SJed Brown 224942747ad1SJacob Faibussowitsch .seealso: [](ch_ts), `TSARKIMEXc` 22508a381b04SJed Brown @*/ 2251d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetType(TS ts, TSARKIMEXType *arktype) 2252d71ae5a4SJacob Faibussowitsch { 22538a381b04SJed Brown PetscFunctionBegin; 22548a381b04SJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2255cac4c232SBarry Smith PetscUseMethod(ts, "TSARKIMEXGetType_C", (TS, TSARKIMEXType *), (ts, arktype)); 22563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22578a381b04SJed Brown } 22588a381b04SJed Brown 225916353aafSBarry Smith /*@ 2260bcf0153eSBarry Smith TSARKIMEXSetFullyImplicit - Solve both parts of the equation implicitly, including the part that is normally solved explicitly 22614cc180ffSJed Brown 226220f4b53cSBarry Smith Logically Collective 22634cc180ffSJed Brown 2264d8d19677SJose E. Roman Input Parameters: 22654cc180ffSJed Brown + ts - timestepping context 2266bcf0153eSBarry Smith - flg - `PETSC_TRUE` for fully implicit 22674cc180ffSJed Brown 22684cc180ffSJed Brown Level: intermediate 22694cc180ffSJed Brown 22701cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXGetType()`, `TSARKIMEXGetFullyImplicit()` 22714cc180ffSJed Brown @*/ 2272d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetFullyImplicit(TS ts, PetscBool flg) 2273d71ae5a4SJacob Faibussowitsch { 22744cc180ffSJed Brown PetscFunctionBegin; 22754cc180ffSJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22763a28c0e5SStefano Zampini PetscValidLogicalCollectiveBool(ts, flg, 2); 2277cac4c232SBarry Smith PetscTryMethod(ts, "TSARKIMEXSetFullyImplicit_C", (TS, PetscBool), (ts, flg)); 22783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22794cc180ffSJed Brown } 22804cc180ffSJed Brown 22813a28c0e5SStefano Zampini /*@ 22823a28c0e5SStefano Zampini TSARKIMEXGetFullyImplicit - Inquires if both parts of the equation are solved implicitly 22833a28c0e5SStefano Zampini 228420f4b53cSBarry Smith Logically Collective 22853a28c0e5SStefano Zampini 22863a28c0e5SStefano Zampini Input Parameter: 22873a28c0e5SStefano Zampini . ts - timestepping context 22883a28c0e5SStefano Zampini 22897a7aea1fSJed Brown Output Parameter: 2290bcf0153eSBarry Smith . flg - `PETSC_TRUE` for fully implicit 22913a28c0e5SStefano Zampini 22923a28c0e5SStefano Zampini Level: intermediate 22933a28c0e5SStefano Zampini 22941cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()` 22953a28c0e5SStefano Zampini @*/ 2296d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetFullyImplicit(TS ts, PetscBool *flg) 2297d71ae5a4SJacob Faibussowitsch { 22983a28c0e5SStefano Zampini PetscFunctionBegin; 22993a28c0e5SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 23004f572ea9SToby Isaac PetscAssertPointer(flg, 2); 2301cac4c232SBarry Smith PetscUseMethod(ts, "TSARKIMEXGetFullyImplicit_C", (TS, PetscBool *), (ts, flg)); 23023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23033a28c0e5SStefano Zampini } 23043a28c0e5SStefano Zampini 2305d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetType_ARKIMEX(TS ts, TSARKIMEXType *arktype) 2306d71ae5a4SJacob Faibussowitsch { 23078a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23088a381b04SJed Brown 23098a381b04SJed Brown PetscFunctionBegin; 23108a381b04SJed Brown *arktype = ark->tableau->name; 23113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23128a381b04SJed Brown } 2313d27334e2SStefano Zampini 2314d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetType_ARKIMEX(TS ts, TSARKIMEXType arktype) 2315d71ae5a4SJacob Faibussowitsch { 23168a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23178a381b04SJed Brown PetscBool match; 23188a381b04SJed Brown ARKTableauLink link; 23198a381b04SJed Brown 23208a381b04SJed Brown PetscFunctionBegin; 23218a381b04SJed Brown if (ark->tableau) { 23229566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(ark->tableau->name, arktype, &match)); 23233ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 23248a381b04SJed Brown } 23258a381b04SJed Brown for (link = ARKTableauList; link; link = link->next) { 23269566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(link->tab.name, arktype, &match)); 23278a381b04SJed Brown if (match) { 23289566063dSJacob Faibussowitsch if (ts->setupcalled) PetscCall(TSARKIMEXTableauReset(ts)); 23298a381b04SJed Brown ark->tableau = &link->tab; 23309566063dSJacob Faibussowitsch if (ts->setupcalled) PetscCall(TSARKIMEXTableauSetUp(ts)); 23312ffb9264SLisandro Dalcin ts->default_adapt_type = ark->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE; 23323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23338a381b04SJed Brown } 23348a381b04SJed Brown } 233598921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", arktype); 23368a381b04SJed Brown } 2337e0877f53SBarry Smith 2338d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetFullyImplicit_ARKIMEX(TS ts, PetscBool flg) 2339d71ae5a4SJacob Faibussowitsch { 23404cc180ffSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23414cc180ffSJed Brown 23424cc180ffSJed Brown PetscFunctionBegin; 23434cc180ffSJed Brown ark->imex = (PetscBool)!flg; 23443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23454cc180ffSJed Brown } 23468a381b04SJed Brown 2347d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetFullyImplicit_ARKIMEX(TS ts, PetscBool *flg) 2348d71ae5a4SJacob Faibussowitsch { 23493a28c0e5SStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23503a28c0e5SStefano Zampini 23513a28c0e5SStefano Zampini PetscFunctionBegin; 23523a28c0e5SStefano Zampini *flg = (PetscBool)!ark->imex; 23533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23543a28c0e5SStefano Zampini } 23553a28c0e5SStefano Zampini 2356d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSDestroy_ARKIMEX(TS ts) 2357d71ae5a4SJacob Faibussowitsch { 2358b3a6b972SJed Brown PetscFunctionBegin; 23599566063dSJacob Faibussowitsch PetscCall(TSReset_ARKIMEX(ts)); 2360b3a6b972SJed Brown if (ts->dm) { 23619566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts)); 23629566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts)); 2363b3a6b972SJed Brown } 23649566063dSJacob Faibussowitsch PetscCall(PetscFree(ts->data)); 2365d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", NULL)); 2366d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", NULL)); 23679566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", NULL)); 23689566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", NULL)); 23699566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", NULL)); 23702e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", NULL)); 23713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2372b3a6b972SJed Brown } 2373b3a6b972SJed Brown 23748a381b04SJed Brown /* ------------------------------------------------------------ */ 23758a381b04SJed Brown /*MC 2376c79dcfbdSBarry Smith TSARKIMEX - ODE and DAE solver using additive Runge-Kutta IMEX schemes 23778a381b04SJed Brown 2378fca742c7SJed Brown These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly 2379fca742c7SJed Brown nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part 2380bcf0153eSBarry Smith of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`. 2381d0685a90SJed Brown 23828a381b04SJed Brown Level: beginner 23838a381b04SJed Brown 2384bcf0153eSBarry Smith Notes: 2385bcf0153eSBarry Smith The default is `TSARKIMEX3`, it can be changed with `TSARKIMEXSetType()` or -ts_arkimex_type 23868a381b04SJed Brown 2387bcf0153eSBarry Smith If the equation is implicit or a DAE, then `TSSetEquationType()` needs to be set accordingly. Refer to the manual for further information. 2388bcf0153eSBarry Smith 2389bcf0153eSBarry 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). 2390bcf0153eSBarry Smith 2391bcf0153eSBarry Smith Consider trying `TSROSW` if the stiff part is linear or weakly nonlinear. 2392bcf0153eSBarry Smith 23931cc06b55SBarry Smith .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSARKIMEXSetType()`, `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`, `TSARKIMEXGetFullyImplicit()`, 2394bcf0153eSBarry Smith `TSARKIMEX1BEE`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEX3`, `TSARKIMEXL2`, `TSARKIMEXA2`, `TSARKIMEXARS122`, 2395bcf0153eSBarry Smith `TSARKIMEX4`, `TSARKIMEX5`, `TSARKIMEXPRSSP2`, `TSARKIMEXARS443`, `TSARKIMEXBPR3`, `TSARKIMEXType`, `TSARKIMEXRegister()`, `TSType` 23968a381b04SJed Brown M*/ 2397d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSCreate_ARKIMEX(TS ts) 2398d71ae5a4SJacob Faibussowitsch { 239980ab5e31SHong Zhang TS_ARKIMEX *ark; 2400d27334e2SStefano Zampini PetscBool dirk; 24018a381b04SJed Brown 24028a381b04SJed Brown PetscFunctionBegin; 24039566063dSJacob Faibussowitsch PetscCall(TSARKIMEXInitializePackage()); 2404d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 24058a381b04SJed Brown 24068a381b04SJed Brown ts->ops->reset = TSReset_ARKIMEX; 240780ab5e31SHong Zhang ts->ops->adjointreset = TSAdjointReset_ARKIMEX; 24088a381b04SJed Brown ts->ops->destroy = TSDestroy_ARKIMEX; 24098a381b04SJed Brown ts->ops->view = TSView_ARKIMEX; 2410f2c2a1b9SBarry Smith ts->ops->load = TSLoad_ARKIMEX; 24118a381b04SJed Brown ts->ops->setup = TSSetUp_ARKIMEX; 241280ab5e31SHong Zhang ts->ops->adjointsetup = TSAdjointSetUp_ARKIMEX; 24138a381b04SJed Brown ts->ops->step = TSStep_ARKIMEX; 2414cd652676SJed Brown ts->ops->interpolate = TSInterpolate_ARKIMEX; 2415108c343cSJed Brown ts->ops->evaluatestep = TSEvaluateStep_ARKIMEX; 241624655328SShri ts->ops->rollback = TSRollBack_ARKIMEX; 24178a381b04SJed Brown ts->ops->setfromoptions = TSSetFromOptions_ARKIMEX; 24188a381b04SJed Brown ts->ops->snesfunction = SNESTSFormFunction_ARKIMEX; 24198a381b04SJed Brown ts->ops->snesjacobian = SNESTSFormJacobian_ARKIMEX; 242080ab5e31SHong Zhang ts->ops->getstages = TSGetStages_ARKIMEX; 242180ab5e31SHong Zhang ts->ops->adjointstep = TSAdjointStep_ARKIMEX; 24228a381b04SJed Brown 2423efd4aadfSBarry Smith ts->usessnes = PETSC_TRUE; 2424efd4aadfSBarry Smith 242580ab5e31SHong Zhang PetscCall(PetscNew(&ark)); 242680ab5e31SHong Zhang ts->data = (void *)ark; 2427d27334e2SStefano Zampini ark->imex = dirk ? PETSC_FALSE : PETSC_TRUE; 242880ab5e31SHong Zhang 242980ab5e31SHong Zhang ark->VecsDeltaLam = NULL; 243080ab5e31SHong Zhang ark->VecsSensiTemp = NULL; 243180ab5e31SHong Zhang ark->VecsSensiPTemp = NULL; 24328a381b04SJed Brown 24339566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", TSARKIMEXGetType_ARKIMEX)); 2434d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", TSARKIMEXGetFullyImplicit_ARKIMEX)); 2435d27334e2SStefano Zampini if (!dirk) { 24369566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", TSARKIMEXSetType_ARKIMEX)); 24379566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", TSARKIMEXSetFullyImplicit_ARKIMEX)); 24389566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetType(ts, TSARKIMEXDefault)); 2439d27334e2SStefano Zampini } 2440d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2441d27334e2SStefano Zampini } 2442d27334e2SStefano Zampini 2443d27334e2SStefano Zampini /* ------------------------------------------------------------ */ 2444d27334e2SStefano Zampini 2445d27334e2SStefano Zampini static PetscErrorCode TSDIRKSetType_DIRK(TS ts, TSDIRKType dirktype) 2446d27334e2SStefano Zampini { 2447d27334e2SStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2448d27334e2SStefano Zampini 2449d27334e2SStefano Zampini PetscFunctionBegin; 2450d27334e2SStefano Zampini PetscCall(TSARKIMEXSetType_ARKIMEX(ts, dirktype)); 2451d27334e2SStefano Zampini PetscCheck(!ark->tableau->additive, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONG, "Method \"%s\" is not DIRK", dirktype); 2452d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2453d27334e2SStefano Zampini } 2454d27334e2SStefano Zampini 2455d27334e2SStefano Zampini /*@C 2456d27334e2SStefano Zampini TSDIRKSetType - Set the type of `TSDIRK` scheme 2457d27334e2SStefano Zampini 2458d27334e2SStefano Zampini Logically Collective 2459d27334e2SStefano Zampini 2460d27334e2SStefano Zampini Input Parameters: 2461d27334e2SStefano Zampini + ts - timestepping context 2462d27334e2SStefano Zampini - dirktype - type of `TSDIRK` scheme 2463d27334e2SStefano Zampini 2464d27334e2SStefano Zampini Options Database Key: 2465d27334e2SStefano Zampini . -ts_dirkimex_type - set `TSDIRK` scheme type 2466d27334e2SStefano Zampini 2467d27334e2SStefano Zampini Level: intermediate 2468d27334e2SStefano Zampini 2469d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKGetType()`, `TSDIRK`, `TSDIRKType` 2470d27334e2SStefano Zampini @*/ 2471d27334e2SStefano Zampini PetscErrorCode TSDIRKSetType(TS ts, TSDIRKType dirktype) 2472d27334e2SStefano Zampini { 2473d27334e2SStefano Zampini PetscFunctionBegin; 2474d27334e2SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2475d27334e2SStefano Zampini PetscAssertPointer(dirktype, 2); 2476d27334e2SStefano Zampini PetscTryMethod(ts, "TSDIRKSetType_C", (TS, TSDIRKType), (ts, dirktype)); 2477d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2478d27334e2SStefano Zampini } 2479d27334e2SStefano Zampini 2480d27334e2SStefano Zampini /*@C 2481d27334e2SStefano Zampini TSDIRKGetType - Get the type of `TSDIRK` scheme 2482d27334e2SStefano Zampini 2483d27334e2SStefano Zampini Logically Collective 2484d27334e2SStefano Zampini 2485d27334e2SStefano Zampini Input Parameter: 2486d27334e2SStefano Zampini . ts - timestepping context 2487d27334e2SStefano Zampini 2488d27334e2SStefano Zampini Output Parameter: 2489d27334e2SStefano Zampini . dirktype - type of `TSDIRK` scheme 2490d27334e2SStefano Zampini 2491d27334e2SStefano Zampini Level: intermediate 2492d27334e2SStefano Zampini 2493d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKSetType()` 2494d27334e2SStefano Zampini @*/ 2495d27334e2SStefano Zampini PetscErrorCode TSDIRKGetType(TS ts, TSDIRKType *dirktype) 2496d27334e2SStefano Zampini { 2497d27334e2SStefano Zampini PetscFunctionBegin; 2498d27334e2SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2499d27334e2SStefano Zampini PetscUseMethod(ts, "TSDIRKGetType_C", (TS, TSDIRKType *), (ts, dirktype)); 2500d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2501d27334e2SStefano Zampini } 2502d27334e2SStefano Zampini 2503d27334e2SStefano Zampini /*MC 25043405e92cSStefano Zampini TSDIRK - ODE and DAE solver using Diagonally implicit Runge-Kutta schemes. 2505d27334e2SStefano Zampini 2506d27334e2SStefano Zampini Level: beginner 2507d27334e2SStefano Zampini 2508d27334e2SStefano Zampini Notes: 25093405e92cSStefano Zampini The default is `TSDIRKES213SAL`, it can be changed with `TSDIRKSetType()` or -ts_dirk_type. 25103405e92cSStefano Zampini The convention used in PETSc to name the DIRK methods is TSDIRK[E][S]PQS[SA][L][A] with: 25113405e92cSStefano Zampini + E - whether the method has an explicit first stage 25123405e92cSStefano Zampini . S - whether the method is single diagonal 25133405e92cSStefano Zampini . P - order of the advancing method 25143405e92cSStefano Zampini . Q - order of the embedded method 25153405e92cSStefano Zampini . S - number of stages 25163405e92cSStefano Zampini . SA - whether the method is stiffly accurate 25173405e92cSStefano Zampini . L - whether the method is L-stable 25183405e92cSStefano Zampini - A - whether the method is A-stable 2519d27334e2SStefano Zampini 2520d27334e2SStefano Zampini .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSDIRKSetType()`, `TSDIRKGetType()`, `TSDIRKRegister()`. 2521d27334e2SStefano Zampini M*/ 2522d27334e2SStefano Zampini PETSC_EXTERN PetscErrorCode TSCreate_DIRK(TS ts) 2523d27334e2SStefano Zampini { 2524d27334e2SStefano Zampini PetscFunctionBegin; 2525d27334e2SStefano Zampini PetscCall(TSCreate_ARKIMEX(ts)); 2526d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", TSARKIMEXGetType_ARKIMEX)); 2527d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", TSDIRKSetType_DIRK)); 2528d27334e2SStefano Zampini PetscCall(TSDIRKSetType(ts, TSDIRKDefault)); 25293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 25308a381b04SJed Brown } 2531