xref: /petsc/src/dm/impls/swarm/swarmpic_view.c (revision 0e2ec84fac7d346010fd148bcbaea49eadbc0158)
1*0e2ec84fSDave May 
2*0e2ec84fSDave May #include <petsc.h>
3*0e2ec84fSDave May #include <petscdm.h>
4*0e2ec84fSDave May #include <petscdmda.h>
5*0e2ec84fSDave May #include <petscdmswarm.h>
6*0e2ec84fSDave May #include <petsc/private/dmswarmimpl.h>
7*0e2ec84fSDave May #include "data_bucket.h"
8*0e2ec84fSDave May 
9*0e2ec84fSDave May PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v)
10*0e2ec84fSDave May {
11*0e2ec84fSDave May   long int *bytes;
12*0e2ec84fSDave May   PetscContainer container;
13*0e2ec84fSDave May   PetscViewer viewer;
14*0e2ec84fSDave May   PetscErrorCode ierr;
15*0e2ec84fSDave May 
16*0e2ec84fSDave May   PetscFunctionBegin;
17*0e2ec84fSDave May   ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr);
18*0e2ec84fSDave May   ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr);
19*0e2ec84fSDave May   ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
20*0e2ec84fSDave May   ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr);
21*0e2ec84fSDave May 
22*0e2ec84fSDave May   ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr);
23*0e2ec84fSDave May   bytes[0] = 0;
24*0e2ec84fSDave May   ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr);
25*0e2ec84fSDave May   ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr);
26*0e2ec84fSDave May   ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr);
27*0e2ec84fSDave May 
28*0e2ec84fSDave May   /* write xdmf header */
29*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
30*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude\" Version=\"2.99\">\n");
31*0e2ec84fSDave May   /* write xdmf domain */
32*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
33*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Domain>\n");
34*0e2ec84fSDave May   *v = viewer;
35*0e2ec84fSDave May   PetscFunctionReturn(0);
36*0e2ec84fSDave May }
37*0e2ec84fSDave May 
38*0e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v)
39*0e2ec84fSDave May {
40*0e2ec84fSDave May   PetscViewer viewer;
41*0e2ec84fSDave May   DM dm = NULL;
42*0e2ec84fSDave May   long int *bytes;
43*0e2ec84fSDave May   PetscContainer container = NULL;
44*0e2ec84fSDave May   PetscErrorCode ierr;
45*0e2ec84fSDave May 
46*0e2ec84fSDave May   PetscFunctionBegin;
47*0e2ec84fSDave May   if (!v) PetscFunctionReturn(0);
48*0e2ec84fSDave May   viewer = *v;
49*0e2ec84fSDave May 
50*0e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr);
51*0e2ec84fSDave May   if (dm) {
52*0e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"</Grid>\n");
53*0e2ec84fSDave May     PetscViewerASCIIPopTab(viewer);
54*0e2ec84fSDave May   }
55*0e2ec84fSDave May 
56*0e2ec84fSDave May   /* close xdmf header */
57*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Domain>\n");
58*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
59*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Xdmf>\n");
60*0e2ec84fSDave May 
61*0e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
62*0e2ec84fSDave May   if (container) {
63*0e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
64*0e2ec84fSDave May     ierr = PetscFree(bytes);CHKERRQ(ierr);
65*0e2ec84fSDave May     ierr = PetscContainerDestroy(&container);CHKERRQ(ierr);
66*0e2ec84fSDave May   }
67*0e2ec84fSDave May 
68*0e2ec84fSDave May   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
69*0e2ec84fSDave May   *v = NULL;
70*0e2ec84fSDave May   PetscFunctionReturn(0);
71*0e2ec84fSDave May }
72*0e2ec84fSDave May 
73*0e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[])
74*0e2ec84fSDave May {
75*0e2ec84fSDave May   char *ext;
76*0e2ec84fSDave May   PetscBool flg;
77*0e2ec84fSDave May   PetscErrorCode ierr;
78*0e2ec84fSDave May 
79*0e2ec84fSDave May   PetscFunctionBegin;
80*0e2ec84fSDave May   ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr);
81*0e2ec84fSDave May   ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr);
82*0e2ec84fSDave May   if (flg) {
83*0e2ec84fSDave May     size_t len;
84*0e2ec84fSDave May     char viewername_minus_ext[PETSC_MAX_PATH_LEN];
85*0e2ec84fSDave May 
86*0e2ec84fSDave May     ierr = PetscStrlen(filename,&len);CHKERRQ(ierr);
87*0e2ec84fSDave May     ierr = PetscSNPrintf(viewername_minus_ext,len-3,"%s",filename);CHKERRQ(ierr);
88*0e2ec84fSDave May     ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr);
89*0e2ec84fSDave May   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf");
90*0e2ec84fSDave May 
91*0e2ec84fSDave May   PetscFunctionReturn(0);
92*0e2ec84fSDave May }
93*0e2ec84fSDave May 
94*0e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer)
95*0e2ec84fSDave May {
96*0e2ec84fSDave May   PetscBool isswarm = PETSC_FALSE;
97*0e2ec84fSDave May   const char *viewername;
98*0e2ec84fSDave May   char datafile[PETSC_MAX_PATH_LEN];
99*0e2ec84fSDave May   PetscViewer fviewer;
100*0e2ec84fSDave May   PetscInt k,ng,dim;
101*0e2ec84fSDave May   Vec dvec;
102*0e2ec84fSDave May   long int *bytes = NULL;
103*0e2ec84fSDave May   PetscContainer container = NULL;
104*0e2ec84fSDave May   const char *dmname;
105*0e2ec84fSDave May   PetscErrorCode ierr;
106*0e2ec84fSDave May 
107*0e2ec84fSDave May   PetscFunctionBegin;
108*0e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
109*0e2ec84fSDave May   if (container) {
110*0e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
111*0e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
112*0e2ec84fSDave May 
113*0e2ec84fSDave May   ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr);
114*0e2ec84fSDave May   if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm");
115*0e2ec84fSDave May 
116*0e2ec84fSDave May   ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr);
117*0e2ec84fSDave May 
118*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
119*0e2ec84fSDave May   ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr);
120*0e2ec84fSDave May   if (!dmname) {
121*0e2ec84fSDave May     ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr);
122*0e2ec84fSDave May   }
123*0e2ec84fSDave May   if (!dmname) {
124*0e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");
125*0e2ec84fSDave May   } else {
126*0e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);
127*0e2ec84fSDave May   }
128*0e2ec84fSDave May 
129*0e2ec84fSDave May   /* create a sub-viewer for topology, geometry and all data fields */
130*0e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
131*0e2ec84fSDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
132*0e2ec84fSDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
133*0e2ec84fSDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
134*0e2ec84fSDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
135*0e2ec84fSDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr);
136*0e2ec84fSDave May 
137*0e2ec84fSDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
138*0e2ec84fSDave May   //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr);
139*0e2ec84fSDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
140*0e2ec84fSDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
141*0e2ec84fSDave May 
142*0e2ec84fSDave May   ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr);
143*0e2ec84fSDave May 
144*0e2ec84fSDave May   /* write topology header */
145*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
146*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);
147*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
148*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);
149*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
150*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"%s\n",datafile);
151*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
152*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</DataItem>\n");
153*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
154*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Topology>\n");
155*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
156*0e2ec84fSDave May 
157*0e2ec84fSDave May   /* write topology data */
158*0e2ec84fSDave May   for (k=0; k<ng; k++) {
159*0e2ec84fSDave May     PetscInt pvertex[3];
160*0e2ec84fSDave May 
161*0e2ec84fSDave May     pvertex[0] = 1;
162*0e2ec84fSDave May     pvertex[1] = 1;
163*0e2ec84fSDave May     pvertex[2] = k;
164*0e2ec84fSDave May     ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
165*0e2ec84fSDave May   }
166*0e2ec84fSDave May   bytes[0] += sizeof(PetscInt) * ng * 3;
167*0e2ec84fSDave May 
168*0e2ec84fSDave May   /* write geometry header */
169*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
170*0e2ec84fSDave May   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
171*0e2ec84fSDave May   switch (dim) {
172*0e2ec84fSDave May     case 1:
173*0e2ec84fSDave May       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D");
174*0e2ec84fSDave May       break;
175*0e2ec84fSDave May     case 2:
176*0e2ec84fSDave May       PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");
177*0e2ec84fSDave May       break;
178*0e2ec84fSDave May     case 3:
179*0e2ec84fSDave May       PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");
180*0e2ec84fSDave May       break;
181*0e2ec84fSDave May   }
182*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
183*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]);
184*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
185*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"%s\n",datafile);
186*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
187*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</DataItem>\n");
188*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
189*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Geometry>\n");
190*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
191*0e2ec84fSDave May 
192*0e2ec84fSDave May   /* write geometry data */
193*0e2ec84fSDave May   ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
194*0e2ec84fSDave May   ierr = VecView(dvec,fviewer);CHKERRQ(ierr);
195*0e2ec84fSDave May   ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
196*0e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * ng * dim;
197*0e2ec84fSDave May 
198*0e2ec84fSDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
199*0e2ec84fSDave May 
200*0e2ec84fSDave May   PetscFunctionReturn(0);
201*0e2ec84fSDave May }
202*0e2ec84fSDave May 
203*0e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer)
204*0e2ec84fSDave May {
205*0e2ec84fSDave May   long int *bytes = NULL;
206*0e2ec84fSDave May   PetscContainer container = NULL;
207*0e2ec84fSDave May   const char *viewername;
208*0e2ec84fSDave May   char datafile[PETSC_MAX_PATH_LEN];
209*0e2ec84fSDave May   PetscViewer fviewer;
210*0e2ec84fSDave May   PetscInt N,bs;
211*0e2ec84fSDave May   const char *vecname;
212*0e2ec84fSDave May   char fieldname[PETSC_MAX_PATH_LEN];
213*0e2ec84fSDave May   PetscErrorCode ierr;
214*0e2ec84fSDave May 
215*0e2ec84fSDave May   PetscFunctionBegin;
216*0e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
217*0e2ec84fSDave May   if (container) {
218*0e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
219*0e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
220*0e2ec84fSDave May 
221*0e2ec84fSDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
222*0e2ec84fSDave May   //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr);
223*0e2ec84fSDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
224*0e2ec84fSDave May 
225*0e2ec84fSDave May   /* re-open a sub-viewer for all data fields */
226*0e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
227*0e2ec84fSDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
228*0e2ec84fSDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
229*0e2ec84fSDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
230*0e2ec84fSDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
231*0e2ec84fSDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr);
232*0e2ec84fSDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
233*0e2ec84fSDave May 
234*0e2ec84fSDave May   ierr = VecGetSize(x,&N);CHKERRQ(ierr);
235*0e2ec84fSDave May   ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr);
236*0e2ec84fSDave May   N = N/bs;
237*0e2ec84fSDave May   ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr);
238*0e2ec84fSDave May   if (!vecname) {
239*0e2ec84fSDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr);
240*0e2ec84fSDave May   } else {
241*0e2ec84fSDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr);
242*0e2ec84fSDave May   }
243*0e2ec84fSDave May 
244*0e2ec84fSDave May   /* write data header */
245*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
246*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);
247*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
248*0e2ec84fSDave May   if (bs == 1) {
249*0e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);
250*0e2ec84fSDave May   } else {
251*0e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);
252*0e2ec84fSDave May   }
253*0e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
254*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"%s\n",datafile);
255*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
256*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</DataItem>\n");
257*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
258*0e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Attribute>\n");
259*0e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
260*0e2ec84fSDave May 
261*0e2ec84fSDave May   /* write data */
262*0e2ec84fSDave May   ierr = VecView(x,fviewer);CHKERRQ(ierr);
263*0e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * N * bs;
264*0e2ec84fSDave May 
265*0e2ec84fSDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
266*0e2ec84fSDave May 
267*0e2ec84fSDave May   PetscFunctionReturn(0);
268*0e2ec84fSDave May }
269*0e2ec84fSDave May 
270*0e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[])
271*0e2ec84fSDave May {
272*0e2ec84fSDave May   PetscErrorCode ierr;
273*0e2ec84fSDave May   Vec dvec;
274*0e2ec84fSDave May   PetscInt f;
275*0e2ec84fSDave May   PetscViewer viewer;
276*0e2ec84fSDave May 
277*0e2ec84fSDave May   PetscFunctionBegin;
278*0e2ec84fSDave May   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
279*0e2ec84fSDave May   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
280*0e2ec84fSDave May   for (f=0; f<nfields; f++) {
281*0e2ec84fSDave May     ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
282*0e2ec84fSDave May     ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr);
283*0e2ec84fSDave May     ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
284*0e2ec84fSDave May     ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
285*0e2ec84fSDave May   }
286*0e2ec84fSDave May   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
287*0e2ec84fSDave May   PetscFunctionReturn(0);
288*0e2ec84fSDave May }
289*0e2ec84fSDave May 
290*0e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[])
291*0e2ec84fSDave May {
292*0e2ec84fSDave May   DM_Swarm *swarm = (DM_Swarm*)dm->data;
293*0e2ec84fSDave May   PetscErrorCode ierr;
294*0e2ec84fSDave May   Vec dvec;
295*0e2ec84fSDave May   PetscInt f;
296*0e2ec84fSDave May   PetscViewer viewer;
297*0e2ec84fSDave May 
298*0e2ec84fSDave May   PetscFunctionBegin;
299*0e2ec84fSDave May   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
300*0e2ec84fSDave May   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
301*0e2ec84fSDave May   for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
302*0e2ec84fSDave May     DataField field;
303*0e2ec84fSDave May 
304*0e2ec84fSDave May     /* query field type - accept all those of type PETSC_DOUBLE */
305*0e2ec84fSDave May     field = swarm->db->field[f];
306*0e2ec84fSDave May     if (field->petsc_type != PETSC_DOUBLE) continue;
307*0e2ec84fSDave May 
308*0e2ec84fSDave May     ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
309*0e2ec84fSDave May     ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr);
310*0e2ec84fSDave May     ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
311*0e2ec84fSDave May     ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
312*0e2ec84fSDave May   }
313*0e2ec84fSDave May   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
314*0e2ec84fSDave May   PetscFunctionReturn(0);
315*0e2ec84fSDave May }
316