xref: /petsc/src/dm/dt/space/interface/space.c (revision dadcf80911fb48939c55327431ae8d7e47dbe367)
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 
3920cf1dd8SToby Isaac .seealso: PetscSpaceRegisterAll(), PetscSpaceRegisterDestroy()
4020cf1dd8SToby Isaac 
4120cf1dd8SToby Isaac @*/
4220cf1dd8SToby Isaac PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace))
4320cf1dd8SToby Isaac {
4420cf1dd8SToby Isaac   PetscFunctionBegin;
455f80ce2aSJacob Faibussowitsch   CHKERRQ(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 
6320cf1dd8SToby Isaac .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);
725f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject) sp, name, &match));
7320cf1dd8SToby Isaac   if (match) PetscFunctionReturn(0);
7420cf1dd8SToby Isaac 
755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceRegisterAll());
765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListFind(PetscSpaceList, name, &r));
772c71b3e2SJacob Faibussowitsch   PetscCheck(r,PetscObjectComm((PetscObject) sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name);
7820cf1dd8SToby Isaac 
7920cf1dd8SToby Isaac   if (sp->ops->destroy) {
805f80ce2aSJacob Faibussowitsch     CHKERRQ((*sp->ops->destroy)(sp));
8120cf1dd8SToby Isaac     sp->ops->destroy = NULL;
8220cf1dd8SToby Isaac   }
8343bfef1cSToby Isaac   sp->dim = PETSC_DETERMINE;
845f80ce2aSJacob Faibussowitsch   CHKERRQ((*r)(sp));
855f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject) sp, name));
8620cf1dd8SToby Isaac   PetscFunctionReturn(0);
8720cf1dd8SToby Isaac }
8820cf1dd8SToby Isaac 
8920cf1dd8SToby Isaac /*@C
9020cf1dd8SToby Isaac   PetscSpaceGetType - Gets the PetscSpace type name (as a string) from the object.
9120cf1dd8SToby Isaac 
9220cf1dd8SToby Isaac   Not Collective
9320cf1dd8SToby Isaac 
9420cf1dd8SToby Isaac   Input Parameter:
9520cf1dd8SToby Isaac . sp  - The PetscSpace
9620cf1dd8SToby Isaac 
9720cf1dd8SToby Isaac   Output Parameter:
9820cf1dd8SToby Isaac . name - The PetscSpace type name
9920cf1dd8SToby Isaac 
10020cf1dd8SToby Isaac   Level: intermediate
10120cf1dd8SToby Isaac 
10220cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PetscSpaceCreate()
10320cf1dd8SToby Isaac @*/
10420cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
10520cf1dd8SToby Isaac {
10620cf1dd8SToby Isaac   PetscFunctionBegin;
10720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
10820cf1dd8SToby Isaac   PetscValidPointer(name, 2);
10920cf1dd8SToby Isaac   if (!PetscSpaceRegisterAllCalled) {
1105f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSpaceRegisterAll());
11120cf1dd8SToby Isaac   }
11220cf1dd8SToby Isaac   *name = ((PetscObject) sp)->type_name;
11320cf1dd8SToby Isaac   PetscFunctionReturn(0);
11420cf1dd8SToby Isaac }
11520cf1dd8SToby Isaac 
11620cf1dd8SToby Isaac /*@C
117fe2efc57SMark    PetscSpaceViewFromOptions - View from Options
118fe2efc57SMark 
119fe2efc57SMark    Collective on PetscSpace
120fe2efc57SMark 
121fe2efc57SMark    Input Parameters:
122fe2efc57SMark +  A - the PetscSpace object
123736c3998SJose E. Roman .  obj - Optional object
124736c3998SJose E. Roman -  name - command line option
125fe2efc57SMark 
126fe2efc57SMark    Level: intermediate
127fe2efc57SMark .seealso:  PetscSpace, PetscSpaceView, PetscObjectViewFromOptions(), PetscSpaceCreate()
128fe2efc57SMark @*/
129fe2efc57SMark PetscErrorCode  PetscSpaceViewFromOptions(PetscSpace A,PetscObject obj,const char name[])
130fe2efc57SMark {
131fe2efc57SMark   PetscFunctionBegin;
132fe2efc57SMark   PetscValidHeaderSpecific(A,PETSCSPACE_CLASSID,1);
1335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectViewFromOptions((PetscObject)A,obj,name));
134fe2efc57SMark   PetscFunctionReturn(0);
135fe2efc57SMark }
136fe2efc57SMark 
137fe2efc57SMark /*@C
13820cf1dd8SToby Isaac   PetscSpaceView - Views a PetscSpace
13920cf1dd8SToby Isaac 
140d083f849SBarry Smith   Collective on sp
14120cf1dd8SToby Isaac 
142d8d19677SJose E. Roman   Input Parameters:
14320cf1dd8SToby Isaac + sp - the PetscSpace object to view
14420cf1dd8SToby Isaac - v  - the viewer
14520cf1dd8SToby Isaac 
14629b5c115SMatthew G. Knepley   Level: beginner
14720cf1dd8SToby Isaac 
14820cf1dd8SToby Isaac .seealso PetscSpaceDestroy()
14920cf1dd8SToby Isaac @*/
15020cf1dd8SToby Isaac PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
15120cf1dd8SToby Isaac {
1520aec8e07SMatthew G. Knepley   PetscInt       pdim;
15320cf1dd8SToby Isaac   PetscBool      iascii;
15420cf1dd8SToby Isaac 
15520cf1dd8SToby Isaac   PetscFunctionBegin;
15620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
15720cf1dd8SToby Isaac   if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
1585f80ce2aSJacob Faibussowitsch   if (!v) CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) sp), &v));
1595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceGetDimension(sp, &pdim));
1605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)sp,v));
1615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii));
1625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(v));
1635f80ce2aSJacob Faibussowitsch   if (iascii) CHKERRQ(PetscViewerASCIIPrintf(v, "Space in %D variables with %D components, size %D\n", sp->Nv, sp->Nc, pdim));
1645f80ce2aSJacob Faibussowitsch   if (sp->ops->view) CHKERRQ((*sp->ops->view)(sp, v));
1655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(v));
16620cf1dd8SToby Isaac   PetscFunctionReturn(0);
16720cf1dd8SToby Isaac }
16820cf1dd8SToby Isaac 
16920cf1dd8SToby Isaac /*@
17020cf1dd8SToby Isaac   PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database
17120cf1dd8SToby Isaac 
172d083f849SBarry Smith   Collective on sp
17320cf1dd8SToby Isaac 
17420cf1dd8SToby Isaac   Input Parameter:
17520cf1dd8SToby Isaac . sp - the PetscSpace object to set options for
17620cf1dd8SToby Isaac 
17720cf1dd8SToby Isaac   Options Database:
1788f2aacc6SMatthew G. Knepley + -petscspace_degree <deg> - the approximation order of the space
1798f2aacc6SMatthew G. Knepley . -petscspace_variables <n> - the number of different variables, e.g. x and y
1808f2aacc6SMatthew G. Knepley - -petscspace_components <c> - the number of components, say d for a vector field
18120cf1dd8SToby Isaac 
18229b5c115SMatthew G. Knepley   Level: intermediate
18320cf1dd8SToby Isaac 
18420cf1dd8SToby Isaac .seealso PetscSpaceView()
18520cf1dd8SToby Isaac @*/
18620cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
18720cf1dd8SToby Isaac {
18820cf1dd8SToby Isaac   const char    *defaultType;
18920cf1dd8SToby Isaac   char           name[256];
1905a856986SBarry Smith   PetscBool      flg;
19120cf1dd8SToby Isaac   PetscErrorCode ierr;
19220cf1dd8SToby Isaac 
19320cf1dd8SToby Isaac   PetscFunctionBegin;
19420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
19520cf1dd8SToby Isaac   if (!((PetscObject) sp)->type_name) {
19620cf1dd8SToby Isaac     defaultType = PETSCSPACEPOLYNOMIAL;
19720cf1dd8SToby Isaac   } else {
19820cf1dd8SToby Isaac     defaultType = ((PetscObject) sp)->type_name;
19920cf1dd8SToby Isaac   }
2005f80ce2aSJacob Faibussowitsch   if (!PetscSpaceRegisterAllCalled) CHKERRQ(PetscSpaceRegisterAll());
20120cf1dd8SToby Isaac 
20220cf1dd8SToby Isaac   ierr = PetscObjectOptionsBegin((PetscObject) sp);CHKERRQ(ierr);
2035f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg));
20420cf1dd8SToby Isaac   if (flg) {
2055f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSpaceSetType(sp, name));
20620cf1dd8SToby Isaac   } else if (!((PetscObject) sp)->type_name) {
2075f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSpaceSetType(sp, defaultType));
20820cf1dd8SToby Isaac   }
2097be5e748SToby Isaac   {
2105f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsDeprecated("-petscspace_order","-petscspace_degree","3.11",NULL));
2115f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0));
2127be5e748SToby Isaac   }
2135f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0));
2145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL,0));
2155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL,0));
21620cf1dd8SToby Isaac   if (sp->ops->setfromoptions) {
2175f80ce2aSJacob Faibussowitsch     CHKERRQ((*sp->ops->setfromoptions)(PetscOptionsObject,sp));
21820cf1dd8SToby Isaac   }
21920cf1dd8SToby Isaac   /* process any options handlers added with PetscObjectAddOptionsHandler() */
2205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) sp));
22120cf1dd8SToby Isaac   ierr = PetscOptionsEnd();CHKERRQ(ierr);
2225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view"));
22320cf1dd8SToby Isaac   PetscFunctionReturn(0);
22420cf1dd8SToby Isaac }
22520cf1dd8SToby Isaac 
22620cf1dd8SToby Isaac /*@C
22720cf1dd8SToby Isaac   PetscSpaceSetUp - Construct data structures for the PetscSpace
22820cf1dd8SToby Isaac 
229d083f849SBarry Smith   Collective on sp
23020cf1dd8SToby Isaac 
23120cf1dd8SToby Isaac   Input Parameter:
23220cf1dd8SToby Isaac . sp - the PetscSpace object to setup
23320cf1dd8SToby Isaac 
23429b5c115SMatthew G. Knepley   Level: intermediate
23520cf1dd8SToby Isaac 
23620cf1dd8SToby Isaac .seealso PetscSpaceView(), PetscSpaceDestroy()
23720cf1dd8SToby Isaac @*/
23820cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
23920cf1dd8SToby Isaac {
24020cf1dd8SToby Isaac   PetscFunctionBegin;
24120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
2425f80ce2aSJacob Faibussowitsch   if (sp->ops->setup) CHKERRQ((*sp->ops->setup)(sp));
24320cf1dd8SToby Isaac   PetscFunctionReturn(0);
24420cf1dd8SToby Isaac }
24520cf1dd8SToby Isaac 
24620cf1dd8SToby Isaac /*@
24720cf1dd8SToby Isaac   PetscSpaceDestroy - Destroys a PetscSpace object
24820cf1dd8SToby Isaac 
249d083f849SBarry Smith   Collective on sp
25020cf1dd8SToby Isaac 
25120cf1dd8SToby Isaac   Input Parameter:
25220cf1dd8SToby Isaac . sp - the PetscSpace object to destroy
25320cf1dd8SToby Isaac 
25429b5c115SMatthew G. Knepley   Level: beginner
25520cf1dd8SToby Isaac 
25620cf1dd8SToby Isaac .seealso PetscSpaceView()
25720cf1dd8SToby Isaac @*/
25820cf1dd8SToby Isaac PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
25920cf1dd8SToby Isaac {
26020cf1dd8SToby Isaac   PetscFunctionBegin;
26120cf1dd8SToby Isaac   if (!*sp) PetscFunctionReturn(0);
26220cf1dd8SToby Isaac   PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1);
26320cf1dd8SToby Isaac 
264ea78f98cSLisandro Dalcin   if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);}
26520cf1dd8SToby Isaac   ((PetscObject) (*sp))->refct = 0;
2665f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&(*sp)->dm));
26720cf1dd8SToby Isaac 
2685f80ce2aSJacob Faibussowitsch   CHKERRQ((*(*sp)->ops->destroy)(*sp));
2695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(sp));
27020cf1dd8SToby Isaac   PetscFunctionReturn(0);
27120cf1dd8SToby Isaac }
27220cf1dd8SToby Isaac 
27320cf1dd8SToby Isaac /*@
27420cf1dd8SToby Isaac   PetscSpaceCreate - Creates an empty PetscSpace object. The type can then be set with PetscSpaceSetType().
27520cf1dd8SToby Isaac 
276d083f849SBarry Smith   Collective
27720cf1dd8SToby Isaac 
27820cf1dd8SToby Isaac   Input Parameter:
27920cf1dd8SToby Isaac . comm - The communicator for the PetscSpace object
28020cf1dd8SToby Isaac 
28120cf1dd8SToby Isaac   Output Parameter:
28220cf1dd8SToby Isaac . sp - The PetscSpace object
28320cf1dd8SToby Isaac 
28420cf1dd8SToby Isaac   Level: beginner
28520cf1dd8SToby Isaac 
28620cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PETSCSPACEPOLYNOMIAL
28720cf1dd8SToby Isaac @*/
28820cf1dd8SToby Isaac PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
28920cf1dd8SToby Isaac {
29020cf1dd8SToby Isaac   PetscSpace     s;
29120cf1dd8SToby Isaac 
29220cf1dd8SToby Isaac   PetscFunctionBegin;
29320cf1dd8SToby Isaac   PetscValidPointer(sp, 2);
2945f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscCitationsRegister(FECitation,&FEcite));
29520cf1dd8SToby Isaac   *sp  = NULL;
2965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFEInitializePackage());
29720cf1dd8SToby Isaac 
2985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView));
29920cf1dd8SToby Isaac 
30020cf1dd8SToby Isaac   s->degree    = 0;
30143bfef1cSToby Isaac   s->maxDegree = PETSC_DETERMINE;
30220cf1dd8SToby Isaac   s->Nc        = 1;
30320cf1dd8SToby Isaac   s->Nv        = 0;
30443bfef1cSToby Isaac   s->dim       = PETSC_DETERMINE;
3055f80ce2aSJacob Faibussowitsch   CHKERRQ(DMShellCreate(comm, &s->dm));
3065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL));
30720cf1dd8SToby Isaac 
30820cf1dd8SToby Isaac   *sp = s;
30920cf1dd8SToby Isaac   PetscFunctionReturn(0);
31020cf1dd8SToby Isaac }
31120cf1dd8SToby Isaac 
31220cf1dd8SToby Isaac /*@
31320cf1dd8SToby Isaac   PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors
31420cf1dd8SToby Isaac 
31520cf1dd8SToby Isaac   Input Parameter:
31620cf1dd8SToby Isaac . sp - The PetscSpace
31720cf1dd8SToby Isaac 
31820cf1dd8SToby Isaac   Output Parameter:
31920cf1dd8SToby Isaac . dim - The dimension
32020cf1dd8SToby Isaac 
32120cf1dd8SToby Isaac   Level: intermediate
32220cf1dd8SToby Isaac 
32320cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
32420cf1dd8SToby Isaac @*/
32520cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
32620cf1dd8SToby Isaac {
32720cf1dd8SToby Isaac   PetscFunctionBegin;
32820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
329*dadcf809SJacob Faibussowitsch   PetscValidIntPointer(dim, 2);
33043bfef1cSToby Isaac   if (sp->dim == PETSC_DETERMINE) {
3315f80ce2aSJacob Faibussowitsch     if (sp->ops->getdimension) CHKERRQ((*sp->ops->getdimension)(sp, &sp->dim));
33243bfef1cSToby Isaac   }
33343bfef1cSToby Isaac   *dim = sp->dim;
33420cf1dd8SToby Isaac   PetscFunctionReturn(0);
33520cf1dd8SToby Isaac }
33620cf1dd8SToby Isaac 
33720cf1dd8SToby Isaac /*@
33820cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
33920cf1dd8SToby Isaac 
34020cf1dd8SToby Isaac   Input Parameter:
34120cf1dd8SToby Isaac . sp - The PetscSpace
34220cf1dd8SToby Isaac 
343d8d19677SJose E. Roman   Output Parameters:
34420cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space
34520cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space
34620cf1dd8SToby Isaac 
34720cf1dd8SToby Isaac   Level: intermediate
34820cf1dd8SToby Isaac 
34920cf1dd8SToby Isaac .seealso: PetscSpaceSetDegree(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
35020cf1dd8SToby Isaac @*/
35120cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
35220cf1dd8SToby Isaac {
35320cf1dd8SToby Isaac   PetscFunctionBegin;
35420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
355*dadcf809SJacob Faibussowitsch   if (minDegree) PetscValidIntPointer(minDegree, 2);
356*dadcf809SJacob Faibussowitsch   if (maxDegree) PetscValidIntPointer(maxDegree, 3);
35720cf1dd8SToby Isaac   if (minDegree) *minDegree = sp->degree;
358f5a02b64SToby Isaac   if (maxDegree) *maxDegree = sp->maxDegree;
35920cf1dd8SToby Isaac   PetscFunctionReturn(0);
36020cf1dd8SToby Isaac }
36120cf1dd8SToby Isaac 
36220cf1dd8SToby Isaac /*@
36320cf1dd8SToby Isaac   PetscSpaceSetDegree - Set the degree of approximation for this space.
36420cf1dd8SToby Isaac 
36520cf1dd8SToby Isaac   Input Parameters:
36620cf1dd8SToby Isaac + sp - The PetscSpace
367d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space
368d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space.  One of degree and maxDegree can be PETSC_DETERMINE.
36920cf1dd8SToby Isaac 
37020cf1dd8SToby Isaac   Level: intermediate
37120cf1dd8SToby Isaac 
37220cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
37320cf1dd8SToby Isaac @*/
374d39dd5f5SToby Isaac PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree)
37520cf1dd8SToby Isaac {
37620cf1dd8SToby Isaac   PetscFunctionBegin;
37720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
378d39dd5f5SToby Isaac   sp->degree = degree;
379d39dd5f5SToby Isaac   sp->maxDegree = maxDegree;
38020cf1dd8SToby Isaac   PetscFunctionReturn(0);
38120cf1dd8SToby Isaac }
38220cf1dd8SToby Isaac 
38320cf1dd8SToby Isaac /*@
38420cf1dd8SToby Isaac   PetscSpaceGetNumComponents - Return the number of components for this space
38520cf1dd8SToby Isaac 
38620cf1dd8SToby Isaac   Input Parameter:
38720cf1dd8SToby Isaac . sp - The PetscSpace
38820cf1dd8SToby Isaac 
38920cf1dd8SToby Isaac   Output Parameter:
39020cf1dd8SToby Isaac . Nc - The number of components
39120cf1dd8SToby Isaac 
39220cf1dd8SToby Isaac   Note: A vector space, for example, will have d components, where d is the spatial dimension
39320cf1dd8SToby Isaac 
39420cf1dd8SToby Isaac   Level: intermediate
39520cf1dd8SToby Isaac 
39629b5c115SMatthew G. Knepley .seealso: PetscSpaceSetNumComponents(), PetscSpaceGetNumVariables(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
39720cf1dd8SToby Isaac @*/
39820cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
39920cf1dd8SToby Isaac {
40020cf1dd8SToby Isaac   PetscFunctionBegin;
40120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
402*dadcf809SJacob Faibussowitsch   PetscValidIntPointer(Nc, 2);
40320cf1dd8SToby Isaac   *Nc = sp->Nc;
40420cf1dd8SToby Isaac   PetscFunctionReturn(0);
40520cf1dd8SToby Isaac }
40620cf1dd8SToby Isaac 
40720cf1dd8SToby Isaac /*@
40820cf1dd8SToby Isaac   PetscSpaceSetNumComponents - Set the number of components for this space
40920cf1dd8SToby Isaac 
41020cf1dd8SToby Isaac   Input Parameters:
41120cf1dd8SToby Isaac + sp - The PetscSpace
41220cf1dd8SToby Isaac - order - The number of components
41320cf1dd8SToby Isaac 
41420cf1dd8SToby Isaac   Level: intermediate
41520cf1dd8SToby Isaac 
41629b5c115SMatthew G. Knepley .seealso: PetscSpaceGetNumComponents(), PetscSpaceSetNumVariables(), PetscSpaceCreate(), PetscSpace
41720cf1dd8SToby Isaac @*/
41820cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc)
41920cf1dd8SToby Isaac {
42020cf1dd8SToby Isaac   PetscFunctionBegin;
42120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
42220cf1dd8SToby Isaac   sp->Nc = Nc;
42320cf1dd8SToby Isaac   PetscFunctionReturn(0);
42420cf1dd8SToby Isaac }
42520cf1dd8SToby Isaac 
42629b5c115SMatthew G. Knepley /*@
42729b5c115SMatthew G. Knepley   PetscSpaceSetNumVariables - Set the number of variables for this space
42829b5c115SMatthew G. Knepley 
42929b5c115SMatthew G. Knepley   Input Parameters:
43029b5c115SMatthew G. Knepley + sp - The PetscSpace
43129b5c115SMatthew G. Knepley - n - The number of variables, e.g. x, y, z...
43229b5c115SMatthew G. Knepley 
43329b5c115SMatthew G. Knepley   Level: intermediate
43429b5c115SMatthew G. Knepley 
43529b5c115SMatthew G. Knepley .seealso: PetscSpaceGetNumVariables(), PetscSpaceSetNumComponents(), PetscSpaceCreate(), PetscSpace
43629b5c115SMatthew G. Knepley @*/
43720cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
43820cf1dd8SToby Isaac {
43920cf1dd8SToby Isaac   PetscFunctionBegin;
44020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
44120cf1dd8SToby Isaac   sp->Nv = n;
44220cf1dd8SToby Isaac   PetscFunctionReturn(0);
44320cf1dd8SToby Isaac }
44420cf1dd8SToby Isaac 
44529b5c115SMatthew G. Knepley /*@
44629b5c115SMatthew G. Knepley   PetscSpaceGetNumVariables - Return the number of variables for this space
44729b5c115SMatthew G. Knepley 
44829b5c115SMatthew G. Knepley   Input Parameter:
44929b5c115SMatthew G. Knepley . sp - The PetscSpace
45029b5c115SMatthew G. Knepley 
45129b5c115SMatthew G. Knepley   Output Parameter:
45229b5c115SMatthew G. Knepley . Nc - The number of variables, e.g. x, y, z...
45329b5c115SMatthew G. Knepley 
45429b5c115SMatthew G. Knepley   Level: intermediate
45529b5c115SMatthew G. Knepley 
45629b5c115SMatthew G. Knepley .seealso: PetscSpaceSetNumVariables(), PetscSpaceGetNumComponents(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
45729b5c115SMatthew G. Knepley @*/
45820cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
45920cf1dd8SToby Isaac {
46020cf1dd8SToby Isaac   PetscFunctionBegin;
46120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
462*dadcf809SJacob Faibussowitsch   PetscValidIntPointer(n, 2);
46320cf1dd8SToby Isaac   *n = sp->Nv;
46420cf1dd8SToby Isaac   PetscFunctionReturn(0);
46520cf1dd8SToby Isaac }
46620cf1dd8SToby Isaac 
46720cf1dd8SToby Isaac /*@C
46820cf1dd8SToby Isaac   PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
46920cf1dd8SToby Isaac 
47020cf1dd8SToby Isaac   Input Parameters:
47120cf1dd8SToby Isaac + sp      - The PetscSpace
47220cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates
47320cf1dd8SToby Isaac - points  - The point coordinates
47420cf1dd8SToby Isaac 
47520cf1dd8SToby Isaac   Output Parameters:
47620cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array
47720cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array
47820cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array
47920cf1dd8SToby Isaac 
48020cf1dd8SToby Isaac   Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
48120cf1dd8SToby Isaac   on the reference cell, not in real space.
48220cf1dd8SToby Isaac 
48329b5c115SMatthew G. Knepley   Level: beginner
48420cf1dd8SToby Isaac 
485ef0bb6c7SMatthew G. Knepley .seealso: PetscFECreateTabulation(), PetscFEGetCellTabulation(), PetscSpaceCreate()
48620cf1dd8SToby Isaac @*/
48720cf1dd8SToby Isaac PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
48820cf1dd8SToby Isaac {
48920cf1dd8SToby Isaac   PetscFunctionBegin;
49020cf1dd8SToby Isaac   if (!npoints) PetscFunctionReturn(0);
49120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
492*dadcf809SJacob Faibussowitsch   if (sp->Nv) PetscValidRealPointer(points, 3);
493*dadcf809SJacob Faibussowitsch   if (B) PetscValidRealPointer(B, 4);
494*dadcf809SJacob Faibussowitsch   if (D) PetscValidRealPointer(D, 5);
495*dadcf809SJacob Faibussowitsch   if (H) PetscValidRealPointer(H, 6);
4965f80ce2aSJacob Faibussowitsch   if (sp->ops->evaluate) CHKERRQ((*sp->ops->evaluate)(sp, npoints, points, B, D, H));
49720cf1dd8SToby Isaac   PetscFunctionReturn(0);
49820cf1dd8SToby Isaac }
49920cf1dd8SToby Isaac 
50020cf1dd8SToby Isaac /*@
50120cf1dd8SToby Isaac   PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height.
50220cf1dd8SToby Isaac 
50320cf1dd8SToby Isaac   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
50420cf1dd8SToby Isaac   pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not
50520cf1dd8SToby Isaac   support extracting subspaces, then NULL is returned.
50620cf1dd8SToby Isaac 
50720cf1dd8SToby Isaac   This does not increment the reference count on the returned space, and the user should not destroy it.
50820cf1dd8SToby Isaac 
50920cf1dd8SToby Isaac   Not collective
51020cf1dd8SToby Isaac 
51120cf1dd8SToby Isaac   Input Parameters:
51220cf1dd8SToby Isaac + sp - the PetscSpace object
51320cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired
51420cf1dd8SToby Isaac 
51520cf1dd8SToby Isaac   Output Parameter:
51620cf1dd8SToby Isaac . subsp - the subspace
51720cf1dd8SToby Isaac 
51820cf1dd8SToby Isaac   Level: advanced
51920cf1dd8SToby Isaac 
52020cf1dd8SToby Isaac .seealso: PetscDualSpaceGetHeightSubspace(), PetscSpace
52120cf1dd8SToby Isaac @*/
52220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
52320cf1dd8SToby Isaac {
52420cf1dd8SToby Isaac   PetscFunctionBegin;
52520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
52620cf1dd8SToby Isaac   PetscValidPointer(subsp, 3);
52720cf1dd8SToby Isaac   *subsp = NULL;
52820cf1dd8SToby Isaac   if (sp->ops->getheightsubspace) {
5295f80ce2aSJacob Faibussowitsch     CHKERRQ((*sp->ops->getheightsubspace)(sp, height, subsp));
53020cf1dd8SToby Isaac   }
53120cf1dd8SToby Isaac   PetscFunctionReturn(0);
53220cf1dd8SToby Isaac }
533