1 #include <petscdm.h> 2 #include <petscdmda.h> 3 #include <petscdmswarm.h> 4 #include <petsc/private/dmswarmimpl.h> 5 #include "../src/dm/impls/swarm/data_bucket.h" 6 7 PetscErrorCode private_PetscViewerCreate_XDMF(MPI_Comm comm,const char filename[],PetscViewer *v) 8 { 9 long int *bytes; 10 PetscContainer container; 11 PetscViewer viewer; 12 PetscErrorCode ierr; 13 14 PetscFunctionBegin; 15 ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr); 16 ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 17 ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 18 ierr = PetscViewerFileSetName(viewer,filename);CHKERRQ(ierr); 19 20 ierr = PetscMalloc1(1,&bytes);CHKERRQ(ierr); 21 bytes[0] = 0; 22 ierr = PetscContainerCreate(comm,&container);CHKERRQ(ierr); 23 ierr = PetscContainerSetPointer(container,(void*)bytes);CHKERRQ(ierr); 24 ierr = PetscObjectCompose((PetscObject)viewer,"XDMFViewerContext",(PetscObject)container);CHKERRQ(ierr); 25 26 /* write xdmf header */ 27 ierr = PetscViewerASCIIPrintf(viewer,"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");CHKERRQ(ierr); 28 ierr = PetscViewerASCIIPrintf(viewer,"<Xdmf xmlns:xi=\"http://www.w3.org/2001/XInclude/\" Version=\"2.99\">\n");CHKERRQ(ierr); 29 /* write xdmf domain */ 30 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 31 ierr = PetscViewerASCIIPrintf(viewer,"<Domain>\n");CHKERRQ(ierr); 32 *v = viewer; 33 PetscFunctionReturn(0); 34 } 35 36 PetscErrorCode private_PetscViewerDestroy_XDMF(PetscViewer *v) 37 { 38 PetscViewer viewer; 39 DM dm = NULL; 40 long int *bytes; 41 PetscContainer container = NULL; 42 PetscErrorCode ierr; 43 44 PetscFunctionBegin; 45 if (!v) PetscFunctionReturn(0); 46 viewer = *v; 47 48 ierr = PetscObjectQuery((PetscObject)viewer,"DMSwarm",(PetscObject*)&dm);CHKERRQ(ierr); 49 if (dm) { 50 ierr = PetscViewerASCIIPrintf(viewer,"</Grid>\n");CHKERRQ(ierr); 51 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 52 } 53 54 /* close xdmf header */ 55 ierr = PetscViewerASCIIPrintf(viewer,"</Domain>\n");CHKERRQ(ierr); 56 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 57 ierr = PetscViewerASCIIPrintf(viewer,"</Xdmf>\n");CHKERRQ(ierr); 58 59 ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 60 if (container) { 61 ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 62 ierr = PetscFree(bytes);CHKERRQ(ierr); 63 ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 64 } 65 66 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 67 *v = NULL; 68 PetscFunctionReturn(0); 69 } 70 71 PetscErrorCode private_CreateDataFileNameXDMF(const char filename[],char dfilename[]) 72 { 73 char *ext; 74 PetscBool flg; 75 PetscErrorCode ierr; 76 77 PetscFunctionBegin; 78 ierr = PetscStrrchr(filename,'.',&ext);CHKERRQ(ierr); 79 ierr = PetscStrcmp("xmf",ext,&flg);CHKERRQ(ierr); 80 if (flg) { 81 size_t len; 82 char viewername_minus_ext[PETSC_MAX_PATH_LEN]; 83 84 ierr = PetscStrlen(filename,&len);CHKERRQ(ierr); 85 ierr = PetscStrncpy(viewername_minus_ext,filename,len-2);CHKERRQ(ierr); 86 ierr = PetscSNPrintf(dfilename,PETSC_MAX_PATH_LEN-1,"%s_swarm_fields.pbin",viewername_minus_ext);CHKERRQ(ierr); 87 } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"File extension must by .xmf"); 88 89 PetscFunctionReturn(0); 90 } 91 92 PetscErrorCode private_DMSwarmView_XDMF(DM dm,PetscViewer viewer) 93 { 94 PetscBool isswarm = PETSC_FALSE; 95 const char *viewername; 96 char datafile[PETSC_MAX_PATH_LEN]; 97 char *datafilename; 98 PetscViewer fviewer; 99 PetscInt k,ng,dim; 100 Vec dvec; 101 long int *bytes = NULL; 102 PetscContainer container = NULL; 103 const char *dmname; 104 PetscErrorCode ierr; 105 106 PetscFunctionBegin; 107 ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 108 if (container) { 109 ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 110 } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 111 112 ierr = PetscObjectTypeCompare((PetscObject)dm,DMSWARM,&isswarm);CHKERRQ(ierr); 113 if (!isswarm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only valid for DMSwarm"); 114 115 ierr = PetscObjectCompose((PetscObject)viewer,"DMSwarm",(PetscObject)dm);CHKERRQ(ierr); 116 117 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 118 ierr = PetscObjectGetName((PetscObject)dm,&dmname);CHKERRQ(ierr); 119 if (!dmname) { 120 ierr = DMGetOptionsPrefix(dm,&dmname);CHKERRQ(ierr); 121 } 122 if (!dmname) { 123 ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm\" GridType=\"Uniform\">\n");CHKERRQ(ierr); 124 } else { 125 ierr = PetscViewerASCIIPrintf(viewer,"<Grid Name=\"DMSwarm[%s]\" GridType=\"Uniform\">\n",dmname);CHKERRQ(ierr); 126 } 127 128 /* create a sub-viewer for topology, geometry and all data fields */ 129 /* name is viewer.name + "_swarm_fields.pbin" */ 130 ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 131 ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 132 ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 133 ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 134 ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_WRITE);CHKERRQ(ierr); 135 136 ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 137 ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 138 ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 139 ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 140 141 ierr = DMSwarmGetSize(dm,&ng);CHKERRQ(ierr); 142 143 /* write topology header */ 144 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 145 ierr = PetscViewerASCIIPrintf(viewer,"<Topology Dimensions=\"%D\" TopologyType=\"Mixed\">\n",ng);CHKERRQ(ierr); 146 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 147 ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Dimensions=\"%D\" Seek=\"%D\">\n",ng*3,bytes[0]);CHKERRQ(ierr); 148 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 149 ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 150 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 151 ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 152 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 153 ierr = PetscViewerASCIIPrintf(viewer,"</Topology>\n");CHKERRQ(ierr); 154 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 155 156 /* write topology data */ 157 for (k=0; k<ng; k++) { 158 PetscInt pvertex[3]; 159 160 pvertex[0] = 1; 161 pvertex[1] = 1; 162 pvertex[2] = k; 163 ierr = PetscViewerBinaryWrite(fviewer,pvertex,3,PETSC_INT);CHKERRQ(ierr); 164 } 165 bytes[0] += sizeof(PetscInt) * ng * 3; 166 167 /* write geometry header */ 168 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 169 ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr); 170 switch (dim) { 171 case 1: 172 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for 1D"); 173 break; 174 case 2: 175 ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XY\">\n");CHKERRQ(ierr); 176 break; 177 case 3: 178 ierr = PetscViewerASCIIPrintf(viewer,"<Geometry Type=\"XYZ\">\n");CHKERRQ(ierr); 179 break; 180 } 181 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 182 ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",ng,dim,bytes[0]);CHKERRQ(ierr); 183 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 184 ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 185 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 186 ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 187 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 188 ierr = PetscViewerASCIIPrintf(viewer,"</Geometry>\n");CHKERRQ(ierr); 189 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 190 191 /* write geometry data */ 192 ierr = DMSwarmCreateGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 193 ierr = VecView(dvec,fviewer);CHKERRQ(ierr); 194 ierr = DMSwarmDestroyGlobalVectorFromField(dm,DMSwarmPICField_coor,&dvec);CHKERRQ(ierr); 195 bytes[0] += sizeof(PetscReal) * ng * dim; 196 197 ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 198 199 PetscFunctionReturn(0); 200 } 201 202 PetscErrorCode private_VecView_Swarm_XDMF(Vec x,PetscViewer viewer) 203 { 204 long int *bytes = NULL; 205 PetscContainer container = NULL; 206 const char *viewername; 207 char datafile[PETSC_MAX_PATH_LEN]; 208 char *datafilename; 209 PetscViewer fviewer; 210 PetscInt N,bs; 211 const char *vecname; 212 char fieldname[PETSC_MAX_PATH_LEN]; 213 PetscErrorCode ierr; 214 215 PetscFunctionBegin; 216 ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 217 if (container) { 218 ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 219 } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 220 221 ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 222 ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 223 224 /* re-open a sub-viewer for all data fields */ 225 /* name is viewer.name + "_swarm_fields.pbin" */ 226 ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 227 ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 228 ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 229 ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 230 ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 231 ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 232 ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 233 234 ierr = VecGetSize(x,&N);CHKERRQ(ierr); 235 ierr = VecGetBlockSize(x,&bs);CHKERRQ(ierr); 236 N = N/bs; 237 ierr = PetscObjectGetName((PetscObject)x,&vecname);CHKERRQ(ierr); 238 if (!vecname) { 239 ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)x)->tag);CHKERRQ(ierr); 240 } else { 241 ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 242 } 243 244 /* write data header */ 245 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 246 ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 247 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 248 if (bs == 1) { 249 ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 250 } else { 251 ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Float\" Precision=\"8\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr); 252 } 253 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 254 ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 255 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 256 ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 257 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 258 ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 259 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 260 261 /* write data */ 262 ierr = VecView(x,fviewer);CHKERRQ(ierr); 263 bytes[0] += sizeof(PetscReal) * N * bs; 264 265 ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 266 267 PetscFunctionReturn(0); 268 } 269 270 PetscErrorCode private_ISView_Swarm_XDMF(IS is,PetscViewer viewer) 271 { 272 long int *bytes = NULL; 273 PetscContainer container = NULL; 274 const char *viewername; 275 char datafile[PETSC_MAX_PATH_LEN]; 276 char *datafilename; 277 PetscViewer fviewer; 278 PetscInt N,bs; 279 const char *vecname; 280 char fieldname[PETSC_MAX_PATH_LEN]; 281 PetscErrorCode ierr; 282 283 PetscFunctionBegin; 284 ierr = PetscObjectQuery((PetscObject)viewer,"XDMFViewerContext",(PetscObject*)&container);CHKERRQ(ierr); 285 if (container) { 286 ierr = PetscContainerGetPointer(container,(void**)&bytes);CHKERRQ(ierr); 287 } else SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Valid to find attached data XDMFViewerContext"); 288 289 ierr = PetscViewerFileGetName(viewer,&viewername);CHKERRQ(ierr); 290 ierr = private_CreateDataFileNameXDMF(viewername,datafile);CHKERRQ(ierr); 291 292 /* re-open a sub-viewer for all data fields */ 293 /* name is viewer.name + "_swarm_fields.pbin" */ 294 ierr = PetscViewerCreate(PetscObjectComm((PetscObject)viewer),&fviewer);CHKERRQ(ierr); 295 ierr = PetscViewerSetType(fviewer,PETSCVIEWERBINARY);CHKERRQ(ierr); 296 ierr = PetscViewerBinarySetSkipHeader(fviewer,PETSC_TRUE);CHKERRQ(ierr); 297 ierr = PetscViewerBinarySetSkipInfo(fviewer,PETSC_TRUE);CHKERRQ(ierr); 298 ierr = PetscViewerFileSetMode(fviewer,FILE_MODE_APPEND);CHKERRQ(ierr); 299 ierr = PetscViewerFileSetName(fviewer,datafile);CHKERRQ(ierr); 300 ierr = PetscStrrchr(datafile,'/',&datafilename);CHKERRQ(ierr); 301 302 ierr = ISGetSize(is,&N);CHKERRQ(ierr); 303 ierr = ISGetBlockSize(is,&bs);CHKERRQ(ierr); 304 N = N/bs; 305 ierr = PetscObjectGetName((PetscObject)is,&vecname);CHKERRQ(ierr); 306 if (!vecname) { 307 ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"swarmfield_%D",((PetscObject)is)->tag);CHKERRQ(ierr); 308 } else { 309 ierr = PetscSNPrintf(fieldname,PETSC_MAX_PATH_LEN-1,"%s",vecname);CHKERRQ(ierr); 310 } 311 312 /* write data header */ 313 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 314 ierr = PetscViewerASCIIPrintf(viewer,"<Attribute Center=\"Node\" Name=\"%s\" Type=\"None\">\n",fieldname);CHKERRQ(ierr); 315 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 316 if (bs == 1) { 317 ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D\" Seek=\"%D\">\n",N,bytes[0]);CHKERRQ(ierr); 318 } else { 319 ierr = PetscViewerASCIIPrintf(viewer,"<DataItem Format=\"Binary\" Endian=\"Big\" DataType=\"Int\" Precision=\"4\" Dimensions=\"%D %D\" Seek=\"%D\">\n",N,bs,bytes[0]);CHKERRQ(ierr); 320 } 321 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 322 ierr = PetscViewerASCIIPrintf(viewer,"%s\n",datafilename);CHKERRQ(ierr); 323 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 324 ierr = PetscViewerASCIIPrintf(viewer,"</DataItem>\n");CHKERRQ(ierr); 325 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 326 ierr = PetscViewerASCIIPrintf(viewer,"</Attribute>\n");CHKERRQ(ierr); 327 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 328 329 /* write data */ 330 ierr = ISView(is,fviewer);CHKERRQ(ierr); 331 bytes[0] += sizeof(PetscInt) * N * bs; 332 333 ierr = PetscViewerDestroy(&fviewer);CHKERRQ(ierr); 334 335 PetscFunctionReturn(0); 336 } 337 338 /*@C 339 DMSwarmViewFieldsXDMF - Write a selection of DMSwarm fields to an XDMF3 file 340 341 Collective on dm 342 343 Input parameters: 344 + dm - the DMSwarm 345 . filename - the file name of the XDMF file (must have the extension .xmf) 346 . nfields - the number of fields to write into the XDMF file 347 - field_name_list - array of length nfields containing the textual name of fields to write 348 349 Level: beginner 350 351 Notes: 352 Only fields registered with data type PETSC_DOUBLE or PETSC_INT can be written into the file 353 354 .seealso: DMSwarmViewXDMF() 355 @*/ 356 PETSC_EXTERN PetscErrorCode DMSwarmViewFieldsXDMF(DM dm,const char filename[],PetscInt nfields,const char *field_name_list[]) 357 { 358 PetscErrorCode ierr; 359 Vec dvec; 360 PetscInt f,N; 361 PetscViewer viewer; 362 363 PetscFunctionBegin; 364 ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 365 ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 366 ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 367 for (f=0; f<nfields; f++) { 368 void *data; 369 PetscDataType type; 370 371 ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 372 ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 373 374 if (type == PETSC_DOUBLE) { 375 ierr = DMSwarmCreateGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 376 ierr = PetscObjectSetName((PetscObject)dvec,field_name_list[f]);CHKERRQ(ierr); 377 ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 378 ierr = DMSwarmDestroyGlobalVectorFromField(dm,field_name_list[f],&dvec);CHKERRQ(ierr); 379 } else if (type == PETSC_INT) { 380 IS is; 381 const PetscInt *idx; 382 383 ierr = DMSwarmGetField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 384 idx = (const PetscInt*)data; 385 386 ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 387 ierr = PetscObjectSetName((PetscObject)is,field_name_list[f]);CHKERRQ(ierr); 388 ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 389 ierr = ISDestroy(&is);CHKERRQ(ierr); 390 ierr = DMSwarmRestoreField(dm,field_name_list[f],NULL,&type,&data);CHKERRQ(ierr); 391 } else SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Can only write PETSC_INT and PETSC_DOUBLE"); 392 393 } 394 ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 395 PetscFunctionReturn(0); 396 } 397 398 /*@C 399 DMSwarmViewXDMF - Write DMSwarm fields to an XDMF3 file 400 401 Collective on dm 402 403 Input parameters: 404 + dm - the DMSwarm 405 - filename - the file name of the XDMF file (must have the extension .xmf) 406 407 Level: beginner 408 409 Notes: 410 Only fields user registered with data type PETSC_DOUBLE or PETSC_INT will be written into the file 411 412 .seealso: DMSwarmViewFieldsXDMF() 413 @*/ 414 PETSC_EXTERN PetscErrorCode DMSwarmViewXDMF(DM dm,const char filename[]) 415 { 416 DM_Swarm *swarm = (DM_Swarm*)dm->data; 417 PetscErrorCode ierr; 418 Vec dvec; 419 PetscInt f; 420 PetscViewer viewer; 421 422 PetscFunctionBegin; 423 ierr = private_PetscViewerCreate_XDMF(PetscObjectComm((PetscObject)dm),filename,&viewer);CHKERRQ(ierr); 424 ierr = private_DMSwarmView_XDMF(dm,viewer);CHKERRQ(ierr); 425 for (f=4; f<swarm->db->nfields; f++) { /* only examine user defined fields - the first 4 are internally created by DMSwarmPIC */ 426 DMSwarmDataField field; 427 428 /* query field type - accept all those of type PETSC_DOUBLE */ 429 field = swarm->db->field[f]; 430 if (field->petsc_type == PETSC_DOUBLE) { 431 ierr = DMSwarmCreateGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 432 ierr = PetscObjectSetName((PetscObject)dvec,field->name);CHKERRQ(ierr); 433 ierr = private_VecView_Swarm_XDMF(dvec,viewer);CHKERRQ(ierr); 434 ierr = DMSwarmDestroyGlobalVectorFromField(dm,field->name,&dvec);CHKERRQ(ierr); 435 } else if (field->petsc_type == PETSC_INT) { 436 IS is; 437 PetscInt N; 438 const PetscInt *idx; 439 void *data; 440 441 ierr = DMSwarmGetLocalSize(dm,&N);CHKERRQ(ierr); 442 ierr = DMSwarmGetField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 443 idx = (const PetscInt*)data; 444 445 ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),N,idx,PETSC_USE_POINTER,&is);CHKERRQ(ierr); 446 ierr = PetscObjectSetName((PetscObject)is,field->name);CHKERRQ(ierr); 447 ierr = private_ISView_Swarm_XDMF(is,viewer);CHKERRQ(ierr); 448 ierr = ISDestroy(&is);CHKERRQ(ierr); 449 ierr = DMSwarmRestoreField(dm,field->name,NULL,NULL,&data);CHKERRQ(ierr); 450 } 451 } 452 ierr = private_PetscViewerDestroy_XDMF(&viewer);CHKERRQ(ierr); 453 PetscFunctionReturn(0); 454 } 455