1*cc4c1da9SBarry Smith #include <petscdmda.h> /*I "petscdmda.h" I*/ 2*cc4c1da9SBarry Smith #include <petsc/private/dmswarmimpl.h> /*I "petscdmswarm.h" I*/ 3279f676cSBarry Smith #include "../src/dm/impls/swarm/data_bucket.h" 40e2ec84fSDave May 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 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) { 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; 633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 640e2ec84fSDave May } 650e2ec84fSDave May 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 8466976f2fSJacob Faibussowitsch static PetscErrorCode private_DMSwarmView_XDMF(DM dm, PetscViewer viewer) 85d71ae5a4SJacob Faibussowitsch { 860e2ec84fSDave May PetscBool isswarm = PETSC_FALSE; 870e2ec84fSDave May const char *viewername; 880e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 893249a2ebSMara Arts char *datafilename; 900e2ec84fSDave May PetscViewer fviewer; 910e2ec84fSDave May PetscInt k, ng, dim; 920e2ec84fSDave May Vec dvec; 930e2ec84fSDave May long int *bytes = NULL; 940e2ec84fSDave May PetscContainer container = NULL; 950e2ec84fSDave May const char *dmname; 960e2ec84fSDave May 970e2ec84fSDave May PetscFunctionBegin; 989566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 990e2ec84fSDave May if (container) { 1009566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 1010e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Valid to find attached data XDMFViewerContext"); 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 1790e2ec84fSDave May /* write geometry data */ 1809566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec)); 1819566063dSJacob Faibussowitsch PetscCall(VecView(dvec, fviewer)); 1829566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec)); 1830e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1840e2ec84fSDave May 1859566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 1863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1870e2ec84fSDave May } 1880e2ec84fSDave May 18966976f2fSJacob Faibussowitsch static PetscErrorCode private_VecView_Swarm_XDMF(Vec x, PetscViewer viewer) 190d71ae5a4SJacob Faibussowitsch { 1910e2ec84fSDave May long int *bytes = NULL; 1920e2ec84fSDave May PetscContainer container = NULL; 1930e2ec84fSDave May const char *viewername; 1940e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 1953249a2ebSMara Arts char *datafilename; 1960e2ec84fSDave May PetscViewer fviewer; 1970e2ec84fSDave May PetscInt N, bs; 1980e2ec84fSDave May const char *vecname; 1990e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2000e2ec84fSDave May 2010e2ec84fSDave May PetscFunctionBegin; 2029566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 20328b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext"); 2049566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 2059566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 2069566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 2070e2ec84fSDave May 2080e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2090e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2109566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 2119566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 2129566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 2139566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 2149566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND)); 2159566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 2169566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 2170e2ec84fSDave May 2189566063dSJacob Faibussowitsch PetscCall(VecGetSize(x, &N)); 2199566063dSJacob Faibussowitsch PetscCall(VecGetBlockSize(x, &bs)); 2200e2ec84fSDave May N = N / bs; 2219566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)x, &vecname)); 2220e2ec84fSDave May if (!vecname) { 22363a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)x)->tag)); 2240e2ec84fSDave May } else { 2259566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname)); 2260e2ec84fSDave May } 2270e2ec84fSDave May 2280e2ec84fSDave May /* write data header */ 2299566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2309566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname)); 2319566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2320e2ec84fSDave May if (bs == 1) { 23363a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0])); 2340e2ec84fSDave May } else { 23563a3b9bcSJacob 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])); 2360e2ec84fSDave May } 2379566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2389566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 2399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 2419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n")); 2439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2440e2ec84fSDave May 2450e2ec84fSDave May /* write data */ 2469566063dSJacob Faibussowitsch PetscCall(VecView(x, fviewer)); 2470e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2480e2ec84fSDave May 2499566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 2503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2510e2ec84fSDave May } 2520e2ec84fSDave May 25366976f2fSJacob Faibussowitsch static PetscErrorCode private_ISView_Swarm_XDMF(IS is, PetscViewer viewer) 254d71ae5a4SJacob Faibussowitsch { 255c14f9142SDave May long int *bytes = NULL; 256c14f9142SDave May PetscContainer container = NULL; 257c14f9142SDave May const char *viewername; 258c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 2593249a2ebSMara Arts char *datafilename; 260c14f9142SDave May PetscViewer fviewer; 261c14f9142SDave May PetscInt N, bs; 262c14f9142SDave May const char *vecname; 263c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 264c14f9142SDave May 265c14f9142SDave May PetscFunctionBegin; 2669566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 26728b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext"); 2689566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 2699566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 2709566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 271c14f9142SDave May 272c14f9142SDave May /* re-open a sub-viewer for all data fields */ 273c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2749566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 2759566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 2769566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 2779566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 2789566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND)); 2799566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 2809566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 281c14f9142SDave May 2829566063dSJacob Faibussowitsch PetscCall(ISGetSize(is, &N)); 2839566063dSJacob Faibussowitsch PetscCall(ISGetBlockSize(is, &bs)); 284c14f9142SDave May N = N / bs; 2859566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)is, &vecname)); 286c14f9142SDave May if (!vecname) { 28763a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)is)->tag)); 288c14f9142SDave May } else { 2899566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname)); 290c14f9142SDave May } 291c14f9142SDave May 292c14f9142SDave May /* write data header */ 2939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2949566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname)); 2959566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 296c14f9142SDave May if (bs == 1) { 29763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0])); 298c14f9142SDave May } else { 29963a3b9bcSJacob 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])); 300c14f9142SDave May } 3019566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3029566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 3039566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 3059566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n")); 3079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 308c14f9142SDave May 309c14f9142SDave May /* write data */ 3109566063dSJacob Faibussowitsch PetscCall(ISView(is, fviewer)); 311c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 312c14f9142SDave May 3139566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 3143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 315c14f9142SDave May } 316c14f9142SDave May 317acf7c82dSDave May /*@C 318acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 319acf7c82dSDave May 32020f4b53cSBarry Smith Collective 321acf7c82dSDave May 32260225df5SJacob Faibussowitsch Input Parameters: 32320f4b53cSBarry Smith + dm - the `DMSWARM` 324acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 325acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 326acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 327acf7c82dSDave May 328acf7c82dSDave May Level: beginner 329acf7c82dSDave May 33020f4b53cSBarry Smith Note: 33120f4b53cSBarry Smith Only fields registered with data type `PETSC_DOUBLE` or `PETSC_INT` can be written into the file 332acf7c82dSDave May 33320f4b53cSBarry Smith .seealso: `DM`, `DMSWARM`, `DMSwarmViewXDMF()` 334acf7c82dSDave May @*/ 335*cc4c1da9SBarry Smith PetscErrorCode DMSwarmViewFieldsXDMF(DM dm, const char filename[], PetscInt nfields, const char *field_name_list[]) 336d71ae5a4SJacob Faibussowitsch { 3370e2ec84fSDave May Vec dvec; 338c14f9142SDave May PetscInt f, N; 3390e2ec84fSDave May PetscViewer viewer; 3400e2ec84fSDave May 3410e2ec84fSDave May PetscFunctionBegin; 3429566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer)); 3439566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer)); 3449566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N)); 3450e2ec84fSDave May for (f = 0; f < nfields; f++) { 346c14f9142SDave May void *data; 347c14f9142SDave May PetscDataType type; 348c14f9142SDave May 3499566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data)); 3509566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data)); 351c14f9142SDave May if (type == PETSC_DOUBLE) { 3529566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field_name_list[f], &dvec)); 3539566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field_name_list[f])); 3549566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer)); 3559566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field_name_list[f], &dvec)); 356c14f9142SDave May } else if (type == PETSC_INT) { 357c14f9142SDave May IS is; 358c14f9142SDave May const PetscInt *idx; 359c14f9142SDave May 3609566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data)); 361c14f9142SDave May idx = (const PetscInt *)data; 362c14f9142SDave May 3639566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is)); 3649566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field_name_list[f])); 3659566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer)); 3669566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 3679566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data)); 368c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Can only write PETSC_INT and PETSC_DOUBLE"); 3690e2ec84fSDave May } 3709566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer)); 3713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3720e2ec84fSDave May } 3730e2ec84fSDave May 374*cc4c1da9SBarry Smith /*@ 37520f4b53cSBarry Smith DMSwarmViewXDMF - Write `DMSWARM` fields to an XDMF3 file 376acf7c82dSDave May 37720f4b53cSBarry Smith Collective 378acf7c82dSDave May 37960225df5SJacob Faibussowitsch Input Parameters: 38020f4b53cSBarry Smith + dm - the `DMSWARM` 381acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 382acf7c82dSDave May 383acf7c82dSDave May Level: beginner 384acf7c82dSDave May 38520f4b53cSBarry Smith Note: 38620f4b53cSBarry Smith Only fields user registered with data type `PETSC_DOUBLE` or `PETSC_INT` will be written into the file 387acf7c82dSDave May 388a3b724e8SBarry Smith Developer Note: 38920f4b53cSBarry Smith This should be removed and replaced with the standard use of `PetscViewer` 3905627991aSBarry Smith 39120f4b53cSBarry Smith .seealso: `DM`, `DMSWARM`, `DMSwarmViewFieldsXDMF()` 392acf7c82dSDave May @*/ 393*cc4c1da9SBarry Smith PetscErrorCode DMSwarmViewXDMF(DM dm, const char filename[]) 394d71ae5a4SJacob Faibussowitsch { 3950e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm *)dm->data; 3960e2ec84fSDave May Vec dvec; 3970e2ec84fSDave May PetscInt f; 3980e2ec84fSDave May PetscViewer viewer; 3990e2ec84fSDave May 4000e2ec84fSDave May PetscFunctionBegin; 4019566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer)); 4029566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer)); 4030e2ec84fSDave May for (f = 4; f < swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 40477048351SPatrick Sanan DMSwarmDataField field; 4050e2ec84fSDave May 4060e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4070e2ec84fSDave May field = swarm->db->field[f]; 408c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4099566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field->name, &dvec)); 4109566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field->name)); 4119566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer)); 4129566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field->name, &dvec)); 413c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 414c14f9142SDave May IS is; 415c14f9142SDave May PetscInt N; 416c14f9142SDave May const PetscInt *idx; 417c14f9142SDave May void *data; 418c14f9142SDave May 4199566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N)); 4209566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field->name, NULL, NULL, &data)); 421c14f9142SDave May idx = (const PetscInt *)data; 422c14f9142SDave May 4239566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is)); 4249566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field->name)); 4259566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer)); 4269566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 4279566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field->name, NULL, NULL, &data)); 428c14f9142SDave May } 4290e2ec84fSDave May } 4309566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer)); 4313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4320e2ec84fSDave May } 433