xref: /petsc/src/dm/impls/swarm/swarmpic_view.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 
79371c9d4SSatish Balay PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm, const char filename[], PetscViewer *v) {
80e2ec84fSDave May   long int      *bytes;
90e2ec84fSDave May   PetscContainer container;
100e2ec84fSDave May   PetscViewer    viewer;
110e2ec84fSDave May 
120e2ec84fSDave May   PetscFunctionBegin;
139566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, &viewer));
149566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(viewer, PETSCVIEWERASCII));
159566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(viewer, FILE_MODE_WRITE));
169566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(viewer, filename));
170e2ec84fSDave May 
189566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(1, &bytes));
190e2ec84fSDave May   bytes[0] = 0;
209566063dSJacob Faibussowitsch   PetscCall(PetscContainerCreate(comm, &container));
219566063dSJacob Faibussowitsch   PetscCall(PetscContainerSetPointer(container, (void *)bytes));
229566063dSJacob Faibussowitsch   PetscCall(PetscObjectCompose((PetscObject)viewer, "XDMFViewerContext", (PetscObject)container));
230e2ec84fSDave May 
240e2ec84fSDave May   /* write xdmf header */
259566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
269566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n"));
270e2ec84fSDave May   /* write xdmf domain */
289566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
299566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<Domain>\n"));
300e2ec84fSDave May   *v = viewer;
310e2ec84fSDave May   PetscFunctionReturn(0);
320e2ec84fSDave May }
330e2ec84fSDave May 
349371c9d4SSatish Balay PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) {
350e2ec84fSDave May   PetscViewer    viewer;
360e2ec84fSDave May   DM             dm = NULL;
370e2ec84fSDave May   long int      *bytes;
380e2ec84fSDave May   PetscContainer container = NULL;
390e2ec84fSDave May 
400e2ec84fSDave May   PetscFunctionBegin;
410e2ec84fSDave May   if (!v) PetscFunctionReturn(0);
420e2ec84fSDave May   viewer = *v;
430e2ec84fSDave May 
449566063dSJacob Faibussowitsch   PetscCall(PetscObjectQuery((PetscObject)viewer, "DMSwarm", (PetscObject *)&dm));
450e2ec84fSDave May   if (dm) {
469566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "</Grid>\n"));
479566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
480e2ec84fSDave May   }
490e2ec84fSDave May 
500e2ec84fSDave May   /* close xdmf header */
519566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</Domain>\n"));
529566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
539566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</Xdmf>\n"));
540e2ec84fSDave May 
559566063dSJacob Faibussowitsch   PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
560e2ec84fSDave May   if (container) {
579566063dSJacob Faibussowitsch     PetscCall(PetscContainerGetPointer(container, (void **)&bytes));
589566063dSJacob Faibussowitsch     PetscCall(PetscFree(bytes));
599566063dSJacob Faibussowitsch     PetscCall(PetscContainerDestroy(&container));
600e2ec84fSDave May   }
619566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
620e2ec84fSDave May   *v = NULL;
630e2ec84fSDave May   PetscFunctionReturn(0);
640e2ec84fSDave May }
650e2ec84fSDave May 
669371c9d4SSatish Balay PetscErrorCode private_CreateDataFileNameXDMF(const char filename[], char dfilename[]) {
670e2ec84fSDave May   char     *ext;
680e2ec84fSDave May   PetscBool flg;
690e2ec84fSDave May 
700e2ec84fSDave May   PetscFunctionBegin;
719566063dSJacob Faibussowitsch   PetscCall(PetscStrrchr(filename, '.', &ext));
729566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp("xmf", ext, &flg));
730e2ec84fSDave May   if (flg) {
740e2ec84fSDave May     size_t len;
750e2ec84fSDave May     char   viewername_minus_ext[PETSC_MAX_PATH_LEN];
760e2ec84fSDave May 
779566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(filename, &len));
789566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(viewername_minus_ext, filename, len - 2));
799566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(dfilename, PETSC_MAX_PATH_LEN - 1, "%s_swarm_fields.pbin", viewername_minus_ext));
800e2ec84fSDave May   } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "File extension must by .xmf");
810e2ec84fSDave May   PetscFunctionReturn(0);
820e2ec84fSDave May }
830e2ec84fSDave May 
849371c9d4SSatish Balay PetscErrorCode private_DMSwarmView_XDMF(DM dm, PetscViewer viewer) {
850e2ec84fSDave May   PetscBool      isswarm = PETSC_FALSE;
860e2ec84fSDave May   const char    *viewername;
870e2ec84fSDave May   char           datafile[PETSC_MAX_PATH_LEN];
883249a2ebSMara Arts   char          *datafilename;
890e2ec84fSDave May   PetscViewer    fviewer;
900e2ec84fSDave May   PetscInt       k, ng, dim;
910e2ec84fSDave May   Vec            dvec;
920e2ec84fSDave May   long int      *bytes     = NULL;
930e2ec84fSDave May   PetscContainer container = NULL;
940e2ec84fSDave May   const char    *dmname;
950e2ec84fSDave May 
960e2ec84fSDave May   PetscFunctionBegin;
979566063dSJacob Faibussowitsch   PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
980e2ec84fSDave May   if (container) {
999566063dSJacob Faibussowitsch     PetscCall(PetscContainerGetPointer(container, (void **)&bytes));
1000e2ec84fSDave May   } else SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Valid to find attached data XDMFViewerContext");
1010e2ec84fSDave May 
1029566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)dm, DMSWARM, &isswarm));
10328b400f6SJacob Faibussowitsch   PetscCheck(isswarm, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only valid for DMSwarm");
1040e2ec84fSDave May 
1059566063dSJacob Faibussowitsch   PetscCall(PetscObjectCompose((PetscObject)viewer, "DMSwarm", (PetscObject)dm));
1060e2ec84fSDave May 
1079566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
1089566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm, &dmname));
109*48a46eb9SPierre Jolivet   if (!dmname) PetscCall(DMGetOptionsPrefix(dm, &dmname));
1100e2ec84fSDave May   if (!dmname) {
1119566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n"));
1120e2ec84fSDave May   } else {
1139566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n", dmname));
1140e2ec84fSDave May   }
1150e2ec84fSDave May 
1160e2ec84fSDave May   /* create a sub-viewer for topology, geometry and all data fields */
1170e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
1189566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer));
1199566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY));
1209566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE));
1219566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE));
1229566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_WRITE));
1230e2ec84fSDave May 
1249566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileGetName(viewer, &viewername));
1259566063dSJacob Faibussowitsch   PetscCall(private_CreateDataFileNameXDMF(viewername, datafile));
1269566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(fviewer, datafile));
1279566063dSJacob Faibussowitsch   PetscCall(PetscStrrchr(datafile, '/', &datafilename));
1280e2ec84fSDave May 
1299566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetSize(dm, &ng));
1300e2ec84fSDave May 
1310e2ec84fSDave May   /* write topology header */
1329566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
13363a3b9bcSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<Topology Dimensions=\"%" PetscInt_FMT "\" TopologyType=\"Mixed\">\n", ng));
1349566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
13563a3b9bcSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", ng * 3, bytes[0]));
1369566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
1379566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
1389566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
1399566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
1409566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
1419566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</Topology>\n"));
1429566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
1430e2ec84fSDave May 
1440e2ec84fSDave May   /* write topology data */
1450e2ec84fSDave May   for (k = 0; k < ng; k++) {
1460e2ec84fSDave May     PetscInt pvertex[3];
1470e2ec84fSDave May 
1480e2ec84fSDave May     pvertex[0] = 1;
1490e2ec84fSDave May     pvertex[1] = 1;
1500e2ec84fSDave May     pvertex[2] = k;
1519566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryWrite(fviewer, pvertex, 3, PETSC_INT));
1520e2ec84fSDave May   }
1530e2ec84fSDave May   bytes[0] += sizeof(PetscInt) * ng * 3;
1540e2ec84fSDave May 
1550e2ec84fSDave May   /* write geometry header */
1569566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
1579566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(dm, &dim));
1580e2ec84fSDave May   switch (dim) {
1599371c9d4SSatish Balay   case 1: SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for 1D");
1609371c9d4SSatish Balay   case 2: PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XY\">\n")); break;
1619371c9d4SSatish Balay   case 3: PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XYZ\">\n")); break;
1620e2ec84fSDave May   }
1639566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
16463a3b9bcSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT " %" PetscInt_FMT "\" Seek=\"%ld\">\n", ng, dim, bytes[0]));
1659566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
1669566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
1679566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
1689566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
1699566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
1709566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</Geometry>\n"));
1719566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
1720e2ec84fSDave May 
1730e2ec84fSDave May   /* write geometry data */
1749566063dSJacob Faibussowitsch   PetscCall(DMSwarmCreateGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec));
1759566063dSJacob Faibussowitsch   PetscCall(VecView(dvec, fviewer));
1769566063dSJacob Faibussowitsch   PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec));
1770e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * ng * dim;
1780e2ec84fSDave May 
1799566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&fviewer));
1800e2ec84fSDave May   PetscFunctionReturn(0);
1810e2ec84fSDave May }
1820e2ec84fSDave May 
1839371c9d4SSatish Balay PetscErrorCode private_VecView_Swarm_XDMF(Vec x, PetscViewer viewer) {
1840e2ec84fSDave May   long int      *bytes     = NULL;
1850e2ec84fSDave May   PetscContainer container = NULL;
1860e2ec84fSDave May   const char    *viewername;
1870e2ec84fSDave May   char           datafile[PETSC_MAX_PATH_LEN];
1883249a2ebSMara Arts   char          *datafilename;
1890e2ec84fSDave May   PetscViewer    fviewer;
1900e2ec84fSDave May   PetscInt       N, bs;
1910e2ec84fSDave May   const char    *vecname;
1920e2ec84fSDave May   char           fieldname[PETSC_MAX_PATH_LEN];
1930e2ec84fSDave May 
1940e2ec84fSDave May   PetscFunctionBegin;
1959566063dSJacob Faibussowitsch   PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
19628b400f6SJacob Faibussowitsch   PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext");
1979566063dSJacob Faibussowitsch   PetscCall(PetscContainerGetPointer(container, (void **)&bytes));
1989566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileGetName(viewer, &viewername));
1999566063dSJacob Faibussowitsch   PetscCall(private_CreateDataFileNameXDMF(viewername, datafile));
2000e2ec84fSDave May 
2010e2ec84fSDave May   /* re-open a sub-viewer for all data fields */
2020e2ec84fSDave May   /* name is viewer.name + "_swarm_fields.pbin" */
2039566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer));
2049566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY));
2059566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE));
2069566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE));
2079566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND));
2089566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(fviewer, datafile));
2099566063dSJacob Faibussowitsch   PetscCall(PetscStrrchr(datafile, '/', &datafilename));
2100e2ec84fSDave May 
2119566063dSJacob Faibussowitsch   PetscCall(VecGetSize(x, &N));
2129566063dSJacob Faibussowitsch   PetscCall(VecGetBlockSize(x, &bs));
2130e2ec84fSDave May   N = N / bs;
2149566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)x, &vecname));
2150e2ec84fSDave May   if (!vecname) {
21663a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)x)->tag));
2170e2ec84fSDave May   } else {
2189566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname));
2190e2ec84fSDave May   }
2200e2ec84fSDave May 
2210e2ec84fSDave May   /* write data header */
2229566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
2239566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname));
2249566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
2250e2ec84fSDave May   if (bs == 1) {
22663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0]));
2270e2ec84fSDave May   } else {
22863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT " %" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bs, bytes[0]));
2290e2ec84fSDave May   }
2309566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
2319566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
2329566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
2339566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
2349566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
2359566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n"));
2369566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
2370e2ec84fSDave May 
2380e2ec84fSDave May   /* write data */
2399566063dSJacob Faibussowitsch   PetscCall(VecView(x, fviewer));
2400e2ec84fSDave May   bytes[0] += sizeof(PetscReal) * N * bs;
2410e2ec84fSDave May 
2429566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&fviewer));
2430e2ec84fSDave May   PetscFunctionReturn(0);
2440e2ec84fSDave May }
2450e2ec84fSDave May 
2469371c9d4SSatish Balay PetscErrorCode private_ISView_Swarm_XDMF(IS is, PetscViewer viewer) {
247c14f9142SDave May   long int      *bytes     = NULL;
248c14f9142SDave May   PetscContainer container = NULL;
249c14f9142SDave May   const char    *viewername;
250c14f9142SDave May   char           datafile[PETSC_MAX_PATH_LEN];
2513249a2ebSMara Arts   char          *datafilename;
252c14f9142SDave May   PetscViewer    fviewer;
253c14f9142SDave May   PetscInt       N, bs;
254c14f9142SDave May   const char    *vecname;
255c14f9142SDave May   char           fieldname[PETSC_MAX_PATH_LEN];
256c14f9142SDave May 
257c14f9142SDave May   PetscFunctionBegin;
2589566063dSJacob Faibussowitsch   PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
25928b400f6SJacob Faibussowitsch   PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext");
2609566063dSJacob Faibussowitsch   PetscCall(PetscContainerGetPointer(container, (void **)&bytes));
2619566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileGetName(viewer, &viewername));
2629566063dSJacob Faibussowitsch   PetscCall(private_CreateDataFileNameXDMF(viewername, datafile));
263c14f9142SDave May 
264c14f9142SDave May   /* re-open a sub-viewer for all data fields */
265c14f9142SDave May   /* name is viewer.name + "_swarm_fields.pbin" */
2669566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer));
2679566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY));
2689566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE));
2699566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE));
2709566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND));
2719566063dSJacob Faibussowitsch   PetscCall(PetscViewerFileSetName(fviewer, datafile));
2729566063dSJacob Faibussowitsch   PetscCall(PetscStrrchr(datafile, '/', &datafilename));
273c14f9142SDave May 
2749566063dSJacob Faibussowitsch   PetscCall(ISGetSize(is, &N));
2759566063dSJacob Faibussowitsch   PetscCall(ISGetBlockSize(is, &bs));
276c14f9142SDave May   N = N / bs;
2779566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)is, &vecname));
278c14f9142SDave May   if (!vecname) {
27963a3b9bcSJacob Faibussowitsch     PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)is)->tag));
280c14f9142SDave May   } else {
2819566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname));
282c14f9142SDave May   }
283c14f9142SDave May 
284c14f9142SDave May   /* write data header */
2859566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
2869566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname));
2879566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
288c14f9142SDave May   if (bs == 1) {
28963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0]));
290c14f9142SDave May   } else {
29163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%" PetscInt_FMT " %" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bs, bytes[0]));
292c14f9142SDave May   }
2939566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
2949566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
2959566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
2969566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
2979566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
2989566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n"));
2999566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
300c14f9142SDave May 
301c14f9142SDave May   /* write data */
3029566063dSJacob Faibussowitsch   PetscCall(ISView(is, fviewer));
303c14f9142SDave May   bytes[0] += sizeof(PetscInt) * N * bs;
304c14f9142SDave May 
3059566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&fviewer));
306c14f9142SDave May   PetscFunctionReturn(0);
307c14f9142SDave May }
308c14f9142SDave May 
309acf7c82dSDave May /*@C
310acf7c82dSDave May    DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file
311acf7c82dSDave May 
312d083f849SBarry Smith    Collective on dm
313acf7c82dSDave May 
314acf7c82dSDave May    Input parameters:
315acf7c82dSDave May +  dm - the DMSwarm
316acf7c82dSDave May .  filename - the file name of the XDMF file (must have the extension .xmf)
317acf7c82dSDave May .  nfields - the number of fields to write into the XDMF file
318acf7c82dSDave May -  field_name_list - array of length nfields containing the textual name of fields to write
319acf7c82dSDave May 
320acf7c82dSDave May    Level: beginner
321acf7c82dSDave May 
322acf7c82dSDave May    Notes:
323ea3d7275SDave May    Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file
324acf7c82dSDave May 
325db781477SPatrick Sanan .seealso: `DMSwarmViewXDMF()`
326acf7c82dSDave May @*/
3279371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm, const char filename[], PetscInt nfields, const char *field_name_list[]) {
3280e2ec84fSDave May   Vec         dvec;
329c14f9142SDave May   PetscInt    f, N;
3300e2ec84fSDave May   PetscViewer viewer;
3310e2ec84fSDave May 
3320e2ec84fSDave May   PetscFunctionBegin;
3339566063dSJacob Faibussowitsch   PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer));
3349566063dSJacob Faibussowitsch   PetscCall(private_DMSwarmView_XDMF(dm, viewer));
3359566063dSJacob Faibussowitsch   PetscCall(DMSwarmGetLocalSize(dm, &N));
3360e2ec84fSDave May   for (f = 0; f < nfields; f++) {
337c14f9142SDave May     void         *data;
338c14f9142SDave May     PetscDataType type;
339c14f9142SDave May 
3409566063dSJacob Faibussowitsch     PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data));
3419566063dSJacob Faibussowitsch     PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data));
342c14f9142SDave May     if (type == PETSC_DOUBLE) {
3439566063dSJacob Faibussowitsch       PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field_name_list[f], &dvec));
3449566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetName((PetscObject)dvec, field_name_list[f]));
3459566063dSJacob Faibussowitsch       PetscCall(private_VecView_Swarm_XDMF(dvec, viewer));
3469566063dSJacob Faibussowitsch       PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field_name_list[f], &dvec));
347c14f9142SDave May     } else if (type == PETSC_INT) {
348c14f9142SDave May       IS              is;
349c14f9142SDave May       const PetscInt *idx;
350c14f9142SDave May 
3519566063dSJacob Faibussowitsch       PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data));
352c14f9142SDave May       idx = (const PetscInt *)data;
353c14f9142SDave May 
3549566063dSJacob Faibussowitsch       PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is));
3559566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetName((PetscObject)is, field_name_list[f]));
3569566063dSJacob Faibussowitsch       PetscCall(private_ISView_Swarm_XDMF(is, viewer));
3579566063dSJacob Faibussowitsch       PetscCall(ISDestroy(&is));
3589566063dSJacob Faibussowitsch       PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data));
359c14f9142SDave May     } else SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Can only write PETSC_INT and PETSC_DOUBLE");
3600e2ec84fSDave May   }
3619566063dSJacob Faibussowitsch   PetscCall(private_PetscViewerDestroy_XDMF(&viewer));
3620e2ec84fSDave May   PetscFunctionReturn(0);
3630e2ec84fSDave May }
3640e2ec84fSDave May 
365acf7c82dSDave May /*@C
366acf7c82dSDave May    DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file
367acf7c82dSDave May 
368d083f849SBarry Smith    Collective on dm
369acf7c82dSDave May 
370acf7c82dSDave May    Input parameters:
371acf7c82dSDave May +  dm - the DMSwarm
372acf7c82dSDave May -  filename - the file name of the XDMF file (must have the extension .xmf)
373acf7c82dSDave May 
374acf7c82dSDave May    Level: beginner
375acf7c82dSDave May 
376acf7c82dSDave May    Notes:
377ea3d7275SDave May      Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file
378acf7c82dSDave May 
3795627991aSBarry Smith    Developer Notes:
3805627991aSBarry Smith      This should be removed and replaced with the standard use of PetscViewer
3815627991aSBarry Smith 
382db781477SPatrick Sanan .seealso: `DMSwarmViewFieldsXDMF()`
383acf7c82dSDave May @*/
3849371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm, const char filename[]) {
3850e2ec84fSDave May   DM_Swarm   *swarm = (DM_Swarm *)dm->data;
3860e2ec84fSDave May   Vec         dvec;
3870e2ec84fSDave May   PetscInt    f;
3880e2ec84fSDave May   PetscViewer viewer;
3890e2ec84fSDave May 
3900e2ec84fSDave May   PetscFunctionBegin;
3919566063dSJacob Faibussowitsch   PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer));
3929566063dSJacob Faibussowitsch   PetscCall(private_DMSwarmView_XDMF(dm, viewer));
3930e2ec84fSDave May   for (f = 4; f < swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
39477048351SPatrick Sanan     DMSwarmDataField field;
3950e2ec84fSDave May 
3960e2ec84fSDave May     /* query field type - accept all those of type PETSC_DOUBLE */
3970e2ec84fSDave May     field = swarm->db->field[f];
398c14f9142SDave May     if (field->petsc_type == PETSC_DOUBLE) {
3999566063dSJacob Faibussowitsch       PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field->name, &dvec));
4009566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetName((PetscObject)dvec, field->name));
4019566063dSJacob Faibussowitsch       PetscCall(private_VecView_Swarm_XDMF(dvec, viewer));
4029566063dSJacob Faibussowitsch       PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field->name, &dvec));
403c14f9142SDave May     } else if (field->petsc_type == PETSC_INT) {
404c14f9142SDave May       IS              is;
405c14f9142SDave May       PetscInt        N;
406c14f9142SDave May       const PetscInt *idx;
407c14f9142SDave May       void           *data;
408c14f9142SDave May 
4099566063dSJacob Faibussowitsch       PetscCall(DMSwarmGetLocalSize(dm, &N));
4109566063dSJacob Faibussowitsch       PetscCall(DMSwarmGetField(dm, field->name, NULL, NULL, &data));
411c14f9142SDave May       idx = (const PetscInt *)data;
412c14f9142SDave May 
4139566063dSJacob Faibussowitsch       PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is));
4149566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetName((PetscObject)is, field->name));
4159566063dSJacob Faibussowitsch       PetscCall(private_ISView_Swarm_XDMF(is, viewer));
4169566063dSJacob Faibussowitsch       PetscCall(ISDestroy(&is));
4179566063dSJacob Faibussowitsch       PetscCall(DMSwarmRestoreField(dm, field->name, NULL, NULL, &data));
418c14f9142SDave May     }
4190e2ec84fSDave May   }
4209566063dSJacob Faibussowitsch   PetscCall(private_PetscViewerDestroy_XDMF(&viewer));
4210e2ec84fSDave May   PetscFunctionReturn(0);
4220e2ec84fSDave May }
423