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 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 660e2ec84fSDave May *v = NULL; 670e2ec84fSDave May PetscFunctionReturn(0); 680e2ec84fSDave May } 690e2ec84fSDave May 700e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[]) 710e2ec84fSDave May { 720e2ec84fSDave May char *ext; 730e2ec84fSDave May PetscBool flg; 740e2ec84fSDave May PetscErrorCode ierr; 750e2ec84fSDave May 760e2ec84fSDave May PetscFunctionBegin; 770e2ec84fSDave May ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr); 780e2ec84fSDave May ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr); 790e2ec84fSDave May if (flg) { 800e2ec84fSDave May size_t len; 810e2ec84fSDave May char viewername_minus_ext[PETSC_MAX_PATH_LEN]; 820e2ec84fSDave May 830e2ec84fSDave May ierr = PetscStrlen(filename,&len);CHKERRQ(ierr); 844540a1d2SSatish Balay ierr = PetscStrncpy(viewername_minus_ext,filename,len-2);CHKERRQ(ierr); 850e2ec84fSDave May ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr); 860e2ec84fSDave May } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf"); 870e2ec84fSDave May PetscFunctionReturn(0); 880e2ec84fSDave May } 890e2ec84fSDave May 900e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer) 910e2ec84fSDave May { 920e2ec84fSDave May PetscBool isswarm = PETSC_FALSE; 930e2ec84fSDave May const char *viewername; 940e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 953249a2ebSMara Arts char *datafilename; 960e2ec84fSDave May PetscViewer fviewer; 970e2ec84fSDave May PetscInt k,ng,dim; 980e2ec84fSDave May Vec dvec; 990e2ec84fSDave May long int *bytes = NULL; 1000e2ec84fSDave May PetscContainer container = NULL; 1010e2ec84fSDave May const char *dmname; 1020e2ec84fSDave May PetscErrorCode ierr; 1030e2ec84fSDave May 1040e2ec84fSDave May PetscFunctionBegin; 1050e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 1060e2ec84fSDave May if (container) { 1070e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 1080e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 1090e2ec84fSDave May 1100e2ec84fSDave May ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr); 1110e2ec84fSDave May if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 1120e2ec84fSDave May 1130e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr); 1140e2ec84fSDave May 11516d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1160e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr); 1170e2ec84fSDave May if (!dmname) { 1180e2ec84fSDave May ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr); 1190e2ec84fSDave May } 1200e2ec84fSDave May if (!dmname) { 12116d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");CHKERRQ(ierr); 1220e2ec84fSDave May } else { 12316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);CHKERRQ(ierr); 1240e2ec84fSDave May } 1250e2ec84fSDave May 1260e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1270e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1280e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 1290e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 1300e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1310e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1320e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr); 1330e2ec84fSDave May 1340e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 1350e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 1360e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 1373249a2ebSMara Arts ierr = PetscStrrchr(datafile,'/',&datafilename);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); 1473249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);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; 161f253e43cSLisandro 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 case 2: 17216d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");CHKERRQ(ierr); 1730e2ec84fSDave May break; 1740e2ec84fSDave May case 3: 17516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");CHKERRQ(ierr); 1760e2ec84fSDave May break; 1770e2ec84fSDave May } 17816d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 17916d0e248SBarry 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); 18016d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1813249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 18216d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 18316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 18416d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 18516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Geometry>\n");CHKERRQ(ierr); 18616d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1870e2ec84fSDave May 1880e2ec84fSDave May /* write geometry data */ 1890e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1900e2ec84fSDave May ierr = VecView(dvec,fviewer);CHKERRQ(ierr); 1910e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1920e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1930e2ec84fSDave May 1940e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 1950e2ec84fSDave May PetscFunctionReturn(0); 1960e2ec84fSDave May } 1970e2ec84fSDave May 1980e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 1990e2ec84fSDave May { 2000e2ec84fSDave May long int *bytes = NULL; 2010e2ec84fSDave May PetscContainer container = NULL; 2020e2ec84fSDave May const char *viewername; 2030e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 2043249a2ebSMara Arts char *datafilename; 2050e2ec84fSDave May PetscViewer fviewer; 2060e2ec84fSDave May PetscInt N,bs; 2070e2ec84fSDave May const char *vecname; 2080e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2090e2ec84fSDave May PetscErrorCode ierr; 2100e2ec84fSDave May 2110e2ec84fSDave May PetscFunctionBegin; 2120e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 213*5627991aSBarry Smith if (!container) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext"); 2140e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 2150e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 2160e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 2170e2ec84fSDave May 2180e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2190e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2200e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 2210e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 2220e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2230e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2240e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 2250e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 2263249a2ebSMara Arts ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 2270e2ec84fSDave May 2280e2ec84fSDave May ierr = VecGetSize(x,&N);CHKERRQ(ierr); 2290e2ec84fSDave May ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr); 2300e2ec84fSDave May N = N/bs; 2310e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr); 2320e2ec84fSDave May if (!vecname) { 2330e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr); 2340e2ec84fSDave May } else { 2350e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 2360e2ec84fSDave May } 2370e2ec84fSDave May 2380e2ec84fSDave May /* write data header */ 23916d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 24016d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 24116d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2420e2ec84fSDave May if (bs == 1) { 24316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 2440e2ec84fSDave May } else { 24516d0e248SBarry 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); 2460e2ec84fSDave May } 24716d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2483249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 24916d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 25016d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 25116d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 25216d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 25316d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2540e2ec84fSDave May 2550e2ec84fSDave May /* write data */ 2560e2ec84fSDave May ierr = VecView(x,fviewer);CHKERRQ(ierr); 2570e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2580e2ec84fSDave May 2590e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 2600e2ec84fSDave May PetscFunctionReturn(0); 2610e2ec84fSDave May } 2620e2ec84fSDave May 263c14f9142SDave May PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer) 264c14f9142SDave May { 265c14f9142SDave May long int *bytes = NULL; 266c14f9142SDave May PetscContainer container = NULL; 267c14f9142SDave May const char *viewername; 268c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 2693249a2ebSMara Arts char *datafilename; 270c14f9142SDave May PetscViewer fviewer; 271c14f9142SDave May PetscInt N,bs; 272c14f9142SDave May const char *vecname; 273c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 274c14f9142SDave May PetscErrorCode ierr; 275c14f9142SDave May 276c14f9142SDave May PetscFunctionBegin; 277c14f9142SDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 278*5627991aSBarry Smith if (!container) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Unable to find attached data XDMFViewerContext"); 279c14f9142SDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 280c14f9142SDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 281c14f9142SDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 282c14f9142SDave May 283c14f9142SDave May /* re-open a sub-viewer for all data fields */ 284c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 285c14f9142SDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 286c14f9142SDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 287c14f9142SDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 288c14f9142SDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 289c14f9142SDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 290c14f9142SDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 2913249a2ebSMara Arts ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 292c14f9142SDave May 293c14f9142SDave May ierr = ISGetSize(is,&N);CHKERRQ(ierr); 294c14f9142SDave May ierr = ISGetBlockSize(is,&bs);CHKERRQ(ierr); 295c14f9142SDave May N = N/bs; 296c14f9142SDave May ierr = PetscObjectGetName((PetscObject)is,&vecname);CHKERRQ(ierr); 297c14f9142SDave May if (!vecname) { 298c14f9142SDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag);CHKERRQ(ierr); 299c14f9142SDave May } else { 300c14f9142SDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 301c14f9142SDave May } 302c14f9142SDave May 303c14f9142SDave May /* write data header */ 30416d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 30516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 30616d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 307c14f9142SDave May if (bs == 1) { 30816d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 309c14f9142SDave May } else { 31016d0e248SBarry 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); 311c14f9142SDave May } 31216d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 3133249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 31416d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 31516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 31616d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 31716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 31816d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 319c14f9142SDave May 320c14f9142SDave May /* write data */ 321c14f9142SDave May ierr = ISView(is,fviewer);CHKERRQ(ierr); 322c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 323c14f9142SDave May 324c14f9142SDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 325c14f9142SDave May PetscFunctionReturn(0); 326c14f9142SDave May } 327c14f9142SDave May 328acf7c82dSDave May /*@C 329acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 330acf7c82dSDave May 331d083f849SBarry Smith Collective on dm 332acf7c82dSDave May 333acf7c82dSDave May Input parameters: 334acf7c82dSDave May + dm - the DMSwarm 335acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 336acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 337acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 338acf7c82dSDave May 339acf7c82dSDave May Level: beginner 340acf7c82dSDave May 341acf7c82dSDave May Notes: 342ea3d7275SDave May Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file 343acf7c82dSDave May 344acf7c82dSDave May .seealso: DMSwarmViewXDMF() 345acf7c82dSDave May @*/ 3460e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 3470e2ec84fSDave May { 3480e2ec84fSDave May PetscErrorCode ierr; 3490e2ec84fSDave May Vec dvec; 350c14f9142SDave May PetscInt f,N; 3510e2ec84fSDave May PetscViewer viewer; 3520e2ec84fSDave May 3530e2ec84fSDave May PetscFunctionBegin; 3540e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 3550e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 356c14f9142SDave May ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 3570e2ec84fSDave May for (f=0; f<nfields; f++) { 358c14f9142SDave May void *data; 359c14f9142SDave May PetscDataType type; 360c14f9142SDave May 361c14f9142SDave May ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 362c14f9142SDave May ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 363c14f9142SDave May if (type == PETSC_DOUBLE) { 3640e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 3650e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr); 3660e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 3670e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 368c14f9142SDave May } else if (type == PETSC_INT) { 369c14f9142SDave May IS is; 370c14f9142SDave May const PetscInt *idx; 371c14f9142SDave May 372c14f9142SDave May ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 373c14f9142SDave May idx = (const PetscInt*)data; 374c14f9142SDave May 375c14f9142SDave May ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 376c14f9142SDave May ierr = PetscObjectSetName((PetscObject)is,field_name_list[f]);CHKERRQ(ierr); 377c14f9142SDave May ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 378c14f9142SDave May ierr = ISDestroy(&is);CHKERRQ(ierr); 379c14f9142SDave May ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 380c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE"); 381c14f9142SDave May 3820e2ec84fSDave May } 3830e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 3840e2ec84fSDave May PetscFunctionReturn(0); 3850e2ec84fSDave May } 3860e2ec84fSDave May 387acf7c82dSDave May /*@C 388acf7c82dSDave May DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 389acf7c82dSDave May 390d083f849SBarry Smith Collective on dm 391acf7c82dSDave May 392acf7c82dSDave May Input parameters: 393acf7c82dSDave May + dm - the DMSwarm 394acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 395acf7c82dSDave May 396acf7c82dSDave May Level: beginner 397acf7c82dSDave May 398acf7c82dSDave May Notes: 399ea3d7275SDave May Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file 400acf7c82dSDave May 401*5627991aSBarry Smith Developer Notes: 402*5627991aSBarry Smith This should be removed and replaced with the standard use of PetscViewer 403*5627991aSBarry Smith 404acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF() 405acf7c82dSDave May @*/ 4060e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 4070e2ec84fSDave May { 4080e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4090e2ec84fSDave May PetscErrorCode ierr; 4100e2ec84fSDave May Vec dvec; 4110e2ec84fSDave May PetscInt f; 4120e2ec84fSDave May PetscViewer viewer; 4130e2ec84fSDave May 4140e2ec84fSDave May PetscFunctionBegin; 4150e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 4160e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 4170e2ec84fSDave May for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 41877048351SPatrick Sanan DMSwarmDataField field; 4190e2ec84fSDave May 4200e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4210e2ec84fSDave May field = swarm->db->field[f]; 422c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4230e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 4240e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr); 4250e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 4260e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 427c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 428c14f9142SDave May IS is; 429c14f9142SDave May PetscInt N; 430c14f9142SDave May const PetscInt *idx; 431c14f9142SDave May void *data; 432c14f9142SDave May 433c14f9142SDave May ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 434c14f9142SDave May ierr = DMSwarmGetField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 435c14f9142SDave May idx = (const PetscInt*)data; 436c14f9142SDave May 437c14f9142SDave May ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 438c14f9142SDave May ierr = PetscObjectSetName((PetscObject)is,field->name);CHKERRQ(ierr); 439c14f9142SDave May ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 440c14f9142SDave May ierr = ISDestroy(&is);CHKERRQ(ierr); 441c14f9142SDave May ierr = DMSwarmRestoreField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 442c14f9142SDave May } 4430e2ec84fSDave May } 4440e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 4450e2ec84fSDave May PetscFunctionReturn(0); 4460e2ec84fSDave May } 447