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 70e2ec84fSDave May PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v) 80e2ec84fSDave May { 90e2ec84fSDave May long int *bytes; 100e2ec84fSDave May PetscContainer container; 110e2ec84fSDave May PetscViewer viewer; 120e2ec84fSDave May 130e2ec84fSDave May PetscFunctionBegin; 145f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerCreate(comm,&viewer)); 155f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerSetType(viewer,PETSCVIEWERASCII)); 165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetMode(viewer,FILE_MODE_WRITE)); 175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetName(viewer,filename)); 180e2ec84fSDave May 195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(1,&bytes)); 200e2ec84fSDave May bytes[0] = 0; 215f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerCreate(comm,&container)); 225f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerSetPointer(container,(void*)bytes)); 235f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container)); 240e2ec84fSDave May 250e2ec84fSDave May /* write xdmf header */ 265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")); 275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n")); 280e2ec84fSDave May /* write xdmf domain */ 295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 305f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Domain>\n")); 310e2ec84fSDave May *v = viewer; 320e2ec84fSDave May PetscFunctionReturn(0); 330e2ec84fSDave May } 340e2ec84fSDave May 350e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) 360e2ec84fSDave May { 370e2ec84fSDave May PetscViewer viewer; 380e2ec84fSDave May DM dm = NULL; 390e2ec84fSDave May long int *bytes; 400e2ec84fSDave May PetscContainer container = NULL; 410e2ec84fSDave May 420e2ec84fSDave May PetscFunctionBegin; 430e2ec84fSDave May if (!v) PetscFunctionReturn(0); 440e2ec84fSDave May viewer = *v; 450e2ec84fSDave May 465f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm)); 470e2ec84fSDave May if (dm) { 485f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Grid>\n")); 495f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 500e2ec84fSDave May } 510e2ec84fSDave May 520e2ec84fSDave May /* close xdmf header */ 535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Domain>\n")); 545f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 555f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Xdmf>\n")); 560e2ec84fSDave May 575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container)); 580e2ec84fSDave May if (container) { 595f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes)); 605f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(bytes)); 615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerDestroy(&container)); 620e2ec84fSDave May } 635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&viewer)); 640e2ec84fSDave May *v = NULL; 650e2ec84fSDave May PetscFunctionReturn(0); 660e2ec84fSDave May } 670e2ec84fSDave May 680e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[]) 690e2ec84fSDave May { 700e2ec84fSDave May char *ext; 710e2ec84fSDave May PetscBool flg; 720e2ec84fSDave May 730e2ec84fSDave May PetscFunctionBegin; 745f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrrchr(filename,'.',&ext)); 755f80ce2aSJacob Faibussowitsch CHKERRQ(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 805f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlen(filename,&len)); 815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrncpy(viewername_minus_ext,filename,len-2)); 825f80ce2aSJacob Faibussowitsch CHKERRQ(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"); 840e2ec84fSDave May PetscFunctionReturn(0); 850e2ec84fSDave May } 860e2ec84fSDave May 870e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer) 880e2ec84fSDave May { 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; 1015f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container)); 1020e2ec84fSDave May if (container) { 1035f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes)); 1040e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 1050e2ec84fSDave May 1065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm)); 107*28b400f6SJacob Faibussowitsch PetscCheck(isswarm,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 1080e2ec84fSDave May 1095f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm)); 1100e2ec84fSDave May 1115f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1125f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetName((PetscObject)dm,&dmname)); 1130e2ec84fSDave May if (!dmname) { 1145f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetOptionsPrefix(dm,&dmname)); 1150e2ec84fSDave May } 1160e2ec84fSDave May if (!dmname) { 1175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n")); 1180e2ec84fSDave May } else { 1195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname)); 1200e2ec84fSDave May } 1210e2ec84fSDave May 1220e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1230e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer)); 1255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerSetType(fviewer,PETSCVIEWERBINARY)); 1265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE)); 1275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE)); 1285f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE)); 1290e2ec84fSDave May 1305f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileGetName(viewer,&viewername)); 1315f80ce2aSJacob Faibussowitsch CHKERRQ(private_CreateDataFileNameXDMF(viewername,datafile)); 1325f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetName(fviewer,datafile)); 1335f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrrchr(datafile,'/',&datafilename)); 1340e2ec84fSDave May 1355f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmGetSize(dm,&ng)); 1360e2ec84fSDave May 1370e2ec84fSDave May /* write topology header */ 1385f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1395f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng)); 1405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1415f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0])); 1425f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1435f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename)); 1445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n")); 1465f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1475f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Topology>\n")); 1485f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1490e2ec84fSDave May 1500e2ec84fSDave May /* write topology data */ 1510e2ec84fSDave May for (k=0; k<ng; k++) { 1520e2ec84fSDave May PetscInt pvertex[3]; 1530e2ec84fSDave May 1540e2ec84fSDave May pvertex[0] = 1; 1550e2ec84fSDave May pvertex[1] = 1; 1560e2ec84fSDave May pvertex[2] = k; 1575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT)); 1580e2ec84fSDave May } 1590e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 1600e2ec84fSDave May 1610e2ec84fSDave May /* write geometry header */ 1625f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1635f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDimension(dm,&dim)); 1640e2ec84fSDave May switch (dim) { 1650e2ec84fSDave May case 1: 1660e2ec84fSDave May SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D"); 1670e2ec84fSDave May case 2: 1685f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n")); 1690e2ec84fSDave May break; 1700e2ec84fSDave May case 3: 1715f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n")); 1720e2ec84fSDave May break; 1730e2ec84fSDave May } 1745f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1755f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0])); 1765f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 1775f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename)); 1785f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1795f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n")); 1805f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Geometry>\n")); 1825f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 1830e2ec84fSDave May 1840e2ec84fSDave May /* write geometry data */ 1855f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec)); 1865f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(dvec,fviewer)); 1875f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec)); 1880e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1890e2ec84fSDave May 1905f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&fviewer)); 1910e2ec84fSDave May PetscFunctionReturn(0); 1920e2ec84fSDave May } 1930e2ec84fSDave May 1940e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 1950e2ec84fSDave May { 1960e2ec84fSDave May long int *bytes = NULL; 1970e2ec84fSDave May PetscContainer container = NULL; 1980e2ec84fSDave May const char *viewername; 1990e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 2003249a2ebSMara Arts char *datafilename; 2010e2ec84fSDave May PetscViewer fviewer; 2020e2ec84fSDave May PetscInt N,bs; 2030e2ec84fSDave May const char *vecname; 2040e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2050e2ec84fSDave May 2060e2ec84fSDave May PetscFunctionBegin; 2075f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container)); 208*28b400f6SJacob Faibussowitsch PetscCheck(container,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext"); 2095f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes)); 2105f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileGetName(viewer,&viewername)); 2115f80ce2aSJacob Faibussowitsch CHKERRQ(private_CreateDataFileNameXDMF(viewername,datafile)); 2120e2ec84fSDave May 2130e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2140e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2155f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer)); 2165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerSetType(fviewer,PETSCVIEWERBINARY)); 2175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE)); 2185f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE)); 2195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND)); 2205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetName(fviewer,datafile)); 2215f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrrchr(datafile,'/',&datafilename)); 2220e2ec84fSDave May 2235f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetSize(x,&N)); 2245f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetBlockSize(x,&bs)); 2250e2ec84fSDave May N = N/bs; 2265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetName((PetscObject)x,&vecname)); 2270e2ec84fSDave May if (!vecname) { 2285f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag)); 2290e2ec84fSDave May } else { 2305f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname)); 2310e2ec84fSDave May } 2320e2ec84fSDave May 2330e2ec84fSDave May /* write data header */ 2345f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 2355f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname)); 2365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 2370e2ec84fSDave May if (bs == 1) { 2385f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0])); 2390e2ec84fSDave May } else { 2405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0])); 2410e2ec84fSDave May } 2425f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 2435f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename)); 2445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 2455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n")); 2465f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 2475f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Attribute>\n")); 2485f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 2490e2ec84fSDave May 2500e2ec84fSDave May /* write data */ 2515f80ce2aSJacob Faibussowitsch CHKERRQ(VecView(x,fviewer)); 2520e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2530e2ec84fSDave May 2545f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&fviewer)); 2550e2ec84fSDave May PetscFunctionReturn(0); 2560e2ec84fSDave May } 2570e2ec84fSDave May 258c14f9142SDave May PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer) 259c14f9142SDave May { 260c14f9142SDave May long int *bytes = NULL; 261c14f9142SDave May PetscContainer container = NULL; 262c14f9142SDave May const char *viewername; 263c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 2643249a2ebSMara Arts char *datafilename; 265c14f9142SDave May PetscViewer fviewer; 266c14f9142SDave May PetscInt N,bs; 267c14f9142SDave May const char *vecname; 268c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 269c14f9142SDave May 270c14f9142SDave May PetscFunctionBegin; 2715f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container)); 272*28b400f6SJacob Faibussowitsch PetscCheck(container,PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext"); 2735f80ce2aSJacob Faibussowitsch CHKERRQ(PetscContainerGetPointer(container,(void**)&bytes)); 2745f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileGetName(viewer,&viewername)); 2755f80ce2aSJacob Faibussowitsch CHKERRQ(private_CreateDataFileNameXDMF(viewername,datafile)); 276c14f9142SDave May 277c14f9142SDave May /* re-open a sub-viewer for all data fields */ 278c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2795f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer)); 2805f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerSetType(fviewer,PETSCVIEWERBINARY)); 2815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE)); 2825f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE)); 2835f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND)); 2845f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFileSetName(fviewer,datafile)); 2855f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrrchr(datafile,'/',&datafilename)); 286c14f9142SDave May 2875f80ce2aSJacob Faibussowitsch CHKERRQ(ISGetSize(is,&N)); 2885f80ce2aSJacob Faibussowitsch CHKERRQ(ISGetBlockSize(is,&bs)); 289c14f9142SDave May N = N/bs; 2905f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetName((PetscObject)is,&vecname)); 291c14f9142SDave May if (!vecname) { 2925f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag)); 293c14f9142SDave May } else { 2945f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname)); 295c14f9142SDave May } 296c14f9142SDave May 297c14f9142SDave May /* write data header */ 2985f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 2995f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname)); 3005f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 301c14f9142SDave May if (bs == 1) { 3025f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0])); 303c14f9142SDave May } else { 3045f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0])); 305c14f9142SDave May } 3065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 3075f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"%s\n",datafilename)); 3085f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 3095f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</DataItem>\n")); 3105f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 3115f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"</Attribute>\n")); 3125f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 313c14f9142SDave May 314c14f9142SDave May /* write data */ 3155f80ce2aSJacob Faibussowitsch CHKERRQ(ISView(is,fviewer)); 316c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 317c14f9142SDave May 3185f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerDestroy(&fviewer)); 319c14f9142SDave May PetscFunctionReturn(0); 320c14f9142SDave May } 321c14f9142SDave May 322acf7c82dSDave May /*@C 323acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 324acf7c82dSDave May 325d083f849SBarry Smith Collective on dm 326acf7c82dSDave May 327acf7c82dSDave May Input parameters: 328acf7c82dSDave May + dm - the DMSwarm 329acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 330acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 331acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 332acf7c82dSDave May 333acf7c82dSDave May Level: beginner 334acf7c82dSDave May 335acf7c82dSDave May Notes: 336ea3d7275SDave May Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file 337acf7c82dSDave May 338acf7c82dSDave May .seealso: DMSwarmViewXDMF() 339acf7c82dSDave May @*/ 3400e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 3410e2ec84fSDave May { 3420e2ec84fSDave May Vec dvec; 343c14f9142SDave May PetscInt f,N; 3440e2ec84fSDave May PetscViewer viewer; 3450e2ec84fSDave May 3460e2ec84fSDave May PetscFunctionBegin; 3475f80ce2aSJacob Faibussowitsch CHKERRQ(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer)); 3485f80ce2aSJacob Faibussowitsch CHKERRQ(private_DMSwarmView_XDMF(dm,viewer)); 3495f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmGetLocalSize(dm,&N)); 3500e2ec84fSDave May for (f=0; f<nfields; f++) { 351c14f9142SDave May void *data; 352c14f9142SDave May PetscDataType type; 353c14f9142SDave May 3545f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data)); 3555f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data)); 356c14f9142SDave May if (type == PETSC_DOUBLE) { 3575f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec)); 3585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)dvec,field_name_list[f])); 3595f80ce2aSJacob Faibussowitsch CHKERRQ(private_VecView_Swarm_XDMF(dvec,viewer)); 3605f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec)); 361c14f9142SDave May } else if (type == PETSC_INT) { 362c14f9142SDave May IS is; 363c14f9142SDave May const PetscInt *idx; 364c14f9142SDave May 3655f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data)); 366c14f9142SDave May idx = (const PetscInt*)data; 367c14f9142SDave May 3685f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is)); 3695f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)is,field_name_list[f])); 3705f80ce2aSJacob Faibussowitsch CHKERRQ(private_ISView_Swarm_XDMF(is,viewer)); 3715f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&is)); 3725f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data)); 373c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE"); 374c14f9142SDave May 3750e2ec84fSDave May } 3765f80ce2aSJacob Faibussowitsch CHKERRQ(private_PetscViewerDestroy_XDMF(&viewer)); 3770e2ec84fSDave May PetscFunctionReturn(0); 3780e2ec84fSDave May } 3790e2ec84fSDave May 380acf7c82dSDave May /*@C 381acf7c82dSDave May DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 382acf7c82dSDave May 383d083f849SBarry Smith Collective on dm 384acf7c82dSDave May 385acf7c82dSDave May Input parameters: 386acf7c82dSDave May + dm - the DMSwarm 387acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 388acf7c82dSDave May 389acf7c82dSDave May Level: beginner 390acf7c82dSDave May 391acf7c82dSDave May Notes: 392ea3d7275SDave May Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file 393acf7c82dSDave May 3945627991aSBarry Smith Developer Notes: 3955627991aSBarry Smith This should be removed and replaced with the standard use of PetscViewer 3965627991aSBarry Smith 397acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF() 398acf7c82dSDave May @*/ 3990e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 4000e2ec84fSDave May { 4010e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4020e2ec84fSDave May Vec dvec; 4030e2ec84fSDave May PetscInt f; 4040e2ec84fSDave May PetscViewer viewer; 4050e2ec84fSDave May 4060e2ec84fSDave May PetscFunctionBegin; 4075f80ce2aSJacob Faibussowitsch CHKERRQ(private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer)); 4085f80ce2aSJacob Faibussowitsch CHKERRQ(private_DMSwarmView_XDMF(dm,viewer)); 4090e2ec84fSDave May for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 41077048351SPatrick Sanan DMSwarmDataField field; 4110e2ec84fSDave May 4120e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4130e2ec84fSDave May field = swarm->db->field[f]; 414c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4155f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec)); 4165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)dvec,field->name)); 4175f80ce2aSJacob Faibussowitsch CHKERRQ(private_VecView_Swarm_XDMF(dvec,viewer)); 4185f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec)); 419c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 420c14f9142SDave May IS is; 421c14f9142SDave May PetscInt N; 422c14f9142SDave May const PetscInt *idx; 423c14f9142SDave May void *data; 424c14f9142SDave May 4255f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmGetLocalSize(dm,&N)); 4265f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmGetField(dm,field->name,NULL,NULL,&data)); 427c14f9142SDave May idx = (const PetscInt*)data; 428c14f9142SDave May 4295f80ce2aSJacob Faibussowitsch CHKERRQ(ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is)); 4305f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)is,field->name)); 4315f80ce2aSJacob Faibussowitsch CHKERRQ(private_ISView_Swarm_XDMF(is,viewer)); 4325f80ce2aSJacob Faibussowitsch CHKERRQ(ISDestroy(&is)); 4335f80ce2aSJacob Faibussowitsch CHKERRQ(DMSwarmRestoreField(dm,field->name,NULL,NULL,&data)); 434c14f9142SDave May } 4350e2ec84fSDave May } 4365f80ce2aSJacob Faibussowitsch CHKERRQ(private_PetscViewerDestroy_XDMF(&viewer)); 4370e2ec84fSDave May PetscFunctionReturn(0); 4380e2ec84fSDave May } 439