xref: /petsc/src/sys/classes/viewer/interface/view.c (revision 66976f2f44dcc61d86a452a70219fb23b45d00f0)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/
3798534f6SMatthew G. Knepley #include <petscdraw.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith PetscClassId PETSC_VIEWER_CLASSID;
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith static PetscBool PetscViewerPackageInitialized = PETSC_FALSE;
8*66976f2fSJacob Faibussowitsch 
95c6c1daeSBarry Smith /*@C
10c410d8ccSBarry Smith   PetscViewerFinalizePackage - This function destroys any global objects created in PETSc viewers. It is
11811af0c4SBarry Smith   called from `PetscFinalize()`.
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith   Level: developer
145c6c1daeSBarry Smith 
153f423023SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscFinalize()`, `PetscViewerInitializePackage()`
165c6c1daeSBarry Smith @*/
17d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFinalizePackage(void)
18d71ae5a4SJacob Faibussowitsch {
195c6c1daeSBarry Smith   PetscFunctionBegin;
2048a46eb9SPierre Jolivet   if (Petsc_Viewer_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_keyval));
2148a46eb9SPierre Jolivet   if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Stdout_keyval));
2248a46eb9SPierre Jolivet   if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Stderr_keyval));
2348a46eb9SPierre Jolivet   if (Petsc_Viewer_Binary_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Binary_keyval));
2448a46eb9SPierre Jolivet   if (Petsc_Viewer_Draw_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Draw_keyval));
25b6dade52SBarry Smith #if defined(PETSC_HAVE_HDF5)
2648a46eb9SPierre Jolivet   if (Petsc_Viewer_HDF5_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_HDF5_keyval));
27b6dade52SBarry Smith #endif
28b6dade52SBarry Smith #if defined(PETSC_USE_SOCKETVIEWER)
2948a46eb9SPierre Jolivet   if (Petsc_Viewer_Socket_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Socket_keyval));
30b6dade52SBarry Smith #endif
319566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscViewerList));
325c6c1daeSBarry Smith   PetscViewerPackageInitialized = PETSC_FALSE;
330f51fdf8SToby Isaac   PetscViewerRegisterAllCalled  = PETSC_FALSE;
343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
355c6c1daeSBarry Smith }
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith /*@C
38811af0c4SBarry Smith   PetscViewerInitializePackage - This function initializes everything in the `PetscViewer` package.
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith   Level: developer
415c6c1daeSBarry Smith 
423f423023SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscInitialize()`, `PetscViewerFinalizePackage()`
435c6c1daeSBarry Smith @*/
44d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerInitializePackage(void)
45d71ae5a4SJacob Faibussowitsch {
465c6c1daeSBarry Smith   char      logList[256];
478e81d068SLisandro Dalcin   PetscBool opt, pkg;
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith   PetscFunctionBegin;
503ba16761SJacob Faibussowitsch   if (PetscViewerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
515c6c1daeSBarry Smith   PetscViewerPackageInitialized = PETSC_TRUE;
525c6c1daeSBarry Smith   /* Register Classes */
539566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Viewer", &PETSC_VIEWER_CLASSID));
545c6c1daeSBarry Smith   /* Register Constructors */
559566063dSJacob Faibussowitsch   PetscCall(PetscViewerRegisterAll());
56e94e781bSJacob Faibussowitsch   /* Process Info */
57e94e781bSJacob Faibussowitsch   {
58e94e781bSJacob Faibussowitsch     PetscClassId classids[1];
59e94e781bSJacob Faibussowitsch 
60e94e781bSJacob Faibussowitsch     classids[0] = PETSC_VIEWER_CLASSID;
619566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("viewer", 1, classids));
625c6c1daeSBarry Smith   }
635c6c1daeSBarry Smith   /* Process summary exclusions */
649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
655c6c1daeSBarry Smith   if (opt) {
669566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("viewer", logList, ',', &pkg));
679566063dSJacob Faibussowitsch     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSC_VIEWER_CLASSID));
685c6c1daeSBarry Smith   }
695c6c1daeSBarry Smith #if defined(PETSC_HAVE_MATHEMATICA)
709566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaInitializePackage());
715c6c1daeSBarry Smith #endif
728e81d068SLisandro Dalcin   /* Register package finalizer */
739566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscViewerFinalizePackage));
743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith /*@
78811af0c4SBarry Smith   PetscViewerDestroy - Destroys a `PetscViewer`.
795c6c1daeSBarry Smith 
80c3339decSBarry Smith   Collective
815c6c1daeSBarry Smith 
822fe279fdSBarry Smith   Input Parameter:
83811af0c4SBarry Smith . viewer - the `PetscViewer` to be destroyed.
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith   Level: beginner
865c6c1daeSBarry Smith 
87aec76313SJacob Faibussowitsch .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`
885c6c1daeSBarry Smith @*/
89d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDestroy(PetscViewer *viewer)
90d71ae5a4SJacob Faibussowitsch {
915c6c1daeSBarry Smith   PetscFunctionBegin;
923ba16761SJacob Faibussowitsch   if (!*viewer) PetscFunctionReturn(PETSC_SUCCESS);
935c6c1daeSBarry Smith   PetscValidHeaderSpecific(*viewer, PETSC_VIEWER_CLASSID, 1);
945c6c1daeSBarry Smith 
959566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(*viewer));
969371c9d4SSatish Balay   if (--((PetscObject)(*viewer))->refct > 0) {
979371c9d4SSatish Balay     *viewer = NULL;
983ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
999371c9d4SSatish Balay   }
1005c6c1daeSBarry Smith 
1019566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*viewer));
10248a46eb9SPierre Jolivet   if ((*viewer)->ops->destroy) PetscCall((*(*viewer)->ops->destroy)(*viewer));
1039566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(viewer));
1043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1055c6c1daeSBarry Smith }
1065c6c1daeSBarry Smith 
107d7cbc13eSBarry Smith /*@C
108811af0c4SBarry Smith   PetscViewerAndFormatCreate - Creates a `PetscViewerAndFormat` struct.
109d7cbc13eSBarry Smith 
110c3339decSBarry Smith   Collective
111d7cbc13eSBarry Smith 
112d7cbc13eSBarry Smith   Input Parameters:
113d7cbc13eSBarry Smith + viewer - the viewer
114d7cbc13eSBarry Smith - format - the format
115d7cbc13eSBarry Smith 
116d7cbc13eSBarry Smith   Output Parameter:
117d7cbc13eSBarry Smith . vf - viewer and format object
118d7cbc13eSBarry Smith 
119d7cbc13eSBarry Smith   Level: developer
120d7cbc13eSBarry Smith 
121811af0c4SBarry Smith   Notes:
1223f423023SBarry Smith   This increases the reference count of the viewer.
1233f423023SBarry Smith 
1243f423023SBarry Smith   Use `PetscViewerAndFormatDestroy()` to free the struct
125811af0c4SBarry Smith 
126811af0c4SBarry Smith   This is used as the context variable for many of the `TS`, `SNES`, and `KSP` monitor functions
127d7cbc13eSBarry Smith 
1283f423023SBarry Smith   This construct exists because it allows one to keep track of the use of a `PetscViewerFormat` without requiring the
1293f423023SBarry Smith   format in the viewer to be permanently changed.
1303f423023SBarry Smith 
131c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAndFormat`, `PetscViewerFormat`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`,
1323f423023SBarry Smith           `PetscViewerDrawOpen()`, `PetscViewerAndFormatDestroy()`
133d7cbc13eSBarry Smith @*/
134d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAndFormatCreate(PetscViewer viewer, PetscViewerFormat format, PetscViewerAndFormat **vf)
135d71ae5a4SJacob Faibussowitsch {
136d7cbc13eSBarry Smith   PetscFunctionBegin;
1379566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)viewer));
1389566063dSJacob Faibussowitsch   PetscCall(PetscNew(vf));
139d7cbc13eSBarry Smith   (*vf)->viewer = viewer;
140d7cbc13eSBarry Smith   (*vf)->format = format;
141798534f6SMatthew G. Knepley   (*vf)->lg     = NULL;
142798534f6SMatthew G. Knepley   (*vf)->data   = NULL;
1433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
144d7cbc13eSBarry Smith }
145d7cbc13eSBarry Smith 
146fe01d993SBarry Smith /*@C
1473f423023SBarry Smith   PetscViewerAndFormatDestroy - Destroys a `PetscViewerAndFormat` struct created with `PetscViewerAndFormatCreate()`
148fe01d993SBarry Smith 
149c3339decSBarry Smith   Collective
150fe01d993SBarry Smith 
1512fe279fdSBarry Smith   Input Parameter:
152811af0c4SBarry Smith . vf - the `PetscViewerAndFormat` to be destroyed.
153fe01d993SBarry Smith 
154d7cbc13eSBarry Smith   Level: developer
155fe01d993SBarry Smith 
156c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAndFormat`, `PetscViewerFormat`, `PetscViewerAndFormatCreate()`, `PetscViewerSocketOpen()`,
15742747ad1SJacob Faibussowitsch           `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`
158fe01d993SBarry Smith @*/
159d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
160d71ae5a4SJacob Faibussowitsch {
161fe01d993SBarry Smith   PetscFunctionBegin;
1629566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&(*vf)->viewer));
1639566063dSJacob Faibussowitsch   PetscCall(PetscDrawLGDestroy(&(*vf)->lg));
1649566063dSJacob Faibussowitsch   PetscCall(PetscFree(*vf));
1653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
166fe01d993SBarry Smith }
167fe01d993SBarry Smith 
1685c6c1daeSBarry Smith /*@C
169811af0c4SBarry Smith   PetscViewerGetType - Returns the type of a `PetscViewer`.
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   Not Collective
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith   Input Parameter:
174811af0c4SBarry Smith . viewer - the `PetscViewer`
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith   Output Parameter:
17710450e9eSJacob Faibussowitsch . type - `PetscViewerType`
1785c6c1daeSBarry Smith 
1795c6c1daeSBarry Smith   Level: intermediate
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   Note:
182811af0c4SBarry Smith   `PetscViewerType` is actually a string
1835c6c1daeSBarry Smith 
184aec76313SJacob Faibussowitsch .seealso: [](sec_viewers), `PetscViewerType`, `PetscViewer`, `PetscViewerCreate()`, `PetscViewerSetType()`
1855c6c1daeSBarry Smith @*/
186d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetType(PetscViewer viewer, PetscViewerType *type)
187d71ae5a4SJacob Faibussowitsch {
1885c6c1daeSBarry Smith   PetscFunctionBegin;
1895c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
1904f572ea9SToby Isaac   PetscAssertPointer(type, 2);
1915c6c1daeSBarry Smith   *type = ((PetscObject)viewer)->type_name;
1923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1935c6c1daeSBarry Smith }
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith /*@C
196c410d8ccSBarry Smith   PetscViewerSetOptionsPrefix - Sets the prefix used for searching for
197c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
1985c6c1daeSBarry Smith 
199c3339decSBarry Smith   Logically Collective
2005c6c1daeSBarry Smith 
201d8d19677SJose E. Roman   Input Parameters:
202811af0c4SBarry Smith + viewer - the `PetscViewer` context
2035c6c1daeSBarry Smith - prefix - the prefix to prepend to all option names
2045c6c1daeSBarry Smith 
205811af0c4SBarry Smith   Note:
2065c6c1daeSBarry Smith   A hyphen (-) must NOT be given at the beginning of the prefix name.
2075c6c1daeSBarry Smith   The first character of all runtime options is AUTOMATICALLY the hyphen.
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith   Level: advanced
2105c6c1daeSBarry Smith 
211c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerSetFromOptions()`, `PetscViewerAppendOptionsPrefix()`
2125c6c1daeSBarry Smith @*/
213d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetOptionsPrefix(PetscViewer viewer, const char prefix[])
214d71ae5a4SJacob Faibussowitsch {
2155c6c1daeSBarry Smith   PetscFunctionBegin;
2165c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2179566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)viewer, prefix));
2183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2195c6c1daeSBarry Smith }
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith /*@C
222c410d8ccSBarry Smith   PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for
223c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
2245c6c1daeSBarry Smith 
225c3339decSBarry Smith   Logically Collective
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith   Input Parameters:
22801311c95SBarry Smith + viewer - the `PetscViewer` context
2295c6c1daeSBarry Smith - prefix - the prefix to prepend to all option names
2305c6c1daeSBarry Smith 
23101311c95SBarry Smith   Level: advanced
23201311c95SBarry Smith 
233811af0c4SBarry Smith   Note:
2345c6c1daeSBarry Smith   A hyphen (-) must NOT be given at the beginning of the prefix name.
2355c6c1daeSBarry Smith   The first character of all runtime options is AUTOMATICALLY the hyphen.
2365c6c1daeSBarry Smith 
237c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerGetOptionsPrefix()`, `PetscViewerSetOptionsPrefix()`
2385c6c1daeSBarry Smith @*/
239d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAppendOptionsPrefix(PetscViewer viewer, const char prefix[])
240d71ae5a4SJacob Faibussowitsch {
2415c6c1daeSBarry Smith   PetscFunctionBegin;
2425c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2439566063dSJacob Faibussowitsch   PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)viewer, prefix));
2443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2455c6c1daeSBarry Smith }
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith /*@C
248c410d8ccSBarry Smith   PetscViewerGetOptionsPrefix - Gets the prefix used for searching for
249c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
2505c6c1daeSBarry Smith 
2515c6c1daeSBarry Smith   Not Collective
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith   Input Parameter:
254811af0c4SBarry Smith . viewer - the `PetscViewer` context
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith   Output Parameter:
2575c6c1daeSBarry Smith . prefix - pointer to the prefix string used
2585c6c1daeSBarry Smith 
25901311c95SBarry Smith   Level: advanced
26001311c95SBarry Smith 
261aec76313SJacob Faibussowitsch   Fortran Notes:
262811af0c4SBarry Smith   The user should pass in a string 'prefix' of sufficient length to hold the prefix.
2635c6c1daeSBarry Smith 
264c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAppendOptionsPrefix()`, `PetscViewerSetOptionsPrefix()`
2655c6c1daeSBarry Smith @*/
266d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetOptionsPrefix(PetscViewer viewer, const char *prefix[])
267d71ae5a4SJacob Faibussowitsch {
2685c6c1daeSBarry Smith   PetscFunctionBegin;
2695c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2709566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetOptionsPrefix((PetscObject)viewer, prefix));
2713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2725c6c1daeSBarry Smith }
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith /*@
2755c6c1daeSBarry Smith   PetscViewerSetUp - Sets up the internal viewer data structures for the later use.
2765c6c1daeSBarry Smith 
277c3339decSBarry Smith   Collective
2785c6c1daeSBarry Smith 
2792fe279fdSBarry Smith   Input Parameter:
280811af0c4SBarry Smith . viewer - the `PetscViewer` context
2815c6c1daeSBarry Smith 
28201311c95SBarry Smith   Level: advanced
28301311c95SBarry Smith 
284811af0c4SBarry Smith   Note:
285811af0c4SBarry Smith   For basic use of the `PetscViewer` classes the user need not explicitly call
286811af0c4SBarry Smith   `PetscViewerSetUp()`, since these actions will happen automatically.
2875c6c1daeSBarry Smith 
288d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerDestroy()`
2895c6c1daeSBarry Smith @*/
290d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetUp(PetscViewer viewer)
291d71ae5a4SJacob Faibussowitsch {
2925c6c1daeSBarry Smith   PetscFunctionBegin;
2935c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2943ba16761SJacob Faibussowitsch   if (viewer->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
295dbbe0bcdSBarry Smith   PetscTryTypeMethod(viewer, setup);
296c98fd787SBarry Smith   viewer->setupcalled = PETSC_TRUE;
2973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2985c6c1daeSBarry Smith }
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith /*@C
3013f423023SBarry Smith   PetscViewerViewFromOptions - View from the viewer based on options in the options database
302fe2efc57SMark 
303c3339decSBarry Smith   Collective
304fe2efc57SMark 
305fe2efc57SMark   Input Parameters:
306811af0c4SBarry Smith + A    - the `PetscViewer` context
307811af0c4SBarry Smith . obj  - Optional object that provides the prefix for the option names
308736c3998SJose E. Roman - name - command line option
309fe2efc57SMark 
310fe2efc57SMark   Level: intermediate
311811af0c4SBarry Smith 
3123f423023SBarry Smith   Note:
3133f423023SBarry Smith   See `PetscObjectViewFromOptions()` for details on the viewers and formats support via this interface
3143f423023SBarry Smith 
315d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerView`, `PetscObjectViewFromOptions()`, `PetscViewerCreate()`
316fe2efc57SMark @*/
317d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerViewFromOptions(PetscViewer A, PetscObject obj, const char name[])
318d71ae5a4SJacob Faibussowitsch {
319fe2efc57SMark   PetscFunctionBegin;
320fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_VIEWER_CLASSID, 1);
3219566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
3223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
323fe2efc57SMark }
324fe2efc57SMark 
325fe2efc57SMark /*@C
3265c6c1daeSBarry Smith   PetscViewerView - Visualizes a viewer object.
3275c6c1daeSBarry Smith 
328c3339decSBarry Smith   Collective
3295c6c1daeSBarry Smith 
3305c6c1daeSBarry Smith   Input Parameters:
331f0d4698bSVaclav Hapla + v      - the viewer to be viewed
3325c6c1daeSBarry Smith - viewer - visualization context
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith   Level: beginner
3355c6c1daeSBarry Smith 
336d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerPushFormat()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`,
337db781477SPatrick Sanan           `PetscViewerSocketOpen()`, `PetscViewerBinaryOpen()`, `PetscViewerLoad()`
3385c6c1daeSBarry Smith @*/
339d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerView(PetscViewer v, PetscViewer viewer)
340d71ae5a4SJacob Faibussowitsch {
3415c6c1daeSBarry Smith   PetscBool         iascii;
3425c6c1daeSBarry Smith   PetscViewerFormat format;
343e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
344536b137fSBarry Smith   PetscBool issaws;
3450076e027SBarry Smith #endif
3465c6c1daeSBarry Smith 
3475c6c1daeSBarry Smith   PetscFunctionBegin;
3485c6c1daeSBarry Smith   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3495c6c1daeSBarry Smith   PetscValidType(v, 1);
35048a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v), &viewer));
3515c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
3525c6c1daeSBarry Smith   PetscCheckSameComm(v, 1, viewer, 2);
3535c6c1daeSBarry Smith 
3549566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
355e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
3569566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
3570076e027SBarry Smith #endif
3585c6c1daeSBarry Smith   if (iascii) {
3599566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(viewer, &format));
3609566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)v, viewer));
36198c3331eSBarry Smith     if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
36248a46eb9SPierre Jolivet       if (v->format) PetscCall(PetscViewerASCIIPrintf(viewer, "  Viewer format = %s\n", PetscViewerFormats[v->format]));
3639566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
364dbbe0bcdSBarry Smith       PetscTryTypeMethod(v, view, viewer);
3659566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
3665c6c1daeSBarry Smith     }
367e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
368536b137fSBarry Smith   } else if (issaws) {
3690076e027SBarry Smith     if (!((PetscObject)v)->amsmem) {
3709566063dSJacob Faibussowitsch       PetscCall(PetscObjectViewSAWs((PetscObject)v, viewer));
371dbbe0bcdSBarry Smith       PetscTryTypeMethod(v, view, viewer);
3720076e027SBarry Smith     }
3730076e027SBarry Smith #endif
3745c6c1daeSBarry Smith   }
3753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3765c6c1daeSBarry Smith }
3771d641e7bSMichael Lange 
3781d641e7bSMichael Lange /*@C
379811af0c4SBarry Smith   PetscViewerRead - Reads data from a `PetscViewer`
3801d641e7bSMichael Lange 
381d083f849SBarry Smith   Collective
3821d641e7bSMichael Lange 
3831d641e7bSMichael Lange   Input Parameters:
3841d641e7bSMichael Lange + viewer - The viewer
385c410d8ccSBarry Smith . data   - Location to write the data, treated as an array of the type defined by `datatype`
386060da220SMatthew G. Knepley . num    - Number of items of data to read
387aec76313SJacob Faibussowitsch - dtype  - Type of data to read
3881d641e7bSMichael Lange 
3892fe279fdSBarry Smith   Output Parameter:
39001311c95SBarry Smith . count - number of items of data actually read, or `NULL`
39101311c95SBarry Smith 
39201311c95SBarry Smith   Level: beginner
393f8e4bde8SMatthew G. Knepley 
3943f423023SBarry Smith   Notes:
395c410d8ccSBarry Smith   If datatype is `PETSC_STRING` and `num` is negative, reads until a newline character is found,
396632e26b4SStefano Zampini   until a maximum of (-num - 1) chars.
397632e26b4SStefano Zampini 
39801311c95SBarry Smith   Only certain viewers, such as `PETSCVIEWERBINARY` can be read from, see `PetscViewerReadable()`
3991d641e7bSMichael Lange 
400d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
40101311c95SBarry Smith           `PetscViewerReadable()`, `PetscViewerBinaryGetDescriptor()`,
402aec76313SJacob Faibussowitsch           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`
4031d641e7bSMichael Lange @*/
404d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
405d71ae5a4SJacob Faibussowitsch {
4061d641e7bSMichael Lange   PetscFunctionBegin;
4071d641e7bSMichael Lange   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4081d641e7bSMichael Lange   if (dtype == PETSC_STRING) {
409060da220SMatthew G. Knepley     PetscInt c, i = 0, cnt;
4101d641e7bSMichael Lange     char    *s = (char *)data;
411632e26b4SStefano Zampini     if (num >= 0) {
412060da220SMatthew G. Knepley       for (c = 0; c < num; c++) {
4131d641e7bSMichael Lange         /* Skip leading whitespaces */
4149371c9d4SSatish Balay         do {
4159371c9d4SSatish Balay           PetscCall((*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR));
4169371c9d4SSatish Balay           if (!cnt) break;
4179371c9d4SSatish Balay         } while (s[i] == '\n' || s[i] == '\t' || s[i] == ' ' || s[i] == '\0' || s[i] == '\v' || s[i] == '\f' || s[i] == '\r');
4181d641e7bSMichael Lange         i++;
4191d641e7bSMichael Lange         /* Read strings one char at a time */
4209371c9d4SSatish Balay         do {
4219371c9d4SSatish Balay           PetscCall((*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR));
4229371c9d4SSatish Balay           if (!cnt) break;
4239371c9d4SSatish Balay         } 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');
4241d641e7bSMichael Lange         /* Terminate final string */
425060da220SMatthew G. Knepley         if (c == num - 1) s[i - 1] = '\0';
4261d641e7bSMichael Lange       }
427632e26b4SStefano Zampini     } else {
428632e26b4SStefano Zampini       /* Read until a \n is encountered (-num is the max size allowed) */
4299371c9d4SSatish Balay       do {
4309371c9d4SSatish Balay         PetscCall((*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR));
4319371c9d4SSatish Balay         if (i == -num || !cnt) break;
4329371c9d4SSatish Balay       } while (s[i - 1] != '\n');
433632e26b4SStefano Zampini       /* Terminate final string */
434632e26b4SStefano Zampini       s[i - 1] = '\0';
435632e26b4SStefano Zampini       c        = i;
436632e26b4SStefano Zampini     }
437060da220SMatthew G. Knepley     if (count) *count = c;
43808401ef6SPierre Jolivet     else PetscCheck(c >= num, PetscObjectComm((PetscObject)viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %" PetscInt_FMT " < %" PetscInt_FMT " strings", c, num);
439dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(viewer, read, data, num, count, dtype);
4403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4411d641e7bSMichael Lange }
442e24fdd67SVaclav Hapla 
443af684e28SVaclav Hapla /*@
444c410d8ccSBarry Smith   PetscViewerReadable - Return a flag whether the viewer can be read from with `PetscViewerRead()`
445af684e28SVaclav Hapla 
446af684e28SVaclav Hapla   Not Collective
447af684e28SVaclav Hapla 
4482fe279fdSBarry Smith   Input Parameter:
449811af0c4SBarry Smith . viewer - the `PetscViewer` context
450af684e28SVaclav Hapla 
4512fe279fdSBarry Smith   Output Parameter:
452811af0c4SBarry Smith . flg - `PETSC_TRUE` if the viewer is readable, `PETSC_FALSE` otherwise
453af684e28SVaclav Hapla 
45401311c95SBarry Smith   Level: intermediate
45501311c95SBarry Smith 
456811af0c4SBarry Smith   Note:
457c410d8ccSBarry Smith   `PETSC_TRUE` means that viewer's `PetscViewerType` supports reading, that is `PetscViewerRead()`, (this holds e.g. for `PETSCVIEWERBINARY`)
458c410d8ccSBarry Smith   and the viewer is in a mode allowing reading, i.e. `PetscViewerFileGetMode()`
459811af0c4SBarry Smith   returns one of `FILE_MODE_READ`, `FILE_MODE_UPDATE`, `FILE_MODE_APPEND_UPDATE`.
460af684e28SVaclav Hapla 
46101311c95SBarry Smith .seealso: [](sec_viewers), `PetscViewerRead()`, `PetscViewer`, `PetscViewerWritable()`, `PetscViewerCheckReadable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
462af684e28SVaclav Hapla @*/
463d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerReadable(PetscViewer viewer, PetscBool *flg)
464d71ae5a4SJacob Faibussowitsch {
465e24fdd67SVaclav Hapla   PetscFileMode mode;
466e24fdd67SVaclav Hapla   PetscErrorCode (*f)(PetscViewer, PetscFileMode *) = NULL;
467e24fdd67SVaclav Hapla 
468e24fdd67SVaclav Hapla   PetscFunctionBegin;
469e24fdd67SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4704f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
4719566063dSJacob Faibussowitsch   PetscCall(PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f));
472e24fdd67SVaclav Hapla   *flg = PETSC_FALSE;
4733ba16761SJacob Faibussowitsch   if (!f) PetscFunctionReturn(PETSC_SUCCESS);
4749566063dSJacob Faibussowitsch   PetscCall((*f)(viewer, &mode));
475e24fdd67SVaclav Hapla   switch (mode) {
476e24fdd67SVaclav Hapla   case FILE_MODE_READ:
477e24fdd67SVaclav Hapla   case FILE_MODE_UPDATE:
478d71ae5a4SJacob Faibussowitsch   case FILE_MODE_APPEND_UPDATE:
479d71ae5a4SJacob Faibussowitsch     *flg = PETSC_TRUE;
480d71ae5a4SJacob Faibussowitsch   default:
481d71ae5a4SJacob Faibussowitsch     break;
482e24fdd67SVaclav Hapla   }
4833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
484e24fdd67SVaclav Hapla }
485e24fdd67SVaclav Hapla 
486af684e28SVaclav Hapla /*@
487c410d8ccSBarry Smith   PetscViewerWritable - Return a flag whether the viewer can be written to with `PetscViewerWrite()`
488af684e28SVaclav Hapla 
489af684e28SVaclav Hapla   Not Collective
490af684e28SVaclav Hapla 
4912fe279fdSBarry Smith   Input Parameter:
492811af0c4SBarry Smith . viewer - the `PetscViewer` context
493af684e28SVaclav Hapla 
4942fe279fdSBarry Smith   Output Parameter:
495811af0c4SBarry Smith . flg - `PETSC_TRUE` if the viewer is writable, `PETSC_FALSE` otherwise
496af684e28SVaclav Hapla 
49701311c95SBarry Smith   Level: intermediate
49801311c95SBarry Smith 
499811af0c4SBarry Smith   Note:
500811af0c4SBarry Smith   `PETSC_TRUE` means viewer is in a mode allowing writing, i.e. `PetscViewerFileGetMode()`
501811af0c4SBarry Smith   returns one of `FILE_MODE_WRITE`, `FILE_MODE_APPEND`, `FILE_MODE_UPDATE`, `FILE_MODE_APPEND_UPDATE`.
502af684e28SVaclav Hapla 
503d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerReadable()`, `PetscViewerCheckWritable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
504af684e28SVaclav Hapla @*/
505d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerWritable(PetscViewer viewer, PetscBool *flg)
506d71ae5a4SJacob Faibussowitsch {
507e24fdd67SVaclav Hapla   PetscFileMode mode;
508e24fdd67SVaclav Hapla   PetscErrorCode (*f)(PetscViewer, PetscFileMode *) = NULL;
509e24fdd67SVaclav Hapla 
510e24fdd67SVaclav Hapla   PetscFunctionBegin;
511e24fdd67SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5124f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
5139566063dSJacob Faibussowitsch   PetscCall(PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f));
514e24fdd67SVaclav Hapla   *flg = PETSC_TRUE;
5153ba16761SJacob Faibussowitsch   if (!f) PetscFunctionReturn(PETSC_SUCCESS);
5169566063dSJacob Faibussowitsch   PetscCall((*f)(viewer, &mode));
517e24fdd67SVaclav Hapla   if (mode == FILE_MODE_READ) *flg = PETSC_FALSE;
5183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
519e24fdd67SVaclav Hapla }
520e24fdd67SVaclav Hapla 
521af684e28SVaclav Hapla /*@
522811af0c4SBarry Smith   PetscViewerCheckReadable - Check whether the viewer can be read from, generates an error if not
523af684e28SVaclav Hapla 
524af684e28SVaclav Hapla   Collective
525af684e28SVaclav Hapla 
5262fe279fdSBarry Smith   Input Parameter:
527811af0c4SBarry Smith . viewer - the `PetscViewer` context
528af684e28SVaclav Hapla 
529af684e28SVaclav Hapla   Level: intermediate
530af684e28SVaclav Hapla 
531d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerReadable()`, `PetscViewerCheckWritable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
532af684e28SVaclav Hapla @*/
533d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCheckReadable(PetscViewer viewer)
534d71ae5a4SJacob Faibussowitsch {
535d01f05b1SVaclav Hapla   PetscBool flg;
536d01f05b1SVaclav Hapla 
537d01f05b1SVaclav Hapla   PetscFunctionBegin;
5380af448b7SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5399566063dSJacob Faibussowitsch   PetscCall(PetscViewerReadable(viewer, &flg));
54028b400f6SJacob Faibussowitsch   PetscCheck(flg, 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)");
5413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
542d01f05b1SVaclav Hapla }
543d01f05b1SVaclav Hapla 
544af684e28SVaclav Hapla /*@
545811af0c4SBarry Smith   PetscViewerCheckWritable - Check whether the viewer can be written to, generates an error if not
546af684e28SVaclav Hapla 
547af684e28SVaclav Hapla   Collective
548af684e28SVaclav Hapla 
5492fe279fdSBarry Smith   Input Parameter:
550811af0c4SBarry Smith . viewer - the `PetscViewer` context
551af684e28SVaclav Hapla 
552af684e28SVaclav Hapla   Level: intermediate
553af684e28SVaclav Hapla 
554d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerWritable()`, `PetscViewerCheckReadable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
555af684e28SVaclav Hapla @*/
556d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCheckWritable(PetscViewer viewer)
557d71ae5a4SJacob Faibussowitsch {
558d01f05b1SVaclav Hapla   PetscBool flg;
559d01f05b1SVaclav Hapla 
560d01f05b1SVaclav Hapla   PetscFunctionBegin;
5610af448b7SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5629566063dSJacob Faibussowitsch   PetscCall(PetscViewerWritable(viewer, &flg));
56328b400f6SJacob Faibussowitsch   PetscCheck(flg, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support writing, or is in FILE_MODE_READ mode");
5643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
565d01f05b1SVaclav Hapla }
566