xref: /petsc/src/dm/dt/space/interface/space.c (revision dbbe0bcd3f3a8fbab5a45420dc06f8387e5764c6)
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 @*/
4220cf1dd8SToby Isaac PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace))
4320cf1dd8SToby Isaac {
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 @*/
6520cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name)
6620cf1dd8SToby Isaac {
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 
79*dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp,destroy);
8020cf1dd8SToby Isaac   sp->ops->destroy = NULL;
81*dbbe0bcdSBarry 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 @*/
10320cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
10420cf1dd8SToby Isaac {
10520cf1dd8SToby Isaac   PetscFunctionBegin;
10620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
10720cf1dd8SToby Isaac   PetscValidPointer(name, 2);
10820cf1dd8SToby Isaac   if (!PetscSpaceRegisterAllCalled) {
1099566063dSJacob Faibussowitsch     PetscCall(PetscSpaceRegisterAll());
11020cf1dd8SToby Isaac   }
11120cf1dd8SToby Isaac   *name = ((PetscObject) sp)->type_name;
11220cf1dd8SToby Isaac   PetscFunctionReturn(0);
11320cf1dd8SToby Isaac }
11420cf1dd8SToby Isaac 
11520cf1dd8SToby Isaac /*@C
116fe2efc57SMark    PetscSpaceViewFromOptions - View from Options
117fe2efc57SMark 
118fe2efc57SMark    Collective on PetscSpace
119fe2efc57SMark 
120fe2efc57SMark    Input Parameters:
121fe2efc57SMark +  A - the PetscSpace object
122736c3998SJose E. Roman .  obj - Optional object
123736c3998SJose E. Roman -  name - command line option
124fe2efc57SMark 
125fe2efc57SMark    Level: intermediate
126db781477SPatrick Sanan .seealso: `PetscSpace`, `PetscSpaceView`, `PetscObjectViewFromOptions()`, `PetscSpaceCreate()`
127fe2efc57SMark @*/
128fe2efc57SMark PetscErrorCode  PetscSpaceViewFromOptions(PetscSpace A,PetscObject obj,const char name[])
129fe2efc57SMark {
130fe2efc57SMark   PetscFunctionBegin;
131fe2efc57SMark   PetscValidHeaderSpecific(A,PETSCSPACE_CLASSID,1);
1329566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name));
133fe2efc57SMark   PetscFunctionReturn(0);
134fe2efc57SMark }
135fe2efc57SMark 
136fe2efc57SMark /*@C
13720cf1dd8SToby Isaac   PetscSpaceView - Views a PetscSpace
13820cf1dd8SToby Isaac 
139d083f849SBarry Smith   Collective on sp
14020cf1dd8SToby Isaac 
141d8d19677SJose E. Roman   Input Parameters:
14220cf1dd8SToby Isaac + sp - the PetscSpace object to view
14320cf1dd8SToby Isaac - v  - the viewer
14420cf1dd8SToby Isaac 
14529b5c115SMatthew G. Knepley   Level: beginner
14620cf1dd8SToby Isaac 
147db781477SPatrick Sanan .seealso `PetscSpaceDestroy()`
14820cf1dd8SToby Isaac @*/
14920cf1dd8SToby Isaac PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
15020cf1dd8SToby Isaac {
1510aec8e07SMatthew G. Knepley   PetscInt       pdim;
15220cf1dd8SToby Isaac   PetscBool      iascii;
15320cf1dd8SToby Isaac 
15420cf1dd8SToby Isaac   PetscFunctionBegin;
15520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
15620cf1dd8SToby Isaac   if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
1579566063dSJacob Faibussowitsch   if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) sp), &v));
1589566063dSJacob Faibussowitsch   PetscCall(PetscSpaceGetDimension(sp, &pdim));
1599566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)sp,v));
1609566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii));
1619566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(v));
16263a3b9bcSJacob Faibussowitsch   if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Space in %" PetscInt_FMT " variables with %" PetscInt_FMT " components, size %" PetscInt_FMT "\n", sp->Nv, sp->Nc, pdim));
163*dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp,view, v);
1649566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(v));
16520cf1dd8SToby Isaac   PetscFunctionReturn(0);
16620cf1dd8SToby Isaac }
16720cf1dd8SToby Isaac 
16820cf1dd8SToby Isaac /*@
16920cf1dd8SToby Isaac   PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database
17020cf1dd8SToby Isaac 
171d083f849SBarry Smith   Collective on sp
17220cf1dd8SToby Isaac 
17320cf1dd8SToby Isaac   Input Parameter:
17420cf1dd8SToby Isaac . sp - the PetscSpace object to set options for
17520cf1dd8SToby Isaac 
17620cf1dd8SToby Isaac   Options Database:
1778f2aacc6SMatthew G. Knepley + -petscspace_degree <deg> - the approximation order of the space
1788f2aacc6SMatthew G. Knepley . -petscspace_variables <n> - the number of different variables, e.g. x and y
1798f2aacc6SMatthew G. Knepley - -petscspace_components <c> - the number of components, say d for a vector field
18020cf1dd8SToby Isaac 
18129b5c115SMatthew G. Knepley   Level: intermediate
18220cf1dd8SToby Isaac 
183db781477SPatrick Sanan .seealso `PetscSpaceView()`
18420cf1dd8SToby Isaac @*/
18520cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
18620cf1dd8SToby Isaac {
18720cf1dd8SToby Isaac   const char    *defaultType;
18820cf1dd8SToby Isaac   char           name[256];
1895a856986SBarry Smith   PetscBool      flg;
19020cf1dd8SToby Isaac 
19120cf1dd8SToby Isaac   PetscFunctionBegin;
19220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
19320cf1dd8SToby Isaac   if (!((PetscObject) sp)->type_name) {
19420cf1dd8SToby Isaac     defaultType = PETSCSPACEPOLYNOMIAL;
19520cf1dd8SToby Isaac   } else {
19620cf1dd8SToby Isaac     defaultType = ((PetscObject) sp)->type_name;
19720cf1dd8SToby Isaac   }
1989566063dSJacob Faibussowitsch   if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll());
19920cf1dd8SToby Isaac 
200d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject) sp);
2019566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg));
20220cf1dd8SToby Isaac   if (flg) {
2039566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetType(sp, name));
20420cf1dd8SToby Isaac   } else if (!((PetscObject) sp)->type_name) {
2059566063dSJacob Faibussowitsch     PetscCall(PetscSpaceSetType(sp, defaultType));
20620cf1dd8SToby Isaac   }
2077be5e748SToby Isaac   {
2089566063dSJacob Faibussowitsch     PetscCall(PetscOptionsDeprecated("-petscspace_order","-petscspace_degree","3.11",NULL));
2099566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0));
2107be5e748SToby Isaac   }
2119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0));
2129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL,0));
2139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL,0));
214*dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp,setfromoptions,PetscOptionsObject);
21520cf1dd8SToby Isaac   /* process any options handlers added with PetscObjectAddOptionsHandler() */
216*dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject) sp,PetscOptionsObject));
217d0609cedSBarry Smith   PetscOptionsEnd();
2189566063dSJacob Faibussowitsch   PetscCall(PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view"));
21920cf1dd8SToby Isaac   PetscFunctionReturn(0);
22020cf1dd8SToby Isaac }
22120cf1dd8SToby Isaac 
22220cf1dd8SToby Isaac /*@C
22320cf1dd8SToby Isaac   PetscSpaceSetUp - Construct data structures for the PetscSpace
22420cf1dd8SToby Isaac 
225d083f849SBarry Smith   Collective on sp
22620cf1dd8SToby Isaac 
22720cf1dd8SToby Isaac   Input Parameter:
22820cf1dd8SToby Isaac . sp - the PetscSpace object to setup
22920cf1dd8SToby Isaac 
23029b5c115SMatthew G. Knepley   Level: intermediate
23120cf1dd8SToby Isaac 
232db781477SPatrick Sanan .seealso `PetscSpaceView()`, `PetscSpaceDestroy()`
23320cf1dd8SToby Isaac @*/
23420cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
23520cf1dd8SToby Isaac {
23620cf1dd8SToby Isaac   PetscFunctionBegin;
23720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
238*dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp,setup);
23920cf1dd8SToby Isaac   PetscFunctionReturn(0);
24020cf1dd8SToby Isaac }
24120cf1dd8SToby Isaac 
24220cf1dd8SToby Isaac /*@
24320cf1dd8SToby Isaac   PetscSpaceDestroy - Destroys a PetscSpace object
24420cf1dd8SToby Isaac 
245d083f849SBarry Smith   Collective on sp
24620cf1dd8SToby Isaac 
24720cf1dd8SToby Isaac   Input Parameter:
24820cf1dd8SToby Isaac . sp - the PetscSpace object to destroy
24920cf1dd8SToby Isaac 
25029b5c115SMatthew G. Knepley   Level: beginner
25120cf1dd8SToby Isaac 
252db781477SPatrick Sanan .seealso `PetscSpaceView()`
25320cf1dd8SToby Isaac @*/
25420cf1dd8SToby Isaac PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
25520cf1dd8SToby Isaac {
25620cf1dd8SToby Isaac   PetscFunctionBegin;
25720cf1dd8SToby Isaac   if (!*sp) PetscFunctionReturn(0);
25820cf1dd8SToby Isaac   PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1);
25920cf1dd8SToby Isaac 
260ea78f98cSLisandro Dalcin   if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);}
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 /*@
27020cf1dd8SToby Isaac   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:
27520cf1dd8SToby Isaac . comm - The communicator for the PetscSpace object
27620cf1dd8SToby Isaac 
27720cf1dd8SToby Isaac   Output Parameter:
27820cf1dd8SToby Isaac . sp - The PetscSpace object
27920cf1dd8SToby Isaac 
28020cf1dd8SToby Isaac   Level: beginner
28120cf1dd8SToby Isaac 
282db781477SPatrick Sanan .seealso: `PetscSpaceSetType()`, `PETSCSPACEPOLYNOMIAL`
28320cf1dd8SToby Isaac @*/
28420cf1dd8SToby Isaac PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
28520cf1dd8SToby Isaac {
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:
31220cf1dd8SToby Isaac . sp - The PetscSpace
31320cf1dd8SToby Isaac 
31420cf1dd8SToby Isaac   Output Parameter:
31520cf1dd8SToby Isaac . dim - The dimension
31620cf1dd8SToby Isaac 
31720cf1dd8SToby Isaac   Level: intermediate
31820cf1dd8SToby Isaac 
319db781477SPatrick Sanan .seealso: `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace`
32020cf1dd8SToby Isaac @*/
32120cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
32220cf1dd8SToby Isaac {
32320cf1dd8SToby Isaac   PetscFunctionBegin;
32420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
325dadcf809SJacob Faibussowitsch   PetscValidIntPointer(dim, 2);
32643bfef1cSToby Isaac   if (sp->dim == PETSC_DETERMINE) {
327*dbbe0bcdSBarry Smith     PetscTryTypeMethod(sp,getdimension, &sp->dim);
32843bfef1cSToby Isaac   }
32943bfef1cSToby Isaac   *dim = sp->dim;
33020cf1dd8SToby Isaac   PetscFunctionReturn(0);
33120cf1dd8SToby Isaac }
33220cf1dd8SToby Isaac 
33320cf1dd8SToby Isaac /*@
33420cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
33520cf1dd8SToby Isaac 
33620cf1dd8SToby Isaac   Input Parameter:
33720cf1dd8SToby Isaac . sp - The PetscSpace
33820cf1dd8SToby Isaac 
339d8d19677SJose E. Roman   Output Parameters:
34020cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space
34120cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space
34220cf1dd8SToby Isaac 
34320cf1dd8SToby Isaac   Level: intermediate
34420cf1dd8SToby Isaac 
345db781477SPatrick Sanan .seealso: `PetscSpaceSetDegree()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
34620cf1dd8SToby Isaac @*/
34720cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
34820cf1dd8SToby Isaac {
34920cf1dd8SToby Isaac   PetscFunctionBegin;
35020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
351dadcf809SJacob Faibussowitsch   if (minDegree) PetscValidIntPointer(minDegree, 2);
352dadcf809SJacob Faibussowitsch   if (maxDegree) PetscValidIntPointer(maxDegree, 3);
35320cf1dd8SToby Isaac   if (minDegree) *minDegree = sp->degree;
354f5a02b64SToby Isaac   if (maxDegree) *maxDegree = sp->maxDegree;
35520cf1dd8SToby Isaac   PetscFunctionReturn(0);
35620cf1dd8SToby Isaac }
35720cf1dd8SToby Isaac 
35820cf1dd8SToby Isaac /*@
35920cf1dd8SToby Isaac   PetscSpaceSetDegree - Set the degree of approximation for this space.
36020cf1dd8SToby Isaac 
36120cf1dd8SToby Isaac   Input Parameters:
36220cf1dd8SToby Isaac + sp - The PetscSpace
363d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space
364d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space.  One of degree and maxDegree can be PETSC_DETERMINE.
36520cf1dd8SToby Isaac 
36620cf1dd8SToby Isaac   Level: intermediate
36720cf1dd8SToby Isaac 
368db781477SPatrick Sanan .seealso: `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace`
36920cf1dd8SToby Isaac @*/
370d39dd5f5SToby Isaac PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree)
37120cf1dd8SToby Isaac {
37220cf1dd8SToby Isaac   PetscFunctionBegin;
37320cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
374d39dd5f5SToby Isaac   sp->degree = degree;
375d39dd5f5SToby Isaac   sp->maxDegree = maxDegree;
37620cf1dd8SToby Isaac   PetscFunctionReturn(0);
37720cf1dd8SToby Isaac }
37820cf1dd8SToby Isaac 
37920cf1dd8SToby Isaac /*@
38020cf1dd8SToby Isaac   PetscSpaceGetNumComponents - Return the number of components for this space
38120cf1dd8SToby Isaac 
38220cf1dd8SToby Isaac   Input Parameter:
38320cf1dd8SToby Isaac . sp - The PetscSpace
38420cf1dd8SToby Isaac 
38520cf1dd8SToby Isaac   Output Parameter:
38620cf1dd8SToby Isaac . Nc - The number of components
38720cf1dd8SToby Isaac 
38820cf1dd8SToby Isaac   Note: A vector space, for example, will have d components, where d is the spatial dimension
38920cf1dd8SToby Isaac 
39020cf1dd8SToby Isaac   Level: intermediate
39120cf1dd8SToby Isaac 
392db781477SPatrick Sanan .seealso: `PetscSpaceSetNumComponents()`, `PetscSpaceGetNumVariables()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
39320cf1dd8SToby Isaac @*/
39420cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
39520cf1dd8SToby Isaac {
39620cf1dd8SToby Isaac   PetscFunctionBegin;
39720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
398dadcf809SJacob Faibussowitsch   PetscValidIntPointer(Nc, 2);
39920cf1dd8SToby Isaac   *Nc = sp->Nc;
40020cf1dd8SToby Isaac   PetscFunctionReturn(0);
40120cf1dd8SToby Isaac }
40220cf1dd8SToby Isaac 
40320cf1dd8SToby Isaac /*@
40420cf1dd8SToby Isaac   PetscSpaceSetNumComponents - Set the number of components for this space
40520cf1dd8SToby Isaac 
40620cf1dd8SToby Isaac   Input Parameters:
40720cf1dd8SToby Isaac + sp - The PetscSpace
40820cf1dd8SToby Isaac - order - The number of components
40920cf1dd8SToby Isaac 
41020cf1dd8SToby Isaac   Level: intermediate
41120cf1dd8SToby Isaac 
412db781477SPatrick Sanan .seealso: `PetscSpaceGetNumComponents()`, `PetscSpaceSetNumVariables()`, `PetscSpaceCreate()`, `PetscSpace`
41320cf1dd8SToby Isaac @*/
41420cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc)
41520cf1dd8SToby Isaac {
41620cf1dd8SToby Isaac   PetscFunctionBegin;
41720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
41820cf1dd8SToby Isaac   sp->Nc = Nc;
41920cf1dd8SToby Isaac   PetscFunctionReturn(0);
42020cf1dd8SToby Isaac }
42120cf1dd8SToby Isaac 
42229b5c115SMatthew G. Knepley /*@
42329b5c115SMatthew G. Knepley   PetscSpaceSetNumVariables - Set the number of variables for this space
42429b5c115SMatthew G. Knepley 
42529b5c115SMatthew G. Knepley   Input Parameters:
42629b5c115SMatthew G. Knepley + sp - The PetscSpace
42729b5c115SMatthew G. Knepley - n - The number of variables, e.g. x, y, z...
42829b5c115SMatthew G. Knepley 
42929b5c115SMatthew G. Knepley   Level: intermediate
43029b5c115SMatthew G. Knepley 
431db781477SPatrick Sanan .seealso: `PetscSpaceGetNumVariables()`, `PetscSpaceSetNumComponents()`, `PetscSpaceCreate()`, `PetscSpace`
43229b5c115SMatthew G. Knepley @*/
43320cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
43420cf1dd8SToby Isaac {
43520cf1dd8SToby Isaac   PetscFunctionBegin;
43620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
43720cf1dd8SToby Isaac   sp->Nv = n;
43820cf1dd8SToby Isaac   PetscFunctionReturn(0);
43920cf1dd8SToby Isaac }
44020cf1dd8SToby Isaac 
44129b5c115SMatthew G. Knepley /*@
44229b5c115SMatthew G. Knepley   PetscSpaceGetNumVariables - Return the number of variables for this space
44329b5c115SMatthew G. Knepley 
44429b5c115SMatthew G. Knepley   Input Parameter:
44529b5c115SMatthew G. Knepley . sp - The PetscSpace
44629b5c115SMatthew G. Knepley 
44729b5c115SMatthew G. Knepley   Output Parameter:
44829b5c115SMatthew G. Knepley . Nc - The number of variables, e.g. x, y, z...
44929b5c115SMatthew G. Knepley 
45029b5c115SMatthew G. Knepley   Level: intermediate
45129b5c115SMatthew G. Knepley 
452db781477SPatrick Sanan .seealso: `PetscSpaceSetNumVariables()`, `PetscSpaceGetNumComponents()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace`
45329b5c115SMatthew G. Knepley @*/
45420cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
45520cf1dd8SToby Isaac {
45620cf1dd8SToby Isaac   PetscFunctionBegin;
45720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
458dadcf809SJacob Faibussowitsch   PetscValidIntPointer(n, 2);
45920cf1dd8SToby Isaac   *n = sp->Nv;
46020cf1dd8SToby Isaac   PetscFunctionReturn(0);
46120cf1dd8SToby Isaac }
46220cf1dd8SToby Isaac 
46320cf1dd8SToby Isaac /*@C
46420cf1dd8SToby Isaac   PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
46520cf1dd8SToby Isaac 
46620cf1dd8SToby Isaac   Input Parameters:
46720cf1dd8SToby Isaac + sp      - The PetscSpace
46820cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates
46920cf1dd8SToby Isaac - points  - The point coordinates
47020cf1dd8SToby Isaac 
47120cf1dd8SToby Isaac   Output Parameters:
47220cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array
47320cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array
47420cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array
47520cf1dd8SToby Isaac 
47620cf1dd8SToby Isaac   Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
47720cf1dd8SToby Isaac   on the reference cell, not in real space.
47820cf1dd8SToby Isaac 
47929b5c115SMatthew G. Knepley   Level: beginner
48020cf1dd8SToby Isaac 
481db781477SPatrick Sanan .seealso: `PetscFECreateTabulation()`, `PetscFEGetCellTabulation()`, `PetscSpaceCreate()`
48220cf1dd8SToby Isaac @*/
48320cf1dd8SToby Isaac PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
48420cf1dd8SToby Isaac {
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);
492*dbbe0bcdSBarry 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   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
50020cf1dd8SToby Isaac   pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not
50120cf1dd8SToby Isaac   support extracting subspaces, then NULL is returned.
50220cf1dd8SToby Isaac 
50320cf1dd8SToby Isaac   This does not increment the reference count on the returned space, and the user should not destroy it.
50420cf1dd8SToby Isaac 
50520cf1dd8SToby Isaac   Not collective
50620cf1dd8SToby Isaac 
50720cf1dd8SToby Isaac   Input Parameters:
50820cf1dd8SToby Isaac + sp - the PetscSpace object
50920cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired
51020cf1dd8SToby Isaac 
51120cf1dd8SToby Isaac   Output Parameter:
51220cf1dd8SToby Isaac . subsp - the subspace
51320cf1dd8SToby Isaac 
51420cf1dd8SToby Isaac   Level: advanced
51520cf1dd8SToby Isaac 
516db781477SPatrick Sanan .seealso: `PetscDualSpaceGetHeightSubspace()`, `PetscSpace`
51720cf1dd8SToby Isaac @*/
51820cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
51920cf1dd8SToby Isaac {
52020cf1dd8SToby Isaac   PetscFunctionBegin;
52120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
52220cf1dd8SToby Isaac   PetscValidPointer(subsp, 3);
52320cf1dd8SToby Isaac   *subsp = NULL;
524*dbbe0bcdSBarry Smith   PetscTryTypeMethod(sp,getheightsubspace, height, subsp);
52520cf1dd8SToby Isaac   PetscFunctionReturn(0);
52620cf1dd8SToby Isaac }
527