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 } 88*43bfef1cSToby 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 = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 14720cf1dd8SToby Isaac if (iascii) { 14820cf1dd8SToby Isaac ierr = PetscObjectPrintClassNamePrefixType((PetscObject)sp,v);CHKERRQ(ierr); 14920cf1dd8SToby Isaac ierr = PetscViewerASCIIPushTab(v);CHKERRQ(ierr); 15020cf1dd8SToby Isaac ierr = PetscViewerASCIIPrintf(v, "Space in %D variables of order %D with %D components\n", sp->Nv, sp->degree, sp->Nc);CHKERRQ(ierr); 15120cf1dd8SToby Isaac ierr = PetscViewerASCIIPopTab(v);CHKERRQ(ierr); 15220cf1dd8SToby Isaac } 15320cf1dd8SToby Isaac ierr = PetscViewerASCIIPushTab(v);CHKERRQ(ierr); 15420cf1dd8SToby Isaac if (sp->ops->view) {ierr = (*sp->ops->view)(sp, v);CHKERRQ(ierr);} 15520cf1dd8SToby Isaac ierr = PetscViewerASCIIPopTab(v);CHKERRQ(ierr); 15620cf1dd8SToby Isaac PetscFunctionReturn(0); 15720cf1dd8SToby Isaac } 15820cf1dd8SToby Isaac 15920cf1dd8SToby Isaac /*@ 16020cf1dd8SToby Isaac PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database 16120cf1dd8SToby Isaac 16220cf1dd8SToby Isaac Collective on PetscSpace 16320cf1dd8SToby Isaac 16420cf1dd8SToby Isaac Input Parameter: 16520cf1dd8SToby Isaac . sp - the PetscSpace object to set options for 16620cf1dd8SToby Isaac 16720cf1dd8SToby Isaac Options Database: 1687be5e748SToby Isaac . -petscspace_degree the approximation order of the space 16920cf1dd8SToby Isaac 17020cf1dd8SToby Isaac Level: developer 17120cf1dd8SToby Isaac 17220cf1dd8SToby Isaac .seealso PetscSpaceView() 17320cf1dd8SToby Isaac @*/ 17420cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp) 17520cf1dd8SToby Isaac { 17620cf1dd8SToby Isaac const char *defaultType; 17720cf1dd8SToby Isaac char name[256]; 1787be5e748SToby Isaac PetscBool flg, orderflg; 17920cf1dd8SToby Isaac PetscErrorCode ierr; 18020cf1dd8SToby Isaac 18120cf1dd8SToby Isaac PetscFunctionBegin; 18220cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 18320cf1dd8SToby Isaac if (!((PetscObject) sp)->type_name) { 18420cf1dd8SToby Isaac defaultType = PETSCSPACEPOLYNOMIAL; 18520cf1dd8SToby Isaac } else { 18620cf1dd8SToby Isaac defaultType = ((PetscObject) sp)->type_name; 18720cf1dd8SToby Isaac } 18820cf1dd8SToby Isaac if (!PetscSpaceRegisterAllCalled) {ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);} 18920cf1dd8SToby Isaac 19020cf1dd8SToby Isaac ierr = PetscObjectOptionsBegin((PetscObject) sp);CHKERRQ(ierr); 19120cf1dd8SToby Isaac ierr = PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg);CHKERRQ(ierr); 19220cf1dd8SToby Isaac if (flg) { 19320cf1dd8SToby Isaac ierr = PetscSpaceSetType(sp, name);CHKERRQ(ierr); 19420cf1dd8SToby Isaac } else if (!((PetscObject) sp)->type_name) { 19520cf1dd8SToby Isaac ierr = PetscSpaceSetType(sp, defaultType);CHKERRQ(ierr); 19620cf1dd8SToby Isaac } 1977be5e748SToby Isaac { 1987be5e748SToby Isaac ierr = PetscOptionsInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, &orderflg);CHKERRQ(ierr); 1997be5e748SToby Isaac if (orderflg) { 2007be5e748SToby Isaac int compare; 2017be5e748SToby Isaac 2027be5e748SToby Isaac ierr = MPI_Comm_compare(PetscObjectComm((PetscObject)sp), PETSC_COMM_WORLD, &compare);CHKERRQ(ierr); 2037be5e748SToby Isaac 2047be5e748SToby Isaac if (compare == MPI_IDENT || compare == MPI_CONGRUENT) { 2057be5e748SToby Isaac ierr = PetscPrintf(PetscObjectComm((PetscObject)sp), "Warning: -petscspace_order is deprecated. Use -petscspace_degree\n");CHKERRQ(ierr); 2067be5e748SToby Isaac } 2077be5e748SToby Isaac } 2087be5e748SToby Isaac } 20936e5648fSToby Isaac ierr = PetscOptionsInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL);CHKERRQ(ierr); 21020cf1dd8SToby Isaac ierr = PetscOptionsInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL);CHKERRQ(ierr); 21120cf1dd8SToby Isaac ierr = PetscOptionsInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL);CHKERRQ(ierr); 21220cf1dd8SToby Isaac if (sp->ops->setfromoptions) { 21320cf1dd8SToby Isaac ierr = (*sp->ops->setfromoptions)(PetscOptionsObject,sp);CHKERRQ(ierr); 21420cf1dd8SToby Isaac } 21520cf1dd8SToby Isaac /* process any options handlers added with PetscObjectAddOptionsHandler() */ 21620cf1dd8SToby Isaac ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) sp);CHKERRQ(ierr); 21720cf1dd8SToby Isaac ierr = PetscOptionsEnd();CHKERRQ(ierr); 21820cf1dd8SToby Isaac ierr = PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view");CHKERRQ(ierr); 21920cf1dd8SToby Isaac PetscFunctionReturn(0); 22020cf1dd8SToby Isaac } 22120cf1dd8SToby Isaac 22220cf1dd8SToby Isaac /*@C 22320cf1dd8SToby Isaac PetscSpaceSetUp - Construct data structures for the PetscSpace 22420cf1dd8SToby Isaac 22520cf1dd8SToby Isaac Collective on PetscSpace 22620cf1dd8SToby Isaac 22720cf1dd8SToby Isaac Input Parameter: 22820cf1dd8SToby Isaac . sp - the PetscSpace object to setup 22920cf1dd8SToby Isaac 23020cf1dd8SToby Isaac Level: developer 23120cf1dd8SToby Isaac 23220cf1dd8SToby Isaac .seealso PetscSpaceView(), PetscSpaceDestroy() 23320cf1dd8SToby Isaac @*/ 23420cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetUp(PetscSpace sp) 23520cf1dd8SToby Isaac { 23620cf1dd8SToby Isaac PetscErrorCode ierr; 23720cf1dd8SToby Isaac 23820cf1dd8SToby Isaac PetscFunctionBegin; 23920cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 24020cf1dd8SToby Isaac if (sp->ops->setup) {ierr = (*sp->ops->setup)(sp);CHKERRQ(ierr);} 24120cf1dd8SToby Isaac PetscFunctionReturn(0); 24220cf1dd8SToby Isaac } 24320cf1dd8SToby Isaac 24420cf1dd8SToby Isaac /*@ 24520cf1dd8SToby Isaac PetscSpaceDestroy - Destroys a PetscSpace object 24620cf1dd8SToby Isaac 24720cf1dd8SToby Isaac Collective on PetscSpace 24820cf1dd8SToby Isaac 24920cf1dd8SToby Isaac Input Parameter: 25020cf1dd8SToby Isaac . sp - the PetscSpace object to destroy 25120cf1dd8SToby Isaac 25220cf1dd8SToby Isaac Level: developer 25320cf1dd8SToby Isaac 25420cf1dd8SToby Isaac .seealso PetscSpaceView() 25520cf1dd8SToby Isaac @*/ 25620cf1dd8SToby Isaac PetscErrorCode PetscSpaceDestroy(PetscSpace *sp) 25720cf1dd8SToby Isaac { 25820cf1dd8SToby Isaac PetscErrorCode ierr; 25920cf1dd8SToby Isaac 26020cf1dd8SToby Isaac PetscFunctionBegin; 26120cf1dd8SToby Isaac if (!*sp) PetscFunctionReturn(0); 26220cf1dd8SToby Isaac PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1); 26320cf1dd8SToby Isaac 26420cf1dd8SToby Isaac if (--((PetscObject)(*sp))->refct > 0) {*sp = 0; PetscFunctionReturn(0);} 26520cf1dd8SToby Isaac ((PetscObject) (*sp))->refct = 0; 26620cf1dd8SToby Isaac ierr = DMDestroy(&(*sp)->dm);CHKERRQ(ierr); 26720cf1dd8SToby Isaac 26820cf1dd8SToby Isaac ierr = (*(*sp)->ops->destroy)(*sp);CHKERRQ(ierr); 26920cf1dd8SToby Isaac ierr = PetscHeaderDestroy(sp);CHKERRQ(ierr); 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 27620cf1dd8SToby Isaac Collective on MPI_Comm 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 PetscErrorCode ierr; 29220cf1dd8SToby Isaac 29320cf1dd8SToby Isaac PetscFunctionBegin; 29420cf1dd8SToby Isaac PetscValidPointer(sp, 2); 29520cf1dd8SToby Isaac ierr = PetscCitationsRegister(FECitation,&FEcite);CHKERRQ(ierr); 29620cf1dd8SToby Isaac *sp = NULL; 29720cf1dd8SToby Isaac ierr = PetscFEInitializePackage();CHKERRQ(ierr); 29820cf1dd8SToby Isaac 29920cf1dd8SToby Isaac ierr = PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView);CHKERRQ(ierr); 30020cf1dd8SToby Isaac 30120cf1dd8SToby Isaac s->degree = 0; 302*43bfef1cSToby Isaac s->maxDegree = PETSC_DETERMINE; 30320cf1dd8SToby Isaac s->Nc = 1; 30420cf1dd8SToby Isaac s->Nv = 0; 305*43bfef1cSToby Isaac s->dim = PETSC_DETERMINE; 30620cf1dd8SToby Isaac ierr = DMShellCreate(comm, &s->dm);CHKERRQ(ierr); 30720cf1dd8SToby Isaac ierr = PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL);CHKERRQ(ierr); 30820cf1dd8SToby Isaac 30920cf1dd8SToby Isaac *sp = s; 31020cf1dd8SToby Isaac PetscFunctionReturn(0); 31120cf1dd8SToby Isaac } 31220cf1dd8SToby Isaac 31320cf1dd8SToby Isaac /*@ 31420cf1dd8SToby Isaac PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors 31520cf1dd8SToby Isaac 31620cf1dd8SToby Isaac Input Parameter: 31720cf1dd8SToby Isaac . sp - The PetscSpace 31820cf1dd8SToby Isaac 31920cf1dd8SToby Isaac Output Parameter: 32020cf1dd8SToby Isaac . dim - The dimension 32120cf1dd8SToby Isaac 32220cf1dd8SToby Isaac Level: intermediate 32320cf1dd8SToby Isaac 32420cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace 32520cf1dd8SToby Isaac @*/ 32620cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim) 32720cf1dd8SToby Isaac { 32820cf1dd8SToby Isaac PetscErrorCode ierr; 32920cf1dd8SToby Isaac 33020cf1dd8SToby Isaac PetscFunctionBegin; 33120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 33220cf1dd8SToby Isaac PetscValidPointer(dim, 2); 333*43bfef1cSToby Isaac if (sp->dim == PETSC_DETERMINE) { 334*43bfef1cSToby Isaac if (sp->ops->getdimension) {ierr = (*sp->ops->getdimension)(sp, &sp->dim);CHKERRQ(ierr);} 335*43bfef1cSToby Isaac } 336*43bfef1cSToby Isaac *dim = sp->dim; 33720cf1dd8SToby Isaac PetscFunctionReturn(0); 33820cf1dd8SToby Isaac } 33920cf1dd8SToby Isaac 34020cf1dd8SToby Isaac /*@ 34120cf1dd8SToby Isaac PetscSpaceGetDegree - Return the polynomial degrees that characterize this space 34220cf1dd8SToby Isaac 34320cf1dd8SToby Isaac Input Parameter: 34420cf1dd8SToby Isaac . sp - The PetscSpace 34520cf1dd8SToby Isaac 34620cf1dd8SToby Isaac Output Parameter: 34720cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space 34820cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space 34920cf1dd8SToby Isaac 35020cf1dd8SToby Isaac 35120cf1dd8SToby Isaac Level: intermediate 35220cf1dd8SToby Isaac 35320cf1dd8SToby Isaac .seealso: PetscSpaceSetDegree(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace 35420cf1dd8SToby Isaac @*/ 35520cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree) 35620cf1dd8SToby Isaac { 35720cf1dd8SToby Isaac PetscFunctionBegin; 35820cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 35920cf1dd8SToby Isaac if (minDegree) PetscValidPointer(minDegree, 2); 360f5a02b64SToby Isaac if (maxDegree) PetscValidPointer(maxDegree, 3); 36120cf1dd8SToby Isaac if (minDegree) *minDegree = sp->degree; 362f5a02b64SToby Isaac if (maxDegree) *maxDegree = sp->maxDegree; 36320cf1dd8SToby Isaac PetscFunctionReturn(0); 36420cf1dd8SToby Isaac } 36520cf1dd8SToby Isaac 36620cf1dd8SToby Isaac /*@ 36720cf1dd8SToby Isaac PetscSpaceSetDegree - Set the degree of approximation for this space. 36820cf1dd8SToby Isaac 36920cf1dd8SToby Isaac Input Parameters: 37020cf1dd8SToby Isaac + sp - The PetscSpace 371d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space 372d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space. One of degree and maxDegree can be PETSC_DETERMINE. 37320cf1dd8SToby Isaac 37420cf1dd8SToby Isaac Level: intermediate 37520cf1dd8SToby Isaac 37620cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace 37720cf1dd8SToby Isaac @*/ 378d39dd5f5SToby Isaac PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree) 37920cf1dd8SToby Isaac { 38020cf1dd8SToby Isaac PetscFunctionBegin; 38120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 382d39dd5f5SToby Isaac sp->degree = degree; 383d39dd5f5SToby Isaac sp->maxDegree = maxDegree; 38420cf1dd8SToby Isaac PetscFunctionReturn(0); 38520cf1dd8SToby Isaac } 38620cf1dd8SToby Isaac 38720cf1dd8SToby Isaac /*@ 38820cf1dd8SToby Isaac PetscSpaceGetNumComponents - Return the number of components for this space 38920cf1dd8SToby Isaac 39020cf1dd8SToby Isaac Input Parameter: 39120cf1dd8SToby Isaac . sp - The PetscSpace 39220cf1dd8SToby Isaac 39320cf1dd8SToby Isaac Output Parameter: 39420cf1dd8SToby Isaac . Nc - The number of components 39520cf1dd8SToby Isaac 39620cf1dd8SToby Isaac Note: A vector space, for example, will have d components, where d is the spatial dimension 39720cf1dd8SToby Isaac 39820cf1dd8SToby Isaac Level: intermediate 39920cf1dd8SToby Isaac 40020cf1dd8SToby Isaac .seealso: PetscSpaceSetNumComponents(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace 40120cf1dd8SToby Isaac @*/ 40220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc) 40320cf1dd8SToby Isaac { 40420cf1dd8SToby Isaac PetscFunctionBegin; 40520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 40620cf1dd8SToby Isaac PetscValidPointer(Nc, 2); 40720cf1dd8SToby Isaac *Nc = sp->Nc; 40820cf1dd8SToby Isaac PetscFunctionReturn(0); 40920cf1dd8SToby Isaac } 41020cf1dd8SToby Isaac 41120cf1dd8SToby Isaac /*@ 41220cf1dd8SToby Isaac PetscSpaceSetNumComponents - Set the number of components for this space 41320cf1dd8SToby Isaac 41420cf1dd8SToby Isaac Input Parameters: 41520cf1dd8SToby Isaac + sp - The PetscSpace 41620cf1dd8SToby Isaac - order - The number of components 41720cf1dd8SToby Isaac 41820cf1dd8SToby Isaac Level: intermediate 41920cf1dd8SToby Isaac 42020cf1dd8SToby Isaac .seealso: PetscSpaceGetNumComponents(), PetscSpaceCreate(), PetscSpace 42120cf1dd8SToby Isaac @*/ 42220cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc) 42320cf1dd8SToby Isaac { 42420cf1dd8SToby Isaac PetscFunctionBegin; 42520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 42620cf1dd8SToby Isaac sp->Nc = Nc; 42720cf1dd8SToby Isaac PetscFunctionReturn(0); 42820cf1dd8SToby Isaac } 42920cf1dd8SToby Isaac 43020cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n) 43120cf1dd8SToby Isaac { 43220cf1dd8SToby Isaac PetscFunctionBegin; 43320cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 43420cf1dd8SToby Isaac sp->Nv = n; 43520cf1dd8SToby Isaac PetscFunctionReturn(0); 43620cf1dd8SToby Isaac } 43720cf1dd8SToby Isaac 43820cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n) 43920cf1dd8SToby Isaac { 44020cf1dd8SToby Isaac PetscFunctionBegin; 44120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 44220cf1dd8SToby Isaac PetscValidPointer(n, 2); 44320cf1dd8SToby Isaac *n = sp->Nv; 44420cf1dd8SToby Isaac PetscFunctionReturn(0); 44520cf1dd8SToby Isaac } 44620cf1dd8SToby Isaac 44720cf1dd8SToby Isaac 44820cf1dd8SToby Isaac /*@C 44920cf1dd8SToby Isaac PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point 45020cf1dd8SToby Isaac 45120cf1dd8SToby Isaac Input Parameters: 45220cf1dd8SToby Isaac + sp - The PetscSpace 45320cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates 45420cf1dd8SToby Isaac - points - The point coordinates 45520cf1dd8SToby Isaac 45620cf1dd8SToby Isaac Output Parameters: 45720cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array 45820cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array 45920cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array 46020cf1dd8SToby Isaac 46120cf1dd8SToby Isaac Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given 46220cf1dd8SToby Isaac on the reference cell, not in real space. 46320cf1dd8SToby Isaac 46420cf1dd8SToby Isaac Level: advanced 46520cf1dd8SToby Isaac 46620cf1dd8SToby Isaac .seealso: PetscFEGetTabulation(), PetscFEGetDefaultTabulation(), PetscSpaceCreate() 46720cf1dd8SToby Isaac @*/ 46820cf1dd8SToby Isaac PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) 46920cf1dd8SToby Isaac { 47020cf1dd8SToby Isaac PetscErrorCode ierr; 47120cf1dd8SToby Isaac 47220cf1dd8SToby Isaac PetscFunctionBegin; 47320cf1dd8SToby Isaac if (!npoints) PetscFunctionReturn(0); 47420cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 47520cf1dd8SToby Isaac if (sp->Nv) PetscValidPointer(points, 3); 47620cf1dd8SToby Isaac if (B) PetscValidPointer(B, 4); 47720cf1dd8SToby Isaac if (D) PetscValidPointer(D, 5); 47820cf1dd8SToby Isaac if (H) PetscValidPointer(H, 6); 47920cf1dd8SToby Isaac if (sp->ops->evaluate) {ierr = (*sp->ops->evaluate)(sp, npoints, points, B, D, H);CHKERRQ(ierr);} 48020cf1dd8SToby Isaac PetscFunctionReturn(0); 48120cf1dd8SToby Isaac } 48220cf1dd8SToby Isaac 48320cf1dd8SToby Isaac /*@ 48420cf1dd8SToby Isaac PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height. 48520cf1dd8SToby Isaac 48620cf1dd8SToby Isaac If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and 48720cf1dd8SToby Isaac pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not 48820cf1dd8SToby Isaac support extracting subspaces, then NULL is returned. 48920cf1dd8SToby Isaac 49020cf1dd8SToby Isaac This does not increment the reference count on the returned space, and the user should not destroy it. 49120cf1dd8SToby Isaac 49220cf1dd8SToby Isaac Not collective 49320cf1dd8SToby Isaac 49420cf1dd8SToby Isaac Input Parameters: 49520cf1dd8SToby Isaac + sp - the PetscSpace object 49620cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired 49720cf1dd8SToby Isaac 49820cf1dd8SToby Isaac Output Parameter: 49920cf1dd8SToby Isaac . subsp - the subspace 50020cf1dd8SToby Isaac 50120cf1dd8SToby Isaac Level: advanced 50220cf1dd8SToby Isaac 50320cf1dd8SToby Isaac .seealso: PetscDualSpaceGetHeightSubspace(), PetscSpace 50420cf1dd8SToby Isaac @*/ 50520cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp) 50620cf1dd8SToby Isaac { 50720cf1dd8SToby Isaac PetscErrorCode ierr; 50820cf1dd8SToby Isaac 50920cf1dd8SToby Isaac PetscFunctionBegin; 51020cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 51120cf1dd8SToby Isaac PetscValidPointer(subsp, 3); 51220cf1dd8SToby Isaac *subsp = NULL; 51320cf1dd8SToby Isaac if (sp->ops->getheightsubspace) { 51420cf1dd8SToby Isaac ierr = (*sp->ops->getheightsubspace)(sp, height, subsp);CHKERRQ(ierr); 51520cf1dd8SToby Isaac } 51620cf1dd8SToby Isaac PetscFunctionReturn(0); 51720cf1dd8SToby Isaac } 51820cf1dd8SToby Isaac 519