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 PetscErrorCode ierr; 130e2ec84fSDave May 140e2ec84fSDave May PetscFunctionBegin; 150e2ec84fSDave May ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr); 160e2ec84fSDave May ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 170e2ec84fSDave May ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 180e2ec84fSDave May ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr); 190e2ec84fSDave May 200e2ec84fSDave May ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr); 210e2ec84fSDave May bytes[0] = 0; 220e2ec84fSDave May ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr); 230e2ec84fSDave May ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr); 240e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr); 250e2ec84fSDave May 260e2ec84fSDave May /* write xdmf header */ 2716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");CHKERRQ(ierr); 28a8d69d7bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n");CHKERRQ(ierr); 290e2ec84fSDave May /* write xdmf domain */ 3016d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 3116d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Domain>\n");CHKERRQ(ierr); 320e2ec84fSDave May *v = viewer; 330e2ec84fSDave May PetscFunctionReturn(0); 340e2ec84fSDave May } 350e2ec84fSDave May 360e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) 370e2ec84fSDave May { 380e2ec84fSDave May PetscViewer viewer; 390e2ec84fSDave May DM dm = NULL; 400e2ec84fSDave May long int *bytes; 410e2ec84fSDave May PetscContainer container = NULL; 420e2ec84fSDave May PetscErrorCode ierr; 430e2ec84fSDave May 440e2ec84fSDave May PetscFunctionBegin; 450e2ec84fSDave May if (!v) PetscFunctionReturn(0); 460e2ec84fSDave May viewer = *v; 470e2ec84fSDave May 480e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr); 490e2ec84fSDave May if (dm) { 5016d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Grid>\n");CHKERRQ(ierr); 5116d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 520e2ec84fSDave May } 530e2ec84fSDave May 540e2ec84fSDave May /* close xdmf header */ 5516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Domain>\n");CHKERRQ(ierr); 5616d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 5716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Xdmf>\n");CHKERRQ(ierr); 580e2ec84fSDave May 590e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 600e2ec84fSDave May if (container) { 610e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 620e2ec84fSDave May ierr = PetscFree(bytes);CHKERRQ(ierr); 630e2ec84fSDave May ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 640e2ec84fSDave May } 650e2ec84fSDave May 660e2ec84fSDave May ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 670e2ec84fSDave May *v = NULL; 680e2ec84fSDave May PetscFunctionReturn(0); 690e2ec84fSDave May } 700e2ec84fSDave May 710e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[]) 720e2ec84fSDave May { 730e2ec84fSDave May char *ext; 740e2ec84fSDave May PetscBool flg; 750e2ec84fSDave May PetscErrorCode ierr; 760e2ec84fSDave May 770e2ec84fSDave May PetscFunctionBegin; 780e2ec84fSDave May ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr); 790e2ec84fSDave May ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr); 800e2ec84fSDave May if (flg) { 810e2ec84fSDave May size_t len; 820e2ec84fSDave May char viewername_minus_ext[PETSC_MAX_PATH_LEN]; 830e2ec84fSDave May 840e2ec84fSDave May ierr = PetscStrlen(filename,&len);CHKERRQ(ierr); 854540a1d2SSatish Balay ierr = PetscStrncpy(viewername_minus_ext,filename,len-2);CHKERRQ(ierr); 860e2ec84fSDave May ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr); 870e2ec84fSDave May } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf"); 880e2ec84fSDave May 890e2ec84fSDave May PetscFunctionReturn(0); 900e2ec84fSDave May } 910e2ec84fSDave May 920e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer) 930e2ec84fSDave May { 940e2ec84fSDave May PetscBool isswarm = PETSC_FALSE; 950e2ec84fSDave May const char *viewername; 960e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 970e2ec84fSDave May PetscViewer fviewer; 980e2ec84fSDave May PetscInt k,ng,dim; 990e2ec84fSDave May Vec dvec; 1000e2ec84fSDave May long int *bytes = NULL; 1010e2ec84fSDave May PetscContainer container = NULL; 1020e2ec84fSDave May const char *dmname; 1030e2ec84fSDave May PetscErrorCode ierr; 1040e2ec84fSDave May 1050e2ec84fSDave May PetscFunctionBegin; 1060e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 1070e2ec84fSDave May if (container) { 1080e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 1090e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 1100e2ec84fSDave May 1110e2ec84fSDave May ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr); 1120e2ec84fSDave May if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 1130e2ec84fSDave May 1140e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr); 1150e2ec84fSDave May 11616d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1170e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr); 1180e2ec84fSDave May if (!dmname) { 1190e2ec84fSDave May ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr); 1200e2ec84fSDave May } 1210e2ec84fSDave May if (!dmname) { 12216d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");CHKERRQ(ierr); 1230e2ec84fSDave May } else { 12416d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);CHKERRQ(ierr); 1250e2ec84fSDave May } 1260e2ec84fSDave May 1270e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1280e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1290e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 1300e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 1310e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1320e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1330e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr); 1340e2ec84fSDave May 1350e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 1360e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 1370e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 1380e2ec84fSDave May 1390e2ec84fSDave May ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr); 1400e2ec84fSDave May 1410e2ec84fSDave May /* write topology header */ 14216d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);CHKERRQ(ierr); 14416d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);CHKERRQ(ierr); 14616d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafile);CHKERRQ(ierr); 14816d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 14916d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 15016d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 15116d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Topology>\n");CHKERRQ(ierr); 15216d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1530e2ec84fSDave May 1540e2ec84fSDave May /* write topology data */ 1550e2ec84fSDave May for (k=0; k<ng; k++) { 1560e2ec84fSDave May PetscInt pvertex[3]; 1570e2ec84fSDave May 1580e2ec84fSDave May pvertex[0] = 1; 1590e2ec84fSDave May pvertex[1] = 1; 1600e2ec84fSDave May pvertex[2] = k; 161*f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT);CHKERRQ(ierr); 1620e2ec84fSDave May } 1630e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 1640e2ec84fSDave May 1650e2ec84fSDave May /* write geometry header */ 16616d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1670e2ec84fSDave May ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 1680e2ec84fSDave May switch (dim) { 1690e2ec84fSDave May case 1: 1700e2ec84fSDave May SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D"); 1710e2ec84fSDave May break; 1720e2ec84fSDave May case 2: 17316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");CHKERRQ(ierr); 1740e2ec84fSDave May break; 1750e2ec84fSDave May case 3: 17616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");CHKERRQ(ierr); 1770e2ec84fSDave May break; 1780e2ec84fSDave May } 17916d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 18016d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]);CHKERRQ(ierr); 18116d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 18216d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafile);CHKERRQ(ierr); 18316d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 18416d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 18516d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 18616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Geometry>\n");CHKERRQ(ierr); 18716d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1880e2ec84fSDave May 1890e2ec84fSDave May /* write geometry data */ 1900e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1910e2ec84fSDave May ierr = VecView(dvec,fviewer);CHKERRQ(ierr); 1920e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1930e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1940e2ec84fSDave May 1950e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 1960e2ec84fSDave May 1970e2ec84fSDave May PetscFunctionReturn(0); 1980e2ec84fSDave May } 1990e2ec84fSDave May 2000e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 2010e2ec84fSDave May { 2020e2ec84fSDave May long int *bytes = NULL; 2030e2ec84fSDave May PetscContainer container = NULL; 2040e2ec84fSDave May const char *viewername; 2050e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 2060e2ec84fSDave May PetscViewer fviewer; 2070e2ec84fSDave May PetscInt N,bs; 2080e2ec84fSDave May const char *vecname; 2090e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2100e2ec84fSDave May PetscErrorCode ierr; 2110e2ec84fSDave May 2120e2ec84fSDave May PetscFunctionBegin; 2130e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 2140e2ec84fSDave May if (container) { 2150e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 2160e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 2170e2ec84fSDave May 2180e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 2190e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 2200e2ec84fSDave May 2210e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2220e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2230e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 2240e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 2250e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2260e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2270e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 2280e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 2290e2ec84fSDave May 2300e2ec84fSDave May ierr = VecGetSize(x,&N);CHKERRQ(ierr); 2310e2ec84fSDave May ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr); 2320e2ec84fSDave May N = N/bs; 2330e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr); 2340e2ec84fSDave May if (!vecname) { 2350e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr); 2360e2ec84fSDave May } else { 2370e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 2380e2ec84fSDave May } 2390e2ec84fSDave May 2400e2ec84fSDave May /* write data header */ 24116d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 24216d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 24316d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2440e2ec84fSDave May if (bs == 1) { 24516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 2460e2ec84fSDave May } else { 24716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr); 2480e2ec84fSDave May } 24916d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 25016d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafile);CHKERRQ(ierr); 25116d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 25216d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 25316d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 25416d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 25516d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2560e2ec84fSDave May 2570e2ec84fSDave May /* write data */ 2580e2ec84fSDave May ierr = VecView(x,fviewer);CHKERRQ(ierr); 2590e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2600e2ec84fSDave May 2610e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 2620e2ec84fSDave May 2630e2ec84fSDave May PetscFunctionReturn(0); 2640e2ec84fSDave May } 2650e2ec84fSDave May 266c14f9142SDave May PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer) 267c14f9142SDave May { 268c14f9142SDave May long int *bytes = NULL; 269c14f9142SDave May PetscContainer container = NULL; 270c14f9142SDave May const char *viewername; 271c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 272c14f9142SDave May PetscViewer fviewer; 273c14f9142SDave May PetscInt N,bs; 274c14f9142SDave May const char *vecname; 275c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 276c14f9142SDave May PetscErrorCode ierr; 277c14f9142SDave May 278c14f9142SDave May PetscFunctionBegin; 279c14f9142SDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 280c14f9142SDave May if (container) { 281c14f9142SDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 282c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 283c14f9142SDave May 284c14f9142SDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 285c14f9142SDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 286c14f9142SDave May 287c14f9142SDave May /* re-open a sub-viewer for all data fields */ 288c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 289c14f9142SDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 290c14f9142SDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 291c14f9142SDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 292c14f9142SDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 293c14f9142SDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 294c14f9142SDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 295c14f9142SDave May 296c14f9142SDave May ierr = ISGetSize(is,&N);CHKERRQ(ierr); 297c14f9142SDave May ierr = ISGetBlockSize(is,&bs);CHKERRQ(ierr); 298c14f9142SDave May N = N/bs; 299c14f9142SDave May ierr = PetscObjectGetName((PetscObject)is,&vecname);CHKERRQ(ierr); 300c14f9142SDave May if (!vecname) { 301c14f9142SDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag);CHKERRQ(ierr); 302c14f9142SDave May } else { 303c14f9142SDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 304c14f9142SDave May } 305c14f9142SDave May 306c14f9142SDave May /* write data header */ 30716d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 30816d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 30916d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 310c14f9142SDave May if (bs == 1) { 31116d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 312c14f9142SDave May } else { 31316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr); 314c14f9142SDave May } 31516d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 31616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafile);CHKERRQ(ierr); 31716d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 31816d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 31916d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 32016d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 32116d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 322c14f9142SDave May 323c14f9142SDave May /* write data */ 324c14f9142SDave May ierr = ISView(is,fviewer);CHKERRQ(ierr); 325c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 326c14f9142SDave May 327c14f9142SDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 328c14f9142SDave May 329c14f9142SDave May PetscFunctionReturn(0); 330c14f9142SDave May } 331c14f9142SDave May 332acf7c82dSDave May /*@C 333acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 334acf7c82dSDave May 335d083f849SBarry Smith Collective on dm 336acf7c82dSDave May 337acf7c82dSDave May Input parameters: 338acf7c82dSDave May + dm - the DMSwarm 339acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 340acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 341acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 342acf7c82dSDave May 343acf7c82dSDave May Level: beginner 344acf7c82dSDave May 345acf7c82dSDave May Notes: 346ea3d7275SDave May Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file 347acf7c82dSDave May 348acf7c82dSDave May .seealso: DMSwarmViewXDMF() 349acf7c82dSDave May @*/ 3500e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 3510e2ec84fSDave May { 3520e2ec84fSDave May PetscErrorCode ierr; 3530e2ec84fSDave May Vec dvec; 354c14f9142SDave May PetscInt f,N; 3550e2ec84fSDave May PetscViewer viewer; 3560e2ec84fSDave May 3570e2ec84fSDave May PetscFunctionBegin; 3580e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 3590e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 360c14f9142SDave May ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 3610e2ec84fSDave May for (f=0; f<nfields; f++) { 362c14f9142SDave May void *data; 363c14f9142SDave May PetscDataType type; 364c14f9142SDave May 365c14f9142SDave May ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 366c14f9142SDave May ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 367c14f9142SDave May 368c14f9142SDave May if (type == PETSC_DOUBLE) { 3690e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 3700e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr); 3710e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 3720e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 373c14f9142SDave May } else if (type == PETSC_INT) { 374c14f9142SDave May IS is; 375c14f9142SDave May const PetscInt *idx; 376c14f9142SDave May 377c14f9142SDave May ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 378c14f9142SDave May idx = (const PetscInt*)data; 379c14f9142SDave May 380c14f9142SDave May ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 381c14f9142SDave May ierr = PetscObjectSetName((PetscObject)is,field_name_list[f]);CHKERRQ(ierr); 382c14f9142SDave May ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 383c14f9142SDave May ierr = ISDestroy(&is);CHKERRQ(ierr); 384c14f9142SDave May ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 385c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE"); 386c14f9142SDave May 3870e2ec84fSDave May } 3880e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 3890e2ec84fSDave May PetscFunctionReturn(0); 3900e2ec84fSDave May } 3910e2ec84fSDave May 392acf7c82dSDave May /*@C 393acf7c82dSDave May DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 394acf7c82dSDave May 395d083f849SBarry Smith Collective on dm 396acf7c82dSDave May 397acf7c82dSDave May Input parameters: 398acf7c82dSDave May + dm - the DMSwarm 399acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 400acf7c82dSDave May 401acf7c82dSDave May Level: beginner 402acf7c82dSDave May 403acf7c82dSDave May Notes: 404ea3d7275SDave May Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file 405acf7c82dSDave May 406acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF() 407acf7c82dSDave May @*/ 4080e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 4090e2ec84fSDave May { 4100e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4110e2ec84fSDave May PetscErrorCode ierr; 4120e2ec84fSDave May Vec dvec; 4130e2ec84fSDave May PetscInt f; 4140e2ec84fSDave May PetscViewer viewer; 4150e2ec84fSDave May 4160e2ec84fSDave May PetscFunctionBegin; 4170e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 4180e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 4190e2ec84fSDave May for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 42077048351SPatrick Sanan DMSwarmDataField field; 4210e2ec84fSDave May 4220e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4230e2ec84fSDave May field = swarm->db->field[f]; 424c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4250e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 4260e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr); 4270e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 4280e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 429c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 430c14f9142SDave May IS is; 431c14f9142SDave May PetscInt N; 432c14f9142SDave May const PetscInt *idx; 433c14f9142SDave May void *data; 434c14f9142SDave May 435c14f9142SDave May ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 436c14f9142SDave May ierr = DMSwarmGetField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 437c14f9142SDave May idx = (const PetscInt*)data; 438c14f9142SDave May 439c14f9142SDave May ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 440c14f9142SDave May ierr = PetscObjectSetName((PetscObject)is,field->name);CHKERRQ(ierr); 441c14f9142SDave May ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 442c14f9142SDave May ierr = ISDestroy(&is);CHKERRQ(ierr); 443c14f9142SDave May ierr = DMSwarmRestoreField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 444c14f9142SDave May } 4450e2ec84fSDave May } 4460e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 4470e2ec84fSDave May PetscFunctionReturn(0); 4480e2ec84fSDave May } 449