xref: /petsc/src/dm/dt/space/interface/space.c (revision 5a856986583887c326abe5dfd149e8184a29cd80)
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   PetscErrorCode ierr;
4520cf1dd8SToby Isaac 
4620cf1dd8SToby Isaac   PetscFunctionBegin;
4720cf1dd8SToby Isaac   ierr = PetscFunctionListAdd(&PetscSpaceList, sname, function);CHKERRQ(ierr);
4820cf1dd8SToby Isaac   PetscFunctionReturn(0);
4920cf1dd8SToby Isaac }
5020cf1dd8SToby Isaac 
5120cf1dd8SToby Isaac /*@C
5220cf1dd8SToby Isaac   PetscSpaceSetType - Builds a particular PetscSpace
5320cf1dd8SToby Isaac 
54d083f849SBarry Smith   Collective on sp
5520cf1dd8SToby Isaac 
5620cf1dd8SToby Isaac   Input Parameters:
5720cf1dd8SToby Isaac + sp   - The PetscSpace object
5820cf1dd8SToby Isaac - name - The kind of space
5920cf1dd8SToby Isaac 
6020cf1dd8SToby Isaac   Options Database Key:
6120cf1dd8SToby Isaac . -petscspace_type <type> - Sets the PetscSpace type; use -help for a list of available types
6220cf1dd8SToby Isaac 
6320cf1dd8SToby Isaac   Level: intermediate
6420cf1dd8SToby Isaac 
6520cf1dd8SToby Isaac .seealso: PetscSpaceGetType(), PetscSpaceCreate()
6620cf1dd8SToby Isaac @*/
6720cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name)
6820cf1dd8SToby Isaac {
6920cf1dd8SToby Isaac   PetscErrorCode (*r)(PetscSpace);
7020cf1dd8SToby Isaac   PetscBool      match;
7120cf1dd8SToby Isaac   PetscErrorCode ierr;
7220cf1dd8SToby Isaac 
7320cf1dd8SToby Isaac   PetscFunctionBegin;
7420cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
7520cf1dd8SToby Isaac   ierr = PetscObjectTypeCompare((PetscObject) sp, name, &match);CHKERRQ(ierr);
7620cf1dd8SToby Isaac   if (match) PetscFunctionReturn(0);
7720cf1dd8SToby Isaac 
7820cf1dd8SToby Isaac   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
7920cf1dd8SToby Isaac   ierr = PetscFunctionListFind(PetscSpaceList, name, &r);CHKERRQ(ierr);
8020cf1dd8SToby Isaac   if (!r) SETERRQ1(PetscObjectComm((PetscObject) sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name);
8120cf1dd8SToby Isaac 
8220cf1dd8SToby Isaac   if (sp->ops->destroy) {
8320cf1dd8SToby Isaac     ierr             = (*sp->ops->destroy)(sp);CHKERRQ(ierr);
8420cf1dd8SToby Isaac     sp->ops->destroy = NULL;
8520cf1dd8SToby Isaac   }
8643bfef1cSToby Isaac   sp->dim = PETSC_DETERMINE;
8720cf1dd8SToby Isaac   ierr = (*r)(sp);CHKERRQ(ierr);
8820cf1dd8SToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject) sp, name);CHKERRQ(ierr);
8920cf1dd8SToby Isaac   PetscFunctionReturn(0);
9020cf1dd8SToby Isaac }
9120cf1dd8SToby Isaac 
9220cf1dd8SToby Isaac /*@C
9320cf1dd8SToby Isaac   PetscSpaceGetType - Gets the PetscSpace type name (as a string) from the object.
9420cf1dd8SToby Isaac 
9520cf1dd8SToby Isaac   Not Collective
9620cf1dd8SToby Isaac 
9720cf1dd8SToby Isaac   Input Parameter:
9820cf1dd8SToby Isaac . sp  - The PetscSpace
9920cf1dd8SToby Isaac 
10020cf1dd8SToby Isaac   Output Parameter:
10120cf1dd8SToby Isaac . name - The PetscSpace type name
10220cf1dd8SToby Isaac 
10320cf1dd8SToby Isaac   Level: intermediate
10420cf1dd8SToby Isaac 
10520cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PetscSpaceCreate()
10620cf1dd8SToby Isaac @*/
10720cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
10820cf1dd8SToby Isaac {
10920cf1dd8SToby Isaac   PetscErrorCode ierr;
11020cf1dd8SToby Isaac 
11120cf1dd8SToby Isaac   PetscFunctionBegin;
11220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
11320cf1dd8SToby Isaac   PetscValidPointer(name, 2);
11420cf1dd8SToby Isaac   if (!PetscSpaceRegisterAllCalled) {
11520cf1dd8SToby Isaac     ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
11620cf1dd8SToby Isaac   }
11720cf1dd8SToby Isaac   *name = ((PetscObject) sp)->type_name;
11820cf1dd8SToby Isaac   PetscFunctionReturn(0);
11920cf1dd8SToby Isaac }
12020cf1dd8SToby Isaac 
12120cf1dd8SToby Isaac /*@C
12220cf1dd8SToby Isaac   PetscSpaceView - Views a PetscSpace
12320cf1dd8SToby Isaac 
124d083f849SBarry Smith   Collective on sp
12520cf1dd8SToby Isaac 
12620cf1dd8SToby Isaac   Input Parameter:
12720cf1dd8SToby Isaac + sp - the PetscSpace object to view
12820cf1dd8SToby Isaac - v  - the viewer
12920cf1dd8SToby Isaac 
13020cf1dd8SToby Isaac   Level: developer
13120cf1dd8SToby Isaac 
13220cf1dd8SToby Isaac .seealso PetscSpaceDestroy()
13320cf1dd8SToby Isaac @*/
13420cf1dd8SToby Isaac PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
13520cf1dd8SToby Isaac {
1360aec8e07SMatthew G. Knepley   PetscInt       pdim;
13720cf1dd8SToby Isaac   PetscBool      iascii;
13820cf1dd8SToby Isaac   PetscErrorCode ierr;
13920cf1dd8SToby Isaac 
14020cf1dd8SToby Isaac   PetscFunctionBegin;
14120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
14220cf1dd8SToby Isaac   if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
14320cf1dd8SToby Isaac   if (!v) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) sp), &v);CHKERRQ(ierr);}
1440aec8e07SMatthew G. Knepley   ierr = PetscSpaceGetDimension(sp, &pdim);CHKERRQ(ierr);
14520cf1dd8SToby Isaac   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)sp,v);CHKERRQ(ierr);
146d9bac1caSLisandro Dalcin   ierr = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
14720cf1dd8SToby Isaac   ierr = PetscViewerASCIIPushTab(v);CHKERRQ(ierr);
1480aec8e07SMatthew G. Knepley   if (iascii) {ierr = PetscViewerASCIIPrintf(v, "Space in %D variables with %D components, size %D\n", sp->Nv, sp->Nc, pdim);CHKERRQ(ierr);}
14920cf1dd8SToby Isaac   if (sp->ops->view) {ierr = (*sp->ops->view)(sp, v);CHKERRQ(ierr);}
15020cf1dd8SToby Isaac   ierr = PetscViewerASCIIPopTab(v);CHKERRQ(ierr);
15120cf1dd8SToby Isaac   PetscFunctionReturn(0);
15220cf1dd8SToby Isaac }
15320cf1dd8SToby Isaac 
15420cf1dd8SToby Isaac /*@
15520cf1dd8SToby Isaac   PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database
15620cf1dd8SToby Isaac 
157d083f849SBarry Smith   Collective on sp
15820cf1dd8SToby Isaac 
15920cf1dd8SToby Isaac   Input Parameter:
16020cf1dd8SToby Isaac . sp - the PetscSpace object to set options for
16120cf1dd8SToby Isaac 
16220cf1dd8SToby Isaac   Options Database:
1637be5e748SToby Isaac . -petscspace_degree the approximation order of the space
16420cf1dd8SToby Isaac 
16520cf1dd8SToby Isaac   Level: developer
16620cf1dd8SToby Isaac 
16720cf1dd8SToby Isaac .seealso PetscSpaceView()
16820cf1dd8SToby Isaac @*/
16920cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
17020cf1dd8SToby Isaac {
17120cf1dd8SToby Isaac   const char    *defaultType;
17220cf1dd8SToby Isaac   char           name[256];
173*5a856986SBarry Smith   PetscBool      flg;
17420cf1dd8SToby Isaac   PetscErrorCode ierr;
17520cf1dd8SToby Isaac 
17620cf1dd8SToby Isaac   PetscFunctionBegin;
17720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
17820cf1dd8SToby Isaac   if (!((PetscObject) sp)->type_name) {
17920cf1dd8SToby Isaac     defaultType = PETSCSPACEPOLYNOMIAL;
18020cf1dd8SToby Isaac   } else {
18120cf1dd8SToby Isaac     defaultType = ((PetscObject) sp)->type_name;
18220cf1dd8SToby Isaac   }
18320cf1dd8SToby Isaac   if (!PetscSpaceRegisterAllCalled) {ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);}
18420cf1dd8SToby Isaac 
18520cf1dd8SToby Isaac   ierr = PetscObjectOptionsBegin((PetscObject) sp);CHKERRQ(ierr);
18620cf1dd8SToby Isaac   ierr = PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg);CHKERRQ(ierr);
18720cf1dd8SToby Isaac   if (flg) {
18820cf1dd8SToby Isaac     ierr = PetscSpaceSetType(sp, name);CHKERRQ(ierr);
18920cf1dd8SToby Isaac   } else if (!((PetscObject) sp)->type_name) {
19020cf1dd8SToby Isaac     ierr = PetscSpaceSetType(sp, defaultType);CHKERRQ(ierr);
19120cf1dd8SToby Isaac   }
1927be5e748SToby Isaac   {
193*5a856986SBarry Smith     ierr = PetscOptionsDeprecated("-petscspace_order","-petscspace_degree","3.11",NULL);CHKERRQ(ierr);
194*5a856986SBarry Smith     ierr = PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0);CHKERRQ(ierr);
1957be5e748SToby Isaac   }
196*5a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0);CHKERRQ(ierr);
197*5a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL,0);CHKERRQ(ierr);
198*5a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL,0);CHKERRQ(ierr);
19920cf1dd8SToby Isaac   if (sp->ops->setfromoptions) {
20020cf1dd8SToby Isaac     ierr = (*sp->ops->setfromoptions)(PetscOptionsObject,sp);CHKERRQ(ierr);
20120cf1dd8SToby Isaac   }
20220cf1dd8SToby Isaac   /* process any options handlers added with PetscObjectAddOptionsHandler() */
20320cf1dd8SToby Isaac   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) sp);CHKERRQ(ierr);
20420cf1dd8SToby Isaac   ierr = PetscOptionsEnd();CHKERRQ(ierr);
20520cf1dd8SToby Isaac   ierr = PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view");CHKERRQ(ierr);
20620cf1dd8SToby Isaac   PetscFunctionReturn(0);
20720cf1dd8SToby Isaac }
20820cf1dd8SToby Isaac 
20920cf1dd8SToby Isaac /*@C
21020cf1dd8SToby Isaac   PetscSpaceSetUp - Construct data structures for the PetscSpace
21120cf1dd8SToby Isaac 
212d083f849SBarry Smith   Collective on sp
21320cf1dd8SToby Isaac 
21420cf1dd8SToby Isaac   Input Parameter:
21520cf1dd8SToby Isaac . sp - the PetscSpace object to setup
21620cf1dd8SToby Isaac 
21720cf1dd8SToby Isaac   Level: developer
21820cf1dd8SToby Isaac 
21920cf1dd8SToby Isaac .seealso PetscSpaceView(), PetscSpaceDestroy()
22020cf1dd8SToby Isaac @*/
22120cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
22220cf1dd8SToby Isaac {
22320cf1dd8SToby Isaac   PetscErrorCode ierr;
22420cf1dd8SToby Isaac 
22520cf1dd8SToby Isaac   PetscFunctionBegin;
22620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
22720cf1dd8SToby Isaac   if (sp->ops->setup) {ierr = (*sp->ops->setup)(sp);CHKERRQ(ierr);}
22820cf1dd8SToby Isaac   PetscFunctionReturn(0);
22920cf1dd8SToby Isaac }
23020cf1dd8SToby Isaac 
23120cf1dd8SToby Isaac /*@
23220cf1dd8SToby Isaac   PetscSpaceDestroy - Destroys a PetscSpace object
23320cf1dd8SToby Isaac 
234d083f849SBarry Smith   Collective on sp
23520cf1dd8SToby Isaac 
23620cf1dd8SToby Isaac   Input Parameter:
23720cf1dd8SToby Isaac . sp - the PetscSpace object to destroy
23820cf1dd8SToby Isaac 
23920cf1dd8SToby Isaac   Level: developer
24020cf1dd8SToby Isaac 
24120cf1dd8SToby Isaac .seealso PetscSpaceView()
24220cf1dd8SToby Isaac @*/
24320cf1dd8SToby Isaac PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
24420cf1dd8SToby Isaac {
24520cf1dd8SToby Isaac   PetscErrorCode ierr;
24620cf1dd8SToby Isaac 
24720cf1dd8SToby Isaac   PetscFunctionBegin;
24820cf1dd8SToby Isaac   if (!*sp) PetscFunctionReturn(0);
24920cf1dd8SToby Isaac   PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1);
25020cf1dd8SToby Isaac 
25120cf1dd8SToby Isaac   if (--((PetscObject)(*sp))->refct > 0) {*sp = 0; PetscFunctionReturn(0);}
25220cf1dd8SToby Isaac   ((PetscObject) (*sp))->refct = 0;
25320cf1dd8SToby Isaac   ierr = DMDestroy(&(*sp)->dm);CHKERRQ(ierr);
25420cf1dd8SToby Isaac 
25520cf1dd8SToby Isaac   ierr = (*(*sp)->ops->destroy)(*sp);CHKERRQ(ierr);
25620cf1dd8SToby Isaac   ierr = PetscHeaderDestroy(sp);CHKERRQ(ierr);
25720cf1dd8SToby Isaac   PetscFunctionReturn(0);
25820cf1dd8SToby Isaac }
25920cf1dd8SToby Isaac 
26020cf1dd8SToby Isaac /*@
26120cf1dd8SToby Isaac   PetscSpaceCreate - Creates an empty PetscSpace object. The type can then be set with PetscSpaceSetType().
26220cf1dd8SToby Isaac 
263d083f849SBarry Smith   Collective
26420cf1dd8SToby Isaac 
26520cf1dd8SToby Isaac   Input Parameter:
26620cf1dd8SToby Isaac . comm - The communicator for the PetscSpace object
26720cf1dd8SToby Isaac 
26820cf1dd8SToby Isaac   Output Parameter:
26920cf1dd8SToby Isaac . sp - The PetscSpace object
27020cf1dd8SToby Isaac 
27120cf1dd8SToby Isaac   Level: beginner
27220cf1dd8SToby Isaac 
27320cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PETSCSPACEPOLYNOMIAL
27420cf1dd8SToby Isaac @*/
27520cf1dd8SToby Isaac PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
27620cf1dd8SToby Isaac {
27720cf1dd8SToby Isaac   PetscSpace     s;
27820cf1dd8SToby Isaac   PetscErrorCode ierr;
27920cf1dd8SToby Isaac 
28020cf1dd8SToby Isaac   PetscFunctionBegin;
28120cf1dd8SToby Isaac   PetscValidPointer(sp, 2);
28220cf1dd8SToby Isaac   ierr = PetscCitationsRegister(FECitation,&FEcite);CHKERRQ(ierr);
28320cf1dd8SToby Isaac   *sp  = NULL;
28420cf1dd8SToby Isaac   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
28520cf1dd8SToby Isaac 
28620cf1dd8SToby Isaac   ierr = PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView);CHKERRQ(ierr);
28720cf1dd8SToby Isaac 
28820cf1dd8SToby Isaac   s->degree    = 0;
28943bfef1cSToby Isaac   s->maxDegree = PETSC_DETERMINE;
29020cf1dd8SToby Isaac   s->Nc        = 1;
29120cf1dd8SToby Isaac   s->Nv        = 0;
29243bfef1cSToby Isaac   s->dim       = PETSC_DETERMINE;
29320cf1dd8SToby Isaac   ierr = DMShellCreate(comm, &s->dm);CHKERRQ(ierr);
29420cf1dd8SToby Isaac   ierr = PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL);CHKERRQ(ierr);
29520cf1dd8SToby Isaac 
29620cf1dd8SToby Isaac   *sp = s;
29720cf1dd8SToby Isaac   PetscFunctionReturn(0);
29820cf1dd8SToby Isaac }
29920cf1dd8SToby Isaac 
30020cf1dd8SToby Isaac /*@
30120cf1dd8SToby Isaac   PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors
30220cf1dd8SToby Isaac 
30320cf1dd8SToby Isaac   Input Parameter:
30420cf1dd8SToby Isaac . sp - The PetscSpace
30520cf1dd8SToby Isaac 
30620cf1dd8SToby Isaac   Output Parameter:
30720cf1dd8SToby Isaac . dim - The dimension
30820cf1dd8SToby Isaac 
30920cf1dd8SToby Isaac   Level: intermediate
31020cf1dd8SToby Isaac 
31120cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
31220cf1dd8SToby Isaac @*/
31320cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
31420cf1dd8SToby Isaac {
31520cf1dd8SToby Isaac   PetscErrorCode ierr;
31620cf1dd8SToby Isaac 
31720cf1dd8SToby Isaac   PetscFunctionBegin;
31820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
31920cf1dd8SToby Isaac   PetscValidPointer(dim, 2);
32043bfef1cSToby Isaac   if (sp->dim == PETSC_DETERMINE) {
32143bfef1cSToby Isaac     if (sp->ops->getdimension) {ierr = (*sp->ops->getdimension)(sp, &sp->dim);CHKERRQ(ierr);}
32243bfef1cSToby Isaac   }
32343bfef1cSToby Isaac   *dim = sp->dim;
32420cf1dd8SToby Isaac   PetscFunctionReturn(0);
32520cf1dd8SToby Isaac }
32620cf1dd8SToby Isaac 
32720cf1dd8SToby Isaac /*@
32820cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
32920cf1dd8SToby Isaac 
33020cf1dd8SToby Isaac   Input Parameter:
33120cf1dd8SToby Isaac . sp - The PetscSpace
33220cf1dd8SToby Isaac 
33320cf1dd8SToby Isaac   Output Parameter:
33420cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space
33520cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space
33620cf1dd8SToby Isaac 
33720cf1dd8SToby Isaac 
33820cf1dd8SToby Isaac   Level: intermediate
33920cf1dd8SToby Isaac 
34020cf1dd8SToby Isaac .seealso: PetscSpaceSetDegree(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
34120cf1dd8SToby Isaac @*/
34220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
34320cf1dd8SToby Isaac {
34420cf1dd8SToby Isaac   PetscFunctionBegin;
34520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
34620cf1dd8SToby Isaac   if (minDegree) PetscValidPointer(minDegree, 2);
347f5a02b64SToby Isaac   if (maxDegree) PetscValidPointer(maxDegree, 3);
34820cf1dd8SToby Isaac   if (minDegree) *minDegree = sp->degree;
349f5a02b64SToby Isaac   if (maxDegree) *maxDegree = sp->maxDegree;
35020cf1dd8SToby Isaac   PetscFunctionReturn(0);
35120cf1dd8SToby Isaac }
35220cf1dd8SToby Isaac 
35320cf1dd8SToby Isaac /*@
35420cf1dd8SToby Isaac   PetscSpaceSetDegree - Set the degree of approximation for this space.
35520cf1dd8SToby Isaac 
35620cf1dd8SToby Isaac   Input Parameters:
35720cf1dd8SToby Isaac + sp - The PetscSpace
358d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space
359d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space.  One of degree and maxDegree can be PETSC_DETERMINE.
36020cf1dd8SToby Isaac 
36120cf1dd8SToby Isaac   Level: intermediate
36220cf1dd8SToby Isaac 
36320cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
36420cf1dd8SToby Isaac @*/
365d39dd5f5SToby Isaac PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree)
36620cf1dd8SToby Isaac {
36720cf1dd8SToby Isaac   PetscFunctionBegin;
36820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
369d39dd5f5SToby Isaac   sp->degree = degree;
370d39dd5f5SToby Isaac   sp->maxDegree = maxDegree;
37120cf1dd8SToby Isaac   PetscFunctionReturn(0);
37220cf1dd8SToby Isaac }
37320cf1dd8SToby Isaac 
37420cf1dd8SToby Isaac /*@
37520cf1dd8SToby Isaac   PetscSpaceGetNumComponents - Return the number of components for this space
37620cf1dd8SToby Isaac 
37720cf1dd8SToby Isaac   Input Parameter:
37820cf1dd8SToby Isaac . sp - The PetscSpace
37920cf1dd8SToby Isaac 
38020cf1dd8SToby Isaac   Output Parameter:
38120cf1dd8SToby Isaac . Nc - The number of components
38220cf1dd8SToby Isaac 
38320cf1dd8SToby Isaac   Note: A vector space, for example, will have d components, where d is the spatial dimension
38420cf1dd8SToby Isaac 
38520cf1dd8SToby Isaac   Level: intermediate
38620cf1dd8SToby Isaac 
38720cf1dd8SToby Isaac .seealso: PetscSpaceSetNumComponents(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
38820cf1dd8SToby Isaac @*/
38920cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
39020cf1dd8SToby Isaac {
39120cf1dd8SToby Isaac   PetscFunctionBegin;
39220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
39320cf1dd8SToby Isaac   PetscValidPointer(Nc, 2);
39420cf1dd8SToby Isaac   *Nc = sp->Nc;
39520cf1dd8SToby Isaac   PetscFunctionReturn(0);
39620cf1dd8SToby Isaac }
39720cf1dd8SToby Isaac 
39820cf1dd8SToby Isaac /*@
39920cf1dd8SToby Isaac   PetscSpaceSetNumComponents - Set the number of components for this space
40020cf1dd8SToby Isaac 
40120cf1dd8SToby Isaac   Input Parameters:
40220cf1dd8SToby Isaac + sp - The PetscSpace
40320cf1dd8SToby Isaac - order - The number of components
40420cf1dd8SToby Isaac 
40520cf1dd8SToby Isaac   Level: intermediate
40620cf1dd8SToby Isaac 
40720cf1dd8SToby Isaac .seealso: PetscSpaceGetNumComponents(), PetscSpaceCreate(), PetscSpace
40820cf1dd8SToby Isaac @*/
40920cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc)
41020cf1dd8SToby Isaac {
41120cf1dd8SToby Isaac   PetscFunctionBegin;
41220cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
41320cf1dd8SToby Isaac   sp->Nc = Nc;
41420cf1dd8SToby Isaac   PetscFunctionReturn(0);
41520cf1dd8SToby Isaac }
41620cf1dd8SToby Isaac 
41720cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
41820cf1dd8SToby Isaac {
41920cf1dd8SToby Isaac   PetscFunctionBegin;
42020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
42120cf1dd8SToby Isaac   sp->Nv = n;
42220cf1dd8SToby Isaac   PetscFunctionReturn(0);
42320cf1dd8SToby Isaac }
42420cf1dd8SToby Isaac 
42520cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
42620cf1dd8SToby Isaac {
42720cf1dd8SToby Isaac   PetscFunctionBegin;
42820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
42920cf1dd8SToby Isaac   PetscValidPointer(n, 2);
43020cf1dd8SToby Isaac   *n = sp->Nv;
43120cf1dd8SToby Isaac   PetscFunctionReturn(0);
43220cf1dd8SToby Isaac }
43320cf1dd8SToby Isaac 
43420cf1dd8SToby Isaac 
43520cf1dd8SToby Isaac /*@C
43620cf1dd8SToby Isaac   PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
43720cf1dd8SToby Isaac 
43820cf1dd8SToby Isaac   Input Parameters:
43920cf1dd8SToby Isaac + sp      - The PetscSpace
44020cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates
44120cf1dd8SToby Isaac - points  - The point coordinates
44220cf1dd8SToby Isaac 
44320cf1dd8SToby Isaac   Output Parameters:
44420cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array
44520cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array
44620cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array
44720cf1dd8SToby Isaac 
44820cf1dd8SToby Isaac   Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
44920cf1dd8SToby Isaac   on the reference cell, not in real space.
45020cf1dd8SToby Isaac 
45120cf1dd8SToby Isaac   Level: advanced
45220cf1dd8SToby Isaac 
45320cf1dd8SToby Isaac .seealso: PetscFEGetTabulation(), PetscFEGetDefaultTabulation(), PetscSpaceCreate()
45420cf1dd8SToby Isaac @*/
45520cf1dd8SToby Isaac PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
45620cf1dd8SToby Isaac {
45720cf1dd8SToby Isaac   PetscErrorCode ierr;
45820cf1dd8SToby Isaac 
45920cf1dd8SToby Isaac   PetscFunctionBegin;
46020cf1dd8SToby Isaac   if (!npoints) PetscFunctionReturn(0);
46120cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
46220cf1dd8SToby Isaac   if (sp->Nv) PetscValidPointer(points, 3);
46320cf1dd8SToby Isaac   if (B) PetscValidPointer(B, 4);
46420cf1dd8SToby Isaac   if (D) PetscValidPointer(D, 5);
46520cf1dd8SToby Isaac   if (H) PetscValidPointer(H, 6);
46620cf1dd8SToby Isaac   if (sp->ops->evaluate) {ierr = (*sp->ops->evaluate)(sp, npoints, points, B, D, H);CHKERRQ(ierr);}
46720cf1dd8SToby Isaac   PetscFunctionReturn(0);
46820cf1dd8SToby Isaac }
46920cf1dd8SToby Isaac 
47020cf1dd8SToby Isaac /*@
47120cf1dd8SToby Isaac   PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height.
47220cf1dd8SToby Isaac 
47320cf1dd8SToby Isaac   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
47420cf1dd8SToby Isaac   pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not
47520cf1dd8SToby Isaac   support extracting subspaces, then NULL is returned.
47620cf1dd8SToby Isaac 
47720cf1dd8SToby Isaac   This does not increment the reference count on the returned space, and the user should not destroy it.
47820cf1dd8SToby Isaac 
47920cf1dd8SToby Isaac   Not collective
48020cf1dd8SToby Isaac 
48120cf1dd8SToby Isaac   Input Parameters:
48220cf1dd8SToby Isaac + sp - the PetscSpace object
48320cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired
48420cf1dd8SToby Isaac 
48520cf1dd8SToby Isaac   Output Parameter:
48620cf1dd8SToby Isaac . subsp - the subspace
48720cf1dd8SToby Isaac 
48820cf1dd8SToby Isaac   Level: advanced
48920cf1dd8SToby Isaac 
49020cf1dd8SToby Isaac .seealso: PetscDualSpaceGetHeightSubspace(), PetscSpace
49120cf1dd8SToby Isaac @*/
49220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
49320cf1dd8SToby Isaac {
49420cf1dd8SToby Isaac   PetscErrorCode ierr;
49520cf1dd8SToby Isaac 
49620cf1dd8SToby Isaac   PetscFunctionBegin;
49720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
49820cf1dd8SToby Isaac   PetscValidPointer(subsp, 3);
49920cf1dd8SToby Isaac   *subsp = NULL;
50020cf1dd8SToby Isaac   if (sp->ops->getheightsubspace) {
50120cf1dd8SToby Isaac     ierr = (*sp->ops->getheightsubspace)(sp, height, subsp);CHKERRQ(ierr);
50220cf1dd8SToby Isaac   }
50320cf1dd8SToby Isaac   PetscFunctionReturn(0);
50420cf1dd8SToby Isaac }
50520cf1dd8SToby Isaac 
506