1cc4c1da9SBarry Smith #include <petscdmda.h> /*I "petscdmda.h" I*/
2cc4c1da9SBarry Smith #include <petsc/private/dmswarmimpl.h> /*I "petscdmswarm.h" I*/
3279f676cSBarry Smith #include "../src/dm/impls/swarm/data_bucket.h"
40e2ec84fSDave May
private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer * v)566976f2fSJacob Faibussowitsch static PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm, const char filename[], PetscViewer *v)
6d71ae5a4SJacob Faibussowitsch {
70e2ec84fSDave May long int *bytes;
80e2ec84fSDave May PetscContainer container;
90e2ec84fSDave May PetscViewer viewer;
100e2ec84fSDave May
110e2ec84fSDave May PetscFunctionBegin;
129566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, &viewer));
139566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(viewer, PETSCVIEWERASCII));
149566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(viewer, FILE_MODE_WRITE));
159566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(viewer, filename));
160e2ec84fSDave May
179566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(1, &bytes));
180e2ec84fSDave May bytes[0] = 0;
199566063dSJacob Faibussowitsch PetscCall(PetscContainerCreate(comm, &container));
209566063dSJacob Faibussowitsch PetscCall(PetscContainerSetPointer(container, (void *)bytes));
219566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)viewer, "XDMFViewerContext", (PetscObject)container));
220e2ec84fSDave May
230e2ec84fSDave May /* write xdmf header */
249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
259566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n"));
260e2ec84fSDave May /* write xdmf domain */
279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
289566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Domain>\n"));
290e2ec84fSDave May *v = viewer;
303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
310e2ec84fSDave May }
320e2ec84fSDave May
private_PetscViewerDestroy_XDMF(PetscViewer * v)3366976f2fSJacob Faibussowitsch static PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v)
34d71ae5a4SJacob Faibussowitsch {
350e2ec84fSDave May PetscViewer viewer;
360e2ec84fSDave May DM dm = NULL;
370e2ec84fSDave May long int *bytes;
380e2ec84fSDave May PetscContainer container = NULL;
390e2ec84fSDave May
400e2ec84fSDave May PetscFunctionBegin;
413ba16761SJacob Faibussowitsch if (!v) PetscFunctionReturn(PETSC_SUCCESS);
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) {
57*2a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(container, &bytes));
589566063dSJacob Faibussowitsch PetscCall(PetscFree(bytes));
599566063dSJacob Faibussowitsch PetscCall(PetscContainerDestroy(&container));
600e2ec84fSDave May }
619566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer));
620e2ec84fSDave May *v = NULL;
633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
640e2ec84fSDave May }
650e2ec84fSDave May
private_CreateDataFileNameXDMF(const char filename[],char dfilename[])6666976f2fSJacob Faibussowitsch static PetscErrorCode private_CreateDataFileNameXDMF(const char filename[], char dfilename[])
67d71ae5a4SJacob Faibussowitsch {
689b15cf9aSJacob Faibussowitsch const char dot_xmf[] = ".xmf";
699b15cf9aSJacob Faibussowitsch size_t len;
709b15cf9aSJacob Faibussowitsch char viewername_minus_ext[PETSC_MAX_PATH_LEN];
710e2ec84fSDave May PetscBool flg;
720e2ec84fSDave May
730e2ec84fSDave May PetscFunctionBegin;
749b15cf9aSJacob Faibussowitsch PetscCall(PetscStrendswith(filename, dot_xmf, &flg));
759b15cf9aSJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_SUP, "File extension must be %s", dot_xmf);
769b15cf9aSJacob Faibussowitsch PetscCall(PetscStrncpy(viewername_minus_ext, filename, sizeof(viewername_minus_ext)));
779566063dSJacob Faibussowitsch PetscCall(PetscStrlen(filename, &len));
789b15cf9aSJacob Faibussowitsch len -= sizeof(dot_xmf) - 1;
799b15cf9aSJacob Faibussowitsch if (sizeof(viewername_minus_ext) > len) viewername_minus_ext[len] = '\0';
809566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dfilename, PETSC_MAX_PATH_LEN - 1, "%s_swarm_fields.pbin", viewername_minus_ext));
813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
820e2ec84fSDave May }
830e2ec84fSDave May
private_DMSwarmView_XDMF(DM dm,PetscViewer viewer)8466976f2fSJacob Faibussowitsch static PetscErrorCode private_DMSwarmView_XDMF(DM dm, PetscViewer viewer)
85d71ae5a4SJacob Faibussowitsch {
8619307e5cSMatthew G. Knepley DMSwarmCellDM celldm;
870e2ec84fSDave May PetscBool isswarm = PETSC_FALSE;
880e2ec84fSDave May const char *viewername;
890e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN];
903249a2ebSMara Arts char *datafilename;
910e2ec84fSDave May PetscViewer fviewer;
9219307e5cSMatthew G. Knepley PetscInt k, ng, dim, Nfc;
930e2ec84fSDave May Vec dvec;
940e2ec84fSDave May long int *bytes = NULL;
950e2ec84fSDave May PetscContainer container = NULL;
9619307e5cSMatthew G. Knepley const char *dmname, **coordFields;
970e2ec84fSDave May
980e2ec84fSDave May PetscFunctionBegin;
999566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
100966bd95aSPierre Jolivet PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Valid to find attached data XDMFViewerContext");
101*2a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(container, &bytes));
1020e2ec84fSDave May
1039566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)dm, DMSWARM, &isswarm));
10428b400f6SJacob Faibussowitsch PetscCheck(isswarm, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only valid for DMSwarm");
1050e2ec84fSDave May
1069566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)viewer, "DMSwarm", (PetscObject)dm));
1070e2ec84fSDave May
1089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
1099566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm, &dmname));
11048a46eb9SPierre Jolivet if (!dmname) PetscCall(DMGetOptionsPrefix(dm, &dmname));
1110e2ec84fSDave May if (!dmname) {
1129566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n"));
1130e2ec84fSDave May } else {
1149566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n", dmname));
1150e2ec84fSDave May }
1160e2ec84fSDave May
1170e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */
1180e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */
1199566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer));
1209566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY));
1219566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE));
1229566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE));
1239566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_WRITE));
1240e2ec84fSDave May
1259566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername));
1269566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile));
1279566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile));
1289566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename));
1290e2ec84fSDave May
1309566063dSJacob Faibussowitsch PetscCall(DMSwarmGetSize(dm, &ng));
1310e2ec84fSDave May
1320e2ec84fSDave May /* write topology header */
1339566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
13463a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Topology Dimensions=\"%" PetscInt_FMT "\" TopologyType=\"Mixed\">\n", ng));
1359566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
13663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", ng * 3, bytes[0]));
1379566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
1389566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
1399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
1409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
1419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
1429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Topology>\n"));
1439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
1440e2ec84fSDave May
1450e2ec84fSDave May /* write topology data */
1460e2ec84fSDave May for (k = 0; k < ng; k++) {
1470e2ec84fSDave May PetscInt pvertex[3];
1480e2ec84fSDave May
1490e2ec84fSDave May pvertex[0] = 1;
1500e2ec84fSDave May pvertex[1] = 1;
1510e2ec84fSDave May pvertex[2] = k;
1529566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(fviewer, pvertex, 3, PETSC_INT));
1530e2ec84fSDave May }
1540e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3;
1550e2ec84fSDave May
1560e2ec84fSDave May /* write geometry header */
1579566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
1589566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim));
1590e2ec84fSDave May switch (dim) {
160d71ae5a4SJacob Faibussowitsch case 1:
161d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for 1D");
162d71ae5a4SJacob Faibussowitsch case 2:
163d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XY\">\n"));
164d71ae5a4SJacob Faibussowitsch break;
165d71ae5a4SJacob Faibussowitsch case 3:
166d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XYZ\">\n"));
167d71ae5a4SJacob Faibussowitsch break;
1680e2ec84fSDave May }
1699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
17063a3b9bcSJacob 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]));
1719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
1729566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
1739566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
1749566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
1759566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
1769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Geometry>\n"));
1779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
1780e2ec84fSDave May
17919307e5cSMatthew G. Knepley PetscCall(DMSwarmGetCellDMActive(dm, &celldm));
18019307e5cSMatthew G. Knepley PetscCall(DMSwarmCellDMGetCoordinateFields(celldm, &Nfc, &coordFields));
18119307e5cSMatthew G. Knepley PetscCheck(Nfc == 1, PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "We only support a single coordinate field right now, not %" PetscInt_FMT, Nfc);
18219307e5cSMatthew G. Knepley
1830e2ec84fSDave May /* write geometry data */
18419307e5cSMatthew G. Knepley PetscCall(DMSwarmCreateGlobalVectorFromField(dm, coordFields[0], &dvec));
1859566063dSJacob Faibussowitsch PetscCall(VecView(dvec, fviewer));
18619307e5cSMatthew G. Knepley PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, coordFields[0], &dvec));
1870e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim;
1880e2ec84fSDave May
1899566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer));
1903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1910e2ec84fSDave May }
1920e2ec84fSDave May
private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer)19366976f2fSJacob Faibussowitsch static PetscErrorCode private_VecView_Swarm_XDMF(Vec x, PetscViewer viewer)
194d71ae5a4SJacob Faibussowitsch {
1950e2ec84fSDave May long int *bytes = NULL;
1960e2ec84fSDave May PetscContainer container = NULL;
1970e2ec84fSDave May const char *viewername;
1980e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN];
1993249a2ebSMara Arts char *datafilename;
2000e2ec84fSDave May PetscViewer fviewer;
2010e2ec84fSDave May PetscInt N, bs;
2020e2ec84fSDave May const char *vecname;
2030e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN];
2040e2ec84fSDave May
2050e2ec84fSDave May PetscFunctionBegin;
2069566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
20728b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext");
208*2a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(container, &bytes));
2099566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername));
2109566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile));
2110e2ec84fSDave May
2120e2ec84fSDave May /* re-open a sub-viewer for all data fields */
2130e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */
2149566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer));
2159566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY));
2169566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE));
2179566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE));
2189566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND));
2199566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile));
2209566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename));
2210e2ec84fSDave May
2229566063dSJacob Faibussowitsch PetscCall(VecGetSize(x, &N));
2239566063dSJacob Faibussowitsch PetscCall(VecGetBlockSize(x, &bs));
2240e2ec84fSDave May N = N / bs;
2259566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)x, &vecname));
2260e2ec84fSDave May if (!vecname) {
22763a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)x)->tag));
2280e2ec84fSDave May } else {
2299566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname));
2300e2ec84fSDave May }
2310e2ec84fSDave May
2320e2ec84fSDave May /* write data header */
2339566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
2349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname));
2359566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
2360e2ec84fSDave May if (bs == 1) {
23763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0]));
2380e2ec84fSDave May } else {
23963a3b9bcSJacob 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]));
2400e2ec84fSDave May }
2419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
2429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
2439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
2449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
2459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
2469566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n"));
2479566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
2480e2ec84fSDave May
2490e2ec84fSDave May /* write data */
2509566063dSJacob Faibussowitsch PetscCall(VecView(x, fviewer));
2510e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs;
2520e2ec84fSDave May
2539566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer));
2543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2550e2ec84fSDave May }
2560e2ec84fSDave May
private_ISView_Swarm_XDMF(IS is,PetscViewer viewer)25766976f2fSJacob Faibussowitsch static PetscErrorCode private_ISView_Swarm_XDMF(IS is, PetscViewer viewer)
258d71ae5a4SJacob Faibussowitsch {
259c14f9142SDave May long int *bytes = NULL;
260c14f9142SDave May PetscContainer container = NULL;
261c14f9142SDave May const char *viewername;
262c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN];
2633249a2ebSMara Arts char *datafilename;
264c14f9142SDave May PetscViewer fviewer;
265c14f9142SDave May PetscInt N, bs;
266c14f9142SDave May const char *vecname;
267c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN];
268c14f9142SDave May
269c14f9142SDave May PetscFunctionBegin;
2709566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container));
27128b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext");
272*2a8381b2SBarry Smith PetscCall(PetscContainerGetPointer(container, &bytes));
2739566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername));
2749566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile));
275c14f9142SDave May
276c14f9142SDave May /* re-open a sub-viewer for all data fields */
277c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */
2789566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer));
2799566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY));
2809566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE));
2819566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE));
2829566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND));
2839566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile));
2849566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename));
285c14f9142SDave May
2869566063dSJacob Faibussowitsch PetscCall(ISGetSize(is, &N));
2879566063dSJacob Faibussowitsch PetscCall(ISGetBlockSize(is, &bs));
288c14f9142SDave May N = N / bs;
2899566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)is, &vecname));
290c14f9142SDave May if (!vecname) {
29163a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)is)->tag));
292c14f9142SDave May } else {
2939566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname));
294c14f9142SDave May }
295c14f9142SDave May
296c14f9142SDave May /* write data header */
2979566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
2989566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname));
2999566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
300c14f9142SDave May if (bs == 1) {
30163a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0]));
302c14f9142SDave May } else {
30363a3b9bcSJacob 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]));
304c14f9142SDave May }
3059566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
3069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename));
3079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
3089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n"));
3099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
3109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n"));
3119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
312c14f9142SDave May
313c14f9142SDave May /* write data */
3149566063dSJacob Faibussowitsch PetscCall(ISView(is, fviewer));
315c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs;
316c14f9142SDave May
3179566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer));
3183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
319c14f9142SDave May }
320c14f9142SDave May
321acf7c82dSDave May /*@C
322acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file
323acf7c82dSDave May
32420f4b53cSBarry Smith Collective
325acf7c82dSDave May
32660225df5SJacob Faibussowitsch Input Parameters:
32720f4b53cSBarry Smith + dm - the `DMSWARM`
328acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf)
329acf7c82dSDave May . nfields - the number of fields to write into the XDMF file
330acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write
331acf7c82dSDave May
332acf7c82dSDave May Level: beginner
333acf7c82dSDave May
33420f4b53cSBarry Smith Note:
33520f4b53cSBarry Smith Only fields registered with data type `PETSC_DOUBLE` or `PETSC_INT` can be written into the file
336acf7c82dSDave May
33720f4b53cSBarry Smith .seealso: `DM`, `DMSWARM`, `DMSwarmViewXDMF()`
338acf7c82dSDave May @*/
DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char * field_name_list[])339cc4c1da9SBarry Smith PetscErrorCode DMSwarmViewFieldsXDMF(DM dm, const char filename[], PetscInt nfields, const char *field_name_list[])
340d71ae5a4SJacob Faibussowitsch {
3410e2ec84fSDave May Vec dvec;
342c14f9142SDave May PetscInt f, N;
3430e2ec84fSDave May PetscViewer viewer;
3440e2ec84fSDave May
3450e2ec84fSDave May PetscFunctionBegin;
3469566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer));
3479566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer));
3489566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N));
3490e2ec84fSDave May for (f = 0; f < nfields; f++) {
350c14f9142SDave May void *data;
351c14f9142SDave May PetscDataType type;
352c14f9142SDave May
3539566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data));
3549566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data));
355c14f9142SDave May if (type == PETSC_DOUBLE) {
3569566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field_name_list[f], &dvec));
3579566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field_name_list[f]));
3589566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer));
3599566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field_name_list[f], &dvec));
360c14f9142SDave May } else if (type == PETSC_INT) {
361c14f9142SDave May IS is;
362c14f9142SDave May const PetscInt *idx;
363c14f9142SDave May
3649566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data));
365c14f9142SDave May idx = (const PetscInt *)data;
366c14f9142SDave May
3679566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is));
3689566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field_name_list[f]));
3699566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer));
3709566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is));
3719566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data));
372c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Can only write PETSC_INT and PETSC_DOUBLE");
3730e2ec84fSDave May }
3749566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer));
3753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3760e2ec84fSDave May }
3770e2ec84fSDave May
378cc4c1da9SBarry Smith /*@
37920f4b53cSBarry Smith DMSwarmViewXDMF - Write `DMSWARM` fields to an XDMF3 file
380acf7c82dSDave May
38120f4b53cSBarry Smith Collective
382acf7c82dSDave May
38360225df5SJacob Faibussowitsch Input Parameters:
38420f4b53cSBarry Smith + dm - the `DMSWARM`
385acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf)
386acf7c82dSDave May
387acf7c82dSDave May Level: beginner
388acf7c82dSDave May
38920f4b53cSBarry Smith Note:
39020f4b53cSBarry Smith Only fields user registered with data type `PETSC_DOUBLE` or `PETSC_INT` will be written into the file
391acf7c82dSDave May
392a3b724e8SBarry Smith Developer Note:
39320f4b53cSBarry Smith This should be removed and replaced with the standard use of `PetscViewer`
3945627991aSBarry Smith
39520f4b53cSBarry Smith .seealso: `DM`, `DMSWARM`, `DMSwarmViewFieldsXDMF()`
396acf7c82dSDave May @*/
DMSwarmViewXDMF(DM dm,const char filename[])397cc4c1da9SBarry Smith PetscErrorCode DMSwarmViewXDMF(DM dm, const char filename[])
398d71ae5a4SJacob Faibussowitsch {
3990e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm *)dm->data;
4000e2ec84fSDave May Vec dvec;
4010e2ec84fSDave May PetscInt f;
4020e2ec84fSDave May PetscViewer viewer;
4030e2ec84fSDave May
4040e2ec84fSDave May PetscFunctionBegin;
4059566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer));
4069566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer));
4070e2ec84fSDave May for (f = 4; f < swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */
40877048351SPatrick Sanan DMSwarmDataField field;
4090e2ec84fSDave May
4100e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */
4110e2ec84fSDave May field = swarm->db->field[f];
412c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) {
4139566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field->name, &dvec));
4149566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field->name));
4159566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer));
4169566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field->name, &dvec));
417c14f9142SDave May } else if (field->petsc_type == PETSC_INT) {
418c14f9142SDave May IS is;
419c14f9142SDave May PetscInt N;
420c14f9142SDave May const PetscInt *idx;
421c14f9142SDave May void *data;
422c14f9142SDave May
4239566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N));
4249566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field->name, NULL, NULL, &data));
425c14f9142SDave May idx = (const PetscInt *)data;
426c14f9142SDave May
4279566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is));
4289566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field->name));
4299566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer));
4309566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is));
4319566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field->name, NULL, NULL, &data));
432c14f9142SDave May }
4330e2ec84fSDave May }
4349566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer));
4353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4360e2ec84fSDave May }
437