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: }