xref: /petsc/src/sys/classes/viewer/interface/view.c (revision bef158480efac06de457f7a665168877ab3c2fd7)
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