xref: /petsc/src/dm/impls/swarm/swarmpic_view.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
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 
130e2ec84fSDave May   PetscFunctionBegin;
145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerCreate(comm,&viewer));
155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetType(viewer,PETSCVIEWERASCII));
165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetMode(viewer,FILE_MODE_WRITE));
175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetName(viewer,filename));
180e2ec84fSDave May 
195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc1(1,&bytes));
200e2ec84fSDave May   bytes[0] = 0;
215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscContainerCreate(comm,&container));
225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscContainerSetPointer(container,(void*)bytes));
235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container));
240e2ec84fSDave May 
250e2ec84fSDave May   /* write xdmf header */
265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n"));
280e2ec84fSDave May   /* write xdmf domain */
295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Domain>\n"));
310e2ec84fSDave May   *v = viewer;
320e2ec84fSDave May   PetscFunctionReturn(0);
330e2ec84fSDave May }
340e2ec84fSDave May 
350e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v)
360e2ec84fSDave May {
370e2ec84fSDave May   PetscViewer    viewer;
380e2ec84fSDave May   DM             dm = NULL;
390e2ec84fSDave May   long int       *bytes;
400e2ec84fSDave May   PetscContainer container = NULL;
410e2ec84fSDave May 
420e2ec84fSDave May   PetscFunctionBegin;
430e2ec84fSDave May   if (!v) PetscFunctionReturn(0);
440e2ec84fSDave May   viewer = *v;
450e2ec84fSDave May 
465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm));
470e2ec84fSDave May   if (dm) {
485f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Grid>\n"));
495f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPopTab(viewer));
500e2ec84fSDave May   }
510e2ec84fSDave May 
520e2ec84fSDave May   /* close xdmf header */
535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Domain>\n"));
545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
555f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Xdmf>\n"));
560e2ec84fSDave May 
575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container));
580e2ec84fSDave May   if (container) {
595f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes));
605f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(bytes));
615f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscContainerDestroy(&container));
620e2ec84fSDave May   }
635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&viewer));
640e2ec84fSDave May   *v = NULL;
650e2ec84fSDave May   PetscFunctionReturn(0);
660e2ec84fSDave May }
670e2ec84fSDave May 
680e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[])
690e2ec84fSDave May {
700e2ec84fSDave May   char           *ext;
710e2ec84fSDave May   PetscBool      flg;
720e2ec84fSDave May 
730e2ec84fSDave May   PetscFunctionBegin;
745f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrrchr(filename,'.',&ext));
755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcmp("xmf",ext,&flg));
760e2ec84fSDave May   if (flg) {
770e2ec84fSDave May     size_t len;
780e2ec84fSDave May     char    viewername_minus_ext[PETSC_MAX_PATH_LEN];
790e2ec84fSDave May 
805f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(filename,&len));
815f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrncpy(viewername_minus_ext,filename,len-2));
825f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext));
830e2ec84fSDave May   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf");
840e2ec84fSDave May   PetscFunctionReturn(0);
850e2ec84fSDave May }
860e2ec84fSDave May 
870e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer)
880e2ec84fSDave May {
890e2ec84fSDave May   PetscBool      isswarm = PETSC_FALSE;
900e2ec84fSDave May   const char     *viewername;
910e2ec84fSDave May   char           datafile[PETSC_MAX_PATH_LEN];
923249a2ebSMara Arts   char           *datafilename;
930e2ec84fSDave May   PetscViewer    fviewer;
940e2ec84fSDave May   PetscInt       k,ng,dim;
950e2ec84fSDave May   Vec            dvec;
960e2ec84fSDave May   long int       *bytes = NULL;
970e2ec84fSDave May   PetscContainer container = NULL;
980e2ec84fSDave May   const char     *dmname;
990e2ec84fSDave May 
1000e2ec84fSDave May   PetscFunctionBegin;
1015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container));
1020e2ec84fSDave May   if (container) {
1035f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes));
1040e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext");
1050e2ec84fSDave May 
1065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm));
107*28b400f6SJacob Faibussowitsch   PetscCheck(isswarm,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm");
1080e2ec84fSDave May 
1095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm));
1100e2ec84fSDave May 
1115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)dm,&dmname));
1130e2ec84fSDave May   if (!dmname) {
1145f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetOptionsPrefix(dm,&dmname));
1150e2ec84fSDave May   }
1160e2ec84fSDave May   if (!dmname) {
1175f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n"));
1180e2ec84fSDave May   } else {
1195f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname));
1200e2ec84fSDave May   }
1210e2ec84fSDave May 
1220e2ec84fSDave May   /* create a sub-viewer for topology, geometry and all data fields */
1230e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
1245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer));
1255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetType(fviewer,PETSCVIEWERBINARY));
1265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE));
1275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE));
1285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE));
1290e2ec84fSDave May 
1305f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileGetName(viewer,&viewername));
1315f80ce2aSJacob Faibussowitsch   CHKERRQ(private_CreateDataFileNameXDMF(viewername,datafile));
1325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetName(fviewer,datafile));
1335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrrchr(datafile,'/',&datafilename));
1340e2ec84fSDave May 
1355f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmGetSize(dm,&ng));
1360e2ec84fSDave May 
1370e2ec84fSDave May   /* write topology header */
1385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng));
1405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]));
1425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename));
1445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
1455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n"));
1465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
1475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Topology>\n"));
1485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
1490e2ec84fSDave May 
1500e2ec84fSDave May   /* write topology data */
1510e2ec84fSDave May   for (k=0; k<ng; k++) {
1520e2ec84fSDave May     PetscInt pvertex[3];
1530e2ec84fSDave May 
1540e2ec84fSDave May     pvertex[0] = 1;
1550e2ec84fSDave May     pvertex[1] = 1;
1560e2ec84fSDave May     pvertex[2] = k;
1575f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT));
1580e2ec84fSDave May   }
1590e2ec84fSDave May   bytes[0] += sizeof(PetscInt) * ng * 3;
1600e2ec84fSDave May 
1610e2ec84fSDave May   /* write geometry header */
1625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1635f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDimension(dm,&dim));
1640e2ec84fSDave May   switch (dim) {
1650e2ec84fSDave May     case 1:
1660e2ec84fSDave May       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D");
1670e2ec84fSDave May     case 2:
1685f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n"));
1690e2ec84fSDave May       break;
1700e2ec84fSDave May     case 3:
1715f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n"));
1720e2ec84fSDave May       break;
1730e2ec84fSDave May   }
1745f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]));
1765f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
1775f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename));
1785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
1795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n"));
1805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
1815f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Geometry>\n"));
1825f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
1830e2ec84fSDave May 
1840e2ec84fSDave May   /* write geometry data */
1855f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec));
1865f80ce2aSJacob Faibussowitsch   CHKERRQ(VecView(dvec,fviewer));
1875f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec));
1880e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * ng * dim;
1890e2ec84fSDave May 
1905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&fviewer));
1910e2ec84fSDave May   PetscFunctionReturn(0);
1920e2ec84fSDave May }
1930e2ec84fSDave May 
1940e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer)
1950e2ec84fSDave May {
1960e2ec84fSDave May   long int       *bytes = NULL;
1970e2ec84fSDave May   PetscContainer container = NULL;
1980e2ec84fSDave May   const char     *viewername;
1990e2ec84fSDave May   char           datafile[PETSC_MAX_PATH_LEN];
2003249a2ebSMara Arts   char           *datafilename;
2010e2ec84fSDave May   PetscViewer    fviewer;
2020e2ec84fSDave May   PetscInt       N,bs;
2030e2ec84fSDave May   const char     *vecname;
2040e2ec84fSDave May   char           fieldname[PETSC_MAX_PATH_LEN];
2050e2ec84fSDave May 
2060e2ec84fSDave May   PetscFunctionBegin;
2075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container));
208*28b400f6SJacob Faibussowitsch   PetscCheck(container,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext");
2095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes));
2105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileGetName(viewer,&viewername));
2115f80ce2aSJacob Faibussowitsch   CHKERRQ(private_CreateDataFileNameXDMF(viewername,datafile));
2120e2ec84fSDave May 
2130e2ec84fSDave May   /* re-open a sub-viewer for all data fields */
2140e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
2155f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer));
2165f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetType(fviewer,PETSCVIEWERBINARY));
2175f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE));
2185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE));
2195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND));
2205f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetName(fviewer,datafile));
2215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrrchr(datafile,'/',&datafilename));
2220e2ec84fSDave May 
2235f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetSize(x,&N));
2245f80ce2aSJacob Faibussowitsch   CHKERRQ(VecGetBlockSize(x,&bs));
2250e2ec84fSDave May   N = N/bs;
2265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)x,&vecname));
2270e2ec84fSDave May   if (!vecname) {
2285f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag));
2290e2ec84fSDave May   } else {
2305f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname));
2310e2ec84fSDave May   }
2320e2ec84fSDave May 
2330e2ec84fSDave May   /* write data header */
2345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
2355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname));
2365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
2370e2ec84fSDave May   if (bs == 1) {
2385f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]));
2390e2ec84fSDave May   } else {
2405f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]));
2410e2ec84fSDave May   }
2425f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
2435f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename));
2445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
2455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n"));
2465f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
2475f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Attribute>\n"));
2485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
2490e2ec84fSDave May 
2500e2ec84fSDave May   /* write data */
2515f80ce2aSJacob Faibussowitsch   CHKERRQ(VecView(x,fviewer));
2520e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * N * bs;
2530e2ec84fSDave May 
2545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&fviewer));
2550e2ec84fSDave May   PetscFunctionReturn(0);
2560e2ec84fSDave May }
2570e2ec84fSDave May 
258c14f9142SDave May PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer)
259c14f9142SDave May {
260c14f9142SDave May   long int       *bytes = NULL;
261c14f9142SDave May   PetscContainer container = NULL;
262c14f9142SDave May   const char     *viewername;
263c14f9142SDave May   char           datafile[PETSC_MAX_PATH_LEN];
2643249a2ebSMara Arts   char           *datafilename;
265c14f9142SDave May   PetscViewer    fviewer;
266c14f9142SDave May   PetscInt       N,bs;
267c14f9142SDave May   const char     *vecname;
268c14f9142SDave May   char           fieldname[PETSC_MAX_PATH_LEN];
269c14f9142SDave May 
270c14f9142SDave May   PetscFunctionBegin;
2715f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container));
272*28b400f6SJacob Faibussowitsch   PetscCheck(container,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext");
2735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes));
2745f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileGetName(viewer,&viewername));
2755f80ce2aSJacob Faibussowitsch   CHKERRQ(private_CreateDataFileNameXDMF(viewername,datafile));
276c14f9142SDave May 
277c14f9142SDave May   /* re-open a sub-viewer for all data fields */
278c14f9142SDave May   /* name is viewer.name + "_swarm_fields.pbin" */
2795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer));
2805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerSetType(fviewer,PETSCVIEWERBINARY));
2815f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE));
2825f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE));
2835f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND));
2845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerFileSetName(fviewer,datafile));
2855f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrrchr(datafile,'/',&datafilename));
286c14f9142SDave May 
2875f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetSize(is,&N));
2885f80ce2aSJacob Faibussowitsch   CHKERRQ(ISGetBlockSize(is,&bs));
289c14f9142SDave May   N = N/bs;
2905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectGetName((PetscObject)is,&vecname));
291c14f9142SDave May   if (!vecname) {
2925f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag));
293c14f9142SDave May   } else {
2945f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname));
295c14f9142SDave May   }
296c14f9142SDave May 
297c14f9142SDave May   /* write data header */
2985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
2995f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname));
3005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
301c14f9142SDave May   if (bs == 1) {
3025f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]));
303c14f9142SDave May   } else {
3045f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]));
305c14f9142SDave May   }
3065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPushTab(viewer));
3075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename));
3085f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
3095f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n"));
3105f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
3115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Attribute>\n"));
3125f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerASCIIPopTab(viewer));
313c14f9142SDave May 
314c14f9142SDave May   /* write data */
3155f80ce2aSJacob Faibussowitsch   CHKERRQ(ISView(is,fviewer));
316c14f9142SDave May   bytes[0] += sizeof(PetscInt) * N * bs;
317c14f9142SDave May 
3185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerDestroy(&fviewer));
319c14f9142SDave May   PetscFunctionReturn(0);
320c14f9142SDave May }
321c14f9142SDave May 
322acf7c82dSDave May /*@C
323acf7c82dSDave May    DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file
324acf7c82dSDave May 
325d083f849SBarry Smith    Collective on dm
326acf7c82dSDave May 
327acf7c82dSDave May    Input parameters:
328acf7c82dSDave May +  dm - the DMSwarm
329acf7c82dSDave May .  filename - the file name of the XDMF file (must have the extension .xmf)
330acf7c82dSDave May .  nfields - the number of fields to write into the XDMF file
331acf7c82dSDave May -  field_name_list - array of length nfields containing the textual name of fields to write
332acf7c82dSDave May 
333acf7c82dSDave May    Level: beginner
334acf7c82dSDave May 
335acf7c82dSDave May    Notes:
336ea3d7275SDave May    Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file
337acf7c82dSDave May 
338acf7c82dSDave May .seealso: DMSwarmViewXDMF()
339acf7c82dSDave May @*/
3400e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[])
3410e2ec84fSDave May {
3420e2ec84fSDave May   Vec            dvec;
343c14f9142SDave May   PetscInt       f,N;
3440e2ec84fSDave May   PetscViewer    viewer;
3450e2ec84fSDave May 
3460e2ec84fSDave May   PetscFunctionBegin;
3475f80ce2aSJacob Faibussowitsch   CHKERRQ(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer));
3485f80ce2aSJacob Faibussowitsch   CHKERRQ(private_DMSwarmView_XDMF(dm,viewer));
3495f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSwarmGetLocalSize(dm,&N));
3500e2ec84fSDave May   for (f=0; f<nfields; f++) {
351c14f9142SDave May     void          *data;
352c14f9142SDave May     PetscDataType type;
353c14f9142SDave May 
3545f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data));
3555f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data));
356c14f9142SDave May     if (type == PETSC_DOUBLE) {
3575f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec));
3585f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectSetName((PetscObject)dvec,field_name_list[f]));
3595f80ce2aSJacob Faibussowitsch       CHKERRQ(private_VecView_Swarm_XDMF(dvec,viewer));
3605f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec));
361c14f9142SDave May     } else if (type == PETSC_INT) {
362c14f9142SDave May       IS is;
363c14f9142SDave May       const PetscInt *idx;
364c14f9142SDave May 
3655f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data));
366c14f9142SDave May       idx = (const PetscInt*)data;
367c14f9142SDave May 
3685f80ce2aSJacob Faibussowitsch       CHKERRQ(ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is));
3695f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectSetName((PetscObject)is,field_name_list[f]));
3705f80ce2aSJacob Faibussowitsch       CHKERRQ(private_ISView_Swarm_XDMF(is,viewer));
3715f80ce2aSJacob Faibussowitsch       CHKERRQ(ISDestroy(&is));
3725f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data));
373c14f9142SDave May     } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE");
374c14f9142SDave May 
3750e2ec84fSDave May   }
3765f80ce2aSJacob Faibussowitsch   CHKERRQ(private_PetscViewerDestroy_XDMF(&viewer));
3770e2ec84fSDave May   PetscFunctionReturn(0);
3780e2ec84fSDave May }
3790e2ec84fSDave May 
380acf7c82dSDave May /*@C
381acf7c82dSDave May    DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file
382acf7c82dSDave May 
383d083f849SBarry Smith    Collective on dm
384acf7c82dSDave May 
385acf7c82dSDave May    Input parameters:
386acf7c82dSDave May +  dm - the DMSwarm
387acf7c82dSDave May -  filename - the file name of the XDMF file (must have the extension .xmf)
388acf7c82dSDave May 
389acf7c82dSDave May    Level: beginner
390acf7c82dSDave May 
391acf7c82dSDave May    Notes:
392ea3d7275SDave May      Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file
393acf7c82dSDave May 
3945627991aSBarry Smith    Developer Notes:
3955627991aSBarry Smith      This should be removed and replaced with the standard use of PetscViewer
3965627991aSBarry Smith 
397acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF()
398acf7c82dSDave May @*/
3990e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[])
4000e2ec84fSDave May {
4010e2ec84fSDave May   DM_Swarm       *swarm = (DM_Swarm*)dm->data;
4020e2ec84fSDave May   Vec            dvec;
4030e2ec84fSDave May   PetscInt       f;
4040e2ec84fSDave May   PetscViewer    viewer;
4050e2ec84fSDave May 
4060e2ec84fSDave May   PetscFunctionBegin;
4075f80ce2aSJacob Faibussowitsch   CHKERRQ(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer));
4085f80ce2aSJacob Faibussowitsch   CHKERRQ(private_DMSwarmView_XDMF(dm,viewer));
4090e2ec84fSDave May   for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
41077048351SPatrick Sanan     DMSwarmDataField field;
4110e2ec84fSDave May 
4120e2ec84fSDave May     /* query field type - accept all those of type PETSC_DOUBLE */
4130e2ec84fSDave May     field = swarm->db->field[f];
414c14f9142SDave May     if (field->petsc_type == PETSC_DOUBLE) {
4155f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec));
4165f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectSetName((PetscObject)dvec,field->name));
4175f80ce2aSJacob Faibussowitsch       CHKERRQ(private_VecView_Swarm_XDMF(dvec,viewer));
4185f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec));
419c14f9142SDave May     } else if (field->petsc_type == PETSC_INT) {
420c14f9142SDave May       IS             is;
421c14f9142SDave May       PetscInt       N;
422c14f9142SDave May       const PetscInt *idx;
423c14f9142SDave May       void           *data;
424c14f9142SDave May 
4255f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmGetLocalSize(dm,&N));
4265f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmGetField(dm,field->name,NULL,NULL,&data));
427c14f9142SDave May       idx = (const PetscInt*)data;
428c14f9142SDave May 
4295f80ce2aSJacob Faibussowitsch       CHKERRQ(ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is));
4305f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectSetName((PetscObject)is,field->name));
4315f80ce2aSJacob Faibussowitsch       CHKERRQ(private_ISView_Swarm_XDMF(is,viewer));
4325f80ce2aSJacob Faibussowitsch       CHKERRQ(ISDestroy(&is));
4335f80ce2aSJacob Faibussowitsch       CHKERRQ(DMSwarmRestoreField(dm,field->name,NULL,NULL,&data));
434c14f9142SDave May     }
4350e2ec84fSDave May   }
4365f80ce2aSJacob Faibussowitsch   CHKERRQ(private_PetscViewerDestroy_XDMF(&viewer));
4370e2ec84fSDave May   PetscFunctionReturn(0);
4380e2ec84fSDave May }
439