Actual source code: arkimex.h

      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: };

     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;

     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;

     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;