xref: /petsc/src/dm/dt/space/interface/space.c (revision d9bac1ca610c744a15dc202109a529dbaf3240f5)
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 .keywords: PetscSpace, register
4020cf1dd8SToby Isaac .seealso: PetscSpaceRegisterAll(), PetscSpaceRegisterDestroy()
4120cf1dd8SToby Isaac 
4220cf1dd8SToby Isaac @*/
4320cf1dd8SToby Isaac PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace))
4420cf1dd8SToby Isaac {
4520cf1dd8SToby Isaac   PetscErrorCode ierr;
4620cf1dd8SToby Isaac 
4720cf1dd8SToby Isaac   PetscFunctionBegin;
4820cf1dd8SToby Isaac   ierr = PetscFunctionListAdd(&PetscSpaceList, sname, function);CHKERRQ(ierr);
4920cf1dd8SToby Isaac   PetscFunctionReturn(0);
5020cf1dd8SToby Isaac }
5120cf1dd8SToby Isaac 
5220cf1dd8SToby Isaac /*@C
5320cf1dd8SToby Isaac   PetscSpaceSetType - Builds a particular PetscSpace
5420cf1dd8SToby Isaac 
5520cf1dd8SToby Isaac   Collective on PetscSpace
5620cf1dd8SToby Isaac 
5720cf1dd8SToby Isaac   Input Parameters:
5820cf1dd8SToby Isaac + sp   - The PetscSpace object
5920cf1dd8SToby Isaac - name - The kind of space
6020cf1dd8SToby Isaac 
6120cf1dd8SToby Isaac   Options Database Key:
6220cf1dd8SToby Isaac . -petscspace_type <type> - Sets the PetscSpace type; use -help for a list of available types
6320cf1dd8SToby Isaac 
6420cf1dd8SToby Isaac   Level: intermediate
6520cf1dd8SToby Isaac 
6620cf1dd8SToby Isaac .keywords: PetscSpace, set, type
6720cf1dd8SToby Isaac .seealso: PetscSpaceGetType(), PetscSpaceCreate()
6820cf1dd8SToby Isaac @*/
6920cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name)
7020cf1dd8SToby Isaac {
7120cf1dd8SToby Isaac   PetscErrorCode (*r)(PetscSpace);
7220cf1dd8SToby Isaac   PetscBool      match;
7320cf1dd8SToby Isaac   PetscErrorCode ierr;
7420cf1dd8SToby Isaac 
7520cf1dd8SToby Isaac   PetscFunctionBegin;
7620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
7720cf1dd8SToby Isaac   ierr = PetscObjectTypeCompare((PetscObject) sp, name, &match);CHKERRQ(ierr);
7820cf1dd8SToby Isaac   if (match) PetscFunctionReturn(0);
7920cf1dd8SToby Isaac 
8020cf1dd8SToby Isaac   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
8120cf1dd8SToby Isaac   ierr = PetscFunctionListFind(PetscSpaceList, name, &r);CHKERRQ(ierr);
8220cf1dd8SToby Isaac   if (!r) SETERRQ1(PetscObjectComm((PetscObject) sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name);
8320cf1dd8SToby Isaac 
8420cf1dd8SToby Isaac   if (sp->ops->destroy) {
8520cf1dd8SToby Isaac     ierr             = (*sp->ops->destroy)(sp);CHKERRQ(ierr);
8620cf1dd8SToby Isaac     sp->ops->destroy = NULL;
8720cf1dd8SToby Isaac   }
8843bfef1cSToby Isaac   sp->dim = PETSC_DETERMINE;
8920cf1dd8SToby Isaac   ierr = (*r)(sp);CHKERRQ(ierr);
9020cf1dd8SToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject) sp, name);CHKERRQ(ierr);
9120cf1dd8SToby Isaac   PetscFunctionReturn(0);
9220cf1dd8SToby Isaac }
9320cf1dd8SToby Isaac 
9420cf1dd8SToby Isaac /*@C
9520cf1dd8SToby Isaac   PetscSpaceGetType - Gets the PetscSpace type name (as a string) from the object.
9620cf1dd8SToby Isaac 
9720cf1dd8SToby Isaac   Not Collective
9820cf1dd8SToby Isaac 
9920cf1dd8SToby Isaac   Input Parameter:
10020cf1dd8SToby Isaac . sp  - The PetscSpace
10120cf1dd8SToby Isaac 
10220cf1dd8SToby Isaac   Output Parameter:
10320cf1dd8SToby Isaac . name - The PetscSpace type name
10420cf1dd8SToby Isaac 
10520cf1dd8SToby Isaac   Level: intermediate
10620cf1dd8SToby Isaac 
10720cf1dd8SToby Isaac .keywords: PetscSpace, get, type, name
10820cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PetscSpaceCreate()
10920cf1dd8SToby Isaac @*/
11020cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
11120cf1dd8SToby Isaac {
11220cf1dd8SToby Isaac   PetscErrorCode ierr;
11320cf1dd8SToby Isaac 
11420cf1dd8SToby Isaac   PetscFunctionBegin;
11520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
11620cf1dd8SToby Isaac   PetscValidPointer(name, 2);
11720cf1dd8SToby Isaac   if (!PetscSpaceRegisterAllCalled) {
11820cf1dd8SToby Isaac     ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
11920cf1dd8SToby Isaac   }
12020cf1dd8SToby Isaac   *name = ((PetscObject) sp)->type_name;
12120cf1dd8SToby Isaac   PetscFunctionReturn(0);
12220cf1dd8SToby Isaac }
12320cf1dd8SToby Isaac 
12420cf1dd8SToby Isaac /*@C
12520cf1dd8SToby Isaac   PetscSpaceView - Views a PetscSpace
12620cf1dd8SToby Isaac 
12720cf1dd8SToby Isaac   Collective on PetscSpace
12820cf1dd8SToby Isaac 
12920cf1dd8SToby Isaac   Input Parameter:
13020cf1dd8SToby Isaac + sp - the PetscSpace object to view
13120cf1dd8SToby Isaac - v  - the viewer
13220cf1dd8SToby Isaac 
13320cf1dd8SToby Isaac   Level: developer
13420cf1dd8SToby Isaac 
13520cf1dd8SToby Isaac .seealso PetscSpaceDestroy()
13620cf1dd8SToby Isaac @*/
13720cf1dd8SToby Isaac PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
13820cf1dd8SToby Isaac {
13920cf1dd8SToby Isaac   PetscBool      iascii;
14020cf1dd8SToby Isaac   PetscErrorCode ierr;
14120cf1dd8SToby Isaac 
14220cf1dd8SToby Isaac   PetscFunctionBegin;
14320cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
14420cf1dd8SToby Isaac   if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2);
14520cf1dd8SToby Isaac   if (!v) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) sp), &v);CHKERRQ(ierr);}
14620cf1dd8SToby Isaac   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)sp,v);CHKERRQ(ierr);
147*d9bac1caSLisandro Dalcin   ierr = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
14820cf1dd8SToby Isaac   ierr = PetscViewerASCIIPushTab(v);CHKERRQ(ierr);
149*d9bac1caSLisandro Dalcin   if (iascii) {ierr = PetscViewerASCIIPrintf(v, "Space in %D variables with %D components\n", sp->Nv, sp->Nc);CHKERRQ(ierr);}
15020cf1dd8SToby Isaac   if (sp->ops->view) {ierr = (*sp->ops->view)(sp, v);CHKERRQ(ierr);}
15120cf1dd8SToby Isaac   ierr = PetscViewerASCIIPopTab(v);CHKERRQ(ierr);
15220cf1dd8SToby Isaac   PetscFunctionReturn(0);
15320cf1dd8SToby Isaac }
15420cf1dd8SToby Isaac 
15520cf1dd8SToby Isaac /*@
15620cf1dd8SToby Isaac   PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database
15720cf1dd8SToby Isaac 
15820cf1dd8SToby Isaac   Collective on PetscSpace
15920cf1dd8SToby Isaac 
16020cf1dd8SToby Isaac   Input Parameter:
16120cf1dd8SToby Isaac . sp - the PetscSpace object to set options for
16220cf1dd8SToby Isaac 
16320cf1dd8SToby Isaac   Options Database:
1647be5e748SToby Isaac . -petscspace_degree the approximation order of the space
16520cf1dd8SToby Isaac 
16620cf1dd8SToby Isaac   Level: developer
16720cf1dd8SToby Isaac 
16820cf1dd8SToby Isaac .seealso PetscSpaceView()
16920cf1dd8SToby Isaac @*/
17020cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
17120cf1dd8SToby Isaac {
17220cf1dd8SToby Isaac   const char    *defaultType;
17320cf1dd8SToby Isaac   char           name[256];
1747be5e748SToby Isaac   PetscBool      flg, orderflg;
17520cf1dd8SToby Isaac   PetscErrorCode ierr;
17620cf1dd8SToby Isaac 
17720cf1dd8SToby Isaac   PetscFunctionBegin;
17820cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
17920cf1dd8SToby Isaac   if (!((PetscObject) sp)->type_name) {
18020cf1dd8SToby Isaac     defaultType = PETSCSPACEPOLYNOMIAL;
18120cf1dd8SToby Isaac   } else {
18220cf1dd8SToby Isaac     defaultType = ((PetscObject) sp)->type_name;
18320cf1dd8SToby Isaac   }
18420cf1dd8SToby Isaac   if (!PetscSpaceRegisterAllCalled) {ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);}
18520cf1dd8SToby Isaac 
18620cf1dd8SToby Isaac   ierr = PetscObjectOptionsBegin((PetscObject) sp);CHKERRQ(ierr);
18720cf1dd8SToby Isaac   ierr = PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg);CHKERRQ(ierr);
18820cf1dd8SToby Isaac   if (flg) {
18920cf1dd8SToby Isaac     ierr = PetscSpaceSetType(sp, name);CHKERRQ(ierr);
19020cf1dd8SToby Isaac   } else if (!((PetscObject) sp)->type_name) {
19120cf1dd8SToby Isaac     ierr = PetscSpaceSetType(sp, defaultType);CHKERRQ(ierr);
19220cf1dd8SToby Isaac   }
1937be5e748SToby Isaac   {
1947be5e748SToby Isaac     ierr = PetscOptionsInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, &orderflg);CHKERRQ(ierr);
1957be5e748SToby Isaac     if (orderflg) {
1967be5e748SToby Isaac       int compare;
1977be5e748SToby Isaac 
1987be5e748SToby Isaac       ierr = MPI_Comm_compare(PetscObjectComm((PetscObject)sp), PETSC_COMM_WORLD, &compare);CHKERRQ(ierr);
1997be5e748SToby Isaac 
2007be5e748SToby Isaac       if (compare == MPI_IDENT || compare == MPI_CONGRUENT) {
2017be5e748SToby Isaac         ierr = PetscPrintf(PetscObjectComm((PetscObject)sp), "Warning: -petscspace_order is deprecated.  Use -petscspace_degree\n");CHKERRQ(ierr);
2027be5e748SToby Isaac       }
2037be5e748SToby Isaac     }
2047be5e748SToby Isaac   }
20536e5648fSToby Isaac   ierr = PetscOptionsInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL);CHKERRQ(ierr);
20620cf1dd8SToby Isaac   ierr = PetscOptionsInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL);CHKERRQ(ierr);
20720cf1dd8SToby Isaac   ierr = PetscOptionsInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL);CHKERRQ(ierr);
20820cf1dd8SToby Isaac   if (sp->ops->setfromoptions) {
20920cf1dd8SToby Isaac     ierr = (*sp->ops->setfromoptions)(PetscOptionsObject,sp);CHKERRQ(ierr);
21020cf1dd8SToby Isaac   }
21120cf1dd8SToby Isaac   /* process any options handlers added with PetscObjectAddOptionsHandler() */
21220cf1dd8SToby Isaac   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) sp);CHKERRQ(ierr);
21320cf1dd8SToby Isaac   ierr = PetscOptionsEnd();CHKERRQ(ierr);
21420cf1dd8SToby Isaac   ierr = PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view");CHKERRQ(ierr);
21520cf1dd8SToby Isaac   PetscFunctionReturn(0);
21620cf1dd8SToby Isaac }
21720cf1dd8SToby Isaac 
21820cf1dd8SToby Isaac /*@C
21920cf1dd8SToby Isaac   PetscSpaceSetUp - Construct data structures for the PetscSpace
22020cf1dd8SToby Isaac 
22120cf1dd8SToby Isaac   Collective on PetscSpace
22220cf1dd8SToby Isaac 
22320cf1dd8SToby Isaac   Input Parameter:
22420cf1dd8SToby Isaac . sp - the PetscSpace object to setup
22520cf1dd8SToby Isaac 
22620cf1dd8SToby Isaac   Level: developer
22720cf1dd8SToby Isaac 
22820cf1dd8SToby Isaac .seealso PetscSpaceView(), PetscSpaceDestroy()
22920cf1dd8SToby Isaac @*/
23020cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
23120cf1dd8SToby Isaac {
23220cf1dd8SToby Isaac   PetscErrorCode ierr;
23320cf1dd8SToby Isaac 
23420cf1dd8SToby Isaac   PetscFunctionBegin;
23520cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
23620cf1dd8SToby Isaac   if (sp->ops->setup) {ierr = (*sp->ops->setup)(sp);CHKERRQ(ierr);}
23720cf1dd8SToby Isaac   PetscFunctionReturn(0);
23820cf1dd8SToby Isaac }
23920cf1dd8SToby Isaac 
24020cf1dd8SToby Isaac /*@
24120cf1dd8SToby Isaac   PetscSpaceDestroy - Destroys a PetscSpace object
24220cf1dd8SToby Isaac 
24320cf1dd8SToby Isaac   Collective on PetscSpace
24420cf1dd8SToby Isaac 
24520cf1dd8SToby Isaac   Input Parameter:
24620cf1dd8SToby Isaac . sp - the PetscSpace object to destroy
24720cf1dd8SToby Isaac 
24820cf1dd8SToby Isaac   Level: developer
24920cf1dd8SToby Isaac 
25020cf1dd8SToby Isaac .seealso PetscSpaceView()
25120cf1dd8SToby Isaac @*/
25220cf1dd8SToby Isaac PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
25320cf1dd8SToby Isaac {
25420cf1dd8SToby Isaac   PetscErrorCode ierr;
25520cf1dd8SToby Isaac 
25620cf1dd8SToby Isaac   PetscFunctionBegin;
25720cf1dd8SToby Isaac   if (!*sp) PetscFunctionReturn(0);
25820cf1dd8SToby Isaac   PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1);
25920cf1dd8SToby Isaac 
26020cf1dd8SToby Isaac   if (--((PetscObject)(*sp))->refct > 0) {*sp = 0; PetscFunctionReturn(0);}
26120cf1dd8SToby Isaac   ((PetscObject) (*sp))->refct = 0;
26220cf1dd8SToby Isaac   ierr = DMDestroy(&(*sp)->dm);CHKERRQ(ierr);
26320cf1dd8SToby Isaac 
26420cf1dd8SToby Isaac   ierr = (*(*sp)->ops->destroy)(*sp);CHKERRQ(ierr);
26520cf1dd8SToby Isaac   ierr = PetscHeaderDestroy(sp);CHKERRQ(ierr);
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 
27220cf1dd8SToby Isaac   Collective on MPI_Comm
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 
28220cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PETSCSPACEPOLYNOMIAL
28320cf1dd8SToby Isaac @*/
28420cf1dd8SToby Isaac PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
28520cf1dd8SToby Isaac {
28620cf1dd8SToby Isaac   PetscSpace     s;
28720cf1dd8SToby Isaac   PetscErrorCode ierr;
28820cf1dd8SToby Isaac 
28920cf1dd8SToby Isaac   PetscFunctionBegin;
29020cf1dd8SToby Isaac   PetscValidPointer(sp, 2);
29120cf1dd8SToby Isaac   ierr = PetscCitationsRegister(FECitation,&FEcite);CHKERRQ(ierr);
29220cf1dd8SToby Isaac   *sp  = NULL;
29320cf1dd8SToby Isaac   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
29420cf1dd8SToby Isaac 
29520cf1dd8SToby Isaac   ierr = PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView);CHKERRQ(ierr);
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;
30220cf1dd8SToby Isaac   ierr = DMShellCreate(comm, &s->dm);CHKERRQ(ierr);
30320cf1dd8SToby Isaac   ierr = PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL);CHKERRQ(ierr);
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 
32020cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
32120cf1dd8SToby Isaac @*/
32220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
32320cf1dd8SToby Isaac {
32420cf1dd8SToby Isaac   PetscErrorCode ierr;
32520cf1dd8SToby Isaac 
32620cf1dd8SToby Isaac   PetscFunctionBegin;
32720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
32820cf1dd8SToby Isaac   PetscValidPointer(dim, 2);
32943bfef1cSToby Isaac   if (sp->dim == PETSC_DETERMINE) {
33043bfef1cSToby Isaac     if (sp->ops->getdimension) {ierr = (*sp->ops->getdimension)(sp, &sp->dim);CHKERRQ(ierr);}
33143bfef1cSToby Isaac   }
33243bfef1cSToby Isaac   *dim = sp->dim;
33320cf1dd8SToby Isaac   PetscFunctionReturn(0);
33420cf1dd8SToby Isaac }
33520cf1dd8SToby Isaac 
33620cf1dd8SToby Isaac /*@
33720cf1dd8SToby Isaac   PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
33820cf1dd8SToby Isaac 
33920cf1dd8SToby Isaac   Input Parameter:
34020cf1dd8SToby Isaac . sp - The PetscSpace
34120cf1dd8SToby Isaac 
34220cf1dd8SToby Isaac   Output Parameter:
34320cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space
34420cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space
34520cf1dd8SToby Isaac 
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);
35520cf1dd8SToby Isaac   if (minDegree) PetscValidPointer(minDegree, 2);
356f5a02b64SToby Isaac   if (maxDegree) PetscValidPointer(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 
39620cf1dd8SToby Isaac .seealso: PetscSpaceSetNumComponents(), 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);
40220cf1dd8SToby Isaac   PetscValidPointer(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 
41620cf1dd8SToby Isaac .seealso: PetscSpaceGetNumComponents(), 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 
42620cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
42720cf1dd8SToby Isaac {
42820cf1dd8SToby Isaac   PetscFunctionBegin;
42920cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
43020cf1dd8SToby Isaac   sp->Nv = n;
43120cf1dd8SToby Isaac   PetscFunctionReturn(0);
43220cf1dd8SToby Isaac }
43320cf1dd8SToby Isaac 
43420cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
43520cf1dd8SToby Isaac {
43620cf1dd8SToby Isaac   PetscFunctionBegin;
43720cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
43820cf1dd8SToby Isaac   PetscValidPointer(n, 2);
43920cf1dd8SToby Isaac   *n = sp->Nv;
44020cf1dd8SToby Isaac   PetscFunctionReturn(0);
44120cf1dd8SToby Isaac }
44220cf1dd8SToby Isaac 
44320cf1dd8SToby Isaac 
44420cf1dd8SToby Isaac /*@C
44520cf1dd8SToby Isaac   PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
44620cf1dd8SToby Isaac 
44720cf1dd8SToby Isaac   Input Parameters:
44820cf1dd8SToby Isaac + sp      - The PetscSpace
44920cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates
45020cf1dd8SToby Isaac - points  - The point coordinates
45120cf1dd8SToby Isaac 
45220cf1dd8SToby Isaac   Output Parameters:
45320cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array
45420cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array
45520cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array
45620cf1dd8SToby Isaac 
45720cf1dd8SToby Isaac   Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
45820cf1dd8SToby Isaac   on the reference cell, not in real space.
45920cf1dd8SToby Isaac 
46020cf1dd8SToby Isaac   Level: advanced
46120cf1dd8SToby Isaac 
46220cf1dd8SToby Isaac .seealso: PetscFEGetTabulation(), PetscFEGetDefaultTabulation(), PetscSpaceCreate()
46320cf1dd8SToby Isaac @*/
46420cf1dd8SToby Isaac PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
46520cf1dd8SToby Isaac {
46620cf1dd8SToby Isaac   PetscErrorCode ierr;
46720cf1dd8SToby Isaac 
46820cf1dd8SToby Isaac   PetscFunctionBegin;
46920cf1dd8SToby Isaac   if (!npoints) PetscFunctionReturn(0);
47020cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
47120cf1dd8SToby Isaac   if (sp->Nv) PetscValidPointer(points, 3);
47220cf1dd8SToby Isaac   if (B) PetscValidPointer(B, 4);
47320cf1dd8SToby Isaac   if (D) PetscValidPointer(D, 5);
47420cf1dd8SToby Isaac   if (H) PetscValidPointer(H, 6);
47520cf1dd8SToby Isaac   if (sp->ops->evaluate) {ierr = (*sp->ops->evaluate)(sp, npoints, points, B, D, H);CHKERRQ(ierr);}
47620cf1dd8SToby Isaac   PetscFunctionReturn(0);
47720cf1dd8SToby Isaac }
47820cf1dd8SToby Isaac 
47920cf1dd8SToby Isaac /*@
48020cf1dd8SToby Isaac   PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height.
48120cf1dd8SToby Isaac 
48220cf1dd8SToby Isaac   If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
48320cf1dd8SToby Isaac   pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not
48420cf1dd8SToby Isaac   support extracting subspaces, then NULL is returned.
48520cf1dd8SToby Isaac 
48620cf1dd8SToby Isaac   This does not increment the reference count on the returned space, and the user should not destroy it.
48720cf1dd8SToby Isaac 
48820cf1dd8SToby Isaac   Not collective
48920cf1dd8SToby Isaac 
49020cf1dd8SToby Isaac   Input Parameters:
49120cf1dd8SToby Isaac + sp - the PetscSpace object
49220cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired
49320cf1dd8SToby Isaac 
49420cf1dd8SToby Isaac   Output Parameter:
49520cf1dd8SToby Isaac . subsp - the subspace
49620cf1dd8SToby Isaac 
49720cf1dd8SToby Isaac   Level: advanced
49820cf1dd8SToby Isaac 
49920cf1dd8SToby Isaac .seealso: PetscDualSpaceGetHeightSubspace(), PetscSpace
50020cf1dd8SToby Isaac @*/
50120cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
50220cf1dd8SToby Isaac {
50320cf1dd8SToby Isaac   PetscErrorCode ierr;
50420cf1dd8SToby Isaac 
50520cf1dd8SToby Isaac   PetscFunctionBegin;
50620cf1dd8SToby Isaac   PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1);
50720cf1dd8SToby Isaac   PetscValidPointer(subsp, 3);
50820cf1dd8SToby Isaac   *subsp = NULL;
50920cf1dd8SToby Isaac   if (sp->ops->getheightsubspace) {
51020cf1dd8SToby Isaac     ierr = (*sp->ops->getheightsubspace)(sp, height, subsp);CHKERRQ(ierr);
51120cf1dd8SToby Isaac   }
51220cf1dd8SToby Isaac   PetscFunctionReturn(0);
51320cf1dd8SToby Isaac }
51420cf1dd8SToby Isaac 
515