xref: /petsc/src/dm/impls/swarm/swarmpic_view.c (revision 5627991adfa0dae03dda7a34b1ec5f8d16d5e5f7)
10e2ec84fSDave May #include <petscdm.h>
20e2ec84fSDave May #include <petscdmda.h>
30e2ec84fSDave May #include <petscdmswarm.h>
40e2ec84fSDave May #include <petsc/private/dmswarmimpl.h>
5279f676cSBarry Smith #include "../src/dm/impls/swarm/data_bucket.h"
60e2ec84fSDave May 
70e2ec84fSDave May PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v)
80e2ec84fSDave May {
90e2ec84fSDave May   long int       *bytes;
100e2ec84fSDave May   PetscContainer container;
110e2ec84fSDave May   PetscViewer    viewer;
120e2ec84fSDave May   PetscErrorCode ierr;
130e2ec84fSDave May 
140e2ec84fSDave May   PetscFunctionBegin;
150e2ec84fSDave May   ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr);
160e2ec84fSDave May   ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr);
170e2ec84fSDave May   ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
180e2ec84fSDave May   ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr);
190e2ec84fSDave May 
200e2ec84fSDave May   ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr);
210e2ec84fSDave May   bytes[0] = 0;
220e2ec84fSDave May   ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr);
230e2ec84fSDave May   ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr);
240e2ec84fSDave May   ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr);
250e2ec84fSDave May 
260e2ec84fSDave May   /* write xdmf header */
2716d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");CHKERRQ(ierr);
28a8d69d7bSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n");CHKERRQ(ierr);
290e2ec84fSDave May   /* write xdmf domain */
3016d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
3116d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<Domain>\n");CHKERRQ(ierr);
320e2ec84fSDave May   *v = viewer;
330e2ec84fSDave May   PetscFunctionReturn(0);
340e2ec84fSDave May }
350e2ec84fSDave May 
360e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v)
370e2ec84fSDave May {
380e2ec84fSDave May   PetscViewer    viewer;
390e2ec84fSDave May   DM             dm = NULL;
400e2ec84fSDave May   long int       *bytes;
410e2ec84fSDave May   PetscContainer container = NULL;
420e2ec84fSDave May   PetscErrorCode ierr;
430e2ec84fSDave May 
440e2ec84fSDave May   PetscFunctionBegin;
450e2ec84fSDave May   if (!v) PetscFunctionReturn(0);
460e2ec84fSDave May   viewer = *v;
470e2ec84fSDave May 
480e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr);
490e2ec84fSDave May   if (dm) {
5016d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"</Grid>\n");CHKERRQ(ierr);
5116d0e248SBarry Smith     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
520e2ec84fSDave May   }
530e2ec84fSDave May 
540e2ec84fSDave May   /* close xdmf header */
5516d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</Domain>\n");CHKERRQ(ierr);
5616d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
5716d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</Xdmf>\n");CHKERRQ(ierr);
580e2ec84fSDave May 
590e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
600e2ec84fSDave May   if (container) {
610e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
620e2ec84fSDave May     ierr = PetscFree(bytes);CHKERRQ(ierr);
630e2ec84fSDave May     ierr = PetscContainerDestroy(&container);CHKERRQ(ierr);
640e2ec84fSDave May   }
650e2ec84fSDave May   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
660e2ec84fSDave May   *v = NULL;
670e2ec84fSDave May   PetscFunctionReturn(0);
680e2ec84fSDave May }
690e2ec84fSDave May 
700e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[])
710e2ec84fSDave May {
720e2ec84fSDave May   char           *ext;
730e2ec84fSDave May   PetscBool      flg;
740e2ec84fSDave May   PetscErrorCode ierr;
750e2ec84fSDave May 
760e2ec84fSDave May   PetscFunctionBegin;
770e2ec84fSDave May   ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr);
780e2ec84fSDave May   ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr);
790e2ec84fSDave May   if (flg) {
800e2ec84fSDave May     size_t len;
810e2ec84fSDave May     char    viewername_minus_ext[PETSC_MAX_PATH_LEN];
820e2ec84fSDave May 
830e2ec84fSDave May     ierr = PetscStrlen(filename,&len);CHKERRQ(ierr);
844540a1d2SSatish Balay     ierr = PetscStrncpy(viewername_minus_ext,filename,len-2);CHKERRQ(ierr);
850e2ec84fSDave May     ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr);
860e2ec84fSDave May   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf");
870e2ec84fSDave May   PetscFunctionReturn(0);
880e2ec84fSDave May }
890e2ec84fSDave May 
900e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer)
910e2ec84fSDave May {
920e2ec84fSDave May   PetscBool      isswarm = PETSC_FALSE;
930e2ec84fSDave May   const char     *viewername;
940e2ec84fSDave May   char           datafile[PETSC_MAX_PATH_LEN];
953249a2ebSMara Arts   char           *datafilename;
960e2ec84fSDave May   PetscViewer    fviewer;
970e2ec84fSDave May   PetscInt       k,ng,dim;
980e2ec84fSDave May   Vec            dvec;
990e2ec84fSDave May   long int       *bytes = NULL;
1000e2ec84fSDave May   PetscContainer container = NULL;
1010e2ec84fSDave May   const char     *dmname;
1020e2ec84fSDave May   PetscErrorCode ierr;
1030e2ec84fSDave May 
1040e2ec84fSDave May   PetscFunctionBegin;
1050e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
1060e2ec84fSDave May   if (container) {
1070e2ec84fSDave May     ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
1080e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
1090e2ec84fSDave May 
1100e2ec84fSDave May   ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr);
1110e2ec84fSDave May   if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm");
1120e2ec84fSDave May 
1130e2ec84fSDave May   ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr);
1140e2ec84fSDave May 
11516d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1160e2ec84fSDave May   ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr);
1170e2ec84fSDave May   if (!dmname) {
1180e2ec84fSDave May     ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr);
1190e2ec84fSDave May   }
1200e2ec84fSDave May   if (!dmname) {
12116d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");CHKERRQ(ierr);
1220e2ec84fSDave May   } else {
12316d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);CHKERRQ(ierr);
1240e2ec84fSDave May   }
1250e2ec84fSDave May 
1260e2ec84fSDave May   /* create a sub-viewer for topology, geometry and all data fields */
1270e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
1280e2ec84fSDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
1290e2ec84fSDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
1300e2ec84fSDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
1310e2ec84fSDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
1320e2ec84fSDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr);
1330e2ec84fSDave May 
1340e2ec84fSDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
1350e2ec84fSDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
1360e2ec84fSDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
1373249a2ebSMara Arts   ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr);
1380e2ec84fSDave May 
1390e2ec84fSDave May   ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr);
1400e2ec84fSDave May 
1410e2ec84fSDave May   /* write topology header */
14216d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
14316d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);CHKERRQ(ierr);
14416d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
14516d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);CHKERRQ(ierr);
14616d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1473249a2ebSMara Arts   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
14816d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
14916d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
15016d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
15116d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</Topology>\n");CHKERRQ(ierr);
15216d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1530e2ec84fSDave May 
1540e2ec84fSDave May   /* write topology data */
1550e2ec84fSDave May   for (k=0; k<ng; k++) {
1560e2ec84fSDave May     PetscInt pvertex[3];
1570e2ec84fSDave May 
1580e2ec84fSDave May     pvertex[0] = 1;
1590e2ec84fSDave May     pvertex[1] = 1;
1600e2ec84fSDave May     pvertex[2] = k;
161f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT);CHKERRQ(ierr);
1620e2ec84fSDave May   }
1630e2ec84fSDave May   bytes[0] += sizeof(PetscInt) * ng * 3;
1640e2ec84fSDave May 
1650e2ec84fSDave May   /* write geometry header */
16616d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1670e2ec84fSDave May   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
1680e2ec84fSDave May   switch (dim) {
1690e2ec84fSDave May     case 1:
1700e2ec84fSDave May       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D");
1710e2ec84fSDave May     case 2:
17216d0e248SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");CHKERRQ(ierr);
1730e2ec84fSDave May       break;
1740e2ec84fSDave May     case 3:
17516d0e248SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");CHKERRQ(ierr);
1760e2ec84fSDave May       break;
1770e2ec84fSDave May   }
17816d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
17916d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]);CHKERRQ(ierr);
18016d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1813249a2ebSMara Arts   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
18216d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
18316d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
18416d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
18516d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</Geometry>\n");CHKERRQ(ierr);
18616d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1870e2ec84fSDave May 
1880e2ec84fSDave May   /* write geometry data */
1890e2ec84fSDave May   ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
1900e2ec84fSDave May   ierr = VecView(dvec,fviewer);CHKERRQ(ierr);
1910e2ec84fSDave May   ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr);
1920e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * ng * dim;
1930e2ec84fSDave May 
1940e2ec84fSDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
1950e2ec84fSDave May   PetscFunctionReturn(0);
1960e2ec84fSDave May }
1970e2ec84fSDave May 
1980e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer)
1990e2ec84fSDave May {
2000e2ec84fSDave May   long int       *bytes = NULL;
2010e2ec84fSDave May   PetscContainer container = NULL;
2020e2ec84fSDave May   const char     *viewername;
2030e2ec84fSDave May   char           datafile[PETSC_MAX_PATH_LEN];
2043249a2ebSMara Arts   char           *datafilename;
2050e2ec84fSDave May   PetscViewer    fviewer;
2060e2ec84fSDave May   PetscInt       N,bs;
2070e2ec84fSDave May   const char     *vecname;
2080e2ec84fSDave May   char           fieldname[PETSC_MAX_PATH_LEN];
2090e2ec84fSDave May   PetscErrorCode ierr;
2100e2ec84fSDave May 
2110e2ec84fSDave May   PetscFunctionBegin;
2120e2ec84fSDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
213*5627991aSBarry Smith   if (!container) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext");
2140e2ec84fSDave May   ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
2150e2ec84fSDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
2160e2ec84fSDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
2170e2ec84fSDave May 
2180e2ec84fSDave May   /* re-open a sub-viewer for all data fields */
2190e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
2200e2ec84fSDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
2210e2ec84fSDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
2220e2ec84fSDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
2230e2ec84fSDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
2240e2ec84fSDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr);
2250e2ec84fSDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
2263249a2ebSMara Arts   ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr);
2270e2ec84fSDave May 
2280e2ec84fSDave May   ierr = VecGetSize(x,&N);CHKERRQ(ierr);
2290e2ec84fSDave May   ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr);
2300e2ec84fSDave May   N = N/bs;
2310e2ec84fSDave May   ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr);
2320e2ec84fSDave May   if (!vecname) {
2330e2ec84fSDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr);
2340e2ec84fSDave May   } else {
2350e2ec84fSDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr);
2360e2ec84fSDave May   }
2370e2ec84fSDave May 
2380e2ec84fSDave May   /* write data header */
23916d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
24016d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr);
24116d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2420e2ec84fSDave May   if (bs == 1) {
24316d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr);
2440e2ec84fSDave May   } else {
24516d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr);
2460e2ec84fSDave May   }
24716d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
2483249a2ebSMara Arts   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
24916d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
25016d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
25116d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
25216d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr);
25316d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
2540e2ec84fSDave May 
2550e2ec84fSDave May   /* write data */
2560e2ec84fSDave May   ierr = VecView(x,fviewer);CHKERRQ(ierr);
2570e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * N * bs;
2580e2ec84fSDave May 
2590e2ec84fSDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
2600e2ec84fSDave May   PetscFunctionReturn(0);
2610e2ec84fSDave May }
2620e2ec84fSDave May 
263c14f9142SDave May PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer)
264c14f9142SDave May {
265c14f9142SDave May   long int       *bytes = NULL;
266c14f9142SDave May   PetscContainer container = NULL;
267c14f9142SDave May   const char     *viewername;
268c14f9142SDave May   char           datafile[PETSC_MAX_PATH_LEN];
2693249a2ebSMara Arts   char           *datafilename;
270c14f9142SDave May   PetscViewer    fviewer;
271c14f9142SDave May   PetscInt       N,bs;
272c14f9142SDave May   const char     *vecname;
273c14f9142SDave May   char           fieldname[PETSC_MAX_PATH_LEN];
274c14f9142SDave May   PetscErrorCode ierr;
275c14f9142SDave May 
276c14f9142SDave May   PetscFunctionBegin;
277c14f9142SDave May   ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr);
278*5627991aSBarry Smith   if (!container) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext");
279c14f9142SDave May   ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr);
280c14f9142SDave May   ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr);
281c14f9142SDave May   ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr);
282c14f9142SDave May 
283c14f9142SDave May   /* re-open a sub-viewer for all data fields */
284c14f9142SDave May   /* name is viewer.name + "_swarm_fields.pbin" */
285c14f9142SDave May   ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr);
286c14f9142SDave May   ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr);
287c14f9142SDave May   ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr);
288c14f9142SDave May   ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr);
289c14f9142SDave May   ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr);
290c14f9142SDave May   ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr);
2913249a2ebSMara Arts   ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr);
292c14f9142SDave May 
293c14f9142SDave May   ierr = ISGetSize(is,&N);CHKERRQ(ierr);
294c14f9142SDave May   ierr = ISGetBlockSize(is,&bs);CHKERRQ(ierr);
295c14f9142SDave May   N = N/bs;
296c14f9142SDave May   ierr = PetscObjectGetName((PetscObject)is,&vecname);CHKERRQ(ierr);
297c14f9142SDave May   if (!vecname) {
298c14f9142SDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag);CHKERRQ(ierr);
299c14f9142SDave May   } else {
300c14f9142SDave May     ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr);
301c14f9142SDave May   }
302c14f9142SDave May 
303c14f9142SDave May   /* write data header */
30416d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
30516d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr);
30616d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
307c14f9142SDave May   if (bs == 1) {
30816d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr);
309c14f9142SDave May   } else {
31016d0e248SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr);
311c14f9142SDave May   }
31216d0e248SBarry Smith   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
3133249a2ebSMara Arts   ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr);
31416d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
31516d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr);
31616d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
31716d0e248SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr);
31816d0e248SBarry Smith   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
319c14f9142SDave May 
320c14f9142SDave May   /* write data */
321c14f9142SDave May   ierr = ISView(is,fviewer);CHKERRQ(ierr);
322c14f9142SDave May   bytes[0] += sizeof(PetscInt) * N * bs;
323c14f9142SDave May 
324c14f9142SDave May   ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr);
325c14f9142SDave May   PetscFunctionReturn(0);
326c14f9142SDave May }
327c14f9142SDave May 
328acf7c82dSDave May /*@C
329acf7c82dSDave May    DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file
330acf7c82dSDave May 
331d083f849SBarry Smith    Collective on dm
332acf7c82dSDave May 
333acf7c82dSDave May    Input parameters:
334acf7c82dSDave May +  dm - the DMSwarm
335acf7c82dSDave May .  filename - the file name of the XDMF file (must have the extension .xmf)
336acf7c82dSDave May .  nfields - the number of fields to write into the XDMF file
337acf7c82dSDave May -  field_name_list - array of length nfields containing the textual name of fields to write
338acf7c82dSDave May 
339acf7c82dSDave May    Level: beginner
340acf7c82dSDave May 
341acf7c82dSDave May    Notes:
342ea3d7275SDave May    Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file
343acf7c82dSDave May 
344acf7c82dSDave May .seealso: DMSwarmViewXDMF()
345acf7c82dSDave May @*/
3460e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[])
3470e2ec84fSDave May {
3480e2ec84fSDave May   PetscErrorCode ierr;
3490e2ec84fSDave May   Vec            dvec;
350c14f9142SDave May   PetscInt       f,N;
3510e2ec84fSDave May   PetscViewer    viewer;
3520e2ec84fSDave May 
3530e2ec84fSDave May   PetscFunctionBegin;
3540e2ec84fSDave May   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
3550e2ec84fSDave May   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
356c14f9142SDave May   ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr);
3570e2ec84fSDave May   for (f=0; f<nfields; f++) {
358c14f9142SDave May     void          *data;
359c14f9142SDave May     PetscDataType type;
360c14f9142SDave May 
361c14f9142SDave May     ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
362c14f9142SDave May     ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
363c14f9142SDave May     if (type == PETSC_DOUBLE) {
3640e2ec84fSDave May       ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
3650e2ec84fSDave May       ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr);
3660e2ec84fSDave May       ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
3670e2ec84fSDave May       ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr);
368c14f9142SDave May     } else if (type == PETSC_INT) {
369c14f9142SDave May       IS is;
370c14f9142SDave May       const PetscInt *idx;
371c14f9142SDave May 
372c14f9142SDave May       ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
373c14f9142SDave May       idx = (const PetscInt*)data;
374c14f9142SDave May 
375c14f9142SDave May       ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
376c14f9142SDave May       ierr = PetscObjectSetName((PetscObject)is,field_name_list[f]);CHKERRQ(ierr);
377c14f9142SDave May       ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr);
378c14f9142SDave May       ierr = ISDestroy(&is);CHKERRQ(ierr);
379c14f9142SDave May       ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr);
380c14f9142SDave May     } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE");
381c14f9142SDave May 
3820e2ec84fSDave May   }
3830e2ec84fSDave May   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
3840e2ec84fSDave May   PetscFunctionReturn(0);
3850e2ec84fSDave May }
3860e2ec84fSDave May 
387acf7c82dSDave May /*@C
388acf7c82dSDave May    DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file
389acf7c82dSDave May 
390d083f849SBarry Smith    Collective on dm
391acf7c82dSDave May 
392acf7c82dSDave May    Input parameters:
393acf7c82dSDave May +  dm - the DMSwarm
394acf7c82dSDave May -  filename - the file name of the XDMF file (must have the extension .xmf)
395acf7c82dSDave May 
396acf7c82dSDave May    Level: beginner
397acf7c82dSDave May 
398acf7c82dSDave May    Notes:
399ea3d7275SDave May      Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file
400acf7c82dSDave May 
401*5627991aSBarry Smith    Developer Notes:
402*5627991aSBarry Smith      This should be removed and replaced with the standard use of PetscViewer
403*5627991aSBarry Smith 
404acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF()
405acf7c82dSDave May @*/
4060e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[])
4070e2ec84fSDave May {
4080e2ec84fSDave May   DM_Swarm       *swarm = (DM_Swarm*)dm->data;
4090e2ec84fSDave May   PetscErrorCode ierr;
4100e2ec84fSDave May   Vec            dvec;
4110e2ec84fSDave May   PetscInt       f;
4120e2ec84fSDave May   PetscViewer    viewer;
4130e2ec84fSDave May 
4140e2ec84fSDave May   PetscFunctionBegin;
4150e2ec84fSDave May   ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr);
4160e2ec84fSDave May   ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr);
4170e2ec84fSDave May   for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
41877048351SPatrick Sanan     DMSwarmDataField field;
4190e2ec84fSDave May 
4200e2ec84fSDave May     /* query field type - accept all those of type PETSC_DOUBLE */
4210e2ec84fSDave May     field = swarm->db->field[f];
422c14f9142SDave May     if (field->petsc_type == PETSC_DOUBLE) {
4230e2ec84fSDave May       ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
4240e2ec84fSDave May       ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr);
4250e2ec84fSDave May       ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr);
4260e2ec84fSDave May       ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr);
427c14f9142SDave May     } else if (field->petsc_type == PETSC_INT) {
428c14f9142SDave May       IS             is;
429c14f9142SDave May       PetscInt       N;
430c14f9142SDave May       const PetscInt *idx;
431c14f9142SDave May       void           *data;
432c14f9142SDave May 
433c14f9142SDave May       ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr);
434c14f9142SDave May       ierr = DMSwarmGetField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr);
435c14f9142SDave May       idx = (const PetscInt*)data;
436c14f9142SDave May 
437c14f9142SDave May       ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr);
438c14f9142SDave May       ierr = PetscObjectSetName((PetscObject)is,field->name);CHKERRQ(ierr);
439c14f9142SDave May       ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr);
440c14f9142SDave May       ierr = ISDestroy(&is);CHKERRQ(ierr);
441c14f9142SDave May       ierr = DMSwarmRestoreField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr);
442c14f9142SDave May     }
4430e2ec84fSDave May   }
4440e2ec84fSDave May   ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr);
4450e2ec84fSDave May   PetscFunctionReturn(0);
4460e2ec84fSDave May }
447