xref: /petsc/src/dm/field/interface/dmfield.c (revision 3da551e6902c90981197ed1d321ca1b1c7d15a9d)
1*3da551e6SToby Isaac #include <petsc/private/dmfieldimpl.h> /*I "petscdmfield.h" I*/
2*3da551e6SToby Isaac 
3*3da551e6SToby Isaac const char *const DMFieldContinuities[] = {
4*3da551e6SToby Isaac   "VERTEX",
5*3da551e6SToby Isaac   "EDGE",
6*3da551e6SToby Isaac   "FACET",
7*3da551e6SToby Isaac   "CELL",
8*3da551e6SToby Isaac   0
9*3da551e6SToby Isaac };
10*3da551e6SToby Isaac 
11*3da551e6SToby Isaac PETSC_INTERN PetscErrorCode DMFieldCreate(DM dm,PetscInt numComponents,DMFieldContinuity continuity,DMField *field)
12*3da551e6SToby Isaac {
13*3da551e6SToby Isaac   PetscErrorCode ierr;
14*3da551e6SToby Isaac   DMField        b;
15*3da551e6SToby Isaac 
16*3da551e6SToby Isaac   PetscFunctionBegin;
17*3da551e6SToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
18*3da551e6SToby Isaac   PetscValidPointer(field,2);
19*3da551e6SToby Isaac   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
20*3da551e6SToby Isaac 
21*3da551e6SToby Isaac   ierr = PetscHeaderCreate(b,DMFIELD_CLASSID,"DMField","Field over DM","DM",PetscObjectComm((PetscObject)dm),DMFieldDestroy,DMFieldView);CHKERRQ(ierr);
22*3da551e6SToby Isaac   ierr = PetscObjectReference((PetscObject)dm);CHKERRQ(ierr);
23*3da551e6SToby Isaac   b->dm = dm;
24*3da551e6SToby Isaac   b->continuity = continuity;
25*3da551e6SToby Isaac   b->numComponents = numComponents;
26*3da551e6SToby Isaac   *field = b;
27*3da551e6SToby Isaac   PetscFunctionReturn(0);
28*3da551e6SToby Isaac }
29*3da551e6SToby Isaac 
30*3da551e6SToby Isaac /*@
31*3da551e6SToby Isaac    DMFieldDestroy - destroy a DMField
32*3da551e6SToby Isaac 
33*3da551e6SToby Isaac    Collective
34*3da551e6SToby Isaac 
35*3da551e6SToby Isaac    Input Arguments:
36*3da551e6SToby Isaac .  field - address of DMField
37*3da551e6SToby Isaac 
38*3da551e6SToby Isaac    Level: advanced
39*3da551e6SToby Isaac 
40*3da551e6SToby Isaac .seealso: DMFieldCreate()
41*3da551e6SToby Isaac @*/
42*3da551e6SToby Isaac PetscErrorCode DMFieldDestroy(DMField *field)
43*3da551e6SToby Isaac {
44*3da551e6SToby Isaac   PetscErrorCode ierr;
45*3da551e6SToby Isaac 
46*3da551e6SToby Isaac   PetscFunctionBegin;
47*3da551e6SToby Isaac   if (!*field) PetscFunctionReturn(0);
48*3da551e6SToby Isaac   PetscValidHeaderSpecific((*field),DMFIELD_CLASSID,1);
49*3da551e6SToby Isaac   if (--((PetscObject)(*field))->refct > 0) {*field = 0; PetscFunctionReturn(0);}
50*3da551e6SToby Isaac   if ((*field)->ops->destroy) {ierr = (*(*field)->ops->destroy)(*field);CHKERRQ(ierr);}
51*3da551e6SToby Isaac   ierr = DMDestroy(&((*field)->dm));CHKERRQ(ierr);
52*3da551e6SToby Isaac   ierr = PetscHeaderDestroy(field);CHKERRQ(ierr);
53*3da551e6SToby Isaac   PetscFunctionReturn(0);
54*3da551e6SToby Isaac }
55*3da551e6SToby Isaac 
56*3da551e6SToby Isaac /*@C
57*3da551e6SToby Isaac    DMFieldView - view a DMField
58*3da551e6SToby Isaac 
59*3da551e6SToby Isaac    Collective
60*3da551e6SToby Isaac 
61*3da551e6SToby Isaac    Input Arguments:
62*3da551e6SToby Isaac +  field - DMField
63*3da551e6SToby Isaac -  viewer - viewer to display field, for example PETSC_VIEWER_STDOUT_WORLD
64*3da551e6SToby Isaac 
65*3da551e6SToby Isaac    Level: advanced
66*3da551e6SToby Isaac 
67*3da551e6SToby Isaac .seealso: DMFieldCreate()
68*3da551e6SToby Isaac @*/
69*3da551e6SToby Isaac PetscErrorCode DMFieldView(DMField field,PetscViewer viewer)
70*3da551e6SToby Isaac {
71*3da551e6SToby Isaac   PetscErrorCode    ierr;
72*3da551e6SToby Isaac   PetscBool         iascii;
73*3da551e6SToby Isaac 
74*3da551e6SToby Isaac   PetscFunctionBegin;
75*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
76*3da551e6SToby Isaac   if (!viewer) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)field),&viewer);CHKERRQ(ierr);}
77*3da551e6SToby Isaac   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
78*3da551e6SToby Isaac   PetscCheckSameComm(field,1,viewer,2);
79*3da551e6SToby Isaac   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
80*3da551e6SToby Isaac   if (iascii) {
81*3da551e6SToby Isaac     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)field,viewer);CHKERRQ(ierr);
82*3da551e6SToby Isaac     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
83*3da551e6SToby Isaac     ierr = PetscViewerASCIIPrintf(viewer,"%D components\n",field->numComponents);CHKERRQ(ierr);
84*3da551e6SToby Isaac     ierr = PetscViewerASCIIPrintf(viewer,"%s continuity\n",DMFieldContinuities[field->continuity]);CHKERRQ(ierr);
85*3da551e6SToby Isaac     ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_DEFAULT);CHKERRQ(ierr);
86*3da551e6SToby Isaac     ierr = DMView(field->dm,viewer);CHKERRQ(ierr);
87*3da551e6SToby Isaac     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
88*3da551e6SToby Isaac   }
89*3da551e6SToby Isaac   if (field->ops->view) {ierr = (*field->ops->view)(field,viewer);CHKERRQ(ierr);}
90*3da551e6SToby Isaac   if (iascii) {
91*3da551e6SToby Isaac     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
92*3da551e6SToby Isaac   }
93*3da551e6SToby Isaac   PetscFunctionReturn(0);
94*3da551e6SToby Isaac }
95*3da551e6SToby Isaac 
96*3da551e6SToby Isaac /*@C
97*3da551e6SToby Isaac    DMFieldSetType - set the DMField implementation
98*3da551e6SToby Isaac 
99*3da551e6SToby Isaac    Collective on DMField
100*3da551e6SToby Isaac 
101*3da551e6SToby Isaac    Input Parameters:
102*3da551e6SToby Isaac +  field - the DMField context
103*3da551e6SToby Isaac -  type - a known method
104*3da551e6SToby Isaac 
105*3da551e6SToby Isaac    Notes:
106*3da551e6SToby Isaac    See "include/petscvec.h" for available methods (for instance)
107*3da551e6SToby Isaac +    DMFIELDDA    - a field defined only by its values at the corners of a DMDA
108*3da551e6SToby Isaac .    DMFIELDDS    - a field defined by a discretization over a mesh set with DMSetField()
109*3da551e6SToby Isaac -    DMFIELDSHELL - a field defined by arbitrary callbacks
110*3da551e6SToby Isaac 
111*3da551e6SToby Isaac   Level: advanced
112*3da551e6SToby Isaac 
113*3da551e6SToby Isaac .keywords: DMField, set, type
114*3da551e6SToby Isaac 
115*3da551e6SToby Isaac .seealso: DMFieldType,
116*3da551e6SToby Isaac @*/
117*3da551e6SToby Isaac PetscErrorCode DMFieldSetType(DMField field,DMFieldType type)
118*3da551e6SToby Isaac {
119*3da551e6SToby Isaac   PetscErrorCode ierr,(*r)(DMField);
120*3da551e6SToby Isaac   PetscBool      match;
121*3da551e6SToby Isaac 
122*3da551e6SToby Isaac   PetscFunctionBegin;
123*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
124*3da551e6SToby Isaac   PetscValidCharPointer(type,2);
125*3da551e6SToby Isaac 
126*3da551e6SToby Isaac   ierr = PetscObjectTypeCompare((PetscObject)field,type,&match);CHKERRQ(ierr);
127*3da551e6SToby Isaac   if (match) PetscFunctionReturn(0);
128*3da551e6SToby Isaac 
129*3da551e6SToby Isaac   ierr = PetscFunctionListFind(DMFieldList,type,&r);CHKERRQ(ierr);
130*3da551e6SToby Isaac   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested DMField type %s",type);
131*3da551e6SToby Isaac   /* Destroy the previous private DMField context */
132*3da551e6SToby Isaac   if (field->ops->destroy) {
133*3da551e6SToby Isaac     ierr = (*(field)->ops->destroy)(field);CHKERRQ(ierr);
134*3da551e6SToby Isaac   }
135*3da551e6SToby Isaac   ierr = PetscMemzero(field->ops,sizeof(*field->ops));CHKERRQ(ierr);
136*3da551e6SToby Isaac   ierr = PetscObjectChangeTypeName((PetscObject)field,type);CHKERRQ(ierr);
137*3da551e6SToby Isaac   field->ops->create = r;
138*3da551e6SToby Isaac   ierr = (*r)(field);CHKERRQ(ierr);
139*3da551e6SToby Isaac   PetscFunctionReturn(0);
140*3da551e6SToby Isaac }
141*3da551e6SToby Isaac 
142*3da551e6SToby Isaac /*@C
143*3da551e6SToby Isaac   DMFieldGetType - Gets the DMField type name (as a string) from the DMField.
144*3da551e6SToby Isaac 
145*3da551e6SToby Isaac   Not Collective
146*3da551e6SToby Isaac 
147*3da551e6SToby Isaac   Input Parameter:
148*3da551e6SToby Isaac . field  - The DMField context
149*3da551e6SToby Isaac 
150*3da551e6SToby Isaac   Output Parameter:
151*3da551e6SToby Isaac . type - The DMField type name
152*3da551e6SToby Isaac 
153*3da551e6SToby Isaac   Level: advanced
154*3da551e6SToby Isaac 
155*3da551e6SToby Isaac .keywords: DMField, get, type, name
156*3da551e6SToby Isaac .seealso: DMFieldSetType()
157*3da551e6SToby Isaac @*/
158*3da551e6SToby Isaac PetscErrorCode  DMFieldGetType(DMField field, DMFieldType *type)
159*3da551e6SToby Isaac {
160*3da551e6SToby Isaac   PetscErrorCode ierr;
161*3da551e6SToby Isaac 
162*3da551e6SToby Isaac   PetscFunctionBegin;
163*3da551e6SToby Isaac   PetscValidHeaderSpecific(field, VEC_TAGGER_CLASSID,1);
164*3da551e6SToby Isaac   PetscValidPointer(type,2);
165*3da551e6SToby Isaac   ierr = DMFieldRegisterAll();CHKERRQ(ierr);
166*3da551e6SToby Isaac   *type = ((PetscObject)field)->type_name;
167*3da551e6SToby Isaac   PetscFunctionReturn(0);
168*3da551e6SToby Isaac }
169*3da551e6SToby Isaac 
170*3da551e6SToby Isaac PetscErrorCode DMFieldGetNumComponents(DMField field, PetscInt *nc)
171*3da551e6SToby Isaac {
172*3da551e6SToby Isaac   PetscFunctionBegin;
173*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
174*3da551e6SToby Isaac   PetscValidIntPointer(nc,2);
175*3da551e6SToby Isaac   *nc = field->numComponents;
176*3da551e6SToby Isaac   PetscFunctionReturn(0);
177*3da551e6SToby Isaac }
178*3da551e6SToby Isaac 
179*3da551e6SToby Isaac PetscErrorCode DMFieldGetDM(DMField field, DM *dm)
180*3da551e6SToby Isaac {
181*3da551e6SToby Isaac   PetscFunctionBegin;
182*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
183*3da551e6SToby Isaac   PetscValidPointer(dm,2);
184*3da551e6SToby Isaac   *dm = field->dm;
185*3da551e6SToby Isaac   PetscFunctionReturn(0);
186*3da551e6SToby Isaac }
187*3da551e6SToby Isaac 
188*3da551e6SToby Isaac PetscErrorCode DMFieldEvaluate(DMField field, Vec points, PetscDataType datatype, void *B, void *D, void *H)
189*3da551e6SToby Isaac {
190*3da551e6SToby Isaac   PetscErrorCode ierr;
191*3da551e6SToby Isaac 
192*3da551e6SToby Isaac   PetscFunctionBegin;
193*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
194*3da551e6SToby Isaac   PetscValidHeaderSpecific(points,VEC_CLASSID,2);
195*3da551e6SToby Isaac   if (B) PetscValidPointer(B,3);
196*3da551e6SToby Isaac   if (D) PetscValidPointer(D,4);
197*3da551e6SToby Isaac   if (H) PetscValidPointer(H,5);
198*3da551e6SToby Isaac   if (field->ops->evaluate) {
199*3da551e6SToby Isaac     ierr = (*field->ops->evaluate) (field, points, datatype, B, D, H);CHKERRQ(ierr);
200*3da551e6SToby Isaac   } else SETERRQ (PetscObjectComm((PetscObject)field),PETSC_ERR_SUP,"Not implemented for this type");
201*3da551e6SToby Isaac   PetscFunctionReturn(0);
202*3da551e6SToby Isaac }
203*3da551e6SToby Isaac 
204*3da551e6SToby Isaac PetscErrorCode DMFieldEvaluateFE(DMField field, IS cellIS, PetscQuadrature points, PetscDataType datatype, void *B, void *D, void *H)
205*3da551e6SToby Isaac {
206*3da551e6SToby Isaac   PetscErrorCode ierr;
207*3da551e6SToby Isaac 
208*3da551e6SToby Isaac   PetscFunctionBegin;
209*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
210*3da551e6SToby Isaac   PetscValidHeaderSpecific(cellIS,IS_CLASSID,2);
211*3da551e6SToby Isaac   PetscValidHeader(points,3);
212*3da551e6SToby Isaac   if (B) PetscValidPointer(B,4);
213*3da551e6SToby Isaac   if (D) PetscValidPointer(D,5);
214*3da551e6SToby Isaac   if (H) PetscValidPointer(H,6);
215*3da551e6SToby Isaac   if (field->ops->evaluateFE) {
216*3da551e6SToby Isaac     ierr = (*field->ops->evaluateFE) (field, cellIS, points, datatype, B, D, H);CHKERRQ(ierr);
217*3da551e6SToby Isaac   } else SETERRQ (PetscObjectComm((PetscObject)field),PETSC_ERR_SUP,"Not implemented for this type");
218*3da551e6SToby Isaac   PetscFunctionReturn(0);
219*3da551e6SToby Isaac }
220*3da551e6SToby Isaac 
221*3da551e6SToby Isaac PetscErrorCode DMFieldEvaluateFV(DMField field, IS cellIS, PetscDataType datatype, void *B, void *D, void *H)
222*3da551e6SToby Isaac {
223*3da551e6SToby Isaac   PetscErrorCode ierr;
224*3da551e6SToby Isaac 
225*3da551e6SToby Isaac   PetscFunctionBegin;
226*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
227*3da551e6SToby Isaac   PetscValidHeaderSpecific(cellIS,IS_CLASSID,2);
228*3da551e6SToby Isaac   if (B) PetscValidPointer(B,3);
229*3da551e6SToby Isaac   if (D) PetscValidPointer(D,4);
230*3da551e6SToby Isaac   if (H) PetscValidPointer(H,5);
231*3da551e6SToby Isaac   if (field->ops->evaluateFV) {
232*3da551e6SToby Isaac     ierr = (*field->ops->evaluateFV) (field, cellIS, datatype, B, D, H);CHKERRQ(ierr);
233*3da551e6SToby Isaac   } else SETERRQ (PetscObjectComm((PetscObject)field),PETSC_ERR_SUP,"Not implemented for this type");
234*3da551e6SToby Isaac   PetscFunctionReturn(0);
235*3da551e6SToby Isaac }
236*3da551e6SToby Isaac 
237*3da551e6SToby Isaac PetscErrorCode DMFieldGetFEInvariance(DMField field, IS cellIS, PetscBool *isConstant, PetscBool *isAffine, PetscBool *isQuadratic)
238*3da551e6SToby Isaac {
239*3da551e6SToby Isaac   PetscErrorCode ierr;
240*3da551e6SToby Isaac 
241*3da551e6SToby Isaac   PetscFunctionBegin;
242*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
243*3da551e6SToby Isaac   PetscValidHeaderSpecific(cellIS,IS_CLASSID,2);
244*3da551e6SToby Isaac   if (isConstant) PetscValidPointer(isConstant,3);
245*3da551e6SToby Isaac   if (isAffine) PetscValidPointer(isAffine,4);
246*3da551e6SToby Isaac   if (isQuadratic) PetscValidPointer(isQuadratic,5);
247*3da551e6SToby Isaac 
248*3da551e6SToby Isaac   if (isConstant)  *isConstant  = PETSC_FALSE;
249*3da551e6SToby Isaac   if (isAffine)    *isAffine    = PETSC_FALSE;
250*3da551e6SToby Isaac   if (isQuadratic) *isQuadratic = PETSC_FALSE;
251*3da551e6SToby Isaac 
252*3da551e6SToby Isaac   if (field->ops->getFEInvariance) {
253*3da551e6SToby Isaac     ierr = (*field->ops->getFEInvariance) (field,cellIS,isConstant,isAffine,isQuadratic);CHKERRQ(ierr);
254*3da551e6SToby Isaac   }
255*3da551e6SToby Isaac   PetscFunctionReturn(0);
256*3da551e6SToby Isaac }
257*3da551e6SToby Isaac 
258*3da551e6SToby Isaac PetscErrorCode DMFieldCreateDefaultQuadrature(DMField field, IS pointIS, PetscQuadrature *quad)
259*3da551e6SToby Isaac {
260*3da551e6SToby Isaac   PetscErrorCode ierr;
261*3da551e6SToby Isaac 
262*3da551e6SToby Isaac   PetscFunctionBegin;
263*3da551e6SToby Isaac   PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1);
264*3da551e6SToby Isaac   PetscValidHeaderSpecific(pointIS,IS_CLASSID,2);
265*3da551e6SToby Isaac   PetscValidPointer(quad,3);
266*3da551e6SToby Isaac 
267*3da551e6SToby Isaac   *quad = NULL;
268*3da551e6SToby Isaac   if (field->ops->createDefaultQuadrature) {
269*3da551e6SToby Isaac     ierr = (*field->ops->createDefaultQuadrature)(field, pointIS, quad);CHKERRQ(ierr);
270*3da551e6SToby Isaac   }
271*3da551e6SToby Isaac   PetscFunctionReturn(0);
272*3da551e6SToby Isaac }
273*3da551e6SToby Isaac 
274