#pragma once
typedef struct _RKTableau *RKTableau;
struct _RKTableau {
  char      *name;
  PetscInt   order;     /* Classical approximation order of the method i              */
  PetscInt   s;         /* Number of stages                                           */
  PetscInt   p;         /* Interpolation order                                        */
  PetscBool  FSAL;      /* flag to indicate if tableau is FSAL                        */
  PetscReal *A, *b, *c; /* Tableau                                                    */
  PetscReal *bembed;    /* Embedded formula of order one less (order-1)               */
  PetscReal *binterp;   /* Dense output formula                                       */
  PetscReal  ccfl;      /* Placeholder for CFL coefficient relative to forward Euler  */
};
typedef struct _RKTableauLink *RKTableauLink;
struct _RKTableauLink {
  struct _RKTableau tab;
  RKTableauLink     next;
};

typedef struct {
  RKTableau    tableau;
  PetscBool    newtableau; /* flag to indicate if tableau has changed */
  Vec          X0;
  Vec         *Y;            /* States computed during the step                                              */
  Vec         *YdotRHS;      /* Function evaluations for the non-stiff part and contains all components      */
  Vec         *YdotRHS_fast; /* Function evaluations for the non-stiff part and contains fast components     */
  Vec         *YdotRHS_slow; /* Function evaluations for the non-stiff part and contains slow components     */
  Vec         *VecsDeltaLam; /* Increment of the adjoint sensitivity w.r.t IC at stage                       */
  Vec         *VecsSensiTemp;
  Vec          VecDeltaMu;    /* Increment of the adjoint sensitivity w.r.t P at stage                        */
  Vec         *VecsDeltaLam2; /* Increment of the 2nd-order adjoint sensitivity w.r.t IC at stage */
  Vec          VecDeltaMu2;   /* Increment of the 2nd-order adjoint sensitivity w.r.t P at stage */
  Vec         *VecsSensi2Temp;
  PetscScalar *work; /* Scalar work                                                                  */
  PetscInt     slow; /* flag indicates call slow components solver (0) or fast components solver (1) */
  PetscReal    stage_time;
  TSStepStatus status;
  PetscReal    ptime;
  PetscReal    time_step;
  PetscInt     dtratio; /* ratio between slow time step size and fast step size                         */
  IS           is_fast, is_slow;
  TS           subts_fast, subts_slow, subts_current, ts_root;
  PetscBool    use_multirate;
  Mat          MatFwdSensip0;
  Mat         *MatsFwdStageSensip;
  Mat         *MatsFwdSensipTemp;
  Vec          VecDeltaFwdSensipCol; /* Working vector for holding one column of the sensitivity matrix */
} TS_RK;
