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; 323ba16761SJacob 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; 433ba16761SJacob 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; 653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 660e2ec84fSDave May } 670e2ec84fSDave May 68d71ae5a4SJacob Faibussowitsch PetscErrorCode private_CreateDataFileNameXDMF(const char filename[], char dfilename[]) 69d71ae5a4SJacob Faibussowitsch { 709b15cf9aSJacob Faibussowitsch const char dot_xmf[] = ".xmf"; 719b15cf9aSJacob Faibussowitsch size_t len; 729b15cf9aSJacob Faibussowitsch char viewername_minus_ext[PETSC_MAX_PATH_LEN]; 730e2ec84fSDave May PetscBool flg; 740e2ec84fSDave May 750e2ec84fSDave May PetscFunctionBegin; 769b15cf9aSJacob Faibussowitsch PetscCall(PetscStrendswith(filename, dot_xmf, &flg)); 779b15cf9aSJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_SUP, "File extension must be %s", dot_xmf); 789b15cf9aSJacob Faibussowitsch PetscCall(PetscStrncpy(viewername_minus_ext, filename, sizeof(viewername_minus_ext))); 799566063dSJacob Faibussowitsch PetscCall(PetscStrlen(filename, &len)); 809b15cf9aSJacob Faibussowitsch len -= sizeof(dot_xmf) - 1; 819b15cf9aSJacob Faibussowitsch if (sizeof(viewername_minus_ext) > len) viewername_minus_ext[len] = '\0'; 829566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(dfilename, PETSC_MAX_PATH_LEN - 1, "%s_swarm_fields.pbin", viewername_minus_ext)); 833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 840e2ec84fSDave May } 850e2ec84fSDave May 86d71ae5a4SJacob Faibussowitsch PetscErrorCode private_DMSwarmView_XDMF(DM dm, PetscViewer viewer) 87d71ae5a4SJacob Faibussowitsch { 880e2ec84fSDave May PetscBool isswarm = PETSC_FALSE; 890e2ec84fSDave May const char *viewername; 900e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 913249a2ebSMara Arts char *datafilename; 920e2ec84fSDave May PetscViewer fviewer; 930e2ec84fSDave May PetscInt k, ng, dim; 940e2ec84fSDave May Vec dvec; 950e2ec84fSDave May long int *bytes = NULL; 960e2ec84fSDave May PetscContainer container = NULL; 970e2ec84fSDave May const char *dmname; 980e2ec84fSDave May 990e2ec84fSDave May PetscFunctionBegin; 1009566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 1010e2ec84fSDave May if (container) { 1029566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 1030e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Valid to find attached data XDMFViewerContext"); 1040e2ec84fSDave May 1059566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)dm, DMSWARM, &isswarm)); 10628b400f6SJacob Faibussowitsch PetscCheck(isswarm, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only valid for DMSwarm"); 1070e2ec84fSDave May 1089566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)viewer, "DMSwarm", (PetscObject)dm)); 1090e2ec84fSDave May 1109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1119566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm, &dmname)); 11248a46eb9SPierre Jolivet if (!dmname) PetscCall(DMGetOptionsPrefix(dm, &dmname)); 1130e2ec84fSDave May if (!dmname) { 1149566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n")); 1150e2ec84fSDave May } else { 1169566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n", dmname)); 1170e2ec84fSDave May } 1180e2ec84fSDave May 1190e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1200e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1219566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 1229566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 1239566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 1249566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 1259566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_WRITE)); 1260e2ec84fSDave May 1279566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 1289566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 1299566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 1309566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 1310e2ec84fSDave May 1329566063dSJacob Faibussowitsch PetscCall(DMSwarmGetSize(dm, &ng)); 1330e2ec84fSDave May 1340e2ec84fSDave May /* write topology header */ 1359566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 13663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Topology Dimensions=\"%" PetscInt_FMT "\" TopologyType=\"Mixed\">\n", ng)); 1379566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 13863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", ng * 3, bytes[0])); 1399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 1419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 1439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Topology>\n")); 1459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1460e2ec84fSDave May 1470e2ec84fSDave May /* write topology data */ 1480e2ec84fSDave May for (k = 0; k < ng; k++) { 1490e2ec84fSDave May PetscInt pvertex[3]; 1500e2ec84fSDave May 1510e2ec84fSDave May pvertex[0] = 1; 1520e2ec84fSDave May pvertex[1] = 1; 1530e2ec84fSDave May pvertex[2] = k; 1549566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(fviewer, pvertex, 3, PETSC_INT)); 1550e2ec84fSDave May } 1560e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 1570e2ec84fSDave May 1580e2ec84fSDave May /* write geometry header */ 1599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1609566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 1610e2ec84fSDave May switch (dim) { 162d71ae5a4SJacob Faibussowitsch case 1: 163d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "No support for 1D"); 164d71ae5a4SJacob Faibussowitsch case 2: 165d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XY\">\n")); 166d71ae5a4SJacob Faibussowitsch break; 167d71ae5a4SJacob Faibussowitsch case 3: 168d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Geometry Type=\"XYZ\">\n")); 169d71ae5a4SJacob Faibussowitsch break; 1700e2ec84fSDave May } 1719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 17263a3b9bcSJacob 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])); 1739566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1749566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 1759566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 1779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1789566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Geometry>\n")); 1799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1800e2ec84fSDave May 1810e2ec84fSDave May /* write geometry data */ 1829566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec)); 1839566063dSJacob Faibussowitsch PetscCall(VecView(dvec, fviewer)); 1849566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, DMSwarmPICField_coor, &dvec)); 1850e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1860e2ec84fSDave May 1879566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 1883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1890e2ec84fSDave May } 1900e2ec84fSDave May 191d71ae5a4SJacob Faibussowitsch PetscErrorCode private_VecView_Swarm_XDMF(Vec x, PetscViewer viewer) 192d71ae5a4SJacob Faibussowitsch { 1930e2ec84fSDave May long int *bytes = NULL; 1940e2ec84fSDave May PetscContainer container = NULL; 1950e2ec84fSDave May const char *viewername; 1960e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 1973249a2ebSMara Arts char *datafilename; 1980e2ec84fSDave May PetscViewer fviewer; 1990e2ec84fSDave May PetscInt N, bs; 2000e2ec84fSDave May const char *vecname; 2010e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2020e2ec84fSDave May 2030e2ec84fSDave May PetscFunctionBegin; 2049566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 20528b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext"); 2069566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 2079566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 2089566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 2090e2ec84fSDave May 2100e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2110e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2129566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 2139566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 2149566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 2159566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 2169566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND)); 2179566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 2189566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 2190e2ec84fSDave May 2209566063dSJacob Faibussowitsch PetscCall(VecGetSize(x, &N)); 2219566063dSJacob Faibussowitsch PetscCall(VecGetBlockSize(x, &bs)); 2220e2ec84fSDave May N = N / bs; 2239566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)x, &vecname)); 2240e2ec84fSDave May if (!vecname) { 22563a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)x)->tag)); 2260e2ec84fSDave May } else { 2279566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname)); 2280e2ec84fSDave May } 2290e2ec84fSDave May 2300e2ec84fSDave May /* write data header */ 2319566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2329566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname)); 2339566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2340e2ec84fSDave May if (bs == 1) { 23563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0])); 2360e2ec84fSDave May } else { 23763a3b9bcSJacob 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])); 2380e2ec84fSDave May } 2399566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 2419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2429566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 2439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n")); 2459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 2460e2ec84fSDave May 2470e2ec84fSDave May /* write data */ 2489566063dSJacob Faibussowitsch PetscCall(VecView(x, fviewer)); 2490e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2500e2ec84fSDave May 2519566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 2523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2530e2ec84fSDave May } 2540e2ec84fSDave May 255d71ae5a4SJacob Faibussowitsch PetscErrorCode private_ISView_Swarm_XDMF(IS is, PetscViewer viewer) 256d71ae5a4SJacob Faibussowitsch { 257c14f9142SDave May long int *bytes = NULL; 258c14f9142SDave May PetscContainer container = NULL; 259c14f9142SDave May const char *viewername; 260c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 2613249a2ebSMara Arts char *datafilename; 262c14f9142SDave May PetscViewer fviewer; 263c14f9142SDave May PetscInt N, bs; 264c14f9142SDave May const char *vecname; 265c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 266c14f9142SDave May 267c14f9142SDave May PetscFunctionBegin; 2689566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)viewer, "XDMFViewerContext", (PetscObject *)&container)); 26928b400f6SJacob Faibussowitsch PetscCheck(container, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unable to find attached data XDMFViewerContext"); 2709566063dSJacob Faibussowitsch PetscCall(PetscContainerGetPointer(container, (void **)&bytes)); 2719566063dSJacob Faibussowitsch PetscCall(PetscViewerFileGetName(viewer, &viewername)); 2729566063dSJacob Faibussowitsch PetscCall(private_CreateDataFileNameXDMF(viewername, datafile)); 273c14f9142SDave May 274c14f9142SDave May /* re-open a sub-viewer for all data fields */ 275c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2769566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(PetscObjectComm((PetscObject)viewer), &fviewer)); 2779566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(fviewer, PETSCVIEWERBINARY)); 2789566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipHeader(fviewer, PETSC_TRUE)); 2799566063dSJacob Faibussowitsch PetscCall(PetscViewerBinarySetSkipInfo(fviewer, PETSC_TRUE)); 2809566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetMode(fviewer, FILE_MODE_APPEND)); 2819566063dSJacob Faibussowitsch PetscCall(PetscViewerFileSetName(fviewer, datafile)); 2829566063dSJacob Faibussowitsch PetscCall(PetscStrrchr(datafile, '/', &datafilename)); 283c14f9142SDave May 2849566063dSJacob Faibussowitsch PetscCall(ISGetSize(is, &N)); 2859566063dSJacob Faibussowitsch PetscCall(ISGetBlockSize(is, &bs)); 286c14f9142SDave May N = N / bs; 2879566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)is, &vecname)); 288c14f9142SDave May if (!vecname) { 28963a3b9bcSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "swarmfield_%d", ((PetscObject)is)->tag)); 290c14f9142SDave May } else { 2919566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(fieldname, PETSC_MAX_PATH_LEN - 1, "%s", vecname)); 292c14f9142SDave May } 293c14f9142SDave May 294c14f9142SDave May /* write data header */ 2959566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 2969566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n", fieldname)); 2979566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 298c14f9142SDave May if (bs == 1) { 29963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%" PetscInt_FMT "\" Seek=\"%ld\">\n", N, bytes[0])); 300c14f9142SDave May } else { 30163a3b9bcSJacob 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])); 302c14f9142SDave May } 3039566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", datafilename)); 3059566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</DataItem>\n")); 3079566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 3089566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "</Attribute>\n")); 3099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 310c14f9142SDave May 311c14f9142SDave May /* write data */ 3129566063dSJacob Faibussowitsch PetscCall(ISView(is, fviewer)); 313c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 314c14f9142SDave May 3159566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&fviewer)); 3163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 317c14f9142SDave May } 318c14f9142SDave May 319acf7c82dSDave May /*@C 320acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 321acf7c82dSDave May 322*20f4b53cSBarry Smith Collective 323acf7c82dSDave May 324acf7c82dSDave May Input parameters: 325*20f4b53cSBarry Smith + dm - the `DMSWARM` 326acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 327acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 328acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 329acf7c82dSDave May 330acf7c82dSDave May Level: beginner 331acf7c82dSDave May 332*20f4b53cSBarry Smith Note: 333*20f4b53cSBarry Smith Only fields registered with data type `PETSC_DOUBLE` or `PETSC_INT` can be written into the file 334acf7c82dSDave May 335*20f4b53cSBarry Smith .seealso: `DM`, `DMSWARM`, `DMSwarmViewXDMF()` 336acf7c82dSDave May @*/ 337d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm, const char filename[], PetscInt nfields, const char *field_name_list[]) 338d71ae5a4SJacob Faibussowitsch { 3390e2ec84fSDave May Vec dvec; 340c14f9142SDave May PetscInt f, N; 3410e2ec84fSDave May PetscViewer viewer; 3420e2ec84fSDave May 3430e2ec84fSDave May PetscFunctionBegin; 3449566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer)); 3459566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer)); 3469566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N)); 3470e2ec84fSDave May for (f = 0; f < nfields; f++) { 348c14f9142SDave May void *data; 349c14f9142SDave May PetscDataType type; 350c14f9142SDave May 3519566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data)); 3529566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data)); 353c14f9142SDave May if (type == PETSC_DOUBLE) { 3549566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field_name_list[f], &dvec)); 3559566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field_name_list[f])); 3569566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer)); 3579566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field_name_list[f], &dvec)); 358c14f9142SDave May } else if (type == PETSC_INT) { 359c14f9142SDave May IS is; 360c14f9142SDave May const PetscInt *idx; 361c14f9142SDave May 3629566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field_name_list[f], NULL, &type, &data)); 363c14f9142SDave May idx = (const PetscInt *)data; 364c14f9142SDave May 3659566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is)); 3669566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field_name_list[f])); 3679566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer)); 3689566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 3699566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field_name_list[f], NULL, &type, &data)); 370c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "Can only write PETSC_INT and PETSC_DOUBLE"); 3710e2ec84fSDave May } 3729566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer)); 3733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3740e2ec84fSDave May } 3750e2ec84fSDave May 376acf7c82dSDave May /*@C 377*20f4b53cSBarry Smith DMSwarmViewXDMF - Write `DMSWARM` fields to an XDMF3 file 378acf7c82dSDave May 379*20f4b53cSBarry Smith Collective 380acf7c82dSDave May 381acf7c82dSDave May Input parameters: 382*20f4b53cSBarry Smith + dm - the `DMSWARM` 383acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 384acf7c82dSDave May 385acf7c82dSDave May Level: beginner 386acf7c82dSDave May 387*20f4b53cSBarry Smith Note: 388*20f4b53cSBarry Smith Only fields user registered with data type `PETSC_DOUBLE` or `PETSC_INT` will be written into the file 389acf7c82dSDave May 390*20f4b53cSBarry Smith Developer Note: 391*20f4b53cSBarry Smith This should be removed and replaced with the standard use of `PetscViewer` 3925627991aSBarry Smith 393*20f4b53cSBarry Smith .seealso: `DM`, `DMSWARM`, `DMSwarmViewFieldsXDMF()` 394acf7c82dSDave May @*/ 395d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm, const char filename[]) 396d71ae5a4SJacob Faibussowitsch { 3970e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm *)dm->data; 3980e2ec84fSDave May Vec dvec; 3990e2ec84fSDave May PetscInt f; 4000e2ec84fSDave May PetscViewer viewer; 4010e2ec84fSDave May 4020e2ec84fSDave May PetscFunctionBegin; 4039566063dSJacob Faibussowitsch PetscCall(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm), filename, &viewer)); 4049566063dSJacob Faibussowitsch PetscCall(private_DMSwarmView_XDMF(dm, viewer)); 4050e2ec84fSDave May for (f = 4; f < swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 40677048351SPatrick Sanan DMSwarmDataField field; 4070e2ec84fSDave May 4080e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4090e2ec84fSDave May field = swarm->db->field[f]; 410c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4119566063dSJacob Faibussowitsch PetscCall(DMSwarmCreateGlobalVectorFromField(dm, field->name, &dvec)); 4129566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)dvec, field->name)); 4139566063dSJacob Faibussowitsch PetscCall(private_VecView_Swarm_XDMF(dvec, viewer)); 4149566063dSJacob Faibussowitsch PetscCall(DMSwarmDestroyGlobalVectorFromField(dm, field->name, &dvec)); 415c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 416c14f9142SDave May IS is; 417c14f9142SDave May PetscInt N; 418c14f9142SDave May const PetscInt *idx; 419c14f9142SDave May void *data; 420c14f9142SDave May 4219566063dSJacob Faibussowitsch PetscCall(DMSwarmGetLocalSize(dm, &N)); 4229566063dSJacob Faibussowitsch PetscCall(DMSwarmGetField(dm, field->name, NULL, NULL, &data)); 423c14f9142SDave May idx = (const PetscInt *)data; 424c14f9142SDave May 4259566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), N, idx, PETSC_USE_POINTER, &is)); 4269566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)is, field->name)); 4279566063dSJacob Faibussowitsch PetscCall(private_ISView_Swarm_XDMF(is, viewer)); 4289566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is)); 4299566063dSJacob Faibussowitsch PetscCall(DMSwarmRestoreField(dm, field->name, NULL, NULL, &data)); 430c14f9142SDave May } 4310e2ec84fSDave May } 4329566063dSJacob Faibussowitsch PetscCall(private_PetscViewerDestroy_XDMF(&viewer)); 4333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4340e2ec84fSDave May } 435