xref: /petsc/src/ts/impls/explicit/rk/rk.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
1*a4963045SJacob Faibussowitsch #pragma once
2474dd773SHong Zhang typedef struct _RKTableau *RKTableau;
3474dd773SHong Zhang struct _RKTableau {
4474dd773SHong Zhang   char      *name;
5474dd773SHong Zhang   PetscInt   order;     /* Classical approximation order of the method i              */
6474dd773SHong Zhang   PetscInt   s;         /* Number of stages                                           */
7474dd773SHong Zhang   PetscInt   p;         /* Interpolation order                                        */
8474dd773SHong Zhang   PetscBool  FSAL;      /* flag to indicate if tableau is FSAL                        */
9474dd773SHong Zhang   PetscReal *A, *b, *c; /* Tableau                                                    */
10474dd773SHong Zhang   PetscReal *bembed;    /* Embedded formula of order one less (order-1)               */
11474dd773SHong Zhang   PetscReal *binterp;   /* Dense output formula                                       */
12474dd773SHong Zhang   PetscReal  ccfl;      /* Placeholder for CFL coefficient relative to forward Euler  */
13474dd773SHong Zhang };
14474dd773SHong Zhang typedef struct _RKTableauLink *RKTableauLink;
15474dd773SHong Zhang struct _RKTableauLink {
16474dd773SHong Zhang   struct _RKTableau tab;
17474dd773SHong Zhang   RKTableauLink     next;
18474dd773SHong Zhang };
19474dd773SHong Zhang 
20474dd773SHong Zhang typedef struct {
21474dd773SHong Zhang   RKTableau    tableau;
22630f8c86SStefano Zampini   PetscBool    newtableau; /* flag to indicate if tableau has changed */
23474dd773SHong Zhang   Vec          X0;
24474dd773SHong Zhang   Vec         *Y;            /* States computed during the step                                              */
25474dd773SHong Zhang   Vec         *YdotRHS;      /* Function evaluations for the non-stiff part and contains all components      */
26474dd773SHong Zhang   Vec         *YdotRHS_fast; /* Function evaluations for the non-stiff part and contains fast components     */
27474dd773SHong Zhang   Vec         *YdotRHS_slow; /* Function evaluations for the non-stiff part and contains slow components     */
282e7b7f96SHong Zhang   Vec         *VecsDeltaLam; /* Increment of the adjoint sensitivity w.r.t IC at stage                       */
292e7b7f96SHong Zhang   Vec         *VecsSensiTemp;
302e7b7f96SHong Zhang   Vec          VecDeltaMu;    /* Increment of the adjoint sensitivity w.r.t P at stage                        */
3113af1a74SHong Zhang   Vec         *VecsDeltaLam2; /* Increment of the 2nd-order adjoint sensitivity w.r.t IC at stage */
3213af1a74SHong Zhang   Vec          VecDeltaMu2;   /* Increment of the 2nd-order adjoint sensitivity w.r.t P at stage */
3313af1a74SHong Zhang   Vec         *VecsSensi2Temp;
34474dd773SHong Zhang   PetscScalar *work; /* Scalar work                                                                  */
35474dd773SHong Zhang   PetscInt     slow; /* flag indicates call slow components solver (0) or fast components solver (1) */
36474dd773SHong Zhang   PetscReal    stage_time;
37474dd773SHong Zhang   TSStepStatus status;
38474dd773SHong Zhang   PetscReal    ptime;
39474dd773SHong Zhang   PetscReal    time_step;
40474dd773SHong Zhang   PetscInt     dtratio; /* ratio between slow time step size and fast step size                         */
41474dd773SHong Zhang   IS           is_fast, is_slow;
4263a6f1b4SHong Zhang   TS           subts_fast, subts_slow, subts_current, ts_root;
430fe4d17eSHong Zhang   PetscBool    use_multirate;
44922a638cSHong Zhang   Mat          MatFwdSensip0;
45922a638cSHong Zhang   Mat         *MatsFwdStageSensip;
46922a638cSHong Zhang   Mat         *MatsFwdSensipTemp;
47922a638cSHong Zhang   Vec          VecDeltaFwdSensipCol; /* Working vector for holding one column of the sensitivity matrix */
48474dd773SHong Zhang } TS_RK;
49