1 #include <../src/sys/classes/viewer/impls/vtk/vtkvimpl.h> /*I "petscviewer.h" I*/ 2 3 /*MC 4 PetscViewerVTKWriteFunction - functional form used to provide writer to the PetscViewerVTK 5 6 Synopsis: 7 #include <petscviewer.h> 8 PetscViewerVTKWriteFunction(PetscObject object,PetscViewer viewer) 9 10 Input Parameters: 11 + object - the PETSc object to be written 12 - viewer - viewer it is to be written to 13 14 Level: developer 15 16 .seealso: PetscViewerVTKAddField() 17 M*/ 18 19 /*@C 20 PetscViewerVTKAddField - Add a field to the viewer 21 22 Collective 23 24 Input Arguments: 25 + viewer - VTK viewer 26 . dm - DM on which Vec lives 27 . PetscViewerVTKWriteFunction - function to write this Vec 28 . fieldtype - Either PETSC_VTK_POINT_FIELD or PETSC_VTK_CELL_FIELD 29 - vec - Vec to write 30 31 Level: developer 32 33 Note: 34 This routine keeps exclusive ownership of the Vec. The caller should not use or destroy the Vec after adding it. 35 36 .seealso: PetscViewerVTKOpen(), DMDAVTKWriteAll(), PetscViewerVTKWriteFunction 37 @*/ 38 PetscErrorCode PetscViewerVTKAddField(PetscViewer viewer,PetscObject dm,PetscErrorCode (*PetscViewerVTKWriteFunction)(PetscObject,PetscViewer),PetscViewerVTKFieldType fieldtype,PetscObject vec) 39 { 40 PetscErrorCode ierr; 41 42 PetscFunctionBegin; 43 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 44 PetscValidHeader(dm,2); 45 PetscValidHeader(vec,4); 46 ierr = PetscUseMethod(viewer,"PetscViewerVTKAddField_C",(PetscViewer,PetscObject,PetscErrorCode (*)(PetscObject,PetscViewer),PetscViewerVTKFieldType,PetscObject),(viewer,dm,PetscViewerVTKWriteFunction,fieldtype,vec));CHKERRQ(ierr); 47 PetscFunctionReturn(0); 48 } 49 50 static PetscErrorCode PetscViewerDestroy_VTK(PetscViewer viewer) 51 { 52 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 53 PetscErrorCode ierr; 54 55 PetscFunctionBegin; 56 ierr = PetscFree(vtk->filename);CHKERRQ(ierr); 57 ierr = PetscFree(vtk);CHKERRQ(ierr); 58 ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",NULL);CHKERRQ(ierr); 59 ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",NULL);CHKERRQ(ierr); 60 ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",NULL);CHKERRQ(ierr); 61 ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",NULL);CHKERRQ(ierr); 62 ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerVTKAddField_C",NULL);CHKERRQ(ierr); 63 PetscFunctionReturn(0); 64 } 65 66 static PetscErrorCode PetscViewerFlush_VTK(PetscViewer viewer) 67 { 68 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 69 PetscErrorCode ierr; 70 PetscViewerVTKObjectLink link,next; 71 72 PetscFunctionBegin; 73 if (vtk->link && (!vtk->dm || !vtk->write)) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"No fields or no grid"); 74 if (vtk->write) {ierr = (*vtk->write)(vtk->dm,viewer);CHKERRQ(ierr);} 75 for (link=vtk->link; link; link=next) { 76 next = link->next; 77 ierr = PetscObjectDestroy(&link->vec);CHKERRQ(ierr); 78 ierr = PetscFree(link);CHKERRQ(ierr); 79 } 80 ierr = PetscObjectDestroy(&vtk->dm);CHKERRQ(ierr); 81 vtk->write = NULL; 82 PetscFunctionReturn(0); 83 } 84 85 PetscErrorCode PetscViewerFileSetName_VTK(PetscViewer viewer,const char name[]) 86 { 87 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 88 PetscErrorCode ierr; 89 PetscBool isvtk,isvts,isvtu,isvtr; 90 size_t len; 91 92 PetscFunctionBegin; 93 ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 94 ierr = PetscFree(vtk->filename);CHKERRQ(ierr); 95 ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 96 ierr = PetscStrcasecmp(name+len-4,".vtk",&isvtk);CHKERRQ(ierr); 97 ierr = PetscStrcasecmp(name+len-4,".vts",&isvts);CHKERRQ(ierr); 98 ierr = PetscStrcasecmp(name+len-4,".vtu",&isvtu);CHKERRQ(ierr); 99 ierr = PetscStrcasecmp(name+len-4,".vtr",&isvtr);CHKERRQ(ierr); 100 if (isvtk) { 101 if (viewer->format == PETSC_VIEWER_DEFAULT) viewer->format = PETSC_VIEWER_ASCII_VTK; 102 if (viewer->format != PETSC_VIEWER_ASCII_VTK) SETERRQ2(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vtk' extension",name,PetscViewerFormats[viewer->format]); 103 } else if (isvts) { 104 if (viewer->format == PETSC_VIEWER_DEFAULT) viewer->format = PETSC_VIEWER_VTK_VTS; 105 if (viewer->format != PETSC_VIEWER_VTK_VTS) SETERRQ2(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vts' extension",name,PetscViewerFormats[viewer->format]); 106 } else if (isvtu) { 107 if (viewer->format == PETSC_VIEWER_DEFAULT) viewer->format = PETSC_VIEWER_VTK_VTU; 108 if (viewer->format != PETSC_VIEWER_VTK_VTU) SETERRQ2(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vtu' extension",name,PetscViewerFormats[viewer->format]); 109 } else if (isvtr) { 110 if (viewer->format == PETSC_VIEWER_DEFAULT) viewer->format = PETSC_VIEWER_VTK_VTR; 111 if (viewer->format != PETSC_VIEWER_VTK_VTR) SETERRQ2(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_INCOMP,"Cannot use file '%s' with format %s, should have '.vtr' extension",name,PetscViewerFormats[viewer->format]); 112 } else SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_UNKNOWN_TYPE,"File '%s' has unrecognized extension",name); 113 ierr = PetscStrallocpy(name,&vtk->filename);CHKERRQ(ierr); 114 PetscFunctionReturn(0); 115 } 116 117 PetscErrorCode PetscViewerFileGetName_VTK(PetscViewer viewer,const char **name) 118 { 119 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 120 PetscFunctionBegin; 121 *name = vtk->filename; 122 PetscFunctionReturn(0); 123 } 124 125 PetscErrorCode PetscViewerFileSetMode_VTK(PetscViewer viewer,PetscFileMode type) 126 { 127 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 128 129 PetscFunctionBegin; 130 vtk->btype = type; 131 PetscFunctionReturn(0); 132 } 133 134 PetscErrorCode PetscViewerFileGetMode_VTK(PetscViewer viewer,PetscFileMode *type) 135 { 136 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 137 138 PetscFunctionBegin; 139 *type = vtk->btype; 140 PetscFunctionReturn(0); 141 } 142 143 PetscErrorCode PetscViewerVTKAddField_VTK(PetscViewer viewer,PetscObject dm,PetscErrorCode (*PetscViewerVTKWriteFunction)(PetscObject,PetscViewer),PetscViewerVTKFieldType fieldtype,PetscObject vec) 144 { 145 PetscViewer_VTK *vtk = (PetscViewer_VTK*)viewer->data; 146 PetscViewerVTKObjectLink link, tail = vtk->link; 147 PetscErrorCode ierr; 148 149 PetscFunctionBegin; 150 if (vtk->dm) { 151 if (dm != vtk->dm) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_INCOMP,"Cannot write a field from more than one grid to the same VTK file"); 152 } else { 153 ierr = PetscObjectReference(dm);CHKERRQ(ierr); 154 vtk->dm = dm; 155 } 156 vtk->write = PetscViewerVTKWriteFunction; 157 ierr = PetscNew(&link);CHKERRQ(ierr); 158 link->ft = fieldtype; 159 link->vec = vec; 160 link->next = NULL; 161 /* Append to list */ 162 if (tail) { 163 while (tail->next) tail = tail->next; 164 tail->next = link; 165 } else vtk->link = link; 166 PetscFunctionReturn(0); 167 } 168 169 /*MC 170 PETSCVIEWERVTK - A viewer that writes to an VTK file 171 172 173 .seealso: PetscViewerVTKOpen(), PetscViewerHDF5Open(), PetscViewerStringSPrintf(), PetscViewerSocketOpen(), PetscViewerDrawOpen(), PETSCVIEWERSOCKET, 174 PetscViewerCreate(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PETSCVIEWERBINARY, PETSCVIEWERDRAW, PETSCVIEWERSTRING, 175 PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERASCII, PETSCVIEWERMATLAB, 176 PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType() 177 178 Level: beginner 179 M*/ 180 181 PETSC_EXTERN PetscErrorCode PetscViewerCreate_VTK(PetscViewer v) 182 { 183 PetscViewer_VTK *vtk; 184 PetscErrorCode ierr; 185 186 PetscFunctionBegin; 187 ierr = PetscNewLog(v,&vtk);CHKERRQ(ierr); 188 189 v->data = (void*)vtk; 190 v->ops->destroy = PetscViewerDestroy_VTK; 191 v->ops->flush = PetscViewerFlush_VTK; 192 vtk->btype = (PetscFileMode) -1; 193 vtk->filename = 0; 194 195 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",PetscViewerFileSetName_VTK);CHKERRQ(ierr); 196 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",PetscViewerFileGetName_VTK);CHKERRQ(ierr); 197 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_VTK);CHKERRQ(ierr); 198 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_VTK);CHKERRQ(ierr); 199 ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerVTKAddField_C",PetscViewerVTKAddField_VTK);CHKERRQ(ierr); 200 PetscFunctionReturn(0); 201 } 202 203 /*@C 204 PetscViewerVTKOpen - Opens a file for VTK output. 205 206 Collective on MPI_Comm 207 208 Input Parameters: 209 + comm - MPI communicator 210 . name - name of file 211 - type - type of file 212 $ FILE_MODE_WRITE - create new file for binary output 213 $ FILE_MODE_READ - open existing file for binary input (not currently supported) 214 $ FILE_MODE_APPEND - open existing file for binary output (not currently supported) 215 216 Output Parameter: 217 . vtk - PetscViewer for VTK input/output to use with the specified file 218 219 Level: beginner 220 221 Note: 222 This PetscViewer should be destroyed with PetscViewerDestroy(). 223 224 Concepts: VTK files 225 Concepts: PetscViewer^creating 226 227 .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), 228 VecView(), MatView(), VecLoad(), MatLoad(), 229 PetscFileMode, PetscViewer 230 @*/ 231 PetscErrorCode PetscViewerVTKOpen(MPI_Comm comm,const char name[],PetscFileMode type,PetscViewer *vtk) 232 { 233 PetscErrorCode ierr; 234 235 PetscFunctionBegin; 236 ierr = PetscViewerCreate(comm,vtk);CHKERRQ(ierr); 237 ierr = PetscViewerSetType(*vtk,PETSCVIEWERVTK);CHKERRQ(ierr); 238 ierr = PetscViewerFileSetMode(*vtk,type);CHKERRQ(ierr); 239 ierr = PetscViewerFileSetName(*vtk,name);CHKERRQ(ierr); 240 PetscFunctionReturn(0); 241 } 242 243 /*@C 244 PetscViewerVTKFWrite - write binary data preceded by 32-bit int length (in bytes), does not do byte swapping. 245 246 Logically collective on PetscViewer 247 248 Input Parameters: 249 + viewer - logically collective viewer, data written from rank 0 250 . fp - file pointer valid on rank 0 251 . data - data pointer valid on rank 0 252 . n - number of data items 253 - dtype - data type 254 255 Level: developer 256 257 Notes: If PetscScalar is __float128 then the binary files are written in double precision 258 259 Concepts: VTK files 260 Concepts: PetscViewer^creating 261 262 .seealso: DMDAVTKWriteAll(), DMComplexVTKWriteAll(), PetscViewerPushFormat(), PetscViewerVTKOpen(), PetscBinaryWrite() 263 @*/ 264 PetscErrorCode PetscViewerVTKFWrite(PetscViewer viewer,FILE *fp,const void *data,PetscInt n,MPI_Datatype dtype) 265 { 266 PetscErrorCode ierr; 267 PetscMPIInt rank; 268 MPI_Datatype vdtype=dtype; 269 #if defined(PETSC_USE_REAL___FLOAT128) 270 double *tmp; 271 PetscInt i; 272 PetscReal *ttmp = (PetscReal*)data; 273 #endif 274 275 PetscFunctionBegin; 276 if (n < 0) SETERRQ1(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_OUTOFRANGE,"Trying to write a negative amount of data %D",n); 277 if (!n) PetscFunctionReturn(0); 278 ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 279 if (!rank) { 280 size_t count; 281 PetscMPIInt dsize; 282 PetscVTKInt bytes; 283 284 #if defined(PETSC_USE_REAL___FLOAT128) 285 if (dtype == MPIU___FLOAT128) { 286 ierr = PetscMalloc1(n,&tmp);CHKERRQ(ierr); 287 for (i=0; i<n; i++) tmp[i] = ttmp[i]; 288 data = (void*) tmp; 289 vdtype = MPI_DOUBLE; 290 } 291 #endif 292 ierr = MPI_Type_size(vdtype,&dsize);CHKERRQ(ierr); 293 bytes = PetscVTKIntCast(dsize*n); 294 295 count = fwrite(&bytes,sizeof(int),1,fp); 296 if (count != 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_WRITE,"Error writing byte count"); 297 count = fwrite(data,dsize,(size_t)n,fp); 298 if ((PetscInt)count != n) SETERRQ3(PETSC_COMM_SELF,PETSC_ERR_FILE_WRITE,"Wrote %D/%D array members of size %d",(PetscInt)count,n,dsize); 299 #if defined(PETSC_USE_REAL___FLOAT128) 300 if (dtype == MPIU___FLOAT128) { 301 ierr = PetscFree(tmp);CHKERRQ(ierr); 302 } 303 #endif 304 } 305 PetscFunctionReturn(0); 306 } 307