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]; 97*3249a2ebSMara Arts char *datafilename; 980e2ec84fSDave May PetscViewer fviewer; 990e2ec84fSDave May PetscInt k,ng,dim; 1000e2ec84fSDave May Vec dvec; 1010e2ec84fSDave May long int *bytes = NULL; 1020e2ec84fSDave May PetscContainer container = NULL; 1030e2ec84fSDave May const char *dmname; 1040e2ec84fSDave May PetscErrorCode ierr; 1050e2ec84fSDave May 1060e2ec84fSDave May PetscFunctionBegin; 1070e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 1080e2ec84fSDave May if (container) { 1090e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 1100e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 1110e2ec84fSDave May 1120e2ec84fSDave May ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr); 1130e2ec84fSDave May if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 1140e2ec84fSDave May 1150e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr); 1160e2ec84fSDave May 11716d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1180e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr); 1190e2ec84fSDave May if (!dmname) { 1200e2ec84fSDave May ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr); 1210e2ec84fSDave May } 1220e2ec84fSDave May if (!dmname) { 12316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");CHKERRQ(ierr); 1240e2ec84fSDave May } else { 12516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);CHKERRQ(ierr); 1260e2ec84fSDave May } 1270e2ec84fSDave May 1280e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1290e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1300e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 1310e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 1320e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1330e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1340e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr); 1350e2ec84fSDave May 1360e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 1370e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 1380e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 139*3249a2ebSMara Arts ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 1400e2ec84fSDave May 1410e2ec84fSDave May ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr); 1420e2ec84fSDave May 1430e2ec84fSDave May /* write topology header */ 14416d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);CHKERRQ(ierr); 14616d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 14716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);CHKERRQ(ierr); 14816d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 149*3249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 15016d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 15116d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 15216d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 15316d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Topology>\n");CHKERRQ(ierr); 15416d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1550e2ec84fSDave May 1560e2ec84fSDave May /* write topology data */ 1570e2ec84fSDave May for (k=0; k<ng; k++) { 1580e2ec84fSDave May PetscInt pvertex[3]; 1590e2ec84fSDave May 1600e2ec84fSDave May pvertex[0] = 1; 1610e2ec84fSDave May pvertex[1] = 1; 1620e2ec84fSDave May pvertex[2] = k; 163f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT);CHKERRQ(ierr); 1640e2ec84fSDave May } 1650e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 1660e2ec84fSDave May 1670e2ec84fSDave May /* write geometry header */ 16816d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1690e2ec84fSDave May ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 1700e2ec84fSDave May switch (dim) { 1710e2ec84fSDave May case 1: 1720e2ec84fSDave May SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D"); 1730e2ec84fSDave May break; 1740e2ec84fSDave May case 2: 17516d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");CHKERRQ(ierr); 1760e2ec84fSDave May break; 1770e2ec84fSDave May case 3: 17816d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");CHKERRQ(ierr); 1790e2ec84fSDave May break; 1800e2ec84fSDave May } 18116d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 18216d0e248SBarry 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); 18316d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 184*3249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 18516d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 18616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 18716d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 18816d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Geometry>\n");CHKERRQ(ierr); 18916d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1900e2ec84fSDave May 1910e2ec84fSDave May /* write geometry data */ 1920e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1930e2ec84fSDave May ierr = VecView(dvec,fviewer);CHKERRQ(ierr); 1940e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1950e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1960e2ec84fSDave May 1970e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 1980e2ec84fSDave May 1990e2ec84fSDave May PetscFunctionReturn(0); 2000e2ec84fSDave May } 2010e2ec84fSDave May 2020e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 2030e2ec84fSDave May { 2040e2ec84fSDave May long int *bytes = NULL; 2050e2ec84fSDave May PetscContainer container = NULL; 2060e2ec84fSDave May const char *viewername; 2070e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 208*3249a2ebSMara Arts char *datafilename; 2090e2ec84fSDave May PetscViewer fviewer; 2100e2ec84fSDave May PetscInt N,bs; 2110e2ec84fSDave May const char *vecname; 2120e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 2130e2ec84fSDave May PetscErrorCode ierr; 2140e2ec84fSDave May 2150e2ec84fSDave May PetscFunctionBegin; 2160e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 2170e2ec84fSDave May if (container) { 2180e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 2190e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 2200e2ec84fSDave May 2210e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 2220e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 2230e2ec84fSDave May 2240e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2250e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2260e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 2270e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 2280e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2290e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2300e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 2310e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 232*3249a2ebSMara Arts ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 2330e2ec84fSDave May 2340e2ec84fSDave May ierr = VecGetSize(x,&N);CHKERRQ(ierr); 2350e2ec84fSDave May ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr); 2360e2ec84fSDave May N = N/bs; 2370e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr); 2380e2ec84fSDave May if (!vecname) { 2390e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr); 2400e2ec84fSDave May } else { 2410e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 2420e2ec84fSDave May } 2430e2ec84fSDave May 2440e2ec84fSDave May /* write data header */ 24516d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 24616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 24716d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 2480e2ec84fSDave May if (bs == 1) { 24916d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 2500e2ec84fSDave May } else { 25116d0e248SBarry 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); 2520e2ec84fSDave May } 25316d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 254*3249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 25516d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 25616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 25716d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 25816d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 25916d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 2600e2ec84fSDave May 2610e2ec84fSDave May /* write data */ 2620e2ec84fSDave May ierr = VecView(x,fviewer);CHKERRQ(ierr); 2630e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 2640e2ec84fSDave May 2650e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 2660e2ec84fSDave May 2670e2ec84fSDave May PetscFunctionReturn(0); 2680e2ec84fSDave May } 2690e2ec84fSDave May 270c14f9142SDave May PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer) 271c14f9142SDave May { 272c14f9142SDave May long int *bytes = NULL; 273c14f9142SDave May PetscContainer container = NULL; 274c14f9142SDave May const char *viewername; 275c14f9142SDave May char datafile[PETSC_MAX_PATH_LEN]; 276*3249a2ebSMara Arts char *datafilename; 277c14f9142SDave May PetscViewer fviewer; 278c14f9142SDave May PetscInt N,bs; 279c14f9142SDave May const char *vecname; 280c14f9142SDave May char fieldname[PETSC_MAX_PATH_LEN]; 281c14f9142SDave May PetscErrorCode ierr; 282c14f9142SDave May 283c14f9142SDave May PetscFunctionBegin; 284c14f9142SDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 285c14f9142SDave May if (container) { 286c14f9142SDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 287c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 288c14f9142SDave May 289c14f9142SDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 290c14f9142SDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 291c14f9142SDave May 292c14f9142SDave May /* re-open a sub-viewer for all data fields */ 293c14f9142SDave May /* name is viewer.name + "_swarm_fields.pbin" */ 294c14f9142SDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 295c14f9142SDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 296c14f9142SDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 297c14f9142SDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 298c14f9142SDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 299c14f9142SDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 300*3249a2ebSMara Arts ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 301c14f9142SDave May 302c14f9142SDave May ierr = ISGetSize(is,&N);CHKERRQ(ierr); 303c14f9142SDave May ierr = ISGetBlockSize(is,&bs);CHKERRQ(ierr); 304c14f9142SDave May N = N/bs; 305c14f9142SDave May ierr = PetscObjectGetName((PetscObject)is,&vecname);CHKERRQ(ierr); 306c14f9142SDave May if (!vecname) { 307c14f9142SDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag);CHKERRQ(ierr); 308c14f9142SDave May } else { 309c14f9142SDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 310c14f9142SDave May } 311c14f9142SDave May 312c14f9142SDave May /* write data header */ 31316d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 31416d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 31516d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 316c14f9142SDave May if (bs == 1) { 31716d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 318c14f9142SDave May } else { 31916d0e248SBarry 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); 320c14f9142SDave May } 32116d0e248SBarry Smith ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 322*3249a2ebSMara Arts ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 32316d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 32416d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 32516d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 32616d0e248SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 32716d0e248SBarry Smith ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 328c14f9142SDave May 329c14f9142SDave May /* write data */ 330c14f9142SDave May ierr = ISView(is,fviewer);CHKERRQ(ierr); 331c14f9142SDave May bytes[0] += sizeof(PetscInt) * N * bs; 332c14f9142SDave May 333c14f9142SDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 334c14f9142SDave May 335c14f9142SDave May PetscFunctionReturn(0); 336c14f9142SDave May } 337c14f9142SDave May 338acf7c82dSDave May /*@C 339acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 340acf7c82dSDave May 341d083f849SBarry Smith Collective on dm 342acf7c82dSDave May 343acf7c82dSDave May Input parameters: 344acf7c82dSDave May + dm - the DMSwarm 345acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 346acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 347acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 348acf7c82dSDave May 349acf7c82dSDave May Level: beginner 350acf7c82dSDave May 351acf7c82dSDave May Notes: 352ea3d7275SDave May Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file 353acf7c82dSDave May 354acf7c82dSDave May .seealso: DMSwarmViewXDMF() 355acf7c82dSDave May @*/ 3560e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 3570e2ec84fSDave May { 3580e2ec84fSDave May PetscErrorCode ierr; 3590e2ec84fSDave May Vec dvec; 360c14f9142SDave May PetscInt f,N; 3610e2ec84fSDave May PetscViewer viewer; 3620e2ec84fSDave May 3630e2ec84fSDave May PetscFunctionBegin; 3640e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 3650e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 366c14f9142SDave May ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 3670e2ec84fSDave May for (f=0; f<nfields; f++) { 368c14f9142SDave May void *data; 369c14f9142SDave May PetscDataType type; 370c14f9142SDave May 371c14f9142SDave May ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 372c14f9142SDave May ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 373c14f9142SDave May 374c14f9142SDave May if (type == PETSC_DOUBLE) { 3750e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 3760e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr); 3770e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 3780e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 379c14f9142SDave May } else if (type == PETSC_INT) { 380c14f9142SDave May IS is; 381c14f9142SDave May const PetscInt *idx; 382c14f9142SDave May 383c14f9142SDave May ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 384c14f9142SDave May idx = (const PetscInt*)data; 385c14f9142SDave May 386c14f9142SDave May ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 387c14f9142SDave May ierr = PetscObjectSetName((PetscObject)is,field_name_list[f]);CHKERRQ(ierr); 388c14f9142SDave May ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 389c14f9142SDave May ierr = ISDestroy(&is);CHKERRQ(ierr); 390c14f9142SDave May ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 391c14f9142SDave May } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE"); 392c14f9142SDave May 3930e2ec84fSDave May } 3940e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 3950e2ec84fSDave May PetscFunctionReturn(0); 3960e2ec84fSDave May } 3970e2ec84fSDave May 398acf7c82dSDave May /*@C 399acf7c82dSDave May DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 400acf7c82dSDave May 401d083f849SBarry Smith Collective on dm 402acf7c82dSDave May 403acf7c82dSDave May Input parameters: 404acf7c82dSDave May + dm - the DMSwarm 405acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 406acf7c82dSDave May 407acf7c82dSDave May Level: beginner 408acf7c82dSDave May 409acf7c82dSDave May Notes: 410ea3d7275SDave May Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file 411acf7c82dSDave May 412acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF() 413acf7c82dSDave May @*/ 4140e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 4150e2ec84fSDave May { 4160e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 4170e2ec84fSDave May PetscErrorCode ierr; 4180e2ec84fSDave May Vec dvec; 4190e2ec84fSDave May PetscInt f; 4200e2ec84fSDave May PetscViewer viewer; 4210e2ec84fSDave May 4220e2ec84fSDave May PetscFunctionBegin; 4230e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 4240e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 4250e2ec84fSDave May for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 42677048351SPatrick Sanan DMSwarmDataField field; 4270e2ec84fSDave May 4280e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 4290e2ec84fSDave May field = swarm->db->field[f]; 430c14f9142SDave May if (field->petsc_type == PETSC_DOUBLE) { 4310e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 4320e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr); 4330e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 4340e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 435c14f9142SDave May } else if (field->petsc_type == PETSC_INT) { 436c14f9142SDave May IS is; 437c14f9142SDave May PetscInt N; 438c14f9142SDave May const PetscInt *idx; 439c14f9142SDave May void *data; 440c14f9142SDave May 441c14f9142SDave May ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 442c14f9142SDave May ierr = DMSwarmGetField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 443c14f9142SDave May idx = (const PetscInt*)data; 444c14f9142SDave May 445c14f9142SDave May ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 446c14f9142SDave May ierr = PetscObjectSetName((PetscObject)is,field->name);CHKERRQ(ierr); 447c14f9142SDave May ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 448c14f9142SDave May ierr = ISDestroy(&is);CHKERRQ(ierr); 449c14f9142SDave May ierr = DMSwarmRestoreField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 450c14f9142SDave May } 4510e2ec84fSDave May } 4520e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 4530e2ec84fSDave May PetscFunctionReturn(0); 4540e2ec84fSDave May } 455