1: #if !defined(_PETSCDSIMPL_H)
2: #define _PETSCDSIMPL_H 4: #include <petscds.h> 5: #include <petsc/private/petscimpl.h> 7: PETSC_EXTERN PetscBool PetscDSRegisterAllCalled;
8: PETSC_EXTERN PetscErrorCodePetscDSRegisterAll(void);
10: typedef struct _n_DSBoundary *DSBoundary;
12: struct _n_DSBoundary {
13: const char *name;
14: const char *labelname;
15: DMBoundaryConditionType type;
16: PetscInt field;
17: PetscInt numcomps;
18: PetscInt *comps;
19: void (*func)(void);
20: PetscInt numids;
21: PetscInt *ids;
22: void *ctx;
23: DSBoundary next;
24: };
26: typedef struct _PetscDSOps *PetscDSOps;
27: struct _PetscDSOps {
28: PetscErrorCode (*setfromoptions)(PetscDS);
29: PetscErrorCode (*setup)(PetscDS);
30: PetscErrorCode (*view)(PetscDS,PetscViewer);
31: PetscErrorCode (*destroy)(PetscDS);
32: };
34: struct _p_PetscDS {
35: PETSCHEADER(struct _PetscDSOps);
36: void *data; /* Implementation object */
37: PetscDS *subprobs; /* The subspaces for each dimension */
38: PetscBool setup; /* Flag for setup */
39: PetscInt Nf; /* The number of solution fields */
40: PetscBool *implicit; /* Flag for implicit or explicit solve for each field */
41: PetscBool defaultAdj[2]; /* [use cone() or support() first, use the transitive closure] for the case of no fields */
42: PetscBool *adjacency; /* Flags for defining variable influence (adjacency) for each field [use cone() or support() first, use the transitive closure] */
43: PetscObject *disc; /* The discretization for each solution field (PetscFE, PetscFV, etc.) */
44: PetscPointFunc *obj; /* Scalar integral (like an objective function) */
45: PetscPointFunc *f; /* Weak form integrands for F, f_0, f_1 */
46: PetscPointJac *g; /* Weak form integrands for J = dF/du, g_0, g_1, g_2, g_3 */
47: PetscPointJac *gp; /* Weak form integrands for preconditioner for J, g_0, g_1, g_2, g_3 */
48: PetscPointJac *gt; /* Weak form integrands for dF/du_t, g_0, g_1, g_2, g_3 */
49: PetscBdPointFunc *fBd; /* Weak form boundary integrands F_bd, f_0, f_1 */
50: PetscBdPointJac *gBd; /* Weak form boundary integrands J_bd = dF_bd/du, g_0, g_1, g_2, g_3 */
51: PetscRiemannFunc *r; /* Riemann solvers */
52: PetscPointFunc *update; /* Direct update of field coefficients */
53: PetscSimplePointFunc *exactSol; /* Exact solutions for each field */
54: PetscInt numConstants; /* Number of constants passed to point functions */
55: PetscScalar *constants; /* Array of constants passed to point functions */
56: void **ctx; /* User contexts for each field */
57: PetscInt dimEmbed; /* The real space coordinate dimension */
58: /* Computed sizes */
59: PetscInt totDim; /* Total system dimension */
60: PetscInt totComp; /* Total field components */
61: PetscInt *Nc; /* Number of components for each field */
62: PetscInt *Nb; /* Number of basis functions for each field */
63: PetscInt *off; /* Offsets for each field */
64: PetscInt *offDer; /* Derivative offsets for each field */
65: PetscReal **basis; /* Default basis tabulation for each field */
66: PetscReal **basisDer; /* Default basis derivative tabulation for each field */
67: PetscReal **basisFace; /* Basis tabulation for each local face and field */
68: PetscReal **basisDerFace; /* Basis derivative tabulation for each local face and field */
69: /* Work space */
70: PetscScalar *u; /* Field evaluation */
71: PetscScalar *u_t; /* Field time derivative evaluation */
72: PetscScalar *u_x; /* Field gradient evaluation */
73: PetscScalar *refSpaceDer; /* Workspace for computing derivative in the reference coordinates */
74: PetscReal *x; /* Workspace for computing real coordinates */
75: PetscScalar *f0, *f1; /* Point evaluations of weak form residual integrands */
76: PetscScalar *g0, *g1, *g2, *g3; /* Point evaluations of weak form Jacobian integrands */
77: DSBoundary boundary; /* Linked list of boundary conditions */
78: };
80: typedef struct {
81: PetscInt dummy; /* */
82: } PetscDS_Basic;
84: #endif