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 7d71ae5a4SJacob Faibussowitsch PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm, const char filename[], PetscViewer *v) 8d71ae5a4SJacob Faibussowitsch { 90e2ec84fSDave May long int *bytes; 100e2ec84fSDave May PetscContainer container; 110e2ec84fSDave May PetscViewer viewer; 120e2ec84fSDave May 130e2ec84fSDave May PetscFunctionBegin; 149566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, &viewer)); 159566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(viewer, PETSCVIEWERASCII)); 169566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(viewer, FILE_MODE_WRITE)); 179566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(viewer, filename)); 180e2ec84fSDave May 199566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(1, &bytes)); 200e2ec84fSDave May bytes[0] = 0; 219566063dSJacob Faibussowitsch PetscCall(PetscContainerCreate(comm, &container)); 229566063dSJacob Faibussowitsch PetscCall(PetscContainerSetPointer(container, (void *)bytes)); 239566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)viewer, "XDMFViewerContext", (PetscObject)container)); 240e2ec84fSDave May 250e2ec84fSDave May /* write xdmf header */ 269566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")); 279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n")); 280e2ec84fSDave May /* write xdmf domain */ 299566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 309566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Domain>\n")); 310e2ec84fSDave May *v = viewer; 32*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 330e2ec84fSDave May } 340e2ec84fSDave May 35d71ae5a4SJacob Faibussowitsch PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) 36d71ae5a4SJacob Faibussowitsch { 370e2ec84fSDave May PetscViewer viewer; 380e2ec84fSDave May DM dm = NULL; 390e2ec84fSDave May long int *bytes; 400e2ec84fSDave May PetscContainer container = NULL; 410e2ec84fSDave May 420e2ec84fSDave May PetscFunctionBegin; 43*3ba16761SJacob Faibussowitsch if (!v) PetscFunctionReturn(PETSC_SUCCESS); 440e2ec84fSDave May viewer = *v; 450e2ec84fSDave May 469566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "DMSwarm", (PetscObject *)&dm)); 470e2ec84fSDave May if (dm) { 489566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Grid>\n")); 499566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 500e2ec84fSDave May } 510e2ec84fSDave May 520e2ec84fSDave May /* close xdmf header */ 539566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Domain>\n")); 549566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 559566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Xdmf>\n")); 560e2ec84fSDave May 579566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 580e2ec84fSDave May if (container) { 599566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 609566063dSJacob Faibussowitsch PetscCall(PetscFree(bytes)); 619566063dSJacob Faibussowitsch PetscCall(PetscContainerDestroy(&container)); 620e2ec84fSDave May } 639566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 640e2ec84fSDave May *v = NULL; 65*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 660e2ec84fSDave May } 670e2ec84fSDave May 68d71ae5a4SJacob Faibussowitsch PetscErrorCode private_CreateDataFileNameXDMF(const char filename[], char dfilename[]) 69d71ae5a4SJacob Faibussowitsch { 700e2ec84fSDave May char *ext; 710e2ec84fSDave May PetscBool flg; 720e2ec84fSDave May 730e2ec84fSDave May PetscFunctionBegin; 749566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(filename, '.', &ext)); 759566063dSJacob Faibussowitsch PetscCall(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 809566063dSJacob Faibussowitsch PetscCall(PetscStrlen(filename, &len)); 819566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(viewername_minus_ext, filename, len - 2)); 829566063dSJacob Faibussowitsch PetscCall(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"); 84*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 850e2ec84fSDave May } 860e2ec84fSDave May 87d71ae5a4SJacob Faibussowitsch PetscErrorCode private_DMSwarmView_XDMF(DM dm, PetscViewer viewer) 88d71ae5a4SJacob Faibussowitsch { 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; 1019566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 1020e2ec84fSDave May if (container) { 1039566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 1040e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Valid to find attached data XDMFViewerContext"); 1050e2ec84fSDave May 1069566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)dm, DMSWARM, &isswarm)); 10728b400f6SJacob Faibussowitsch PetscCheck(isswarm, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only valid for DMSwarm"); 1080e2ec84fSDave May 1099566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)viewer, "DMSwarm", (PetscObject)dm)); 1100e2ec84fSDave May 1119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1129566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm, &dmname)); 11348a46eb9SPierre Jolivet if (!dmname) PetscCall(DMGetOptionsPrefix(dm, &dmname)); 1140e2ec84fSDave May if (!dmname) { 1159566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n")); 1160e2ec84fSDave May } else { 1179566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n", dmname)); 1180e2ec84fSDave May } 1190e2ec84fSDave May 1200e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1210e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1229566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 1239566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 1249566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 1259566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 1269566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_WRITE)); 1270e2ec84fSDave May 1289566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 1299566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 1309566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 1319566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 1320e2ec84fSDave May 1339566063dSJacob Faibussowitsch PetscCall(DMSwarmGetSize(dm, &ng)); 1340e2ec84fSDave May 1350e2ec84fSDave May /* write topology header */ 1369566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 13763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Topology Dimensions=\"%" PetscInt_FMT "\" TopologyType=\"Mixed\">\n", ng)); 1389566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 13963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", ng * 3, bytes[0])); 1409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 1429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 1449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Topology>\n")); 1469566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1470e2ec84fSDave May 1480e2ec84fSDave May /* write topology data */ 1490e2ec84fSDave May for (k = 0; k < ng; k++) { 1500e2ec84fSDave May PetscInt pvertex[3]; 1510e2ec84fSDave May 1520e2ec84fSDave May pvertex[0] = 1; 1530e2ec84fSDave May pvertex[1] = 1; 1540e2ec84fSDave May pvertex[2] = k; 1559566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(fviewer, pvertex, 3, PETSC_INT)); 1560e2ec84fSDave May } 1570e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 1580e2ec84fSDave May 1590e2ec84fSDave May /* write geometry header */ 1609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1619566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 1620e2ec84fSDave May switch (dim) { 163d71ae5a4SJacob Faibussowitsch case 1: 164d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for 1D"); 165d71ae5a4SJacob Faibussowitsch case 2: 166d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XY\">\n")); 167d71ae5a4SJacob Faibussowitsch break; 168d71ae5a4SJacob Faibussowitsch case 3: 169d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XYZ\">\n")); 170d71ae5a4SJacob Faibussowitsch break; 1710e2ec84fSDave May } 1729566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 17363a3b9bcSJacob 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])); 1749566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1759566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 1769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 1789566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Geometry>\n")); 1809566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1810e2ec84fSDave May 1820e2ec84fSDave May /* write geometry data */ 1839566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec)); 1849566063dSJacob Faibussowitsch PetscCall(VecView(dvec, fviewer)); 1859566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec)); 1860e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1870e2ec84fSDave May 1889566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 189*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1900e2ec84fSDave May } 1910e2ec84fSDave May 192d71ae5a4SJacob Faibussowitsch PetscErrorCode private_VecView_Swarm_XDMF(Vec x, PetscViewer viewer) 193d71ae5a4SJacob Faibussowitsch { 1940e2ec84fSDave May long int *bytes = NULL; 1950e2ec84fSDave May PetscContainer container = NULL; 1960e2ec84fSDave May const char *viewername; 1970e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 1983249a2ebSMara Arts char *datafilename; 1990e2ec84fSDave May PetscViewer fviewer; 2000e2ec84fSDave May PetscInt N, bs; 2010e2ec84fSDave May const char *vecname; 2020e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2030e2ec84fSDave May 2040e2ec84fSDave May PetscFunctionBegin; 2059566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 20628b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext"); 2079566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 2089566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 2099566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 2100e2ec84fSDave May 2110e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2120e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2139566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 2149566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 2159566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 2169566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 2179566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND)); 2189566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 2199566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 2200e2ec84fSDave May 2219566063dSJacob Faibussowitsch PetscCall(VecGetSize(x, &N)); 2229566063dSJacob Faibussowitsch PetscCall(VecGetBlockSize(x, &bs)); 2230e2ec84fSDave May N = N / bs; 2249566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)x, &vecname)); 2250e2ec84fSDave May if (!vecname) { 22663a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)x)->tag)); 2270e2ec84fSDave May } else { 2289566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname)); 2290e2ec84fSDave May } 2300e2ec84fSDave May 2310e2ec84fSDave May /* write data header */ 2329566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2339566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname)); 2349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2350e2ec84fSDave May if (bs == 1) { 23663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0])); 2370e2ec84fSDave May } else { 23863a3b9bcSJacob 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])); 2390e2ec84fSDave May } 2409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 2429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 2449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n")); 2469566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2470e2ec84fSDave May 2480e2ec84fSDave May /* write data */ 2499566063dSJacob Faibussowitsch PetscCall(VecView(x, fviewer)); 2500e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2510e2ec84fSDave May 2529566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 253*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2540e2ec84fSDave May } 2550e2ec84fSDave May 256d71ae5a4SJacob Faibussowitsch PetscErrorCode private_ISView_Swarm_XDMF(IS is, PetscViewer viewer) 257d71ae5a4SJacob Faibussowitsch { 258c14f9142SDave May long int *bytes = NULL; 259c14f9142SDave May PetscContainer container = NULL; 260c14f9142SDave May const char *viewername; 261c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 2623249a2ebSMara Arts char *datafilename; 263c14f9142SDave May PetscViewer fviewer; 264c14f9142SDave May PetscInt N, bs; 265c14f9142SDave May const char *vecname; 266c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 267c14f9142SDave May 268c14f9142SDave May PetscFunctionBegin; 2699566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 27028b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext"); 2719566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 2729566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 2739566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 274c14f9142SDave May 275c14f9142SDave May /* re-open a sub-viewer for all data fields */ 276c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2779566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 2789566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 2799566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 2809566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 2819566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND)); 2829566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 2839566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 284c14f9142SDave May 2859566063dSJacob Faibussowitsch PetscCall(ISGetSize(is, &N)); 2869566063dSJacob Faibussowitsch PetscCall(ISGetBlockSize(is, &bs)); 287c14f9142SDave May N = N / bs; 2889566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)is, &vecname)); 289c14f9142SDave May if (!vecname) { 29063a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)is)->tag)); 291c14f9142SDave May } else { 2929566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname)); 293c14f9142SDave May } 294c14f9142SDave May 295c14f9142SDave May /* write data header */ 2969566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2979566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname)); 2989566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 299c14f9142SDave May if (bs == 1) { 30063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0])); 301c14f9142SDave May } else { 30263a3b9bcSJacob 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])); 303c14f9142SDave May } 3049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3059566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 3069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 3089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n")); 3109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 311c14f9142SDave May 312c14f9142SDave May /* write data */ 3139566063dSJacob Faibussowitsch PetscCall(ISView(is, fviewer)); 314c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 315c14f9142SDave May 3169566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 317*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 318c14f9142SDave May } 319c14f9142SDave May 320acf7c82dSDave May /*@C 321acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 322acf7c82dSDave May 323d083f849SBarry Smith Collective on dm 324acf7c82dSDave May 325acf7c82dSDave May Input parameters: 326acf7c82dSDave May + dm - the DMSwarm 327acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 328acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 329acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 330acf7c82dSDave May 331acf7c82dSDave May Level: beginner 332acf7c82dSDave May 333acf7c82dSDave May Notes: 334ea3d7275SDave May Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file 335acf7c82dSDave May 336db781477SPatrick Sanan .seealso: `DMSwarmViewXDMF()` 337acf7c82dSDave May @*/ 338d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm, const char filename[], PetscInt nfields, const char *field_name_list[]) 339d71ae5a4SJacob Faibussowitsch { 3400e2ec84fSDave May Vec dvec; 341c14f9142SDave May PetscInt f, N; 3420e2ec84fSDave May PetscViewer viewer; 3430e2ec84fSDave May 3440e2ec84fSDave May PetscFunctionBegin; 3459566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer)); 3469566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer)); 3479566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N)); 3480e2ec84fSDave May for (f = 0; f < nfields; f++) { 349c14f9142SDave May void *data; 350c14f9142SDave May PetscDataType type; 351c14f9142SDave May 3529566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data)); 3539566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data)); 354c14f9142SDave May if (type == PETSC_DOUBLE) { 3559566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field_name_list[f], &dvec)); 3569566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field_name_list[f])); 3579566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer)); 3589566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field_name_list[f], &dvec)); 359c14f9142SDave May } else if (type == PETSC_INT) { 360c14f9142SDave May IS is; 361c14f9142SDave May const PetscInt *idx; 362c14f9142SDave May 3639566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data)); 364c14f9142SDave May idx = (const PetscInt *)data; 365c14f9142SDave May 3669566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is)); 3679566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field_name_list[f])); 3689566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer)); 3699566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 3709566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data)); 371c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Can only write PETSC_INT and PETSC_DOUBLE"); 3720e2ec84fSDave May } 3739566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer)); 374*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3750e2ec84fSDave May } 3760e2ec84fSDave May 377acf7c82dSDave May /*@C 378acf7c82dSDave May DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 379acf7c82dSDave May 380d083f849SBarry Smith Collective on dm 381acf7c82dSDave May 382acf7c82dSDave May Input parameters: 383acf7c82dSDave May + dm - the DMSwarm 384acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 385acf7c82dSDave May 386acf7c82dSDave May Level: beginner 387acf7c82dSDave May 388acf7c82dSDave May Notes: 389ea3d7275SDave May Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file 390acf7c82dSDave May 3915627991aSBarry Smith Developer Notes: 3925627991aSBarry Smith This should be removed and replaced with the standard use of PetscViewer 3935627991aSBarry Smith 394db781477SPatrick Sanan .seealso: `DMSwarmViewFieldsXDMF()` 395acf7c82dSDave May @*/ 396d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm, const char filename[]) 397d71ae5a4SJacob Faibussowitsch { 3980e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm *)dm->data; 3990e2ec84fSDave May Vec dvec; 4000e2ec84fSDave May PetscInt f; 4010e2ec84fSDave May PetscViewer viewer; 4020e2ec84fSDave May 4030e2ec84fSDave May PetscFunctionBegin; 4049566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer)); 4059566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer)); 4060e2ec84fSDave May for (f = 4; f < swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 40777048351SPatrick Sanan DMSwarmDataField field; 4080e2ec84fSDave May 4090e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4100e2ec84fSDave May field = swarm->db->field[f]; 411c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4129566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field->name, &dvec)); 4139566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field->name)); 4149566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer)); 4159566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field->name, &dvec)); 416c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 417c14f9142SDave May IS is; 418c14f9142SDave May PetscInt N; 419c14f9142SDave May const PetscInt *idx; 420c14f9142SDave May void *data; 421c14f9142SDave May 4229566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N)); 4239566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field->name, NULL, NULL, &data)); 424c14f9142SDave May idx = (const PetscInt *)data; 425c14f9142SDave May 4269566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is)); 4279566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field->name)); 4289566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer)); 4299566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 4309566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field->name, NULL, NULL, &data)); 431c14f9142SDave May } 4320e2ec84fSDave May } 4339566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer)); 434*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4350e2ec84fSDave May } 436