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) */ 550467964bSStefano Zampini IS alg_is; /* Index set for algebraic variables, needed when restarting with DIRK */ 568a381b04SJed Brown PetscScalar *work; /* Scalar work */ 57b296d7d5SJed Brown PetscReal scoeff; /* shift = scoeff/dt */ 588a381b04SJed Brown PetscReal stage_time; 594cc180ffSJed Brown PetscBool imex; 6096400bd6SLisandro Dalcin PetscBool extrapolate; /* Extrapolate initial guess from previous time-step stage values */ 61108c343cSJed Brown TSStepStatus status; 6280ab5e31SHong Zhang 6380ab5e31SHong Zhang /* context for sensitivity analysis */ 6480ab5e31SHong Zhang Vec *VecsDeltaLam; /* Increment of the adjoint sensitivity w.r.t IC at stage */ 6580ab5e31SHong Zhang Vec *VecsSensiTemp; /* Vectors to be multiplied with Jacobian transpose */ 6680ab5e31SHong Zhang Vec *VecsSensiPTemp; /* Temporary Vectors to store JacobianP-transpose-vector product */ 678a381b04SJed Brown } TS_ARKIMEX; 68d27334e2SStefano Zampini 691f80e275SEmil Constantinescu /*MC 701d27aa22SBarry Smith TSARKIMEXARS122 - Second order ARK IMEX scheme, {cite}`ascher_1997` 718a381b04SJed Brown 721f80e275SEmil Constantinescu This method has one explicit stage and one implicit stage. 731f80e275SEmil Constantinescu 74bcf0153eSBarry Smith Options Database Key: 7567b8a455SSatish Balay . -ts_arkimex_type ars122 - set arkimex type to ars122 769bd3e852SBarry Smith 77bcf0153eSBarry Smith Level: advanced 78bcf0153eSBarry Smith 791cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 801f80e275SEmil Constantinescu M*/ 81d27334e2SStefano Zampini 821f80e275SEmil Constantinescu /*MC 831f80e275SEmil Constantinescu TSARKIMEXA2 - Second order ARK IMEX scheme with A-stable implicit part. 841f80e275SEmil Constantinescu 851f80e275SEmil Constantinescu This method has an explicit stage and one implicit stage, and has an A-stable implicit scheme. This method was provided by Emil Constantinescu. 861f80e275SEmil Constantinescu 87bcf0153eSBarry Smith Options Database Key: 8867b8a455SSatish Balay . -ts_arkimex_type a2 - set arkimex type to a2 899bd3e852SBarry Smith 901f80e275SEmil Constantinescu Level: advanced 911f80e275SEmil Constantinescu 921cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 931f80e275SEmil Constantinescu M*/ 94d27334e2SStefano Zampini 951f80e275SEmil Constantinescu /*MC 961d27aa22SBarry Smith TSARKIMEXL2 - Second order ARK IMEX scheme with L-stable implicit part, {cite}`pareschi_2005` 971f80e275SEmil Constantinescu 981f80e275SEmil Constantinescu This method has two implicit stages, and L-stable implicit scheme. 991f80e275SEmil Constantinescu 100bcf0153eSBarry Smith Options Database Key: 10167b8a455SSatish Balay . -ts_arkimex_type l2 - set arkimex type to l2 1029bd3e852SBarry Smith 103bcf0153eSBarry Smith Level: advanced 104bcf0153eSBarry Smith 1051cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 1061f80e275SEmil Constantinescu M*/ 107d27334e2SStefano Zampini 1081f80e275SEmil Constantinescu /*MC 109c79dcfbdSBarry Smith TSARKIMEX1BEE - First order backward Euler represented as an ARK IMEX scheme with extrapolation as error estimator. This is a 3-stage method. 110e817cc15SEmil Constantinescu 111e817cc15SEmil Constantinescu This method is aimed at starting the integration of implicit DAEs when explicit first-stage ARK methods are used. 112e817cc15SEmil Constantinescu 113bcf0153eSBarry Smith Options Database Key: 11467b8a455SSatish Balay . -ts_arkimex_type 1bee - set arkimex type to 1bee 1159bd3e852SBarry Smith 116e817cc15SEmil Constantinescu Level: advanced 117e817cc15SEmil Constantinescu 1181cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 119e817cc15SEmil Constantinescu M*/ 120d27334e2SStefano Zampini 121e817cc15SEmil Constantinescu /*MC 1221f80e275SEmil Constantinescu TSARKIMEX2C - Second order ARK IMEX scheme with L-stable implicit part. 1231f80e275SEmil Constantinescu 1241f80e275SEmil Constantinescu This method has one explicit stage and two implicit stages. The implicit part is the same as in TSARKIMEX2D and TSARKIMEX2E, but the explicit part has a larger stability region on the negative real axis. This method was provided by Emil Constantinescu. 1251f80e275SEmil Constantinescu 126bcf0153eSBarry Smith Options Database Key: 12767b8a455SSatish Balay . -ts_arkimex_type 2c - set arkimex type to 2c 1289bd3e852SBarry Smith 1291f80e275SEmil Constantinescu Level: advanced 1301f80e275SEmil Constantinescu 1311cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 1321f80e275SEmil Constantinescu M*/ 133d27334e2SStefano Zampini 13464f491ddSJed Brown /*MC 13564f491ddSJed Brown TSARKIMEX2D - Second order ARK IMEX scheme with L-stable implicit part. 13664f491ddSJed Brown 137da81f932SPierre Jolivet This method has one explicit stage and two implicit stages. The stability function is independent of the explicit part in the infinity limit of the implicit component. This method was provided by Emil Constantinescu. 13864f491ddSJed Brown 139bcf0153eSBarry Smith Options Database Key: 14067b8a455SSatish Balay . -ts_arkimex_type 2d - set arkimex type to 2d 1419bd3e852SBarry Smith 142b330ce4dSSatish Balay Level: advanced 143b330ce4dSSatish Balay 1441cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 14564f491ddSJed Brown M*/ 146d27334e2SStefano Zampini 14764f491ddSJed Brown /*MC 14864f491ddSJed Brown TSARKIMEX2E - Second order ARK IMEX scheme with L-stable implicit part. 14964f491ddSJed Brown 15015229ffcSPierre Jolivet This method has one explicit stage and two implicit stages. It is an optimal method developed by Emil Constantinescu. 15164f491ddSJed Brown 152bcf0153eSBarry Smith Options Database Key: 15367b8a455SSatish Balay . -ts_arkimex_type 2e - set arkimex type to 2e 1549bd3e852SBarry Smith 155b330ce4dSSatish Balay Level: advanced 156b330ce4dSSatish Balay 1571cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 15864f491ddSJed Brown M*/ 159d27334e2SStefano Zampini 16064f491ddSJed Brown /*MC 1611d27aa22SBarry Smith TSARKIMEXPRSSP2 - Second order SSP ARK IMEX scheme, {cite}`pareschi_2005` 1626cf0794eSJed Brown 1636cf0794eSJed Brown This method has three implicit stages. 1646cf0794eSJed Brown 1651d27aa22SBarry Smith This method is referred to as SSP2-(3,3,2) in <https://arxiv.org/abs/1110.4375> 1666cf0794eSJed Brown 167bcf0153eSBarry Smith Options Database Key: 16867b8a455SSatish Balay . -ts_arkimex_type prssp2 - set arkimex type to prssp2 1699bd3e852SBarry Smith 1706cf0794eSJed Brown Level: advanced 1716cf0794eSJed Brown 1721cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 1736cf0794eSJed Brown M*/ 174d27334e2SStefano Zampini 1756cf0794eSJed Brown /*MC 1761d27aa22SBarry Smith TSARKIMEX3 - Third order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003` 17764f491ddSJed Brown 17864f491ddSJed Brown This method has one explicit stage and three implicit stages. 17964f491ddSJed Brown 180bcf0153eSBarry Smith Options Database Key: 18167b8a455SSatish Balay . -ts_arkimex_type 3 - set arkimex type to 3 1829bd3e852SBarry Smith 183bcf0153eSBarry Smith Level: advanced 184bcf0153eSBarry Smith 1851cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 18664f491ddSJed Brown M*/ 187d27334e2SStefano Zampini 18864f491ddSJed Brown /*MC 1891d27aa22SBarry Smith TSARKIMEXARS443 - Third order ARK IMEX scheme, {cite}`ascher_1997` 1906cf0794eSJed Brown 1916cf0794eSJed Brown This method has one explicit stage and four implicit stages. 1926cf0794eSJed Brown 193bcf0153eSBarry Smith Options Database Key: 19467b8a455SSatish Balay . -ts_arkimex_type ars443 - set arkimex type to ars443 1959bd3e852SBarry Smith 196bcf0153eSBarry Smith Level: advanced 197bcf0153eSBarry Smith 1981d27aa22SBarry Smith Notes: 1991d27aa22SBarry Smith This method is referred to as ARS(4,4,3) in <https://arxiv.org/abs/1110.4375> 2006cf0794eSJed Brown 2011cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 2026cf0794eSJed Brown M*/ 203d27334e2SStefano Zampini 2046cf0794eSJed Brown /*MC 2051d27aa22SBarry Smith TSARKIMEXBPR3 - Third order ARK IMEX scheme. Referred to as ARK3 in <https://arxiv.org/abs/1110.4375> 2066cf0794eSJed Brown 2076cf0794eSJed Brown This method has one explicit stage and four implicit stages. 2086cf0794eSJed Brown 209bcf0153eSBarry Smith Options Database Key: 21067b8a455SSatish Balay . -ts_arkimex_type bpr3 - set arkimex type to bpr3 2119bd3e852SBarry Smith 212bcf0153eSBarry Smith Level: advanced 213bcf0153eSBarry Smith 2141cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 2156cf0794eSJed Brown M*/ 216d27334e2SStefano Zampini 2176cf0794eSJed Brown /*MC 2181d27aa22SBarry Smith TSARKIMEX4 - Fourth order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`. 21964f491ddSJed Brown 22064f491ddSJed Brown This method has one explicit stage and four implicit stages. 22164f491ddSJed Brown 222bcf0153eSBarry Smith Options Database Key: 22367b8a455SSatish Balay . -ts_arkimex_type 4 - set arkimex type to4 2249bd3e852SBarry Smith 225bcf0153eSBarry Smith Level: advanced 226bcf0153eSBarry Smith 2271cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 22864f491ddSJed Brown M*/ 229d27334e2SStefano Zampini 23064f491ddSJed Brown /*MC 2311d27aa22SBarry Smith TSARKIMEX5 - Fifth order ARK IMEX scheme with L-stable implicit part, {cite}`kennedy_2003`. 23264f491ddSJed Brown 23364f491ddSJed Brown This method has one explicit stage and five implicit stages. 23464f491ddSJed Brown 235bcf0153eSBarry Smith Options Database Key: 23667b8a455SSatish Balay . -ts_arkimex_type 5 - set arkimex type to 5 2379bd3e852SBarry Smith 238bcf0153eSBarry Smith Level: advanced 239bcf0153eSBarry Smith 2401cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEXSetType()` 24164f491ddSJed Brown M*/ 24264f491ddSJed Brown 2433405e92cSStefano Zampini /*MC 2443405e92cSStefano Zampini TSDIRKS212 - Second order DIRK scheme. 2453405e92cSStefano Zampini 2463405e92cSStefano Zampini This method has two implicit stages with an embedded method of other 1. 2473405e92cSStefano Zampini See `TSDIRK` for additional details. 2483405e92cSStefano Zampini 2493405e92cSStefano Zampini Options Database Key: 2503405e92cSStefano Zampini . -ts_dirk_type s212 - select this method. 2513405e92cSStefano Zampini 2523405e92cSStefano Zampini Level: advanced 2533405e92cSStefano Zampini 2543405e92cSStefano Zampini Note: 2553405e92cSStefano Zampini This is the default DIRK scheme in SUNDIALS. 2563405e92cSStefano Zampini 2573405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2583405e92cSStefano Zampini M*/ 2593405e92cSStefano Zampini 2603405e92cSStefano Zampini /*MC 2611d27aa22SBarry Smith TSDIRKES122SAL - First order DIRK scheme <https://arxiv.org/abs/1803.01613> 2623405e92cSStefano Zampini 2633405e92cSStefano Zampini Uses backward Euler as advancing method and trapezoidal rule as embedded method. See `TSDIRK` for additional details. 2643405e92cSStefano Zampini 2653405e92cSStefano Zampini Options Database Key: 2663405e92cSStefano Zampini . -ts_dirk_type es122sal - select this method. 2673405e92cSStefano Zampini 2683405e92cSStefano Zampini Level: advanced 2693405e92cSStefano Zampini 2703405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2713405e92cSStefano Zampini M*/ 2723405e92cSStefano Zampini 2733405e92cSStefano Zampini /*MC 2741d27aa22SBarry Smith TSDIRKES213SAL - Second order DIRK scheme {cite}`kennedy2019diagonally`. Also known as TR-BDF2, see{cite}`hosea1996analysis` 2753405e92cSStefano Zampini 2763405e92cSStefano Zampini See `TSDIRK` for additional details. 2773405e92cSStefano Zampini 2783405e92cSStefano Zampini Options Database Key: 2793405e92cSStefano Zampini . -ts_dirk_type es213sal - select this method. 2803405e92cSStefano Zampini 2813405e92cSStefano Zampini Level: advanced 2823405e92cSStefano Zampini 2833405e92cSStefano Zampini Note: 2843405e92cSStefano Zampini This is the default DIRK scheme used in PETSc. 2853405e92cSStefano Zampini 2863405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 2873405e92cSStefano Zampini M*/ 2883405e92cSStefano Zampini 2893405e92cSStefano Zampini /*MC 2901d27aa22SBarry Smith TSDIRKES324SAL - Third order DIRK scheme, {cite}`kennedy2019diagonally` 2913405e92cSStefano Zampini 2923405e92cSStefano Zampini See `TSDIRK` for additional details. 2933405e92cSStefano Zampini 2943405e92cSStefano Zampini Options Database Key: 2953405e92cSStefano Zampini . -ts_dirk_type es324sal - select this method. 2963405e92cSStefano Zampini 2973405e92cSStefano Zampini Level: advanced 2983405e92cSStefano Zampini 2993405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3003405e92cSStefano Zampini M*/ 3013405e92cSStefano Zampini 3023405e92cSStefano Zampini /*MC 3031d27aa22SBarry Smith TSDIRKES325SAL - Third order DIRK scheme {cite}`kennedy2019diagonally`. 3043405e92cSStefano Zampini 3053405e92cSStefano Zampini See `TSDIRK` for additional details. 3063405e92cSStefano Zampini 3073405e92cSStefano Zampini Options Database Key: 3083405e92cSStefano Zampini . -ts_dirk_type es325sal - select this method. 3093405e92cSStefano Zampini 3103405e92cSStefano Zampini Level: advanced 3113405e92cSStefano Zampini 3123405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3133405e92cSStefano Zampini M*/ 3143405e92cSStefano Zampini 3153405e92cSStefano Zampini /*MC 3161d27aa22SBarry Smith TSDIRK657A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3173405e92cSStefano Zampini 3183405e92cSStefano Zampini See `TSDIRK` for additional details. 3193405e92cSStefano Zampini 3203405e92cSStefano Zampini Options Database Key: 3213405e92cSStefano Zampini . -ts_dirk_type 657a - select this method. 3223405e92cSStefano Zampini 3233405e92cSStefano Zampini Level: advanced 3243405e92cSStefano Zampini 3253405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3263405e92cSStefano Zampini M*/ 3273405e92cSStefano Zampini 3283405e92cSStefano Zampini /*MC 3291d27aa22SBarry Smith TSDIRKES648SA - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3303405e92cSStefano Zampini 3313405e92cSStefano Zampini See `TSDIRK` for additional details. 3323405e92cSStefano Zampini 3333405e92cSStefano Zampini Options Database Key: 3343405e92cSStefano Zampini . -ts_dirk_type es648sa - select this method. 3353405e92cSStefano Zampini 3363405e92cSStefano Zampini Level: advanced 3373405e92cSStefano Zampini 3383405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3393405e92cSStefano Zampini M*/ 3403405e92cSStefano Zampini 3413405e92cSStefano Zampini /*MC 3421d27aa22SBarry Smith TSDIRK658A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3433405e92cSStefano Zampini 3443405e92cSStefano Zampini See `TSDIRK` for additional details. 3453405e92cSStefano Zampini 3463405e92cSStefano Zampini Options Database Key: 3473405e92cSStefano Zampini . -ts_dirk_type 658a - select this method. 3483405e92cSStefano Zampini 3493405e92cSStefano Zampini Level: advanced 3503405e92cSStefano Zampini 3513405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3523405e92cSStefano Zampini M*/ 3533405e92cSStefano Zampini 3543405e92cSStefano Zampini /*MC 3551d27aa22SBarry Smith TSDIRKS659A - Sixth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3563405e92cSStefano Zampini 3573405e92cSStefano Zampini See `TSDIRK` for additional details. 3583405e92cSStefano Zampini 3593405e92cSStefano Zampini Options Database Key: 3603405e92cSStefano Zampini . -ts_dirk_type s659a - select this method. 3613405e92cSStefano Zampini 3623405e92cSStefano Zampini Level: advanced 3633405e92cSStefano Zampini 3643405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3653405e92cSStefano Zampini M*/ 3663405e92cSStefano Zampini 3673405e92cSStefano Zampini /*MC 3681d27aa22SBarry Smith TSDIRK7510SAL - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3693405e92cSStefano Zampini 3703405e92cSStefano Zampini See `TSDIRK` for additional details. 3713405e92cSStefano Zampini 3723405e92cSStefano Zampini Options Database Key: 3733405e92cSStefano Zampini . -ts_dirk_type 7510sal - select this method. 3743405e92cSStefano Zampini 3753405e92cSStefano Zampini Level: advanced 3763405e92cSStefano Zampini 3773405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3783405e92cSStefano Zampini M*/ 3793405e92cSStefano Zampini 3803405e92cSStefano Zampini /*MC 3811d27aa22SBarry Smith TSDIRKES7510SA - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3823405e92cSStefano Zampini 3833405e92cSStefano Zampini See `TSDIRK` for additional details. 3843405e92cSStefano Zampini 3853405e92cSStefano Zampini Options Database Key: 3863405e92cSStefano Zampini . -ts_dirk_type es7510sa - select this method. 3873405e92cSStefano Zampini 3883405e92cSStefano Zampini Level: advanced 3893405e92cSStefano Zampini 3903405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 3913405e92cSStefano Zampini M*/ 3923405e92cSStefano Zampini 3933405e92cSStefano Zampini /*MC 3941d27aa22SBarry Smith TSDIRK759A - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 3953405e92cSStefano Zampini 3963405e92cSStefano Zampini See `TSDIRK` for additional details. 3973405e92cSStefano Zampini 3983405e92cSStefano Zampini Options Database Key: 3993405e92cSStefano Zampini . -ts_dirk_type 759a - select this method. 4003405e92cSStefano Zampini 4013405e92cSStefano Zampini Level: advanced 4023405e92cSStefano Zampini 4033405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4043405e92cSStefano Zampini M*/ 4053405e92cSStefano Zampini 4063405e92cSStefano Zampini /*MC 4071d27aa22SBarry Smith TSDIRKS7511SAL - Seventh order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4083405e92cSStefano Zampini 4093405e92cSStefano Zampini See `TSDIRK` for additional details. 4103405e92cSStefano Zampini 4113405e92cSStefano Zampini Options Database Key: 4123405e92cSStefano Zampini . -ts_dirk_type s7511sal - select this method. 4133405e92cSStefano Zampini 4143405e92cSStefano Zampini Level: advanced 4153405e92cSStefano Zampini 4163405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4173405e92cSStefano Zampini M*/ 4183405e92cSStefano Zampini 4193405e92cSStefano Zampini /*MC 4201d27aa22SBarry Smith TSDIRK8614A - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4213405e92cSStefano Zampini 4223405e92cSStefano Zampini See `TSDIRK` for additional details. 4233405e92cSStefano Zampini 4243405e92cSStefano Zampini Options Database Key: 4253405e92cSStefano Zampini . -ts_dirk_type 8614a - select this method. 4263405e92cSStefano Zampini 4273405e92cSStefano Zampini Level: advanced 4283405e92cSStefano Zampini 4293405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4303405e92cSStefano Zampini M*/ 4313405e92cSStefano Zampini 4323405e92cSStefano Zampini /*MC 4331d27aa22SBarry Smith TSDIRK8616SAL - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4343405e92cSStefano Zampini 4353405e92cSStefano Zampini See `TSDIRK` for additional details. 4363405e92cSStefano Zampini 4373405e92cSStefano Zampini Options Database Key: 4383405e92cSStefano Zampini . -ts_dirk_type 8616sal - select this method. 4393405e92cSStefano Zampini 4403405e92cSStefano Zampini Level: advanced 4413405e92cSStefano Zampini 4423405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4433405e92cSStefano Zampini M*/ 4443405e92cSStefano Zampini 4453405e92cSStefano Zampini /*MC 4461d27aa22SBarry Smith TSDIRKES8516SAL - Eighth order DIRK scheme <https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs> 4473405e92cSStefano Zampini 4483405e92cSStefano Zampini See `TSDIRK` for additional details. 4493405e92cSStefano Zampini 4503405e92cSStefano Zampini Options Database Key: 4513405e92cSStefano Zampini . -ts_dirk_type es8516sal - select this method. 4523405e92cSStefano Zampini 4533405e92cSStefano Zampini Level: advanced 4543405e92cSStefano Zampini 4553405e92cSStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSDIRKType`, `TSDIRKSetType()` 4563405e92cSStefano Zampini M*/ 4573405e92cSStefano Zampini 458d27334e2SStefano Zampini static PetscErrorCode TSHasRHSFunction(TS ts, PetscBool *has) 459d27334e2SStefano Zampini { 4608434afd1SBarry Smith TSRHSFunctionFn *func; 461d27334e2SStefano Zampini 462d27334e2SStefano Zampini PetscFunctionBegin; 463d27334e2SStefano Zampini *has = PETSC_FALSE; 464d27334e2SStefano Zampini PetscCall(DMTSGetRHSFunction(ts->dm, &func, NULL)); 465d27334e2SStefano Zampini if (func) *has = PETSC_TRUE; 466d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 467d27334e2SStefano Zampini } 468d27334e2SStefano Zampini 4698a381b04SJed Brown /*@C 470bcf0153eSBarry Smith TSARKIMEXRegisterAll - Registers all of the additive Runge-Kutta implicit-explicit methods in `TSARKIMEX` 4718a381b04SJed Brown 472fca742c7SJed Brown Not Collective, but should be called by all processes which will need the schemes to be registered 4738a381b04SJed Brown 4748a381b04SJed Brown Level: advanced 4758a381b04SJed Brown 4761cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSARKIMEX`, `TSARKIMEXRegisterDestroy()` 4778a381b04SJed Brown @*/ 478d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterAll(void) 479d71ae5a4SJacob Faibussowitsch { 4808a381b04SJed Brown PetscFunctionBegin; 4813ba16761SJacob Faibussowitsch if (TSARKIMEXRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 4828a381b04SJed Brown TSARKIMEXRegisterAllCalled = PETSC_TRUE; 483e817cc15SEmil Constantinescu 484d27334e2SStefano Zampini #define RC PetscRealConstant 485d27334e2SStefano Zampini #define s2 RC(1.414213562373095048802) /* PetscSqrtReal((PetscReal)2.0) */ 486d27334e2SStefano Zampini #define us2 RC(0.2928932188134524755992) /* 1.0-1.0/PetscSqrtReal((PetscReal)2.0); */ 487d27334e2SStefano Zampini 488d27334e2SStefano Zampini /* Diagonally implicit methods */ 489e817cc15SEmil Constantinescu { 490d27334e2SStefano Zampini /* DIRK212, default of SUNDIALS */ 491d27334e2SStefano Zampini const PetscReal A[2][2] = { 492d27334e2SStefano Zampini {RC(1.0), RC(0.0)}, 493d27334e2SStefano Zampini {RC(-1.0), RC(1.0)} 494d27334e2SStefano Zampini }; 495d27334e2SStefano Zampini const PetscReal b[2] = {RC(0.5), RC(0.5)}; 496d27334e2SStefano Zampini const PetscReal bembed[2] = {RC(1.0), RC(0.0)}; 497d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKS212, 2, 2, &A[0][0], b, NULL, bembed, 1, b)); 498d27334e2SStefano Zampini } 499d27334e2SStefano Zampini 5009371c9d4SSatish Balay { 501d27334e2SStefano Zampini /* ESDIRK12 from https://arxiv.org/pdf/1803.01613.pdf */ 502d27334e2SStefano Zampini const PetscReal A[2][2] = { 503d27334e2SStefano Zampini {RC(0.0), RC(0.0)}, 504d27334e2SStefano Zampini {RC(0.0), RC(1.0)} 505d27334e2SStefano Zampini }; 506d27334e2SStefano Zampini const PetscReal b[2] = {RC(0.0), RC(1.0)}; 507d27334e2SStefano Zampini const PetscReal bembed[2] = {RC(0.5), RC(0.5)}; 5083405e92cSStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES122SAL, 1, 2, &A[0][0], b, NULL, bembed, 1, b)); 509d27334e2SStefano Zampini } 510d27334e2SStefano Zampini 511d27334e2SStefano Zampini { 512d27334e2SStefano Zampini /* ESDIRK213L[2]SA from KC16. 5133405e92cSStefano Zampini TR-BDF2 from Hosea and Shampine 5143405e92cSStefano Zampini ESDIRK23 in https://arxiv.org/pdf/1803.01613.pdf */ 515d27334e2SStefano Zampini const PetscReal A[3][3] = { 516d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0)}, 517d27334e2SStefano Zampini {us2, us2, RC(0.0)}, 518d27334e2SStefano Zampini {s2 / RC(4.0), s2 / RC(4.0), us2 }, 519d27334e2SStefano Zampini }; 520d27334e2SStefano Zampini const PetscReal b[3] = {s2 / RC(4.0), s2 / RC(4.0), us2}; 521d27334e2SStefano Zampini const PetscReal bembed[3] = {(RC(1.0) - s2 / RC(4.0)) / RC(3.0), (RC(3.0) * s2 / RC(4.0) + RC(1.0)) / RC(3.0), us2 / RC(3.0)}; 522d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES213SAL, 2, 3, &A[0][0], b, NULL, bembed, 1, b)); 523d27334e2SStefano Zampini } 524d27334e2SStefano Zampini 525d27334e2SStefano Zampini { 526d27334e2SStefano Zampini #define g RC(0.43586652150845899941601945) 527d27334e2SStefano Zampini #define g2 PetscSqr(g) 528d27334e2SStefano Zampini #define g3 g *g2 529d27334e2SStefano Zampini #define g4 PetscSqr(g2) 530d27334e2SStefano Zampini #define g5 g *g4 531d27334e2SStefano Zampini #define c3 RC(1.0) 532d27334e2SStefano Zampini #define a32 c3 *(c3 - RC(2.0) * g) / (RC(4.0) * g) 533d27334e2SStefano Zampini #define b2 (-RC(2.0) + RC(3.0) * c3 + RC(6.0) * g * (RC(1.0) - c3)) / (RC(12.0) * g * (c3 - RC(2.0) * g)) 534d27334e2SStefano Zampini #define b3 (RC(1.0) - RC(6.0) * g + RC(6.0) * g2) / (RC(3.0) * c3 * (c3 - RC(2.0) * g)) 535d27334e2SStefano Zampini #if 0 536d27334e2SStefano Zampini /* This is for c3 = 3/5 */ 537d27334e2SStefano Zampini #define bh2 \ 538d27334e2SStefano Zampini c3 * (-RC(1.0) + RC(6.0) * g - RC(23.0) * g3 + RC(12.0) * g4 - RC(6.0) * g5) / (RC(4.0) * (RC(2.0) * g - c3) * (RC(1.0) - RC(6.0) * g + RC(6.0) * g2)) + (RC(3.0) - RC(27.0) * g + RC(68.0) * g2 - RC(55.0) * g3 + RC(21.0) * g4 - RC(6.0) * g5) / (RC(2.0) * (RC(2.0) * g - c3) * (RC(1.0) - RC(6.0) * g + RC(6.0) * g2)) 539d27334e2SStefano Zampini #define bh3 -g * (-RC(2.0) + RC(21.0) * g - RC(68.0) * g2 + RC(79.0) * g3 - RC(33.0) * g4 + RC(12.0) * g5) / (RC(2.0) * (RC(2.0) * g - c3) * (RC(1.0) - RC(6.0) * g + RC(6.0) * g2)) 540d27334e2SStefano Zampini #define bh4 -RC(3.0) * g2 * (-RC(1.0) + RC(4.0) * g - RC(2.0) * g2 + g3) / (RC(1.0) - RC(6.0) * g + RC(6.0) * g2) 541d27334e2SStefano Zampini #else 542d27334e2SStefano Zampini /* This is for c3 = 1.0 */ 543d27334e2SStefano Zampini #define bh2 a32 544d27334e2SStefano Zampini #define bh3 g 545d27334e2SStefano Zampini #define bh4 RC(0.0) 546d27334e2SStefano Zampini #endif 547d27334e2SStefano Zampini /* ESDIRK3(2I)4L[2]SA from KC16 with c3 = 1.0 */ 548d27334e2SStefano Zampini /* Given by Kvaerno https://link.springer.com/article/10.1023/b:bitn.0000046811.70614.38 */ 549d27334e2SStefano Zampini const PetscReal A[4][4] = { 550d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0)}, 551d27334e2SStefano Zampini {g, g, RC(0.0), RC(0.0)}, 552d27334e2SStefano Zampini {c3 - a32 - g, a32, g, RC(0.0)}, 553d27334e2SStefano Zampini {RC(1.0) - b2 - b3 - g, b2, b3, g }, 554d27334e2SStefano Zampini }; 555d27334e2SStefano Zampini const PetscReal b[4] = {RC(1.0) - b2 - b3 - g, b2, b3, g}; 556d27334e2SStefano Zampini const PetscReal bembed[4] = {RC(1.0) - bh2 - bh3 - bh4, bh2, bh3, bh4}; 557d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES324SAL, 3, 4, &A[0][0], b, NULL, bembed, 1, b)); 558d27334e2SStefano Zampini #undef g 559d27334e2SStefano Zampini #undef g2 560d27334e2SStefano Zampini #undef g3 561d27334e2SStefano Zampini #undef c3 562d27334e2SStefano Zampini #undef a32 563d27334e2SStefano Zampini #undef b2 564d27334e2SStefano Zampini #undef b3 565d27334e2SStefano Zampini #undef bh2 566d27334e2SStefano Zampini #undef bh3 567d27334e2SStefano Zampini #undef bh4 568d27334e2SStefano Zampini } 569d27334e2SStefano Zampini 570d27334e2SStefano Zampini { 571d27334e2SStefano Zampini /* ESDIRK3(2I)5L[2]SA from KC16 */ 572d27334e2SStefano Zampini const PetscReal A[5][5] = { 573d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 574d27334e2SStefano Zampini {RC(9.0) / RC(40.0), RC(9.0) / RC(40.0), RC(0.0), RC(0.0), RC(0.0) }, 575d27334e2SStefano Zampini {RC(19.0) / RC(72.0), RC(14.0) / RC(45.0), RC(9.0) / RC(40.0), RC(0.0), RC(0.0) }, 576d27334e2SStefano Zampini {RC(3337.0) / RC(11520.0), RC(233.0) / RC(720.0), RC(207.0) / RC(1280.0), RC(9.0) / RC(40.0), RC(0.0) }, 577d27334e2SStefano Zampini {RC(7415.0) / RC(34776.0), RC(9920.0) / RC(30429.0), RC(4845.0) / RC(9016.0), -RC(5827.0) / RC(19320.0), RC(9.0) / RC(40.0)}, 578d27334e2SStefano Zampini }; 579d27334e2SStefano Zampini const PetscReal b[5] = {RC(7415.0) / RC(34776.0), RC(9920.0) / RC(30429.0), RC(4845.0) / RC(9016.0), -RC(5827.0) / RC(19320.0), RC(9.0) / RC(40.0)}; 580d27334e2SStefano Zampini const PetscReal bembed[5] = {RC(23705.0) / RC(104328.0), RC(29720.0) / RC(91287.0), RC(4225.0) / RC(9016.0), -RC(69304987.0) / RC(337732920.0), RC(42843.0) / RC(233080.0)}; 581d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES325SAL, 3, 5, &A[0][0], b, NULL, bembed, 1, b)); 582d27334e2SStefano Zampini } 583d27334e2SStefano Zampini 584d27334e2SStefano Zampini { 585d27334e2SStefano Zampini // DIRK(6,6)[1]A[(7,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 586d27334e2SStefano Zampini const PetscReal A[7][7] = { 587d27334e2SStefano Zampini {RC(0.303487844706747), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 588d27334e2SStefano Zampini {RC(-0.279756492709814), RC(0.500032236020747), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 589d27334e2SStefano Zampini {RC(0.280583215743895), RC(-0.438560061586751), RC(0.217250734515736), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 590d27334e2SStefano Zampini {RC(-0.0677678738539846), RC(0.984312781232293), RC(-0.266720192540149), RC(0.2476680834526), RC(0.0), RC(0.0), RC(0.0) }, 591d27334e2SStefano Zampini {RC(0.125671616147993), RC(-0.995401751002415), RC(0.761333109549059), RC(-0.210281837202208), RC(0.866743712636936), RC(0.0), RC(0.0) }, 592d27334e2SStefano Zampini {RC(-0.368056238801488), RC(-0.999928082701516), RC(0.534734253232519), RC(-0.174856916279082), RC(0.615007160285509), RC(0.696549912132029), RC(0.0) }, 593d27334e2SStefano Zampini {RC(-0.00570546839653984), RC(-0.113110431835656), RC(-0.000965563207671587), RC(-0.000130490084629567), RC(0.00111737736895673), RC(-0.279385587378871), RC(0.618455906845342)} 594d27334e2SStefano Zampini }; 595d27334e2SStefano Zampini const PetscReal b[7] = {RC(0.257561510484877), RC(0.234281287047716), RC(0.126658904241469), RC(0.252363215441784), RC(0.396701083526306), RC(-0.267566000742152), RC(0.0)}; 596d27334e2SStefano Zampini const PetscReal bembed[7] = {RC(0.257561510484945), RC(0.387312822934391), RC(0.126658904241468), RC(0.252363215441784), RC(0.396701083526306), RC(-0.267566000742225), RC(-0.153031535886669)}; 597d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK657A, 6, 7, &A[0][0], b, NULL, bembed, 1, b)); 598d27334e2SStefano Zampini } 599d27334e2SStefano Zampini { 600d27334e2SStefano Zampini // ESDIRK(8,6)[2]SA[(8,4)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 601d27334e2SStefano Zampini const PetscReal A[8][8] = { 602d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 603d27334e2SStefano Zampini {RC(0.333222149217725), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 604d27334e2SStefano Zampini {RC(0.0639743773182214), RC(-0.0830330224410214), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 605d27334e2SStefano Zampini {RC(-0.728522201369326), RC(-0.210414479522485), RC(0.532519916559342), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 606d27334e2SStefano Zampini {RC(-0.175135269272067), RC(0.666675582067552), RC(-0.304400907370867), RC(0.656797712445756), RC(0.333222149217725), RC(0.0), RC(0.0), RC(0.0) }, 607d27334e2SStefano Zampini {RC(0.222695802705462), RC(-0.0948971794681061), RC(-0.0234336346686545), RC(-0.45385925012042), RC(0.0283910313826958), RC(0.333222149217725), RC(0.0), RC(0.0) }, 608d27334e2SStefano Zampini {RC(-0.132534078051299), RC(0.702597935004879), RC(-0.433316453128078), RC(0.893717488547587), RC(0.057381454791406), RC(-0.207798411552402), RC(0.333222149217725), RC(0.0) }, 609d27334e2SStefano Zampini {RC(0.0802253121418085), RC(0.281196044671022), RC(0.406758926172157), RC(-0.01945708512416), RC(-0.41785600088526), RC(0.0545342658870322), RC(0.281376387919675), RC(0.333222149217725)} 610d27334e2SStefano Zampini }; 611d27334e2SStefano Zampini const PetscReal b[8] = {RC(0.0802253121418085), RC(0.281196044671022), RC(0.406758926172157), RC(-0.01945708512416), RC(-0.41785600088526), RC(0.0545342658870322), RC(0.281376387919675), RC(0.333222149217725)}; 612d27334e2SStefano Zampini const PetscReal bembed[8] = {RC(0.0), RC(0.292331064554014), RC(0.409676102283681), RC(-0.002094718084982), RC(-0.282771520835975), RC(0.113862336644901), RC(0.181973572260693), RC(0.287023163177669)}; 613d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES648SA, 6, 8, &A[0][0], b, NULL, bembed, 1, b)); 614d27334e2SStefano Zampini } 615d27334e2SStefano Zampini { 616d27334e2SStefano Zampini // DIRK(8,6)[1]SAL[(8,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 617d27334e2SStefano Zampini const PetscReal A[8][8] = { 618d27334e2SStefano Zampini {RC(0.477264457385826), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 619d27334e2SStefano Zampini {RC(-0.197052588415002), RC(0.476363428459584), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 620d27334e2SStefano Zampini {RC(-0.0347674430372966), RC(0.633051807335483), RC(0.193634310075028), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 621d27334e2SStefano Zampini {RC(0.0967797668578702), RC(-0.193533526466535), RC(-0.000207622945800473), RC(0.159572204849431), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 622d27334e2SStefano Zampini {RC(0.162527231819875), RC(-0.249672513547382), RC(-0.0459079972041795), RC(0.36579476400859), RC(0.255752838307699), RC(0.0), RC(0.0), RC(0.0) }, 623d27334e2SStefano Zampini {RC(-0.00707603197171262), RC(0.846299854860295), RC(0.344020016925018), RC(-0.0720926054548865), RC(-0.215492331980875), RC(0.104341097622161), RC(0.0), RC(0.0) }, 624d27334e2SStefano Zampini {RC(0.00176857935179744), RC(0.0779960013127515), RC(0.303333277564557), RC(0.213160806732836), RC(0.351769320319038), RC(-0.381545894386538), RC(0.433517909105558), RC(0.0) }, 625d27334e2SStefano Zampini {RC(0.0), RC(0.22732353410559), RC(0.308415837980118), RC(0.157263419573007), RC(0.243551137152275), RC(-0.120953626732831), RC(-0.0802678473399899), RC(0.264667545261832)} 626d27334e2SStefano Zampini }; 627d27334e2SStefano Zampini const PetscReal b[8] = {RC(0.0), RC(0.22732353410559), RC(0.308415837980118), RC(0.157263419573007), RC(0.243551137152275), RC(-0.120953626732831), RC(-0.0802678473399899), RC(0.264667545261832)}; 628d27334e2SStefano Zampini const PetscReal bembed[8] = {RC(0.0), RC(0.22732353410559), RC(0.308415837980118), RC(0.157263419573007), RC(0.243551137152275), RC(-0.103483943222765), RC(-0.0103721771642262), RC(0.177302191576001)}; 629d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK658A, 6, 8, &A[0][0], b, NULL, bembed, 1, b)); 630d27334e2SStefano Zampini } 631d27334e2SStefano Zampini { 632d27334e2SStefano Zampini // SDIRK(9,6)[1]SAL[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 633d27334e2SStefano Zampini const PetscReal A[9][9] = { 634d27334e2SStefano Zampini {RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 635d27334e2SStefano Zampini {RC(-0.0903514856119419), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 636d27334e2SStefano Zampini {RC(0.172952039138937), RC(-0.35365501036282), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 637d27334e2SStefano Zampini {RC(0.511999875919193), RC(0.0289640332201925), RC(-0.0144030945657094), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 638d27334e2SStefano Zampini {RC(0.00465303495506782), RC(-0.075635818766597), RC(0.217273030786712), RC(-0.0206519428725472), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 639d27334e2SStefano Zampini {RC(0.896145501762472), RC(0.139267327700498), RC(-0.186920979752805), RC(0.0672971012371723), RC(-0.350891963442176), RC(0.218127781944908), RC(0.0), RC(0.0), RC(0.0) }, 640d27334e2SStefano Zampini {RC(0.552959701885751), RC(-0.439360579793662), RC(0.333704002325091), RC(-0.0339426520778416), RC(-0.151947445912595), RC(0.0213825661026943), RC(0.218127781944908), RC(0.0), RC(0.0) }, 641d27334e2SStefano Zampini {RC(0.631360374036476), RC(0.724733619641466), RC(-0.432170625425258), RC(0.598611382182477), RC(-0.709087197034345), RC(-0.483986685696934), RC(0.378391562905131), RC(0.218127781944908), RC(0.0) }, 642d27334e2SStefano Zampini {RC(0.0), RC(-0.15504452530869), RC(0.194518478660789), RC(0.63515640279203), RC(0.81172278664173), RC(0.110736108691585), RC(-0.495304692414479), RC(-0.319912341007872), RC(0.218127781944908)} 643d27334e2SStefano Zampini }; 644d27334e2SStefano Zampini const PetscReal b[9] = {RC(0.0), RC(-0.15504452530869), RC(0.194518478660789), RC(0.63515640279203), RC(0.81172278664173), RC(0.110736108691585), RC(-0.495304692414479), RC(-0.319912341007872), RC(0.218127781944908)}; 645d27334e2SStefano Zampini const PetscReal bembed[9] = {RC(3.62671059311602e-16), RC(0.0736615558278942), RC(0.103527397262229), RC(1.00247481935499), RC(0.361377289250057), RC(-0.785425929961365), RC(-0.0170499047960784), RC(0.296321252214769), RC(-0.0348864791524953)}; 646d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKS659A, 6, 9, &A[0][0], b, NULL, bembed, 1, b)); 647d27334e2SStefano Zampini } 648d27334e2SStefano Zampini { 649d27334e2SStefano Zampini // DIRK(10,7)[1]SAL[(10,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 650d27334e2SStefano Zampini const PetscReal A[10][10] = { 651d27334e2SStefano Zampini {RC(0.233704632125264), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 652d27334e2SStefano Zampini {RC(-0.0739324813149407), RC(0.200056838146104), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 653d27334e2SStefano Zampini {RC(0.0943790344044812), RC(0.264056067701605), RC(0.133245202456465), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 654d27334e2SStefano Zampini {RC(0.269084810601201), RC(-0.503479002548384), RC(-0.00486736469695022), RC(0.251518716213569), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 655d27334e2SStefano Zampini {RC(0.145665801918423), RC(0.204983170463176), RC(0.407154634069484), RC(-0.0121039135200389), RC(0.190243622486334), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 656d27334e2SStefano Zampini {RC(0.985450198547345), RC(0.806942652811456), RC(-0.808130934167263), RC(-0.669035819439391), RC(0.0269384406756128), RC(0.462144080607327), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 657d27334e2SStefano Zampini {RC(0.163902957809563), RC(0.228315094960095), RC(0.0745971021260249), RC(0.000509793400156559), RC(0.0166533681378294), RC(-0.0229383879045797), RC(0.103505486637336), RC(0.0), RC(0.0), RC(0.0) }, 658d27334e2SStefano Zampini {RC(-0.162694156858437), RC(0.0453478837428434), RC(0.997443481211424), RC(0.200251514941093), RC(-0.000161755458839048), RC(-0.0848134335980281), RC(-0.36438666566666), RC(0.158604420136055), RC(0.0), RC(0.0) }, 659d27334e2SStefano Zampini {RC(0.200733156477425), RC(0.239686443444433), RC(0.303837014418929), RC(-0.0534390596279896), RC(0.0314067599640569), RC(-0.00764032790448536), RC(0.0609191260198661), RC(-0.0736319201590642), RC(0.204602530607021), RC(0.0) }, 660d27334e2SStefano Zampini {RC(0.0), RC(0.235563761744267), RC(0.658651488684319), RC(0.0308877804992098), RC(-0.906514945595336), RC(-0.0248488551739974), RC(-0.309967582365257), RC(0.191663316925525), RC(0.923933712199542), RC(0.200631323081727)} 661d27334e2SStefano Zampini }; 662d27334e2SStefano Zampini const PetscReal b[10] = {RC(0.0), RC(0.235563761744267), RC(0.658651488684319), RC(0.0308877804992098), RC(-0.906514945595336), RC(-0.0248488551739974), RC(-0.309967582365257), RC(0.191663316925525), RC(0.923933712199542), RC(0.200631323081727)}; 663d27334e2SStefano Zampini const PetscReal bembed[10] = 664d27334e2SStefano Zampini {RC(0.0), RC(0.222929376486581), RC(0.950668440138169), RC(0.0342694607044032), RC(0.362875840545746), RC(0.223572979288581), RC(-0.764361723526727), RC(0.563476909230026), RC(-0.690896961894185), RC(0.0974656790270323)}; 665d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK7510SAL, 7, 10, &A[0][0], b, NULL, bembed, 1, b)); 666d27334e2SStefano Zampini } 667d27334e2SStefano Zampini { 668d27334e2SStefano Zampini // ESDIRK(10,7)[2]SA[(10,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 669d27334e2SStefano Zampini const PetscReal A[10][10] = { 670d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 671d27334e2SStefano Zampini {RC(0.210055790203419), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 672d27334e2SStefano Zampini {RC(0.255781739921086), RC(0.239850916980976), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 673d27334e2SStefano Zampini {RC(0.286789624880437), RC(0.230494748834778), RC(0.263925149885491), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 674d27334e2SStefano Zampini {RC(-0.0219118128774335), RC(0.897684380345907), RC(-0.657954605498907), RC(0.124962304722633), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 675d27334e2SStefano Zampini {RC(-0.065614879584776), RC(-0.0565630711859497), RC(0.0254881105065311), RC(-0.00368981790650006), RC(-0.0115178258446329), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 676d27334e2SStefano Zampini {RC(0.399860851232098), RC(0.915588469718705), RC(-0.0758429094934412), RC(-0.263369154872759), RC(0.719687583564526), RC(-0.787410407015369), RC(0.210055790203419), RC(0.0), RC(0.0), RC(0.0) }, 677d27334e2SStefano Zampini {RC(0.51693616104628), RC(1.00000540846973), RC(-0.0485110663289207), RC(-0.315208041581942), RC(0.749742806451587), RC(-0.990975090921248), RC(0.0159279583407308), RC(0.210055790203419), RC(0.0), RC(0.0) }, 678d27334e2SStefano Zampini {RC(-0.0303062129076945), RC(-0.297035174659034), RC(0.184724697462164), RC(-0.0351876079516183), RC(-0.00324668230690761), RC(0.216151004053531), RC(-0.126676252098317), RC(0.114040254365262), RC(0.210055790203419), RC(0.0) }, 679d27334e2SStefano Zampini {RC(0.0705997961586714), RC(-0.0281516061956374), RC(0.314600470734633), RC(-0.0907057557963371), RC(0.168078953957742), RC(-0.00655694984590575), RC(0.0505384497804303), RC(-0.0569572058725042), RC(0.368498056875488), RC(0.210055790203419)} 680d27334e2SStefano Zampini }; 681d27334e2SStefano Zampini const PetscReal b[10] = {RC(0.0705997961586714), RC(-0.0281516061956374), RC(0.314600470734633), RC(-0.0907057557963371), RC(0.168078953957742), 682d27334e2SStefano Zampini RC(-0.00655694984590575), RC(0.0505384497804303), RC(-0.0569572058725042), RC(0.368498056875488), RC(0.210055790203419)}; 683d27334e2SStefano Zampini const PetscReal bembed[10] = {RC(-0.015494246543626), RC(0.167657963820093), RC(0.269858958144236), RC(-0.0443258997755156), RC(0.150049236875266), 684d27334e2SStefano Zampini RC(0.259452082755846), RC(0.244624573502521), RC(-0.215528446920284), RC(0.0487601760292619), RC(0.134945602112201)}; 685d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES7510SA, 7, 10, &A[0][0], b, NULL, bembed, 1, b)); 686d27334e2SStefano Zampini } 687d27334e2SStefano Zampini { 688d27334e2SStefano Zampini // DIRK(9,7)[1]A[(9,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 689d27334e2SStefano Zampini const PetscReal A[9][9] = { 690d27334e2SStefano Zampini {RC(0.179877789855839), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 691d27334e2SStefano Zampini {RC(-0.100405844885157), RC(0.214948590644819), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 692d27334e2SStefano Zampini {RC(0.112251360198995), RC(-0.206162139150298), RC(0.125159642941958), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 693d27334e2SStefano Zampini {RC(-0.0335164000768257), RC(0.999942349946143), RC(-0.491470853833294), RC(0.19820086325566), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 694d27334e2SStefano Zampini {RC(-0.0417345265478321), RC(0.187864510308215), RC(0.0533789224305102), RC(-0.00822060284862916), RC(0.127670843671646), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 695d27334e2SStefano Zampini {RC(-0.0278257925239257), RC(0.600979340683382), RC(-0.242632273241134), RC(-0.11318753652081), RC(0.164326917632931), RC(0.284116597781395), RC(0.0), RC(0.0), RC(0.0) }, 696d27334e2SStefano Zampini {RC(0.041465583858922), RC(0.429657872601836), RC(-0.381323410582524), RC(0.391934277498434), RC(-0.245918275501241), RC(-0.35960669741231), RC(0.184000022289158), RC(0.0), RC(0.0) }, 697d27334e2SStefano Zampini {RC(-0.105565651574538), RC(-0.0557833155018609), RC(0.358967568942643), RC(-0.13489263413921), RC(0.129553247260677), RC(0.0992493795371489), RC(-0.15716610563461), RC(0.17918862279814), RC(0.0) }, 698d27334e2SStefano Zampini {RC(0.00439696079965225), RC(0.960250486570491), RC(0.143558372286706), RC(0.0819015241056593), RC(0.999562318563625), RC(0.325203439314358), RC(-0.679013149331228), RC(-0.990589559837246), RC(0.0773648037639896)} 699d27334e2SStefano Zampini }; 700d27334e2SStefano Zampini 701d27334e2SStefano Zampini const PetscReal b[9] = {RC(0.0), RC(0.179291520437966), RC(0.115310295273026), RC(-0.857943261453138), RC(0.654911318641998), RC(1.18713633508094), RC(-0.0949482361570542), RC(-0.37661430946407), RC(0.19285633764033)}; 702d27334e2SStefano Zampini const PetscReal bembed[9] = {RC(0.0), RC(0.1897135479408), RC(0.127461414808862), RC(-0.835810807663404), RC(0.665114177777166), RC(1.16481046518346), RC(-0.11661858889792), RC(-0.387303251022099), RC(0.192633041873135)}; 703d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK759A, 7, 9, &A[0][0], b, NULL, bembed, 1, b)); 704d27334e2SStefano Zampini } 705d27334e2SStefano Zampini { 706d27334e2SStefano Zampini // SDIRK(11,7)[1]SAL[(11,5)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 707d27334e2SStefano Zampini const PetscReal A[11][11] = { 708d27334e2SStefano Zampini {RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 709d27334e2SStefano Zampini {RC(-0.082947368165267), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 710d27334e2SStefano Zampini {RC(0.483452690540751), RC(0.0), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 711d27334e2SStefano Zampini {RC(0.771076453481321), RC(-0.22936926341842), RC(0.289733373208823), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 712d27334e2SStefano Zampini {RC(0.0329683054968892), RC(-0.162397421903366), RC(0.000951777538562805), RC(0.0), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 713d27334e2SStefano Zampini {RC(0.265888743485945), RC(0.606743151103931), RC(0.173443800537369), RC(-0.0433968261546912), RC(-0.385211017224481), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 714d27334e2SStefano Zampini {RC(0.220662294551146), RC(-0.0465078507657608), RC(-0.0333111995282464), RC(0.011801580836998), RC(0.169480801030105), RC(-0.0167974432139385), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 715d27334e2SStefano Zampini {RC(0.323099728365267), RC(0.0288371831672575), RC(-0.0543404318773196), RC(0.0137765831431662), RC(0.0516799019060702), RC(-0.0421359763835713), RC(0.181297932037826), RC(0.200252661187742), RC(0.0), RC(0.0), RC(0.0) }, 716d27334e2SStefano Zampini {RC(-0.164226696476538), RC(0.187552004946792), RC(0.0628674420973025), RC(-0.0108886582703428), RC(-0.0117628641717889), RC(0.0432176880867965), RC(-0.0315206836275473), RC(-0.0846007021638797), RC(0.200252661187742), RC(0.0), RC(0.0) }, 717d27334e2SStefano Zampini {RC(0.651428598623771), RC(-0.10208078475356), RC(0.198305701801888), RC(-0.0117354096673789), RC(-0.0440385966743686), RC(-0.0358364455795087), RC(-0.0075408087654097), RC(0.160320941654639), RC(0.017940248694499), RC(0.200252661187742), RC(0.0) }, 718d27334e2SStefano Zampini {RC(0.0), RC(-0.266259448580236), RC(-0.615982357748271), RC(0.561474126687165), RC(0.266911112787025), RC(0.219775952207137), RC(0.387847665451514), RC(0.612483137773236), RC(0.330027015806089), RC(-0.6965298655714), RC(0.200252661187742)} 719d27334e2SStefano Zampini }; 720d27334e2SStefano Zampini const PetscReal b[11] = 721d27334e2SStefano Zampini {RC(0.0), RC(-0.266259448580236), RC(-0.615982357748271), RC(0.561474126687165), RC(0.266911112787025), RC(0.219775952207137), RC(0.387847665451514), RC(0.612483137773236), RC(0.330027015806089), RC(-0.6965298655714), RC(0.200252661187742)}; 722d27334e2SStefano Zampini const PetscReal bembed[11] = 723d27334e2SStefano Zampini {RC(0.0), RC(0.180185524442613), RC(-0.628869710835338), RC(0.186185675988647), RC(0.0484716652630425), RC(0.203927720607141), RC(0.44041662512573), RC(0.615710527731245), RC(0.0689648839032607), RC(-0.253599870605903), RC(0.138606958379488)}; 724d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKS7511SAL, 7, 11, &A[0][0], b, NULL, bembed, 1, b)); 725d27334e2SStefano Zampini } 726d27334e2SStefano Zampini { 727d27334e2SStefano Zampini // DIRK(13,8)[1]A[(14,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 728d27334e2SStefano Zampini const PetscReal A[14][14] = { 729d27334e2SStefano Zampini {RC(0.421050745442291), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 730d27334e2SStefano Zampini {RC(-0.0761079419591268), RC(0.264353986580857), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 731d27334e2SStefano Zampini {RC(0.0727106904170694), RC(-0.204265976977285), RC(0.181608196544136), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 732d27334e2SStefano Zampini {RC(0.55763054816611), RC(-0.409773579543499), RC(0.510926516886944), RC(0.259892204518476), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 733d27334e2SStefano Zampini {RC(0.0228083864844437), RC(-0.445569051836454), RC(-0.0915242778636248), RC(0.00450055909321655), RC(0.6397807199983), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 734d27334e2SStefano Zampini {RC(-0.135945849505152), RC(0.0946509646963754), RC(-0.236110197279175), RC(0.00318944206456517), RC(0.255453021028118), RC(0.174805219173446), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 735d27334e2SStefano Zampini {RC(-0.147960260670772), RC(-0.402188192230535), RC(-0.703014530043888), RC(0.00941974677418186), RC(0.885747111289207), RC(0.261314066449028), RC(0.16307697503668), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 736d27334e2SStefano Zampini {RC(0.165597241042244), RC(0.824182962188923), RC(-0.0280136160783609), RC(0.282372386631758), RC(-0.957721354131182), RC(0.489439550159977), RC(0.170094415598103), RC(0.0522519785718563), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 737d27334e2SStefano Zampini {RC(0.0335292011495618), RC(0.575750388029166), RC(0.223289855356637), RC(-0.00317458833242804), RC(-0.112890382135193), RC(-0.419809267954284), RC(0.0466136902102104), RC(-0.00115413813041085), RC(0.109685363692383), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 738d27334e2SStefano Zampini {RC(-0.0512616878252355), RC(0.699261265830807), RC(-0.117939611738769), RC(0.0021745241931243), RC(-0.00932826702640947), RC(-0.267575057469428), RC(0.126949139814065), RC(0.00330353204502163), RC(0.185949445053766), RC(0.0938215615963721), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 739d27334e2SStefano Zampini {RC(-0.106521517960343), RC(0.41835889096168), RC(0.353585905881916), RC(-0.0746474161579599), RC(-0.015450626460289), RC(-0.46224659192275), RC(-0.0576406327329181), RC(-0.00712066942504018), RC(0.377776558014452), RC(0.36890054338294), RC(0.0618488746331837), RC(0.0), RC(0.0), RC(0.0) }, 740d27334e2SStefano Zampini {RC(-0.163079104890997), RC(0.644561721693806), RC(0.636968661639572), RC(-0.122346720085377), RC(-0.333062564990312), RC(-0.3054226490478), RC(-0.357820712828352), RC(-0.0125510510334706), RC(0.371263681186311), RC(0.371979640363694), RC(0.0531090658708968), RC(0.0518279459132049), RC(0.0), RC(0.0) }, 741d27334e2SStefano Zampini {RC(0.579993784455521), RC(-0.188833728676494), RC(0.999975696843775), RC(0.0572810855901161), RC(-0.264374735003671), RC(0.165091739976854), RC(-0.546675809010452), RC(-0.0283821822291982), RC(-0.102639860418374), RC(-0.0343251040446405), RC(0.4762598462591), RC(-0.304153104931261), RC(0.0953911855943621), RC(0.0) }, 742d27334e2SStefano Zampini {RC(0.0848552694007844), RC(0.287193912340074), RC(0.543683503004232), RC(-0.081311059300692), RC(-0.0328661289388557), RC(-0.323456834372922), RC(-0.240378871658975), RC(-0.0189913019930369), RC(0.220663114082036), RC(0.253029984360864), RC(0.252011799370563), RC(-0.154882222605423), RC(0.0315202264687415), RC(0.0514095812104714)} 743d27334e2SStefano Zampini }; 744d27334e2SStefano Zampini const PetscReal b[14] = {RC(0.0), RC(0.516650324205117), RC(0.0773227217357826), RC(-0.12474204666975), RC(-0.0241052115180679), RC(-0.325821145180359), RC(0.0907237460123951), RC(0.0459271880596652), RC(0.221012259404702), RC(0.235510906761942), RC(0.491109674204385), RC(-0.323506525837343), RC(0.119918108821531), RC(0.0)}; 745d27334e2SStefano Zampini const PetscReal bembed[14] = {RC(2.32345691433618e-16), RC(0.499150900944401), RC(0.080991997189243), RC(-0.0359440417166322), RC(-0.0258910397441454), RC(-0.304540350278636), RC(0.0836627473632563), 746d27334e2SStefano Zampini RC(0.0417664613347638), RC(0.223636394275293), RC(0.231569156867596), RC(0.240526201277663), RC(-0.222933582911926), RC(-0.0111479879597561), RC(0.19915314335888)}; 747d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK8614A, 8, 14, &A[0][0], b, NULL, bembed, 1, b)); 748d27334e2SStefano Zampini } 749d27334e2SStefano Zampini { 750d27334e2SStefano Zampini // DIRK(15,8)[1]SAL[(16,6)A] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 751d27334e2SStefano Zampini const PetscReal A[16][16] = { 752d27334e2SStefano Zampini {RC(0.498904981271193), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 753d27334e2SStefano Zampini {RC(-0.303806037341816), RC(0.886299445992379), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 754d27334e2SStefano Zampini {RC(-0.581440223471476), RC(0.371003719460259), RC(0.43844717752802), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 755d27334e2SStefano Zampini {RC(0.531852638870051), RC(-0.339363014907108), RC(0.422373239795441), RC(0.223854203543397), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 756d27334e2SStefano Zampini {RC(0.118517891868867), RC(-0.0756235584174296), RC(-0.0864284870668712), RC(0.000536692838658312), RC(0.10101418329932), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 757d27334e2SStefano Zampini {RC(0.218733626116401), RC(-0.139568928299635), RC(0.30473612813488), RC(0.00354038623073564), RC(0.0932085751160559), RC(0.140161806097591), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 758d27334e2SStefano Zampini {RC(0.0692944686081835), RC(-0.0442152168939502), RC(-0.0903375348855603), RC(0.00259030241156141), RC(0.204514233679515), RC(-0.0245383758960002), RC(0.199289437094059), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 759d27334e2SStefano Zampini {RC(0.990640016505571), RC(-0.632104756315967), RC(0.856971425234221), RC(0.174494099232246), RC(-0.113715829680145), RC(-0.151494045307366), RC(-0.438268629569005), RC(0.120578398912139), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 760d27334e2SStefano Zampini {RC(-0.099415677713136), RC(0.211832014309207), RC(-0.245998265866888), RC(-0.182249672235861), RC(0.167897635713799), RC(0.212850335030069), RC(-0.391739299440123), RC(-0.0118718506876767), RC(0.526293701659093), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 761d27334e2SStefano Zampini {RC(0.383983914845461), RC(-0.245011361219604), RC(0.46717278554955), RC(-0.0361272447593202), RC(0.0742234660511333), RC(-0.0474816271948766), RC(-0.229859978525756), RC(0.0516283729206322), RC(0.0), RC(0.193823890777594), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 762d27334e2SStefano Zampini {RC(0.0967855003180134), RC(-0.0481037037916184), RC(0.191268138832434), RC(0.234977164564126), RC(0.0620265921753097), RC(0.403432826534738), RC(0.152403846687238), RC(-0.118420429237746), RC(0.0582141598685892), RC(-0.13924540906863), RC(0.106661313117545), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 763d27334e2SStefano Zampini {RC(0.133941307432055), RC(-0.0722076602896254), RC(0.217086297689275), RC(0.00495499602192887), RC(0.0306090174933995), RC(0.26483526755746), RC(0.204442440745605), RC(0.196883395136708), RC(0.056527012583996), RC(-0.150216381356784), RC(-0.217209415757333), RC(0.330353722743315), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 764d27334e2SStefano Zampini {RC(0.157014274561299), RC(-0.0883810256381874), RC(0.117193033885034), RC(-0.0362304243769466), RC(0.0169030211466111), RC(-0.169835753576141), RC(0.399749979234113), RC(0.31806704093008), RC(0.050340008347693), RC(0.120284837472214), RC(-0.235313193645423), RC(0.232488522208926), RC(0.117719679450729), RC(0.0), RC(0.0), RC(0.0) }, 765d27334e2SStefano Zampini {RC(0.00276453816875833), RC(-0.00366028255231782), RC(-0.331078914515559), RC(0.623377549031949), RC(0.167618142989491), RC(0.0748467945312516), RC(0.797629286699677), RC(-0.390714256799583), RC(-0.00808553925131555), RC(0.014840324980952), RC(-0.0856180410248133), RC(0.602943304937827), RC(-0.5771359338496), RC(0.112273026653282), RC(0.0), RC(0.0) }, 766d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.085283971980307), RC(0.51334393454179), RC(0.144355978013514), RC(0.255379109487853), RC(0.225075750790524), RC(-0.343241323394982), RC(0.0), RC(0.0798250392218852), RC(0.0528824734082655), RC(-0.0830350888900362), RC(0.022567388707279), RC(-0.0592631119040204), RC(0.106825878037621), RC(0.0) }, 767d27334e2SStefano Zampini {RC(0.173784481207652), RC(-0.110887906116241), RC(0.190052513365204), RC(-0.0688345422674029), RC(0.10326505079603), RC(0.267127097115219), RC(0.141703423176897), RC(0.0117966866651728), RC(-6.65650091812762e-15), RC(-0.0213725083662519), RC(-0.00931148598712566), RC(-0.10007679077114), RC(0.123471797451553), RC(0.00203684241073055), RC(-0.0294320891781173), RC(0.195746619921528)} 768d27334e2SStefano Zampini }; 769d27334e2SStefano Zampini const PetscReal b[16] = {RC(0.0), RC(0.0), RC(0.085283971980307), RC(0.51334393454179), RC(0.144355978013514), RC(0.255379109487853), RC(0.225075750790524), RC(-0.343241323394982), RC(0.0), RC(0.0798250392218852), RC(0.0528824734082655), RC(-0.0830350888900362), RC(0.022567388707279), RC(-0.0592631119040204), RC(0.106825878037621), RC(0.0)}; 770d27334e2SStefano Zampini const PetscReal bembed[16] = {RC(-1.31988512519898e-15), RC(7.53606601764004e-16), RC(0.0886789133915965), RC(0.0968726531622137), RC(0.143815375874267), RC(0.335214773313601), RC(0.221862366978063), RC(-0.147408947987273), 771d27334e2SStefano Zampini RC(4.16297599203445e-16), RC(0.000727276166520566), RC(-0.00284892677941246), RC(0.00512492274297611), RC(-0.000275595071215218), RC(0.0136014719350733), RC(0.0165190013607726), RC(0.228116714912817)}; 772d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRK8616SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b)); 773d27334e2SStefano Zampini } 774d27334e2SStefano Zampini { 775d27334e2SStefano Zampini // ESDIRK(16,8)[2]SAL[(16,5)] from https://github.com/yousefalamri55/High_Order_DIRK_Methods_Coeffs 776d27334e2SStefano Zampini const PetscReal A[16][16] = { 777d27334e2SStefano Zampini {RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 778d27334e2SStefano Zampini {RC(0.117318819358521), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 779d27334e2SStefano Zampini {RC(0.0557014605974616), RC(0.385525646638742), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 780d27334e2SStefano Zampini {RC(0.063493276428895), RC(0.373556126263681), RC(0.0082994166438953), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 781d27334e2SStefano Zampini {RC(0.0961351856230088), RC(0.335558324517178), RC(0.207077765910132), RC(-0.0581917140797146), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 782d27334e2SStefano Zampini {RC(0.0497669214238319), RC(0.384288616546039), RC(0.0821728117583936), RC(0.120337007107103), RC(0.202262782645888), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 783d27334e2SStefano Zampini {RC(0.00626710666809847), RC(0.496491452640725), RC(-0.111303249827358), RC(0.170478821683603), RC(0.166517073971103), RC(-0.0328669811542241), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 784d27334e2SStefano Zampini {RC(0.0463439767281591), RC(0.00306724391019652), RC(-0.00816305222386205), RC(-0.0353302599538294), RC(0.0139313601702569), RC(-0.00992014507967429), RC(0.0210087909090165), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 785d27334e2SStefano Zampini {RC(0.111574049232048), RC(0.467639166482209), RC(0.237773114804619), RC(0.0798895699267508), RC(0.109580615914593), RC(0.0307353103825936), RC(-0.0404391509541147), RC(-0.16942110744293), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 786d27334e2SStefano Zampini {RC(-0.0107072484863877), RC(-0.231376703354252), RC(0.017541113036611), RC(0.144871527682418), RC(-0.041855459769806), RC(0.0841832168332261), RC(-0.0850020937282192), RC(0.486170343825899), RC(-0.0526717116822739), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 787d27334e2SStefano Zampini {RC(-0.0142238262314935), RC(0.14752923682514), RC(0.238235830732566), RC(0.037950291904103), RC(0.252075123381518), RC(0.0474266904224567), RC(-0.00363139069342027), RC(0.274081442388563), RC(-0.0599166970745255), RC(-0.0527138812389185), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 788d27334e2SStefano Zampini {RC(-0.11837020183211), RC(-0.635712481821264), RC(0.239738832602538), RC(0.330058936651707), RC(-0.325784087988237), RC(-0.0506514314589253), RC(-0.281914404487009), RC(0.852596345144291), RC(0.651444614298805), RC(-0.103476387303591), RC(-0.354835880209975), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0), RC(0.0) }, 789d27334e2SStefano Zampini {RC(-0.00458164025442349), RC(0.296219694015248), RC(0.322146049419995), RC(0.15917778285238), RC(0.284864871688843), RC(0.185509526463076), RC(-0.0784621067883274), RC(0.166312223692047), RC(-0.284152486083397), RC(-0.357125104338944), RC(0.078437074055306), RC(0.0884129667114481), RC(0.117318819358521), RC(0.0), RC(0.0), RC(0.0) }, 790d27334e2SStefano Zampini {RC(-0.0545561913848106), RC(0.675785423442753), RC(0.423066443201941), RC(-0.000165300126841193), RC(0.104252994793763), RC(-0.105763019303021), RC(-0.15988308809318), RC(0.0515050001032011), RC(0.56013979290924), RC(-0.45781539708603), RC(-0.255870699752664), RC(0.026960254296416), RC(-0.0721245985053681), RC(0.117318819358521), RC(0.0), RC(0.0) }, 791d27334e2SStefano Zampini {RC(0.0649253995775223), RC(-0.0216056457922249), RC(-0.073738139377975), RC(0.0931033310077225), RC(-0.0194339577299149), RC(-0.0879623837313009), RC(0.057125517179467), RC(0.205120850488097), RC(0.132576503537441), RC(0.489416890627328), RC(-0.1106765720501), RC(-0.081038793996096), RC(0.0606031613503788), RC(-0.00241467937442272), RC(0.117318819358521), RC(0.0) }, 792d27334e2SStefano Zampini {RC(0.0459979286336779), RC(0.0780075394482806), RC(0.015021874148058), RC(0.195180277284195), RC(-0.00246643310153235), RC(0.0473977117068314), RC(-0.0682773558610363), RC(0.19568019123878), RC(-0.0876765449323747), RC(0.177874852409192), RC(-0.337519251582222), RC(-0.0123255553640736), RC(0.311573291192553), RC(0.0458604327754991), RC(0.278352222645651), RC(0.117318819358521)} 793d27334e2SStefano Zampini }; 794d27334e2SStefano Zampini const PetscReal b[16] = {RC(0.0459979286336779), RC(0.0780075394482806), RC(0.015021874148058), RC(0.195180277284195), RC(-0.00246643310153235), RC(0.0473977117068314), RC(-0.0682773558610363), RC(0.19568019123878), 795d27334e2SStefano Zampini RC(-0.0876765449323747), RC(0.177874852409192), RC(-0.337519251582222), RC(-0.0123255553640736), RC(0.311573291192553), RC(0.0458604327754991), RC(0.278352222645651), RC(0.117318819358521)}; 796d27334e2SStefano Zampini const PetscReal bembed[16] = {RC(0.0603373529853206), RC(0.175453809423998), RC(0.0537707777611352), RC(0.195309248607308), RC(0.0135893741970232), RC(-0.0221160259296707), RC(-0.00726526156430691), RC(0.102961059369124), 797d27334e2SStefano Zampini RC(0.000900215457460583), RC(0.0547959465692338), RC(-0.334995726863153), RC(0.0464409662093384), RC(0.301388101652194), RC(0.00524851570622031), RC(0.229538601845236), RC(0.124643044573514)}; 798d27334e2SStefano Zampini PetscCall(TSDIRKRegister(TSDIRKES8516SAL, 8, 16, &A[0][0], b, NULL, bembed, 1, b)); 799d27334e2SStefano Zampini } 800d27334e2SStefano Zampini 801d27334e2SStefano Zampini /* Additive methods */ 802d27334e2SStefano Zampini { 803d27334e2SStefano Zampini const PetscReal A[3][3] = { 804e817cc15SEmil Constantinescu {0.0, 0.0, 0.0}, 8059371c9d4SSatish Balay {0.0, 0.0, 0.0}, 8069371c9d4SSatish Balay {0.0, 0.5, 0.0} 807d27334e2SStefano Zampini }; 808d27334e2SStefano Zampini const PetscReal At[3][3] = { 809d27334e2SStefano Zampini {1.0, 0.0, 0.0}, 810d27334e2SStefano Zampini {0.0, 0.5, 0.0}, 811d27334e2SStefano Zampini {0.0, 0.5, 0.5} 812d27334e2SStefano Zampini }; 813d27334e2SStefano Zampini const PetscReal b[3] = {0.0, 0.5, 0.5}; 814d27334e2SStefano Zampini const PetscReal bembedt[3] = {1.0, 0.0, 0.0}; 8159566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX1BEE, 2, 3, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL)); 816e817cc15SEmil Constantinescu } 8178a381b04SJed Brown { 818d27334e2SStefano Zampini const PetscReal A[2][2] = { 8199371c9d4SSatish Balay {0.0, 0.0}, 8209371c9d4SSatish Balay {0.5, 0.0} 821d27334e2SStefano Zampini }; 822d27334e2SStefano Zampini const PetscReal At[2][2] = { 823d27334e2SStefano Zampini {0.0, 0.0}, 824d27334e2SStefano Zampini {0.0, 0.5} 825d27334e2SStefano Zampini }; 826d27334e2SStefano Zampini const PetscReal b[2] = {0.0, 1.0}; 827d27334e2SStefano Zampini const PetscReal bembedt[2] = {0.5, 0.5}; 8281f80e275SEmil Constantinescu /* binterpt[2][2] = {{1.0,-1.0},{0.0,1.0}}; second order dense output has poor stability properties and hence it is not currently in use */ 8299566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXARS122, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL)); 8301f80e275SEmil Constantinescu } 8311f80e275SEmil Constantinescu { 832d27334e2SStefano Zampini const PetscReal A[2][2] = { 8339371c9d4SSatish Balay {0.0, 0.0}, 8349371c9d4SSatish Balay {1.0, 0.0} 835d27334e2SStefano Zampini }; 836d27334e2SStefano Zampini const PetscReal At[2][2] = { 837d27334e2SStefano Zampini {0.0, 0.0}, 838d27334e2SStefano Zampini {0.5, 0.5} 839d27334e2SStefano Zampini }; 840d27334e2SStefano Zampini const PetscReal b[2] = {0.5, 0.5}; 841d27334e2SStefano Zampini const PetscReal bembedt[2] = {0.0, 1.0}; 8421f80e275SEmil Constantinescu /* binterpt[2][2] = {{1.0,-0.5},{0.0,0.5}} second order dense output has poor stability properties and hence it is not currently in use */ 8439566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXA2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 1, b, NULL)); 8441f80e275SEmil Constantinescu } 8451f80e275SEmil Constantinescu { 846d27334e2SStefano Zampini const PetscReal A[2][2] = { 8479371c9d4SSatish Balay {0.0, 0.0}, 8489371c9d4SSatish Balay {1.0, 0.0} 849d27334e2SStefano Zampini }; 850d27334e2SStefano Zampini const PetscReal At[2][2] = { 851d27334e2SStefano Zampini {us2, 0.0}, 852d27334e2SStefano Zampini {1.0 - 2.0 * us2, us2} 853d27334e2SStefano Zampini }; 854d27334e2SStefano Zampini const PetscReal b[2] = {0.5, 0.5}; 855d27334e2SStefano Zampini const PetscReal bembedt[2] = {0.0, 1.0}; 856d27334e2SStefano Zampini const PetscReal binterpt[2][2] = { 857d27334e2SStefano Zampini {(us2 - 1.0) / (2.0 * us2 - 1.0), -1 / (2.0 * (1.0 - 2.0 * us2))}, 858d27334e2SStefano Zampini {1 - (us2 - 1.0) / (2.0 * us2 - 1.0), -1 / (2.0 * (1.0 - 2.0 * us2))} 859d27334e2SStefano Zampini }; 860d27334e2SStefano Zampini const PetscReal binterp[2][2] = { 861d27334e2SStefano Zampini {1.0, -0.5}, 862d27334e2SStefano Zampini {0.0, 0.5 } 863d27334e2SStefano Zampini }; 8649566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXL2, 2, 2, &At[0][0], b, NULL, &A[0][0], b, NULL, bembedt, bembedt, 2, binterpt[0], binterp[0])); 8651f80e275SEmil Constantinescu } 8661f80e275SEmil Constantinescu { 867d27334e2SStefano Zampini const PetscReal A[3][3] = { 8689371c9d4SSatish Balay {0, 0, 0}, 869d27334e2SStefano Zampini {2 - s2, 0, 0}, 8709371c9d4SSatish Balay {0.5, 0.5, 0} 871d27334e2SStefano Zampini }; 872d27334e2SStefano Zampini const PetscReal At[3][3] = { 873d27334e2SStefano Zampini {0, 0, 0 }, 874d27334e2SStefano Zampini {1 - 1 / s2, 1 - 1 / s2, 0 }, 875d27334e2SStefano Zampini {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2} 876d27334e2SStefano Zampini }; 877d27334e2SStefano Zampini const PetscReal bembedt[3] = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)}; 878d27334e2SStefano Zampini const PetscReal binterpt[3][2] = { 879d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 880d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 881d27334e2SStefano Zampini {1.0 - s2, 1.0 / s2 } 882d27334e2SStefano Zampini }; 8839566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX2C, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 8841f80e275SEmil Constantinescu } 8851f80e275SEmil Constantinescu { 886d27334e2SStefano Zampini const PetscReal A[3][3] = { 8879371c9d4SSatish Balay {0, 0, 0}, 888d27334e2SStefano Zampini {2 - s2, 0, 0}, 8899371c9d4SSatish Balay {0.75, 0.25, 0} 890d27334e2SStefano Zampini }; 891d27334e2SStefano Zampini const PetscReal At[3][3] = { 892d27334e2SStefano Zampini {0, 0, 0 }, 893d27334e2SStefano Zampini {1 - 1 / s2, 1 - 1 / s2, 0 }, 894d27334e2SStefano Zampini {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2} 895d27334e2SStefano Zampini }; 896d27334e2SStefano Zampini const PetscReal bembedt[3] = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)}; 897d27334e2SStefano Zampini const PetscReal binterpt[3][2] = { 898d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 899d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 900d27334e2SStefano Zampini {1.0 - s2, 1.0 / s2 } 901d27334e2SStefano Zampini }; 9029566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX2D, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 9038a381b04SJed Brown } 90406db7b1cSJed Brown { /* Optimal for linear implicit part */ 905d27334e2SStefano Zampini const PetscReal A[3][3] = { 9069371c9d4SSatish Balay {0, 0, 0}, 907d27334e2SStefano Zampini {2 - s2, 0, 0}, 908d27334e2SStefano Zampini {(3 - 2 * s2) / 6, (3 + 2 * s2) / 6, 0} 909d27334e2SStefano Zampini }; 910d27334e2SStefano Zampini const PetscReal At[3][3] = { 911d27334e2SStefano Zampini {0, 0, 0 }, 912d27334e2SStefano Zampini {1 - 1 / s2, 1 - 1 / s2, 0 }, 913d27334e2SStefano Zampini {1 / (2 * s2), 1 / (2 * s2), 1 - 1 / s2} 914d27334e2SStefano Zampini }; 915d27334e2SStefano Zampini const PetscReal bembedt[3] = {(4. - s2) / 8., (4. - s2) / 8., 1 / (2. * s2)}; 916d27334e2SStefano Zampini const PetscReal binterpt[3][2] = { 917d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 918d27334e2SStefano Zampini {1.0 / s2, -1.0 / (2.0 * s2)}, 919d27334e2SStefano Zampini {1.0 - s2, 1.0 / s2 } 920d27334e2SStefano Zampini }; 9219566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX2E, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 922a3a57f36SJed Brown } 9236cf0794eSJed Brown { /* Optimal for linear implicit part */ 924d27334e2SStefano Zampini const PetscReal A[3][3] = { 9259371c9d4SSatish Balay {0, 0, 0}, 9266cf0794eSJed Brown {0.5, 0, 0}, 9279371c9d4SSatish Balay {0.5, 0.5, 0} 928d27334e2SStefano Zampini }; 929d27334e2SStefano Zampini const PetscReal At[3][3] = { 930d27334e2SStefano Zampini {0.25, 0, 0 }, 931d27334e2SStefano Zampini {0, 0.25, 0 }, 932d27334e2SStefano Zampini {1. / 3, 1. / 3, 1. / 3} 933d27334e2SStefano Zampini }; 9349566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEXPRSSP2, 2, 3, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL)); 9356cf0794eSJed Brown } 936a3a57f36SJed Brown { 937d27334e2SStefano Zampini const PetscReal A[4][4] = { 9389371c9d4SSatish Balay {0, 0, 0, 0}, 9394040e9f2SJed Brown {1767732205903. / 2027836641118., 0, 0, 0}, 9404040e9f2SJed Brown {5535828885825. / 10492691773637., 788022342437. / 10882634858940., 0, 0}, 9419371c9d4SSatish Balay {6485989280629. / 16251701735622., -4246266847089. / 9704473918619., 10755448449292. / 10357097424841., 0} 942d27334e2SStefano Zampini }; 943d27334e2SStefano Zampini const PetscReal At[4][4] = { 944d27334e2SStefano Zampini {0, 0, 0, 0 }, 945d27334e2SStefano Zampini {1767732205903. / 4055673282236., 1767732205903. / 4055673282236., 0, 0 }, 946d27334e2SStefano Zampini {2746238789719. / 10658868560708., -640167445237. / 6845629431997., 1767732205903. / 4055673282236., 0 }, 947d27334e2SStefano Zampini {1471266399579. / 7840856788654., -4482444167858. / 7529755066697., 11266239266428. / 11593286722821., 1767732205903. / 4055673282236.} 948d27334e2SStefano Zampini }; 949d27334e2SStefano Zampini const PetscReal bembedt[4] = {2756255671327. / 12835298489170., -10771552573575. / 22201958757719., 9247589265047. / 10645013368117., 2193209047091. / 5459859503100.}; 950d27334e2SStefano Zampini const PetscReal binterpt[4][2] = { 951d27334e2SStefano Zampini {4655552711362. / 22874653954995., -215264564351. / 13552729205753. }, 952d27334e2SStefano Zampini {-18682724506714. / 9892148508045., 17870216137069. / 13817060693119. }, 953d27334e2SStefano Zampini {34259539580243. / 13192909600954., -28141676662227. / 17317692491321.}, 954d27334e2SStefano Zampini {584795268549. / 6622622206610., 2508943948391. / 7218656332882. } 955d27334e2SStefano Zampini }; 9569566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX3, 3, 4, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 2, binterpt[0], NULL)); 957a3a57f36SJed Brown } 958a3a57f36SJed Brown { 959d27334e2SStefano Zampini const PetscReal A[5][5] = { 9609371c9d4SSatish Balay {0, 0, 0, 0, 0}, 9616cf0794eSJed Brown {1. / 2, 0, 0, 0, 0}, 9626cf0794eSJed Brown {11. / 18, 1. / 18, 0, 0, 0}, 9636cf0794eSJed Brown {5. / 6, -5. / 6, .5, 0, 0}, 9649371c9d4SSatish Balay {1. / 4, 7. / 4, 3. / 4, -7. / 4, 0} 965d27334e2SStefano Zampini }; 966d27334e2SStefano Zampini const PetscReal At[5][5] = { 967d27334e2SStefano Zampini {0, 0, 0, 0, 0 }, 968d27334e2SStefano Zampini {0, 1. / 2, 0, 0, 0 }, 969d27334e2SStefano Zampini {0, 1. / 6, 1. / 2, 0, 0 }, 970d27334e2SStefano Zampini {0, -1. / 2, 1. / 2, 1. / 2, 0 }, 971d27334e2SStefano Zampini {0, 3. / 2, -3. / 2, 1. / 2, 1. / 2} 972d27334e2SStefano Zampini }; 973d27334e2SStefano Zampini PetscCall(TSARKIMEXRegister(TSARKIMEXARS443, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL)); 9746cf0794eSJed Brown } 9756cf0794eSJed Brown { 976d27334e2SStefano Zampini const PetscReal A[5][5] = { 9779371c9d4SSatish Balay {0, 0, 0, 0, 0}, 9786cf0794eSJed Brown {1, 0, 0, 0, 0}, 9796cf0794eSJed Brown {4. / 9, 2. / 9, 0, 0, 0}, 9806cf0794eSJed Brown {1. / 4, 0, 3. / 4, 0, 0}, 9819371c9d4SSatish Balay {1. / 4, 0, 3. / 5, 0, 0} 982d27334e2SStefano Zampini }; 983d27334e2SStefano Zampini const PetscReal At[5][5] = { 984d27334e2SStefano Zampini {0, 0, 0, 0, 0 }, 985d27334e2SStefano Zampini {.5, .5, 0, 0, 0 }, 986d27334e2SStefano Zampini {5. / 18, -1. / 9, .5, 0, 0 }, 987d27334e2SStefano Zampini {.5, 0, 0, .5, 0 }, 988d27334e2SStefano Zampini {.25, 0, .75, -.5, .5} 989d27334e2SStefano Zampini }; 990d27334e2SStefano Zampini PetscCall(TSARKIMEXRegister(TSARKIMEXBPR3, 3, 5, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, NULL, NULL, 0, NULL, NULL)); 9916cf0794eSJed Brown } 9926cf0794eSJed Brown { 993d27334e2SStefano Zampini const PetscReal A[6][6] = { 9949371c9d4SSatish Balay {0, 0, 0, 0, 0, 0}, 995a3a57f36SJed Brown {1. / 2, 0, 0, 0, 0, 0}, 9964040e9f2SJed Brown {13861. / 62500., 6889. / 62500., 0, 0, 0, 0}, 9974040e9f2SJed Brown {-116923316275. / 2393684061468., -2731218467317. / 15368042101831., 9408046702089. / 11113171139209., 0, 0, 0}, 9984040e9f2SJed Brown {-451086348788. / 2902428689909., -2682348792572. / 7519795681897., 12662868775082. / 11960479115383., 3355817975965. / 11060851509271., 0, 0}, 9999371c9d4SSatish Balay {647845179188. / 3216320057751., 73281519250. / 8382639484533., 552539513391. / 3454668386233., 3354512671639. / 8306763924573., 4040. / 17871., 0} 1000d27334e2SStefano Zampini }; 1001d27334e2SStefano Zampini const PetscReal At[6][6] = { 1002d27334e2SStefano Zampini {0, 0, 0, 0, 0, 0 }, 1003d27334e2SStefano Zampini {1. / 4, 1. / 4, 0, 0, 0, 0 }, 1004d27334e2SStefano Zampini {8611. / 62500., -1743. / 31250., 1. / 4, 0, 0, 0 }, 1005d27334e2SStefano Zampini {5012029. / 34652500., -654441. / 2922500., 174375. / 388108., 1. / 4, 0, 0 }, 1006d27334e2SStefano Zampini {15267082809. / 155376265600., -71443401. / 120774400., 730878875. / 902184768., 2285395. / 8070912., 1. / 4, 0 }, 1007d27334e2SStefano Zampini {82889. / 524892., 0, 15625. / 83664., 69875. / 102672., -2260. / 8211, 1. / 4} 1008d27334e2SStefano Zampini }; 1009d27334e2SStefano Zampini const PetscReal bembedt[6] = {4586570599. / 29645900160., 0, 178811875. / 945068544., 814220225. / 1159782912., -3700637. / 11593932., 61727. / 225920.}; 1010d27334e2SStefano Zampini const PetscReal binterpt[6][3] = { 1011d27334e2SStefano Zampini {6943876665148. / 7220017795957., -54480133. / 30881146., 6818779379841. / 7100303317025. }, 1012d27334e2SStefano Zampini {0, 0, 0 }, 1013d27334e2SStefano Zampini {7640104374378. / 9702883013639., -11436875. / 14766696., 2173542590792. / 12501825683035. }, 1014d27334e2SStefano Zampini {-20649996744609. / 7521556579894., 174696575. / 18121608., -31592104683404. / 5083833661969.}, 1015d27334e2SStefano Zampini {8854892464581. / 2390941311638., -12120380. / 966161., 61146701046299. / 7138195549469. }, 1016d27334e2SStefano Zampini {-11397109935349. / 6675773540249., 3843. / 706., -17219254887155. / 4939391667607.} 1017d27334e2SStefano Zampini }; 10189566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX4, 4, 6, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL)); 1019a3a57f36SJed Brown } 1020a3a57f36SJed Brown { 1021d27334e2SStefano Zampini const PetscReal A[8][8] = { 10229371c9d4SSatish Balay {0, 0, 0, 0, 0, 0, 0, 0}, 1023a3a57f36SJed Brown {41. / 100, 0, 0, 0, 0, 0, 0, 0}, 10244040e9f2SJed Brown {367902744464. / 2072280473677., 677623207551. / 8224143866563., 0, 0, 0, 0, 0, 0}, 10254040e9f2SJed Brown {1268023523408. / 10340822734521., 0, 1029933939417. / 13636558850479., 0, 0, 0, 0, 0}, 10264040e9f2SJed Brown {14463281900351. / 6315353703477., 0, 66114435211212. / 5879490589093., -54053170152839. / 4284798021562., 0, 0, 0, 0}, 10274040e9f2SJed Brown {14090043504691. / 34967701212078., 0, 15191511035443. / 11219624916014., -18461159152457. / 12425892160975., -281667163811. / 9011619295870., 0, 0, 0}, 10284040e9f2SJed Brown {19230459214898. / 13134317526959., 0, 21275331358303. / 2942455364971., -38145345988419. / 4862620318723., -1. / 8, -1. / 8, 0, 0}, 10299371c9d4SSatish Balay {-19977161125411. / 11928030595625., 0, -40795976796054. / 6384907823539., 177454434618887. / 12078138498510., 782672205425. / 8267701900261., -69563011059811. / 9646580694205., 7356628210526. / 4942186776405., 0} 1030d27334e2SStefano Zampini }; 1031d27334e2SStefano Zampini const PetscReal At[8][8] = { 1032d27334e2SStefano Zampini {0, 0, 0, 0, 0, 0, 0, 0 }, 1033d27334e2SStefano Zampini {41. / 200., 41. / 200., 0, 0, 0, 0, 0, 0 }, 1034d27334e2SStefano Zampini {41. / 400., -567603406766. / 11931857230679., 41. / 200., 0, 0, 0, 0, 0 }, 1035d27334e2SStefano Zampini {683785636431. / 9252920307686., 0, -110385047103. / 1367015193373., 41. / 200., 0, 0, 0, 0 }, 1036d27334e2SStefano Zampini {3016520224154. / 10081342136671., 0, 30586259806659. / 12414158314087., -22760509404356. / 11113319521817., 41. / 200., 0, 0, 0 }, 1037d27334e2SStefano Zampini {218866479029. / 1489978393911., 0, 638256894668. / 5436446318841., -1179710474555. / 5321154724896., -60928119172. / 8023461067671., 41. / 200., 0, 0 }, 1038d27334e2SStefano Zampini {1020004230633. / 5715676835656., 0, 25762820946817. / 25263940353407., -2161375909145. / 9755907335909., -211217309593. / 5846859502534., -4269925059573. / 7827059040749., 41. / 200, 0 }, 1039d27334e2SStefano Zampini {-872700587467. / 9133579230613., 0, 0, 22348218063261. / 9555858737531., -1143369518992. / 8141816002931., -39379526789629. / 19018526304540., 32727382324388. / 42900044865799., 41. / 200.} 1040d27334e2SStefano Zampini }; 1041d27334e2SStefano Zampini const PetscReal bembedt[8] = {-975461918565. / 9796059967033., 0, 0, 78070527104295. / 32432590147079., -548382580838. / 3424219808633., -33438840321285. / 15594753105479., 3629800801594. / 4656183773603., 4035322873751. / 18575991585200.}; 1042d27334e2SStefano Zampini const PetscReal binterpt[8][3] = { 1043d27334e2SStefano Zampini {-17674230611817. / 10670229744614., 43486358583215. / 12773830924787., -9257016797708. / 5021505065439. }, 1044d27334e2SStefano Zampini {0, 0, 0 }, 1045d27334e2SStefano Zampini {0, 0, 0 }, 1046d27334e2SStefano Zampini {65168852399939. / 7868540260826., -91478233927265. / 11067650958493., 26096422576131. / 11239449250142.}, 1047d27334e2SStefano Zampini {15494834004392. / 5936557850923., -79368583304911. / 10890268929626., 92396832856987. / 20362823103730.}, 1048d27334e2SStefano Zampini {-99329723586156. / 26959484932159., -12239297817655. / 9152339842473., 30029262896817. / 10175596800299.}, 1049d27334e2SStefano Zampini {-19024464361622. / 5461577185407., 115839755401235. / 10719374521269., -26136350496073. / 3983972220547.}, 1050d27334e2SStefano Zampini {-6511271360970. / 6095937251113., 5843115559534. / 2180450260947., -5289405421727. / 3760307252460. } 1051d27334e2SStefano Zampini }; 10529566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegister(TSARKIMEX5, 5, 8, &At[0][0], NULL, NULL, &A[0][0], NULL, NULL, bembedt, bembedt, 3, binterpt[0], NULL)); 1053a3a57f36SJed Brown } 1054d27334e2SStefano Zampini #undef RC 1055d27334e2SStefano Zampini #undef us2 1056d27334e2SStefano Zampini #undef s2 10573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10588a381b04SJed Brown } 10598a381b04SJed Brown 10608a381b04SJed Brown /*@C 1061bcf0153eSBarry Smith TSARKIMEXRegisterDestroy - Frees the list of schemes that were registered by `TSARKIMEXRegister()`. 10628a381b04SJed Brown 10638a381b04SJed Brown Not Collective 10648a381b04SJed Brown 10658a381b04SJed Brown Level: advanced 10668a381b04SJed Brown 10671cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXRegister()`, `TSARKIMEXRegisterAll()` 10688a381b04SJed Brown @*/ 1069d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegisterDestroy(void) 1070d71ae5a4SJacob Faibussowitsch { 10718a381b04SJed Brown ARKTableauLink link; 10728a381b04SJed Brown 10738a381b04SJed Brown PetscFunctionBegin; 10748a381b04SJed Brown while ((link = ARKTableauList)) { 10758a381b04SJed Brown ARKTableau t = &link->tab; 10768a381b04SJed Brown ARKTableauList = link->next; 10779566063dSJacob Faibussowitsch PetscCall(PetscFree6(t->At, t->bt, t->ct, t->A, t->b, t->c)); 10789566063dSJacob Faibussowitsch PetscCall(PetscFree2(t->bembedt, t->bembed)); 10799566063dSJacob Faibussowitsch PetscCall(PetscFree2(t->binterpt, t->binterp)); 10809566063dSJacob Faibussowitsch PetscCall(PetscFree(t->name)); 10819566063dSJacob Faibussowitsch PetscCall(PetscFree(link)); 10828a381b04SJed Brown } 10838a381b04SJed Brown TSARKIMEXRegisterAllCalled = PETSC_FALSE; 10843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10858a381b04SJed Brown } 10868a381b04SJed Brown 10878a381b04SJed Brown /*@C 1088bcf0153eSBarry Smith TSARKIMEXInitializePackage - This function initializes everything in the `TSARKIMEX` package. It is called 1089bcf0153eSBarry Smith from `TSInitializePackage()`. 10908a381b04SJed Brown 10918a381b04SJed Brown Level: developer 10928a381b04SJed Brown 10931cc06b55SBarry Smith .seealso: [](ch_ts), `PetscInitialize()`, `TSARKIMEXFinalizePackage()` 10948a381b04SJed Brown @*/ 1095d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXInitializePackage(void) 1096d71ae5a4SJacob Faibussowitsch { 10978a381b04SJed Brown PetscFunctionBegin; 10983ba16761SJacob Faibussowitsch if (TSARKIMEXPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 10998a381b04SJed Brown TSARKIMEXPackageInitialized = PETSC_TRUE; 11009566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegisterAll()); 11019566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(TSARKIMEXFinalizePackage)); 11023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11038a381b04SJed Brown } 11048a381b04SJed Brown 11058a381b04SJed Brown /*@C 1106bcf0153eSBarry Smith TSARKIMEXFinalizePackage - This function destroys everything in the `TSARKIMEX` package. It is 1107bcf0153eSBarry Smith called from `PetscFinalize()`. 11088a381b04SJed Brown 11098a381b04SJed Brown Level: developer 11108a381b04SJed Brown 11111cc06b55SBarry Smith .seealso: [](ch_ts), `PetscFinalize()`, `TSARKIMEXInitializePackage()` 11128a381b04SJed Brown @*/ 1113d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXFinalizePackage(void) 1114d71ae5a4SJacob Faibussowitsch { 11158a381b04SJed Brown PetscFunctionBegin; 11168a381b04SJed Brown TSARKIMEXPackageInitialized = PETSC_FALSE; 11179566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRegisterDestroy()); 11183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11198a381b04SJed Brown } 11208a381b04SJed Brown 1121cd652676SJed Brown /*@C 1122bcf0153eSBarry Smith TSARKIMEXRegister - register a `TSARKIMEX` scheme by providing the entries in the Butcher tableau and optionally embedded approximations and interpolation 1123cd652676SJed Brown 1124cc4c1da9SBarry Smith Logically Collective 1125cd652676SJed Brown 1126cd652676SJed Brown Input Parameters: 1127cd652676SJed Brown + name - identifier for method 1128cd652676SJed Brown . order - approximation order of method 1129cd652676SJed Brown . s - number of stages, this is the dimension of the matrices below 1130cd652676SJed Brown . At - Butcher table of stage coefficients for stiff part (dimension s*s, row-major) 11310298fd71SBarry Smith . bt - Butcher table for completing the stiff part of the step (dimension s; NULL to use the last row of At) 11320298fd71SBarry Smith . ct - Abscissa of each stiff stage (dimension s, NULL to use row sums of At) 1133cd652676SJed Brown . A - Non-stiff stage coefficients (dimension s*s, row-major) 11340298fd71SBarry Smith . b - Non-stiff step completion table (dimension s; NULL to use last row of At) 11350298fd71SBarry Smith . c - Non-stiff abscissa (dimension s; NULL to use row sums of A) 11360298fd71SBarry Smith . bembedt - Stiff part of completion table for embedded method (dimension s; NULL if not available) 11370298fd71SBarry Smith . bembed - Non-stiff part of completion table for embedded method (dimension s; NULL to use bembedt if provided) 1138cd652676SJed Brown . pinterp - Order of the interpolation scheme, equal to the number of columns of binterpt and binterp 1139cd652676SJed Brown . binterpt - Coefficients of the interpolation formula for the stiff part (dimension s*pinterp) 11400298fd71SBarry Smith - binterp - Coefficients of the interpolation formula for the non-stiff part (dimension s*pinterp; NULL to reuse binterpt) 1141cd652676SJed Brown 1142cd652676SJed Brown Level: advanced 1143cd652676SJed Brown 1144bcf0153eSBarry Smith Note: 1145bcf0153eSBarry Smith Several `TSARKIMEX` methods are provided, this function is only needed to create new methods. 1146bcf0153eSBarry Smith 11471cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSType`, `TS` 1148cd652676SJed Brown @*/ 1149d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXRegister(TSARKIMEXType name, PetscInt order, PetscInt s, const PetscReal At[], const PetscReal bt[], const PetscReal ct[], const PetscReal A[], const PetscReal b[], const PetscReal c[], const PetscReal bembedt[], const PetscReal bembed[], PetscInt pinterp, const PetscReal binterpt[], const PetscReal binterp[]) 1150d71ae5a4SJacob Faibussowitsch { 11518a381b04SJed Brown ARKTableauLink link; 11528a381b04SJed Brown ARKTableau t; 11538a381b04SJed Brown PetscInt i, j; 11548a381b04SJed Brown 11558a381b04SJed Brown PetscFunctionBegin; 1156a748edf9SJed Brown PetscCheck(s > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "Expected number of stages s %" PetscInt_FMT " > 0", s); 11579566063dSJacob Faibussowitsch PetscCall(TSARKIMEXInitializePackage()); 1158d27334e2SStefano Zampini for (link = ARKTableauList; link; link = link->next) { 1159d27334e2SStefano Zampini PetscBool match; 1160d27334e2SStefano Zampini 1161d27334e2SStefano Zampini PetscCall(PetscStrcmp(link->tab.name, name, &match)); 1162d27334e2SStefano Zampini PetscCheck(!match, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Method with name \"%s\" already registered", name); 1163d27334e2SStefano Zampini } 11649566063dSJacob Faibussowitsch PetscCall(PetscNew(&link)); 11658a381b04SJed Brown t = &link->tab; 11669566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &t->name)); 11678a381b04SJed Brown t->order = order; 11688a381b04SJed Brown t->s = s; 11699566063dSJacob Faibussowitsch PetscCall(PetscMalloc6(s * s, &t->At, s, &t->bt, s, &t->ct, s * s, &t->A, s, &t->b, s, &t->c)); 11709566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->At, At, s * s)); 1171d27334e2SStefano Zampini if (A) { 11729566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->A, A, s * s)); 1173d27334e2SStefano Zampini t->additive = PETSC_TRUE; 1174d27334e2SStefano Zampini } 1175d27334e2SStefano Zampini 11769566063dSJacob Faibussowitsch if (bt) PetscCall(PetscArraycpy(t->bt, bt, s)); 11779371c9d4SSatish Balay else 11789371c9d4SSatish Balay for (i = 0; i < s; i++) t->bt[i] = At[(s - 1) * s + i]; 1179d27334e2SStefano Zampini 1180d27334e2SStefano Zampini if (t->additive) { 11819566063dSJacob Faibussowitsch if (b) PetscCall(PetscArraycpy(t->b, b, s)); 11829371c9d4SSatish Balay else 11839371c9d4SSatish Balay for (i = 0; i < s; i++) t->b[i] = t->bt[i]; 1184d27334e2SStefano Zampini } else PetscCall(PetscArrayzero(t->b, s)); 1185d27334e2SStefano Zampini 11869566063dSJacob Faibussowitsch if (ct) PetscCall(PetscArraycpy(t->ct, ct, s)); 11879371c9d4SSatish Balay else 11889371c9d4SSatish Balay for (i = 0; i < s; i++) 11899371c9d4SSatish Balay for (j = 0, t->ct[i] = 0; j < s; j++) t->ct[i] += At[i * s + j]; 1190d27334e2SStefano Zampini 1191d27334e2SStefano Zampini if (t->additive) { 11929566063dSJacob Faibussowitsch if (c) PetscCall(PetscArraycpy(t->c, c, s)); 11939371c9d4SSatish Balay else 11949371c9d4SSatish Balay for (i = 0; i < s; i++) 11959371c9d4SSatish Balay for (j = 0, t->c[i] = 0; j < s; j++) t->c[i] += A[i * s + j]; 1196d27334e2SStefano Zampini } else PetscCall(PetscArrayzero(t->c, s)); 1197d27334e2SStefano Zampini 1198e817cc15SEmil Constantinescu t->stiffly_accurate = PETSC_TRUE; 11999371c9d4SSatish Balay for (i = 0; i < s; i++) 12009371c9d4SSatish Balay if (t->At[(s - 1) * s + i] != t->bt[i]) t->stiffly_accurate = PETSC_FALSE; 1201d27334e2SStefano Zampini 1202e817cc15SEmil Constantinescu t->explicit_first_stage = PETSC_TRUE; 12039371c9d4SSatish Balay for (i = 0; i < s; i++) 12049371c9d4SSatish Balay if (t->At[i] != 0.0) t->explicit_first_stage = PETSC_FALSE; 1205d27334e2SStefano Zampini 1206e817cc15SEmil Constantinescu /* def of FSAL can be made more precise */ 12074e9d4bf5SJed Brown t->FSAL_implicit = (PetscBool)(t->explicit_first_stage && t->stiffly_accurate); 1208d27334e2SStefano Zampini 1209108c343cSJed Brown if (bembedt) { 12109566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(s, &t->bembedt, s, &t->bembed)); 12119566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->bembedt, bembedt, s)); 12129566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->bembed, bembed ? bembed : bembedt, s)); 1213108c343cSJed Brown } 1214108c343cSJed Brown 12154f385281SJed Brown t->pinterp = pinterp; 12169566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(s * pinterp, &t->binterpt, s * pinterp, &t->binterp)); 12179566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->binterpt, binterpt, s * pinterp)); 12189566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(t->binterp, binterp ? binterp : binterpt, s * pinterp)); 1219d27334e2SStefano Zampini 12208a381b04SJed Brown link->next = ARKTableauList; 12218a381b04SJed Brown ARKTableauList = link; 12223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12238a381b04SJed Brown } 12248a381b04SJed Brown 1225d27334e2SStefano Zampini /*@C 1226d27334e2SStefano Zampini TSDIRKRegister - register a `TSDIRK` scheme by providing the entries in its Butcher tableau and, optionally, embedded approximations and interpolation 1227d27334e2SStefano Zampini 1228d27334e2SStefano Zampini Logically Collective. 1229d27334e2SStefano Zampini 1230d27334e2SStefano Zampini Input Parameters: 1231d27334e2SStefano Zampini + name - identifier for method 1232d27334e2SStefano Zampini . order - approximation order of method 1233d27334e2SStefano Zampini . s - number of stages, this is the dimension of the matrices below 1234d27334e2SStefano Zampini . At - Butcher table of stage coefficients (dimension `s`*`s`, row-major order) 1235d27334e2SStefano Zampini . bt - Butcher table for completing the step (dimension `s`; pass `NULL` to use the last row of `At`) 1236d27334e2SStefano Zampini . ct - Abscissa of each stage (dimension s, NULL to use row sums of At) 1237d27334e2SStefano Zampini . bembedt - Stiff part of completion table for embedded method (dimension s; `NULL` if not available) 1238d27334e2SStefano Zampini . pinterp - Order of the interpolation scheme, equal to the number of columns of `binterpt` and `binterp` 1239d27334e2SStefano Zampini - binterpt - Coefficients of the interpolation formula (dimension s*pinterp) 1240d27334e2SStefano Zampini 1241d27334e2SStefano Zampini Level: advanced 1242d27334e2SStefano Zampini 1243d27334e2SStefano Zampini Note: 1244d27334e2SStefano Zampini Several `TSDIRK` methods are provided, the use of this function is only needed to create new methods. 1245d27334e2SStefano Zampini 1246d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRK`, `TSType`, `TS` 1247d27334e2SStefano Zampini @*/ 1248d27334e2SStefano Zampini PetscErrorCode TSDIRKRegister(TSDIRKType name, PetscInt order, PetscInt s, const PetscReal At[], const PetscReal bt[], const PetscReal ct[], const PetscReal bembedt[], PetscInt pinterp, const PetscReal binterpt[]) 1249d27334e2SStefano Zampini { 1250d27334e2SStefano Zampini PetscFunctionBegin; 1251d27334e2SStefano Zampini PetscCall(TSARKIMEXRegister(name, order, s, At, bt, ct, NULL, NULL, NULL, bembedt, NULL, pinterp, binterpt, NULL)); 1252d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 1253d27334e2SStefano Zampini } 1254d27334e2SStefano Zampini 1255108c343cSJed Brown /* 1256108c343cSJed Brown The step completion formula is 1257108c343cSJed Brown 1258108c343cSJed Brown x1 = x0 - h bt^T YdotI + h b^T YdotRHS 1259108c343cSJed Brown 1260108c343cSJed Brown This function can be called before or after ts->vec_sol has been updated. 1261108c343cSJed Brown Suppose we have a completion formula (bt,b) and an embedded formula (bet,be) of different order. 1262108c343cSJed Brown We can write 1263108c343cSJed Brown 1264108c343cSJed Brown x1e = x0 - h bet^T YdotI + h be^T YdotRHS 1265108c343cSJed Brown = x1 + h bt^T YdotI - h b^T YdotRHS - h bet^T YdotI + h be^T YdotRHS 1266108c343cSJed Brown = x1 - h (bet - bt)^T YdotI + h (be - b)^T YdotRHS 1267108c343cSJed Brown 1268108c343cSJed Brown so we can evaluate the method with different order even after the step has been optimistically completed. 1269108c343cSJed Brown */ 1270d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSEvaluateStep_ARKIMEX(TS ts, PetscInt order, Vec X, PetscBool *done) 1271d71ae5a4SJacob Faibussowitsch { 1272108c343cSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1273108c343cSJed Brown ARKTableau tab = ark->tableau; 1274108c343cSJed Brown PetscScalar *w = ark->work; 1275108c343cSJed Brown PetscReal h; 1276108c343cSJed Brown PetscInt s = tab->s, j; 1277d27334e2SStefano Zampini PetscBool hasE; 1278108c343cSJed Brown 1279108c343cSJed Brown PetscFunctionBegin; 1280108c343cSJed Brown switch (ark->status) { 1281108c343cSJed Brown case TS_STEP_INCOMPLETE: 1282d71ae5a4SJacob Faibussowitsch case TS_STEP_PENDING: 1283d71ae5a4SJacob Faibussowitsch h = ts->time_step; 1284d71ae5a4SJacob Faibussowitsch break; 1285d71ae5a4SJacob Faibussowitsch case TS_STEP_COMPLETE: 1286d71ae5a4SJacob Faibussowitsch h = ts->ptime - ts->ptime_prev; 1287d71ae5a4SJacob Faibussowitsch break; 1288d71ae5a4SJacob Faibussowitsch default: 1289d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); 1290108c343cSJed Brown } 1291108c343cSJed Brown if (order == tab->order) { 1292e817cc15SEmil Constantinescu if (ark->status == TS_STEP_INCOMPLETE) { 1293740132f1SEmil Constantinescu if (!ark->imex && tab->stiffly_accurate) { /* Only the stiffly accurate implicit formula is used */ 12949566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y[s - 1], X)); 1295e817cc15SEmil Constantinescu } else { /* Use the standard completion formula (bt,b) */ 12969566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, X)); 1297e817cc15SEmil Constantinescu for (j = 0; j < s; j++) w[j] = h * tab->bt[j]; 12989566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotI)); 1299d27334e2SStefano Zampini if (tab->additive && ark->imex) { /* Method is IMEX, complete the explicit formula */ 1300d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1301d27334e2SStefano Zampini if (hasE) { 1302108c343cSJed Brown for (j = 0; j < s; j++) w[j] = h * tab->b[j]; 13039566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotRHS)); 1304e817cc15SEmil Constantinescu } 1305e817cc15SEmil Constantinescu } 1306d27334e2SStefano Zampini } 13079566063dSJacob Faibussowitsch } else PetscCall(VecCopy(ts->vec_sol, X)); 1308108c343cSJed Brown if (done) *done = PETSC_TRUE; 13093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1310108c343cSJed Brown } else if (order == tab->order - 1) { 1311108c343cSJed Brown if (!tab->bembedt) goto unavailable; 1312108c343cSJed Brown if (ark->status == TS_STEP_INCOMPLETE) { /* Complete with the embedded method (bet,be) */ 13139566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, X)); 1314e817cc15SEmil Constantinescu for (j = 0; j < s; j++) w[j] = h * tab->bembedt[j]; 13159566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotI)); 1316d27334e2SStefano Zampini if (tab->additive) { 1317d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1318d27334e2SStefano Zampini if (hasE) { 1319108c343cSJed Brown for (j = 0; j < s; j++) w[j] = h * tab->bembed[j]; 13209566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotRHS)); 1321d27334e2SStefano Zampini } 1322d27334e2SStefano Zampini } 1323108c343cSJed Brown } else { /* Rollback and re-complete using (bet-be,be-b) */ 13249566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, X)); 1325e817cc15SEmil Constantinescu for (j = 0; j < s; j++) w[j] = h * (tab->bembedt[j] - tab->bt[j]); 13269566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, tab->s, w, ark->YdotI)); 1327d27334e2SStefano Zampini if (tab->additive) { 1328d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1329d27334e2SStefano Zampini if (hasE) { 1330108c343cSJed Brown for (j = 0; j < s; j++) w[j] = h * (tab->bembed[j] - tab->b[j]); 13319566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, w, ark->YdotRHS)); 1332108c343cSJed Brown } 1333d27334e2SStefano Zampini } 1334d27334e2SStefano Zampini } 1335108c343cSJed Brown if (done) *done = PETSC_TRUE; 13363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1337108c343cSJed Brown } 1338108c343cSJed Brown unavailable: 1339108c343cSJed Brown if (done) *done = PETSC_FALSE; 13409371c9d4SSatish Balay else 13419371c9d4SSatish Balay SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "ARKIMEX '%s' of order %" PetscInt_FMT " cannot evaluate step at order %" PetscInt_FMT ". Consider using -ts_adapt_type none or a different method that has an embedded estimate.", tab->name, 13429371c9d4SSatish Balay tab->order, order); 13433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1344108c343cSJed Brown } 1345108c343cSJed Brown 1346d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTestMassIdentity(TS ts, PetscBool *id) 1347d71ae5a4SJacob Faibussowitsch { 1348c79dcfbdSBarry Smith Vec Udot, Y1, Y2; 1349c79dcfbdSBarry Smith TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1350c79dcfbdSBarry Smith PetscReal norm; 1351c79dcfbdSBarry Smith 1352c79dcfbdSBarry Smith PetscFunctionBegin; 13539566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &Udot)); 13549566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &Y1)); 13559566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &Y2)); 13569566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y1, ark->imex)); 13579566063dSJacob Faibussowitsch PetscCall(VecSetRandom(Udot, NULL)); 13589566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ts->ptime, ts->vec_sol, Udot, Y2, ark->imex)); 13599566063dSJacob Faibussowitsch PetscCall(VecAXPY(Y2, -1.0, Y1)); 13609566063dSJacob Faibussowitsch PetscCall(VecAXPY(Y2, -1.0, Udot)); 13619566063dSJacob Faibussowitsch PetscCall(VecNorm(Y2, NORM_2, &norm)); 1362c79dcfbdSBarry Smith if (norm < 100.0 * PETSC_MACHINE_EPSILON) { 1363c79dcfbdSBarry Smith *id = PETSC_TRUE; 1364c79dcfbdSBarry Smith } else { 1365c79dcfbdSBarry Smith *id = PETSC_FALSE; 13669566063dSJacob Faibussowitsch PetscCall(PetscInfo((PetscObject)ts, "IFunction(Udot = random) - IFunction(Udot = 0) is not near Udot, %g, suspect mass matrix implied in IFunction() is not the identity as required\n", (double)norm)); 1367c79dcfbdSBarry Smith } 13689566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Udot)); 13699566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Y1)); 13709566063dSJacob Faibussowitsch PetscCall(VecDestroy(&Y2)); 13713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1372c79dcfbdSBarry Smith } 1373c79dcfbdSBarry Smith 13740467964bSStefano Zampini static PetscErrorCode TSARKIMEXComputeAlgebraicIS(TS, PetscReal, Vec, IS *); 13750467964bSStefano Zampini 1376d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSStep_ARKIMEX(TS ts) 1377d71ae5a4SJacob Faibussowitsch { 13788a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 13798a381b04SJed Brown ARKTableau tab = ark->tableau; 13808a381b04SJed Brown const PetscInt s = tab->s; 138124655328SShri const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c; 1382406d0ec2SJed Brown PetscScalar *w = ark->work; 13831297b224SEmil Constantinescu Vec *Y = ark->Y, *YdotI = ark->YdotI, *YdotRHS = ark->YdotRHS, Ydot = ark->Ydot, Ydot0 = ark->Ydot0, Z = ark->Z; 138496400bd6SLisandro Dalcin PetscBool extrapolate = ark->extrapolate; 1385108c343cSJed Brown TSAdapt adapt; 13868a381b04SJed Brown SNES snes; 1387fecfb714SLisandro Dalcin PetscInt i, j, its, lits; 1388be5899b3SLisandro Dalcin PetscInt rejections = 0; 1389d27334e2SStefano Zampini PetscBool hasE = PETSC_FALSE, dirk = (PetscBool)(!tab->additive), stageok, accept = PETSC_TRUE; 139096400bd6SLisandro Dalcin PetscReal next_time_step = ts->time_step; 13918a381b04SJed Brown 13928a381b04SJed Brown PetscFunctionBegin; 139396400bd6SLisandro Dalcin if (ark->extrapolate && !ark->Y_prev) { 13949566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev)); 13959566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev)); 1396d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev)); 139796400bd6SLisandro Dalcin } 139896400bd6SLisandro Dalcin 1399d27334e2SStefano Zampini if (!dirk) PetscCall(TSHasRHSFunction(ts, &hasE)); 1400d27334e2SStefano Zampini if (!hasE) dirk = PETSC_TRUE; 1401d27334e2SStefano Zampini 140296400bd6SLisandro Dalcin if (!ts->steprollback) { 1403d27334e2SStefano Zampini if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { /* Save the initial slope for the next step */ 14049566063dSJacob Faibussowitsch PetscCall(VecCopy(YdotI[s - 1], Ydot0)); 140596400bd6SLisandro Dalcin } 1406fecfb714SLisandro Dalcin if (ark->extrapolate && !ts->steprestart) { /* Save the Y, YdotI, YdotRHS for extrapolation initial guess */ 140796400bd6SLisandro Dalcin for (i = 0; i < s; i++) { 14089566063dSJacob Faibussowitsch PetscCall(VecCopy(Y[i], ark->Y_prev[i])); 14099566063dSJacob Faibussowitsch PetscCall(VecCopy(YdotI[i], ark->YdotI_prev[i])); 1410d27334e2SStefano Zampini if (tab->additive && hasE) PetscCall(VecCopy(YdotRHS[i], ark->YdotRHS_prev[i])); 141196400bd6SLisandro Dalcin } 141296400bd6SLisandro Dalcin } 141396400bd6SLisandro Dalcin } 141496400bd6SLisandro Dalcin 14153b98415fSStefano Zampini /* 14163b98415fSStefano Zampini For fully implicit formulations we must solve the equations 14173b98415fSStefano Zampini 14183b98415fSStefano Zampini F(t_n,x_n,xdot) = 0 14193b98415fSStefano Zampini 14203b98415fSStefano Zampini for the explicit first stage. 14213b98415fSStefano Zampini Here we call SNESSolve using PETSC_MAX_REAL as shift to flag it. 14223b98415fSStefano Zampini Special handling is inside SNESTSFormFunction_ARKIMEX and SNESTSFormJacobian_ARKIMEX 1423c6bf8827SStefano Zampini We compute Ydot0 if we restart the step or if we resized the problem after remeshing 14243b98415fSStefano Zampini */ 1425c6bf8827SStefano Zampini if (dirk && tab->explicit_first_stage && (ts->steprestart || ts->stepresize)) { 142698940a98SHong Zhang ark->scoeff = PETSC_MAX_REAL; 1427d27334e2SStefano Zampini PetscCall(VecCopy(ts->vec_sol, Z)); 14280467964bSStefano Zampini if (!ark->alg_is) { 14290467964bSStefano Zampini PetscCall(TSARKIMEXComputeAlgebraicIS(ts, ts->ptime, Z, &ark->alg_is)); 14300467964bSStefano Zampini PetscCall(ISViewFromOptions(ark->alg_is, (PetscObject)ts, "-ts_arkimex_algebraic_is_view")); 14310467964bSStefano Zampini } 1432d27334e2SStefano Zampini PetscCall(TSGetSNES(ts, &snes)); 14330467964bSStefano Zampini PetscCall(PetscObjectIncrementTabLevel((PetscObject)snes, (PetscObject)snes, 1)); 1434d27334e2SStefano Zampini PetscCall(SNESSolve(snes, NULL, Ydot0)); 1435c6bf8827SStefano Zampini if (ark->alg_is) PetscCall(VecISSet(Ydot0, ark->alg_is, 0.0)); 14360467964bSStefano Zampini PetscCall(PetscObjectIncrementTabLevel((PetscObject)snes, (PetscObject)snes, -1)); 1437d27334e2SStefano Zampini } 1438d27334e2SStefano Zampini 1439d27334e2SStefano Zampini /* For IMEX we compute a step */ 1440d27334e2SStefano Zampini if (!dirk && ts->equation_type >= TS_EQ_IMPLICIT && tab->explicit_first_stage && ts->steprestart) { 144196400bd6SLisandro Dalcin TS ts_start; 1442d27334e2SStefano Zampini if (PetscDefined(USE_DEBUG) && hasE) { 1443c79dcfbdSBarry Smith PetscBool id = PETSC_FALSE; 14449566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTestMassIdentity(ts, &id)); 14458434afd1SBarry Smith PetscCheck(id, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "This scheme requires an identity mass matrix, however the TSIFunctionFn you provided does not utilize an identity mass matrix"); 1446c79dcfbdSBarry Smith } 14479566063dSJacob Faibussowitsch PetscCall(TSClone(ts, &ts_start)); 14489566063dSJacob Faibussowitsch PetscCall(TSSetSolution(ts_start, ts->vec_sol)); 14499566063dSJacob Faibussowitsch PetscCall(TSSetTime(ts_start, ts->ptime)); 14509566063dSJacob Faibussowitsch PetscCall(TSSetMaxSteps(ts_start, ts->steps + 1)); 14519566063dSJacob Faibussowitsch PetscCall(TSSetMaxTime(ts_start, ts->ptime + ts->time_step)); 14529566063dSJacob Faibussowitsch PetscCall(TSSetExactFinalTime(ts_start, TS_EXACTFINALTIME_STEPOVER)); 14539566063dSJacob Faibussowitsch PetscCall(TSSetTimeStep(ts_start, ts->time_step)); 14549566063dSJacob Faibussowitsch PetscCall(TSSetType(ts_start, TSARKIMEX)); 14559566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetFullyImplicit(ts_start, PETSC_TRUE)); 14569566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetType(ts_start, TSARKIMEX1BEE)); 145734561852SEmil Constantinescu 14589566063dSJacob Faibussowitsch PetscCall(TSRestartStep(ts_start)); 14599566063dSJacob Faibussowitsch PetscCall(TSSolve(ts_start, ts->vec_sol)); 14609566063dSJacob Faibussowitsch PetscCall(TSGetTime(ts_start, &ts->ptime)); 14619566063dSJacob Faibussowitsch PetscCall(TSGetTimeStep(ts_start, &ts->time_step)); 1462bbd56ea5SKarl Rupp 146385fc7851SLisandro Dalcin { /* Save the initial slope for the next step */ 146485fc7851SLisandro Dalcin TS_ARKIMEX *ark_start = (TS_ARKIMEX *)ts_start->data; 14659566063dSJacob Faibussowitsch PetscCall(VecCopy(ark_start->YdotI[ark_start->tableau->s - 1], Ydot0)); 146685fc7851SLisandro Dalcin } 146796400bd6SLisandro Dalcin ts->steps++; 146834561852SEmil Constantinescu 1469d15a3a53SEmil Constantinescu /* Set the correct TS in SNES */ 1470d15a3a53SEmil Constantinescu /* We'll try to bypass this by changing the method on the fly */ 147196400bd6SLisandro Dalcin { 14729566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 14739566063dSJacob Faibussowitsch PetscCall(TSSetSNES(ts, snes)); 147496400bd6SLisandro Dalcin } 14759566063dSJacob Faibussowitsch PetscCall(TSDestroy(&ts_start)); 1476e817cc15SEmil Constantinescu } 1477e817cc15SEmil Constantinescu 1478108c343cSJed Brown ark->status = TS_STEP_INCOMPLETE; 147996400bd6SLisandro Dalcin while (!ts->reason && ark->status != TS_STEP_COMPLETE) { 148096400bd6SLisandro Dalcin PetscReal t = ts->ptime; 1481108c343cSJed Brown PetscReal h = ts->time_step; 14828a381b04SJed Brown for (i = 0; i < s; i++) { 14839be3e283SDebojyoti Ghosh ark->stage_time = t + h * ct[i]; 14849566063dSJacob Faibussowitsch PetscCall(TSPreStage(ts, ark->stage_time)); 14858a381b04SJed Brown if (At[i * s + i] == 0) { /* This stage is explicit */ 14863c633725SBarry 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"); 14879566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, Y[i])); 1488e817cc15SEmil Constantinescu for (j = 0; j < i; j++) w[j] = h * At[i * s + j]; 14899566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Y[i], i, w, YdotI)); 1490d27334e2SStefano Zampini if (tab->additive && hasE) { 14918a381b04SJed Brown for (j = 0; j < i; j++) w[j] = h * A[i * s + j]; 14929566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Y[i], i, w, YdotRHS)); 1493d27334e2SStefano Zampini } 1494*12b1dd1aSStefano Zampini PetscCall(TSGetSNES(ts, &snes)); 1495*12b1dd1aSStefano Zampini PetscCall(SNESResetCounters(snes)); 14968a381b04SJed Brown } else { 1497b296d7d5SJed Brown ark->scoeff = 1. / At[i * s + i]; 14988a381b04SJed Brown /* Ydot = shift*(Y-Z) */ 14999566063dSJacob Faibussowitsch PetscCall(VecCopy(ts->vec_sol, Z)); 1500e817cc15SEmil Constantinescu for (j = 0; j < i; j++) w[j] = h * At[i * s + j]; 15019566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Z, i, w, YdotI)); 1502d27334e2SStefano Zampini if (tab->additive && hasE) { 1503c58d1302SEmil Constantinescu for (j = 0; j < i; j++) w[j] = h * A[i * s + j]; 15049566063dSJacob Faibussowitsch PetscCall(VecMAXPY(Z, i, w, YdotRHS)); 1505d27334e2SStefano Zampini } 1506fecfb714SLisandro Dalcin if (extrapolate && !ts->steprestart) { 150756dcabbaSDebojyoti Ghosh /* Initial guess extrapolated from previous time step stage values */ 15089566063dSJacob Faibussowitsch PetscCall(TSExtrapolate_ARKIMEX(ts, c[i], Y[i])); 150956dcabbaSDebojyoti Ghosh } else { 15108a381b04SJed Brown /* Initial guess taken from last stage */ 15119566063dSJacob Faibussowitsch PetscCall(VecCopy(i > 0 ? Y[i - 1] : ts->vec_sol, Y[i])); 151256dcabbaSDebojyoti Ghosh } 15139566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 15149566063dSJacob Faibussowitsch PetscCall(SNESSolve(snes, NULL, Y[i])); 15159566063dSJacob Faibussowitsch PetscCall(SNESGetIterationNumber(snes, &its)); 15169566063dSJacob Faibussowitsch PetscCall(SNESGetLinearSolveIterations(snes, &lits)); 15179371c9d4SSatish Balay ts->snes_its += its; 15189371c9d4SSatish Balay ts->ksp_its += lits; 15199566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 15209566063dSJacob Faibussowitsch PetscCall(TSAdaptCheckStage(adapt, ts, ark->stage_time, Y[i], &stageok)); 152196400bd6SLisandro Dalcin if (!stageok) { 15221be93e3eSJed Brown /* We are likely rejecting the step because of solver or function domain problems so we should not attempt to 15231be93e3eSJed Brown * use extrapolation to initialize the solves on the next attempt. */ 152496400bd6SLisandro Dalcin extrapolate = PETSC_FALSE; 15251be93e3eSJed Brown goto reject_step; 15261be93e3eSJed Brown } 15278a381b04SJed Brown } 1528d27334e2SStefano Zampini if (dirk || ts->equation_type >= TS_EQ_IMPLICIT) { 1529e817cc15SEmil Constantinescu if (i == 0 && tab->explicit_first_stage) { 1530d27334e2SStefano 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", 1531d27334e2SStefano Zampini ((PetscObject)ts)->type_name, ark->tableau->name); 15329566063dSJacob Faibussowitsch PetscCall(VecCopy(Ydot0, YdotI[0])); /* YdotI = YdotI(tn-1) */ 1533e817cc15SEmil Constantinescu } else { 15349566063dSJacob Faibussowitsch PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */ 1535e817cc15SEmil Constantinescu } 1536e817cc15SEmil Constantinescu } else { 15375eca1a21SEmil Constantinescu if (i == 0 && tab->explicit_first_stage) { 15389566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(Ydot)); 15399566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, t + h * ct[i], Y[i], Ydot, YdotI[i], ark->imex)); /* YdotI = -G(t,Y,0) */ 15409566063dSJacob Faibussowitsch PetscCall(VecScale(YdotI[i], -1.0)); 15415eca1a21SEmil Constantinescu } else { 15429566063dSJacob Faibussowitsch PetscCall(VecAXPBYPCZ(YdotI[i], -ark->scoeff / h, ark->scoeff / h, 0, Z, Y[i])); /* YdotI = shift*(X-Z) */ 15435eca1a21SEmil Constantinescu } 1544d27334e2SStefano Zampini if (hasE) { 15454cc180ffSJed Brown if (ark->imex) { 15469566063dSJacob Faibussowitsch PetscCall(TSComputeRHSFunction(ts, t + h * c[i], Y[i], YdotRHS[i])); 15474cc180ffSJed Brown } else { 15489566063dSJacob Faibussowitsch PetscCall(VecZeroEntries(YdotRHS[i])); 15494cc180ffSJed Brown } 15508a381b04SJed Brown } 1551d27334e2SStefano Zampini } 15529566063dSJacob Faibussowitsch PetscCall(TSPostStage(ts, ark->stage_time, i, Y)); 1553e817cc15SEmil Constantinescu } 155496400bd6SLisandro Dalcin 1555be5899b3SLisandro Dalcin ark->status = TS_STEP_INCOMPLETE; 15569566063dSJacob Faibussowitsch PetscCall(TSEvaluateStep_ARKIMEX(ts, tab->order, ts->vec_sol, NULL)); 1557108c343cSJed Brown ark->status = TS_STEP_PENDING; 15589566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 15599566063dSJacob Faibussowitsch PetscCall(TSAdaptCandidatesClear(adapt)); 15609566063dSJacob Faibussowitsch PetscCall(TSAdaptCandidateAdd(adapt, tab->name, tab->order, 1, tab->ccfl, (PetscReal)tab->s, PETSC_TRUE)); 15619566063dSJacob Faibussowitsch PetscCall(TSAdaptChoose(adapt, ts, ts->time_step, NULL, &next_time_step, &accept)); 156296400bd6SLisandro Dalcin ark->status = accept ? TS_STEP_COMPLETE : TS_STEP_INCOMPLETE; 156396400bd6SLisandro Dalcin if (!accept) { /* Roll back the current step */ 1564c61711c8SStefano Zampini PetscCall(VecCopy(ts->vec_sol0, ts->vec_sol)); 1565be5899b3SLisandro Dalcin ts->time_step = next_time_step; 1566be5899b3SLisandro Dalcin goto reject_step; 156796400bd6SLisandro Dalcin } 156896400bd6SLisandro Dalcin 15698a381b04SJed Brown ts->ptime += ts->time_step; 1570cdbf8f93SLisandro Dalcin ts->time_step = next_time_step; 1571108c343cSJed Brown break; 157296400bd6SLisandro Dalcin 157396400bd6SLisandro Dalcin reject_step: 15749371c9d4SSatish Balay ts->reject++; 15759371c9d4SSatish Balay accept = PETSC_FALSE; 1576be5899b3SLisandro Dalcin if (!ts->reason && ++rejections > ts->max_reject && ts->max_reject >= 0) { 157796400bd6SLisandro Dalcin ts->reason = TS_DIVERGED_STEP_REJECTED; 157863a3b9bcSJacob Faibussowitsch PetscCall(PetscInfo(ts, "Step=%" PetscInt_FMT ", step rejections %" PetscInt_FMT " greater than current TS allowed, stopping solve\n", ts->steps, rejections)); 1579108c343cSJed Brown } 1580f85781f1SEmil Constantinescu } 15813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 15828a381b04SJed Brown } 1583d27334e2SStefano Zampini 158480ab5e31SHong Zhang /* 158580ab5e31SHong Zhang This adjoint step function assumes the partitioned ODE system has an identity mass matrix and thus can be represented in the form 158680ab5e31SHong Zhang Udot = H(t,U) + G(t,U) 158780ab5e31SHong Zhang This corresponds to F(t,U,Udot) = Udot-H(t,U). 158880ab5e31SHong Zhang 158980ab5e31SHong Zhang The complete adjoint equations are 159080ab5e31SHong Zhang (shift*I - dHdu) lambda_s[i] = 1/at[i][i] ( 15915d7a6ebeSHong Zhang dGdU (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j]) 15925d7a6ebeSHong Zhang + dHdU (bt[i] lambda_{n+1} + \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0 159380ab5e31SHong Zhang lambda_n = lambda_{n+1} + \sum_{j=1}^s lambda_s[j] 159480ab5e31SHong Zhang mu_{n+1}[i] = h (at[i][i] dHdP lambda_s[i] 15955d7a6ebeSHong Zhang + dGdP (b_i lambda_{n+1} + \sum_{j=i+1}^s a[j][i] lambda_s[j]) 15965d7a6ebeSHong Zhang + dHdP (bt[i] lambda_{n+1} + \sum_{j=i+1}^s at[j][i] lambda_s[j])), i = s-1,...,0 159780ab5e31SHong Zhang mu_n = mu_{n+1} + \sum_{j=1}^s mu_{n+1}[j] 159880ab5e31SHong Zhang where shift = 1/(at[i][i]*h) 159980ab5e31SHong Zhang 160080ab5e31SHong Zhang If at[i][i] is 0, the first equation falls back to 160180ab5e31SHong Zhang lambda_s[i] = h ( 160280ab5e31SHong Zhang (b_i dGdU + bt[i] dHdU) lambda_{n+1} + dGdU \sum_{j=i+1}^s a[j][i] lambda_s[j] 160380ab5e31SHong Zhang + dHdU \sum_{j=i+1}^s at[j][i] lambda_s[j]) 160480ab5e31SHong Zhang 160580ab5e31SHong Zhang */ 160680ab5e31SHong Zhang static PetscErrorCode TSAdjointStep_ARKIMEX(TS ts) 160780ab5e31SHong Zhang { 160880ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 160980ab5e31SHong Zhang ARKTableau tab = ark->tableau; 161080ab5e31SHong Zhang const PetscInt s = tab->s; 161180ab5e31SHong Zhang const PetscReal *At = tab->At, *A = tab->A, *ct = tab->ct, *c = tab->c, *b = tab->b, *bt = tab->bt; 161280ab5e31SHong Zhang PetscScalar *w = ark->work; 161380ab5e31SHong Zhang Vec *Y = ark->Y, Ydot = ark->Ydot, *VecsDeltaLam = ark->VecsDeltaLam, *VecsSensiTemp = ark->VecsSensiTemp, *VecsSensiPTemp = ark->VecsSensiPTemp; 161480ab5e31SHong Zhang Mat Jex, Jim, Jimpre; 161580ab5e31SHong Zhang PetscInt i, j, nadj; 161680ab5e31SHong Zhang PetscReal t = ts->ptime, stage_time_ex; 161780ab5e31SHong Zhang PetscReal adjoint_time_step = -ts->time_step; /* always positive since ts->time_step is negative */ 161880ab5e31SHong Zhang KSP ksp; 161980ab5e31SHong Zhang 162080ab5e31SHong Zhang PetscFunctionBegin; 162180ab5e31SHong Zhang ark->status = TS_STEP_INCOMPLETE; 162280ab5e31SHong Zhang PetscCall(SNESGetKSP(ts->snes, &ksp)); 162380ab5e31SHong Zhang PetscCall(TSGetRHSMats_Private(ts, &Jex, NULL)); 162480ab5e31SHong Zhang PetscCall(TSGetIJacobian(ts, &Jim, &Jimpre, NULL, NULL)); 162580ab5e31SHong Zhang 162680ab5e31SHong Zhang for (i = s - 1; i >= 0; i--) { 162780ab5e31SHong Zhang ark->stage_time = t - adjoint_time_step * (1.0 - ct[i]); 162880ab5e31SHong Zhang stage_time_ex = t - adjoint_time_step * (1.0 - c[i]); 162980ab5e31SHong Zhang if (At[i * s + i] == 0) { // This stage is explicit 163080ab5e31SHong Zhang ark->scoeff = 0.; 163180ab5e31SHong Zhang } else { 163280ab5e31SHong Zhang ark->scoeff = -1. / At[i * s + i]; // this makes shift=ark->scoeff/ts->time_step positive since ts->time_step is negative 163380ab5e31SHong Zhang } 163480ab5e31SHong Zhang PetscCall(TSComputeSNESJacobian(ts, Y[i], Jim, Jimpre)); 163580ab5e31SHong Zhang PetscCall(TSComputeRHSJacobian(ts, stage_time_ex, Y[i], Jex, Jex)); 163680ab5e31SHong Zhang if (ts->vecs_sensip) { 163780ab5e31SHong 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 163880ab5e31SHong Zhang PetscCall(TSComputeRHSJacobianP(ts, stage_time_ex, Y[i], ts->Jacprhs)); // get dGdP 163980ab5e31SHong Zhang } 164080ab5e31SHong Zhang /* Build RHS (stored in VecsDeltaLam) for first-order adjoint */ 16415d7a6ebeSHong Zhang for (nadj = 0; nadj < ts->numcost; nadj++) { 16425d7a6ebeSHong Zhang /* build implicit part */ 16435d7a6ebeSHong Zhang PetscCall(VecSet(VecsSensiTemp[nadj], 0)); 164480ab5e31SHong Zhang if (s - i - 1 > 0) { 164580ab5e31SHong Zhang /* Temp = -\sum_{j=i+1}^s at[j][i] lambda_s[j] */ 164680ab5e31SHong Zhang for (j = i + 1; j < s; j++) w[j - i - 1] = -At[j * s + i]; 164780ab5e31SHong Zhang PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1])); 16485d7a6ebeSHong Zhang } 16495d7a6ebeSHong Zhang /* Temp = Temp - bt[i] lambda_{n+1} */ 16505d7a6ebeSHong Zhang PetscCall(VecAXPY(VecsSensiTemp[nadj], -bt[i], ts->vecs_sensi[nadj])); 16515d7a6ebeSHong Zhang if (bt[i] || s - i - 1 > 0) { 165280ab5e31SHong Zhang /* (shift I - dHdU) Temp */ 165380ab5e31SHong Zhang PetscCall(MatMultTranspose(Jim, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i])); 165480ab5e31SHong Zhang /* cancel out shift Temp where shift=-scoeff/h */ 165580ab5e31SHong Zhang PetscCall(VecAXPY(VecsDeltaLam[nadj * s + i], ark->scoeff / adjoint_time_step, VecsSensiTemp[nadj])); 165680ab5e31SHong Zhang if (ts->vecs_sensip) { 165780ab5e31SHong Zhang /* - dHdP Temp */ 165880ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacp, VecsSensiTemp[nadj], VecsSensiPTemp[nadj])); 16595d7a6ebeSHong Zhang /* mu_n += -h dHdP Temp */ 16605d7a6ebeSHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj])); 166180ab5e31SHong Zhang } 16625d7a6ebeSHong Zhang } else { 16635d7a6ebeSHong Zhang PetscCall(VecSet(VecsDeltaLam[nadj * s + i], 0)); // make sure it is initialized 16645d7a6ebeSHong Zhang } 16655d7a6ebeSHong Zhang /* build explicit part */ 16665d7a6ebeSHong Zhang PetscCall(VecSet(VecsSensiTemp[nadj], 0)); 16675d7a6ebeSHong Zhang if (s - i - 1 > 0) { 166880ab5e31SHong Zhang /* Temp = \sum_{j=i+1}^s a[j][i] lambda_s[j] */ 166980ab5e31SHong Zhang for (j = i + 1; j < s; j++) w[j - i - 1] = A[j * s + i]; 167080ab5e31SHong Zhang PetscCall(VecMAXPY(VecsSensiTemp[nadj], s - i - 1, w, &VecsDeltaLam[nadj * s + i + 1])); 16715d7a6ebeSHong Zhang } 16725d7a6ebeSHong Zhang /* Temp = Temp + b[i] lambda_{n+1} */ 16735d7a6ebeSHong Zhang PetscCall(VecAXPY(VecsSensiTemp[nadj], b[i], ts->vecs_sensi[nadj])); 16745d7a6ebeSHong Zhang if (b[i] || s - i - 1 > 0) { 167580ab5e31SHong Zhang /* dGdU Temp */ 167680ab5e31SHong Zhang PetscCall(MatMultTransposeAdd(Jex, VecsSensiTemp[nadj], VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i])); 167780ab5e31SHong Zhang if (ts->vecs_sensip) { 167880ab5e31SHong Zhang /* dGdP Temp */ 167980ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacprhs, VecsSensiTemp[nadj], VecsSensiPTemp[nadj])); 168080ab5e31SHong Zhang /* mu_n += h dGdP Temp */ 168180ab5e31SHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], adjoint_time_step, VecsSensiPTemp[nadj])); 168280ab5e31SHong Zhang } 168380ab5e31SHong Zhang } 168480ab5e31SHong Zhang /* Build LHS for first-order adjoint */ 168580ab5e31SHong Zhang if (At[i * s + i] == 0) { // This stage is explicit 168680ab5e31SHong Zhang PetscCall(VecScale(VecsDeltaLam[nadj * s + i], adjoint_time_step)); 168780ab5e31SHong Zhang } else { 168880ab5e31SHong Zhang KSP ksp; 168980ab5e31SHong Zhang KSPConvergedReason kspreason; 169080ab5e31SHong Zhang PetscCall(SNESGetKSP(ts->snes, &ksp)); 169180ab5e31SHong Zhang PetscCall(KSPSetOperators(ksp, Jim, Jimpre)); 169280ab5e31SHong Zhang PetscCall(VecScale(VecsDeltaLam[nadj * s + i], 1. / At[i * s + i])); 169380ab5e31SHong Zhang PetscCall(KSPSolveTranspose(ksp, VecsDeltaLam[nadj * s + i], VecsDeltaLam[nadj * s + i])); 169480ab5e31SHong Zhang PetscCall(KSPGetConvergedReason(ksp, &kspreason)); 169580ab5e31SHong Zhang if (kspreason < 0) { 169680ab5e31SHong Zhang ts->reason = TSADJOINT_DIVERGED_LINEAR_SOLVE; 169780ab5e31SHong 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)); 169880ab5e31SHong Zhang } 169980ab5e31SHong Zhang if (ts->vecs_sensip) { 170080ab5e31SHong Zhang /* -dHdP lambda_s[i] */ 170180ab5e31SHong Zhang PetscCall(MatMultTranspose(ts->Jacp, VecsDeltaLam[nadj * s + i], VecsSensiPTemp[nadj])); 170280ab5e31SHong Zhang /* mu_n += h at[i][i] dHdP lambda_s[i] */ 170380ab5e31SHong Zhang PetscCall(VecAXPY(ts->vecs_sensip[nadj], -At[i * s + i] * adjoint_time_step, VecsSensiPTemp[nadj])); 170480ab5e31SHong Zhang } 170580ab5e31SHong Zhang } 170680ab5e31SHong Zhang } 170780ab5e31SHong Zhang } 170880ab5e31SHong Zhang for (j = 0; j < s; j++) w[j] = 1.0; 170980ab5e31SHong Zhang for (nadj = 0; nadj < ts->numcost; nadj++) // no need to do this for mu's 171080ab5e31SHong Zhang PetscCall(VecMAXPY(ts->vecs_sensi[nadj], s, w, &VecsDeltaLam[nadj * s])); 171180ab5e31SHong Zhang ark->status = TS_STEP_COMPLETE; 171280ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 171380ab5e31SHong Zhang } 17148a381b04SJed Brown 1715d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSInterpolate_ARKIMEX(TS ts, PetscReal itime, Vec X) 1716d71ae5a4SJacob Faibussowitsch { 1717cd652676SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1718d27334e2SStefano Zampini ARKTableau tab = ark->tableau; 1719d27334e2SStefano Zampini PetscInt s = tab->s, pinterp = tab->pinterp, i, j; 1720108c343cSJed Brown PetscReal h; 1721108c343cSJed Brown PetscReal tt, t; 1722d27334e2SStefano Zampini PetscScalar *bt = ark->work, *b = ark->work + s; 1723d27334e2SStefano Zampini const PetscReal *Bt = tab->binterpt, *B = tab->binterp; 1724cd652676SJed Brown 1725cd652676SJed Brown PetscFunctionBegin; 1726d27334e2SStefano 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); 1727108c343cSJed Brown switch (ark->status) { 1728108c343cSJed Brown case TS_STEP_INCOMPLETE: 1729108c343cSJed Brown case TS_STEP_PENDING: 1730108c343cSJed Brown h = ts->time_step; 1731108c343cSJed Brown t = (itime - ts->ptime) / h; 1732108c343cSJed Brown break; 1733108c343cSJed Brown case TS_STEP_COMPLETE: 1734be5899b3SLisandro Dalcin h = ts->ptime - ts->ptime_prev; 1735108c343cSJed Brown t = (itime - ts->ptime) / h + 1; /* In the interval [0,1] */ 1736108c343cSJed Brown break; 1737d71ae5a4SJacob Faibussowitsch default: 1738d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_PLIB, "Invalid TSStepStatus"); 1739108c343cSJed Brown } 1740cd652676SJed Brown for (i = 0; i < s; i++) bt[i] = b[i] = 0; 17414f385281SJed Brown for (j = 0, tt = t; j < pinterp; j++, tt *= t) { 1742cd652676SJed Brown for (i = 0; i < s; i++) { 1743c1758d98SDebojyoti Ghosh bt[i] += h * Bt[i * pinterp + j] * tt; 1744108c343cSJed Brown b[i] += h * B[i * pinterp + j] * tt; 1745cd652676SJed Brown } 1746cd652676SJed Brown } 17479566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y[0], X)); 17489566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, bt, ark->YdotI)); 1749d27334e2SStefano Zampini if (tab->additive) { 1750d27334e2SStefano Zampini PetscBool hasE; 1751d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1752d27334e2SStefano Zampini if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS)); 1753d27334e2SStefano Zampini } 17543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1755cd652676SJed Brown } 1756cd652676SJed Brown 1757d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSExtrapolate_ARKIMEX(TS ts, PetscReal c, Vec X) 1758d71ae5a4SJacob Faibussowitsch { 175956dcabbaSDebojyoti Ghosh TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1760d27334e2SStefano Zampini ARKTableau tab = ark->tableau; 1761d27334e2SStefano Zampini PetscInt s = tab->s, pinterp = tab->pinterp, i, j; 1762be5899b3SLisandro Dalcin PetscReal h, h_prev, t, tt; 1763d27334e2SStefano Zampini PetscScalar *bt = ark->work, *b = ark->work + s; 1764d27334e2SStefano Zampini const PetscReal *Bt = tab->binterpt, *B = tab->binterp; 176556dcabbaSDebojyoti Ghosh 176656dcabbaSDebojyoti Ghosh PetscFunctionBegin; 17673c633725SBarry Smith PetscCheck(Bt && B, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "TSARKIMEX %s does not have an interpolation formula", ark->tableau->name); 176881d12688SDebojyoti Ghosh h = ts->time_step; 1769be5899b3SLisandro Dalcin h_prev = ts->ptime - ts->ptime_prev; 1770be5899b3SLisandro Dalcin t = 1 + h / h_prev * c; 1771d27334e2SStefano Zampini for (i = 0; i < s; i++) bt[i] = b[i] = 0; 177256dcabbaSDebojyoti Ghosh for (j = 0, tt = t; j < pinterp; j++, tt *= t) { 177356dcabbaSDebojyoti Ghosh for (i = 0; i < s; i++) { 177481d12688SDebojyoti Ghosh bt[i] += h * Bt[i * pinterp + j] * tt; 177556dcabbaSDebojyoti Ghosh b[i] += h * B[i * pinterp + j] * tt; 177656dcabbaSDebojyoti Ghosh } 177756dcabbaSDebojyoti Ghosh } 17783c633725SBarry Smith PetscCheck(ark->Y_prev, PetscObjectComm((PetscObject)ts), PETSC_ERR_SUP, "Stages from previous step have not been stored"); 17799566063dSJacob Faibussowitsch PetscCall(VecCopy(ark->Y_prev[0], X)); 17809566063dSJacob Faibussowitsch PetscCall(VecMAXPY(X, s, bt, ark->YdotI_prev)); 1781d27334e2SStefano Zampini if (tab->additive) { 1782d27334e2SStefano Zampini PetscBool hasE; 1783d27334e2SStefano Zampini PetscCall(TSHasRHSFunction(ts, &hasE)); 1784d27334e2SStefano Zampini if (hasE) PetscCall(VecMAXPY(X, s, b, ark->YdotRHS_prev)); 1785d27334e2SStefano Zampini } 17863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 178756dcabbaSDebojyoti Ghosh } 178856dcabbaSDebojyoti Ghosh 1789d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauReset(TS ts) 1790d71ae5a4SJacob Faibussowitsch { 179196400bd6SLisandro Dalcin TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 179296400bd6SLisandro Dalcin ARKTableau tab = ark->tableau; 179396400bd6SLisandro Dalcin 179496400bd6SLisandro Dalcin PetscFunctionBegin; 17953ba16761SJacob Faibussowitsch if (!tab) PetscFunctionReturn(PETSC_SUCCESS); 17969566063dSJacob Faibussowitsch PetscCall(PetscFree(ark->work)); 17979566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->Y)); 17989566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotI)); 17999566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS)); 18009566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->Y_prev)); 18019566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotI_prev)); 18029566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs(tab->s, &ark->YdotRHS_prev)); 18033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 180496400bd6SLisandro Dalcin } 180596400bd6SLisandro Dalcin 1806d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSReset_ARKIMEX(TS ts) 1807d71ae5a4SJacob Faibussowitsch { 18088a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 18098a381b04SJed Brown 18108a381b04SJed Brown PetscFunctionBegin; 18119566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTableauReset(ts)); 18129566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Ydot)); 18139566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Ydot0)); 18149566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ark->Z)); 18150467964bSStefano Zampini PetscCall(ISDestroy(&ark->alg_is)); 18163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 18178a381b04SJed Brown } 18188a381b04SJed Brown 181980ab5e31SHong Zhang static PetscErrorCode TSAdjointReset_ARKIMEX(TS ts) 182080ab5e31SHong Zhang { 182180ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 182280ab5e31SHong Zhang ARKTableau tab = ark->tableau; 182380ab5e31SHong Zhang 182480ab5e31SHong Zhang PetscFunctionBegin; 182580ab5e31SHong Zhang PetscCall(VecDestroyVecs(tab->s * ts->numcost, &ark->VecsDeltaLam)); 182680ab5e31SHong Zhang PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiTemp)); 182780ab5e31SHong Zhang PetscCall(VecDestroyVecs(ts->numcost, &ark->VecsSensiPTemp)); 182880ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 182980ab5e31SHong Zhang } 183080ab5e31SHong Zhang 1831d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetVecs(TS ts, DM dm, Vec *Z, Vec *Ydot) 1832d71ae5a4SJacob Faibussowitsch { 1833d5e6173cSPeter Brune TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data; 1834d5e6173cSPeter Brune 1835d5e6173cSPeter Brune PetscFunctionBegin; 1836d5e6173cSPeter Brune if (Z) { 1837d5e6173cSPeter Brune if (dm && dm != ts->dm) { 18389566063dSJacob Faibussowitsch PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Z", Z)); 1839d5e6173cSPeter Brune } else *Z = ax->Z; 1840d5e6173cSPeter Brune } 1841d5e6173cSPeter Brune if (Ydot) { 1842d5e6173cSPeter Brune if (dm && dm != ts->dm) { 18439566063dSJacob Faibussowitsch PetscCall(DMGetNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot)); 1844d5e6173cSPeter Brune } else *Ydot = ax->Ydot; 1845d5e6173cSPeter Brune } 18463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1847d5e6173cSPeter Brune } 1848d5e6173cSPeter Brune 1849d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXRestoreVecs(TS ts, DM dm, Vec *Z, Vec *Ydot) 1850d71ae5a4SJacob Faibussowitsch { 1851d5e6173cSPeter Brune PetscFunctionBegin; 1852d5e6173cSPeter Brune if (Z) { 185348a46eb9SPierre Jolivet if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Z", Z)); 1854d5e6173cSPeter Brune } 1855d5e6173cSPeter Brune if (Ydot) { 185648a46eb9SPierre Jolivet if (dm && dm != ts->dm) PetscCall(DMRestoreNamedGlobalVector(dm, "TSARKIMEX_Ydot", Ydot)); 1857d5e6173cSPeter Brune } 18583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1859d5e6173cSPeter Brune } 1860d5e6173cSPeter Brune 18610467964bSStefano Zampini /* 18620467964bSStefano Zampini DAEs need special handling for algebraic variables when restarting DIRK methods with explicit 18630467964bSStefano Zampini first stage. In particular, we need: 18640467964bSStefano Zampini - to zero the nonlinear function (in case the dual variables are not consistent in the first step) 18650467964bSStefano Zampini - to modify the preconditioning matrix by calling MatZeroRows with identity on these variables. 18660467964bSStefano Zampini */ 18670467964bSStefano Zampini static PetscErrorCode TSARKIMEXComputeAlgebraicIS(TS ts, PetscReal time, Vec X, IS *alg_is) 18680467964bSStefano Zampini { 18690467964bSStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 18700467964bSStefano Zampini DM dm; 18710467964bSStefano Zampini Vec F, W, Xdot; 18720467964bSStefano Zampini const PetscScalar *w; 18730467964bSStefano Zampini PetscInt nz = 0, n, st; 18740467964bSStefano Zampini PetscInt *nzr; 18750467964bSStefano Zampini 18760467964bSStefano Zampini PetscFunctionBegin; 18770467964bSStefano Zampini PetscCall(TSGetDM(ts, &dm)); /* may be already from SNES */ 18780467964bSStefano Zampini PetscCall(DMGetGlobalVector(dm, &Xdot)); 18790467964bSStefano Zampini PetscCall(DMGetGlobalVector(dm, &F)); 18800467964bSStefano Zampini PetscCall(DMGetGlobalVector(dm, &W)); 18810467964bSStefano Zampini PetscCall(VecSet(Xdot, 0.0)); 18820467964bSStefano Zampini PetscCall(TSComputeIFunction(ts, time, X, Xdot, F, ark->imex)); 18830467964bSStefano Zampini PetscCall(VecSetRandom(Xdot, NULL)); 18840467964bSStefano Zampini PetscCall(TSComputeIFunction(ts, time, X, Xdot, W, ark->imex)); 18850467964bSStefano Zampini PetscCall(VecAXPY(W, -1.0, F)); 18860467964bSStefano Zampini PetscCall(VecGetOwnershipRange(W, &st, NULL)); 18870467964bSStefano Zampini PetscCall(VecGetLocalSize(W, &n)); 18880467964bSStefano Zampini PetscCall(VecGetArrayRead(W, &w)); 18890467964bSStefano Zampini for (PetscInt i = 0; i < n; i++) 18900467964bSStefano Zampini if (w[i] == 0.0) nz++; 18910467964bSStefano Zampini PetscCall(PetscMalloc1(nz, &nzr)); 18920467964bSStefano Zampini nz = 0; 18930467964bSStefano Zampini for (PetscInt i = 0; i < n; i++) 18940467964bSStefano Zampini if (w[i] == 0.0) nzr[nz++] = i + st; 18950467964bSStefano Zampini PetscCall(VecRestoreArrayRead(W, &w)); 18960467964bSStefano Zampini PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), nz, nzr, PETSC_OWN_POINTER, alg_is)); 18970467964bSStefano Zampini PetscCall(DMRestoreGlobalVector(dm, &Xdot)); 18980467964bSStefano Zampini PetscCall(DMRestoreGlobalVector(dm, &F)); 18990467964bSStefano Zampini PetscCall(DMRestoreGlobalVector(dm, &W)); 19000467964bSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 19010467964bSStefano Zampini } 19020467964bSStefano Zampini 19030467964bSStefano Zampini /* As for the method specific Z and Ydot, we store the algebraic IS in the ARKIMEX data structure 19040467964bSStefano Zampini at the finest level, in the DM for coarser solves. */ 19050467964bSStefano Zampini static PetscErrorCode TSARKIMEXGetAlgebraicIS(TS ts, DM dm, IS *alg_is) 19060467964bSStefano Zampini { 19070467964bSStefano Zampini TS_ARKIMEX *ax = (TS_ARKIMEX *)ts->data; 19080467964bSStefano Zampini 19090467964bSStefano Zampini PetscFunctionBegin; 19100467964bSStefano Zampini if (dm && dm != ts->dm) { 19110467964bSStefano Zampini PetscCall(PetscObjectQuery((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject *)alg_is)); 19120467964bSStefano Zampini } else *alg_is = ax->alg_is; 19130467964bSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 19140467964bSStefano Zampini } 19153b98415fSStefano Zampini 19163b98415fSStefano Zampini /* This defines the nonlinear equation that is to be solved with SNES */ 1917d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormFunction_ARKIMEX(SNES snes, Vec X, Vec F, TS ts) 1918d71ae5a4SJacob Faibussowitsch { 19198a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1920d5e6173cSPeter Brune DM dm, dmsave; 1921d5e6173cSPeter Brune Vec Z, Ydot; 19220467964bSStefano Zampini IS alg_is; 19238a381b04SJed Brown 19248a381b04SJed Brown PetscFunctionBegin; 19259566063dSJacob Faibussowitsch PetscCall(SNESGetDM(snes, &dm)); 19269566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot)); 19270467964bSStefano Zampini if (ark->scoeff == PETSC_MAX_REAL) PetscCall(TSARKIMEXGetAlgebraicIS(ts, dm, &alg_is)); 19280467964bSStefano Zampini 1929d5e6173cSPeter Brune dmsave = ts->dm; 1930d5e6173cSPeter Brune ts->dm = dm; 1931740132f1SEmil Constantinescu 193298940a98SHong Zhang if (ark->scoeff == PETSC_MAX_REAL) { 19333b98415fSStefano Zampini /* We are solving F(t_n,x_n,xdot) = 0 to start the method */ 19340467964bSStefano Zampini if (!alg_is) { 19350467964bSStefano Zampini PetscCheck(dmsave != ts->dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Missing algebraic IS"); 19360467964bSStefano Zampini PetscCall(TSARKIMEXComputeAlgebraicIS(ts, ark->stage_time, Z, &alg_is)); 19370467964bSStefano Zampini PetscCall(PetscObjectCompose((PetscObject)dm, "TSARKIMEX_ALG_IS", (PetscObject)alg_is)); 19380467964bSStefano Zampini PetscCall(PetscObjectDereference((PetscObject)alg_is)); 19390467964bSStefano Zampini PetscCall(ISViewFromOptions(alg_is, (PetscObject)snes, "-ts_arkimex_algebraic_is_view")); 19400467964bSStefano Zampini } 1941d27334e2SStefano Zampini PetscCall(TSComputeIFunction(ts, ark->stage_time, Z, X, F, ark->imex)); 19420467964bSStefano Zampini PetscCall(VecISSet(F, alg_is, 0.0)); 1943d27334e2SStefano Zampini } else { 194498940a98SHong Zhang PetscReal shift = ark->scoeff / ts->time_step; 1945d27334e2SStefano Zampini PetscCall(VecAXPBYPCZ(Ydot, -shift, shift, 0, Z, X)); /* Ydot = shift*(X-Z) */ 19469566063dSJacob Faibussowitsch PetscCall(TSComputeIFunction(ts, ark->stage_time, X, Ydot, F, ark->imex)); 1947d27334e2SStefano Zampini } 1948e817cc15SEmil Constantinescu 1949d5e6173cSPeter Brune ts->dm = dmsave; 19509566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot)); 19513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19528a381b04SJed Brown } 19538a381b04SJed Brown 1954d71ae5a4SJacob Faibussowitsch static PetscErrorCode SNESTSFormJacobian_ARKIMEX(SNES snes, Vec X, Mat A, Mat B, TS ts) 1955d71ae5a4SJacob Faibussowitsch { 19568a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 1957d5e6173cSPeter Brune DM dm, dmsave; 1958d27334e2SStefano Zampini Vec Ydot, Z; 195998940a98SHong Zhang PetscReal shift; 19600467964bSStefano Zampini IS alg_is; 19618a381b04SJed Brown 19628a381b04SJed Brown PetscFunctionBegin; 19639566063dSJacob Faibussowitsch PetscCall(SNESGetDM(snes, &dm)); 19648a381b04SJed Brown /* ark->Ydot has already been computed in SNESTSFormFunction_ARKIMEX (SNES guarantees this) */ 19650467964bSStefano Zampini PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, &Ydot)); 19660467964bSStefano Zampini /* alg_is has been computed in SNESTSFormFunction_ARKIMEX */ 19670467964bSStefano Zampini if (ark->scoeff == PETSC_MAX_REAL) PetscCall(TSARKIMEXGetAlgebraicIS(ts, dm, &alg_is)); 19680467964bSStefano Zampini 1969d5e6173cSPeter Brune dmsave = ts->dm; 1970d5e6173cSPeter Brune ts->dm = dm; 1971740132f1SEmil Constantinescu 197298940a98SHong Zhang if (ark->scoeff == PETSC_MAX_REAL) { 19733b98415fSStefano Zampini PetscBool hasZeroRows; 19743b98415fSStefano Zampini 19753b98415fSStefano Zampini /* We are solving F(t_n,x_n,xdot) = 0 to start the method 19760467964bSStefano Zampini We compute with a very large shift and then scale back the matrix */ 1977d27334e2SStefano Zampini shift = 1.0 / PETSC_MACHINE_EPSILON; 1978d27334e2SStefano Zampini PetscCall(TSComputeIJacobian(ts, ark->stage_time, Z, X, shift, A, B, ark->imex)); 1979d27334e2SStefano Zampini PetscCall(MatScale(B, PETSC_MACHINE_EPSILON)); 19803b98415fSStefano Zampini PetscCall(MatHasOperation(B, MATOP_ZERO_ROWS, &hasZeroRows)); 19813b98415fSStefano Zampini if (hasZeroRows) { 19820467964bSStefano Zampini PetscCheck(alg_is, PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Missing algebraic IS"); 19833b98415fSStefano Zampini /* the default of AIJ is to not keep the pattern! We should probably change it someday */ 19843b98415fSStefano Zampini PetscCall(MatSetOption(B, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE)); 19853b98415fSStefano Zampini PetscCall(MatZeroRowsIS(B, alg_is, 1.0, NULL, NULL)); 19863b98415fSStefano Zampini } 19873b98415fSStefano Zampini PetscCall(MatViewFromOptions(B, (PetscObject)snes, "-ts_arkimex_alg_mat_view")); 1988d27334e2SStefano Zampini if (A != B) PetscCall(MatScale(A, PETSC_MACHINE_EPSILON)); 1989d27334e2SStefano Zampini } else { 199098940a98SHong Zhang shift = ark->scoeff / ts->time_step; 19919566063dSJacob Faibussowitsch PetscCall(TSComputeIJacobian(ts, ark->stage_time, X, Ydot, shift, A, B, ark->imex)); 1992d27334e2SStefano Zampini } 1993d5e6173cSPeter Brune ts->dm = dmsave; 1994d27334e2SStefano Zampini PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, &Ydot)); 19953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1996d5e6173cSPeter Brune } 1997d5e6173cSPeter Brune 199880ab5e31SHong Zhang static PetscErrorCode TSGetStages_ARKIMEX(TS ts, PetscInt *ns, Vec *Y[]) 199980ab5e31SHong Zhang { 200080ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 200180ab5e31SHong Zhang 200280ab5e31SHong Zhang PetscFunctionBegin; 200380ab5e31SHong Zhang if (ns) *ns = ark->tableau->s; 200480ab5e31SHong Zhang if (Y) *Y = ark->Y; 200580ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 200680ab5e31SHong Zhang } 200780ab5e31SHong Zhang 2008d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_TSARKIMEX(DM fine, DM coarse, void *ctx) 2009d71ae5a4SJacob Faibussowitsch { 2010d5e6173cSPeter Brune PetscFunctionBegin; 20113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2012d5e6173cSPeter Brune } 2013d5e6173cSPeter Brune 2014d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_TSARKIMEX(DM fine, Mat restrct, Vec rscale, Mat inject, DM coarse, void *ctx) 2015d71ae5a4SJacob Faibussowitsch { 2016d5e6173cSPeter Brune TS ts = (TS)ctx; 2017d5e6173cSPeter Brune Vec Z, Z_c; 2018d5e6173cSPeter Brune 2019d5e6173cSPeter Brune PetscFunctionBegin; 20209566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, fine, &Z, NULL)); 20219566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, coarse, &Z_c, NULL)); 20229566063dSJacob Faibussowitsch PetscCall(MatRestrict(restrct, Z, Z_c)); 20239566063dSJacob Faibussowitsch PetscCall(VecPointwiseMult(Z_c, rscale, Z_c)); 20249566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, fine, &Z, NULL)); 20259566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, coarse, &Z_c, NULL)); 20263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20278a381b04SJed Brown } 20288a381b04SJed Brown 2029d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_TSARKIMEX(DM dm, DM subdm, void *ctx) 2030d71ae5a4SJacob Faibussowitsch { 2031cdb298fcSPeter Brune PetscFunctionBegin; 20323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2033cdb298fcSPeter Brune } 2034cdb298fcSPeter Brune 2035d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_TSARKIMEX(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx) 2036d71ae5a4SJacob Faibussowitsch { 2037cdb298fcSPeter Brune TS ts = (TS)ctx; 2038cdb298fcSPeter Brune Vec Z, Z_c; 2039cdb298fcSPeter Brune 2040cdb298fcSPeter Brune PetscFunctionBegin; 20419566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, dm, &Z, NULL)); 20429566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetVecs(ts, subdm, &Z_c, NULL)); 2043cdb298fcSPeter Brune 20449566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD)); 20459566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(gscat, Z, Z_c, INSERT_VALUES, SCATTER_FORWARD)); 2046cdb298fcSPeter Brune 20479566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, dm, &Z, NULL)); 20489566063dSJacob Faibussowitsch PetscCall(TSARKIMEXRestoreVecs(ts, subdm, &Z_c, NULL)); 20493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2050cdb298fcSPeter Brune } 2051cdb298fcSPeter Brune 2052d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXTableauSetUp(TS ts) 2053d71ae5a4SJacob Faibussowitsch { 205496400bd6SLisandro Dalcin TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 205596400bd6SLisandro Dalcin ARKTableau tab = ark->tableau; 205696400bd6SLisandro Dalcin 205796400bd6SLisandro Dalcin PetscFunctionBegin; 2058d27334e2SStefano Zampini PetscCall(PetscMalloc1(2 * tab->s, &ark->work)); 20599566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y)); 20609566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI)); 2061d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS)); 206296400bd6SLisandro Dalcin if (ark->extrapolate) { 20639566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->Y_prev)); 20649566063dSJacob Faibussowitsch PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotI_prev)); 2065d27334e2SStefano Zampini if (tab->additive) PetscCall(VecDuplicateVecs(ts->vec_sol, tab->s, &ark->YdotRHS_prev)); 206696400bd6SLisandro Dalcin } 20673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 206896400bd6SLisandro Dalcin } 206996400bd6SLisandro Dalcin 2070d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetUp_ARKIMEX(TS ts) 2071d71ae5a4SJacob Faibussowitsch { 20728a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2073d5e6173cSPeter Brune DM dm; 207496400bd6SLisandro Dalcin SNES snes; 2075f9c1d6abSBarry Smith 20768a381b04SJed Brown PetscFunctionBegin; 20779566063dSJacob Faibussowitsch PetscCall(TSARKIMEXTableauSetUp(ts)); 20789566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot)); 20799566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Ydot0)); 20809566063dSJacob Faibussowitsch PetscCall(VecDuplicate(ts->vec_sol, &ark->Z)); 20819566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts, &dm)); 20829566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts)); 20839566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts)); 20849566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 20853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20868a381b04SJed Brown } 20878a381b04SJed Brown 208880ab5e31SHong Zhang static PetscErrorCode TSAdjointSetUp_ARKIMEX(TS ts) 208980ab5e31SHong Zhang { 209080ab5e31SHong Zhang TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 209180ab5e31SHong Zhang ARKTableau tab = ark->tableau; 209280ab5e31SHong Zhang 209380ab5e31SHong Zhang PetscFunctionBegin; 209480ab5e31SHong Zhang PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], tab->s * ts->numcost, &ark->VecsDeltaLam)); 209580ab5e31SHong Zhang PetscCall(VecDuplicateVecs(ts->vecs_sensi[0], ts->numcost, &ark->VecsSensiTemp)); 209680ab5e31SHong Zhang if (ts->vecs_sensip) { PetscCall(VecDuplicateVecs(ts->vecs_sensip[0], ts->numcost, &ark->VecsSensiPTemp)); } 209780ab5e31SHong Zhang if (PetscDefined(USE_DEBUG)) { 209880ab5e31SHong Zhang PetscBool id = PETSC_FALSE; 209980ab5e31SHong Zhang PetscCall(TSARKIMEXTestMassIdentity(ts, &id)); 21008434afd1SBarry Smith PetscCheck(id, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_INCOMP, "Adjoint ARKIMEX requires an identity mass matrix, however the TSIFunctionFn you provided does not utilize an identity mass matrix"); 210180ab5e31SHong Zhang } 210280ab5e31SHong Zhang PetscFunctionReturn(PETSC_SUCCESS); 210380ab5e31SHong Zhang } 210480ab5e31SHong Zhang 2105d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSSetFromOptions_ARKIMEX(TS ts, PetscOptionItems *PetscOptionsObject) 2106d71ae5a4SJacob Faibussowitsch { 21074cc180ffSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2108d27334e2SStefano Zampini PetscBool dirk; 21098a381b04SJed Brown 21108a381b04SJed Brown PetscFunctionBegin; 2111d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 2112d27334e2SStefano Zampini PetscOptionsHeadBegin(PetscOptionsObject, dirk ? "DIRK ODE solver options" : "ARKIMEX ODE solver options"); 21138a381b04SJed Brown { 21148a381b04SJed Brown ARKTableauLink link; 21158a381b04SJed Brown PetscInt count, choice; 21168a381b04SJed Brown PetscBool flg; 21178a381b04SJed Brown const char **namelist; 2118d27334e2SStefano Zampini for (link = ARKTableauList, count = 0; link; link = link->next) { 2119d27334e2SStefano Zampini if (!dirk && link->tab.additive) count++; 2120d27334e2SStefano Zampini if (dirk && !link->tab.additive) count++; 2121d27334e2SStefano Zampini } 21229566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(count, (char ***)&namelist)); 2123d27334e2SStefano Zampini for (link = ARKTableauList, count = 0; link; link = link->next) { 2124d27334e2SStefano Zampini if (!dirk && link->tab.additive) namelist[count++] = link->tab.name; 2125d27334e2SStefano Zampini if (dirk && !link->tab.additive) namelist[count++] = link->tab.name; 2126d27334e2SStefano Zampini } 2127d27334e2SStefano Zampini if (dirk) { 2128d27334e2SStefano Zampini PetscCall(PetscOptionsEList("-ts_dirk_type", "Family of DIRK method", "TSDIRKSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg)); 2129d27334e2SStefano Zampini if (flg) PetscCall(TSDIRKSetType(ts, namelist[choice])); 2130d27334e2SStefano Zampini } else { 21319566063dSJacob Faibussowitsch PetscCall(PetscOptionsEList("-ts_arkimex_type", "Family of ARK IMEX method", "TSARKIMEXSetType", (const char *const *)namelist, count, ark->tableau->name, &choice, &flg)); 21329566063dSJacob Faibussowitsch if (flg) PetscCall(TSARKIMEXSetType(ts, namelist[choice])); 21334cc180ffSJed Brown flg = (PetscBool)!ark->imex; 21349566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_arkimex_fully_implicit", "Solve the problem fully implicitly", "TSARKIMEXSetFullyImplicit", flg, &flg, NULL)); 21354cc180ffSJed Brown ark->imex = (PetscBool)!flg; 2136d27334e2SStefano Zampini } 2137d27334e2SStefano Zampini PetscCall(PetscFree(namelist)); 21389566063dSJacob 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)); 21398a381b04SJed Brown } 2140d0609cedSBarry Smith PetscOptionsHeadEnd(); 21413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21428a381b04SJed Brown } 21438a381b04SJed Brown 2144d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSView_ARKIMEX(TS ts, PetscViewer viewer) 2145d71ae5a4SJacob Faibussowitsch { 21468a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2147d27334e2SStefano Zampini PetscBool iascii, dirk; 21488a381b04SJed Brown 21498a381b04SJed Brown PetscFunctionBegin; 2150d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 21519566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 21528a381b04SJed Brown if (iascii) { 2153d27334e2SStefano Zampini PetscViewerFormat format; 21549c334d8fSLisandro Dalcin ARKTableau tab = ark->tableau; 215519fd82e9SBarry Smith TSARKIMEXType arktype; 2156d27334e2SStefano Zampini char buf[2048]; 21573a28c0e5SStefano Zampini PetscBool flg; 21583a28c0e5SStefano Zampini 21599566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetType(ts, &arktype)); 21609566063dSJacob Faibussowitsch PetscCall(TSARKIMEXGetFullyImplicit(ts, &flg)); 2161d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %s %s\n", dirk ? "DIRK" : "ARK IMEX", arktype)); 21629566063dSJacob Faibussowitsch PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->ct)); 2163d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sabscissa ct = %s\n", dirk ? "" : "Stiff ", buf)); 2164d27334e2SStefano Zampini PetscCall(PetscViewerGetFormat(viewer, &format)); 2165d27334e2SStefano Zampini if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 2166d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sAt =\n", dirk ? "" : "Stiff ")); 2167d27334e2SStefano Zampini for (PetscInt i = 0; i < tab->s; i++) { 2168d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->At + i * tab->s)); 2169d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %s\n", buf)); 2170d27334e2SStefano Zampini } 2171d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bt)); 2172d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sbt = %s\n", dirk ? "" : "Stiff ", buf)); 2173d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->bembedt)); 2174d27334e2SStefano Zampini PetscCall(PetscViewerASCIIPrintf(viewer, " %sbet = %s\n", dirk ? "" : "Stiff ", buf)); 2175d27334e2SStefano Zampini } 21769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Fully implicit: %s\n", flg ? "yes" : "no")); 21779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Stiffly accurate: %s\n", tab->stiffly_accurate ? "yes" : "no")); 21789566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Explicit first stage: %s\n", tab->explicit_first_stage ? "yes" : "no")); 21799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "FSAL property: %s\n", tab->FSAL_implicit ? "yes" : "no")); 2180d27334e2SStefano Zampini if (!dirk) { 2181d27334e2SStefano Zampini PetscCall(PetscFormatRealArray(buf, sizeof(buf), "% 8.6f", tab->s, tab->c)); 21829566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Nonstiff abscissa c = %s\n", buf)); 21838a381b04SJed Brown } 2184d27334e2SStefano Zampini } 21853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 21868a381b04SJed Brown } 21878a381b04SJed Brown 2188d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSLoad_ARKIMEX(TS ts, PetscViewer viewer) 2189d71ae5a4SJacob Faibussowitsch { 2190f2c2a1b9SBarry Smith SNES snes; 21919c334d8fSLisandro Dalcin TSAdapt adapt; 2192f2c2a1b9SBarry Smith 2193f2c2a1b9SBarry Smith PetscFunctionBegin; 21949566063dSJacob Faibussowitsch PetscCall(TSGetAdapt(ts, &adapt)); 21959566063dSJacob Faibussowitsch PetscCall(TSAdaptLoad(adapt, viewer)); 21969566063dSJacob Faibussowitsch PetscCall(TSGetSNES(ts, &snes)); 21979566063dSJacob Faibussowitsch PetscCall(SNESLoad(snes, viewer)); 2198ad6bc421SBarry Smith /* function and Jacobian context for SNES when used with TS is always ts object */ 21999566063dSJacob Faibussowitsch PetscCall(SNESSetFunction(snes, NULL, NULL, ts)); 22009566063dSJacob Faibussowitsch PetscCall(SNESSetJacobian(snes, NULL, NULL, NULL, ts)); 22013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2202f2c2a1b9SBarry Smith } 2203f2c2a1b9SBarry Smith 2204cc4c1da9SBarry Smith /*@ 2205bcf0153eSBarry Smith TSARKIMEXSetType - Set the type of `TSARKIMEX` scheme 22068a381b04SJed Brown 220720f4b53cSBarry Smith Logically Collective 22088a381b04SJed Brown 2209d8d19677SJose E. Roman Input Parameters: 22108a381b04SJed Brown + ts - timestepping context 2211bcf0153eSBarry Smith - arktype - type of `TSARKIMEX` scheme 22128a381b04SJed Brown 2213bcf0153eSBarry Smith Options Database Key: 2214bcf0153eSBarry Smith . -ts_arkimex_type <1bee,a2,l2,ars122,2c,2d,2e,prssp2,3,bpr3,ars443,4,5> - set `TSARKIMEX` scheme type 22159bd3e852SBarry Smith 22168a381b04SJed Brown Level: intermediate 22178a381b04SJed Brown 22181cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEX`, `TSARKIMEXType`, `TSARKIMEX1BEE`, `TSARKIMEXA2`, `TSARKIMEXL2`, `TSARKIMEXARS122`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEXPRSSP2`, 2219db781477SPatrick Sanan `TSARKIMEX3`, `TSARKIMEXBPR3`, `TSARKIMEXARS443`, `TSARKIMEX4`, `TSARKIMEX5` 22208a381b04SJed Brown @*/ 2221d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetType(TS ts, TSARKIMEXType arktype) 2222d71ae5a4SJacob Faibussowitsch { 22238a381b04SJed Brown PetscFunctionBegin; 22248a381b04SJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22254f572ea9SToby Isaac PetscAssertPointer(arktype, 2); 2226cac4c232SBarry Smith PetscTryMethod(ts, "TSARKIMEXSetType_C", (TS, TSARKIMEXType), (ts, arktype)); 22273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22288a381b04SJed Brown } 22298a381b04SJed Brown 2230cc4c1da9SBarry Smith /*@ 2231bcf0153eSBarry Smith TSARKIMEXGetType - Get the type of `TSARKIMEX` scheme 22328a381b04SJed Brown 223320f4b53cSBarry Smith Logically Collective 22348a381b04SJed Brown 22358a381b04SJed Brown Input Parameter: 22368a381b04SJed Brown . ts - timestepping context 22378a381b04SJed Brown 22388a381b04SJed Brown Output Parameter: 2239bcf0153eSBarry Smith . arktype - type of `TSARKIMEX` scheme 22408a381b04SJed Brown 22418a381b04SJed Brown Level: intermediate 22428a381b04SJed Brown 224342747ad1SJacob Faibussowitsch .seealso: [](ch_ts), `TSARKIMEXc` 22448a381b04SJed Brown @*/ 2245d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetType(TS ts, TSARKIMEXType *arktype) 2246d71ae5a4SJacob Faibussowitsch { 22478a381b04SJed Brown PetscFunctionBegin; 22488a381b04SJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2249cac4c232SBarry Smith PetscUseMethod(ts, "TSARKIMEXGetType_C", (TS, TSARKIMEXType *), (ts, arktype)); 22503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22518a381b04SJed Brown } 22528a381b04SJed Brown 225316353aafSBarry Smith /*@ 2254bcf0153eSBarry Smith TSARKIMEXSetFullyImplicit - Solve both parts of the equation implicitly, including the part that is normally solved explicitly 22554cc180ffSJed Brown 225620f4b53cSBarry Smith Logically Collective 22574cc180ffSJed Brown 2258d8d19677SJose E. Roman Input Parameters: 22594cc180ffSJed Brown + ts - timestepping context 2260bcf0153eSBarry Smith - flg - `PETSC_TRUE` for fully implicit 22614cc180ffSJed Brown 22624cc180ffSJed Brown Level: intermediate 22634cc180ffSJed Brown 22641cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEX`, `TSARKIMEXGetType()`, `TSARKIMEXGetFullyImplicit()` 22654cc180ffSJed Brown @*/ 2266d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXSetFullyImplicit(TS ts, PetscBool flg) 2267d71ae5a4SJacob Faibussowitsch { 22684cc180ffSJed Brown PetscFunctionBegin; 22694cc180ffSJed Brown PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22703a28c0e5SStefano Zampini PetscValidLogicalCollectiveBool(ts, flg, 2); 2271cac4c232SBarry Smith PetscTryMethod(ts, "TSARKIMEXSetFullyImplicit_C", (TS, PetscBool), (ts, flg)); 22723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22734cc180ffSJed Brown } 22744cc180ffSJed Brown 22753a28c0e5SStefano Zampini /*@ 22763a28c0e5SStefano Zampini TSARKIMEXGetFullyImplicit - Inquires if both parts of the equation are solved implicitly 22773a28c0e5SStefano Zampini 227820f4b53cSBarry Smith Logically Collective 22793a28c0e5SStefano Zampini 22803a28c0e5SStefano Zampini Input Parameter: 22813a28c0e5SStefano Zampini . ts - timestepping context 22823a28c0e5SStefano Zampini 22837a7aea1fSJed Brown Output Parameter: 2284bcf0153eSBarry Smith . flg - `PETSC_TRUE` for fully implicit 22853a28c0e5SStefano Zampini 22863a28c0e5SStefano Zampini Level: intermediate 22873a28c0e5SStefano Zampini 22881cc06b55SBarry Smith .seealso: [](ch_ts), `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()` 22893a28c0e5SStefano Zampini @*/ 2290d71ae5a4SJacob Faibussowitsch PetscErrorCode TSARKIMEXGetFullyImplicit(TS ts, PetscBool *flg) 2291d71ae5a4SJacob Faibussowitsch { 22923a28c0e5SStefano Zampini PetscFunctionBegin; 22933a28c0e5SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 22944f572ea9SToby Isaac PetscAssertPointer(flg, 2); 2295cac4c232SBarry Smith PetscUseMethod(ts, "TSARKIMEXGetFullyImplicit_C", (TS, PetscBool *), (ts, flg)); 22963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22973a28c0e5SStefano Zampini } 22983a28c0e5SStefano Zampini 2299d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetType_ARKIMEX(TS ts, TSARKIMEXType *arktype) 2300d71ae5a4SJacob Faibussowitsch { 23018a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23028a381b04SJed Brown 23038a381b04SJed Brown PetscFunctionBegin; 23048a381b04SJed Brown *arktype = ark->tableau->name; 23053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23068a381b04SJed Brown } 2307d27334e2SStefano Zampini 2308d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetType_ARKIMEX(TS ts, TSARKIMEXType arktype) 2309d71ae5a4SJacob Faibussowitsch { 23108a381b04SJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23118a381b04SJed Brown PetscBool match; 23128a381b04SJed Brown ARKTableauLink link; 23138a381b04SJed Brown 23148a381b04SJed Brown PetscFunctionBegin; 23158a381b04SJed Brown if (ark->tableau) { 23169566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(ark->tableau->name, arktype, &match)); 23173ba16761SJacob Faibussowitsch if (match) PetscFunctionReturn(PETSC_SUCCESS); 23188a381b04SJed Brown } 23198a381b04SJed Brown for (link = ARKTableauList; link; link = link->next) { 23209566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(link->tab.name, arktype, &match)); 23218a381b04SJed Brown if (match) { 23229566063dSJacob Faibussowitsch if (ts->setupcalled) PetscCall(TSARKIMEXTableauReset(ts)); 23238a381b04SJed Brown ark->tableau = &link->tab; 23249566063dSJacob Faibussowitsch if (ts->setupcalled) PetscCall(TSARKIMEXTableauSetUp(ts)); 23252ffb9264SLisandro Dalcin ts->default_adapt_type = ark->tableau->bembed ? TSADAPTBASIC : TSADAPTNONE; 23263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23278a381b04SJed Brown } 23288a381b04SJed Brown } 232998921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_UNKNOWN_TYPE, "Could not find '%s'", arktype); 23308a381b04SJed Brown } 2331e0877f53SBarry Smith 2332d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXSetFullyImplicit_ARKIMEX(TS ts, PetscBool flg) 2333d71ae5a4SJacob Faibussowitsch { 23344cc180ffSJed Brown TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23354cc180ffSJed Brown 23364cc180ffSJed Brown PetscFunctionBegin; 23374cc180ffSJed Brown ark->imex = (PetscBool)!flg; 23383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23394cc180ffSJed Brown } 23408a381b04SJed Brown 2341d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSARKIMEXGetFullyImplicit_ARKIMEX(TS ts, PetscBool *flg) 2342d71ae5a4SJacob Faibussowitsch { 23433a28c0e5SStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 23443a28c0e5SStefano Zampini 23453a28c0e5SStefano Zampini PetscFunctionBegin; 23463a28c0e5SStefano Zampini *flg = (PetscBool)!ark->imex; 23473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23483a28c0e5SStefano Zampini } 23493a28c0e5SStefano Zampini 2350d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSDestroy_ARKIMEX(TS ts) 2351d71ae5a4SJacob Faibussowitsch { 2352b3a6b972SJed Brown PetscFunctionBegin; 23539566063dSJacob Faibussowitsch PetscCall(TSReset_ARKIMEX(ts)); 2354b3a6b972SJed Brown if (ts->dm) { 23559566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookRemove(ts->dm, DMCoarsenHook_TSARKIMEX, DMRestrictHook_TSARKIMEX, ts)); 23569566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookRemove(ts->dm, DMSubDomainHook_TSARKIMEX, DMSubDomainRestrictHook_TSARKIMEX, ts)); 2357b3a6b972SJed Brown } 23589566063dSJacob Faibussowitsch PetscCall(PetscFree(ts->data)); 2359d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", NULL)); 2360d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", NULL)); 23619566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", NULL)); 23629566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", NULL)); 23639566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", NULL)); 23642e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", NULL)); 23653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2366b3a6b972SJed Brown } 2367b3a6b972SJed Brown 23688a381b04SJed Brown /* ------------------------------------------------------------ */ 23698a381b04SJed Brown /*MC 2370c79dcfbdSBarry Smith TSARKIMEX - ODE and DAE solver using additive Runge-Kutta IMEX schemes 23718a381b04SJed Brown 2372fca742c7SJed Brown These methods are intended for problems with well-separated time scales, especially when a slow scale is strongly 2373fca742c7SJed Brown nonlinear such that it is expensive to solve with a fully implicit method. The user should provide the stiff part 2374bcf0153eSBarry Smith of the equation using `TSSetIFunction()` and the non-stiff part with `TSSetRHSFunction()`. 2375d0685a90SJed Brown 23768a381b04SJed Brown Level: beginner 23778a381b04SJed Brown 2378bcf0153eSBarry Smith Notes: 2379bcf0153eSBarry Smith The default is `TSARKIMEX3`, it can be changed with `TSARKIMEXSetType()` or -ts_arkimex_type 23808a381b04SJed Brown 2381bcf0153eSBarry Smith If the equation is implicit or a DAE, then `TSSetEquationType()` needs to be set accordingly. Refer to the manual for further information. 2382bcf0153eSBarry Smith 2383bcf0153eSBarry 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). 2384bcf0153eSBarry Smith 2385bcf0153eSBarry Smith Consider trying `TSROSW` if the stiff part is linear or weakly nonlinear. 2386bcf0153eSBarry Smith 23871cc06b55SBarry Smith .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSARKIMEXSetType()`, `TSARKIMEXGetType()`, `TSARKIMEXSetFullyImplicit()`, `TSARKIMEXGetFullyImplicit()`, 2388bcf0153eSBarry Smith `TSARKIMEX1BEE`, `TSARKIMEX2C`, `TSARKIMEX2D`, `TSARKIMEX2E`, `TSARKIMEX3`, `TSARKIMEXL2`, `TSARKIMEXA2`, `TSARKIMEXARS122`, 2389bcf0153eSBarry Smith `TSARKIMEX4`, `TSARKIMEX5`, `TSARKIMEXPRSSP2`, `TSARKIMEXARS443`, `TSARKIMEXBPR3`, `TSARKIMEXType`, `TSARKIMEXRegister()`, `TSType` 23908a381b04SJed Brown M*/ 2391d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode TSCreate_ARKIMEX(TS ts) 2392d71ae5a4SJacob Faibussowitsch { 239380ab5e31SHong Zhang TS_ARKIMEX *ark; 2394d27334e2SStefano Zampini PetscBool dirk; 23958a381b04SJed Brown 23968a381b04SJed Brown PetscFunctionBegin; 23979566063dSJacob Faibussowitsch PetscCall(TSARKIMEXInitializePackage()); 2398d27334e2SStefano Zampini PetscCall(PetscObjectTypeCompare((PetscObject)ts, TSDIRK, &dirk)); 23998a381b04SJed Brown 24008a381b04SJed Brown ts->ops->reset = TSReset_ARKIMEX; 240180ab5e31SHong Zhang ts->ops->adjointreset = TSAdjointReset_ARKIMEX; 24028a381b04SJed Brown ts->ops->destroy = TSDestroy_ARKIMEX; 24038a381b04SJed Brown ts->ops->view = TSView_ARKIMEX; 2404f2c2a1b9SBarry Smith ts->ops->load = TSLoad_ARKIMEX; 24058a381b04SJed Brown ts->ops->setup = TSSetUp_ARKIMEX; 240680ab5e31SHong Zhang ts->ops->adjointsetup = TSAdjointSetUp_ARKIMEX; 24078a381b04SJed Brown ts->ops->step = TSStep_ARKIMEX; 2408cd652676SJed Brown ts->ops->interpolate = TSInterpolate_ARKIMEX; 2409108c343cSJed Brown ts->ops->evaluatestep = TSEvaluateStep_ARKIMEX; 24108a381b04SJed Brown ts->ops->setfromoptions = TSSetFromOptions_ARKIMEX; 24118a381b04SJed Brown ts->ops->snesfunction = SNESTSFormFunction_ARKIMEX; 24128a381b04SJed Brown ts->ops->snesjacobian = SNESTSFormJacobian_ARKIMEX; 241380ab5e31SHong Zhang ts->ops->getstages = TSGetStages_ARKIMEX; 241480ab5e31SHong Zhang ts->ops->adjointstep = TSAdjointStep_ARKIMEX; 24158a381b04SJed Brown 2416efd4aadfSBarry Smith ts->usessnes = PETSC_TRUE; 2417efd4aadfSBarry Smith 241880ab5e31SHong Zhang PetscCall(PetscNew(&ark)); 241980ab5e31SHong Zhang ts->data = (void *)ark; 2420d27334e2SStefano Zampini ark->imex = dirk ? PETSC_FALSE : PETSC_TRUE; 242180ab5e31SHong Zhang 242280ab5e31SHong Zhang ark->VecsDeltaLam = NULL; 242380ab5e31SHong Zhang ark->VecsSensiTemp = NULL; 242480ab5e31SHong Zhang ark->VecsSensiPTemp = NULL; 24258a381b04SJed Brown 24269566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetType_C", TSARKIMEXGetType_ARKIMEX)); 2427d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXGetFullyImplicit_C", TSARKIMEXGetFullyImplicit_ARKIMEX)); 2428d27334e2SStefano Zampini if (!dirk) { 24299566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetType_C", TSARKIMEXSetType_ARKIMEX)); 24309566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSARKIMEXSetFullyImplicit_C", TSARKIMEXSetFullyImplicit_ARKIMEX)); 24319566063dSJacob Faibussowitsch PetscCall(TSARKIMEXSetType(ts, TSARKIMEXDefault)); 2432d27334e2SStefano Zampini } 2433d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2434d27334e2SStefano Zampini } 2435d27334e2SStefano Zampini 2436d27334e2SStefano Zampini /* ------------------------------------------------------------ */ 2437d27334e2SStefano Zampini 2438d27334e2SStefano Zampini static PetscErrorCode TSDIRKSetType_DIRK(TS ts, TSDIRKType dirktype) 2439d27334e2SStefano Zampini { 2440d27334e2SStefano Zampini TS_ARKIMEX *ark = (TS_ARKIMEX *)ts->data; 2441d27334e2SStefano Zampini 2442d27334e2SStefano Zampini PetscFunctionBegin; 2443d27334e2SStefano Zampini PetscCall(TSARKIMEXSetType_ARKIMEX(ts, dirktype)); 2444d27334e2SStefano Zampini PetscCheck(!ark->tableau->additive, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONG, "Method \"%s\" is not DIRK", dirktype); 2445d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2446d27334e2SStefano Zampini } 2447d27334e2SStefano Zampini 2448cc4c1da9SBarry Smith /*@ 2449d27334e2SStefano Zampini TSDIRKSetType - Set the type of `TSDIRK` scheme 2450d27334e2SStefano Zampini 2451d27334e2SStefano Zampini Logically Collective 2452d27334e2SStefano Zampini 2453d27334e2SStefano Zampini Input Parameters: 2454d27334e2SStefano Zampini + ts - timestepping context 2455d27334e2SStefano Zampini - dirktype - type of `TSDIRK` scheme 2456d27334e2SStefano Zampini 2457d27334e2SStefano Zampini Options Database Key: 2458d27334e2SStefano Zampini . -ts_dirkimex_type - set `TSDIRK` scheme type 2459d27334e2SStefano Zampini 2460d27334e2SStefano Zampini Level: intermediate 2461d27334e2SStefano Zampini 2462d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKGetType()`, `TSDIRK`, `TSDIRKType` 2463d27334e2SStefano Zampini @*/ 2464d27334e2SStefano Zampini PetscErrorCode TSDIRKSetType(TS ts, TSDIRKType dirktype) 2465d27334e2SStefano Zampini { 2466d27334e2SStefano Zampini PetscFunctionBegin; 2467d27334e2SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2468d27334e2SStefano Zampini PetscAssertPointer(dirktype, 2); 2469d27334e2SStefano Zampini PetscTryMethod(ts, "TSDIRKSetType_C", (TS, TSDIRKType), (ts, dirktype)); 2470d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2471d27334e2SStefano Zampini } 2472d27334e2SStefano Zampini 2473cc4c1da9SBarry Smith /*@ 2474d27334e2SStefano Zampini TSDIRKGetType - Get the type of `TSDIRK` scheme 2475d27334e2SStefano Zampini 2476d27334e2SStefano Zampini Logically Collective 2477d27334e2SStefano Zampini 2478d27334e2SStefano Zampini Input Parameter: 2479d27334e2SStefano Zampini . ts - timestepping context 2480d27334e2SStefano Zampini 2481d27334e2SStefano Zampini Output Parameter: 2482d27334e2SStefano Zampini . dirktype - type of `TSDIRK` scheme 2483d27334e2SStefano Zampini 2484d27334e2SStefano Zampini Level: intermediate 2485d27334e2SStefano Zampini 2486d27334e2SStefano Zampini .seealso: [](ch_ts), `TSDIRKSetType()` 2487d27334e2SStefano Zampini @*/ 2488d27334e2SStefano Zampini PetscErrorCode TSDIRKGetType(TS ts, TSDIRKType *dirktype) 2489d27334e2SStefano Zampini { 2490d27334e2SStefano Zampini PetscFunctionBegin; 2491d27334e2SStefano Zampini PetscValidHeaderSpecific(ts, TS_CLASSID, 1); 2492d27334e2SStefano Zampini PetscUseMethod(ts, "TSDIRKGetType_C", (TS, TSDIRKType *), (ts, dirktype)); 2493d27334e2SStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 2494d27334e2SStefano Zampini } 2495d27334e2SStefano Zampini 2496d27334e2SStefano Zampini /*MC 24973405e92cSStefano Zampini TSDIRK - ODE and DAE solver using Diagonally implicit Runge-Kutta schemes. 2498d27334e2SStefano Zampini 2499d27334e2SStefano Zampini Level: beginner 2500d27334e2SStefano Zampini 2501d27334e2SStefano Zampini Notes: 25023405e92cSStefano Zampini The default is `TSDIRKES213SAL`, it can be changed with `TSDIRKSetType()` or -ts_dirk_type. 25033405e92cSStefano Zampini The convention used in PETSc to name the DIRK methods is TSDIRK[E][S]PQS[SA][L][A] with: 25043405e92cSStefano Zampini + E - whether the method has an explicit first stage 25053405e92cSStefano Zampini . S - whether the method is single diagonal 25063405e92cSStefano Zampini . P - order of the advancing method 25073405e92cSStefano Zampini . Q - order of the embedded method 25083405e92cSStefano Zampini . S - number of stages 25093405e92cSStefano Zampini . SA - whether the method is stiffly accurate 25103405e92cSStefano Zampini . L - whether the method is L-stable 25113405e92cSStefano Zampini - A - whether the method is A-stable 2512d27334e2SStefano Zampini 2513d27334e2SStefano Zampini .seealso: [](ch_ts), `TSCreate()`, `TS`, `TSSetType()`, `TSDIRKSetType()`, `TSDIRKGetType()`, `TSDIRKRegister()`. 2514d27334e2SStefano Zampini M*/ 2515d27334e2SStefano Zampini PETSC_EXTERN PetscErrorCode TSCreate_DIRK(TS ts) 2516d27334e2SStefano Zampini { 2517d27334e2SStefano Zampini PetscFunctionBegin; 2518d27334e2SStefano Zampini PetscCall(TSCreate_ARKIMEX(ts)); 2519d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKGetType_C", TSARKIMEXGetType_ARKIMEX)); 2520d27334e2SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)ts, "TSDIRKSetType_C", TSDIRKSetType_DIRK)); 2521d27334e2SStefano Zampini PetscCall(TSDIRKSetType(ts, TSDIRKDefault)); 25223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 25238a381b04SJed Brown } 2524