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