xref: /petsc/src/ts/impls/arkimex/arkimex.h (revision f4104c902091261091d7f1bb5871ccd3a01482a0)
1 typedef struct _ARKTableau *ARKTableau;
2 struct _ARKTableau {
3   char      *name;
4   PetscBool  additive;             /* If False, it is a DIRK method */
5   PetscInt   order;                /* Classical approximation order of the method */
6   PetscInt   s;                    /* Number of stages */
7   PetscBool  stiffly_accurate;     /* The implicit part is stiffly accurate */
8   PetscBool  FSAL_implicit;        /* The implicit part is FSAL */
9   PetscBool  explicit_first_stage; /* The implicit part has an explicit first stage */
10   PetscInt   pinterp;              /* Interpolation order */
11   PetscReal *At, *bt, *ct;         /* Stiff tableau */
12   PetscReal *A, *b, *c;            /* Non-stiff tableau */
13   PetscReal *bembedt, *bembed;     /* Embedded formula of order one less (order-1) */
14   PetscReal *binterpt, *binterp;   /* Dense output formula */
15   PetscReal  ccfl;                 /* Placeholder for CFL coefficient relative to forward Euler */
16 };
17 typedef struct _ARKTableauLink *ARKTableauLink;
18 struct _ARKTableauLink {
19   struct _ARKTableau tab;
20   ARKTableauLink     next;
21 };
22 
23 typedef struct {
24   ARKTableau   tableau;
25   Vec         *Y;            /* States computed during the step */
26   Vec         *YdotI;        /* Time derivatives for the stiff part */
27   Vec         *YdotRHS;      /* Function evaluations for the non-stiff part */
28   Vec         *Y_prev;       /* States computed during the previous time step */
29   Vec         *YdotI_prev;   /* Time derivatives for the stiff part for the previous time step*/
30   Vec         *YdotRHS_prev; /* Function evaluations for the non-stiff part for the previous time step*/
31   Vec          Ydot0;        /* Holds the slope from the previous step in FSAL case */
32   Vec          Ydot;         /* Work vector holding Ydot during residual evaluation */
33   Vec          Z;            /* Ydot = shift(Y-Z) */
34   IS           alg_is;       /* Index set for algebraic variables, needed when restarting with DIRK */
35   PetscScalar *work;         /* Scalar work */
36   PetscReal    scoeff;       /* shift = scoeff/dt */
37   PetscReal    stage_time;
38   PetscBool    imex;
39   PetscBool    extrapolate; /* Extrapolate initial guess from previous time-step stage values */
40   TSStepStatus status;
41 
42   /* context for fast-slow split */
43   Vec       Y_snes;       /* Work vector for SNES */
44   Vec      *YdotI_fast;   /* Function evaluations for the fast components in YdotI */
45   Vec      *YdotRHS_fast; /* Function evaluations for the fast components in YdotRHS */
46   Vec      *YdotRHS_slow; /* Function evaluations for the slow components in YdotRHS */
47   IS        is_slow, is_fast;
48   TS        subts_slow, subts_fast;
49   PetscBool fastslowsplit;
50 
51   /* context for sensitivity analysis */
52   Vec *VecsDeltaLam;   /* Increment of the adjoint sensitivity w.r.t IC at stage */
53   Vec *VecsSensiTemp;  /* Vectors to be multiplied with Jacobian transpose */
54   Vec *VecsSensiPTemp; /* Temporary Vectors to store JacobianP-transpose-vector product */
55 } TS_ARKIMEX;
56