xref: /petsc/src/dm/impls/swarm/swarmpic_view.c (revision 569e28a7502c934530efa6903dfdf087ebd3ebcd)
1 #include <petscdm.h>
2 #include <petscdmda.h>
3 #include <petscdmswarm.h>
4 #include <petsc/private/dmswarmimpl.h>
5 #include "../src/dm/impls/swarm/data_bucket.h"
6 
7 PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v)
8 {
9   long int       *bytes;
10   PetscContainer container;
11   PetscViewer    viewer;
12   PetscErrorCode ierr;
13 
14   PetscFunctionBegin;
15   ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr);
16   ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr);
17   ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
18   ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr);
19 
20   ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr);
21   bytes[0] = 0;
22   ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr);
23   ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr);
24   ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr);
25 
26   /* write xdmf header */
27   ierr = PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");CHKERRQ(ierr);
28   ierr = PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n");CHKERRQ(ierr);
29   /* write xdmf domain */
30   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
31   ierr = PetscViewerASCIIPrintf(viewer,"<Domain>\n");CHKERRQ(ierr);
32   *v = viewer;
33   PetscFunctionReturn(0);
34 }
35 
36 PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v)
37 {
38   PetscViewer    viewer;
39   DM             dm = NULL;
40   long int       *bytes;
41   PetscContainer container = NULL;
42   PetscErrorCode ierr;
43 
44   PetscFunctionBegin;
45   if (!v) PetscFunctionReturn(0);
46   viewer = *v;
47 
48   ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr);
49   if (dm) {
50     ierr = PetscViewerASCIIPrintf(viewer,"</Grid>\n");CHKERRQ(ierr);
51     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
52   }
53 
54   /* close xdmf header */
55   ierr = PetscViewerASCIIPrintf(viewer,"</Domain>\n");CHKERRQ(ierr);
56   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
57   ierr = PetscViewerASCIIPrintf(viewer,"</Xdmf>\n");CHKERRQ(ierr);
58 
59   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
60   if (container) {
61     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
62     ierr = PetscFree(bytes);CHKERRQ(ierr);
63     ierr = PetscContainerDestroy(&container);CHKERRQ(ierr);
64   }
65 
66   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
67   *v = NULL;
68   PetscFunctionReturn(0);
69 }
70 
71 PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[])
72 {
73   char           *ext;
74   PetscBool      flg;
75   PetscErrorCode ierr;
76 
77   PetscFunctionBegin;
78   ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr);
79   ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr);
80   if (flg) {
81     size_t len;
82     char    viewername_minus_ext[PETSC_MAX_PATH_LEN];
83 
84     ierr = PetscStrlen(filename,&len);CHKERRQ(ierr);
85     ierr = PetscStrncpy(viewername_minus_ext,filename,len-2);CHKERRQ(ierr);
86     ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr);
87   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf");
88 
89   PetscFunctionReturn(0);
90 }
91 
92 PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer)
93 {
94   PetscBool      isswarm = PETSC_FALSE;
95   const char     *viewername;
96   char           datafile[PETSC_MAX_PATH_LEN];
97   char           *datafilename;
98   PetscViewer    fviewer;
99   PetscInt       k,ng,dim;
100   Vec            dvec;
101   long int       *bytes = NULL;
102   PetscContainer container = NULL;
103   const char     *dmname;
104   PetscErrorCode ierr;
105 
106   PetscFunctionBegin;
107   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
108   if (container) {
109     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
110   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
111 
112   ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr);
113   if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm");
114 
115   ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr);
116 
117   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
118   ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr);
119   if (!dmname) {
120     ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr);
121   }
122   if (!dmname) {
123     ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");CHKERRQ(ierr);
124   } else {
125     ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);CHKERRQ(ierr);
126   }
127 
128   /* create a sub-viewer for topology, geometry and all data fields */
129   /* name is viewer.name + "_swarm_fields.pbin" */
130   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
131   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
132   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
133   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
134   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr);
135 
136   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
137   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
138   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
139   ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr);
140 
141   ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr);
142 
143   /* write topology header */
144   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
145   ierr = PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);CHKERRQ(ierr);
146   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
147   ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);CHKERRQ(ierr);
148   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
149   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
150   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
151   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
152   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
153   ierr = PetscViewerASCIIPrintf(viewer,"</Topology>\n");CHKERRQ(ierr);
154   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
155 
156   /* write topology data */
157   for (k=0; k<ng; k++) {
158     PetscInt pvertex[3];
159 
160     pvertex[0] = 1;
161     pvertex[1] = 1;
162     pvertex[2] = k;
163     ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT);CHKERRQ(ierr);
164   }
165   bytes[0] += sizeof(PetscInt) * ng * 3;
166 
167   /* write geometry header */
168   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
169   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
170   switch (dim) {
171     case 1:
172       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D");
173       break;
174     case 2:
175       ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");CHKERRQ(ierr);
176       break;
177     case 3:
178       ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");CHKERRQ(ierr);
179       break;
180   }
181   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
182   ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]);CHKERRQ(ierr);
183   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
184   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
185   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
186   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
187   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
188   ierr = PetscViewerASCIIPrintf(viewer,"</Geometry>\n");CHKERRQ(ierr);
189   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
190 
191   /* write geometry data */
192   ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
193   ierr = VecView(dvec,fviewer);CHKERRQ(ierr);
194   ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
195   bytes[0] += sizeof(PetscReal) * ng * dim;
196 
197   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
198 
199   PetscFunctionReturn(0);
200 }
201 
202 PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer)
203 {
204   long int       *bytes = NULL;
205   PetscContainer container = NULL;
206   const char     *viewername;
207   char           datafile[PETSC_MAX_PATH_LEN];
208   char           *datafilename;
209   PetscViewer    fviewer;
210   PetscInt       N,bs;
211   const char     *vecname;
212   char           fieldname[PETSC_MAX_PATH_LEN];
213   PetscErrorCode ierr;
214 
215   PetscFunctionBegin;
216   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
217   if (container) {
218     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
219   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
220 
221   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
222   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
223 
224   /* re-open a sub-viewer for all data fields */
225   /* name is viewer.name + "_swarm_fields.pbin" */
226   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
227   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
228   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
229   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
230   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr);
231   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
232   ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr);
233 
234   ierr = VecGetSize(x,&N);CHKERRQ(ierr);
235   ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr);
236   N = N/bs;
237   ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr);
238   if (!vecname) {
239     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr);
240   } else {
241     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr);
242   }
243 
244   /* write data header */
245   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
246   ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr);
247   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
248   if (bs == 1) {
249     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr);
250   } else {
251     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr);
252   }
253   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
254   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
255   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
256   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
257   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
258   ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr);
259   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
260 
261   /* write data */
262   ierr = VecView(x,fviewer);CHKERRQ(ierr);
263   bytes[0] += sizeof(PetscReal) * N * bs;
264 
265   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
266 
267   PetscFunctionReturn(0);
268 }
269 
270 PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer)
271 {
272   long int       *bytes = NULL;
273   PetscContainer container = NULL;
274   const char     *viewername;
275   char           datafile[PETSC_MAX_PATH_LEN];
276   char           *datafilename;
277   PetscViewer    fviewer;
278   PetscInt       N,bs;
279   const char     *vecname;
280   char           fieldname[PETSC_MAX_PATH_LEN];
281   PetscErrorCode ierr;
282 
283   PetscFunctionBegin;
284   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
285   if (container) {
286     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
287   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
288 
289   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
290   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
291 
292   /* re-open a sub-viewer for all data fields */
293   /* name is viewer.name + "_swarm_fields.pbin" */
294   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
295   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
296   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
297   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
298   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr);
299   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
300   ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr);
301 
302   ierr = ISGetSize(is,&N);CHKERRQ(ierr);
303   ierr = ISGetBlockSize(is,&bs);CHKERRQ(ierr);
304   N = N/bs;
305   ierr = PetscObjectGetName((PetscObject)is,&vecname);CHKERRQ(ierr);
306   if (!vecname) {
307     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag);CHKERRQ(ierr);
308   } else {
309     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr);
310   }
311 
312   /* write data header */
313   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
314   ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr);
315   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
316   if (bs == 1) {
317     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr);
318   } else {
319     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr);
320   }
321   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
322   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
323   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
324   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
325   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
326   ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr);
327   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
328 
329   /* write data */
330   ierr = ISView(is,fviewer);CHKERRQ(ierr);
331   bytes[0] += sizeof(PetscInt) * N * bs;
332 
333   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
334 
335   PetscFunctionReturn(0);
336 }
337 
338 /*@C
339    DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file
340 
341    Collective on dm
342 
343    Input parameters:
344 +  dm - the DMSwarm
345 .  filename - the file name of the XDMF file (must have the extension .xmf)
346 .  nfields - the number of fields to write into the XDMF file
347 -  field_name_list - array of length nfields containing the textual name of fields to write
348 
349    Level: beginner
350 
351    Notes:
352    Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file
353 
354 .seealso: DMSwarmViewXDMF()
355 @*/
356 PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[])
357 {
358   PetscErrorCode ierr;
359   Vec            dvec;
360   PetscInt       f,N;
361   PetscViewer    viewer;
362 
363   PetscFunctionBegin;
364   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
365   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
366   ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr);
367   for (f=0; f<nfields; f++) {
368     void          *data;
369     PetscDataType type;
370 
371     ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
372     ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
373 
374     if (type == PETSC_DOUBLE) {
375       ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
376       ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr);
377       ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
378       ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
379     } else if (type == PETSC_INT) {
380       IS is;
381       const PetscInt *idx;
382 
383       ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
384       idx = (const PetscInt*)data;
385 
386       ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
387       ierr = PetscObjectSetName((PetscObject)is,field_name_list[f]);CHKERRQ(ierr);
388       ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr);
389       ierr = ISDestroy(&is);CHKERRQ(ierr);
390       ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
391     } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE");
392 
393   }
394   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
395   PetscFunctionReturn(0);
396 }
397 
398 /*@C
399    DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file
400 
401    Collective on dm
402 
403    Input parameters:
404 +  dm - the DMSwarm
405 -  filename - the file name of the XDMF file (must have the extension .xmf)
406 
407    Level: beginner
408 
409    Notes:
410    Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file
411 
412 .seealso: DMSwarmViewFieldsXDMF()
413 @*/
414 PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[])
415 {
416   DM_Swarm       *swarm = (DM_Swarm*)dm->data;
417   PetscErrorCode ierr;
418   Vec            dvec;
419   PetscInt       f;
420   PetscViewer    viewer;
421 
422   PetscFunctionBegin;
423   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
424   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
425   for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
426     DMSwarmDataField field;
427 
428     /* query field type - accept all those of type PETSC_DOUBLE */
429     field = swarm->db->field[f];
430     if (field->petsc_type == PETSC_DOUBLE) {
431       ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
432       ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr);
433       ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
434       ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
435     } else if (field->petsc_type == PETSC_INT) {
436       IS             is;
437       PetscInt       N;
438       const PetscInt *idx;
439       void           *data;
440 
441       ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr);
442       ierr = DMSwarmGetField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr);
443       idx = (const PetscInt*)data;
444 
445       ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
446       ierr = PetscObjectSetName((PetscObject)is,field->name);CHKERRQ(ierr);
447       ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr);
448       ierr = ISDestroy(&is);CHKERRQ(ierr);
449       ierr = DMSwarmRestoreField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr);
450     }
451   }
452   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
453   PetscFunctionReturn(0);
454 }
455