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 10*dce8aebaSBarry Smith 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 Sample usage: 1920cf1dd8SToby Isaac .vb 2020cf1dd8SToby Isaac PetscSpaceRegister("my_space", MyPetscSpaceCreate); 2120cf1dd8SToby Isaac .ve 2220cf1dd8SToby Isaac 2320cf1dd8SToby Isaac Then, your PetscSpace type can be chosen with the procedural interface via 2420cf1dd8SToby Isaac .vb 2520cf1dd8SToby Isaac PetscSpaceCreate(MPI_Comm, PetscSpace *); 2620cf1dd8SToby Isaac PetscSpaceSetType(PetscSpace, "my_space"); 2720cf1dd8SToby Isaac .ve 2820cf1dd8SToby Isaac or at runtime via the option 2920cf1dd8SToby Isaac .vb 3020cf1dd8SToby Isaac -petscspace_type my_space 3120cf1dd8SToby Isaac .ve 3220cf1dd8SToby Isaac 3320cf1dd8SToby Isaac Level: advanced 3420cf1dd8SToby Isaac 35*dce8aebaSBarry Smith Note: 36*dce8aebaSBarry Smith `PetscSpaceRegister()` may be called multiple times to add several user-defined types of `PetscSpace`. The creation function is called 37*dce8aebaSBarry Smith when the type is set to 'name'. 3820cf1dd8SToby Isaac 39*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceRegisterAll()`, `PetscSpaceRegisterDestroy()` 4020cf1dd8SToby Isaac @*/ 41d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace)) 42d71ae5a4SJacob Faibussowitsch { 4320cf1dd8SToby Isaac PetscFunctionBegin; 449566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscSpaceList, sname, function)); 4520cf1dd8SToby Isaac PetscFunctionReturn(0); 4620cf1dd8SToby Isaac } 4720cf1dd8SToby Isaac 4820cf1dd8SToby Isaac /*@C 49*dce8aebaSBarry Smith PetscSpaceSetType - Builds a particular `PetscSpace` 5020cf1dd8SToby Isaac 51d083f849SBarry Smith Collective on sp 5220cf1dd8SToby Isaac 5320cf1dd8SToby Isaac Input Parameters: 54*dce8aebaSBarry Smith + sp - The `PetscSpace` object 5520cf1dd8SToby Isaac - name - The kind of space 5620cf1dd8SToby Isaac 5720cf1dd8SToby Isaac Options Database Key: 58*dce8aebaSBarry Smith . -petscspace_type <type> - Sets the `PetscSpace` type; use -help for a list of available types 5920cf1dd8SToby Isaac 6020cf1dd8SToby Isaac Level: intermediate 6120cf1dd8SToby Isaac 62*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceType`, `PetscSpaceGetType()`, `PetscSpaceCreate()` 6320cf1dd8SToby Isaac @*/ 64d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name) 65d71ae5a4SJacob Faibussowitsch { 6620cf1dd8SToby Isaac PetscErrorCode (*r)(PetscSpace); 6720cf1dd8SToby Isaac PetscBool match; 6820cf1dd8SToby Isaac 6920cf1dd8SToby Isaac PetscFunctionBegin; 7020cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 719566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)sp, name, &match)); 7220cf1dd8SToby Isaac if (match) PetscFunctionReturn(0); 7320cf1dd8SToby Isaac 749566063dSJacob Faibussowitsch PetscCall(PetscSpaceRegisterAll()); 759566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscSpaceList, name, &r)); 762c71b3e2SJacob Faibussowitsch PetscCheck(r, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name); 7720cf1dd8SToby Isaac 78dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, destroy); 7920cf1dd8SToby Isaac sp->ops->destroy = NULL; 80dbbe0bcdSBarry Smith 8143bfef1cSToby Isaac sp->dim = PETSC_DETERMINE; 829566063dSJacob Faibussowitsch PetscCall((*r)(sp)); 839566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)sp, name)); 8420cf1dd8SToby Isaac PetscFunctionReturn(0); 8520cf1dd8SToby Isaac } 8620cf1dd8SToby Isaac 8720cf1dd8SToby Isaac /*@C 88*dce8aebaSBarry Smith PetscSpaceGetType - Gets the `PetscSpaceType` (as a string) from the object. 8920cf1dd8SToby Isaac 9020cf1dd8SToby Isaac Not Collective 9120cf1dd8SToby Isaac 9220cf1dd8SToby Isaac Input Parameter: 93*dce8aebaSBarry Smith . sp - The `PetscSpace` 9420cf1dd8SToby Isaac 9520cf1dd8SToby Isaac Output Parameter: 96*dce8aebaSBarry Smith . name - The `PetscSpace` type name 9720cf1dd8SToby Isaac 9820cf1dd8SToby Isaac Level: intermediate 9920cf1dd8SToby Isaac 100*dce8aebaSBarry Smith .seealso: `PetscSpaceType`, `PetscSpace`, `PetscSpaceSetType()`, `PetscSpaceCreate()` 10120cf1dd8SToby Isaac @*/ 102d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name) 103d71ae5a4SJacob Faibussowitsch { 10420cf1dd8SToby Isaac PetscFunctionBegin; 10520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 10620cf1dd8SToby Isaac PetscValidPointer(name, 2); 10748a46eb9SPierre Jolivet if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll()); 10820cf1dd8SToby Isaac *name = ((PetscObject)sp)->type_name; 10920cf1dd8SToby Isaac PetscFunctionReturn(0); 11020cf1dd8SToby Isaac } 11120cf1dd8SToby Isaac 11220cf1dd8SToby Isaac /*@C 113*dce8aebaSBarry Smith PetscSpaceViewFromOptions - View a `PetscSpace` based on values in the options database 114fe2efc57SMark 115fe2efc57SMark Collective on PetscSpace 116fe2efc57SMark 117fe2efc57SMark Input Parameters: 118fe2efc57SMark + A - the PetscSpace object 119*dce8aebaSBarry Smith . obj - Optional object that provides the options name prefix 120*dce8aebaSBarry Smith - name - command line option name 121fe2efc57SMark 122fe2efc57SMark Level: intermediate 123*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`, `PetscObjectViewFromOptions()`, `PetscSpaceCreate()` 124fe2efc57SMark @*/ 125d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A, PetscObject obj, const char name[]) 126d71ae5a4SJacob Faibussowitsch { 127fe2efc57SMark PetscFunctionBegin; 128fe2efc57SMark PetscValidHeaderSpecific(A, PETSCSPACE_CLASSID, 1); 1299566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 130fe2efc57SMark PetscFunctionReturn(0); 131fe2efc57SMark } 132fe2efc57SMark 133fe2efc57SMark /*@C 134*dce8aebaSBarry Smith PetscSpaceView - Views a `PetscSpace` 13520cf1dd8SToby Isaac 136d083f849SBarry Smith Collective on sp 13720cf1dd8SToby Isaac 138d8d19677SJose E. Roman Input Parameters: 139*dce8aebaSBarry Smith + sp - the `PetscSpace` object to view 14020cf1dd8SToby Isaac - v - the viewer 14120cf1dd8SToby Isaac 14229b5c115SMatthew G. Knepley Level: beginner 14320cf1dd8SToby Isaac 144*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscViewer`, `PetscSpaceViewFromOptions()`, `PetscSpaceDestroy()` 14520cf1dd8SToby Isaac @*/ 146d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v) 147d71ae5a4SJacob Faibussowitsch { 1480aec8e07SMatthew G. Knepley PetscInt pdim; 14920cf1dd8SToby Isaac PetscBool iascii; 15020cf1dd8SToby Isaac 15120cf1dd8SToby Isaac PetscFunctionBegin; 15220cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 15320cf1dd8SToby Isaac if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2); 1549566063dSJacob Faibussowitsch if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)sp), &v)); 1559566063dSJacob Faibussowitsch PetscCall(PetscSpaceGetDimension(sp, &pdim)); 1569566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)sp, v)); 1579566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii)); 1589566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(v)); 15963a3b9bcSJacob Faibussowitsch if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Space in %" PetscInt_FMT " variables with %" PetscInt_FMT " components, size %" PetscInt_FMT "\n", sp->Nv, sp->Nc, pdim)); 160dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, view, v); 1619566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(v)); 16220cf1dd8SToby Isaac PetscFunctionReturn(0); 16320cf1dd8SToby Isaac } 16420cf1dd8SToby Isaac 16520cf1dd8SToby Isaac /*@ 166*dce8aebaSBarry Smith PetscSpaceSetFromOptions - sets parameters in a `PetscSpace` from the options database 16720cf1dd8SToby Isaac 168d083f849SBarry Smith Collective on sp 16920cf1dd8SToby Isaac 17020cf1dd8SToby Isaac Input Parameter: 171*dce8aebaSBarry Smith . sp - the `PetscSpace` object to set options for 17220cf1dd8SToby Isaac 173*dce8aebaSBarry Smith Options Database Keys: 1748f2aacc6SMatthew G. Knepley + -petscspace_degree <deg> - the approximation order of the space 1758f2aacc6SMatthew G. Knepley . -petscspace_variables <n> - the number of different variables, e.g. x and y 1768f2aacc6SMatthew G. Knepley - -petscspace_components <c> - the number of components, say d for a vector field 17720cf1dd8SToby Isaac 17829b5c115SMatthew G. Knepley Level: intermediate 17920cf1dd8SToby Isaac 180*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()` 18120cf1dd8SToby Isaac @*/ 182d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp) 183d71ae5a4SJacob Faibussowitsch { 18420cf1dd8SToby Isaac const char *defaultType; 18520cf1dd8SToby Isaac char name[256]; 1865a856986SBarry Smith PetscBool flg; 18720cf1dd8SToby Isaac 18820cf1dd8SToby Isaac PetscFunctionBegin; 18920cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 19020cf1dd8SToby Isaac if (!((PetscObject)sp)->type_name) { 19120cf1dd8SToby Isaac defaultType = PETSCSPACEPOLYNOMIAL; 19220cf1dd8SToby Isaac } else { 19320cf1dd8SToby Isaac defaultType = ((PetscObject)sp)->type_name; 19420cf1dd8SToby Isaac } 1959566063dSJacob Faibussowitsch if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll()); 19620cf1dd8SToby Isaac 197d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)sp); 1989566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg)); 19920cf1dd8SToby Isaac if (flg) { 2009566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetType(sp, name)); 20120cf1dd8SToby Isaac } else if (!((PetscObject)sp)->type_name) { 2029566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetType(sp, defaultType)); 20320cf1dd8SToby Isaac } 2047be5e748SToby Isaac { 2059566063dSJacob Faibussowitsch PetscCall(PetscOptionsDeprecated("-petscspace_order", "-petscspace_degree", "3.11", NULL)); 2069566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0)); 2077be5e748SToby Isaac } 2089566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0)); 2099566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL, 0)); 2109566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL, 0)); 211dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, setfromoptions, PetscOptionsObject); 21220cf1dd8SToby Isaac /* process any options handlers added with PetscObjectAddOptionsHandler() */ 213dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)sp, PetscOptionsObject)); 214d0609cedSBarry Smith PetscOptionsEnd(); 2159566063dSJacob Faibussowitsch PetscCall(PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view")); 21620cf1dd8SToby Isaac PetscFunctionReturn(0); 21720cf1dd8SToby Isaac } 21820cf1dd8SToby Isaac 21920cf1dd8SToby Isaac /*@C 220*dce8aebaSBarry Smith PetscSpaceSetUp - Construct data structures for the `PetscSpace` 22120cf1dd8SToby Isaac 222d083f849SBarry Smith Collective on sp 22320cf1dd8SToby Isaac 22420cf1dd8SToby Isaac Input Parameter: 225*dce8aebaSBarry Smith . sp - the `PetscSpace` object to setup 22620cf1dd8SToby Isaac 22729b5c115SMatthew G. Knepley Level: intermediate 22820cf1dd8SToby Isaac 229*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceView()`, `PetscSpaceDestroy()` 23020cf1dd8SToby Isaac @*/ 231d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetUp(PetscSpace sp) 232d71ae5a4SJacob Faibussowitsch { 23320cf1dd8SToby Isaac PetscFunctionBegin; 23420cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 235dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, setup); 23620cf1dd8SToby Isaac PetscFunctionReturn(0); 23720cf1dd8SToby Isaac } 23820cf1dd8SToby Isaac 23920cf1dd8SToby Isaac /*@ 240*dce8aebaSBarry Smith PetscSpaceDestroy - Destroys a `PetscSpace` object 24120cf1dd8SToby Isaac 242d083f849SBarry Smith Collective on sp 24320cf1dd8SToby Isaac 24420cf1dd8SToby Isaac Input Parameter: 24520cf1dd8SToby Isaac . sp - the PetscSpace object to destroy 24620cf1dd8SToby Isaac 24729b5c115SMatthew G. Knepley Level: beginner 24820cf1dd8SToby Isaac 249*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceCreate()` 25020cf1dd8SToby Isaac @*/ 251d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceDestroy(PetscSpace *sp) 252d71ae5a4SJacob Faibussowitsch { 25320cf1dd8SToby Isaac PetscFunctionBegin; 25420cf1dd8SToby Isaac if (!*sp) PetscFunctionReturn(0); 25520cf1dd8SToby Isaac PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1); 25620cf1dd8SToby Isaac 2579371c9d4SSatish Balay if (--((PetscObject)(*sp))->refct > 0) { 2589371c9d4SSatish Balay *sp = NULL; 2599371c9d4SSatish Balay PetscFunctionReturn(0); 2609371c9d4SSatish Balay } 26120cf1dd8SToby Isaac ((PetscObject)(*sp))->refct = 0; 2629566063dSJacob Faibussowitsch PetscCall(DMDestroy(&(*sp)->dm)); 26320cf1dd8SToby Isaac 2649566063dSJacob Faibussowitsch PetscCall((*(*sp)->ops->destroy)(*sp)); 2659566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(sp)); 26620cf1dd8SToby Isaac PetscFunctionReturn(0); 26720cf1dd8SToby Isaac } 26820cf1dd8SToby Isaac 26920cf1dd8SToby Isaac /*@ 270*dce8aebaSBarry Smith PetscSpaceCreate - Creates an empty `PetscSpace` object. The type can then be set with `PetscSpaceSetType()`. 27120cf1dd8SToby Isaac 272d083f849SBarry Smith Collective 27320cf1dd8SToby Isaac 27420cf1dd8SToby Isaac Input Parameter: 275*dce8aebaSBarry Smith . comm - The communicator for the `PetscSpace` object 27620cf1dd8SToby Isaac 27720cf1dd8SToby Isaac Output Parameter: 278*dce8aebaSBarry Smith . sp - The `PetscSpace` object 27920cf1dd8SToby Isaac 28020cf1dd8SToby Isaac Level: beginner 28120cf1dd8SToby Isaac 282*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetType()`, `PETSCSPACEPOLYNOMIAL` 28320cf1dd8SToby Isaac @*/ 284d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp) 285d71ae5a4SJacob Faibussowitsch { 28620cf1dd8SToby Isaac PetscSpace s; 28720cf1dd8SToby Isaac 28820cf1dd8SToby Isaac PetscFunctionBegin; 28920cf1dd8SToby Isaac PetscValidPointer(sp, 2); 2909566063dSJacob Faibussowitsch PetscCall(PetscCitationsRegister(FECitation, &FEcite)); 29120cf1dd8SToby Isaac *sp = NULL; 2929566063dSJacob Faibussowitsch PetscCall(PetscFEInitializePackage()); 29320cf1dd8SToby Isaac 2949566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView)); 29520cf1dd8SToby Isaac 29620cf1dd8SToby Isaac s->degree = 0; 29743bfef1cSToby Isaac s->maxDegree = PETSC_DETERMINE; 29820cf1dd8SToby Isaac s->Nc = 1; 29920cf1dd8SToby Isaac s->Nv = 0; 30043bfef1cSToby Isaac s->dim = PETSC_DETERMINE; 3019566063dSJacob Faibussowitsch PetscCall(DMShellCreate(comm, &s->dm)); 3029566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL)); 30320cf1dd8SToby Isaac 30420cf1dd8SToby Isaac *sp = s; 30520cf1dd8SToby Isaac PetscFunctionReturn(0); 30620cf1dd8SToby Isaac } 30720cf1dd8SToby Isaac 30820cf1dd8SToby Isaac /*@ 30920cf1dd8SToby Isaac PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors 31020cf1dd8SToby Isaac 31120cf1dd8SToby Isaac Input Parameter: 312*dce8aebaSBarry Smith . sp - The `PetscSpace` 31320cf1dd8SToby Isaac 31420cf1dd8SToby Isaac Output Parameter: 31520cf1dd8SToby Isaac . dim - The dimension 31620cf1dd8SToby Isaac 31720cf1dd8SToby Isaac Level: intermediate 31820cf1dd8SToby Isaac 319*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace` 32020cf1dd8SToby Isaac @*/ 321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim) 322d71ae5a4SJacob Faibussowitsch { 32320cf1dd8SToby Isaac PetscFunctionBegin; 32420cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 325dadcf809SJacob Faibussowitsch PetscValidIntPointer(dim, 2); 326ad540459SPierre Jolivet if (sp->dim == PETSC_DETERMINE) PetscTryTypeMethod(sp, getdimension, &sp->dim); 32743bfef1cSToby Isaac *dim = sp->dim; 32820cf1dd8SToby Isaac PetscFunctionReturn(0); 32920cf1dd8SToby Isaac } 33020cf1dd8SToby Isaac 33120cf1dd8SToby Isaac /*@ 33220cf1dd8SToby Isaac PetscSpaceGetDegree - Return the polynomial degrees that characterize this space 33320cf1dd8SToby Isaac 33420cf1dd8SToby Isaac Input Parameter: 335*dce8aebaSBarry Smith . sp - The `PetscSpace` 33620cf1dd8SToby Isaac 337d8d19677SJose E. Roman Output Parameters: 33820cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space 33920cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space 34020cf1dd8SToby Isaac 34120cf1dd8SToby Isaac Level: intermediate 34220cf1dd8SToby Isaac 343*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetDegree()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace` 34420cf1dd8SToby Isaac @*/ 345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree) 346d71ae5a4SJacob Faibussowitsch { 34720cf1dd8SToby Isaac PetscFunctionBegin; 34820cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 349dadcf809SJacob Faibussowitsch if (minDegree) PetscValidIntPointer(minDegree, 2); 350dadcf809SJacob Faibussowitsch if (maxDegree) PetscValidIntPointer(maxDegree, 3); 35120cf1dd8SToby Isaac if (minDegree) *minDegree = sp->degree; 352f5a02b64SToby Isaac if (maxDegree) *maxDegree = sp->maxDegree; 35320cf1dd8SToby Isaac PetscFunctionReturn(0); 35420cf1dd8SToby Isaac } 35520cf1dd8SToby Isaac 35620cf1dd8SToby Isaac /*@ 35720cf1dd8SToby Isaac PetscSpaceSetDegree - Set the degree of approximation for this space. 35820cf1dd8SToby Isaac 35920cf1dd8SToby Isaac Input Parameters: 360*dce8aebaSBarry Smith + sp - The `PetscSpace` 361d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space 362*dce8aebaSBarry Smith - maxDegree - The degree of the largest polynomial space containing the space. One of degree and maxDegree can be `PETSC_DETERMINE`. 36320cf1dd8SToby Isaac 36420cf1dd8SToby Isaac Level: intermediate 36520cf1dd8SToby Isaac 366*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace` 36720cf1dd8SToby Isaac @*/ 368d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree) 369d71ae5a4SJacob Faibussowitsch { 37020cf1dd8SToby Isaac PetscFunctionBegin; 37120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 372d39dd5f5SToby Isaac sp->degree = degree; 373d39dd5f5SToby Isaac sp->maxDegree = maxDegree; 37420cf1dd8SToby Isaac PetscFunctionReturn(0); 37520cf1dd8SToby Isaac } 37620cf1dd8SToby Isaac 37720cf1dd8SToby Isaac /*@ 37820cf1dd8SToby Isaac PetscSpaceGetNumComponents - Return the number of components for this space 37920cf1dd8SToby Isaac 38020cf1dd8SToby Isaac Input Parameter: 381*dce8aebaSBarry Smith . sp - The `PetscSpace` 38220cf1dd8SToby Isaac 38320cf1dd8SToby Isaac Output Parameter: 38420cf1dd8SToby Isaac . Nc - The number of components 38520cf1dd8SToby Isaac 38620cf1dd8SToby Isaac Level: intermediate 38720cf1dd8SToby Isaac 388*dce8aebaSBarry Smith Note: 389*dce8aebaSBarry Smith A vector space, for example, will have d components, where d is the spatial dimension 390*dce8aebaSBarry Smith 391*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetNumComponents()`, `PetscSpaceGetNumVariables()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace` 39220cf1dd8SToby Isaac @*/ 393d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc) 394d71ae5a4SJacob Faibussowitsch { 39520cf1dd8SToby Isaac PetscFunctionBegin; 39620cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 397dadcf809SJacob Faibussowitsch PetscValidIntPointer(Nc, 2); 39820cf1dd8SToby Isaac *Nc = sp->Nc; 39920cf1dd8SToby Isaac PetscFunctionReturn(0); 40020cf1dd8SToby Isaac } 40120cf1dd8SToby Isaac 40220cf1dd8SToby Isaac /*@ 40320cf1dd8SToby Isaac PetscSpaceSetNumComponents - Set the number of components for this space 40420cf1dd8SToby Isaac 40520cf1dd8SToby Isaac Input Parameters: 406*dce8aebaSBarry Smith + sp - The `PetscSpace` 40720cf1dd8SToby Isaac - order - The number of components 40820cf1dd8SToby Isaac 40920cf1dd8SToby Isaac Level: intermediate 41020cf1dd8SToby Isaac 411*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetNumComponents()`, `PetscSpaceSetNumVariables()`, `PetscSpaceCreate()`, `PetscSpace` 41220cf1dd8SToby Isaac @*/ 413d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc) 414d71ae5a4SJacob Faibussowitsch { 41520cf1dd8SToby Isaac PetscFunctionBegin; 41620cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 41720cf1dd8SToby Isaac sp->Nc = Nc; 41820cf1dd8SToby Isaac PetscFunctionReturn(0); 41920cf1dd8SToby Isaac } 42020cf1dd8SToby Isaac 42129b5c115SMatthew G. Knepley /*@ 42229b5c115SMatthew G. Knepley PetscSpaceSetNumVariables - Set the number of variables for this space 42329b5c115SMatthew G. Knepley 42429b5c115SMatthew G. Knepley Input Parameters: 425*dce8aebaSBarry Smith + sp - The `PetscSpace` 42629b5c115SMatthew G. Knepley - n - The number of variables, e.g. x, y, z... 42729b5c115SMatthew G. Knepley 42829b5c115SMatthew G. Knepley Level: intermediate 42929b5c115SMatthew G. Knepley 430*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceGetNumVariables()`, `PetscSpaceSetNumComponents()`, `PetscSpaceCreate()`, `PetscSpace` 43129b5c115SMatthew G. Knepley @*/ 432d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n) 433d71ae5a4SJacob Faibussowitsch { 43420cf1dd8SToby Isaac PetscFunctionBegin; 43520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 43620cf1dd8SToby Isaac sp->Nv = n; 43720cf1dd8SToby Isaac PetscFunctionReturn(0); 43820cf1dd8SToby Isaac } 43920cf1dd8SToby Isaac 44029b5c115SMatthew G. Knepley /*@ 44129b5c115SMatthew G. Knepley PetscSpaceGetNumVariables - Return the number of variables for this space 44229b5c115SMatthew G. Knepley 44329b5c115SMatthew G. Knepley Input Parameter: 444*dce8aebaSBarry Smith . sp - The `PetscSpace` 44529b5c115SMatthew G. Knepley 44629b5c115SMatthew G. Knepley Output Parameter: 44729b5c115SMatthew G. Knepley . Nc - The number of variables, e.g. x, y, z... 44829b5c115SMatthew G. Knepley 44929b5c115SMatthew G. Knepley Level: intermediate 45029b5c115SMatthew G. Knepley 451*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscSpaceSetNumVariables()`, `PetscSpaceGetNumComponents()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace` 45229b5c115SMatthew G. Knepley @*/ 453d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n) 454d71ae5a4SJacob Faibussowitsch { 45520cf1dd8SToby Isaac PetscFunctionBegin; 45620cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 457dadcf809SJacob Faibussowitsch PetscValidIntPointer(n, 2); 45820cf1dd8SToby Isaac *n = sp->Nv; 45920cf1dd8SToby Isaac PetscFunctionReturn(0); 46020cf1dd8SToby Isaac } 46120cf1dd8SToby Isaac 46220cf1dd8SToby Isaac /*@C 46320cf1dd8SToby Isaac PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point 46420cf1dd8SToby Isaac 46520cf1dd8SToby Isaac Input Parameters: 466*dce8aebaSBarry Smith + sp - The `PetscSpace` 46720cf1dd8SToby Isaac . npoints - The number of evaluation points, in reference coordinates 46820cf1dd8SToby Isaac - points - The point coordinates 46920cf1dd8SToby Isaac 47020cf1dd8SToby Isaac Output Parameters: 47120cf1dd8SToby Isaac + B - The function evaluations in a npoints x nfuncs array 47220cf1dd8SToby Isaac . D - The derivative evaluations in a npoints x nfuncs x dim array 47320cf1dd8SToby Isaac - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array 47420cf1dd8SToby Isaac 47529b5c115SMatthew G. Knepley Level: beginner 47620cf1dd8SToby Isaac 477*dce8aebaSBarry Smith Note: 478*dce8aebaSBarry Smith Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given 479*dce8aebaSBarry Smith on the reference cell, not in real space. 480*dce8aebaSBarry Smith 481*dce8aebaSBarry Smith .seealso: `PetscSpace`, `PetscFECreateTabulation()`, `PetscFEGetCellTabulation()`, `PetscSpaceCreate()` 48220cf1dd8SToby Isaac @*/ 483d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) 484d71ae5a4SJacob Faibussowitsch { 48520cf1dd8SToby Isaac PetscFunctionBegin; 48620cf1dd8SToby Isaac if (!npoints) PetscFunctionReturn(0); 48720cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 488dadcf809SJacob Faibussowitsch if (sp->Nv) PetscValidRealPointer(points, 3); 489dadcf809SJacob Faibussowitsch if (B) PetscValidRealPointer(B, 4); 490dadcf809SJacob Faibussowitsch if (D) PetscValidRealPointer(D, 5); 491dadcf809SJacob Faibussowitsch if (H) PetscValidRealPointer(H, 6); 492dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, evaluate, npoints, points, B, D, H); 49320cf1dd8SToby Isaac PetscFunctionReturn(0); 49420cf1dd8SToby Isaac } 49520cf1dd8SToby Isaac 49620cf1dd8SToby Isaac /*@ 49720cf1dd8SToby Isaac PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height. 49820cf1dd8SToby Isaac 49920cf1dd8SToby Isaac Not collective 50020cf1dd8SToby Isaac 50120cf1dd8SToby Isaac Input Parameters: 50220cf1dd8SToby Isaac + sp - the PetscSpace object 50320cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired 50420cf1dd8SToby Isaac 50520cf1dd8SToby Isaac Output Parameter: 50620cf1dd8SToby Isaac . subsp - the subspace 50720cf1dd8SToby Isaac 50820cf1dd8SToby Isaac Level: advanced 50920cf1dd8SToby Isaac 510*dce8aebaSBarry Smith Notes: 511*dce8aebaSBarry Smith If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and 512*dce8aebaSBarry Smith pointwise values are not defined on the element boundaries), or if the implementation of `PetscSpace` does not 513*dce8aebaSBarry Smith support extracting subspaces, then NULL is returned. 514*dce8aebaSBarry Smith 515*dce8aebaSBarry Smith This does not increment the reference count on the returned space, and the user should not destroy it. 516*dce8aebaSBarry Smith 517db781477SPatrick Sanan .seealso: `PetscDualSpaceGetHeightSubspace()`, `PetscSpace` 51820cf1dd8SToby Isaac @*/ 519d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp) 520d71ae5a4SJacob Faibussowitsch { 52120cf1dd8SToby Isaac PetscFunctionBegin; 52220cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 52320cf1dd8SToby Isaac PetscValidPointer(subsp, 3); 52420cf1dd8SToby Isaac *subsp = NULL; 525dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, getheightsubspace, height, subsp); 52620cf1dd8SToby Isaac PetscFunctionReturn(0); 52720cf1dd8SToby Isaac } 528