1*0e2ec84fSDave May 2*0e2ec84fSDave May #include <petsc.h> 3*0e2ec84fSDave May #include <petscdm.h> 4*0e2ec84fSDave May #include <petscdmda.h> 5*0e2ec84fSDave May #include <petscdmswarm.h> 6*0e2ec84fSDave May #include <petsc/private/dmswarmimpl.h> 7*0e2ec84fSDave May #include "data_bucket.h" 8*0e2ec84fSDave May 9*0e2ec84fSDave May PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v) 10*0e2ec84fSDave May { 11*0e2ec84fSDave May long int *bytes; 12*0e2ec84fSDave May PetscContainer container; 13*0e2ec84fSDave May PetscViewer viewer; 14*0e2ec84fSDave May PetscErrorCode ierr; 15*0e2ec84fSDave May 16*0e2ec84fSDave May PetscFunctionBegin; 17*0e2ec84fSDave May ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr); 18*0e2ec84fSDave May ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 19*0e2ec84fSDave May ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 20*0e2ec84fSDave May ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr); 21*0e2ec84fSDave May 22*0e2ec84fSDave May ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr); 23*0e2ec84fSDave May bytes[0] = 0; 24*0e2ec84fSDave May ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr); 25*0e2ec84fSDave May ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr); 26*0e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr); 27*0e2ec84fSDave May 28*0e2ec84fSDave May /* write xdmf header */ 29*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); 30*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude\" Version=\"2.99\">\n"); 31*0e2ec84fSDave May /* write xdmf domain */ 32*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 33*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Domain>\n"); 34*0e2ec84fSDave May *v = viewer; 35*0e2ec84fSDave May PetscFunctionReturn(0); 36*0e2ec84fSDave May } 37*0e2ec84fSDave May 38*0e2ec84fSDave May PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) 39*0e2ec84fSDave May { 40*0e2ec84fSDave May PetscViewer viewer; 41*0e2ec84fSDave May DM dm = NULL; 42*0e2ec84fSDave May long int *bytes; 43*0e2ec84fSDave May PetscContainer container = NULL; 44*0e2ec84fSDave May PetscErrorCode ierr; 45*0e2ec84fSDave May 46*0e2ec84fSDave May PetscFunctionBegin; 47*0e2ec84fSDave May if (!v) PetscFunctionReturn(0); 48*0e2ec84fSDave May viewer = *v; 49*0e2ec84fSDave May 50*0e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr); 51*0e2ec84fSDave May if (dm) { 52*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Grid>\n"); 53*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 54*0e2ec84fSDave May } 55*0e2ec84fSDave May 56*0e2ec84fSDave May /* close xdmf header */ 57*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Domain>\n"); 58*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 59*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Xdmf>\n"); 60*0e2ec84fSDave May 61*0e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 62*0e2ec84fSDave May if (container) { 63*0e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 64*0e2ec84fSDave May ierr = PetscFree(bytes);CHKERRQ(ierr); 65*0e2ec84fSDave May ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 66*0e2ec84fSDave May } 67*0e2ec84fSDave May 68*0e2ec84fSDave May ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 69*0e2ec84fSDave May *v = NULL; 70*0e2ec84fSDave May PetscFunctionReturn(0); 71*0e2ec84fSDave May } 72*0e2ec84fSDave May 73*0e2ec84fSDave May PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[]) 74*0e2ec84fSDave May { 75*0e2ec84fSDave May char *ext; 76*0e2ec84fSDave May PetscBool flg; 77*0e2ec84fSDave May PetscErrorCode ierr; 78*0e2ec84fSDave May 79*0e2ec84fSDave May PetscFunctionBegin; 80*0e2ec84fSDave May ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr); 81*0e2ec84fSDave May ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr); 82*0e2ec84fSDave May if (flg) { 83*0e2ec84fSDave May size_t len; 84*0e2ec84fSDave May char viewername_minus_ext[PETSC_MAX_PATH_LEN]; 85*0e2ec84fSDave May 86*0e2ec84fSDave May ierr = PetscStrlen(filename,&len);CHKERRQ(ierr); 87*0e2ec84fSDave May ierr = PetscSNPrintf(viewername_minus_ext,len-3,"%s",filename);CHKERRQ(ierr); 88*0e2ec84fSDave May ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr); 89*0e2ec84fSDave May } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf"); 90*0e2ec84fSDave May 91*0e2ec84fSDave May PetscFunctionReturn(0); 92*0e2ec84fSDave May } 93*0e2ec84fSDave May 94*0e2ec84fSDave May PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer) 95*0e2ec84fSDave May { 96*0e2ec84fSDave May PetscBool isswarm = PETSC_FALSE; 97*0e2ec84fSDave May const char *viewername; 98*0e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 99*0e2ec84fSDave May PetscViewer fviewer; 100*0e2ec84fSDave May PetscInt k,ng,dim; 101*0e2ec84fSDave May Vec dvec; 102*0e2ec84fSDave May long int *bytes = NULL; 103*0e2ec84fSDave May PetscContainer container = NULL; 104*0e2ec84fSDave May const char *dmname; 105*0e2ec84fSDave May PetscErrorCode ierr; 106*0e2ec84fSDave May 107*0e2ec84fSDave May PetscFunctionBegin; 108*0e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 109*0e2ec84fSDave May if (container) { 110*0e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 111*0e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 112*0e2ec84fSDave May 113*0e2ec84fSDave May ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr); 114*0e2ec84fSDave May if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 115*0e2ec84fSDave May 116*0e2ec84fSDave May ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr); 117*0e2ec84fSDave May 118*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 119*0e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr); 120*0e2ec84fSDave May if (!dmname) { 121*0e2ec84fSDave May ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr); 122*0e2ec84fSDave May } 123*0e2ec84fSDave May if (!dmname) { 124*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n"); 125*0e2ec84fSDave May } else { 126*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname); 127*0e2ec84fSDave May } 128*0e2ec84fSDave May 129*0e2ec84fSDave May /* create a sub-viewer for topology, geometry and all data fields */ 130*0e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 131*0e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 132*0e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 133*0e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 134*0e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 135*0e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr); 136*0e2ec84fSDave May 137*0e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 138*0e2ec84fSDave May //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr); 139*0e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 140*0e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 141*0e2ec84fSDave May 142*0e2ec84fSDave May ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr); 143*0e2ec84fSDave May 144*0e2ec84fSDave May /* write topology header */ 145*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 146*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng); 147*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 148*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]); 149*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 150*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"%s\n",datafile); 151*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 152*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</DataItem>\n"); 153*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 154*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Topology>\n"); 155*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 156*0e2ec84fSDave May 157*0e2ec84fSDave May /* write topology data */ 158*0e2ec84fSDave May for (k=0; k<ng; k++) { 159*0e2ec84fSDave May PetscInt pvertex[3]; 160*0e2ec84fSDave May 161*0e2ec84fSDave May pvertex[0] = 1; 162*0e2ec84fSDave May pvertex[1] = 1; 163*0e2ec84fSDave May pvertex[2] = k; 164*0e2ec84fSDave May ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 165*0e2ec84fSDave May } 166*0e2ec84fSDave May bytes[0] += sizeof(PetscInt) * ng * 3; 167*0e2ec84fSDave May 168*0e2ec84fSDave May /* write geometry header */ 169*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 170*0e2ec84fSDave May ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 171*0e2ec84fSDave May switch (dim) { 172*0e2ec84fSDave May case 1: 173*0e2ec84fSDave May SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D"); 174*0e2ec84fSDave May break; 175*0e2ec84fSDave May case 2: 176*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n"); 177*0e2ec84fSDave May break; 178*0e2ec84fSDave May case 3: 179*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n"); 180*0e2ec84fSDave May break; 181*0e2ec84fSDave May } 182*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 183*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]); 184*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 185*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"%s\n",datafile); 186*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 187*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</DataItem>\n"); 188*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 189*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Geometry>\n"); 190*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 191*0e2ec84fSDave May 192*0e2ec84fSDave May /* write geometry data */ 193*0e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 194*0e2ec84fSDave May ierr = VecView(dvec,fviewer);CHKERRQ(ierr); 195*0e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 196*0e2ec84fSDave May bytes[0] += sizeof(PetscReal) * ng * dim; 197*0e2ec84fSDave May 198*0e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 199*0e2ec84fSDave May 200*0e2ec84fSDave May PetscFunctionReturn(0); 201*0e2ec84fSDave May } 202*0e2ec84fSDave May 203*0e2ec84fSDave May PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 204*0e2ec84fSDave May { 205*0e2ec84fSDave May long int *bytes = NULL; 206*0e2ec84fSDave May PetscContainer container = NULL; 207*0e2ec84fSDave May const char *viewername; 208*0e2ec84fSDave May char datafile[PETSC_MAX_PATH_LEN]; 209*0e2ec84fSDave May PetscViewer fviewer; 210*0e2ec84fSDave May PetscInt N,bs; 211*0e2ec84fSDave May const char *vecname; 212*0e2ec84fSDave May char fieldname[PETSC_MAX_PATH_LEN]; 213*0e2ec84fSDave May PetscErrorCode ierr; 214*0e2ec84fSDave May 215*0e2ec84fSDave May PetscFunctionBegin; 216*0e2ec84fSDave May ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 217*0e2ec84fSDave May if (container) { 218*0e2ec84fSDave May ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 219*0e2ec84fSDave May } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 220*0e2ec84fSDave May 221*0e2ec84fSDave May ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 222*0e2ec84fSDave May //ierr = PetscSNPrintf(datafile,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername);CHKERRQ(ierr); 223*0e2ec84fSDave May ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 224*0e2ec84fSDave May 225*0e2ec84fSDave May /* re-open a sub-viewer for all data fields */ 226*0e2ec84fSDave May /* name is viewer.name + "_swarm_fields.pbin" */ 227*0e2ec84fSDave May ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 228*0e2ec84fSDave May ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 229*0e2ec84fSDave May ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 230*0e2ec84fSDave May ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 231*0e2ec84fSDave May ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 232*0e2ec84fSDave May ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 233*0e2ec84fSDave May 234*0e2ec84fSDave May ierr = VecGetSize(x,&N);CHKERRQ(ierr); 235*0e2ec84fSDave May ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr); 236*0e2ec84fSDave May N = N/bs; 237*0e2ec84fSDave May ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr); 238*0e2ec84fSDave May if (!vecname) { 239*0e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr); 240*0e2ec84fSDave May } else { 241*0e2ec84fSDave May ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 242*0e2ec84fSDave May } 243*0e2ec84fSDave May 244*0e2ec84fSDave May /* write data header */ 245*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 246*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname); 247*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 248*0e2ec84fSDave May if (bs == 1) { 249*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]); 250*0e2ec84fSDave May } else { 251*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]); 252*0e2ec84fSDave May } 253*0e2ec84fSDave May PetscViewerASCIIPushTab(viewer); 254*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"%s\n",datafile); 255*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 256*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</DataItem>\n"); 257*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 258*0e2ec84fSDave May PetscViewerASCIIPrintf(viewer,"</Attribute>\n"); 259*0e2ec84fSDave May PetscViewerASCIIPopTab(viewer); 260*0e2ec84fSDave May 261*0e2ec84fSDave May /* write data */ 262*0e2ec84fSDave May ierr = VecView(x,fviewer);CHKERRQ(ierr); 263*0e2ec84fSDave May bytes[0] += sizeof(PetscReal) * N * bs; 264*0e2ec84fSDave May 265*0e2ec84fSDave May ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 266*0e2ec84fSDave May 267*0e2ec84fSDave May PetscFunctionReturn(0); 268*0e2ec84fSDave May } 269*0e2ec84fSDave May 270*0e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 271*0e2ec84fSDave May { 272*0e2ec84fSDave May PetscErrorCode ierr; 273*0e2ec84fSDave May Vec dvec; 274*0e2ec84fSDave May PetscInt f; 275*0e2ec84fSDave May PetscViewer viewer; 276*0e2ec84fSDave May 277*0e2ec84fSDave May PetscFunctionBegin; 278*0e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 279*0e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 280*0e2ec84fSDave May for (f=0; f<nfields; f++) { 281*0e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 282*0e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr); 283*0e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 284*0e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 285*0e2ec84fSDave May } 286*0e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 287*0e2ec84fSDave May PetscFunctionReturn(0); 288*0e2ec84fSDave May } 289*0e2ec84fSDave May 290*0e2ec84fSDave May PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 291*0e2ec84fSDave May { 292*0e2ec84fSDave May DM_Swarm *swarm = (DM_Swarm*)dm->data; 293*0e2ec84fSDave May PetscErrorCode ierr; 294*0e2ec84fSDave May Vec dvec; 295*0e2ec84fSDave May PetscInt f; 296*0e2ec84fSDave May PetscViewer viewer; 297*0e2ec84fSDave May 298*0e2ec84fSDave May PetscFunctionBegin; 299*0e2ec84fSDave May ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 300*0e2ec84fSDave May ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 301*0e2ec84fSDave May for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 302*0e2ec84fSDave May DataField field; 303*0e2ec84fSDave May 304*0e2ec84fSDave May /* query field type - accept all those of type PETSC_DOUBLE */ 305*0e2ec84fSDave May field = swarm->db->field[f]; 306*0e2ec84fSDave May if (field->petsc_type != PETSC_DOUBLE) continue; 307*0e2ec84fSDave May 308*0e2ec84fSDave May ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 309*0e2ec84fSDave May ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr); 310*0e2ec84fSDave May ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 311*0e2ec84fSDave May ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 312*0e2ec84fSDave May } 313*0e2ec84fSDave May ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 314*0e2ec84fSDave May PetscFunctionReturn(0); 315*0e2ec84fSDave May } 316