1 2 #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/ 3 4 PetscClassId PETSC_VIEWER_CLASSID; 5 6 static PetscBool PetscViewerPackageInitialized = PETSC_FALSE; 7 /*@C 8 PetscViewerFinalizePackage - This function destroys any global objects created in the Petsc viewers. It is 9 called from PetscFinalize(). 10 11 Level: developer 12 13 .seealso: PetscFinalize() 14 @*/ 15 PetscErrorCode PetscViewerFinalizePackage(void) 16 { 17 PetscErrorCode ierr; 18 19 PetscFunctionBegin; 20 if (Petsc_Viewer_keyval != MPI_KEYVAL_INVALID) { 21 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_keyval);CHKERRQ(ierr); 22 } 23 if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) { 24 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_Stdout_keyval);CHKERRQ(ierr); 25 } 26 if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) { 27 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_Stderr_keyval);CHKERRQ(ierr); 28 } 29 if (Petsc_Viewer_Binary_keyval != MPI_KEYVAL_INVALID) { 30 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_Binary_keyval);CHKERRQ(ierr); 31 } 32 if (Petsc_Viewer_Draw_keyval != MPI_KEYVAL_INVALID) { 33 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_Draw_keyval);CHKERRQ(ierr); 34 } 35 #if defined(PETSC_HAVE_HDF5) 36 if (Petsc_Viewer_HDF5_keyval != MPI_KEYVAL_INVALID) { 37 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_HDF5_keyval);CHKERRQ(ierr); 38 } 39 #endif 40 #if defined(PETSC_USE_SOCKETVIEWER) 41 if (Petsc_Viewer_Socket_keyval != MPI_KEYVAL_INVALID) { 42 ierr = MPI_Comm_free_keyval(&Petsc_Viewer_Socket_keyval);CHKERRQ(ierr); 43 } 44 #endif 45 ierr = PetscFunctionListDestroy(&PetscViewerList);CHKERRQ(ierr); 46 PetscViewerPackageInitialized = PETSC_FALSE; 47 PetscViewerRegisterAllCalled = PETSC_FALSE; 48 PetscFunctionReturn(0); 49 } 50 51 /*@C 52 PetscViewerInitializePackage - This function initializes everything in the main PetscViewer package. 53 54 Level: developer 55 56 .seealso: PetscInitialize() 57 @*/ 58 PetscErrorCode PetscViewerInitializePackage(void) 59 { 60 char logList[256]; 61 PetscBool opt,pkg; 62 PetscErrorCode ierr; 63 64 PetscFunctionBegin; 65 if (PetscViewerPackageInitialized) PetscFunctionReturn(0); 66 PetscViewerPackageInitialized = PETSC_TRUE; 67 /* Register Classes */ 68 ierr = PetscClassIdRegister("Viewer",&PETSC_VIEWER_CLASSID);CHKERRQ(ierr); 69 /* Register Constructors */ 70 ierr = PetscViewerRegisterAll();CHKERRQ(ierr); 71 /* Process Info */ 72 { 73 PetscClassId classids[1]; 74 75 classids[0] = PETSC_VIEWER_CLASSID; 76 ierr = PetscInfoProcessClass("viewer", 1, classids);CHKERRQ(ierr); 77 } 78 /* Process summary exclusions */ 79 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 80 if (opt) { 81 ierr = PetscStrInList("viewer",logList,',',&pkg);CHKERRQ(ierr); 82 if (pkg) {ierr = PetscLogEventExcludeClass(PETSC_VIEWER_CLASSID);CHKERRQ(ierr);} 83 } 84 #if defined(PETSC_HAVE_MATHEMATICA) 85 ierr = PetscViewerMathematicaInitializePackage();CHKERRQ(ierr); 86 #endif 87 /* Register package finalizer */ 88 ierr = PetscRegisterFinalize(PetscViewerFinalizePackage);CHKERRQ(ierr); 89 PetscFunctionReturn(0); 90 } 91 92 /*@ 93 PetscViewerDestroy - Destroys a PetscViewer. 94 95 Collective on PetscViewer 96 97 Input Parameters: 98 . viewer - the PetscViewer to be destroyed. 99 100 Level: beginner 101 102 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen() 103 104 @*/ 105 PetscErrorCode PetscViewerDestroy(PetscViewer *viewer) 106 { 107 PetscErrorCode ierr; 108 109 PetscFunctionBegin; 110 if (!*viewer) PetscFunctionReturn(0); 111 PetscValidHeaderSpecific(*viewer,PETSC_VIEWER_CLASSID,1); 112 113 ierr = PetscViewerFlush(*viewer);CHKERRQ(ierr); 114 if (--((PetscObject)(*viewer))->refct > 0) {*viewer = NULL; PetscFunctionReturn(0);} 115 116 ierr = PetscObjectSAWsViewOff((PetscObject)*viewer);CHKERRQ(ierr); 117 if ((*viewer)->ops->destroy) { 118 ierr = (*(*viewer)->ops->destroy)(*viewer);CHKERRQ(ierr); 119 } 120 ierr = PetscHeaderDestroy(viewer);CHKERRQ(ierr); 121 PetscFunctionReturn(0); 122 } 123 124 /*@C 125 PetscViewerAndFormatCreate - Creates a PetscViewerAndFormat struct. 126 127 Collective on PetscViewer 128 129 Input Parameters: 130 + viewer - the viewer 131 - format - the format 132 133 Output Parameter: 134 . vf - viewer and format object 135 136 Notes: 137 This increases the reference count of the viewer so you can destroy the viewer object after this call 138 Level: developer 139 140 This is used as the context variable for many of the TS, SNES, and KSP monitor functions 141 142 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatDestroy() 143 144 @*/ 145 PetscErrorCode PetscViewerAndFormatCreate(PetscViewer viewer, PetscViewerFormat format,PetscViewerAndFormat **vf) 146 { 147 PetscErrorCode ierr; 148 149 PetscFunctionBegin; 150 ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 151 ierr = PetscNew(vf);CHKERRQ(ierr); 152 (*vf)->viewer = viewer; 153 (*vf)->format = format; 154 PetscFunctionReturn(0); 155 } 156 157 158 /*@C 159 PetscViewerAndFormatDestroy - Destroys a PetscViewerAndFormat struct. 160 161 Collective on PetscViewer 162 163 Input Parameters: 164 . viewer - the PetscViewerAndFormat to be destroyed. 165 166 Level: developer 167 168 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatCreate() 169 170 @*/ 171 PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf) 172 { 173 PetscErrorCode ierr; 174 175 PetscFunctionBegin; 176 ierr = PetscViewerDestroy(&(*vf)->viewer);CHKERRQ(ierr); 177 ierr = PetscFree(*vf);CHKERRQ(ierr); 178 PetscFunctionReturn(0); 179 } 180 181 /*@C 182 PetscViewerGetType - Returns the type of a PetscViewer. 183 184 Not Collective 185 186 Input Parameter: 187 . viewer - the PetscViewer 188 189 Output Parameter: 190 . type - PetscViewer type (see below) 191 192 Available Types Include: 193 + PETSCVIEWERSOCKET - Socket PetscViewer 194 . PETSCVIEWERASCII - ASCII PetscViewer 195 . PETSCVIEWERBINARY - binary file PetscViewer 196 . PETSCVIEWERSTRING - string PetscViewer 197 - PETSCVIEWERDRAW - drawing PetscViewer 198 199 Level: intermediate 200 201 Note: 202 See include/petscviewer.h for a complete list of PetscViewers. 203 204 PetscViewerType is actually a string 205 206 .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 207 208 @*/ 209 PetscErrorCode PetscViewerGetType(PetscViewer viewer,PetscViewerType *type) 210 { 211 PetscFunctionBegin; 212 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 213 PetscValidPointer(type,2); 214 *type = ((PetscObject)viewer)->type_name; 215 PetscFunctionReturn(0); 216 } 217 218 /*@C 219 PetscViewerSetOptionsPrefix - Sets the prefix used for searching for all 220 PetscViewer options in the database. 221 222 Logically Collective on PetscViewer 223 224 Input Parameter: 225 + viewer - the PetscViewer context 226 - prefix - the prefix to prepend to all option names 227 228 Notes: 229 A hyphen (-) must NOT be given at the beginning of the prefix name. 230 The first character of all runtime options is AUTOMATICALLY the hyphen. 231 232 Level: advanced 233 234 .seealso: PetscViewerSetFromOptions() 235 @*/ 236 PetscErrorCode PetscViewerSetOptionsPrefix(PetscViewer viewer,const char prefix[]) 237 { 238 PetscErrorCode ierr; 239 240 PetscFunctionBegin; 241 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 242 ierr = PetscObjectSetOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr); 243 PetscFunctionReturn(0); 244 } 245 246 /*@C 247 PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for all 248 PetscViewer options in the database. 249 250 Logically Collective on PetscViewer 251 252 Input Parameters: 253 + viewer - the PetscViewer context 254 - prefix - the prefix to prepend to all option names 255 256 Notes: 257 A hyphen (-) must NOT be given at the beginning of the prefix name. 258 The first character of all runtime options is AUTOMATICALLY the hyphen. 259 260 Level: advanced 261 262 .seealso: PetscViewerGetOptionsPrefix() 263 @*/ 264 PetscErrorCode PetscViewerAppendOptionsPrefix(PetscViewer viewer,const char prefix[]) 265 { 266 PetscErrorCode ierr; 267 268 PetscFunctionBegin; 269 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 270 ierr = PetscObjectAppendOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr); 271 PetscFunctionReturn(0); 272 } 273 274 /*@C 275 PetscViewerGetOptionsPrefix - Sets the prefix used for searching for all 276 PetscViewer options in the database. 277 278 Not Collective 279 280 Input Parameter: 281 . viewer - the PetscViewer context 282 283 Output Parameter: 284 . prefix - pointer to the prefix string used 285 286 Notes: 287 On the fortran side, the user should pass in a string 'prefix' of 288 sufficient length to hold the prefix. 289 290 Level: advanced 291 292 .seealso: PetscViewerAppendOptionsPrefix() 293 @*/ 294 PetscErrorCode PetscViewerGetOptionsPrefix(PetscViewer viewer,const char *prefix[]) 295 { 296 PetscErrorCode ierr; 297 298 PetscFunctionBegin; 299 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 300 ierr = PetscObjectGetOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr); 301 PetscFunctionReturn(0); 302 } 303 304 /*@ 305 PetscViewerSetUp - Sets up the internal viewer data structures for the later use. 306 307 Collective on PetscViewer 308 309 Input Parameters: 310 . viewer - the PetscViewer context 311 312 Notes: 313 For basic use of the PetscViewer classes the user need not explicitly call 314 PetscViewerSetUp(), since these actions will happen automatically. 315 316 Level: advanced 317 318 .seealso: PetscViewerCreate(), PetscViewerDestroy() 319 @*/ 320 PetscErrorCode PetscViewerSetUp(PetscViewer viewer) 321 { 322 PetscErrorCode ierr; 323 324 PetscFunctionBegin; 325 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 326 if (viewer->setupcalled) PetscFunctionReturn(0); 327 if (viewer->ops->setup) { 328 ierr = (*viewer->ops->setup)(viewer);CHKERRQ(ierr); 329 } 330 viewer->setupcalled = PETSC_TRUE; 331 PetscFunctionReturn(0); 332 } 333 334 /*@C 335 PetscViewerViewFromOptions - View from Options 336 337 Collective on PetscViewer 338 339 Input Parameters: 340 + A - the PetscViewer context 341 . obj - Optional object 342 - name - command line option 343 344 Level: intermediate 345 .seealso: PetscViewer, PetscViewerView, PetscObjectViewFromOptions(), PetscViewerCreate() 346 @*/ 347 PetscErrorCode PetscViewerViewFromOptions(PetscViewer A,PetscObject obj,const char name[]) 348 { 349 PetscErrorCode ierr; 350 351 PetscFunctionBegin; 352 PetscValidHeaderSpecific(A,PETSC_VIEWER_CLASSID,1); 353 ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr); 354 PetscFunctionReturn(0); 355 } 356 357 /*@C 358 PetscViewerView - Visualizes a viewer object. 359 360 Collective on PetscViewer 361 362 Input Parameters: 363 + v - the viewer to be viewed 364 - viewer - visualization context 365 366 Notes: 367 The available visualization contexts include 368 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 369 . PETSC_VIEWER_STDOUT_WORLD - synchronized standard 370 output where only the first processor opens 371 the file. All other processors send their 372 data to the first processor to print. 373 - PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure 374 375 Level: beginner 376 377 .seealso: PetscViewerPushFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), 378 PetscViewerSocketOpen(), PetscViewerBinaryOpen(), PetscViewerLoad() 379 @*/ 380 PetscErrorCode PetscViewerView(PetscViewer v,PetscViewer viewer) 381 { 382 PetscErrorCode ierr; 383 PetscBool iascii; 384 PetscViewerFormat format; 385 #if defined(PETSC_HAVE_SAWS) 386 PetscBool issaws; 387 #endif 388 389 PetscFunctionBegin; 390 PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1); 391 PetscValidType(v,1); 392 if (!viewer) { 393 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v),&viewer);CHKERRQ(ierr); 394 } 395 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 396 PetscCheckSameComm(v,1,viewer,2); 397 398 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 399 #if defined(PETSC_HAVE_SAWS) 400 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr); 401 #endif 402 if (iascii) { 403 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 404 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)v,viewer);CHKERRQ(ierr); 405 if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 406 if (v->format) { 407 ierr = PetscViewerASCIIPrintf(viewer," Viewer format = %s\n",PetscViewerFormats[v->format]);CHKERRQ(ierr); 408 } 409 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 410 if (v->ops->view) { 411 ierr = (*v->ops->view)(v,viewer);CHKERRQ(ierr); 412 } 413 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 414 } 415 #if defined(PETSC_HAVE_SAWS) 416 } else if (issaws) { 417 if (!((PetscObject)v)->amsmem) { 418 ierr = PetscObjectViewSAWs((PetscObject)v,viewer);CHKERRQ(ierr); 419 if (v->ops->view) { 420 ierr = (*v->ops->view)(v,viewer);CHKERRQ(ierr); 421 } 422 } 423 #endif 424 } 425 PetscFunctionReturn(0); 426 } 427 428 /*@C 429 PetscViewerRead - Reads data from a PetscViewer 430 431 Collective 432 433 Input Parameters: 434 + viewer - The viewer 435 . data - Location to write the data 436 . num - Number of items of data to read 437 - datatype - Type of data to read 438 439 Output Parameters: 440 . count - number of items of data actually read, or NULL 441 442 Notes: 443 If datatype is PETSC_STRING and num is negative, reads until a newline character is found, 444 until a maximum of (-num - 1) chars. 445 446 Level: beginner 447 448 .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), 449 VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), 450 PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer 451 @*/ 452 PetscErrorCode PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype) 453 { 454 PetscErrorCode ierr; 455 456 PetscFunctionBegin; 457 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 458 if (dtype == PETSC_STRING) { 459 PetscInt c, i = 0, cnt; 460 char *s = (char *)data; 461 if (num >= 0) { 462 for (c = 0; c < num; c++) { 463 /* Skip leading whitespaces */ 464 do {ierr = (*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (!cnt) break;} 465 while (s[i]=='\n' || s[i]=='\t' || s[i]==' ' || s[i]=='\0' || s[i]=='\v' || s[i]=='\f' || s[i]=='\r'); 466 i++; 467 /* Read strings one char at a time */ 468 do {ierr = (*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (!cnt) break;} 469 while (s[i-1]!='\n' && s[i-1]!='\t' && s[i-1]!=' ' && s[i-1]!='\0' && s[i-1]!='\v' && s[i-1]!='\f' && s[i-1]!='\r'); 470 /* Terminate final string */ 471 if (c == num-1) s[i-1] = '\0'; 472 } 473 } else { 474 /* Read until a \n is encountered (-num is the max size allowed) */ 475 do {ierr = (*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (i == -num || !cnt) break;} 476 while (s[i-1]!='\n'); 477 /* Terminate final string */ 478 s[i-1] = '\0'; 479 c = i; 480 } 481 if (count) *count = c; 482 else if (c < num) SETERRQ2(PetscObjectComm((PetscObject) viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %D < %D strings", c, num); 483 } else { 484 ierr = (*viewer->ops->read)(viewer, data, num, count, dtype);CHKERRQ(ierr); 485 } 486 PetscFunctionReturn(0); 487 } 488 489 /*@ 490 PetscViewerReadable - Return a flag whether the viewer can be read from 491 492 Not Collective 493 494 Input Parameters: 495 . viewer - the PetscViewer context 496 497 Output Parameters: 498 . flg - PETSC_TRUE if the viewer is readable, PETSC_FALSE otherwise 499 500 Notes: 501 PETSC_TRUE means that viewer's PetscViewerType supports reading (this holds e.g. for PETSCVIEWERBINARY) 502 and viewer is in a mode allowing reading, i.e. PetscViewerFileGetMode() 503 returns one of FILE_MODE_READ, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE. 504 505 Level: intermediate 506 507 .seealso: PetscViewerWritable(), PetscViewerCheckReadable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType() 508 @*/ 509 PetscErrorCode PetscViewerReadable(PetscViewer viewer, PetscBool *flg) 510 { 511 PetscErrorCode ierr; 512 PetscFileMode mode; 513 PetscErrorCode (*f)(PetscViewer,PetscFileMode*) = NULL; 514 515 PetscFunctionBegin; 516 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 517 PetscValidBoolPointer(flg,2); 518 ierr = PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f);CHKERRQ(ierr); 519 *flg = PETSC_FALSE; 520 if (!f) PetscFunctionReturn(0); 521 ierr = (*f)(viewer, &mode);CHKERRQ(ierr); 522 switch (mode) { 523 case FILE_MODE_READ: 524 case FILE_MODE_UPDATE: 525 case FILE_MODE_APPEND_UPDATE: 526 *flg = PETSC_TRUE; 527 default: break; 528 } 529 PetscFunctionReturn(0); 530 } 531 532 /*@ 533 PetscViewerWritable - Return a flag whether the viewer can be written to 534 535 Not Collective 536 537 Input Parameters: 538 . viewer - the PetscViewer context 539 540 Output Parameters: 541 . flg - PETSC_TRUE if the viewer is writable, PETSC_FALSE otherwise 542 543 Notes: 544 PETSC_TRUE means viewer is in a mode allowing writing, i.e. PetscViewerFileGetMode() 545 returns one of FILE_MODE_WRITE, FILE_MODE_APPEND, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE. 546 547 Level: intermediate 548 549 .seealso: PetscViewerReadable(), PetscViewerCheckWritable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType() 550 @*/ 551 PetscErrorCode PetscViewerWritable(PetscViewer viewer, PetscBool *flg) 552 { 553 PetscErrorCode ierr; 554 PetscFileMode mode; 555 PetscErrorCode (*f)(PetscViewer,PetscFileMode*) = NULL; 556 557 PetscFunctionBegin; 558 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 559 PetscValidBoolPointer(flg,2); 560 ierr = PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f);CHKERRQ(ierr); 561 *flg = PETSC_TRUE; 562 if (!f) PetscFunctionReturn(0); 563 ierr = (*f)(viewer, &mode);CHKERRQ(ierr); 564 if (mode == FILE_MODE_READ) *flg = PETSC_FALSE; 565 PetscFunctionReturn(0); 566 } 567 568 /*@ 569 PetscViewerCheckReadable - Check whether the viewer can be read from 570 571 Collective 572 573 Input Parameters: 574 . viewer - the PetscViewer context 575 576 Level: intermediate 577 578 .seealso: PetscViewerReadable(), PetscViewerCheckWritable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType() 579 @*/ 580 PetscErrorCode PetscViewerCheckReadable(PetscViewer viewer) 581 { 582 PetscBool flg; 583 PetscErrorCode ierr; 584 585 PetscFunctionBegin; 586 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 587 ierr = PetscViewerReadable(viewer, &flg);CHKERRQ(ierr); 588 if (!flg) SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support reading, or is not in reading mode (FILE_MODE_READ, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE)"); 589 PetscFunctionReturn(0); 590 } 591 592 /*@ 593 PetscViewerCheckWritable - Check whether the viewer can be written to 594 595 Collective 596 597 Input Parameters: 598 . viewer - the PetscViewer context 599 600 Level: intermediate 601 602 .seealso: PetscViewerWritable(), PetscViewerCheckReadable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType() 603 @*/ 604 PetscErrorCode PetscViewerCheckWritable(PetscViewer viewer) 605 { 606 PetscBool flg; 607 PetscErrorCode ierr; 608 609 PetscFunctionBegin; 610 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 611 ierr = PetscViewerWritable(viewer, &flg);CHKERRQ(ierr); 612 if (!flg) SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support writing, or is in FILE_MODE_READ mode"); 613 PetscFunctionReturn(0); 614 } 615