Actual source code: space.c
1: #include <petsc/private/petscfeimpl.h>
2: #include <petscdmshell.h>
4: PetscClassId PETSCSPACE_CLASSID = 0;
6: PetscFunctionList PetscSpaceList = NULL;
7: PetscBool PetscSpaceRegisterAllCalled = PETSC_FALSE;
9: /*@C
10: PetscSpaceRegister - Adds a new PetscSpace implementation
12: Not Collective
14: Input Parameters:
15: + name - The name of a new user-defined creation routine
16: - create_func - The creation routine for the implementation type
18: Notes:
19: PetscSpaceRegister() may be called multiple times to add several user-defined types of PetscSpaces. The creation function is called
20: when the type is set to 'name'.
22: Sample usage:
23: .vb
24: PetscSpaceRegister("my_space", MyPetscSpaceCreate);
25: .ve
27: Then, your PetscSpace type can be chosen with the procedural interface via
28: .vb
29: PetscSpaceCreate(MPI_Comm, PetscSpace *);
30: PetscSpaceSetType(PetscSpace, "my_space");
31: .ve
32: or at runtime via the option
33: .vb
34: -petscspace_type my_space
35: .ve
37: Level: advanced
39: .seealso: PetscSpaceRegisterAll(), PetscSpaceRegisterDestroy()
41: @*/
42: PetscErrorCode PetscSpaceRegister(const char sname[], PetscErrorCode (*function)(PetscSpace))
43: {
44: PetscFunctionListAdd(&PetscSpaceList, sname, function);
45: return 0;
46: }
48: /*@C
49: PetscSpaceSetType - Builds a particular PetscSpace
51: Collective on sp
53: Input Parameters:
54: + sp - The PetscSpace object
55: - name - The kind of space
57: Options Database Key:
58: . -petscspace_type <type> - Sets the PetscSpace type; use -help for a list of available types
60: Level: intermediate
62: .seealso: PetscSpaceGetType(), PetscSpaceCreate()
63: @*/
64: PetscErrorCode PetscSpaceSetType(PetscSpace sp, PetscSpaceType name)
65: {
66: PetscErrorCode (*r)(PetscSpace);
67: PetscBool match;
70: PetscObjectTypeCompare((PetscObject) sp, name, &match);
71: if (match) return 0;
73: PetscSpaceRegisterAll();
74: PetscFunctionListFind(PetscSpaceList, name, &r);
77: if (sp->ops->destroy) {
78: (*sp->ops->destroy)(sp);
79: sp->ops->destroy = NULL;
80: }
81: sp->dim = PETSC_DETERMINE;
82: (*r)(sp);
83: PetscObjectChangeTypeName((PetscObject) sp, name);
84: return 0;
85: }
87: /*@C
88: PetscSpaceGetType - Gets the PetscSpace type name (as a string) from the object.
90: Not Collective
92: Input Parameter:
93: . sp - The PetscSpace
95: Output Parameter:
96: . name - The PetscSpace type name
98: Level: intermediate
100: .seealso: PetscSpaceSetType(), PetscSpaceCreate()
101: @*/
102: PetscErrorCode PetscSpaceGetType(PetscSpace sp, PetscSpaceType *name)
103: {
106: if (!PetscSpaceRegisterAllCalled) {
107: PetscSpaceRegisterAll();
108: }
109: *name = ((PetscObject) sp)->type_name;
110: return 0;
111: }
113: /*@C
114: PetscSpaceViewFromOptions - View from Options
116: Collective on PetscSpace
118: Input Parameters:
119: + A - the PetscSpace object
120: . obj - Optional object
121: - name - command line option
123: Level: intermediate
124: .seealso: PetscSpace, PetscSpaceView, PetscObjectViewFromOptions(), PetscSpaceCreate()
125: @*/
126: PetscErrorCode PetscSpaceViewFromOptions(PetscSpace A,PetscObject obj,const char name[])
127: {
129: PetscObjectViewFromOptions((PetscObject)A,obj,name);
130: return 0;
131: }
133: /*@C
134: PetscSpaceView - Views a PetscSpace
136: Collective on sp
138: Input Parameters:
139: + sp - the PetscSpace object to view
140: - v - the viewer
142: Level: beginner
144: .seealso PetscSpaceDestroy()
145: @*/
146: PetscErrorCode PetscSpaceView(PetscSpace sp, PetscViewer v)
147: {
148: PetscInt pdim;
149: PetscBool iascii;
153: if (!v) PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject) sp), &v);
154: PetscSpaceGetDimension(sp, &pdim);
155: PetscObjectPrintClassNamePrefixType((PetscObject)sp,v);
156: PetscObjectTypeCompare((PetscObject) v, PETSCVIEWERASCII, &iascii);
157: PetscViewerASCIIPushTab(v);
158: if (iascii) PetscViewerASCIIPrintf(v, "Space in %D variables with %D components, size %D\n", sp->Nv, sp->Nc, pdim);
159: if (sp->ops->view) (*sp->ops->view)(sp, v);
160: PetscViewerASCIIPopTab(v);
161: return 0;
162: }
164: /*@
165: PetscSpaceSetFromOptions - sets parameters in a PetscSpace from the options database
167: Collective on sp
169: Input Parameter:
170: . sp - the PetscSpace object to set options for
172: Options Database:
173: + -petscspace_degree <deg> - the approximation order of the space
174: . -petscspace_variables <n> - the number of different variables, e.g. x and y
175: - -petscspace_components <c> - the number of components, say d for a vector field
177: Level: intermediate
179: .seealso PetscSpaceView()
180: @*/
181: PetscErrorCode PetscSpaceSetFromOptions(PetscSpace sp)
182: {
183: const char *defaultType;
184: char name[256];
185: PetscBool flg;
189: if (!((PetscObject) sp)->type_name) {
190: defaultType = PETSCSPACEPOLYNOMIAL;
191: } else {
192: defaultType = ((PetscObject) sp)->type_name;
193: }
194: if (!PetscSpaceRegisterAllCalled) PetscSpaceRegisterAll();
196: PetscObjectOptionsBegin((PetscObject) sp);
197: PetscOptionsFList("-petscspace_type", "Linear space", "PetscSpaceSetType", PetscSpaceList, defaultType, name, 256, &flg);
198: if (flg) {
199: PetscSpaceSetType(sp, name);
200: } else if (!((PetscObject) sp)->type_name) {
201: PetscSpaceSetType(sp, defaultType);
202: }
203: {
204: PetscOptionsDeprecated("-petscspace_order","-petscspace_degree","3.11",NULL);
205: PetscOptionsBoundedInt("-petscspace_order", "DEPRECATED: The approximation order", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0);
206: }
207: PetscOptionsBoundedInt("-petscspace_degree", "The (maximally included) polynomial degree", "PetscSpaceSetDegree", sp->degree, &sp->degree, NULL,0);
208: PetscOptionsBoundedInt("-petscspace_variables", "The number of different variables, e.g. x and y", "PetscSpaceSetNumVariables", sp->Nv, &sp->Nv, NULL,0);
209: PetscOptionsBoundedInt("-petscspace_components", "The number of components", "PetscSpaceSetNumComponents", sp->Nc, &sp->Nc, NULL,0);
210: if (sp->ops->setfromoptions) {
211: (*sp->ops->setfromoptions)(PetscOptionsObject,sp);
212: }
213: /* process any options handlers added with PetscObjectAddOptionsHandler() */
214: PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject) sp);
215: PetscOptionsEnd();
216: PetscSpaceViewFromOptions(sp, NULL, "-petscspace_view");
217: return 0;
218: }
220: /*@C
221: PetscSpaceSetUp - Construct data structures for the PetscSpace
223: Collective on sp
225: Input Parameter:
226: . sp - the PetscSpace object to setup
228: Level: intermediate
230: .seealso PetscSpaceView(), PetscSpaceDestroy()
231: @*/
232: PetscErrorCode PetscSpaceSetUp(PetscSpace sp)
233: {
235: if (sp->ops->setup) (*sp->ops->setup)(sp);
236: return 0;
237: }
239: /*@
240: PetscSpaceDestroy - Destroys a PetscSpace object
242: Collective on sp
244: Input Parameter:
245: . sp - the PetscSpace object to destroy
247: Level: beginner
249: .seealso PetscSpaceView()
250: @*/
251: PetscErrorCode PetscSpaceDestroy(PetscSpace *sp)
252: {
253: if (!*sp) return 0;
256: if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; return 0;}
257: ((PetscObject) (*sp))->refct = 0;
258: DMDestroy(&(*sp)->dm);
260: (*(*sp)->ops->destroy)(*sp);
261: PetscHeaderDestroy(sp);
262: return 0;
263: }
265: /*@
266: PetscSpaceCreate - Creates an empty PetscSpace object. The type can then be set with PetscSpaceSetType().
268: Collective
270: Input Parameter:
271: . comm - The communicator for the PetscSpace object
273: Output Parameter:
274: . sp - The PetscSpace object
276: Level: beginner
278: .seealso: PetscSpaceSetType(), PETSCSPACEPOLYNOMIAL
279: @*/
280: PetscErrorCode PetscSpaceCreate(MPI_Comm comm, PetscSpace *sp)
281: {
282: PetscSpace s;
285: PetscCitationsRegister(FECitation,&FEcite);
286: *sp = NULL;
287: PetscFEInitializePackage();
289: PetscHeaderCreate(s, PETSCSPACE_CLASSID, "PetscSpace", "Linear Space", "PetscSpace", comm, PetscSpaceDestroy, PetscSpaceView);
291: s->degree = 0;
292: s->maxDegree = PETSC_DETERMINE;
293: s->Nc = 1;
294: s->Nv = 0;
295: s->dim = PETSC_DETERMINE;
296: DMShellCreate(comm, &s->dm);
297: PetscSpaceSetType(s, PETSCSPACEPOLYNOMIAL);
299: *sp = s;
300: return 0;
301: }
303: /*@
304: PetscSpaceGetDimension - Return the dimension of this space, i.e. the number of basis vectors
306: Input Parameter:
307: . sp - The PetscSpace
309: Output Parameter:
310: . dim - The dimension
312: Level: intermediate
314: .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
315: @*/
316: PetscErrorCode PetscSpaceGetDimension(PetscSpace sp, PetscInt *dim)
317: {
320: if (sp->dim == PETSC_DETERMINE) {
321: if (sp->ops->getdimension) (*sp->ops->getdimension)(sp, &sp->dim);
322: }
323: *dim = sp->dim;
324: return 0;
325: }
327: /*@
328: PetscSpaceGetDegree - Return the polynomial degrees that characterize this space
330: Input Parameter:
331: . sp - The PetscSpace
333: Output Parameters:
334: + minDegree - The degree of the largest polynomial space contained in the space
335: - maxDegree - The degree of the smallest polynomial space containing the space
337: Level: intermediate
339: .seealso: PetscSpaceSetDegree(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
340: @*/
341: PetscErrorCode PetscSpaceGetDegree(PetscSpace sp, PetscInt *minDegree, PetscInt *maxDegree)
342: {
346: if (minDegree) *minDegree = sp->degree;
347: if (maxDegree) *maxDegree = sp->maxDegree;
348: return 0;
349: }
351: /*@
352: PetscSpaceSetDegree - Set the degree of approximation for this space.
354: Input Parameters:
355: + sp - The PetscSpace
356: . degree - The degree of the largest polynomial space contained in the space
357: - maxDegree - The degree of the largest polynomial space containing the space. One of degree and maxDegree can be PETSC_DETERMINE.
359: Level: intermediate
361: .seealso: PetscSpaceGetDegree(), PetscSpaceCreate(), PetscSpace
362: @*/
363: PetscErrorCode PetscSpaceSetDegree(PetscSpace sp, PetscInt degree, PetscInt maxDegree)
364: {
366: sp->degree = degree;
367: sp->maxDegree = maxDegree;
368: return 0;
369: }
371: /*@
372: PetscSpaceGetNumComponents - Return the number of components for this space
374: Input Parameter:
375: . sp - The PetscSpace
377: Output Parameter:
378: . Nc - The number of components
380: Note: A vector space, for example, will have d components, where d is the spatial dimension
382: Level: intermediate
384: .seealso: PetscSpaceSetNumComponents(), PetscSpaceGetNumVariables(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
385: @*/
386: PetscErrorCode PetscSpaceGetNumComponents(PetscSpace sp, PetscInt *Nc)
387: {
390: *Nc = sp->Nc;
391: return 0;
392: }
394: /*@
395: PetscSpaceSetNumComponents - Set the number of components for this space
397: Input Parameters:
398: + sp - The PetscSpace
399: - order - The number of components
401: Level: intermediate
403: .seealso: PetscSpaceGetNumComponents(), PetscSpaceSetNumVariables(), PetscSpaceCreate(), PetscSpace
404: @*/
405: PetscErrorCode PetscSpaceSetNumComponents(PetscSpace sp, PetscInt Nc)
406: {
408: sp->Nc = Nc;
409: return 0;
410: }
412: /*@
413: PetscSpaceSetNumVariables - Set the number of variables for this space
415: Input Parameters:
416: + sp - The PetscSpace
417: - n - The number of variables, e.g. x, y, z...
419: Level: intermediate
421: .seealso: PetscSpaceGetNumVariables(), PetscSpaceSetNumComponents(), PetscSpaceCreate(), PetscSpace
422: @*/
423: PetscErrorCode PetscSpaceSetNumVariables(PetscSpace sp, PetscInt n)
424: {
426: sp->Nv = n;
427: return 0;
428: }
430: /*@
431: PetscSpaceGetNumVariables - Return the number of variables for this space
433: Input Parameter:
434: . sp - The PetscSpace
436: Output Parameter:
437: . Nc - The number of variables, e.g. x, y, z...
439: Level: intermediate
441: .seealso: PetscSpaceSetNumVariables(), PetscSpaceGetNumComponents(), PetscSpaceGetDimension(), PetscSpaceCreate(), PetscSpace
442: @*/
443: PetscErrorCode PetscSpaceGetNumVariables(PetscSpace sp, PetscInt *n)
444: {
447: *n = sp->Nv;
448: return 0;
449: }
451: /*@C
452: PetscSpaceEvaluate - Evaluate the basis functions and their derivatives (jet) at each point
454: Input Parameters:
455: + sp - The PetscSpace
456: . npoints - The number of evaluation points, in reference coordinates
457: - points - The point coordinates
459: Output Parameters:
460: + B - The function evaluations in a npoints x nfuncs array
461: . D - The derivative evaluations in a npoints x nfuncs x dim array
462: - H - The second derivative evaluations in a npoints x nfuncs x dim x dim array
464: Note: Above nfuncs is the dimension of the space, and dim is the spatial dimension. The coordinates are given
465: on the reference cell, not in real space.
467: Level: beginner
469: .seealso: PetscFECreateTabulation(), PetscFEGetCellTabulation(), PetscSpaceCreate()
470: @*/
471: PetscErrorCode PetscSpaceEvaluate(PetscSpace sp, PetscInt npoints, const PetscReal points[], PetscReal B[], PetscReal D[], PetscReal H[])
472: {
473: if (!npoints) return 0;
479: if (sp->ops->evaluate) (*sp->ops->evaluate)(sp, npoints, points, B, D, H);
480: return 0;
481: }
483: /*@
484: PetscSpaceGetHeightSubspace - Get the subset of the primal space basis that is supported on a mesh point of a given height.
486: If the space is not defined on mesh points of the given height (e.g. if the space is discontinuous and
487: pointwise values are not defined on the element boundaries), or if the implementation of PetscSpace does not
488: support extracting subspaces, then NULL is returned.
490: This does not increment the reference count on the returned space, and the user should not destroy it.
492: Not collective
494: Input Parameters:
495: + sp - the PetscSpace object
496: - height - the height of the mesh point for which the subspace is desired
498: Output Parameter:
499: . subsp - the subspace
501: Level: advanced
503: .seealso: PetscDualSpaceGetHeightSubspace(), PetscSpace
504: @*/
505: PetscErrorCode PetscSpaceGetHeightSubspace(PetscSpace sp, PetscInt height, PetscSpace *subsp)
506: {
509: *subsp = NULL;
510: if (sp->ops->getheightsubspace) {
511: (*sp->ops->getheightsubspace)(sp, height, subsp);
512: }
513: return 0;
514: }