Date: 2026-06-01T23:13:50+00:00

Actual source code: finitevolume1d.h

      1: #include <petscts.h>
      2: #include <petscdm.h>

      4: typedef struct _LimitInfo {
      5:   PetscReal hx;
      6:   PetscInt  m;

      8:   /* context for partitioned system */
      9:   PetscReal hxs, hxm, hxf;
     10: }   *LimitInfo;
     11: void Limit_Upwind(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     12: void Limit_LaxWendroff(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     13: void Limit_BeamWarming(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     14: void Limit_Fromm(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     15: void Limit_Minmod(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     16: void Limit_Superbee(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     17: void Limit_MC(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     18: void Limit_VanLeer(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     19: void Limit_VanAlbada(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *); /* differentiable */
     20: void Limit_VanAlbadaTVD(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     21: void Limit_Koren(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);    /* differentiable */
     22: void Limit_KorenSym(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *); /* differentiable */
     23: void Limit_Koren3(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     24: void Limit_CadaTorrilhon2(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     25: void Limit_CadaTorrilhon3R(PetscReal r, LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     26: void Limit_CadaTorrilhon3R0p1(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     27: void Limit_CadaTorrilhon3R1(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     28: void Limit_CadaTorrilhon3R10(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
     29: void Limit_CadaTorrilhon3R100(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);

     31: /* --------------------------------- Finite Volume data structures ----------------------------------- */

     33: typedef enum {
     34:   FVBC_PERIODIC,
     35:   FVBC_OUTFLOW,
     36:   FVBC_INFLOW
     37: } FVBCType;
     38: extern const char *FVBCTypes[];
     39: /* we add three new variables at the end of input parameters of function to be position of cell center, left boundary of domain, right boundary of domain */
     40: typedef PetscErrorCode (*RiemannFunction)(void *, PetscInt, const PetscScalar *, const PetscScalar *, PetscScalar *, PetscReal *, PetscReal, PetscReal, PetscReal);
     41: typedef PetscErrorCode (*ReconstructFunction)(void *, PetscInt, const PetscScalar *, PetscScalar *, PetscScalar *, PetscReal *, PetscReal);

     43: PetscErrorCode RiemannListAdd(PetscFunctionList *, const char *, RiemannFunction);
     44: PetscErrorCode RiemannListFind(PetscFunctionList, const char *, RiemannFunction *);
     45: PetscErrorCode ReconstructListAdd(PetscFunctionList *, const char *, ReconstructFunction);
     46: PetscErrorCode ReconstructListFind(PetscFunctionList, const char *, ReconstructFunction *);
     47: PetscErrorCode PhysicsDestroy_SimpleFree(void *);

     49: typedef struct {
     50:   PetscErrorCode (*sample)(void *, PetscInt, FVBCType, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal *);
     51:   RiemannFunction     riemann;
     52:   ReconstructFunction characteristic;
     53:   PetscErrorCode (*destroy)(void *);
     54:   void    *user;
     55:   PetscInt dof;
     56:   char    *fieldname[16];
     57: } PhysicsCtx;

     59: void Limit2_Upwind(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     60: void Limit2_LaxWendroff(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     61: void Limit2_BeamWarming(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     62: void Limit2_Fromm(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     63: void Limit2_Minmod(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     64: void Limit2_Superbee(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     65: void Limit2_MC(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);
     66: void Limit2_Koren3(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt len_slow, const PetscInt len_fast, PetscInt n, PetscScalar *lmt);

     68: void Limit3_Upwind(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     69: void Limit3_LaxWendroff(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     70: void Limit3_BeamWarming(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     71: void Limit3_Fromm(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     72: void Limit3_Minmod(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     73: void Limit3_Superbee(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     74: void Limit3_MC(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);
     75: void Limit3_Koren3(LimitInfo info, const PetscScalar *jL, const PetscScalar *jR, const PetscInt sm, const PetscInt mf, const PetscInt fm, const PetscInt ms, PetscInt n, PetscScalar *lmt);

     77: typedef PetscErrorCode (*RiemannFunction_2WaySplit)(void *, PetscInt, const PetscScalar *, const PetscScalar *, PetscScalar *, PetscReal *);
     78: typedef PetscErrorCode (*ReconstructFunction_2WaySplit)(void *, PetscInt, const PetscScalar *, PetscScalar *, PetscScalar *, PetscReal *);

     80: PetscErrorCode RiemannListAdd_2WaySplit(PetscFunctionList *, const char *, RiemannFunction_2WaySplit);
     81: PetscErrorCode RiemannListFind_2WaySplit(PetscFunctionList, const char *, RiemannFunction_2WaySplit *);
     82: PetscErrorCode ReconstructListAdd_2WaySplit(PetscFunctionList *, const char *, ReconstructFunction_2WaySplit);
     83: PetscErrorCode ReconstructListFind_2WaySplit(PetscFunctionList, const char *, ReconstructFunction_2WaySplit *);

     85: typedef struct {
     86:   PetscErrorCode (*sample2)(void *, PetscInt, FVBCType, PetscReal, PetscReal, PetscReal, PetscReal, PetscReal *);
     87:   PetscErrorCode (*inflow)(void *, PetscReal, PetscReal, PetscReal *);
     88:   RiemannFunction_2WaySplit     riemann2;
     89:   ReconstructFunction_2WaySplit characteristic2;
     90:   PetscErrorCode (*destroy)(void *);
     91:   void      *user;
     92:   PetscInt   dof;
     93:   char      *fieldname[16];
     94:   PetscBool *bcinflowindex; /* Boolean array where bcinflowindex[dof*i+j] = TRUE indicates that the jth component of the solution
     95:                                                      is an inflow boundary condition and i = 0 is left bc, i = 1 is right bc. FALSE implies outflow
     96:                                                      outflow boundary condition. */
     97: } PhysicsCtx2;

     99: typedef struct {
    100:   void (*limit)(LimitInfo, const PetscScalar *, const PetscScalar *, PetscScalar *);
    101:   PhysicsCtx physics;
    102:   MPI_Comm   comm;
    103:   char       prefix[256];

    105:   /* Local work arrays */
    106:   PetscScalar *R, *Rinv; /* Characteristic basis, and it's inverse.  COLUMN-MAJOR */
    107:   PetscScalar *cjmpLR;   /* Jumps at left and right edge of cell, in characteristic basis, len=2*dof */
    108:   PetscScalar *cslope;   /* Limited slope, written in characteristic basis */
    109:   PetscScalar *uLR;      /* Solution at left and right of interface, conservative variables, len=2*dof */
    110:   PetscScalar *flux;     /* Flux across interface */
    111:   PetscReal   *speeds;   /* Speeds of each wave */
    112:   PetscReal   *ub;       /* Boundary data for inflow boundary conditions */

    114:   PetscReal cfl_idt; /* Max allowable value of 1/Delta t */
    115:   PetscReal cfl;
    116:   PetscReal xmin, xmax;
    117:   PetscInt  initial;
    118:   PetscBool simulation;
    119:   FVBCType  bctype;
    120:   PetscBool exact;

    122:   /* context for partitioned system */
    123:   void (*limit3)(LimitInfo, const PetscScalar *, const PetscScalar *, const PetscInt, const PetscInt, const PetscInt, const PetscInt, PetscInt, PetscScalar *);
    124:   void (*limit2)(LimitInfo, const PetscScalar *, const PetscScalar *, PetscInt, PetscInt, PetscInt, PetscScalar *);
    125:   PhysicsCtx2 physics2;
    126:   PetscInt    hratio; /* hratio = hslow/hfast */
    127:   IS          isf, iss, isf2, iss2, ism, issb, ismb;
    128:   PetscBool   recursive;
    129:   PetscInt    sm, mf, fm, ms;     /* positions (array index) for slow-medium, medium-fast, fast-medium, medium-slow interfaces */
    130:   PetscInt    sf, fs;             /* slow-fast and fast-slow interfaces */
    131:   PetscInt    lsbwidth, rsbwidth; /* left slow buffer width and right slow buffer width */
    132:   PetscInt    lmbwidth, rmbwidth; /* left medium buffer width and right medium buffer width */
    133: } FVCtx;

    135: /* --------------------------------- Finite Volume Solver ----------------------------------- */
    136: PetscErrorCode FVRHSFunction(TS, PetscReal, Vec, Vec, void *);
    137: PetscErrorCode FVSample(FVCtx *, DM, PetscReal, Vec);
    138: PetscErrorCode SolutionStatsView(DM, Vec, PetscViewer);