xref: /petsc/src/sys/classes/viewer/interface/view.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed)
1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/
2798534f6SMatthew G. Knepley #include <petscdraw.h>
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith PetscClassId PETSC_VIEWER_CLASSID;
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith static PetscBool PetscViewerPackageInitialized = PETSC_FALSE;
766976f2fSJacob Faibussowitsch 
85c6c1daeSBarry Smith /*@C
9c410d8ccSBarry Smith   PetscViewerFinalizePackage - This function destroys any global objects created in PETSc viewers. It is
10811af0c4SBarry Smith   called from `PetscFinalize()`.
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith   Level: developer
135c6c1daeSBarry Smith 
143f423023SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscFinalize()`, `PetscViewerInitializePackage()`
155c6c1daeSBarry Smith @*/
16d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFinalizePackage(void)
17d71ae5a4SJacob Faibussowitsch {
185c6c1daeSBarry Smith   PetscFunctionBegin;
1948a46eb9SPierre Jolivet   if (Petsc_Viewer_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_keyval));
2048a46eb9SPierre Jolivet   if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Stdout_keyval));
2148a46eb9SPierre Jolivet   if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Stderr_keyval));
2248a46eb9SPierre Jolivet   if (Petsc_Viewer_Binary_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Binary_keyval));
2348a46eb9SPierre Jolivet   if (Petsc_Viewer_Draw_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Draw_keyval));
24b6dade52SBarry Smith #if defined(PETSC_HAVE_HDF5)
2548a46eb9SPierre Jolivet   if (Petsc_Viewer_HDF5_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_HDF5_keyval));
26b6dade52SBarry Smith #endif
27b6dade52SBarry Smith #if defined(PETSC_USE_SOCKETVIEWER)
2848a46eb9SPierre Jolivet   if (Petsc_Viewer_Socket_keyval != MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_free_keyval(&Petsc_Viewer_Socket_keyval));
29b6dade52SBarry Smith #endif
309566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscViewerList));
315c6c1daeSBarry Smith   PetscViewerPackageInitialized = PETSC_FALSE;
320f51fdf8SToby Isaac   PetscViewerRegisterAllCalled  = PETSC_FALSE;
333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
345c6c1daeSBarry Smith }
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith /*@C
37811af0c4SBarry Smith   PetscViewerInitializePackage - This function initializes everything in the `PetscViewer` package.
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith   Level: developer
405c6c1daeSBarry Smith 
413f423023SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscInitialize()`, `PetscViewerFinalizePackage()`
425c6c1daeSBarry Smith @*/
43d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerInitializePackage(void)
44d71ae5a4SJacob Faibussowitsch {
455c6c1daeSBarry Smith   char      logList[256];
468e81d068SLisandro Dalcin   PetscBool opt, pkg;
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith   PetscFunctionBegin;
493ba16761SJacob Faibussowitsch   if (PetscViewerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
505c6c1daeSBarry Smith   PetscViewerPackageInitialized = PETSC_TRUE;
515c6c1daeSBarry Smith   /* Register Classes */
529566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Viewer", &PETSC_VIEWER_CLASSID));
535c6c1daeSBarry Smith   /* Register Constructors */
549566063dSJacob Faibussowitsch   PetscCall(PetscViewerRegisterAll());
55e94e781bSJacob Faibussowitsch   /* Process Info */
56e94e781bSJacob Faibussowitsch   {
57e94e781bSJacob Faibussowitsch     PetscClassId classids[1];
58e94e781bSJacob Faibussowitsch 
59e94e781bSJacob Faibussowitsch     classids[0] = PETSC_VIEWER_CLASSID;
609566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("viewer", 1, classids));
615c6c1daeSBarry Smith   }
625c6c1daeSBarry Smith   /* Process summary exclusions */
639566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
645c6c1daeSBarry Smith   if (opt) {
659566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("viewer", logList, ',', &pkg));
669566063dSJacob Faibussowitsch     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSC_VIEWER_CLASSID));
675c6c1daeSBarry Smith   }
685c6c1daeSBarry Smith #if defined(PETSC_HAVE_MATHEMATICA)
699566063dSJacob Faibussowitsch   PetscCall(PetscViewerMathematicaInitializePackage());
705c6c1daeSBarry Smith #endif
718e81d068SLisandro Dalcin   /* Register package finalizer */
729566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscViewerFinalizePackage));
733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
745c6c1daeSBarry Smith }
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith /*@
77811af0c4SBarry Smith   PetscViewerDestroy - Destroys a `PetscViewer`.
785c6c1daeSBarry Smith 
79c3339decSBarry Smith   Collective
805c6c1daeSBarry Smith 
812fe279fdSBarry Smith   Input Parameter:
82811af0c4SBarry Smith . viewer - the `PetscViewer` to be destroyed.
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith   Level: beginner
855c6c1daeSBarry Smith 
86aec76313SJacob Faibussowitsch .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`
875c6c1daeSBarry Smith @*/
88d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDestroy(PetscViewer *viewer)
89d71ae5a4SJacob Faibussowitsch {
905c6c1daeSBarry Smith   PetscFunctionBegin;
913ba16761SJacob Faibussowitsch   if (!*viewer) PetscFunctionReturn(PETSC_SUCCESS);
925c6c1daeSBarry Smith   PetscValidHeaderSpecific(*viewer, PETSC_VIEWER_CLASSID, 1);
935c6c1daeSBarry Smith 
949566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(*viewer));
95*f4f49eeaSPierre Jolivet   if (--((PetscObject)*viewer)->refct > 0) {
969371c9d4SSatish Balay     *viewer = NULL;
973ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
989371c9d4SSatish Balay   }
995c6c1daeSBarry Smith 
1009566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*viewer));
101213acdd3SPierre Jolivet   PetscTryTypeMethod(*viewer, destroy);
1029566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(viewer));
1033ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1045c6c1daeSBarry Smith }
1055c6c1daeSBarry Smith 
106d7cbc13eSBarry Smith /*@C
107811af0c4SBarry Smith   PetscViewerAndFormatCreate - Creates a `PetscViewerAndFormat` struct.
108d7cbc13eSBarry Smith 
109c3339decSBarry Smith   Collective
110d7cbc13eSBarry Smith 
111d7cbc13eSBarry Smith   Input Parameters:
112d7cbc13eSBarry Smith + viewer - the viewer
113d7cbc13eSBarry Smith - format - the format
114d7cbc13eSBarry Smith 
115d7cbc13eSBarry Smith   Output Parameter:
116d7cbc13eSBarry Smith . vf - viewer and format object
117d7cbc13eSBarry Smith 
118d7cbc13eSBarry Smith   Level: developer
119d7cbc13eSBarry Smith 
120811af0c4SBarry Smith   Notes:
1213f423023SBarry Smith   This increases the reference count of the viewer.
1223f423023SBarry Smith 
1233f423023SBarry Smith   Use `PetscViewerAndFormatDestroy()` to free the struct
124811af0c4SBarry Smith 
125811af0c4SBarry Smith   This is used as the context variable for many of the `TS`, `SNES`, and `KSP` monitor functions
126d7cbc13eSBarry Smith 
1273f423023SBarry Smith   This construct exists because it allows one to keep track of the use of a `PetscViewerFormat` without requiring the
1283f423023SBarry Smith   format in the viewer to be permanently changed.
1293f423023SBarry Smith 
130c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAndFormat`, `PetscViewerFormat`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerCreate()`,
1313f423023SBarry Smith           `PetscViewerDrawOpen()`, `PetscViewerAndFormatDestroy()`
132d7cbc13eSBarry Smith @*/
133d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAndFormatCreate(PetscViewer viewer, PetscViewerFormat format, PetscViewerAndFormat **vf)
134d71ae5a4SJacob Faibussowitsch {
135d7cbc13eSBarry Smith   PetscFunctionBegin;
136cd791dc2SBarry Smith   if (!((PetscObject)viewer)->persistent) PetscCall(PetscObjectReference((PetscObject)viewer));
1379566063dSJacob Faibussowitsch   PetscCall(PetscNew(vf));
138d7cbc13eSBarry Smith   (*vf)->viewer = viewer;
139d7cbc13eSBarry Smith   (*vf)->format = format;
140798534f6SMatthew G. Knepley   (*vf)->lg     = NULL;
141798534f6SMatthew G. Knepley   (*vf)->data   = NULL;
1423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
143d7cbc13eSBarry Smith }
144d7cbc13eSBarry Smith 
145fe01d993SBarry Smith /*@C
1463f423023SBarry Smith   PetscViewerAndFormatDestroy - Destroys a `PetscViewerAndFormat` struct created with `PetscViewerAndFormatCreate()`
147fe01d993SBarry Smith 
148c3339decSBarry Smith   Collective
149fe01d993SBarry Smith 
1502fe279fdSBarry Smith   Input Parameter:
151811af0c4SBarry Smith . vf - the `PetscViewerAndFormat` to be destroyed.
152fe01d993SBarry Smith 
153d7cbc13eSBarry Smith   Level: developer
154fe01d993SBarry Smith 
155c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAndFormat`, `PetscViewerFormat`, `PetscViewerAndFormatCreate()`, `PetscViewerSocketOpen()`,
15642747ad1SJacob Faibussowitsch           `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`
157fe01d993SBarry Smith @*/
158d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
159d71ae5a4SJacob Faibussowitsch {
160fe01d993SBarry Smith   PetscFunctionBegin;
161cd791dc2SBarry Smith   if (!((PetscObject)((*vf)->viewer))->persistent) PetscCall(PetscViewerDestroy(&(*vf)->viewer));
1629566063dSJacob Faibussowitsch   PetscCall(PetscDrawLGDestroy(&(*vf)->lg));
1639566063dSJacob Faibussowitsch   PetscCall(PetscFree(*vf));
1643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
165fe01d993SBarry Smith }
166fe01d993SBarry Smith 
1675c6c1daeSBarry Smith /*@C
168811af0c4SBarry Smith   PetscViewerGetType - Returns the type of a `PetscViewer`.
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith   Not Collective
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith   Input Parameter:
173811af0c4SBarry Smith . viewer - the `PetscViewer`
1745c6c1daeSBarry Smith 
1755c6c1daeSBarry Smith   Output Parameter:
17610450e9eSJacob Faibussowitsch . type - `PetscViewerType`
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith   Level: intermediate
1795c6c1daeSBarry Smith 
1805c6c1daeSBarry Smith   Note:
181811af0c4SBarry Smith   `PetscViewerType` is actually a string
1825c6c1daeSBarry Smith 
183aec76313SJacob Faibussowitsch .seealso: [](sec_viewers), `PetscViewerType`, `PetscViewer`, `PetscViewerCreate()`, `PetscViewerSetType()`
1845c6c1daeSBarry Smith @*/
185d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetType(PetscViewer viewer, PetscViewerType *type)
186d71ae5a4SJacob Faibussowitsch {
1875c6c1daeSBarry Smith   PetscFunctionBegin;
1885c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
1894f572ea9SToby Isaac   PetscAssertPointer(type, 2);
1905c6c1daeSBarry Smith   *type = ((PetscObject)viewer)->type_name;
1913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1925c6c1daeSBarry Smith }
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith /*@C
195c410d8ccSBarry Smith   PetscViewerSetOptionsPrefix - Sets the prefix used for searching for
196c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
1975c6c1daeSBarry Smith 
198c3339decSBarry Smith   Logically Collective
1995c6c1daeSBarry Smith 
200d8d19677SJose E. Roman   Input Parameters:
201811af0c4SBarry Smith + viewer - the `PetscViewer` context
2025c6c1daeSBarry Smith - prefix - the prefix to prepend to all option names
2035c6c1daeSBarry Smith 
204811af0c4SBarry Smith   Note:
2055c6c1daeSBarry Smith   A hyphen (-) must NOT be given at the beginning of the prefix name.
2065c6c1daeSBarry Smith   The first character of all runtime options is AUTOMATICALLY the hyphen.
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith   Level: advanced
2095c6c1daeSBarry Smith 
210c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerSetFromOptions()`, `PetscViewerAppendOptionsPrefix()`
2115c6c1daeSBarry Smith @*/
212d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetOptionsPrefix(PetscViewer viewer, const char prefix[])
213d71ae5a4SJacob Faibussowitsch {
2145c6c1daeSBarry Smith   PetscFunctionBegin;
2155c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2169566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)viewer, prefix));
2173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2185c6c1daeSBarry Smith }
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith /*@C
221c410d8ccSBarry Smith   PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for
222c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
2235c6c1daeSBarry Smith 
224c3339decSBarry Smith   Logically Collective
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith   Input Parameters:
22701311c95SBarry Smith + viewer - the `PetscViewer` context
2285c6c1daeSBarry Smith - prefix - the prefix to prepend to all option names
2295c6c1daeSBarry Smith 
23001311c95SBarry Smith   Level: advanced
23101311c95SBarry Smith 
232811af0c4SBarry Smith   Note:
2335c6c1daeSBarry Smith   A hyphen (-) must NOT be given at the beginning of the prefix name.
2345c6c1daeSBarry Smith   The first character of all runtime options is AUTOMATICALLY the hyphen.
2355c6c1daeSBarry Smith 
236c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerGetOptionsPrefix()`, `PetscViewerSetOptionsPrefix()`
2375c6c1daeSBarry Smith @*/
238d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAppendOptionsPrefix(PetscViewer viewer, const char prefix[])
239d71ae5a4SJacob Faibussowitsch {
2405c6c1daeSBarry Smith   PetscFunctionBegin;
2415c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2429566063dSJacob Faibussowitsch   PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)viewer, prefix));
2433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2445c6c1daeSBarry Smith }
2455c6c1daeSBarry Smith 
2465c6c1daeSBarry Smith /*@C
247c410d8ccSBarry Smith   PetscViewerGetOptionsPrefix - Gets the prefix used for searching for
248c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
2495c6c1daeSBarry Smith 
2505c6c1daeSBarry Smith   Not Collective
2515c6c1daeSBarry Smith 
2525c6c1daeSBarry Smith   Input Parameter:
253811af0c4SBarry Smith . viewer - the `PetscViewer` context
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith   Output Parameter:
2565c6c1daeSBarry Smith . prefix - pointer to the prefix string used
2575c6c1daeSBarry Smith 
25801311c95SBarry Smith   Level: advanced
25901311c95SBarry Smith 
260aec76313SJacob Faibussowitsch   Fortran Notes:
261811af0c4SBarry Smith   The user should pass in a string 'prefix' of sufficient length to hold the prefix.
2625c6c1daeSBarry Smith 
263c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAppendOptionsPrefix()`, `PetscViewerSetOptionsPrefix()`
2645c6c1daeSBarry Smith @*/
265d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetOptionsPrefix(PetscViewer viewer, const char *prefix[])
266d71ae5a4SJacob Faibussowitsch {
2675c6c1daeSBarry Smith   PetscFunctionBegin;
2685c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2699566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetOptionsPrefix((PetscObject)viewer, prefix));
2703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2715c6c1daeSBarry Smith }
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith /*@
2745c6c1daeSBarry Smith   PetscViewerSetUp - Sets up the internal viewer data structures for the later use.
2755c6c1daeSBarry Smith 
276c3339decSBarry Smith   Collective
2775c6c1daeSBarry Smith 
2782fe279fdSBarry Smith   Input Parameter:
279811af0c4SBarry Smith . viewer - the `PetscViewer` context
2805c6c1daeSBarry Smith 
28101311c95SBarry Smith   Level: advanced
28201311c95SBarry Smith 
283811af0c4SBarry Smith   Note:
284811af0c4SBarry Smith   For basic use of the `PetscViewer` classes the user need not explicitly call
285811af0c4SBarry Smith   `PetscViewerSetUp()`, since these actions will happen automatically.
2865c6c1daeSBarry Smith 
287d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerDestroy()`
2885c6c1daeSBarry Smith @*/
289d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetUp(PetscViewer viewer)
290d71ae5a4SJacob Faibussowitsch {
2915c6c1daeSBarry Smith   PetscFunctionBegin;
2925c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2933ba16761SJacob Faibussowitsch   if (viewer->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
294dbbe0bcdSBarry Smith   PetscTryTypeMethod(viewer, setup);
295c98fd787SBarry Smith   viewer->setupcalled = PETSC_TRUE;
2963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2975c6c1daeSBarry Smith }
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith /*@C
3003f423023SBarry Smith   PetscViewerViewFromOptions - View from the viewer based on options in the options database
301fe2efc57SMark 
302c3339decSBarry Smith   Collective
303fe2efc57SMark 
304fe2efc57SMark   Input Parameters:
305811af0c4SBarry Smith + A    - the `PetscViewer` context
306811af0c4SBarry Smith . obj  - Optional object that provides the prefix for the option names
307736c3998SJose E. Roman - name - command line option
308fe2efc57SMark 
309fe2efc57SMark   Level: intermediate
310811af0c4SBarry Smith 
3113f423023SBarry Smith   Note:
3123f423023SBarry Smith   See `PetscObjectViewFromOptions()` for details on the viewers and formats support via this interface
3133f423023SBarry Smith 
314d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerView`, `PetscObjectViewFromOptions()`, `PetscViewerCreate()`
315fe2efc57SMark @*/
316d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerViewFromOptions(PetscViewer A, PetscObject obj, const char name[])
317d71ae5a4SJacob Faibussowitsch {
318fe2efc57SMark   PetscFunctionBegin;
319fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_VIEWER_CLASSID, 1);
3209566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
3213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
322fe2efc57SMark }
323fe2efc57SMark 
324fe2efc57SMark /*@C
3255c6c1daeSBarry Smith   PetscViewerView - Visualizes a viewer object.
3265c6c1daeSBarry Smith 
327c3339decSBarry Smith   Collective
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith   Input Parameters:
330f0d4698bSVaclav Hapla + v      - the viewer to be viewed
3315c6c1daeSBarry Smith - viewer - visualization context
3325c6c1daeSBarry Smith 
3335c6c1daeSBarry Smith   Level: beginner
3345c6c1daeSBarry Smith 
335d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerPushFormat()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`,
336db781477SPatrick Sanan           `PetscViewerSocketOpen()`, `PetscViewerBinaryOpen()`, `PetscViewerLoad()`
3375c6c1daeSBarry Smith @*/
338d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerView(PetscViewer v, PetscViewer viewer)
339d71ae5a4SJacob Faibussowitsch {
3405c6c1daeSBarry Smith   PetscBool         iascii;
3415c6c1daeSBarry Smith   PetscViewerFormat format;
342e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
343536b137fSBarry Smith   PetscBool issaws;
3440076e027SBarry Smith #endif
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith   PetscFunctionBegin;
3475c6c1daeSBarry Smith   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3485c6c1daeSBarry Smith   PetscValidType(v, 1);
34948a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v), &viewer));
3505c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
3515c6c1daeSBarry Smith   PetscCheckSameComm(v, 1, viewer, 2);
3525c6c1daeSBarry Smith 
3539566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
354e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
3559566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
3560076e027SBarry Smith #endif
3575c6c1daeSBarry Smith   if (iascii) {
3589566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(viewer, &format));
3599566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)v, viewer));
36098c3331eSBarry Smith     if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
36148a46eb9SPierre Jolivet       if (v->format) PetscCall(PetscViewerASCIIPrintf(viewer, "  Viewer format = %s\n", PetscViewerFormats[v->format]));
3629566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
363dbbe0bcdSBarry Smith       PetscTryTypeMethod(v, view, viewer);
3649566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
3655c6c1daeSBarry Smith     }
366e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
367536b137fSBarry Smith   } else if (issaws) {
3680076e027SBarry Smith     if (!((PetscObject)v)->amsmem) {
3699566063dSJacob Faibussowitsch       PetscCall(PetscObjectViewSAWs((PetscObject)v, viewer));
370dbbe0bcdSBarry Smith       PetscTryTypeMethod(v, view, viewer);
3710076e027SBarry Smith     }
3720076e027SBarry Smith #endif
3735c6c1daeSBarry Smith   }
3743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3755c6c1daeSBarry Smith }
3761d641e7bSMichael Lange 
3771d641e7bSMichael Lange /*@C
378811af0c4SBarry Smith   PetscViewerRead - Reads data from a `PetscViewer`
3791d641e7bSMichael Lange 
380d083f849SBarry Smith   Collective
3811d641e7bSMichael Lange 
3821d641e7bSMichael Lange   Input Parameters:
3831d641e7bSMichael Lange + viewer - The viewer
384c410d8ccSBarry Smith . data   - Location to write the data, treated as an array of the type defined by `datatype`
385060da220SMatthew G. Knepley . num    - Number of items of data to read
386aec76313SJacob Faibussowitsch - dtype  - Type of data to read
3871d641e7bSMichael Lange 
3882fe279fdSBarry Smith   Output Parameter:
38901311c95SBarry Smith . count - number of items of data actually read, or `NULL`
39001311c95SBarry Smith 
39101311c95SBarry Smith   Level: beginner
392f8e4bde8SMatthew G. Knepley 
3933f423023SBarry Smith   Notes:
394c410d8ccSBarry Smith   If datatype is `PETSC_STRING` and `num` is negative, reads until a newline character is found,
395632e26b4SStefano Zampini   until a maximum of (-num - 1) chars.
396632e26b4SStefano Zampini 
39701311c95SBarry Smith   Only certain viewers, such as `PETSCVIEWERBINARY` can be read from, see `PetscViewerReadable()`
3981d641e7bSMichael Lange 
399d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
40001311c95SBarry Smith           `PetscViewerReadable()`, `PetscViewerBinaryGetDescriptor()`,
401aec76313SJacob Faibussowitsch           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`
4021d641e7bSMichael Lange @*/
403d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
404d71ae5a4SJacob Faibussowitsch {
4051d641e7bSMichael Lange   PetscFunctionBegin;
4061d641e7bSMichael Lange   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4071d641e7bSMichael Lange   if (dtype == PETSC_STRING) {
408060da220SMatthew G. Knepley     PetscInt c, i = 0, cnt;
4091d641e7bSMichael Lange     char    *s = (char *)data;
410632e26b4SStefano Zampini     if (num >= 0) {
411060da220SMatthew G. Knepley       for (c = 0; c < num; c++) {
4121d641e7bSMichael Lange         /* Skip leading whitespaces */
4139371c9d4SSatish Balay         do {
414*f4f49eeaSPierre Jolivet           PetscUseTypeMethod(viewer, read, &s[i], 1, &cnt, PETSC_CHAR);
4159371c9d4SSatish Balay           if (!cnt) break;
4169371c9d4SSatish Balay         } while (s[i] == '\n' || s[i] == '\t' || s[i] == ' ' || s[i] == '\0' || s[i] == '\v' || s[i] == '\f' || s[i] == '\r');
4171d641e7bSMichael Lange         i++;
4181d641e7bSMichael Lange         /* Read strings one char at a time */
4199371c9d4SSatish Balay         do {
420*f4f49eeaSPierre Jolivet           PetscUseTypeMethod(viewer, read, &s[i++], 1, &cnt, PETSC_CHAR);
4219371c9d4SSatish Balay           if (!cnt) break;
4229371c9d4SSatish 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');
4231d641e7bSMichael Lange         /* Terminate final string */
424060da220SMatthew G. Knepley         if (c == num - 1) s[i - 1] = '\0';
4251d641e7bSMichael Lange       }
426632e26b4SStefano Zampini     } else {
427632e26b4SStefano Zampini       /* Read until a \n is encountered (-num is the max size allowed) */
4289371c9d4SSatish Balay       do {
429*f4f49eeaSPierre Jolivet         PetscUseTypeMethod(viewer, read, &s[i++], 1, &cnt, PETSC_CHAR);
4309371c9d4SSatish Balay         if (i == -num || !cnt) break;
4319371c9d4SSatish Balay       } while (s[i - 1] != '\n');
432632e26b4SStefano Zampini       /* Terminate final string */
433632e26b4SStefano Zampini       s[i - 1] = '\0';
434632e26b4SStefano Zampini       c        = i;
435632e26b4SStefano Zampini     }
436060da220SMatthew G. Knepley     if (count) *count = c;
43708401ef6SPierre Jolivet     else PetscCheck(c >= num, PetscObjectComm((PetscObject)viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %" PetscInt_FMT " < %" PetscInt_FMT " strings", c, num);
438dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(viewer, read, data, num, count, dtype);
4393ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4401d641e7bSMichael Lange }
441e24fdd67SVaclav Hapla 
442af684e28SVaclav Hapla /*@
443c410d8ccSBarry Smith   PetscViewerReadable - Return a flag whether the viewer can be read from with `PetscViewerRead()`
444af684e28SVaclav Hapla 
445af684e28SVaclav Hapla   Not Collective
446af684e28SVaclav Hapla 
4472fe279fdSBarry Smith   Input Parameter:
448811af0c4SBarry Smith . viewer - the `PetscViewer` context
449af684e28SVaclav Hapla 
4502fe279fdSBarry Smith   Output Parameter:
451811af0c4SBarry Smith . flg - `PETSC_TRUE` if the viewer is readable, `PETSC_FALSE` otherwise
452af684e28SVaclav Hapla 
45301311c95SBarry Smith   Level: intermediate
45401311c95SBarry Smith 
455811af0c4SBarry Smith   Note:
456c410d8ccSBarry Smith   `PETSC_TRUE` means that viewer's `PetscViewerType` supports reading, that is `PetscViewerRead()`, (this holds e.g. for `PETSCVIEWERBINARY`)
457c410d8ccSBarry Smith   and the viewer is in a mode allowing reading, i.e. `PetscViewerFileGetMode()`
458811af0c4SBarry Smith   returns one of `FILE_MODE_READ`, `FILE_MODE_UPDATE`, `FILE_MODE_APPEND_UPDATE`.
459af684e28SVaclav Hapla 
46001311c95SBarry Smith .seealso: [](sec_viewers), `PetscViewerRead()`, `PetscViewer`, `PetscViewerWritable()`, `PetscViewerCheckReadable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
461af684e28SVaclav Hapla @*/
462d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerReadable(PetscViewer viewer, PetscBool *flg)
463d71ae5a4SJacob Faibussowitsch {
464e24fdd67SVaclav Hapla   PetscFileMode mode;
465e24fdd67SVaclav Hapla   PetscErrorCode (*f)(PetscViewer, PetscFileMode *) = NULL;
466e24fdd67SVaclav Hapla 
467e24fdd67SVaclav Hapla   PetscFunctionBegin;
468e24fdd67SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4694f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
4709566063dSJacob Faibussowitsch   PetscCall(PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f));
471e24fdd67SVaclav Hapla   *flg = PETSC_FALSE;
4723ba16761SJacob Faibussowitsch   if (!f) PetscFunctionReturn(PETSC_SUCCESS);
4739566063dSJacob Faibussowitsch   PetscCall((*f)(viewer, &mode));
474e24fdd67SVaclav Hapla   switch (mode) {
475e24fdd67SVaclav Hapla   case FILE_MODE_READ:
476e24fdd67SVaclav Hapla   case FILE_MODE_UPDATE:
477d71ae5a4SJacob Faibussowitsch   case FILE_MODE_APPEND_UPDATE:
478d71ae5a4SJacob Faibussowitsch     *flg = PETSC_TRUE;
479d71ae5a4SJacob Faibussowitsch   default:
480d71ae5a4SJacob Faibussowitsch     break;
481e24fdd67SVaclav Hapla   }
4823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
483e24fdd67SVaclav Hapla }
484e24fdd67SVaclav Hapla 
485af684e28SVaclav Hapla /*@
486c410d8ccSBarry Smith   PetscViewerWritable - Return a flag whether the viewer can be written to with `PetscViewerWrite()`
487af684e28SVaclav Hapla 
488af684e28SVaclav Hapla   Not Collective
489af684e28SVaclav Hapla 
4902fe279fdSBarry Smith   Input Parameter:
491811af0c4SBarry Smith . viewer - the `PetscViewer` context
492af684e28SVaclav Hapla 
4932fe279fdSBarry Smith   Output Parameter:
494811af0c4SBarry Smith . flg - `PETSC_TRUE` if the viewer is writable, `PETSC_FALSE` otherwise
495af684e28SVaclav Hapla 
49601311c95SBarry Smith   Level: intermediate
49701311c95SBarry Smith 
498811af0c4SBarry Smith   Note:
499811af0c4SBarry Smith   `PETSC_TRUE` means viewer is in a mode allowing writing, i.e. `PetscViewerFileGetMode()`
500811af0c4SBarry Smith   returns one of `FILE_MODE_WRITE`, `FILE_MODE_APPEND`, `FILE_MODE_UPDATE`, `FILE_MODE_APPEND_UPDATE`.
501af684e28SVaclav Hapla 
502d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerReadable()`, `PetscViewerCheckWritable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
503af684e28SVaclav Hapla @*/
504d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerWritable(PetscViewer viewer, PetscBool *flg)
505d71ae5a4SJacob Faibussowitsch {
506e24fdd67SVaclav Hapla   PetscFileMode mode;
507e24fdd67SVaclav Hapla   PetscErrorCode (*f)(PetscViewer, PetscFileMode *) = NULL;
508e24fdd67SVaclav Hapla 
509e24fdd67SVaclav Hapla   PetscFunctionBegin;
510e24fdd67SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5114f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
5129566063dSJacob Faibussowitsch   PetscCall(PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f));
513e24fdd67SVaclav Hapla   *flg = PETSC_TRUE;
5143ba16761SJacob Faibussowitsch   if (!f) PetscFunctionReturn(PETSC_SUCCESS);
5159566063dSJacob Faibussowitsch   PetscCall((*f)(viewer, &mode));
516e24fdd67SVaclav Hapla   if (mode == FILE_MODE_READ) *flg = PETSC_FALSE;
5173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
518e24fdd67SVaclav Hapla }
519e24fdd67SVaclav Hapla 
520af684e28SVaclav Hapla /*@
521811af0c4SBarry Smith   PetscViewerCheckReadable - Check whether the viewer can be read from, generates an error if not
522af684e28SVaclav Hapla 
523af684e28SVaclav Hapla   Collective
524af684e28SVaclav Hapla 
5252fe279fdSBarry Smith   Input Parameter:
526811af0c4SBarry Smith . viewer - the `PetscViewer` context
527af684e28SVaclav Hapla 
528af684e28SVaclav Hapla   Level: intermediate
529af684e28SVaclav Hapla 
530d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerReadable()`, `PetscViewerCheckWritable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
531af684e28SVaclav Hapla @*/
532d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCheckReadable(PetscViewer viewer)
533d71ae5a4SJacob Faibussowitsch {
534d01f05b1SVaclav Hapla   PetscBool flg;
535d01f05b1SVaclav Hapla 
536d01f05b1SVaclav Hapla   PetscFunctionBegin;
5370af448b7SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5389566063dSJacob Faibussowitsch   PetscCall(PetscViewerReadable(viewer, &flg));
53928b400f6SJacob 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)");
5403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
541d01f05b1SVaclav Hapla }
542d01f05b1SVaclav Hapla 
543af684e28SVaclav Hapla /*@
544811af0c4SBarry Smith   PetscViewerCheckWritable - Check whether the viewer can be written to, generates an error if not
545af684e28SVaclav Hapla 
546af684e28SVaclav Hapla   Collective
547af684e28SVaclav Hapla 
5482fe279fdSBarry Smith   Input Parameter:
549811af0c4SBarry Smith . viewer - the `PetscViewer` context
550af684e28SVaclav Hapla 
551af684e28SVaclav Hapla   Level: intermediate
552af684e28SVaclav Hapla 
553d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerWritable()`, `PetscViewerCheckReadable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
554af684e28SVaclav Hapla @*/
555d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCheckWritable(PetscViewer viewer)
556d71ae5a4SJacob Faibussowitsch {
557d01f05b1SVaclav Hapla   PetscBool flg;
558d01f05b1SVaclav Hapla 
559d01f05b1SVaclav Hapla   PetscFunctionBegin;
5600af448b7SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5619566063dSJacob Faibussowitsch   PetscCall(PetscViewerWritable(viewer, &flg));
56228b400f6SJacob Faibussowitsch   PetscCheck(flg, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support writing, or is in FILE_MODE_READ mode");
5633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
564d01f05b1SVaclav Hapla }
565