xref: /petsc/src/dm/impls/swarm/swarmpic_view.c (revision acf7c82d196f0677e2b2a02a14a748ca9114bafe)
10e2ec84fSDave May 
20e2ec84fSDave May #include <petsc.h>
30e2ec84fSDave May #include <petscdm.h>
40e2ec84fSDave May #include <petscdmda.h>
50e2ec84fSDave May #include <petscdmswarm.h>
60e2ec84fSDave May #include <petsc/private/dmswarmimpl.h>
70e2ec84fSDave May #include "data_bucket.h"
80e2ec84fSDave May 
90e2ec84fSDave May PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v)
100e2ec84fSDave May {
110e2ec84fSDave May   long int *bytes;
120e2ec84fSDave May   PetscContainer container;
130e2ec84fSDave May   PetscViewer viewer;
140e2ec84fSDave May   PetscErrorCode ierr;
150e2ec84fSDave May 
160e2ec84fSDave May   PetscFunctionBegin;
170e2ec84fSDave May   ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr);
180e2ec84fSDave May   ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr);
190e2ec84fSDave May   ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
200e2ec84fSDave May   ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr);
210e2ec84fSDave May 
220e2ec84fSDave May   ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr);
230e2ec84fSDave May   bytes[0] = 0;
240e2ec84fSDave May   ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr);
250e2ec84fSDave May   ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr);
260e2ec84fSDave May   ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr);
270e2ec84fSDave May 
280e2ec84fSDave May   /* write xdmf header */
290e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
300e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude\" Version=\"2.99\">\n");
310e2ec84fSDave May   /* write xdmf domain */
320e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
330e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Domain>\n");
340e2ec84fSDave May   *v = viewer;
350e2ec84fSDave May   PetscFunctionReturn(0);
360e2ec84fSDave May }
370e2ec84fSDave May 
380e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v)
390e2ec84fSDave May {
400e2ec84fSDave May   PetscViewer viewer;
410e2ec84fSDave May   DM dm = NULL;
420e2ec84fSDave May   long int *bytes;
430e2ec84fSDave May   PetscContainer container = NULL;
440e2ec84fSDave May   PetscErrorCode ierr;
450e2ec84fSDave May 
460e2ec84fSDave May   PetscFunctionBegin;
470e2ec84fSDave May   if (!v) PetscFunctionReturn(0);
480e2ec84fSDave May   viewer = *v;
490e2ec84fSDave May 
500e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr);
510e2ec84fSDave May   if (dm) {
520e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"</Grid>\n");
530e2ec84fSDave May     PetscViewerASCIIPopTab(viewer);
540e2ec84fSDave May   }
550e2ec84fSDave May 
560e2ec84fSDave May   /* close xdmf header */
570e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Domain>\n");
580e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
590e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Xdmf>\n");
600e2ec84fSDave May 
610e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
620e2ec84fSDave May   if (container) {
630e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
640e2ec84fSDave May     ierr = PetscFree(bytes);CHKERRQ(ierr);
650e2ec84fSDave May     ierr = PetscContainerDestroy(&container);CHKERRQ(ierr);
660e2ec84fSDave May   }
670e2ec84fSDave May 
680e2ec84fSDave May   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
690e2ec84fSDave May   *v = NULL;
700e2ec84fSDave May   PetscFunctionReturn(0);
710e2ec84fSDave May }
720e2ec84fSDave May 
730e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[])
740e2ec84fSDave May {
750e2ec84fSDave May   char *ext;
760e2ec84fSDave May   PetscBool flg;
770e2ec84fSDave May   PetscErrorCode ierr;
780e2ec84fSDave May 
790e2ec84fSDave May   PetscFunctionBegin;
800e2ec84fSDave May   ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr);
810e2ec84fSDave May   ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr);
820e2ec84fSDave May   if (flg) {
830e2ec84fSDave May     size_t len;
840e2ec84fSDave May     char viewername_minus_ext[PETSC_MAX_PATH_LEN];
850e2ec84fSDave May 
860e2ec84fSDave May     ierr = PetscStrlen(filename,&len);CHKERRQ(ierr);
870e2ec84fSDave May     ierr = PetscSNPrintf(viewername_minus_ext,len-3,"%s",filename);CHKERRQ(ierr);
880e2ec84fSDave May     ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr);
890e2ec84fSDave May   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf");
900e2ec84fSDave May 
910e2ec84fSDave May   PetscFunctionReturn(0);
920e2ec84fSDave May }
930e2ec84fSDave May 
940e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer)
950e2ec84fSDave May {
960e2ec84fSDave May   PetscBool isswarm = PETSC_FALSE;
970e2ec84fSDave May   const char *viewername;
980e2ec84fSDave May   char datafile[PETSC_MAX_PATH_LEN];
990e2ec84fSDave May   PetscViewer fviewer;
1000e2ec84fSDave May   PetscInt k,ng,dim;
1010e2ec84fSDave May   Vec dvec;
1020e2ec84fSDave May   long int *bytes = NULL;
1030e2ec84fSDave May   PetscContainer container = NULL;
1040e2ec84fSDave May   const char *dmname;
1050e2ec84fSDave May   PetscErrorCode ierr;
1060e2ec84fSDave May 
1070e2ec84fSDave May   PetscFunctionBegin;
1080e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
1090e2ec84fSDave May   if (container) {
1100e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
1110e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
1120e2ec84fSDave May 
1130e2ec84fSDave May   ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr);
1140e2ec84fSDave May   if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm");
1150e2ec84fSDave May 
1160e2ec84fSDave May   ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr);
1170e2ec84fSDave May 
1180e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1190e2ec84fSDave May   ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr);
1200e2ec84fSDave May   if (!dmname) {
1210e2ec84fSDave May     ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr);
1220e2ec84fSDave May   }
1230e2ec84fSDave May   if (!dmname) {
1240e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");
1250e2ec84fSDave May   } else {
1260e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);
1270e2ec84fSDave May   }
1280e2ec84fSDave May 
1290e2ec84fSDave May   /* create a sub-viewer for topology, geometry and all data fields */
1300e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
1310e2ec84fSDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
1320e2ec84fSDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
1330e2ec84fSDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
1340e2ec84fSDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
1350e2ec84fSDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr);
1360e2ec84fSDave May 
1370e2ec84fSDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
1380e2ec84fSDave May   //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr);
1390e2ec84fSDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
1400e2ec84fSDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
1410e2ec84fSDave May 
1420e2ec84fSDave May   ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr);
1430e2ec84fSDave May 
1440e2ec84fSDave May   /* write topology header */
1450e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1460e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);
1470e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1480e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);
1490e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1500e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"%s\n",datafile);
1510e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
1520e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</DataItem>\n");
1530e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
1540e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Topology>\n");
1550e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
1560e2ec84fSDave May 
1570e2ec84fSDave May   /* write topology data */
1580e2ec84fSDave May   for (k=0; k<ng; k++) {
1590e2ec84fSDave May     PetscInt pvertex[3];
1600e2ec84fSDave May 
1610e2ec84fSDave May     pvertex[0] = 1;
1620e2ec84fSDave May     pvertex[1] = 1;
1630e2ec84fSDave May     pvertex[2] = k;
1640e2ec84fSDave May     ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1650e2ec84fSDave May   }
1660e2ec84fSDave May   bytes[0] += sizeof(PetscInt) * ng * 3;
1670e2ec84fSDave May 
1680e2ec84fSDave May   /* write geometry header */
1690e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1700e2ec84fSDave May   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
1710e2ec84fSDave May   switch (dim) {
1720e2ec84fSDave May     case 1:
1730e2ec84fSDave May       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D");
1740e2ec84fSDave May       break;
1750e2ec84fSDave May     case 2:
1760e2ec84fSDave May       PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");
1770e2ec84fSDave May       break;
1780e2ec84fSDave May     case 3:
1790e2ec84fSDave May       PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");
1800e2ec84fSDave May       break;
1810e2ec84fSDave May   }
1820e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1830e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]);
1840e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
1850e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"%s\n",datafile);
1860e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
1870e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</DataItem>\n");
1880e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
1890e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Geometry>\n");
1900e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
1910e2ec84fSDave May 
1920e2ec84fSDave May   /* write geometry data */
1930e2ec84fSDave May   ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
1940e2ec84fSDave May   ierr = VecView(dvec,fviewer);CHKERRQ(ierr);
1950e2ec84fSDave May   ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
1960e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * ng * dim;
1970e2ec84fSDave May 
1980e2ec84fSDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
1990e2ec84fSDave May 
2000e2ec84fSDave May   PetscFunctionReturn(0);
2010e2ec84fSDave May }
2020e2ec84fSDave May 
2030e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer)
2040e2ec84fSDave May {
2050e2ec84fSDave May   long int *bytes = NULL;
2060e2ec84fSDave May   PetscContainer container = NULL;
2070e2ec84fSDave May   const char *viewername;
2080e2ec84fSDave May   char datafile[PETSC_MAX_PATH_LEN];
2090e2ec84fSDave May   PetscViewer fviewer;
2100e2ec84fSDave May   PetscInt N,bs;
2110e2ec84fSDave May   const char *vecname;
2120e2ec84fSDave May   char fieldname[PETSC_MAX_PATH_LEN];
2130e2ec84fSDave May   PetscErrorCode ierr;
2140e2ec84fSDave May 
2150e2ec84fSDave May   PetscFunctionBegin;
2160e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
2170e2ec84fSDave May   if (container) {
2180e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
2190e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
2200e2ec84fSDave May 
2210e2ec84fSDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
2220e2ec84fSDave May   //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr);
2230e2ec84fSDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
2240e2ec84fSDave May 
2250e2ec84fSDave May   /* re-open a sub-viewer for all data fields */
2260e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
2270e2ec84fSDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
2280e2ec84fSDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
2290e2ec84fSDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
2300e2ec84fSDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
2310e2ec84fSDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr);
2320e2ec84fSDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
2330e2ec84fSDave May 
2340e2ec84fSDave May   ierr = VecGetSize(x,&N);CHKERRQ(ierr);
2350e2ec84fSDave May   ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr);
2360e2ec84fSDave May   N = N/bs;
2370e2ec84fSDave May   ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr);
2380e2ec84fSDave May   if (!vecname) {
2390e2ec84fSDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr);
2400e2ec84fSDave May   } else {
2410e2ec84fSDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr);
2420e2ec84fSDave May   }
2430e2ec84fSDave May 
2440e2ec84fSDave May   /* write data header */
2450e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
2460e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);
2470e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
2480e2ec84fSDave May   if (bs == 1) {
2490e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);
2500e2ec84fSDave May   } else {
2510e2ec84fSDave May     PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);
2520e2ec84fSDave May   }
2530e2ec84fSDave May   PetscViewerASCIIPushTab(viewer);
2540e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"%s\n",datafile);
2550e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
2560e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</DataItem>\n");
2570e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
2580e2ec84fSDave May   PetscViewerASCIIPrintf(viewer,"</Attribute>\n");
2590e2ec84fSDave May   PetscViewerASCIIPopTab(viewer);
2600e2ec84fSDave May 
2610e2ec84fSDave May   /* write data */
2620e2ec84fSDave May   ierr = VecView(x,fviewer);CHKERRQ(ierr);
2630e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * N * bs;
2640e2ec84fSDave May 
2650e2ec84fSDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
2660e2ec84fSDave May 
2670e2ec84fSDave May   PetscFunctionReturn(0);
2680e2ec84fSDave May }
2690e2ec84fSDave May 
270*acf7c82dSDave May /*@C
271*acf7c82dSDave May    DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file
272*acf7c82dSDave May 
273*acf7c82dSDave May    Collective on DM
274*acf7c82dSDave May 
275*acf7c82dSDave May    Input parameters:
276*acf7c82dSDave May +  dm - the DMSwarm
277*acf7c82dSDave May .  filename - the file name of the XDMF file (must have the extension .xmf)
278*acf7c82dSDave May .  nfields - the number of fields to write into the XDMF file
279*acf7c82dSDave May -  field_name_list - array of length nfields containing the textual name of fields to write
280*acf7c82dSDave May 
281*acf7c82dSDave May    Level: beginner
282*acf7c82dSDave May 
283*acf7c82dSDave May    Notes:
284*acf7c82dSDave May    Only fields registered with data type PETSC_REAL can be written into the file
285*acf7c82dSDave May 
286*acf7c82dSDave May .seealso: DMSwarmViewXDMF()
287*acf7c82dSDave May @*/
2880e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[])
2890e2ec84fSDave May {
2900e2ec84fSDave May   PetscErrorCode ierr;
2910e2ec84fSDave May   Vec dvec;
2920e2ec84fSDave May   PetscInt f;
2930e2ec84fSDave May   PetscViewer viewer;
2940e2ec84fSDave May 
2950e2ec84fSDave May   PetscFunctionBegin;
2960e2ec84fSDave May   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
2970e2ec84fSDave May   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
2980e2ec84fSDave May   for (f=0; f<nfields; f++) {
2990e2ec84fSDave May     ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
3000e2ec84fSDave May     ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr);
3010e2ec84fSDave May     ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
3020e2ec84fSDave May     ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
3030e2ec84fSDave May   }
3040e2ec84fSDave May   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
3050e2ec84fSDave May   PetscFunctionReturn(0);
3060e2ec84fSDave May }
3070e2ec84fSDave May 
308*acf7c82dSDave May /*@C
309*acf7c82dSDave May    DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file
310*acf7c82dSDave May 
311*acf7c82dSDave May    Collective on DM
312*acf7c82dSDave May 
313*acf7c82dSDave May    Input parameters:
314*acf7c82dSDave May +  dm - the DMSwarm
315*acf7c82dSDave May -  filename - the file name of the XDMF file (must have the extension .xmf)
316*acf7c82dSDave May 
317*acf7c82dSDave May    Level: beginner
318*acf7c82dSDave May 
319*acf7c82dSDave May    Notes:
320*acf7c82dSDave May    Only fields registered with data type PETSC_REAL will be written into the file
321*acf7c82dSDave May 
322*acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF()
323*acf7c82dSDave May @*/
3240e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[])
3250e2ec84fSDave May {
3260e2ec84fSDave May   DM_Swarm *swarm = (DM_Swarm*)dm->data;
3270e2ec84fSDave May   PetscErrorCode ierr;
3280e2ec84fSDave May   Vec dvec;
3290e2ec84fSDave May   PetscInt f;
3300e2ec84fSDave May   PetscViewer viewer;
3310e2ec84fSDave May 
3320e2ec84fSDave May   PetscFunctionBegin;
3330e2ec84fSDave May   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
3340e2ec84fSDave May   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
3350e2ec84fSDave May   for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
3360e2ec84fSDave May     DataField field;
3370e2ec84fSDave May 
3380e2ec84fSDave May     /* query field type - accept all those of type PETSC_DOUBLE */
3390e2ec84fSDave May     field = swarm->db->field[f];
3400e2ec84fSDave May     if (field->petsc_type != PETSC_DOUBLE) continue;
3410e2ec84fSDave May 
3420e2ec84fSDave May     ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
3430e2ec84fSDave May     ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr);
3440e2ec84fSDave May     ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
3450e2ec84fSDave May     ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
3460e2ec84fSDave May   }
3470e2ec84fSDave May   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
3480e2ec84fSDave May   PetscFunctionReturn(0);
3490e2ec84fSDave May }
350