xref: /petsc/src/dm/dt/space/interface/space.c (revision ffeef943c8ee50edff320d8a3135bb0c94853e4c)
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
10dce8aebaSBarry Smith   PetscSpaceRegister - Adds a new `PetscSpace` implementation
1120cf1dd8SToby Isaac 
12cc4c1da9SBarry Smith   Not Collective, No Fortran Support
1320cf1dd8SToby Isaac 
1420cf1dd8SToby Isaac   Input Parameters:
1560225df5SJacob Faibussowitsch + sname    - The name of a new user-defined creation routine
1660225df5SJacob Faibussowitsch - function - The creation routine for the implementation type
1720cf1dd8SToby Isaac 
1860225df5SJacob Faibussowitsch   Example 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 
35dce8aebaSBarry Smith   Note:
36dce8aebaSBarry Smith   `PetscSpaceRegister()` may be called multiple times to add several user-defined types of `PetscSpace`.  The creation function is called
37dce8aebaSBarry Smith   when the type is set to 'name'.
3820cf1dd8SToby Isaac 
39dce8aebaSBarry 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));
453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4620cf1dd8SToby Isaac }
4720cf1dd8SToby Isaac 
48cc4c1da9SBarry Smith /*@
49dce8aebaSBarry Smith   PetscSpaceSetType - Builds a particular `PetscSpace`
5020cf1dd8SToby Isaac 
5120f4b53cSBarry Smith   Collective
5220cf1dd8SToby Isaac 
5320cf1dd8SToby Isaac   Input Parameters:
54dce8aebaSBarry Smith + sp   - The `PetscSpace` object
5520cf1dd8SToby Isaac - name - The kind of space
5620cf1dd8SToby Isaac 
5720cf1dd8SToby Isaac   Options Database Key:
58dce8aebaSBarry Smith . -petscspace_type <type> - Sets the `PetscSpace` type; use -help for a list of available types
5920cf1dd8SToby Isaac 
6020cf1dd8SToby Isaac   Level: intermediate
6120cf1dd8SToby Isaac 
62dce8aebaSBarry 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));
723ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
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));
843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8520cf1dd8SToby Isaac }
8620cf1dd8SToby Isaac 
87cc4c1da9SBarry Smith /*@
88dce8aebaSBarry Smith   PetscSpaceGetType - Gets the `PetscSpaceType` (as a string) from the object.
8920cf1dd8SToby Isaac 
9020cf1dd8SToby Isaac   Not Collective
9120cf1dd8SToby Isaac 
9220cf1dd8SToby Isaac   Input Parameter:
93dce8aebaSBarry Smith . sp - The `PetscSpace`
9420cf1dd8SToby Isaac 
9520cf1dd8SToby Isaac   Output Parameter:
96dce8aebaSBarry Smith . name - The `PetscSpace` type name
9720cf1dd8SToby Isaac 
9820cf1dd8SToby Isaac   Level: intermediate
9920cf1dd8SToby Isaac 
100dce8aebaSBarry 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);
1064f572ea9SToby Isaac   PetscAssertPointer(name, 2);
10748a46eb9SPierre Jolivet   if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll());
10820cf1dd8SToby Isaac   *name = ((PetscObject)sp)->type_name;
1093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11020cf1dd8SToby Isaac }
11120cf1dd8SToby Isaac 
112*ffeef943SBarry Smith /*@
113dce8aebaSBarry Smith   PetscSpaceViewFromOptions - View a `PetscSpace` based on values in the options database
114fe2efc57SMark 
11520f4b53cSBarry Smith   Collective
116fe2efc57SMark 
117fe2efc57SMark   Input Parameters:
11820f4b53cSBarry Smith + A    - the `PetscSpace` object
119dce8aebaSBarry Smith . obj  - Optional object that provides the options name prefix
120dce8aebaSBarry Smith - name - command line option name
121fe2efc57SMark 
122fe2efc57SMark   Level: intermediate
12320f4b53cSBarry Smith 
124dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`, `PetscObjectViewFromOptions()`, `PetscSpaceCreate()`
125fe2efc57SMark @*/
126d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A, PetscObject obj, const char name[])
127d71ae5a4SJacob Faibussowitsch {
128fe2efc57SMark   PetscFunctionBegin;
129fe2efc57SMark   PetscValidHeaderSpecific(A, PETSCSPACE_CLASSID, 1);
1309566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
1313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
132fe2efc57SMark }
133fe2efc57SMark 
134*ffeef943SBarry Smith /*@
135dce8aebaSBarry Smith   PetscSpaceView - Views a `PetscSpace`
13620cf1dd8SToby Isaac 
13720f4b53cSBarry Smith   Collective
13820cf1dd8SToby Isaac 
139d8d19677SJose E. Roman   Input Parameters:
140dce8aebaSBarry Smith + sp - the `PetscSpace` object to view
14120cf1dd8SToby Isaac - v  - the viewer
14220cf1dd8SToby Isaac 
14329b5c115SMatthew G. Knepley   Level: beginner
14420cf1dd8SToby Isaac 
145dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscViewer`, `PetscSpaceViewFromOptions()`, `PetscSpaceDestroy()`
14620cf1dd8SToby Isaac @*/
147d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
148d71ae5a4SJacob Faibussowitsch {
1490aec8e07SMatthew G. Knepley   PetscInt  pdim;
15020cf1dd8SToby Isaac   PetscBool iascii;
15120cf1dd8SToby Isaac 
15220cf1dd8SToby Isaac   PetscFunctionBegin;
15320cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
15420cf1dd8SToby Isaac   if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
1559566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)sp), &v));
1569566063dSJacob Faibussowitsch   PetscCall(PetscSpaceGetDimension(sp, &pdim));
1579566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)sp, v));
1589566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii));
1599566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(v));
16063a3b9bcSJacob Faibussowitsch   if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Space in %" PetscInt_FMT " variables with %" PetscInt_FMT " components, size %" PetscInt_FMT "\n", sp->Nv, sp->Nc, pdim));
161dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, view, v);
1629566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(v));
1633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
16420cf1dd8SToby Isaac }
16520cf1dd8SToby Isaac 
16620cf1dd8SToby Isaac /*@
167dce8aebaSBarry Smith   PetscSpaceSetFromOptions - sets parameters in a `PetscSpace` from the options database
16820cf1dd8SToby Isaac 
16920f4b53cSBarry Smith   Collective
17020cf1dd8SToby Isaac 
17120cf1dd8SToby Isaac   Input Parameter:
172dce8aebaSBarry Smith . sp - the `PetscSpace` object to set options for
17320cf1dd8SToby Isaac 
174dce8aebaSBarry Smith   Options Database Keys:
1758f2aacc6SMatthew G. Knepley + -petscspace_degree <deg>   - the approximation order of the space
1768f2aacc6SMatthew G. Knepley . -petscspace_variables <n>  - the number of different variables, e.g. x and y
1778f2aacc6SMatthew G. Knepley - -petscspace_components <c> - the number of components, say d for a vector field
17820cf1dd8SToby Isaac 
17929b5c115SMatthew G. Knepley   Level: intermediate
18020cf1dd8SToby Isaac 
181dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`
18220cf1dd8SToby Isaac @*/
183d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
184d71ae5a4SJacob Faibussowitsch {
18520cf1dd8SToby Isaac   const char *defaultType;
18620cf1dd8SToby Isaac   char        name[256];
1875a856986SBarry Smith   PetscBool   flg;
18820cf1dd8SToby Isaac 
18920cf1dd8SToby Isaac   PetscFunctionBegin;
19020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
19120cf1dd8SToby Isaac   if (!((PetscObject)sp)->type_name) {
19220cf1dd8SToby Isaac     defaultType = PETSCSPACEPOLYNOMIAL;
19320cf1dd8SToby Isaac   } else {
19420cf1dd8SToby Isaac     defaultType = ((PetscObject)sp)->type_name;
19520cf1dd8SToby Isaac   }
1969566063dSJacob Faibussowitsch   if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll());
19720cf1dd8SToby Isaac 
198d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)sp);
1999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg));
20020cf1dd8SToby Isaac   if (flg) {
2019566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetType(sp, name));
20220cf1dd8SToby Isaac   } else if (!((PetscObject)sp)->type_name) {
2039566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetType(sp, defaultType));
20420cf1dd8SToby Isaac   }
2057be5e748SToby Isaac   {
2069566063dSJacob Faibussowitsch     PetscCall(PetscOptionsDeprecated("-petscspace_order", "-petscspace_degree", "3.11", NULL));
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));
2106c2660fcSDarsh Nathawani   PetscCall(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL, -1));
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"));
2163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21720cf1dd8SToby Isaac }
21820cf1dd8SToby Isaac 
219cc4c1da9SBarry Smith /*@
220dce8aebaSBarry Smith   PetscSpaceSetUp - Construct data structures for the `PetscSpace`
22120cf1dd8SToby Isaac 
22220f4b53cSBarry Smith   Collective
22320cf1dd8SToby Isaac 
22420cf1dd8SToby Isaac   Input Parameter:
225dce8aebaSBarry Smith . sp - the `PetscSpace` object to setup
22620cf1dd8SToby Isaac 
22729b5c115SMatthew G. Knepley   Level: intermediate
22820cf1dd8SToby Isaac 
229dce8aebaSBarry 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);
2363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23720cf1dd8SToby Isaac }
23820cf1dd8SToby Isaac 
23920cf1dd8SToby Isaac /*@
240dce8aebaSBarry Smith   PetscSpaceDestroy - Destroys a `PetscSpace` object
24120cf1dd8SToby Isaac 
24220f4b53cSBarry Smith   Collective
24320cf1dd8SToby Isaac 
24420cf1dd8SToby Isaac   Input Parameter:
24520f4b53cSBarry Smith . sp - the `PetscSpace` object to destroy
24620cf1dd8SToby Isaac 
24729b5c115SMatthew G. Knepley   Level: beginner
24820cf1dd8SToby Isaac 
249dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceCreate()`
25020cf1dd8SToby Isaac @*/
251d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
252d71ae5a4SJacob Faibussowitsch {
25320cf1dd8SToby Isaac   PetscFunctionBegin;
2543ba16761SJacob Faibussowitsch   if (!*sp) PetscFunctionReturn(PETSC_SUCCESS);
255f4f49eeaSPierre Jolivet   PetscValidHeaderSpecific(*sp, PETSCSPACE_CLASSID, 1);
25620cf1dd8SToby Isaac 
257f4f49eeaSPierre Jolivet   if (--((PetscObject)*sp)->refct > 0) {
2589371c9d4SSatish Balay     *sp = NULL;
2593ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
2609371c9d4SSatish Balay   }
261f4f49eeaSPierre Jolivet   ((PetscObject)*sp)->refct = 0;
2629566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&(*sp)->dm));
26320cf1dd8SToby Isaac 
2649927e4dfSBarry Smith   PetscUseTypeMethod(*sp, destroy);
2659566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(sp));
2663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
26720cf1dd8SToby Isaac }
26820cf1dd8SToby Isaac 
26920cf1dd8SToby Isaac /*@
270dce8aebaSBarry 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:
275dce8aebaSBarry Smith . comm - The communicator for the `PetscSpace` object
27620cf1dd8SToby Isaac 
27720cf1dd8SToby Isaac   Output Parameter:
278dce8aebaSBarry Smith . sp - The `PetscSpace` object
27920cf1dd8SToby Isaac 
28020cf1dd8SToby Isaac   Level: beginner
28120cf1dd8SToby Isaac 
282dce8aebaSBarry 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;
2894f572ea9SToby Isaac   PetscAssertPointer(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;
3053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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:
312dce8aebaSBarry Smith . sp - The `PetscSpace`
31320cf1dd8SToby Isaac 
31420cf1dd8SToby Isaac   Output Parameter:
31520cf1dd8SToby Isaac . dim - The dimension
31620cf1dd8SToby Isaac 
31720cf1dd8SToby Isaac   Level: intermediate
31820cf1dd8SToby Isaac 
31960225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceGetDegree()`, `PetscSpaceCreate()`
32020cf1dd8SToby Isaac @*/
321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
322d71ae5a4SJacob Faibussowitsch {
32320cf1dd8SToby Isaac   PetscFunctionBegin;
32420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
3254f572ea9SToby Isaac   PetscAssertPointer(dim, 2);
326ad540459SPierre Jolivet   if (sp->dim == PETSC_DETERMINE) PetscTryTypeMethod(sp, getdimension, &sp->dim);
32743bfef1cSToby Isaac   *dim = sp->dim;
3283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
32920cf1dd8SToby Isaac }
33020cf1dd8SToby Isaac 
33120cf1dd8SToby Isaac /*@
33220cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
33320cf1dd8SToby Isaac 
33420cf1dd8SToby Isaac   Input Parameter:
335dce8aebaSBarry 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 
34360225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceSetDegree()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`
34420cf1dd8SToby Isaac @*/
345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
346d71ae5a4SJacob Faibussowitsch {
34720cf1dd8SToby Isaac   PetscFunctionBegin;
34820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
3494f572ea9SToby Isaac   if (minDegree) PetscAssertPointer(minDegree, 2);
3504f572ea9SToby Isaac   if (maxDegree) PetscAssertPointer(maxDegree, 3);
35120cf1dd8SToby Isaac   if (minDegree) *minDegree = sp->degree;
352f5a02b64SToby Isaac   if (maxDegree) *maxDegree = sp->maxDegree;
3533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
35420cf1dd8SToby Isaac }
35520cf1dd8SToby Isaac 
35620cf1dd8SToby Isaac /*@
35720cf1dd8SToby Isaac   PetscSpaceSetDegree - Set the degree of approximation for this space.
35820cf1dd8SToby Isaac 
35920cf1dd8SToby Isaac   Input Parameters:
360dce8aebaSBarry Smith + sp        - The `PetscSpace`
361d39dd5f5SToby Isaac . degree    - The degree of the largest polynomial space contained in the space
362dce8aebaSBarry 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 
36660225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceGetDegree()`, `PetscSpaceCreate()`
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;
3743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
37520cf1dd8SToby Isaac }
37620cf1dd8SToby Isaac 
37720cf1dd8SToby Isaac /*@
37820cf1dd8SToby Isaac   PetscSpaceGetNumComponents - Return the number of components for this space
37920cf1dd8SToby Isaac 
38020cf1dd8SToby Isaac   Input Parameter:
381dce8aebaSBarry 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 
388dce8aebaSBarry Smith   Note:
389dce8aebaSBarry Smith   A vector space, for example, will have d components, where d is the spatial dimension
390dce8aebaSBarry Smith 
39160225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceSetNumComponents()`, `PetscSpaceGetNumVariables()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`
39220cf1dd8SToby Isaac @*/
393d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
394d71ae5a4SJacob Faibussowitsch {
39520cf1dd8SToby Isaac   PetscFunctionBegin;
39620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
3974f572ea9SToby Isaac   PetscAssertPointer(Nc, 2);
39820cf1dd8SToby Isaac   *Nc = sp->Nc;
3993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
40020cf1dd8SToby Isaac }
40120cf1dd8SToby Isaac 
40220cf1dd8SToby Isaac /*@
40320cf1dd8SToby Isaac   PetscSpaceSetNumComponents - Set the number of components for this space
40420cf1dd8SToby Isaac 
40520cf1dd8SToby Isaac   Input Parameters:
406dce8aebaSBarry Smith + sp - The `PetscSpace`
40760225df5SJacob Faibussowitsch - Nc - The number of components
40820cf1dd8SToby Isaac 
40920cf1dd8SToby Isaac   Level: intermediate
41020cf1dd8SToby Isaac 
41160225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceGetNumComponents()`, `PetscSpaceSetNumVariables()`, `PetscSpaceCreate()`
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;
4183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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:
425dce8aebaSBarry 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 
43060225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceGetNumVariables()`, `PetscSpaceSetNumComponents()`, `PetscSpaceCreate()`
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;
4373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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:
444dce8aebaSBarry Smith . sp - The `PetscSpace`
44529b5c115SMatthew G. Knepley 
44629b5c115SMatthew G. Knepley   Output Parameter:
44760225df5SJacob Faibussowitsch . n - The number of variables, e.g. x, y, z...
44829b5c115SMatthew G. Knepley 
44929b5c115SMatthew G. Knepley   Level: intermediate
45029b5c115SMatthew G. Knepley 
45160225df5SJacob Faibussowitsch .seealso: `PetscSpace`, `PetscSpaceSetNumVariables()`, `PetscSpaceGetNumComponents()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`
45229b5c115SMatthew G. Knepley @*/
453d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
454d71ae5a4SJacob Faibussowitsch {
45520cf1dd8SToby Isaac   PetscFunctionBegin;
45620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
4574f572ea9SToby Isaac   PetscAssertPointer(n, 2);
45820cf1dd8SToby Isaac   *n = sp->Nv;
4593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
46020cf1dd8SToby Isaac }
46120cf1dd8SToby Isaac 
462cc4c1da9SBarry Smith /*@
46320cf1dd8SToby Isaac   PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
46420cf1dd8SToby Isaac 
46520cf1dd8SToby Isaac   Input Parameters:
466dce8aebaSBarry 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:
471a3b724e8SBarry Smith + B - The function evaluations in a `npoints` x `nfuncs` array
472a3b724e8SBarry Smith . D - The derivative evaluations in a `npoints` x `nfuncs` x `dim` array
473a3b724e8SBarry Smith - H - The second derivative evaluations in a `npoints` x `nfuncs` x `dim` x `dim` array
47420cf1dd8SToby Isaac 
47529b5c115SMatthew G. Knepley   Level: beginner
47620cf1dd8SToby Isaac 
477dce8aebaSBarry Smith   Note:
478a3b724e8SBarry Smith   Above `nfuncs` is the dimension of the space, and `dim` is the spatial dimension. The coordinates are given
479dce8aebaSBarry Smith   on the reference cell, not in real space.
480dce8aebaSBarry Smith 
481dce8aebaSBarry 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;
4863ba16761SJacob Faibussowitsch   if (!npoints) PetscFunctionReturn(PETSC_SUCCESS);
48720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
4884f572ea9SToby Isaac   if (sp->Nv) PetscAssertPointer(points, 3);
4894f572ea9SToby Isaac   if (B) PetscAssertPointer(B, 4);
4904f572ea9SToby Isaac   if (D) PetscAssertPointer(D, 5);
4914f572ea9SToby Isaac   if (H) PetscAssertPointer(H, 6);
492dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, evaluate, npoints, points, B, D, H);
4933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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 
49920f4b53cSBarry Smith   Not Collective
50020cf1dd8SToby Isaac 
50120cf1dd8SToby Isaac   Input Parameters:
50220f4b53cSBarry Smith + 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 
510dce8aebaSBarry Smith   Notes:
511dce8aebaSBarry Smith   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
512dce8aebaSBarry Smith   pointwise values are not defined on the element boundaries), or if the implementation of `PetscSpace` does not
513dce8aebaSBarry Smith   support extracting subspaces, then NULL is returned.
514dce8aebaSBarry Smith 
515dce8aebaSBarry Smith   This does not increment the reference count on the returned space, and the user should not destroy it.
516dce8aebaSBarry 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);
5234f572ea9SToby Isaac   PetscAssertPointer(subsp, 3);
52420cf1dd8SToby Isaac   *subsp = NULL;
525dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, getheightsubspace, height, subsp);
5263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
52720cf1dd8SToby Isaac }
528