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