xref: /petsc/src/dm/dt/space/interface/space.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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
1020cf1dd8SToby Isaac   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   Notes:
1920cf1dd8SToby Isaac   PetscSpaceRegister() may be called multiple times to add several user-defined types of PetscSpaces.  The creation function is called
2020cf1dd8SToby Isaac   when the type is set to 'name'.
2120cf1dd8SToby Isaac 
2220cf1dd8SToby Isaac   Sample usage:
2320cf1dd8SToby Isaac .vb
2420cf1dd8SToby Isaac     PetscSpaceRegister("my_space", MyPetscSpaceCreate);
2520cf1dd8SToby Isaac .ve
2620cf1dd8SToby Isaac 
2720cf1dd8SToby Isaac   Then, your PetscSpace type can be chosen with the procedural interface via
2820cf1dd8SToby Isaac .vb
2920cf1dd8SToby Isaac     PetscSpaceCreate(MPI_Comm, PetscSpace *);
3020cf1dd8SToby Isaac     PetscSpaceSetType(PetscSpace, "my_space");
3120cf1dd8SToby Isaac .ve
3220cf1dd8SToby Isaac    or at runtime via the option
3320cf1dd8SToby Isaac .vb
3420cf1dd8SToby Isaac     -petscspace_type my_space
3520cf1dd8SToby Isaac .ve
3620cf1dd8SToby Isaac 
3720cf1dd8SToby Isaac   Level: advanced
3820cf1dd8SToby Isaac 
39db781477SPatrick Sanan .seealso: `PetscSpaceRegisterAll()`, `PetscSpaceRegisterDestroy()`
4020cf1dd8SToby Isaac 
4120cf1dd8SToby Isaac @*/
42*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace))
43*d71ae5a4SJacob Faibussowitsch {
4420cf1dd8SToby Isaac   PetscFunctionBegin;
459566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscSpaceList, sname, function));
4620cf1dd8SToby Isaac   PetscFunctionReturn(0);
4720cf1dd8SToby Isaac }
4820cf1dd8SToby Isaac 
4920cf1dd8SToby Isaac /*@C
5020cf1dd8SToby Isaac   PetscSpaceSetType - Builds a particular PetscSpace
5120cf1dd8SToby Isaac 
52d083f849SBarry Smith   Collective on sp
5320cf1dd8SToby Isaac 
5420cf1dd8SToby Isaac   Input Parameters:
5520cf1dd8SToby Isaac + sp   - The PetscSpace object
5620cf1dd8SToby Isaac - name - The kind of space
5720cf1dd8SToby Isaac 
5820cf1dd8SToby Isaac   Options Database Key:
5920cf1dd8SToby Isaac . -petscspace_type <type> - Sets the PetscSpace type; use -help for a list of available types
6020cf1dd8SToby Isaac 
6120cf1dd8SToby Isaac   Level: intermediate
6220cf1dd8SToby Isaac 
63db781477SPatrick Sanan .seealso: `PetscSpaceGetType()`, `PetscSpaceCreate()`
6420cf1dd8SToby Isaac @*/
65*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name)
66*d71ae5a4SJacob Faibussowitsch {
6720cf1dd8SToby Isaac   PetscErrorCode (*r)(PetscSpace);
6820cf1dd8SToby Isaac   PetscBool match;
6920cf1dd8SToby Isaac 
7020cf1dd8SToby Isaac   PetscFunctionBegin;
7120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
729566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)sp, name, &match));
7320cf1dd8SToby Isaac   if (match) PetscFunctionReturn(0);
7420cf1dd8SToby Isaac 
759566063dSJacob Faibussowitsch   PetscCall(PetscSpaceRegisterAll());
769566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscSpaceList, name, &r));
772c71b3e2SJacob Faibussowitsch   PetscCheck(r, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name);
7820cf1dd8SToby Isaac 
79dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, destroy);
8020cf1dd8SToby Isaac   sp->ops->destroy = NULL;
81dbbe0bcdSBarry Smith 
8243bfef1cSToby Isaac   sp->dim = PETSC_DETERMINE;
839566063dSJacob Faibussowitsch   PetscCall((*r)(sp));
849566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)sp, name));
8520cf1dd8SToby Isaac   PetscFunctionReturn(0);
8620cf1dd8SToby Isaac }
8720cf1dd8SToby Isaac 
8820cf1dd8SToby Isaac /*@C
8920cf1dd8SToby Isaac   PetscSpaceGetType - Gets the PetscSpace type name (as a string) from the object.
9020cf1dd8SToby Isaac 
9120cf1dd8SToby Isaac   Not Collective
9220cf1dd8SToby Isaac 
9320cf1dd8SToby Isaac   Input Parameter:
9420cf1dd8SToby Isaac . sp  - The PetscSpace
9520cf1dd8SToby Isaac 
9620cf1dd8SToby Isaac   Output Parameter:
9720cf1dd8SToby Isaac . name - The PetscSpace type name
9820cf1dd8SToby Isaac 
9920cf1dd8SToby Isaac   Level: intermediate
10020cf1dd8SToby Isaac 
101db781477SPatrick Sanan .seealso: `PetscSpaceSetType()`, `PetscSpaceCreate()`
10220cf1dd8SToby Isaac @*/
103*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
104*d71ae5a4SJacob Faibussowitsch {
10520cf1dd8SToby Isaac   PetscFunctionBegin;
10620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
10720cf1dd8SToby Isaac   PetscValidPointer(name, 2);
10848a46eb9SPierre Jolivet   if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll());
10920cf1dd8SToby Isaac   *name = ((PetscObject)sp)->type_name;
11020cf1dd8SToby Isaac   PetscFunctionReturn(0);
11120cf1dd8SToby Isaac }
11220cf1dd8SToby Isaac 
11320cf1dd8SToby Isaac /*@C
114fe2efc57SMark    PetscSpaceViewFromOptions - View from Options
115fe2efc57SMark 
116fe2efc57SMark    Collective on PetscSpace
117fe2efc57SMark 
118fe2efc57SMark    Input Parameters:
119fe2efc57SMark +  A - the PetscSpace object
120736c3998SJose E. Roman .  obj - Optional object
121736c3998SJose E. Roman -  name - command line option
122fe2efc57SMark 
123fe2efc57SMark    Level: intermediate
124db781477SPatrick Sanan .seealso: `PetscSpace`, `PetscSpaceView`, `PetscObjectViewFromOptions()`, `PetscSpaceCreate()`
125fe2efc57SMark @*/
126*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A, PetscObject obj, const char name[])
127*d71ae5a4SJacob Faibussowitsch {
128fe2efc57SMark   PetscFunctionBegin;
129fe2efc57SMark   PetscValidHeaderSpecific(A, PETSCSPACE_CLASSID, 1);
1309566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
131fe2efc57SMark   PetscFunctionReturn(0);
132fe2efc57SMark }
133fe2efc57SMark 
134fe2efc57SMark /*@C
13520cf1dd8SToby Isaac   PetscSpaceView - Views a PetscSpace
13620cf1dd8SToby Isaac 
137d083f849SBarry Smith   Collective on sp
13820cf1dd8SToby Isaac 
139d8d19677SJose E. Roman   Input Parameters:
14020cf1dd8SToby Isaac + sp - the PetscSpace object to view
14120cf1dd8SToby Isaac - v  - the viewer
14220cf1dd8SToby Isaac 
14329b5c115SMatthew G. Knepley   Level: beginner
14420cf1dd8SToby Isaac 
145db781477SPatrick Sanan .seealso `PetscSpaceDestroy()`
14620cf1dd8SToby Isaac @*/
147*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
148*d71ae5a4SJacob 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));
16320cf1dd8SToby Isaac   PetscFunctionReturn(0);
16420cf1dd8SToby Isaac }
16520cf1dd8SToby Isaac 
16620cf1dd8SToby Isaac /*@
16720cf1dd8SToby Isaac   PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database
16820cf1dd8SToby Isaac 
169d083f849SBarry Smith   Collective on sp
17020cf1dd8SToby Isaac 
17120cf1dd8SToby Isaac   Input Parameter:
17220cf1dd8SToby Isaac . sp - the PetscSpace object to set options for
17320cf1dd8SToby Isaac 
17420cf1dd8SToby Isaac   Options Database:
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 
181db781477SPatrick Sanan .seealso `PetscSpaceView()`
18220cf1dd8SToby Isaac @*/
183*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
184*d71ae5a4SJacob 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));
2079566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0));
2087be5e748SToby Isaac   }
2099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0));
2109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL, 0));
2119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL, 0));
212dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, setfromoptions, PetscOptionsObject);
21320cf1dd8SToby Isaac   /* process any options handlers added with PetscObjectAddOptionsHandler() */
214dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)sp, PetscOptionsObject));
215d0609cedSBarry Smith   PetscOptionsEnd();
2169566063dSJacob Faibussowitsch   PetscCall(PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view"));
21720cf1dd8SToby Isaac   PetscFunctionReturn(0);
21820cf1dd8SToby Isaac }
21920cf1dd8SToby Isaac 
22020cf1dd8SToby Isaac /*@C
22120cf1dd8SToby Isaac   PetscSpaceSetUp - Construct data structures for the PetscSpace
22220cf1dd8SToby Isaac 
223d083f849SBarry Smith   Collective on sp
22420cf1dd8SToby Isaac 
22520cf1dd8SToby Isaac   Input Parameter:
22620cf1dd8SToby Isaac . sp - the PetscSpace object to setup
22720cf1dd8SToby Isaac 
22829b5c115SMatthew G. Knepley   Level: intermediate
22920cf1dd8SToby Isaac 
230db781477SPatrick Sanan .seealso `PetscSpaceView()`, `PetscSpaceDestroy()`
23120cf1dd8SToby Isaac @*/
232*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
233*d71ae5a4SJacob Faibussowitsch {
23420cf1dd8SToby Isaac   PetscFunctionBegin;
23520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
236dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, setup);
23720cf1dd8SToby Isaac   PetscFunctionReturn(0);
23820cf1dd8SToby Isaac }
23920cf1dd8SToby Isaac 
24020cf1dd8SToby Isaac /*@
24120cf1dd8SToby Isaac   PetscSpaceDestroy - Destroys a PetscSpace object
24220cf1dd8SToby Isaac 
243d083f849SBarry Smith   Collective on sp
24420cf1dd8SToby Isaac 
24520cf1dd8SToby Isaac   Input Parameter:
24620cf1dd8SToby Isaac . sp - the PetscSpace object to destroy
24720cf1dd8SToby Isaac 
24829b5c115SMatthew G. Knepley   Level: beginner
24920cf1dd8SToby Isaac 
250db781477SPatrick Sanan .seealso `PetscSpaceView()`
25120cf1dd8SToby Isaac @*/
252*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
253*d71ae5a4SJacob Faibussowitsch {
25420cf1dd8SToby Isaac   PetscFunctionBegin;
25520cf1dd8SToby Isaac   if (!*sp) PetscFunctionReturn(0);
25620cf1dd8SToby Isaac   PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1);
25720cf1dd8SToby Isaac 
2589371c9d4SSatish Balay   if (--((PetscObject)(*sp))->refct > 0) {
2599371c9d4SSatish Balay     *sp = NULL;
2609371c9d4SSatish Balay     PetscFunctionReturn(0);
2619371c9d4SSatish Balay   }
26220cf1dd8SToby Isaac   ((PetscObject)(*sp))->refct = 0;
2639566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&(*sp)->dm));
26420cf1dd8SToby Isaac 
2659566063dSJacob Faibussowitsch   PetscCall((*(*sp)->ops->destroy)(*sp));
2669566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(sp));
26720cf1dd8SToby Isaac   PetscFunctionReturn(0);
26820cf1dd8SToby Isaac }
26920cf1dd8SToby Isaac 
27020cf1dd8SToby Isaac /*@
27120cf1dd8SToby Isaac   PetscSpaceCreate - Creates an empty PetscSpace object. The type can then be set with PetscSpaceSetType().
27220cf1dd8SToby Isaac 
273d083f849SBarry Smith   Collective
27420cf1dd8SToby Isaac 
27520cf1dd8SToby Isaac   Input Parameter:
27620cf1dd8SToby Isaac . comm - The communicator for the PetscSpace object
27720cf1dd8SToby Isaac 
27820cf1dd8SToby Isaac   Output Parameter:
27920cf1dd8SToby Isaac . sp - The PetscSpace object
28020cf1dd8SToby Isaac 
28120cf1dd8SToby Isaac   Level: beginner
28220cf1dd8SToby Isaac 
283db781477SPatrick Sanan .seealso: `PetscSpaceSetType()`, `PETSCSPACEPOLYNOMIAL`
28420cf1dd8SToby Isaac @*/
285*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
286*d71ae5a4SJacob Faibussowitsch {
28720cf1dd8SToby Isaac   PetscSpace s;
28820cf1dd8SToby Isaac 
28920cf1dd8SToby Isaac   PetscFunctionBegin;
29020cf1dd8SToby Isaac   PetscValidPointer(sp, 2);
2919566063dSJacob Faibussowitsch   PetscCall(PetscCitationsRegister(FECitation, &FEcite));
29220cf1dd8SToby Isaac   *sp = NULL;
2939566063dSJacob Faibussowitsch   PetscCall(PetscFEInitializePackage());
29420cf1dd8SToby Isaac 
2959566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView));
29620cf1dd8SToby Isaac 
29720cf1dd8SToby Isaac   s->degree    = 0;
29843bfef1cSToby Isaac   s->maxDegree = PETSC_DETERMINE;
29920cf1dd8SToby Isaac   s->Nc        = 1;
30020cf1dd8SToby Isaac   s->Nv        = 0;
30143bfef1cSToby Isaac   s->dim       = PETSC_DETERMINE;
3029566063dSJacob Faibussowitsch   PetscCall(DMShellCreate(comm, &s->dm));
3039566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL));
30420cf1dd8SToby Isaac 
30520cf1dd8SToby Isaac   *sp = s;
30620cf1dd8SToby Isaac   PetscFunctionReturn(0);
30720cf1dd8SToby Isaac }
30820cf1dd8SToby Isaac 
30920cf1dd8SToby Isaac /*@
31020cf1dd8SToby Isaac   PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors
31120cf1dd8SToby Isaac 
31220cf1dd8SToby Isaac   Input Parameter:
31320cf1dd8SToby Isaac . sp - The PetscSpace
31420cf1dd8SToby Isaac 
31520cf1dd8SToby Isaac   Output Parameter:
31620cf1dd8SToby Isaac . dim - The dimension
31720cf1dd8SToby Isaac 
31820cf1dd8SToby Isaac   Level: intermediate
31920cf1dd8SToby Isaac 
320db781477SPatrick Sanan .seealso: `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace`
32120cf1dd8SToby Isaac @*/
322*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
323*d71ae5a4SJacob Faibussowitsch {
32420cf1dd8SToby Isaac   PetscFunctionBegin;
32520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
326dadcf809SJacob Faibussowitsch   PetscValidIntPointer(dim, 2);
327ad540459SPierre Jolivet   if (sp->dim == PETSC_DETERMINE) PetscTryTypeMethod(sp, getdimension, &sp->dim);
32843bfef1cSToby Isaac   *dim = sp->dim;
32920cf1dd8SToby Isaac   PetscFunctionReturn(0);
33020cf1dd8SToby Isaac }
33120cf1dd8SToby Isaac 
33220cf1dd8SToby Isaac /*@
33320cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
33420cf1dd8SToby Isaac 
33520cf1dd8SToby Isaac   Input Parameter:
33620cf1dd8SToby Isaac . sp - The PetscSpace
33720cf1dd8SToby Isaac 
338d8d19677SJose E. Roman   Output Parameters:
33920cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space
34020cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space
34120cf1dd8SToby Isaac 
34220cf1dd8SToby Isaac   Level: intermediate
34320cf1dd8SToby Isaac 
344db781477SPatrick Sanan .seealso: `PetscSpaceSetDegree()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
34520cf1dd8SToby Isaac @*/
346*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
347*d71ae5a4SJacob Faibussowitsch {
34820cf1dd8SToby Isaac   PetscFunctionBegin;
34920cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
350dadcf809SJacob Faibussowitsch   if (minDegree) PetscValidIntPointer(minDegree, 2);
351dadcf809SJacob Faibussowitsch   if (maxDegree) PetscValidIntPointer(maxDegree, 3);
35220cf1dd8SToby Isaac   if (minDegree) *minDegree = sp->degree;
353f5a02b64SToby Isaac   if (maxDegree) *maxDegree = sp->maxDegree;
35420cf1dd8SToby Isaac   PetscFunctionReturn(0);
35520cf1dd8SToby Isaac }
35620cf1dd8SToby Isaac 
35720cf1dd8SToby Isaac /*@
35820cf1dd8SToby Isaac   PetscSpaceSetDegree - Set the degree of approximation for this space.
35920cf1dd8SToby Isaac 
36020cf1dd8SToby Isaac   Input Parameters:
36120cf1dd8SToby Isaac + sp - The PetscSpace
362d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space
363d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space.  One of degree and maxDegree can be PETSC_DETERMINE.
36420cf1dd8SToby Isaac 
36520cf1dd8SToby Isaac   Level: intermediate
36620cf1dd8SToby Isaac 
367db781477SPatrick Sanan .seealso: `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace`
36820cf1dd8SToby Isaac @*/
369*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree)
370*d71ae5a4SJacob Faibussowitsch {
37120cf1dd8SToby Isaac   PetscFunctionBegin;
37220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
373d39dd5f5SToby Isaac   sp->degree    = degree;
374d39dd5f5SToby Isaac   sp->maxDegree = maxDegree;
37520cf1dd8SToby Isaac   PetscFunctionReturn(0);
37620cf1dd8SToby Isaac }
37720cf1dd8SToby Isaac 
37820cf1dd8SToby Isaac /*@
37920cf1dd8SToby Isaac   PetscSpaceGetNumComponents - Return the number of components for this space
38020cf1dd8SToby Isaac 
38120cf1dd8SToby Isaac   Input Parameter:
38220cf1dd8SToby Isaac . sp - The PetscSpace
38320cf1dd8SToby Isaac 
38420cf1dd8SToby Isaac   Output Parameter:
38520cf1dd8SToby Isaac . Nc - The number of components
38620cf1dd8SToby Isaac 
38720cf1dd8SToby Isaac   Note: A vector space, for example, will have d components, where d is the spatial dimension
38820cf1dd8SToby Isaac 
38920cf1dd8SToby Isaac   Level: intermediate
39020cf1dd8SToby Isaac 
391db781477SPatrick Sanan .seealso: `PetscSpaceSetNumComponents()`, `PetscSpaceGetNumVariables()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
39220cf1dd8SToby Isaac @*/
393*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
394*d71ae5a4SJacob 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:
40620cf1dd8SToby Isaac + sp - The PetscSpace
40720cf1dd8SToby Isaac - order - The number of components
40820cf1dd8SToby Isaac 
40920cf1dd8SToby Isaac   Level: intermediate
41020cf1dd8SToby Isaac 
411db781477SPatrick Sanan .seealso: `PetscSpaceGetNumComponents()`, `PetscSpaceSetNumVariables()`, `PetscSpaceCreate()`, `PetscSpace`
41220cf1dd8SToby Isaac @*/
413*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc)
414*d71ae5a4SJacob 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:
42529b5c115SMatthew G. Knepley + 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 
430db781477SPatrick Sanan .seealso: `PetscSpaceGetNumVariables()`, `PetscSpaceSetNumComponents()`, `PetscSpaceCreate()`, `PetscSpace`
43129b5c115SMatthew G. Knepley @*/
432*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
433*d71ae5a4SJacob 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:
44429b5c115SMatthew G. Knepley . 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 
451db781477SPatrick Sanan .seealso: `PetscSpaceSetNumVariables()`, `PetscSpaceGetNumComponents()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
45229b5c115SMatthew G. Knepley @*/
453*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
454*d71ae5a4SJacob 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:
46620cf1dd8SToby Isaac + 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 
47520cf1dd8SToby Isaac   Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
47620cf1dd8SToby Isaac   on the reference cell, not in real space.
47720cf1dd8SToby Isaac 
47829b5c115SMatthew G. Knepley   Level: beginner
47920cf1dd8SToby Isaac 
480db781477SPatrick Sanan .seealso: `PetscFECreateTabulation()`, `PetscFEGetCellTabulation()`, `PetscSpaceCreate()`
48120cf1dd8SToby Isaac @*/
482*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
483*d71ae5a4SJacob Faibussowitsch {
48420cf1dd8SToby Isaac   PetscFunctionBegin;
48520cf1dd8SToby Isaac   if (!npoints) PetscFunctionReturn(0);
48620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
487dadcf809SJacob Faibussowitsch   if (sp->Nv) PetscValidRealPointer(points, 3);
488dadcf809SJacob Faibussowitsch   if (B) PetscValidRealPointer(B, 4);
489dadcf809SJacob Faibussowitsch   if (D) PetscValidRealPointer(D, 5);
490dadcf809SJacob Faibussowitsch   if (H) PetscValidRealPointer(H, 6);
491dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, evaluate, npoints, points, B, D, H);
49220cf1dd8SToby Isaac   PetscFunctionReturn(0);
49320cf1dd8SToby Isaac }
49420cf1dd8SToby Isaac 
49520cf1dd8SToby Isaac /*@
49620cf1dd8SToby Isaac   PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height.
49720cf1dd8SToby Isaac 
49820cf1dd8SToby Isaac   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
49920cf1dd8SToby Isaac   pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not
50020cf1dd8SToby Isaac   support extracting subspaces, then NULL is returned.
50120cf1dd8SToby Isaac 
50220cf1dd8SToby Isaac   This does not increment the reference count on the returned space, and the user should not destroy it.
50320cf1dd8SToby Isaac 
50420cf1dd8SToby Isaac   Not collective
50520cf1dd8SToby Isaac 
50620cf1dd8SToby Isaac   Input Parameters:
50720cf1dd8SToby Isaac + sp - the PetscSpace object
50820cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired
50920cf1dd8SToby Isaac 
51020cf1dd8SToby Isaac   Output Parameter:
51120cf1dd8SToby Isaac . subsp - the subspace
51220cf1dd8SToby Isaac 
51320cf1dd8SToby Isaac   Level: advanced
51420cf1dd8SToby Isaac 
515db781477SPatrick Sanan .seealso: `PetscDualSpaceGetHeightSubspace()`, `PetscSpace`
51620cf1dd8SToby Isaac @*/
517*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
518*d71ae5a4SJacob Faibussowitsch {
51920cf1dd8SToby Isaac   PetscFunctionBegin;
52020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
52120cf1dd8SToby Isaac   PetscValidPointer(subsp, 3);
52220cf1dd8SToby Isaac   *subsp = NULL;
523dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp, getheightsubspace, height, subsp);
52420cf1dd8SToby Isaac   PetscFunctionReturn(0);
52520cf1dd8SToby Isaac }
526