10e2ec84fSDave May 20e2ec84fSDave May #include <petsc.h> 30e2ec84fSDave May #include <petscdm.h> 40e2ec84fSDave May #include <petscdmda.h> 50e2ec84fSDave May #include <petscdmswarm.h> 60e2ec84fSDave May #include <petsc/private/dmswarmimpl.h> 70e2ec84fSDave May #include "data_bucket.h" 80e2ec84fSDave May 90e2ec84fSDave May PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v) 100e2ec84fSDave May { 110e2ec84fSDave May long int *bytes; 120e2ec84fSDave May PetscContainer container; 130e2ec84fSDave May PetscViewer viewer; 140e2ec84fSDave May PetscErrorCode ierr; 150e2ec84fSDave May 160e2ec84fSDave May PetscFunctionBegin; 170e2ec84fSDave May ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr); 180e2ec84fSDave May ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 190e2ec84fSDave May ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 200e2ec84fSDave May ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr); 210e2ec84fSDave May 220e2ec84fSDave May ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr); 230e2ec84fSDave May bytes[0] = 0; 240e2ec84fSDave May ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr); 250e2ec84fSDave May ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr); 260e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr); 270e2ec84fSDave May 280e2ec84fSDave May /* write xdmf header */ 290e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); 300e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude\" Version=\"2.99\">\n"); 310e2ec84fSDave May /* write xdmf domain */ 320e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 330e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Domain>\n"); 340e2ec84fSDave May *v = viewer; 350e2ec84fSDave May PetscFunctionReturn(0); 360e2ec84fSDave May } 370e2ec84fSDave May 380e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) 390e2ec84fSDave May { 400e2ec84fSDave May PetscViewer viewer; 410e2ec84fSDave May DM dm = NULL; 420e2ec84fSDave May long int *bytes; 430e2ec84fSDave May PetscContainer container = NULL; 440e2ec84fSDave May PetscErrorCode ierr; 450e2ec84fSDave May 460e2ec84fSDave May PetscFunctionBegin; 470e2ec84fSDave May if (!v) PetscFunctionReturn(0); 480e2ec84fSDave May viewer = *v; 490e2ec84fSDave May 500e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr); 510e2ec84fSDave May if (dm) { 520e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Grid>\n"); 530e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 540e2ec84fSDave May } 550e2ec84fSDave May 560e2ec84fSDave May /* close xdmf header */ 570e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Domain>\n"); 580e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 590e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Xdmf>\n"); 600e2ec84fSDave May 610e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 620e2ec84fSDave May if (container) { 630e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 640e2ec84fSDave May ierr = PetscFree(bytes);CHKERRQ(ierr); 650e2ec84fSDave May ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 660e2ec84fSDave May } 670e2ec84fSDave May 680e2ec84fSDave May ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 690e2ec84fSDave May *v = NULL; 700e2ec84fSDave May PetscFunctionReturn(0); 710e2ec84fSDave May } 720e2ec84fSDave May 730e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[]) 740e2ec84fSDave May { 750e2ec84fSDave May char *ext; 760e2ec84fSDave May PetscBool flg; 770e2ec84fSDave May PetscErrorCode ierr; 780e2ec84fSDave May 790e2ec84fSDave May PetscFunctionBegin; 800e2ec84fSDave May ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr); 810e2ec84fSDave May ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr); 820e2ec84fSDave May if (flg) { 830e2ec84fSDave May size_t len; 840e2ec84fSDave May char viewername_minus_ext[PETSC_MAX_PATH_LEN]; 850e2ec84fSDave May 860e2ec84fSDave May ierr = PetscStrlen(filename,&len);CHKERRQ(ierr); 870e2ec84fSDave May ierr = PetscSNPrintf(viewername_minus_ext,len-3,"%s",filename);CHKERRQ(ierr); 880e2ec84fSDave May ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr); 890e2ec84fSDave May } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf"); 900e2ec84fSDave May 910e2ec84fSDave May PetscFunctionReturn(0); 920e2ec84fSDave May } 930e2ec84fSDave May 940e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer) 950e2ec84fSDave May { 960e2ec84fSDave May PetscBool isswarm = PETSC_FALSE; 970e2ec84fSDave May const char *viewername; 980e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 990e2ec84fSDave May PetscViewer fviewer; 1000e2ec84fSDave May PetscInt k,ng,dim; 1010e2ec84fSDave May Vec dvec; 1020e2ec84fSDave May long int *bytes = NULL; 1030e2ec84fSDave May PetscContainer container = NULL; 1040e2ec84fSDave May const char *dmname; 1050e2ec84fSDave May PetscErrorCode ierr; 1060e2ec84fSDave May 1070e2ec84fSDave May PetscFunctionBegin; 1080e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 1090e2ec84fSDave May if (container) { 1100e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 1110e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 1120e2ec84fSDave May 1130e2ec84fSDave May ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr); 1140e2ec84fSDave May if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 1150e2ec84fSDave May 1160e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr); 1170e2ec84fSDave May 1180e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1190e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr); 1200e2ec84fSDave May if (!dmname) { 1210e2ec84fSDave May ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr); 1220e2ec84fSDave May } 1230e2ec84fSDave May if (!dmname) { 1240e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n"); 1250e2ec84fSDave May } else { 1260e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname); 1270e2ec84fSDave May } 1280e2ec84fSDave May 1290e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 1300e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 1310e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 1320e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 1330e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1340e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 1350e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr); 1360e2ec84fSDave May 1370e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 1380e2ec84fSDave May //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr); 1390e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 1400e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 1410e2ec84fSDave May 1420e2ec84fSDave May ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr); 1430e2ec84fSDave May 1440e2ec84fSDave May /* write topology header */ 1450e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1460e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng); 1470e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1480e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]); 1490e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1500e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"%s\n",datafile); 1510e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 1520e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</DataItem>\n"); 1530e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 1540e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Topology>\n"); 1550e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 1560e2ec84fSDave May 1570e2ec84fSDave May /* write topology data */ 1580e2ec84fSDave May for (k=0; k<ng; k++) { 1590e2ec84fSDave May PetscInt pvertex[3]; 1600e2ec84fSDave May 1610e2ec84fSDave May pvertex[0] = 1; 1620e2ec84fSDave May pvertex[1] = 1; 1630e2ec84fSDave May pvertex[2] = k; 1640e2ec84fSDave May ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1650e2ec84fSDave May } 1660e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 1670e2ec84fSDave May 1680e2ec84fSDave May /* write geometry header */ 1690e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1700e2ec84fSDave May ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 1710e2ec84fSDave May switch (dim) { 1720e2ec84fSDave May case 1: 1730e2ec84fSDave May SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D"); 1740e2ec84fSDave May break; 1750e2ec84fSDave May case 2: 1760e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n"); 1770e2ec84fSDave May break; 1780e2ec84fSDave May case 3: 1790e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n"); 1800e2ec84fSDave May break; 1810e2ec84fSDave May } 1820e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1830e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]); 1840e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 1850e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"%s\n",datafile); 1860e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 1870e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</DataItem>\n"); 1880e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 1890e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Geometry>\n"); 1900e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 1910e2ec84fSDave May 1920e2ec84fSDave May /* write geometry data */ 1930e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1940e2ec84fSDave May ierr = VecView(dvec,fviewer);CHKERRQ(ierr); 1950e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 1960e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 1970e2ec84fSDave May 1980e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 1990e2ec84fSDave May 2000e2ec84fSDave May PetscFunctionReturn(0); 2010e2ec84fSDave May } 2020e2ec84fSDave May 2030e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 2040e2ec84fSDave May { 2050e2ec84fSDave May long int *bytes = NULL; 2060e2ec84fSDave May PetscContainer container = NULL; 2070e2ec84fSDave May const char *viewername; 2080e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 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 = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr); 2230e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 2240e2ec84fSDave May 2250e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 2260e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 2270e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 2280e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 2290e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2300e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 2310e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 2320e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);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 */ 2450e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 2460e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname); 2470e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 2480e2ec84fSDave May if (bs == 1) { 2490e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]); 2500e2ec84fSDave May } else { 2510e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]); 2520e2ec84fSDave May } 2530e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 2540e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"%s\n",datafile); 2550e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 2560e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</DataItem>\n"); 2570e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 2580e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Attribute>\n"); 2590e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 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 270*acf7c82dSDave May /*@C 271*acf7c82dSDave May DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 272*acf7c82dSDave May 273*acf7c82dSDave May Collective on DM 274*acf7c82dSDave May 275*acf7c82dSDave May Input parameters: 276*acf7c82dSDave May + dm - the DMSwarm 277*acf7c82dSDave May . filename - the file name of the XDMF file (must have the extension .xmf) 278*acf7c82dSDave May . nfields - the number of fields to write into the XDMF file 279*acf7c82dSDave May - field_name_list - array of length nfields containing the textual name of fields to write 280*acf7c82dSDave May 281*acf7c82dSDave May Level: beginner 282*acf7c82dSDave May 283*acf7c82dSDave May Notes: 284*acf7c82dSDave May Only fields registered with data type PETSC_REAL can be written into the file 285*acf7c82dSDave May 286*acf7c82dSDave May .seealso: DMSwarmViewXDMF() 287*acf7c82dSDave May @*/ 2880e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 2890e2ec84fSDave May { 2900e2ec84fSDave May PetscErrorCode ierr; 2910e2ec84fSDave May Vec dvec; 2920e2ec84fSDave May PetscInt f; 2930e2ec84fSDave May PetscViewer viewer; 2940e2ec84fSDave May 2950e2ec84fSDave May PetscFunctionBegin; 2960e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 2970e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 2980e2ec84fSDave May for (f=0; f<nfields; f++) { 2990e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 3000e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr); 3010e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 3020e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 3030e2ec84fSDave May } 3040e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 3050e2ec84fSDave May PetscFunctionReturn(0); 3060e2ec84fSDave May } 3070e2ec84fSDave May 308*acf7c82dSDave May /*@C 309*acf7c82dSDave May DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 310*acf7c82dSDave May 311*acf7c82dSDave May Collective on DM 312*acf7c82dSDave May 313*acf7c82dSDave May Input parameters: 314*acf7c82dSDave May + dm - the DMSwarm 315*acf7c82dSDave May - filename - the file name of the XDMF file (must have the extension .xmf) 316*acf7c82dSDave May 317*acf7c82dSDave May Level: beginner 318*acf7c82dSDave May 319*acf7c82dSDave May Notes: 320*acf7c82dSDave May Only fields registered with data type PETSC_REAL will be written into the file 321*acf7c82dSDave May 322*acf7c82dSDave May .seealso: DMSwarmViewFieldsXDMF() 323*acf7c82dSDave May @*/ 3240e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 3250e2ec84fSDave May { 3260e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 3270e2ec84fSDave May PetscErrorCode ierr; 3280e2ec84fSDave May Vec dvec; 3290e2ec84fSDave May PetscInt f; 3300e2ec84fSDave May PetscViewer viewer; 3310e2ec84fSDave May 3320e2ec84fSDave May PetscFunctionBegin; 3330e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 3340e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 3350e2ec84fSDave May for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 3360e2ec84fSDave May DataField field; 3370e2ec84fSDave May 3380e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 3390e2ec84fSDave May field = swarm->db->field[f]; 3400e2ec84fSDave May if (field->petsc_type != PETSC_DOUBLE) continue; 3410e2ec84fSDave May 3420e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 3430e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr); 3440e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 3450e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 3460e2ec84fSDave May } 3470e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 3480e2ec84fSDave May PetscFunctionReturn(0); 3490e2ec84fSDave May } 350