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 122fe2efc57SMark PetscSpaceViewFromOptions - View from Options 123fe2efc57SMark 124fe2efc57SMark Collective on PetscSpace 125fe2efc57SMark 126fe2efc57SMark Input Parameters: 127fe2efc57SMark + A - the PetscSpace object 128736c3998SJose E. Roman . obj - Optional object 129736c3998SJose E. Roman - name - command line option 130fe2efc57SMark 131fe2efc57SMark Level: intermediate 132fe2efc57SMark .seealso: PetscSpace, PetscSpaceView, PetscObjectViewFromOptions(), PetscSpaceCreate() 133fe2efc57SMark @*/ 134fe2efc57SMark PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A,PetscObject obj,const char name[]) 135fe2efc57SMark { 136fe2efc57SMark PetscErrorCode ierr; 137fe2efc57SMark 138fe2efc57SMark PetscFunctionBegin; 139fe2efc57SMark PetscValidHeaderSpecific(A,PETSCSPACE_CLASSID,1); 140fe2efc57SMark ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr); 141fe2efc57SMark PetscFunctionReturn(0); 142fe2efc57SMark } 143fe2efc57SMark 144fe2efc57SMark /*@C 14520cf1dd8SToby Isaac PetscSpaceView - Views a PetscSpace 14620cf1dd8SToby Isaac 147d083f849SBarry Smith Collective on sp 14820cf1dd8SToby Isaac 14920cf1dd8SToby Isaac Input Parameter: 15020cf1dd8SToby Isaac + sp - the PetscSpace object to view 15120cf1dd8SToby Isaac - v - the viewer 15220cf1dd8SToby Isaac 15329b5c115SMatthew G. Knepley Level: beginner 15420cf1dd8SToby Isaac 15520cf1dd8SToby Isaac .seealso PetscSpaceDestroy() 15620cf1dd8SToby Isaac @*/ 15720cf1dd8SToby Isaac PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v) 15820cf1dd8SToby Isaac { 1590aec8e07SMatthew G. Knepley PetscInt pdim; 16020cf1dd8SToby Isaac PetscBool iascii; 16120cf1dd8SToby Isaac PetscErrorCode ierr; 16220cf1dd8SToby Isaac 16320cf1dd8SToby Isaac PetscFunctionBegin; 16420cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 16520cf1dd8SToby Isaac if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2); 16620cf1dd8SToby Isaac if (!v) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) sp), &v);CHKERRQ(ierr);} 1670aec8e07SMatthew G. Knepley ierr = PetscSpaceGetDimension(sp, &pdim);CHKERRQ(ierr); 16820cf1dd8SToby Isaac ierr = PetscObjectPrintClassNamePrefixType((PetscObject)sp,v);CHKERRQ(ierr); 169d9bac1caSLisandro Dalcin ierr = PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 17020cf1dd8SToby Isaac ierr = PetscViewerASCIIPushTab(v);CHKERRQ(ierr); 1710aec8e07SMatthew G. Knepley if (iascii) {ierr = PetscViewerASCIIPrintf(v, "Space in %D variables with %D components, size %D\n", sp->Nv, sp->Nc, pdim);CHKERRQ(ierr);} 17220cf1dd8SToby Isaac if (sp->ops->view) {ierr = (*sp->ops->view)(sp, v);CHKERRQ(ierr);} 17320cf1dd8SToby Isaac ierr = PetscViewerASCIIPopTab(v);CHKERRQ(ierr); 17420cf1dd8SToby Isaac PetscFunctionReturn(0); 17520cf1dd8SToby Isaac } 17620cf1dd8SToby Isaac 17720cf1dd8SToby Isaac /*@ 17820cf1dd8SToby Isaac PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database 17920cf1dd8SToby Isaac 180d083f849SBarry Smith Collective on sp 18120cf1dd8SToby Isaac 18220cf1dd8SToby Isaac Input Parameter: 18320cf1dd8SToby Isaac . sp - the PetscSpace object to set options for 18420cf1dd8SToby Isaac 18520cf1dd8SToby Isaac Options Database: 1867be5e748SToby Isaac . -petscspace_degree the approximation order of the space 18720cf1dd8SToby Isaac 18829b5c115SMatthew G. Knepley Level: intermediate 18920cf1dd8SToby Isaac 19020cf1dd8SToby Isaac .seealso PetscSpaceView() 19120cf1dd8SToby Isaac @*/ 19220cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp) 19320cf1dd8SToby Isaac { 19420cf1dd8SToby Isaac const char *defaultType; 19520cf1dd8SToby Isaac char name[256]; 1965a856986SBarry Smith PetscBool flg; 19720cf1dd8SToby Isaac PetscErrorCode ierr; 19820cf1dd8SToby Isaac 19920cf1dd8SToby Isaac PetscFunctionBegin; 20020cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 20120cf1dd8SToby Isaac if (!((PetscObject) sp)->type_name) { 20220cf1dd8SToby Isaac defaultType = PETSCSPACEPOLYNOMIAL; 20320cf1dd8SToby Isaac } else { 20420cf1dd8SToby Isaac defaultType = ((PetscObject) sp)->type_name; 20520cf1dd8SToby Isaac } 20620cf1dd8SToby Isaac if (!PetscSpaceRegisterAllCalled) {ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);} 20720cf1dd8SToby Isaac 20820cf1dd8SToby Isaac ierr = PetscObjectOptionsBegin((PetscObject) sp);CHKERRQ(ierr); 20920cf1dd8SToby Isaac ierr = PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg);CHKERRQ(ierr); 21020cf1dd8SToby Isaac if (flg) { 21120cf1dd8SToby Isaac ierr = PetscSpaceSetType(sp, name);CHKERRQ(ierr); 21220cf1dd8SToby Isaac } else if (!((PetscObject) sp)->type_name) { 21320cf1dd8SToby Isaac ierr = PetscSpaceSetType(sp, defaultType);CHKERRQ(ierr); 21420cf1dd8SToby Isaac } 2157be5e748SToby Isaac { 2165a856986SBarry Smith ierr = PetscOptionsDeprecated("-petscspace_order","-petscspace_degree","3.11",NULL);CHKERRQ(ierr); 2175a856986SBarry Smith ierr = PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0);CHKERRQ(ierr); 2187be5e748SToby Isaac } 2195a856986SBarry Smith ierr = PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0);CHKERRQ(ierr); 2205a856986SBarry Smith ierr = PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL,0);CHKERRQ(ierr); 2215a856986SBarry Smith ierr = PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL,0);CHKERRQ(ierr); 22220cf1dd8SToby Isaac if (sp->ops->setfromoptions) { 22320cf1dd8SToby Isaac ierr = (*sp->ops->setfromoptions)(PetscOptionsObject,sp);CHKERRQ(ierr); 22420cf1dd8SToby Isaac } 22520cf1dd8SToby Isaac /* process any options handlers added with PetscObjectAddOptionsHandler() */ 22620cf1dd8SToby Isaac ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) sp);CHKERRQ(ierr); 22720cf1dd8SToby Isaac ierr = PetscOptionsEnd();CHKERRQ(ierr); 22820cf1dd8SToby Isaac ierr = PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view");CHKERRQ(ierr); 22920cf1dd8SToby Isaac PetscFunctionReturn(0); 23020cf1dd8SToby Isaac } 23120cf1dd8SToby Isaac 23220cf1dd8SToby Isaac /*@C 23320cf1dd8SToby Isaac PetscSpaceSetUp - Construct data structures for the PetscSpace 23420cf1dd8SToby Isaac 235d083f849SBarry Smith Collective on sp 23620cf1dd8SToby Isaac 23720cf1dd8SToby Isaac Input Parameter: 23820cf1dd8SToby Isaac . sp - the PetscSpace object to setup 23920cf1dd8SToby Isaac 24029b5c115SMatthew G. Knepley Level: intermediate 24120cf1dd8SToby Isaac 24220cf1dd8SToby Isaac .seealso PetscSpaceView(), PetscSpaceDestroy() 24320cf1dd8SToby Isaac @*/ 24420cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetUp(PetscSpace sp) 24520cf1dd8SToby Isaac { 24620cf1dd8SToby Isaac PetscErrorCode ierr; 24720cf1dd8SToby Isaac 24820cf1dd8SToby Isaac PetscFunctionBegin; 24920cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 25020cf1dd8SToby Isaac if (sp->ops->setup) {ierr = (*sp->ops->setup)(sp);CHKERRQ(ierr);} 25120cf1dd8SToby Isaac PetscFunctionReturn(0); 25220cf1dd8SToby Isaac } 25320cf1dd8SToby Isaac 25420cf1dd8SToby Isaac /*@ 25520cf1dd8SToby Isaac PetscSpaceDestroy - Destroys a PetscSpace object 25620cf1dd8SToby Isaac 257d083f849SBarry Smith Collective on sp 25820cf1dd8SToby Isaac 25920cf1dd8SToby Isaac Input Parameter: 26020cf1dd8SToby Isaac . sp - the PetscSpace object to destroy 26120cf1dd8SToby Isaac 26229b5c115SMatthew G. Knepley Level: beginner 26320cf1dd8SToby Isaac 26420cf1dd8SToby Isaac .seealso PetscSpaceView() 26520cf1dd8SToby Isaac @*/ 26620cf1dd8SToby Isaac PetscErrorCode PetscSpaceDestroy(PetscSpace *sp) 26720cf1dd8SToby Isaac { 26820cf1dd8SToby Isaac PetscErrorCode ierr; 26920cf1dd8SToby Isaac 27020cf1dd8SToby Isaac PetscFunctionBegin; 27120cf1dd8SToby Isaac if (!*sp) PetscFunctionReturn(0); 27220cf1dd8SToby Isaac PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1); 27320cf1dd8SToby Isaac 274*ea78f98cSLisandro Dalcin if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);} 27520cf1dd8SToby Isaac ((PetscObject) (*sp))->refct = 0; 27620cf1dd8SToby Isaac ierr = DMDestroy(&(*sp)->dm);CHKERRQ(ierr); 27720cf1dd8SToby Isaac 27820cf1dd8SToby Isaac ierr = (*(*sp)->ops->destroy)(*sp);CHKERRQ(ierr); 27920cf1dd8SToby Isaac ierr = PetscHeaderDestroy(sp);CHKERRQ(ierr); 28020cf1dd8SToby Isaac PetscFunctionReturn(0); 28120cf1dd8SToby Isaac } 28220cf1dd8SToby Isaac 28320cf1dd8SToby Isaac /*@ 28420cf1dd8SToby Isaac PetscSpaceCreate - Creates an empty PetscSpace object. The type can then be set with PetscSpaceSetType(). 28520cf1dd8SToby Isaac 286d083f849SBarry Smith Collective 28720cf1dd8SToby Isaac 28820cf1dd8SToby Isaac Input Parameter: 28920cf1dd8SToby Isaac . comm - The communicator for the PetscSpace object 29020cf1dd8SToby Isaac 29120cf1dd8SToby Isaac Output Parameter: 29220cf1dd8SToby Isaac . sp - The PetscSpace object 29320cf1dd8SToby Isaac 29420cf1dd8SToby Isaac Level: beginner 29520cf1dd8SToby Isaac 29620cf1dd8SToby Isaac .seealso: PetscSpaceSetType(), PETSCSPACEPOLYNOMIAL 29720cf1dd8SToby Isaac @*/ 29820cf1dd8SToby Isaac PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp) 29920cf1dd8SToby Isaac { 30020cf1dd8SToby Isaac PetscSpace s; 30120cf1dd8SToby Isaac PetscErrorCode ierr; 30220cf1dd8SToby Isaac 30320cf1dd8SToby Isaac PetscFunctionBegin; 30420cf1dd8SToby Isaac PetscValidPointer(sp, 2); 30520cf1dd8SToby Isaac ierr = PetscCitationsRegister(FECitation,&FEcite);CHKERRQ(ierr); 30620cf1dd8SToby Isaac *sp = NULL; 30720cf1dd8SToby Isaac ierr = PetscFEInitializePackage();CHKERRQ(ierr); 30820cf1dd8SToby Isaac 30920cf1dd8SToby Isaac ierr = PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView);CHKERRQ(ierr); 31020cf1dd8SToby Isaac 31120cf1dd8SToby Isaac s->degree = 0; 31243bfef1cSToby Isaac s->maxDegree = PETSC_DETERMINE; 31320cf1dd8SToby Isaac s->Nc = 1; 31420cf1dd8SToby Isaac s->Nv = 0; 31543bfef1cSToby Isaac s->dim = PETSC_DETERMINE; 31620cf1dd8SToby Isaac ierr = DMShellCreate(comm, &s->dm);CHKERRQ(ierr); 31720cf1dd8SToby Isaac ierr = PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL);CHKERRQ(ierr); 31820cf1dd8SToby Isaac 31920cf1dd8SToby Isaac *sp = s; 32020cf1dd8SToby Isaac PetscFunctionReturn(0); 32120cf1dd8SToby Isaac } 32220cf1dd8SToby Isaac 32320cf1dd8SToby Isaac /*@ 32420cf1dd8SToby Isaac PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors 32520cf1dd8SToby Isaac 32620cf1dd8SToby Isaac Input Parameter: 32720cf1dd8SToby Isaac . sp - The PetscSpace 32820cf1dd8SToby Isaac 32920cf1dd8SToby Isaac Output Parameter: 33020cf1dd8SToby Isaac . dim - The dimension 33120cf1dd8SToby Isaac 33220cf1dd8SToby Isaac Level: intermediate 33320cf1dd8SToby Isaac 33420cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace 33520cf1dd8SToby Isaac @*/ 33620cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim) 33720cf1dd8SToby Isaac { 33820cf1dd8SToby Isaac PetscErrorCode ierr; 33920cf1dd8SToby Isaac 34020cf1dd8SToby Isaac PetscFunctionBegin; 34120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 34220cf1dd8SToby Isaac PetscValidPointer(dim, 2); 34343bfef1cSToby Isaac if (sp->dim == PETSC_DETERMINE) { 34443bfef1cSToby Isaac if (sp->ops->getdimension) {ierr = (*sp->ops->getdimension)(sp, &sp->dim);CHKERRQ(ierr);} 34543bfef1cSToby Isaac } 34643bfef1cSToby Isaac *dim = sp->dim; 34720cf1dd8SToby Isaac PetscFunctionReturn(0); 34820cf1dd8SToby Isaac } 34920cf1dd8SToby Isaac 35020cf1dd8SToby Isaac /*@ 35120cf1dd8SToby Isaac PetscSpaceGetDegree - Return the polynomial degrees that characterize this space 35220cf1dd8SToby Isaac 35320cf1dd8SToby Isaac Input Parameter: 35420cf1dd8SToby Isaac . sp - The PetscSpace 35520cf1dd8SToby Isaac 35620cf1dd8SToby Isaac Output Parameter: 35720cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space 35820cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space 35920cf1dd8SToby Isaac 36020cf1dd8SToby Isaac 36120cf1dd8SToby Isaac Level: intermediate 36220cf1dd8SToby Isaac 36320cf1dd8SToby Isaac .seealso: PetscSpaceSetDegree(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace 36420cf1dd8SToby Isaac @*/ 36520cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree) 36620cf1dd8SToby Isaac { 36720cf1dd8SToby Isaac PetscFunctionBegin; 36820cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 36920cf1dd8SToby Isaac if (minDegree) PetscValidPointer(minDegree, 2); 370f5a02b64SToby Isaac if (maxDegree) PetscValidPointer(maxDegree, 3); 37120cf1dd8SToby Isaac if (minDegree) *minDegree = sp->degree; 372f5a02b64SToby Isaac if (maxDegree) *maxDegree = sp->maxDegree; 37320cf1dd8SToby Isaac PetscFunctionReturn(0); 37420cf1dd8SToby Isaac } 37520cf1dd8SToby Isaac 37620cf1dd8SToby Isaac /*@ 37720cf1dd8SToby Isaac PetscSpaceSetDegree - Set the degree of approximation for this space. 37820cf1dd8SToby Isaac 37920cf1dd8SToby Isaac Input Parameters: 38020cf1dd8SToby Isaac + sp - The PetscSpace 381d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space 382d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space. One of degree and maxDegree can be PETSC_DETERMINE. 38320cf1dd8SToby Isaac 38420cf1dd8SToby Isaac Level: intermediate 38520cf1dd8SToby Isaac 38620cf1dd8SToby Isaac .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace 38720cf1dd8SToby Isaac @*/ 388d39dd5f5SToby Isaac PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree) 38920cf1dd8SToby Isaac { 39020cf1dd8SToby Isaac PetscFunctionBegin; 39120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 392d39dd5f5SToby Isaac sp->degree = degree; 393d39dd5f5SToby Isaac sp->maxDegree = maxDegree; 39420cf1dd8SToby Isaac PetscFunctionReturn(0); 39520cf1dd8SToby Isaac } 39620cf1dd8SToby Isaac 39720cf1dd8SToby Isaac /*@ 39820cf1dd8SToby Isaac PetscSpaceGetNumComponents - Return the number of components for this space 39920cf1dd8SToby Isaac 40020cf1dd8SToby Isaac Input Parameter: 40120cf1dd8SToby Isaac . sp - The PetscSpace 40220cf1dd8SToby Isaac 40320cf1dd8SToby Isaac Output Parameter: 40420cf1dd8SToby Isaac . Nc - The number of components 40520cf1dd8SToby Isaac 40620cf1dd8SToby Isaac Note: A vector space, for example, will have d components, where d is the spatial dimension 40720cf1dd8SToby Isaac 40820cf1dd8SToby Isaac Level: intermediate 40920cf1dd8SToby Isaac 41029b5c115SMatthew G. Knepley .seealso: PetscSpaceSetNumComponents(), PetscSpaceGetNumVariables(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace 41120cf1dd8SToby Isaac @*/ 41220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc) 41320cf1dd8SToby Isaac { 41420cf1dd8SToby Isaac PetscFunctionBegin; 41520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 41620cf1dd8SToby Isaac PetscValidPointer(Nc, 2); 41720cf1dd8SToby Isaac *Nc = sp->Nc; 41820cf1dd8SToby Isaac PetscFunctionReturn(0); 41920cf1dd8SToby Isaac } 42020cf1dd8SToby Isaac 42120cf1dd8SToby Isaac /*@ 42220cf1dd8SToby Isaac PetscSpaceSetNumComponents - Set the number of components for this space 42320cf1dd8SToby Isaac 42420cf1dd8SToby Isaac Input Parameters: 42520cf1dd8SToby Isaac + sp - The PetscSpace 42620cf1dd8SToby Isaac - order - The number of components 42720cf1dd8SToby Isaac 42820cf1dd8SToby Isaac Level: intermediate 42920cf1dd8SToby Isaac 43029b5c115SMatthew G. Knepley .seealso: PetscSpaceGetNumComponents(), PetscSpaceSetNumVariables(), PetscSpaceCreate(), PetscSpace 43120cf1dd8SToby Isaac @*/ 43220cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc) 43320cf1dd8SToby Isaac { 43420cf1dd8SToby Isaac PetscFunctionBegin; 43520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 43620cf1dd8SToby Isaac sp->Nc = Nc; 43720cf1dd8SToby Isaac PetscFunctionReturn(0); 43820cf1dd8SToby Isaac } 43920cf1dd8SToby Isaac 44029b5c115SMatthew G. Knepley /*@ 44129b5c115SMatthew G. Knepley PetscSpaceSetNumVariables - Set the number of variables for this space 44229b5c115SMatthew G. Knepley 44329b5c115SMatthew G. Knepley Input Parameters: 44429b5c115SMatthew G. Knepley + sp - The PetscSpace 44529b5c115SMatthew G. Knepley - n - The number of variables, e.g. x, y, z... 44629b5c115SMatthew G. Knepley 44729b5c115SMatthew G. Knepley Level: intermediate 44829b5c115SMatthew G. Knepley 44929b5c115SMatthew G. Knepley .seealso: PetscSpaceGetNumVariables(), PetscSpaceSetNumComponents(), PetscSpaceCreate(), PetscSpace 45029b5c115SMatthew G. Knepley @*/ 45120cf1dd8SToby Isaac PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n) 45220cf1dd8SToby Isaac { 45320cf1dd8SToby Isaac PetscFunctionBegin; 45420cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 45520cf1dd8SToby Isaac sp->Nv = n; 45620cf1dd8SToby Isaac PetscFunctionReturn(0); 45720cf1dd8SToby Isaac } 45820cf1dd8SToby Isaac 45929b5c115SMatthew G. Knepley /*@ 46029b5c115SMatthew G. Knepley PetscSpaceGetNumVariables - Return the number of variables for this space 46129b5c115SMatthew G. Knepley 46229b5c115SMatthew G. Knepley Input Parameter: 46329b5c115SMatthew G. Knepley . sp - The PetscSpace 46429b5c115SMatthew G. Knepley 46529b5c115SMatthew G. Knepley Output Parameter: 46629b5c115SMatthew G. Knepley . Nc - The number of variables, e.g. x, y, z... 46729b5c115SMatthew G. Knepley 46829b5c115SMatthew G. Knepley Level: intermediate 46929b5c115SMatthew G. Knepley 47029b5c115SMatthew G. Knepley .seealso: PetscSpaceSetNumVariables(), PetscSpaceGetNumComponents(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace 47129b5c115SMatthew G. Knepley @*/ 47220cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n) 47320cf1dd8SToby Isaac { 47420cf1dd8SToby Isaac PetscFunctionBegin; 47520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 47620cf1dd8SToby Isaac PetscValidPointer(n, 2); 47720cf1dd8SToby Isaac *n = sp->Nv; 47820cf1dd8SToby Isaac PetscFunctionReturn(0); 47920cf1dd8SToby Isaac } 48020cf1dd8SToby Isaac 48120cf1dd8SToby Isaac /*@C 48220cf1dd8SToby Isaac PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point 48320cf1dd8SToby Isaac 48420cf1dd8SToby Isaac Input Parameters: 48520cf1dd8SToby Isaac + sp - The PetscSpace 48620cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates 48720cf1dd8SToby Isaac - points - The point coordinates 48820cf1dd8SToby Isaac 48920cf1dd8SToby Isaac Output Parameters: 49020cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array 49120cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array 49220cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array 49320cf1dd8SToby Isaac 49420cf1dd8SToby Isaac Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given 49520cf1dd8SToby Isaac on the reference cell, not in real space. 49620cf1dd8SToby Isaac 49729b5c115SMatthew G. Knepley Level: beginner 49820cf1dd8SToby Isaac 499ef0bb6c7SMatthew G. Knepley .seealso: PetscFECreateTabulation(), PetscFEGetCellTabulation(), PetscSpaceCreate() 50020cf1dd8SToby Isaac @*/ 50120cf1dd8SToby Isaac PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) 50220cf1dd8SToby Isaac { 50320cf1dd8SToby Isaac PetscErrorCode ierr; 50420cf1dd8SToby Isaac 50520cf1dd8SToby Isaac PetscFunctionBegin; 50620cf1dd8SToby Isaac if (!npoints) PetscFunctionReturn(0); 50720cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 50820cf1dd8SToby Isaac if (sp->Nv) PetscValidPointer(points, 3); 50920cf1dd8SToby Isaac if (B) PetscValidPointer(B, 4); 51020cf1dd8SToby Isaac if (D) PetscValidPointer(D, 5); 51120cf1dd8SToby Isaac if (H) PetscValidPointer(H, 6); 51220cf1dd8SToby Isaac if (sp->ops->evaluate) {ierr = (*sp->ops->evaluate)(sp, npoints, points, B, D, H);CHKERRQ(ierr);} 51320cf1dd8SToby Isaac PetscFunctionReturn(0); 51420cf1dd8SToby Isaac } 51520cf1dd8SToby Isaac 51620cf1dd8SToby Isaac /*@ 51720cf1dd8SToby Isaac PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height. 51820cf1dd8SToby Isaac 51920cf1dd8SToby Isaac If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and 52020cf1dd8SToby Isaac pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not 52120cf1dd8SToby Isaac support extracting subspaces, then NULL is returned. 52220cf1dd8SToby Isaac 52320cf1dd8SToby Isaac This does not increment the reference count on the returned space, and the user should not destroy it. 52420cf1dd8SToby Isaac 52520cf1dd8SToby Isaac Not collective 52620cf1dd8SToby Isaac 52720cf1dd8SToby Isaac Input Parameters: 52820cf1dd8SToby Isaac + sp - the PetscSpace object 52920cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired 53020cf1dd8SToby Isaac 53120cf1dd8SToby Isaac Output Parameter: 53220cf1dd8SToby Isaac . subsp - the subspace 53320cf1dd8SToby Isaac 53420cf1dd8SToby Isaac Level: advanced 53520cf1dd8SToby Isaac 53620cf1dd8SToby Isaac .seealso: PetscDualSpaceGetHeightSubspace(), PetscSpace 53720cf1dd8SToby Isaac @*/ 53820cf1dd8SToby Isaac PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp) 53920cf1dd8SToby Isaac { 54020cf1dd8SToby Isaac PetscErrorCode ierr; 54120cf1dd8SToby Isaac 54220cf1dd8SToby Isaac PetscFunctionBegin; 54320cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 54420cf1dd8SToby Isaac PetscValidPointer(subsp, 3); 54520cf1dd8SToby Isaac *subsp = NULL; 54620cf1dd8SToby Isaac if (sp->ops->getheightsubspace) { 54720cf1dd8SToby Isaac ierr = (*sp->ops->getheightsubspace)(sp, height, subsp);CHKERRQ(ierr); 54820cf1dd8SToby Isaac } 54920cf1dd8SToby Isaac PetscFunctionReturn(0); 55020cf1dd8SToby Isaac } 551