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