Actual source code: petscfvimpl.h

  1: #ifndef PETSCFVIMPL_H
  2: #define PETSCFVIMPL_H

  4: #include <petscfv.h>
  5: #ifdef PETSC_HAVE_LIBCEED
  6: #include <petscfvceed.h>
  7: #endif
  8: #include <petsc/private/petscimpl.h>
  9: #include <petsc/private/dmimpl.h>

 11: PETSC_EXTERN PetscBool      PetscLimiterRegisterAllCalled;
 12: PETSC_EXTERN PetscBool      PetscFVRegisterAllCalled;
 13: PETSC_EXTERN PetscErrorCode PetscLimiterRegisterAll(void);
 14: PETSC_EXTERN PetscErrorCode PetscFVRegisterAll(void);

 16: typedef struct _PetscLimiterOps *PetscLimiterOps;
 17: struct _PetscLimiterOps {
 18:   PetscErrorCode (*setfromoptions)(PetscLimiter);
 19:   PetscErrorCode (*setup)(PetscLimiter);
 20:   PetscErrorCode (*view)(PetscLimiter, PetscViewer);
 21:   PetscErrorCode (*destroy)(PetscLimiter);
 22:   PetscErrorCode (*limit)(PetscLimiter, PetscReal, PetscReal *);
 23: };

 25: struct _p_PetscLimiter {
 26:   PETSCHEADER(struct _PetscLimiterOps);
 27:   void *data; /* Implementation object */
 28: };

 30: typedef struct {
 31:   PetscInt dummy;
 32: } PetscLimiter_Sin;

 34: typedef struct {
 35:   PetscInt dummy;
 36: } PetscLimiter_Zero;

 38: typedef struct {
 39:   PetscInt dummy;
 40: } PetscLimiter_None;

 42: typedef struct {
 43:   PetscInt dummy;
 44: } PetscLimiter_Minmod;

 46: typedef struct {
 47:   PetscInt dummy;
 48: } PetscLimiter_VanLeer;

 50: typedef struct {
 51:   PetscInt dummy;
 52: } PetscLimiter_VanAlbada;

 54: typedef struct {
 55:   PetscInt dummy;
 56: } PetscLimiter_Superbee;

 58: typedef struct {
 59:   PetscInt dummy;
 60: } PetscLimiter_MC;

 62: typedef struct _PetscFVOps *PetscFVOps;
 63: struct _PetscFVOps {
 64:   PetscErrorCode (*setfromoptions)(PetscFV);
 65:   PetscErrorCode (*setup)(PetscFV);
 66:   PetscErrorCode (*view)(PetscFV, PetscViewer);
 67:   PetscErrorCode (*destroy)(PetscFV);
 68:   PetscErrorCode (*computegradient)(PetscFV, PetscInt, const PetscScalar[], PetscScalar[]);
 69:   PetscErrorCode (*integraterhsfunction)(PetscFV, PetscDS, PetscInt, PetscInt, PetscFVFaceGeom *, PetscReal *, PetscScalar[], PetscScalar[], PetscScalar[], PetscScalar[]);
 70: };

 72: struct _p_PetscFV {
 73:   PETSCHEADER(struct _PetscFVOps);
 74:   void           *data;             /* Implementation object */
 75:   PetscLimiter    limiter;          /* The slope limiter */
 76:   PetscDualSpace  dualSpace;        /* The dual space P', usually simple */
 77:   PetscInt        numComponents;    /* The number of field components */
 78:   PetscInt        dim;              /* The spatial dimension */
 79:   PetscBool       computeGradients; /* Flag for gradient computation */
 80:   PetscScalar    *fluxWork;         /* The work array for flux calculation */
 81:   PetscQuadrature quadrature;       /* Suitable quadrature on the volume */
 82:   PetscTabulation T;                /* Tabulation of pseudo-basis and derivatives at quadrature points */
 83:   char          **componentNames;   /* Names of the component fields */
 84: #ifdef PETSC_HAVE_LIBCEED
 85:   Ceed      ceed;      /* The LibCEED context, usually set by the DM */
 86:   CeedBasis ceedBasis; /* Basis for libCEED matching this element */
 87: #endif
 88: };

 90: typedef struct {
 91:   PetscInt cellType;
 92: } PetscFV_Upwind;

 94: typedef struct {
 95:   PetscInt     maxFaces, workSize;
 96:   PetscScalar *B, *Binv, *tau, *work;
 97: } PetscFV_LeastSquares;

 99: static inline PetscErrorCode PetscFVInterpolate_Static(PetscFV fv, const PetscScalar x[], PetscInt q, PetscScalar interpolant[])
100: {
101:   PetscInt Nc;

103:   PetscFunctionBeginHot;
104:   PetscCall(PetscFVGetNumComponents(fv, &Nc));
105:   PetscCall(PetscArraycpy(interpolant, x, Nc));
106:   PetscFunctionReturn(PETSC_SUCCESS);
107: }

109: #endif