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 39db781477SPatrick Sanan .seealso: `PetscSpaceRegisterAll()`, `PetscSpaceRegisterDestroy()` 4020cf1dd8SToby Isaac 4120cf1dd8SToby Isaac @*/ 42*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace)) 43*d71ae5a4SJacob Faibussowitsch { 4420cf1dd8SToby Isaac PetscFunctionBegin; 459566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscSpaceList, sname, function)); 4620cf1dd8SToby Isaac PetscFunctionReturn(0); 4720cf1dd8SToby Isaac } 4820cf1dd8SToby Isaac 4920cf1dd8SToby Isaac /*@C 5020cf1dd8SToby Isaac PetscSpaceSetType - Builds a particular PetscSpace 5120cf1dd8SToby Isaac 52d083f849SBarry Smith Collective on sp 5320cf1dd8SToby Isaac 5420cf1dd8SToby Isaac Input Parameters: 5520cf1dd8SToby Isaac + sp - The PetscSpace object 5620cf1dd8SToby Isaac - name - The kind of space 5720cf1dd8SToby Isaac 5820cf1dd8SToby Isaac Options Database Key: 5920cf1dd8SToby Isaac . -petscspace_type <type> - Sets the PetscSpace type; use -help for a list of available types 6020cf1dd8SToby Isaac 6120cf1dd8SToby Isaac Level: intermediate 6220cf1dd8SToby Isaac 63db781477SPatrick Sanan .seealso: `PetscSpaceGetType()`, `PetscSpaceCreate()` 6420cf1dd8SToby Isaac @*/ 65*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name) 66*d71ae5a4SJacob Faibussowitsch { 6720cf1dd8SToby Isaac PetscErrorCode (*r)(PetscSpace); 6820cf1dd8SToby Isaac PetscBool match; 6920cf1dd8SToby Isaac 7020cf1dd8SToby Isaac PetscFunctionBegin; 7120cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 729566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)sp, name, &match)); 7320cf1dd8SToby Isaac if (match) PetscFunctionReturn(0); 7420cf1dd8SToby Isaac 759566063dSJacob Faibussowitsch PetscCall(PetscSpaceRegisterAll()); 769566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscSpaceList, name, &r)); 772c71b3e2SJacob Faibussowitsch PetscCheck(r, PetscObjectComm((PetscObject)sp), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscSpace type: %s", name); 7820cf1dd8SToby Isaac 79dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, destroy); 8020cf1dd8SToby Isaac sp->ops->destroy = NULL; 81dbbe0bcdSBarry Smith 8243bfef1cSToby Isaac sp->dim = PETSC_DETERMINE; 839566063dSJacob Faibussowitsch PetscCall((*r)(sp)); 849566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)sp, name)); 8520cf1dd8SToby Isaac PetscFunctionReturn(0); 8620cf1dd8SToby Isaac } 8720cf1dd8SToby Isaac 8820cf1dd8SToby Isaac /*@C 8920cf1dd8SToby Isaac PetscSpaceGetType - Gets the PetscSpace type name (as a string) from the object. 9020cf1dd8SToby Isaac 9120cf1dd8SToby Isaac Not Collective 9220cf1dd8SToby Isaac 9320cf1dd8SToby Isaac Input Parameter: 9420cf1dd8SToby Isaac . sp - The PetscSpace 9520cf1dd8SToby Isaac 9620cf1dd8SToby Isaac Output Parameter: 9720cf1dd8SToby Isaac . name - The PetscSpace type name 9820cf1dd8SToby Isaac 9920cf1dd8SToby Isaac Level: intermediate 10020cf1dd8SToby Isaac 101db781477SPatrick Sanan .seealso: `PetscSpaceSetType()`, `PetscSpaceCreate()` 10220cf1dd8SToby Isaac @*/ 103*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name) 104*d71ae5a4SJacob Faibussowitsch { 10520cf1dd8SToby Isaac PetscFunctionBegin; 10620cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 10720cf1dd8SToby Isaac PetscValidPointer(name, 2); 10848a46eb9SPierre Jolivet if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll()); 10920cf1dd8SToby Isaac *name = ((PetscObject)sp)->type_name; 11020cf1dd8SToby Isaac PetscFunctionReturn(0); 11120cf1dd8SToby Isaac } 11220cf1dd8SToby Isaac 11320cf1dd8SToby Isaac /*@C 114fe2efc57SMark PetscSpaceViewFromOptions - View from Options 115fe2efc57SMark 116fe2efc57SMark Collective on PetscSpace 117fe2efc57SMark 118fe2efc57SMark Input Parameters: 119fe2efc57SMark + A - the PetscSpace object 120736c3998SJose E. Roman . obj - Optional object 121736c3998SJose E. Roman - name - command line option 122fe2efc57SMark 123fe2efc57SMark Level: intermediate 124db781477SPatrick Sanan .seealso: `PetscSpace`, `PetscSpaceView`, `PetscObjectViewFromOptions()`, `PetscSpaceCreate()` 125fe2efc57SMark @*/ 126*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A, PetscObject obj, const char name[]) 127*d71ae5a4SJacob Faibussowitsch { 128fe2efc57SMark PetscFunctionBegin; 129fe2efc57SMark PetscValidHeaderSpecific(A, PETSCSPACE_CLASSID, 1); 1309566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name)); 131fe2efc57SMark PetscFunctionReturn(0); 132fe2efc57SMark } 133fe2efc57SMark 134fe2efc57SMark /*@C 13520cf1dd8SToby Isaac PetscSpaceView - Views a PetscSpace 13620cf1dd8SToby Isaac 137d083f849SBarry Smith Collective on sp 13820cf1dd8SToby Isaac 139d8d19677SJose E. Roman Input Parameters: 14020cf1dd8SToby Isaac + sp - the PetscSpace object to view 14120cf1dd8SToby Isaac - v - the viewer 14220cf1dd8SToby Isaac 14329b5c115SMatthew G. Knepley Level: beginner 14420cf1dd8SToby Isaac 145db781477SPatrick Sanan .seealso `PetscSpaceDestroy()` 14620cf1dd8SToby Isaac @*/ 147*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v) 148*d71ae5a4SJacob Faibussowitsch { 1490aec8e07SMatthew G. Knepley PetscInt pdim; 15020cf1dd8SToby Isaac PetscBool iascii; 15120cf1dd8SToby Isaac 15220cf1dd8SToby Isaac PetscFunctionBegin; 15320cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 15420cf1dd8SToby Isaac if (v) PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 2); 1559566063dSJacob Faibussowitsch if (!v) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)sp), &v)); 1569566063dSJacob Faibussowitsch PetscCall(PetscSpaceGetDimension(sp, &pdim)); 1579566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)sp, v)); 1589566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii)); 1599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(v)); 16063a3b9bcSJacob Faibussowitsch if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Space in %" PetscInt_FMT " variables with %" PetscInt_FMT " components, size %" PetscInt_FMT "\n", sp->Nv, sp->Nc, pdim)); 161dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, view, v); 1629566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(v)); 16320cf1dd8SToby Isaac PetscFunctionReturn(0); 16420cf1dd8SToby Isaac } 16520cf1dd8SToby Isaac 16620cf1dd8SToby Isaac /*@ 16720cf1dd8SToby Isaac PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database 16820cf1dd8SToby Isaac 169d083f849SBarry Smith Collective on sp 17020cf1dd8SToby Isaac 17120cf1dd8SToby Isaac Input Parameter: 17220cf1dd8SToby Isaac . sp - the PetscSpace object to set options for 17320cf1dd8SToby Isaac 17420cf1dd8SToby Isaac Options Database: 1758f2aacc6SMatthew G. Knepley + -petscspace_degree <deg> - the approximation order of the space 1768f2aacc6SMatthew G. Knepley . -petscspace_variables <n> - the number of different variables, e.g. x and y 1778f2aacc6SMatthew G. Knepley - -petscspace_components <c> - the number of components, say d for a vector field 17820cf1dd8SToby Isaac 17929b5c115SMatthew G. Knepley Level: intermediate 18020cf1dd8SToby Isaac 181db781477SPatrick Sanan .seealso `PetscSpaceView()` 18220cf1dd8SToby Isaac @*/ 183*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp) 184*d71ae5a4SJacob Faibussowitsch { 18520cf1dd8SToby Isaac const char *defaultType; 18620cf1dd8SToby Isaac char name[256]; 1875a856986SBarry Smith PetscBool flg; 18820cf1dd8SToby Isaac 18920cf1dd8SToby Isaac PetscFunctionBegin; 19020cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 19120cf1dd8SToby Isaac if (!((PetscObject)sp)->type_name) { 19220cf1dd8SToby Isaac defaultType = PETSCSPACEPOLYNOMIAL; 19320cf1dd8SToby Isaac } else { 19420cf1dd8SToby Isaac defaultType = ((PetscObject)sp)->type_name; 19520cf1dd8SToby Isaac } 1969566063dSJacob Faibussowitsch if (!PetscSpaceRegisterAllCalled) PetscCall(PetscSpaceRegisterAll()); 19720cf1dd8SToby Isaac 198d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)sp); 1999566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg)); 20020cf1dd8SToby Isaac if (flg) { 2019566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetType(sp, name)); 20220cf1dd8SToby Isaac } else if (!((PetscObject)sp)->type_name) { 2039566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetType(sp, defaultType)); 20420cf1dd8SToby Isaac } 2057be5e748SToby Isaac { 2069566063dSJacob Faibussowitsch PetscCall(PetscOptionsDeprecated("-petscspace_order", "-petscspace_degree", "3.11", NULL)); 2079566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0)); 2087be5e748SToby Isaac } 2099566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL, 0)); 2109566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL, 0)); 2119566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL, 0)); 212dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, setfromoptions, PetscOptionsObject); 21320cf1dd8SToby Isaac /* process any options handlers added with PetscObjectAddOptionsHandler() */ 214dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)sp, PetscOptionsObject)); 215d0609cedSBarry Smith PetscOptionsEnd(); 2169566063dSJacob Faibussowitsch PetscCall(PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view")); 21720cf1dd8SToby Isaac PetscFunctionReturn(0); 21820cf1dd8SToby Isaac } 21920cf1dd8SToby Isaac 22020cf1dd8SToby Isaac /*@C 22120cf1dd8SToby Isaac PetscSpaceSetUp - Construct data structures for the PetscSpace 22220cf1dd8SToby Isaac 223d083f849SBarry Smith Collective on sp 22420cf1dd8SToby Isaac 22520cf1dd8SToby Isaac Input Parameter: 22620cf1dd8SToby Isaac . sp - the PetscSpace object to setup 22720cf1dd8SToby Isaac 22829b5c115SMatthew G. Knepley Level: intermediate 22920cf1dd8SToby Isaac 230db781477SPatrick Sanan .seealso `PetscSpaceView()`, `PetscSpaceDestroy()` 23120cf1dd8SToby Isaac @*/ 232*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetUp(PetscSpace sp) 233*d71ae5a4SJacob Faibussowitsch { 23420cf1dd8SToby Isaac PetscFunctionBegin; 23520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 236dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, setup); 23720cf1dd8SToby Isaac PetscFunctionReturn(0); 23820cf1dd8SToby Isaac } 23920cf1dd8SToby Isaac 24020cf1dd8SToby Isaac /*@ 24120cf1dd8SToby Isaac PetscSpaceDestroy - Destroys a PetscSpace object 24220cf1dd8SToby Isaac 243d083f849SBarry Smith Collective on sp 24420cf1dd8SToby Isaac 24520cf1dd8SToby Isaac Input Parameter: 24620cf1dd8SToby Isaac . sp - the PetscSpace object to destroy 24720cf1dd8SToby Isaac 24829b5c115SMatthew G. Knepley Level: beginner 24920cf1dd8SToby Isaac 250db781477SPatrick Sanan .seealso `PetscSpaceView()` 25120cf1dd8SToby Isaac @*/ 252*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceDestroy(PetscSpace *sp) 253*d71ae5a4SJacob Faibussowitsch { 25420cf1dd8SToby Isaac PetscFunctionBegin; 25520cf1dd8SToby Isaac if (!*sp) PetscFunctionReturn(0); 25620cf1dd8SToby Isaac PetscValidHeaderSpecific((*sp), PETSCSPACE_CLASSID, 1); 25720cf1dd8SToby Isaac 2589371c9d4SSatish Balay if (--((PetscObject)(*sp))->refct > 0) { 2599371c9d4SSatish Balay *sp = NULL; 2609371c9d4SSatish Balay PetscFunctionReturn(0); 2619371c9d4SSatish Balay } 26220cf1dd8SToby Isaac ((PetscObject)(*sp))->refct = 0; 2639566063dSJacob Faibussowitsch PetscCall(DMDestroy(&(*sp)->dm)); 26420cf1dd8SToby Isaac 2659566063dSJacob Faibussowitsch PetscCall((*(*sp)->ops->destroy)(*sp)); 2669566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(sp)); 26720cf1dd8SToby Isaac PetscFunctionReturn(0); 26820cf1dd8SToby Isaac } 26920cf1dd8SToby Isaac 27020cf1dd8SToby Isaac /*@ 27120cf1dd8SToby Isaac PetscSpaceCreate - Creates an empty PetscSpace object. The type can then be set with PetscSpaceSetType(). 27220cf1dd8SToby Isaac 273d083f849SBarry Smith Collective 27420cf1dd8SToby Isaac 27520cf1dd8SToby Isaac Input Parameter: 27620cf1dd8SToby Isaac . comm - The communicator for the PetscSpace object 27720cf1dd8SToby Isaac 27820cf1dd8SToby Isaac Output Parameter: 27920cf1dd8SToby Isaac . sp - The PetscSpace object 28020cf1dd8SToby Isaac 28120cf1dd8SToby Isaac Level: beginner 28220cf1dd8SToby Isaac 283db781477SPatrick Sanan .seealso: `PetscSpaceSetType()`, `PETSCSPACEPOLYNOMIAL` 28420cf1dd8SToby Isaac @*/ 285*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp) 286*d71ae5a4SJacob Faibussowitsch { 28720cf1dd8SToby Isaac PetscSpace s; 28820cf1dd8SToby Isaac 28920cf1dd8SToby Isaac PetscFunctionBegin; 29020cf1dd8SToby Isaac PetscValidPointer(sp, 2); 2919566063dSJacob Faibussowitsch PetscCall(PetscCitationsRegister(FECitation, &FEcite)); 29220cf1dd8SToby Isaac *sp = NULL; 2939566063dSJacob Faibussowitsch PetscCall(PetscFEInitializePackage()); 29420cf1dd8SToby Isaac 2959566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView)); 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; 3029566063dSJacob Faibussowitsch PetscCall(DMShellCreate(comm, &s->dm)); 3039566063dSJacob Faibussowitsch PetscCall(PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL)); 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 320db781477SPatrick Sanan .seealso: `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace` 32120cf1dd8SToby Isaac @*/ 322*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim) 323*d71ae5a4SJacob Faibussowitsch { 32420cf1dd8SToby Isaac PetscFunctionBegin; 32520cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 326dadcf809SJacob Faibussowitsch PetscValidIntPointer(dim, 2); 327ad540459SPierre Jolivet if (sp->dim == PETSC_DETERMINE) PetscTryTypeMethod(sp, getdimension, &sp->dim); 32843bfef1cSToby Isaac *dim = sp->dim; 32920cf1dd8SToby Isaac PetscFunctionReturn(0); 33020cf1dd8SToby Isaac } 33120cf1dd8SToby Isaac 33220cf1dd8SToby Isaac /*@ 33320cf1dd8SToby Isaac PetscSpaceGetDegree - Return the polynomial degrees that characterize this space 33420cf1dd8SToby Isaac 33520cf1dd8SToby Isaac Input Parameter: 33620cf1dd8SToby Isaac . sp - The PetscSpace 33720cf1dd8SToby Isaac 338d8d19677SJose E. Roman Output Parameters: 33920cf1dd8SToby Isaac + minDegree - The degree of the largest polynomial space contained in the space 34020cf1dd8SToby Isaac - maxDegree - The degree of the smallest polynomial space containing the space 34120cf1dd8SToby Isaac 34220cf1dd8SToby Isaac Level: intermediate 34320cf1dd8SToby Isaac 344db781477SPatrick Sanan .seealso: `PetscSpaceSetDegree()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace` 34520cf1dd8SToby Isaac @*/ 346*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree) 347*d71ae5a4SJacob Faibussowitsch { 34820cf1dd8SToby Isaac PetscFunctionBegin; 34920cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 350dadcf809SJacob Faibussowitsch if (minDegree) PetscValidIntPointer(minDegree, 2); 351dadcf809SJacob Faibussowitsch if (maxDegree) PetscValidIntPointer(maxDegree, 3); 35220cf1dd8SToby Isaac if (minDegree) *minDegree = sp->degree; 353f5a02b64SToby Isaac if (maxDegree) *maxDegree = sp->maxDegree; 35420cf1dd8SToby Isaac PetscFunctionReturn(0); 35520cf1dd8SToby Isaac } 35620cf1dd8SToby Isaac 35720cf1dd8SToby Isaac /*@ 35820cf1dd8SToby Isaac PetscSpaceSetDegree - Set the degree of approximation for this space. 35920cf1dd8SToby Isaac 36020cf1dd8SToby Isaac Input Parameters: 36120cf1dd8SToby Isaac + sp - The PetscSpace 362d39dd5f5SToby Isaac . degree - The degree of the largest polynomial space contained in the space 363d39dd5f5SToby Isaac - maxDegree - The degree of the largest polynomial space containing the space. One of degree and maxDegree can be PETSC_DETERMINE. 36420cf1dd8SToby Isaac 36520cf1dd8SToby Isaac Level: intermediate 36620cf1dd8SToby Isaac 367db781477SPatrick Sanan .seealso: `PetscSpaceGetDegree()`, `PetscSpaceCreate()`, `PetscSpace` 36820cf1dd8SToby Isaac @*/ 369*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree) 370*d71ae5a4SJacob Faibussowitsch { 37120cf1dd8SToby Isaac PetscFunctionBegin; 37220cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 373d39dd5f5SToby Isaac sp->degree = degree; 374d39dd5f5SToby Isaac sp->maxDegree = maxDegree; 37520cf1dd8SToby Isaac PetscFunctionReturn(0); 37620cf1dd8SToby Isaac } 37720cf1dd8SToby Isaac 37820cf1dd8SToby Isaac /*@ 37920cf1dd8SToby Isaac PetscSpaceGetNumComponents - Return the number of components for this space 38020cf1dd8SToby Isaac 38120cf1dd8SToby Isaac Input Parameter: 38220cf1dd8SToby Isaac . sp - The PetscSpace 38320cf1dd8SToby Isaac 38420cf1dd8SToby Isaac Output Parameter: 38520cf1dd8SToby Isaac . Nc - The number of components 38620cf1dd8SToby Isaac 38720cf1dd8SToby Isaac Note: A vector space, for example, will have d components, where d is the spatial dimension 38820cf1dd8SToby Isaac 38920cf1dd8SToby Isaac Level: intermediate 39020cf1dd8SToby Isaac 391db781477SPatrick Sanan .seealso: `PetscSpaceSetNumComponents()`, `PetscSpaceGetNumVariables()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace` 39220cf1dd8SToby Isaac @*/ 393*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc) 394*d71ae5a4SJacob 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: 40620cf1dd8SToby Isaac + sp - The PetscSpace 40720cf1dd8SToby Isaac - order - The number of components 40820cf1dd8SToby Isaac 40920cf1dd8SToby Isaac Level: intermediate 41020cf1dd8SToby Isaac 411db781477SPatrick Sanan .seealso: `PetscSpaceGetNumComponents()`, `PetscSpaceSetNumVariables()`, `PetscSpaceCreate()`, `PetscSpace` 41220cf1dd8SToby Isaac @*/ 413*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc) 414*d71ae5a4SJacob 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: 42529b5c115SMatthew G. Knepley + 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 430db781477SPatrick Sanan .seealso: `PetscSpaceGetNumVariables()`, `PetscSpaceSetNumComponents()`, `PetscSpaceCreate()`, `PetscSpace` 43129b5c115SMatthew G. Knepley @*/ 432*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n) 433*d71ae5a4SJacob 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: 44429b5c115SMatthew G. Knepley . 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 451db781477SPatrick Sanan .seealso: `PetscSpaceSetNumVariables()`, `PetscSpaceGetNumComponents()`, `PetscSpaceGetDimension()`, `PetscSpaceCreate()`, `PetscSpace` 45229b5c115SMatthew G. Knepley @*/ 453*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n) 454*d71ae5a4SJacob 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: 46620cf1dd8SToby Isaac + 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 47520cf1dd8SToby Isaac Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given 47620cf1dd8SToby Isaac on the reference cell, not in real space. 47720cf1dd8SToby Isaac 47829b5c115SMatthew G. Knepley Level: beginner 47920cf1dd8SToby Isaac 480db781477SPatrick Sanan .seealso: `PetscFECreateTabulation()`, `PetscFEGetCellTabulation()`, `PetscSpaceCreate()` 48120cf1dd8SToby Isaac @*/ 482*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[]) 483*d71ae5a4SJacob Faibussowitsch { 48420cf1dd8SToby Isaac PetscFunctionBegin; 48520cf1dd8SToby Isaac if (!npoints) PetscFunctionReturn(0); 48620cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 487dadcf809SJacob Faibussowitsch if (sp->Nv) PetscValidRealPointer(points, 3); 488dadcf809SJacob Faibussowitsch if (B) PetscValidRealPointer(B, 4); 489dadcf809SJacob Faibussowitsch if (D) PetscValidRealPointer(D, 5); 490dadcf809SJacob Faibussowitsch if (H) PetscValidRealPointer(H, 6); 491dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, evaluate, npoints, points, B, D, H); 49220cf1dd8SToby Isaac PetscFunctionReturn(0); 49320cf1dd8SToby Isaac } 49420cf1dd8SToby Isaac 49520cf1dd8SToby Isaac /*@ 49620cf1dd8SToby Isaac PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height. 49720cf1dd8SToby Isaac 49820cf1dd8SToby Isaac If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and 49920cf1dd8SToby Isaac pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not 50020cf1dd8SToby Isaac support extracting subspaces, then NULL is returned. 50120cf1dd8SToby Isaac 50220cf1dd8SToby Isaac This does not increment the reference count on the returned space, and the user should not destroy it. 50320cf1dd8SToby Isaac 50420cf1dd8SToby Isaac Not collective 50520cf1dd8SToby Isaac 50620cf1dd8SToby Isaac Input Parameters: 50720cf1dd8SToby Isaac + sp - the PetscSpace object 50820cf1dd8SToby Isaac - height - the height of the mesh point for which the subspace is desired 50920cf1dd8SToby Isaac 51020cf1dd8SToby Isaac Output Parameter: 51120cf1dd8SToby Isaac . subsp - the subspace 51220cf1dd8SToby Isaac 51320cf1dd8SToby Isaac Level: advanced 51420cf1dd8SToby Isaac 515db781477SPatrick Sanan .seealso: `PetscDualSpaceGetHeightSubspace()`, `PetscSpace` 51620cf1dd8SToby Isaac @*/ 517*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp) 518*d71ae5a4SJacob Faibussowitsch { 51920cf1dd8SToby Isaac PetscFunctionBegin; 52020cf1dd8SToby Isaac PetscValidHeaderSpecific(sp, PETSCSPACE_CLASSID, 1); 52120cf1dd8SToby Isaac PetscValidPointer(subsp, 3); 52220cf1dd8SToby Isaac *subsp = NULL; 523dbbe0bcdSBarry Smith PetscTryTypeMethod(sp, getheightsubspace, height, subsp); 52420cf1dd8SToby Isaac PetscFunctionReturn(0); 52520cf1dd8SToby Isaac } 526