Actual source code: petscfvimpl.h

      1: #pragma once

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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