xref: /petsc/src/dm/dt/space/interface/space.c (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
120cf1dd8SToby Isaac #include <petsc/private/petscfeimpl.h> /*I  "petscfe.h"  I*/
220cf1dd8SToby Isaac #include <petscdmshell.h>
320cf1dd8SToby Isaac 
420cf1dd8SToby Isaac PetscClassId PETSCSPACE_CLASSID = 0;
520cf1dd8SToby Isaac 
620cf1dd8SToby Isaac PetscFunctionList PetscSpaceList              = NULL;
720cf1dd8SToby Isaac PetscBool         PetscSpaceRegisterAllCalled = PETSC_FALSE;
820cf1dd8SToby Isaac 
920cf1dd8SToby Isaac /*@C
10*dce8aebaSBarry Smith   PetscSpaceRegister - Adds a new `PetscSpace` implementation
1120cf1dd8SToby Isaac 
1220cf1dd8SToby Isaac   Not Collective
1320cf1dd8SToby Isaac 
1420cf1dd8SToby Isaac   Input Parameters:
1520cf1dd8SToby Isaac + name        - The name of a new user-defined creation routine
1620cf1dd8SToby Isaac - create_func - The creation routine for the implementation type
1720cf1dd8SToby Isaac 
1820cf1dd8SToby Isaac   Sample usage:
1920cf1dd8SToby Isaac .vb
2020cf1dd8SToby Isaac     PetscSpaceRegister("my_space", MyPetscSpaceCreate);
2120cf1dd8SToby Isaac .ve
2220cf1dd8SToby Isaac 
2320cf1dd8SToby Isaac   Then, your PetscSpace type can be chosen with the procedural interface via
2420cf1dd8SToby Isaac .vb
2520cf1dd8SToby Isaac     PetscSpaceCreate(MPI_Comm, PetscSpace *);
2620cf1dd8SToby Isaac     PetscSpaceSetType(PetscSpace, "my_space");
2720cf1dd8SToby Isaac .ve
2820cf1dd8SToby Isaac    or at runtime via the option
2920cf1dd8SToby Isaac .vb
3020cf1dd8SToby Isaac     -petscspace_type my_space
3120cf1dd8SToby Isaac .ve
3220cf1dd8SToby Isaac 
3320cf1dd8SToby Isaac   Level: advanced
3420cf1dd8SToby Isaac 
35*dce8aebaSBarry Smith   Note:
36*dce8aebaSBarry Smith   `PetscSpaceRegister()` may be called multiple times to add several user-defined types of `PetscSpace`.  The creation function is called
37*dce8aebaSBarry Smith   when the type is set to 'name'.
3820cf1dd8SToby Isaac 
39*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceRegisterAll()`, `PetscSpaceRegisterDestroy()`
4020cf1dd8SToby Isaac @*/
41d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace))
42d71ae5a4SJacob Faibussowitsch {
4320cf1dd8SToby Isaac   PetscFunctionBegin;
449566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscSpaceList, sname, function));
4520cf1dd8SToby Isaac   PetscFunctionReturn(0);
4620cf1dd8SToby Isaac }
4720cf1dd8SToby Isaac 
4820cf1dd8SToby Isaac /*@C
49*dce8aebaSBarry Smith   PetscSpaceSetType - Builds a particular `PetscSpace`
5020cf1dd8SToby Isaac 
51d083f849SBarry Smith   Collective on sp
5220cf1dd8SToby Isaac 
5320cf1dd8SToby Isaac   Input Parameters:
54*dce8aebaSBarry Smith + sp   - The `PetscSpace` object
5520cf1dd8SToby Isaac - name - The kind of space
5620cf1dd8SToby Isaac 
5720cf1dd8SToby Isaac   Options Database Key:
58*dce8aebaSBarry Smith . -petscspace_type <type> - Sets the `PetscSpace` type; use -help for a list of available types
5920cf1dd8SToby Isaac 
6020cf1dd8SToby Isaac   Level: intermediate
6120cf1dd8SToby Isaac 
62*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceType`, `PetscSpaceGetType()`, `PetscSpaceCreate()`
6320cf1dd8SToby Isaac @*/
64d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name)
65d71ae5a4SJacob Faibussowitsch {
6620cf1dd8SToby Isaac   PetscErrorCode (*r)(PetscSpace);
6720cf1dd8SToby Isaac   PetscBool match;
6820cf1dd8SToby Isaac 
6920cf1dd8SToby Isaac   PetscFunctionBegin;
7020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
719566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)sp, name, &match));
7220cf1dd8SToby Isaac   if (match) PetscFunctionReturn(0);
7320cf1dd8SToby Isaac 
749566063dSJacob Faibussowitsch   PetscCall(PetscSpaceRegisterAll());
759566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscSpaceList, name, &r));
762c71b3e2SJacob Faibussowitsch   PetscCheck(r, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name);
7720cf1dd8SToby Isaac 
78dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, destroy);
7920cf1dd8SToby Isaac   sp->ops->destroy = NULL;
80dbbe0bcdSBarry Smith 
8143bfef1cSToby Isaac   sp->dim = PETSC_DETERMINE;
829566063dSJacob Faibussowitsch   PetscCall((*r)(sp));
839566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)sp, name));
8420cf1dd8SToby Isaac   PetscFunctionReturn(0);
8520cf1dd8SToby Isaac }
8620cf1dd8SToby Isaac 
8720cf1dd8SToby Isaac /*@C
88*dce8aebaSBarry Smith   PetscSpaceGetType - Gets the `PetscSpaceType` (as a string) from the object.
8920cf1dd8SToby Isaac 
9020cf1dd8SToby Isaac   Not Collective
9120cf1dd8SToby Isaac 
9220cf1dd8SToby Isaac   Input Parameter:
93*dce8aebaSBarry Smith . sp  - The `PetscSpace`
9420cf1dd8SToby Isaac 
9520cf1dd8SToby Isaac   Output Parameter:
96*dce8aebaSBarry Smith . name - The `PetscSpace` type name
9720cf1dd8SToby Isaac 
9820cf1dd8SToby Isaac   Level: intermediate
9920cf1dd8SToby Isaac 
100*dce8aebaSBarry Smith .seealso: `PetscSpaceType`, `PetscSpace`, `PetscSpaceSetType()`, `PetscSpaceCreate()`
10120cf1dd8SToby Isaac @*/
102d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
103d71ae5a4SJacob Faibussowitsch {
10420cf1dd8SToby Isaac   PetscFunctionBegin;
10520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
10620cf1dd8SToby Isaac   PetscValidPointer(name, 2);
10748a46eb9SPierre Jolivet   if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll());
10820cf1dd8SToby Isaac   *name = ((PetscObject)sp)->type_name;
10920cf1dd8SToby Isaac   PetscFunctionReturn(0);
11020cf1dd8SToby Isaac }
11120cf1dd8SToby Isaac 
11220cf1dd8SToby Isaac /*@C
113*dce8aebaSBarry Smith    PetscSpaceViewFromOptions - View a `PetscSpace` based on values in the options database
114fe2efc57SMark 
115fe2efc57SMark    Collective on PetscSpace
116fe2efc57SMark 
117fe2efc57SMark    Input Parameters:
118fe2efc57SMark +  A - the PetscSpace object
119*dce8aebaSBarry Smith .  obj - Optional object that provides the options name prefix
120*dce8aebaSBarry Smith -  name - command line option name
121fe2efc57SMark 
122fe2efc57SMark    Level: intermediate
123*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`, `PetscObjectViewFromOptions()`, `PetscSpaceCreate()`
124fe2efc57SMark @*/
125d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A, PetscObject obj, const char name[])
126d71ae5a4SJacob Faibussowitsch {
127fe2efc57SMark   PetscFunctionBegin;
128fe2efc57SMark   PetscValidHeaderSpecific(A, PETSCSPACE_CLASSID, 1);
1299566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
130fe2efc57SMark   PetscFunctionReturn(0);
131fe2efc57SMark }
132fe2efc57SMark 
133fe2efc57SMark /*@C
134*dce8aebaSBarry Smith   PetscSpaceView - Views a `PetscSpace`
13520cf1dd8SToby Isaac 
136d083f849SBarry Smith   Collective on sp
13720cf1dd8SToby Isaac 
138d8d19677SJose E. Roman   Input Parameters:
139*dce8aebaSBarry Smith + sp - the `PetscSpace` object to view
14020cf1dd8SToby Isaac - v  - the viewer
14120cf1dd8SToby Isaac 
14229b5c115SMatthew G. Knepley   Level: beginner
14320cf1dd8SToby Isaac 
144*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscViewer`, `PetscSpaceViewFromOptions()`, `PetscSpaceDestroy()`
14520cf1dd8SToby Isaac @*/
146d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
147d71ae5a4SJacob Faibussowitsch {
1480aec8e07SMatthew G. Knepley   PetscInt  pdim;
14920cf1dd8SToby Isaac   PetscBool iascii;
15020cf1dd8SToby Isaac 
15120cf1dd8SToby Isaac   PetscFunctionBegin;
15220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
15320cf1dd8SToby Isaac   if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
1549566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)sp), &v));
1559566063dSJacob Faibussowitsch   PetscCall(PetscSpaceGetDimension(sp, &pdim));
1569566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)sp, v));
1579566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii));
1589566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(v));
15963a3b9bcSJacob Faibussowitsch   if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Space in %" PetscInt_FMT " variables with %" PetscInt_FMT " components, size %" PetscInt_FMT "\n", sp->Nv, sp->Nc, pdim));
160dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, view, v);
1619566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(v));
16220cf1dd8SToby Isaac   PetscFunctionReturn(0);
16320cf1dd8SToby Isaac }
16420cf1dd8SToby Isaac 
16520cf1dd8SToby Isaac /*@
166*dce8aebaSBarry Smith   PetscSpaceSetFromOptions - sets parameters in a `PetscSpace` from the options database
16720cf1dd8SToby Isaac 
168d083f849SBarry Smith   Collective on sp
16920cf1dd8SToby Isaac 
17020cf1dd8SToby Isaac   Input Parameter:
171*dce8aebaSBarry Smith . sp - the `PetscSpace` object to set options for
17220cf1dd8SToby Isaac 
173*dce8aebaSBarry Smith   Options Database Keys:
1748f2aacc6SMatthew G. Knepley + -petscspace_degree <deg> - the approximation order of the space
1758f2aacc6SMatthew G. Knepley . -petscspace_variables <n> - the number of different variables, e.g. x and y
1768f2aacc6SMatthew G. Knepley - -petscspace_components <c> - the number of components, say d for a vector field
17720cf1dd8SToby Isaac 
17829b5c115SMatthew G. Knepley   Level: intermediate
17920cf1dd8SToby Isaac 
180*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`
18120cf1dd8SToby Isaac @*/
182d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
183d71ae5a4SJacob Faibussowitsch {
18420cf1dd8SToby Isaac   const char *defaultType;
18520cf1dd8SToby Isaac   char        name[256];
1865a856986SBarry Smith   PetscBool   flg;
18720cf1dd8SToby Isaac 
18820cf1dd8SToby Isaac   PetscFunctionBegin;
18920cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
19020cf1dd8SToby Isaac   if (!((PetscObject)sp)->type_name) {
19120cf1dd8SToby Isaac     defaultType = PETSCSPACEPOLYNOMIAL;
19220cf1dd8SToby Isaac   } else {
19320cf1dd8SToby Isaac     defaultType = ((PetscObject)sp)->type_name;
19420cf1dd8SToby Isaac   }
1959566063dSJacob Faibussowitsch   if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll());
19620cf1dd8SToby Isaac 
197d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)sp);
1989566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg));
19920cf1dd8SToby Isaac   if (flg) {
2009566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetType(sp, name));
20120cf1dd8SToby Isaac   } else if (!((PetscObject)sp)->type_name) {
2029566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetType(sp, defaultType));
20320cf1dd8SToby Isaac   }
2047be5e748SToby Isaac   {
2059566063dSJacob Faibussowitsch     PetscCall(PetscOptionsDeprecated("-petscspace_order", "-petscspace_degree", "3.11", NULL));
2069566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0));
2077be5e748SToby Isaac   }
2089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0));
2099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL, 0));
2109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL, 0));
211dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, setfromoptions, PetscOptionsObject);
21220cf1dd8SToby Isaac   /* process any options handlers added with PetscObjectAddOptionsHandler() */
213dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)sp, PetscOptionsObject));
214d0609cedSBarry Smith   PetscOptionsEnd();
2159566063dSJacob Faibussowitsch   PetscCall(PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view"));
21620cf1dd8SToby Isaac   PetscFunctionReturn(0);
21720cf1dd8SToby Isaac }
21820cf1dd8SToby Isaac 
21920cf1dd8SToby Isaac /*@C
220*dce8aebaSBarry Smith   PetscSpaceSetUp - Construct data structures for the `PetscSpace`
22120cf1dd8SToby Isaac 
222d083f849SBarry Smith   Collective on sp
22320cf1dd8SToby Isaac 
22420cf1dd8SToby Isaac   Input Parameter:
225*dce8aebaSBarry Smith . sp - the `PetscSpace` object to setup
22620cf1dd8SToby Isaac 
22729b5c115SMatthew G. Knepley   Level: intermediate
22820cf1dd8SToby Isaac 
229*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`, `PetscSpaceDestroy()`
23020cf1dd8SToby Isaac @*/
231d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
232d71ae5a4SJacob Faibussowitsch {
23320cf1dd8SToby Isaac   PetscFunctionBegin;
23420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
235dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, setup);
23620cf1dd8SToby Isaac   PetscFunctionReturn(0);
23720cf1dd8SToby Isaac }
23820cf1dd8SToby Isaac 
23920cf1dd8SToby Isaac /*@
240*dce8aebaSBarry Smith   PetscSpaceDestroy - Destroys a `PetscSpace` object
24120cf1dd8SToby Isaac 
242d083f849SBarry Smith   Collective on sp
24320cf1dd8SToby Isaac 
24420cf1dd8SToby Isaac   Input Parameter:
24520cf1dd8SToby Isaac . sp - the PetscSpace object to destroy
24620cf1dd8SToby Isaac 
24729b5c115SMatthew G. Knepley   Level: beginner
24820cf1dd8SToby Isaac 
249*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceCreate()`
25020cf1dd8SToby Isaac @*/
251d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
252d71ae5a4SJacob Faibussowitsch {
25320cf1dd8SToby Isaac   PetscFunctionBegin;
25420cf1dd8SToby Isaac   if (!*sp) PetscFunctionReturn(0);
25520cf1dd8SToby Isaac   PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1);
25620cf1dd8SToby Isaac 
2579371c9d4SSatish Balay   if (--((PetscObject)(*sp))->refct > 0) {
2589371c9d4SSatish Balay     *sp = NULL;
2599371c9d4SSatish Balay     PetscFunctionReturn(0);
2609371c9d4SSatish Balay   }
26120cf1dd8SToby Isaac   ((PetscObject)(*sp))->refct = 0;
2629566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&(*sp)->dm));
26320cf1dd8SToby Isaac 
2649566063dSJacob Faibussowitsch   PetscCall((*(*sp)->ops->destroy)(*sp));
2659566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(sp));
26620cf1dd8SToby Isaac   PetscFunctionReturn(0);
26720cf1dd8SToby Isaac }
26820cf1dd8SToby Isaac 
26920cf1dd8SToby Isaac /*@
270*dce8aebaSBarry Smith   PetscSpaceCreate - Creates an empty `PetscSpace` object. The type can then be set with `PetscSpaceSetType()`.
27120cf1dd8SToby Isaac 
272d083f849SBarry Smith   Collective
27320cf1dd8SToby Isaac 
27420cf1dd8SToby Isaac   Input Parameter:
275*dce8aebaSBarry Smith . comm - The communicator for the `PetscSpace` object
27620cf1dd8SToby Isaac 
27720cf1dd8SToby Isaac   Output Parameter:
278*dce8aebaSBarry Smith . sp - The `PetscSpace` object
27920cf1dd8SToby Isaac 
28020cf1dd8SToby Isaac   Level: beginner
28120cf1dd8SToby Isaac 
282*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetType()`, `PETSCSPACEPOLYNOMIAL`
28320cf1dd8SToby Isaac @*/
284d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
285d71ae5a4SJacob Faibussowitsch {
28620cf1dd8SToby Isaac   PetscSpace s;
28720cf1dd8SToby Isaac 
28820cf1dd8SToby Isaac   PetscFunctionBegin;
28920cf1dd8SToby Isaac   PetscValidPointer(sp, 2);
2909566063dSJacob Faibussowitsch   PetscCall(PetscCitationsRegister(FECitation, &FEcite));
29120cf1dd8SToby Isaac   *sp = NULL;
2929566063dSJacob Faibussowitsch   PetscCall(PetscFEInitializePackage());
29320cf1dd8SToby Isaac 
2949566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView));
29520cf1dd8SToby Isaac 
29620cf1dd8SToby Isaac   s->degree    = 0;
29743bfef1cSToby Isaac   s->maxDegree = PETSC_DETERMINE;
29820cf1dd8SToby Isaac   s->Nc        = 1;
29920cf1dd8SToby Isaac   s->Nv        = 0;
30043bfef1cSToby Isaac   s->dim       = PETSC_DETERMINE;
3019566063dSJacob Faibussowitsch   PetscCall(DMShellCreate(comm, &s->dm));
3029566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL));
30320cf1dd8SToby Isaac 
30420cf1dd8SToby Isaac   *sp = s;
30520cf1dd8SToby Isaac   PetscFunctionReturn(0);
30620cf1dd8SToby Isaac }
30720cf1dd8SToby Isaac 
30820cf1dd8SToby Isaac /*@
30920cf1dd8SToby Isaac   PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors
31020cf1dd8SToby Isaac 
31120cf1dd8SToby Isaac   Input Parameter:
312*dce8aebaSBarry Smith . sp - The `PetscSpace`
31320cf1dd8SToby Isaac 
31420cf1dd8SToby Isaac   Output Parameter:
31520cf1dd8SToby Isaac . dim - The dimension
31620cf1dd8SToby Isaac 
31720cf1dd8SToby Isaac   Level: intermediate
31820cf1dd8SToby Isaac 
319*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace`
32020cf1dd8SToby Isaac @*/
321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
322d71ae5a4SJacob Faibussowitsch {
32320cf1dd8SToby Isaac   PetscFunctionBegin;
32420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
325dadcf809SJacob Faibussowitsch   PetscValidIntPointer(dim, 2);
326ad540459SPierre Jolivet   if (sp->dim == PETSC_DETERMINE) PetscTryTypeMethod(sp, getdimension, &sp->dim);
32743bfef1cSToby Isaac   *dim = sp->dim;
32820cf1dd8SToby Isaac   PetscFunctionReturn(0);
32920cf1dd8SToby Isaac }
33020cf1dd8SToby Isaac 
33120cf1dd8SToby Isaac /*@
33220cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
33320cf1dd8SToby Isaac 
33420cf1dd8SToby Isaac   Input Parameter:
335*dce8aebaSBarry Smith . sp - The `PetscSpace`
33620cf1dd8SToby Isaac 
337d8d19677SJose E. Roman   Output Parameters:
33820cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space
33920cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space
34020cf1dd8SToby Isaac 
34120cf1dd8SToby Isaac   Level: intermediate
34220cf1dd8SToby Isaac 
343*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetDegree()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
34420cf1dd8SToby Isaac @*/
345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
346d71ae5a4SJacob Faibussowitsch {
34720cf1dd8SToby Isaac   PetscFunctionBegin;
34820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
349dadcf809SJacob Faibussowitsch   if (minDegree) PetscValidIntPointer(minDegree, 2);
350dadcf809SJacob Faibussowitsch   if (maxDegree) PetscValidIntPointer(maxDegree, 3);
35120cf1dd8SToby Isaac   if (minDegree) *minDegree = sp->degree;
352f5a02b64SToby Isaac   if (maxDegree) *maxDegree = sp->maxDegree;
35320cf1dd8SToby Isaac   PetscFunctionReturn(0);
35420cf1dd8SToby Isaac }
35520cf1dd8SToby Isaac 
35620cf1dd8SToby Isaac /*@
35720cf1dd8SToby Isaac   PetscSpaceSetDegree - Set the degree of approximation for this space.
35820cf1dd8SToby Isaac 
35920cf1dd8SToby Isaac   Input Parameters:
360*dce8aebaSBarry Smith + sp - The `PetscSpace`
361d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space
362*dce8aebaSBarry Smith - maxDegree - The degree of the largest polynomial space containing the space.  One of degree and maxDegree can be `PETSC_DETERMINE`.
36320cf1dd8SToby Isaac 
36420cf1dd8SToby Isaac   Level: intermediate
36520cf1dd8SToby Isaac 
366*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace`
36720cf1dd8SToby Isaac @*/
368d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree)
369d71ae5a4SJacob Faibussowitsch {
37020cf1dd8SToby Isaac   PetscFunctionBegin;
37120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
372d39dd5f5SToby Isaac   sp->degree    = degree;
373d39dd5f5SToby Isaac   sp->maxDegree = maxDegree;
37420cf1dd8SToby Isaac   PetscFunctionReturn(0);
37520cf1dd8SToby Isaac }
37620cf1dd8SToby Isaac 
37720cf1dd8SToby Isaac /*@
37820cf1dd8SToby Isaac   PetscSpaceGetNumComponents - Return the number of components for this space
37920cf1dd8SToby Isaac 
38020cf1dd8SToby Isaac   Input Parameter:
381*dce8aebaSBarry Smith . sp - The `PetscSpace`
38220cf1dd8SToby Isaac 
38320cf1dd8SToby Isaac   Output Parameter:
38420cf1dd8SToby Isaac . Nc - The number of components
38520cf1dd8SToby Isaac 
38620cf1dd8SToby Isaac   Level: intermediate
38720cf1dd8SToby Isaac 
388*dce8aebaSBarry Smith   Note:
389*dce8aebaSBarry Smith   A vector space, for example, will have d components, where d is the spatial dimension
390*dce8aebaSBarry Smith 
391*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetNumComponents()`, `PetscSpaceGetNumVariables()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
39220cf1dd8SToby Isaac @*/
393d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
394d71ae5a4SJacob Faibussowitsch {
39520cf1dd8SToby Isaac   PetscFunctionBegin;
39620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
397dadcf809SJacob Faibussowitsch   PetscValidIntPointer(Nc, 2);
39820cf1dd8SToby Isaac   *Nc = sp->Nc;
39920cf1dd8SToby Isaac   PetscFunctionReturn(0);
40020cf1dd8SToby Isaac }
40120cf1dd8SToby Isaac 
40220cf1dd8SToby Isaac /*@
40320cf1dd8SToby Isaac   PetscSpaceSetNumComponents - Set the number of components for this space
40420cf1dd8SToby Isaac 
40520cf1dd8SToby Isaac   Input Parameters:
406*dce8aebaSBarry Smith + sp - The `PetscSpace`
40720cf1dd8SToby Isaac - order - The number of components
40820cf1dd8SToby Isaac 
40920cf1dd8SToby Isaac   Level: intermediate
41020cf1dd8SToby Isaac 
411*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetNumComponents()`, `PetscSpaceSetNumVariables()`, `PetscSpaceCreate()`, `PetscSpace`
41220cf1dd8SToby Isaac @*/
413d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc)
414d71ae5a4SJacob Faibussowitsch {
41520cf1dd8SToby Isaac   PetscFunctionBegin;
41620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
41720cf1dd8SToby Isaac   sp->Nc = Nc;
41820cf1dd8SToby Isaac   PetscFunctionReturn(0);
41920cf1dd8SToby Isaac }
42020cf1dd8SToby Isaac 
42129b5c115SMatthew G. Knepley /*@
42229b5c115SMatthew G. Knepley   PetscSpaceSetNumVariables - Set the number of variables for this space
42329b5c115SMatthew G. Knepley 
42429b5c115SMatthew G. Knepley   Input Parameters:
425*dce8aebaSBarry Smith + sp - The `PetscSpace`
42629b5c115SMatthew G. Knepley - n - The number of variables, e.g. x, y, z...
42729b5c115SMatthew G. Knepley 
42829b5c115SMatthew G. Knepley   Level: intermediate
42929b5c115SMatthew G. Knepley 
430*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetNumVariables()`, `PetscSpaceSetNumComponents()`, `PetscSpaceCreate()`, `PetscSpace`
43129b5c115SMatthew G. Knepley @*/
432d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
433d71ae5a4SJacob Faibussowitsch {
43420cf1dd8SToby Isaac   PetscFunctionBegin;
43520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
43620cf1dd8SToby Isaac   sp->Nv = n;
43720cf1dd8SToby Isaac   PetscFunctionReturn(0);
43820cf1dd8SToby Isaac }
43920cf1dd8SToby Isaac 
44029b5c115SMatthew G. Knepley /*@
44129b5c115SMatthew G. Knepley   PetscSpaceGetNumVariables - Return the number of variables for this space
44229b5c115SMatthew G. Knepley 
44329b5c115SMatthew G. Knepley   Input Parameter:
444*dce8aebaSBarry Smith . sp - The `PetscSpace`
44529b5c115SMatthew G. Knepley 
44629b5c115SMatthew G. Knepley   Output Parameter:
44729b5c115SMatthew G. Knepley . Nc - The number of variables, e.g. x, y, z...
44829b5c115SMatthew G. Knepley 
44929b5c115SMatthew G. Knepley   Level: intermediate
45029b5c115SMatthew G. Knepley 
451*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetNumVariables()`, `PetscSpaceGetNumComponents()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
45229b5c115SMatthew G. Knepley @*/
453d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
454d71ae5a4SJacob Faibussowitsch {
45520cf1dd8SToby Isaac   PetscFunctionBegin;
45620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
457dadcf809SJacob Faibussowitsch   PetscValidIntPointer(n, 2);
45820cf1dd8SToby Isaac   *n = sp->Nv;
45920cf1dd8SToby Isaac   PetscFunctionReturn(0);
46020cf1dd8SToby Isaac }
46120cf1dd8SToby Isaac 
46220cf1dd8SToby Isaac /*@C
46320cf1dd8SToby Isaac   PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
46420cf1dd8SToby Isaac 
46520cf1dd8SToby Isaac   Input Parameters:
466*dce8aebaSBarry Smith + sp      - The `PetscSpace`
46720cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates
46820cf1dd8SToby Isaac - points  - The point coordinates
46920cf1dd8SToby Isaac 
47020cf1dd8SToby Isaac   Output Parameters:
47120cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array
47220cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array
47320cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array
47420cf1dd8SToby Isaac 
47529b5c115SMatthew G. Knepley   Level: beginner
47620cf1dd8SToby Isaac 
477*dce8aebaSBarry Smith   Note:
478*dce8aebaSBarry Smith   Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
479*dce8aebaSBarry Smith   on the reference cell, not in real space.
480*dce8aebaSBarry Smith 
481*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscFECreateTabulation()`, `PetscFEGetCellTabulation()`, `PetscSpaceCreate()`
48220cf1dd8SToby Isaac @*/
483d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
484d71ae5a4SJacob Faibussowitsch {
48520cf1dd8SToby Isaac   PetscFunctionBegin;
48620cf1dd8SToby Isaac   if (!npoints) PetscFunctionReturn(0);
48720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
488dadcf809SJacob Faibussowitsch   if (sp->Nv) PetscValidRealPointer(points, 3);
489dadcf809SJacob Faibussowitsch   if (B) PetscValidRealPointer(B, 4);
490dadcf809SJacob Faibussowitsch   if (D) PetscValidRealPointer(D, 5);
491dadcf809SJacob Faibussowitsch   if (H) PetscValidRealPointer(H, 6);
492dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, evaluate, npoints, points, B, D, H);
49320cf1dd8SToby Isaac   PetscFunctionReturn(0);
49420cf1dd8SToby Isaac }
49520cf1dd8SToby Isaac 
49620cf1dd8SToby Isaac /*@
49720cf1dd8SToby Isaac   PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height.
49820cf1dd8SToby Isaac 
49920cf1dd8SToby Isaac   Not collective
50020cf1dd8SToby Isaac 
50120cf1dd8SToby Isaac   Input Parameters:
50220cf1dd8SToby Isaac + sp - the PetscSpace object
50320cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired
50420cf1dd8SToby Isaac 
50520cf1dd8SToby Isaac   Output Parameter:
50620cf1dd8SToby Isaac . subsp - the subspace
50720cf1dd8SToby Isaac 
50820cf1dd8SToby Isaac   Level: advanced
50920cf1dd8SToby Isaac 
510*dce8aebaSBarry Smith   Notes:
511*dce8aebaSBarry Smith   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
512*dce8aebaSBarry Smith   pointwise values are not defined on the element boundaries), or if the implementation of `PetscSpace` does not
513*dce8aebaSBarry Smith   support extracting subspaces, then NULL is returned.
514*dce8aebaSBarry Smith 
515*dce8aebaSBarry Smith   This does not increment the reference count on the returned space, and the user should not destroy it.
516*dce8aebaSBarry Smith 
517db781477SPatrick Sanan .seealso: `PetscDualSpaceGetHeightSubspace()`, `PetscSpace`
51820cf1dd8SToby Isaac @*/
519d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
520d71ae5a4SJacob Faibussowitsch {
52120cf1dd8SToby Isaac   PetscFunctionBegin;
52220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
52320cf1dd8SToby Isaac   PetscValidPointer(subsp, 3);
52420cf1dd8SToby Isaac   *subsp = NULL;
525dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, getheightsubspace, height, subsp);
52620cf1dd8SToby Isaac   PetscFunctionReturn(0);
52720cf1dd8SToby Isaac }
528