xref: /petsc/src/sys/classes/viewer/interface/view.c (revision e15058bc6aac6802fd4df1f195ce19b0da2c1c66)
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));
95f4f49eeaSPierre 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;
136648c30bcSBarry Smith   PetscCall(PetscObjectReference((PetscObject)viewer));
1379566063dSJacob Faibussowitsch   PetscCall(PetscNew(vf));
138d7cbc13eSBarry Smith   (*vf)->viewer = viewer;
139d7cbc13eSBarry Smith   (*vf)->format = format;
140798534f6SMatthew G. Knepley   (*vf)->data   = NULL;
1413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
142d7cbc13eSBarry Smith }
143d7cbc13eSBarry Smith 
144fe01d993SBarry Smith /*@C
1453f423023SBarry Smith   PetscViewerAndFormatDestroy - Destroys a `PetscViewerAndFormat` struct created with `PetscViewerAndFormatCreate()`
146fe01d993SBarry Smith 
147c3339decSBarry Smith   Collective
148fe01d993SBarry Smith 
1492fe279fdSBarry Smith   Input Parameter:
150811af0c4SBarry Smith . vf - the `PetscViewerAndFormat` to be destroyed.
151fe01d993SBarry Smith 
152d7cbc13eSBarry Smith   Level: developer
153fe01d993SBarry Smith 
154c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAndFormat`, `PetscViewerFormat`, `PetscViewerAndFormatCreate()`, `PetscViewerSocketOpen()`,
15542747ad1SJacob Faibussowitsch           `PetscViewerASCIIOpen()`, `PetscViewerCreate()`, `PetscViewerDrawOpen()`
156fe01d993SBarry Smith @*/
157d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
158d71ae5a4SJacob Faibussowitsch {
159fe01d993SBarry Smith   PetscFunctionBegin;
160648c30bcSBarry Smith   PetscCall(PetscViewerDestroy(&(*vf)->viewer));
161*e15058bcSJames Wright   if ((*vf)->data_destroy) PetscCall((*vf)->data_destroy(&(*vf)->data));
1629566063dSJacob Faibussowitsch   PetscCall(PetscFree(*vf));
1633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
164fe01d993SBarry Smith }
165fe01d993SBarry Smith 
1665d83a8b1SBarry Smith /*@
167811af0c4SBarry Smith   PetscViewerGetType - Returns the type of a `PetscViewer`.
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith   Not Collective
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   Input Parameter:
172811af0c4SBarry Smith . viewer - the `PetscViewer`
1735c6c1daeSBarry Smith 
1745c6c1daeSBarry Smith   Output Parameter:
17510450e9eSJacob Faibussowitsch . type - `PetscViewerType`
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith   Level: intermediate
1785c6c1daeSBarry Smith 
1795c6c1daeSBarry Smith   Note:
180811af0c4SBarry Smith   `PetscViewerType` is actually a string
1815c6c1daeSBarry Smith 
182aec76313SJacob Faibussowitsch .seealso: [](sec_viewers), `PetscViewerType`, `PetscViewer`, `PetscViewerCreate()`, `PetscViewerSetType()`
1835c6c1daeSBarry Smith @*/
184d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetType(PetscViewer viewer, PetscViewerType *type)
185d71ae5a4SJacob Faibussowitsch {
1865c6c1daeSBarry Smith   PetscFunctionBegin;
1875c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
1884f572ea9SToby Isaac   PetscAssertPointer(type, 2);
1895c6c1daeSBarry Smith   *type = ((PetscObject)viewer)->type_name;
1903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1915c6c1daeSBarry Smith }
1925c6c1daeSBarry Smith 
1935d83a8b1SBarry Smith /*@
194c410d8ccSBarry Smith   PetscViewerSetOptionsPrefix - Sets the prefix used for searching for
195c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
1965c6c1daeSBarry Smith 
197c3339decSBarry Smith   Logically Collective
1985c6c1daeSBarry Smith 
199d8d19677SJose E. Roman   Input Parameters:
200811af0c4SBarry Smith + viewer - the `PetscViewer` context
2015c6c1daeSBarry Smith - prefix - the prefix to prepend to all option names
2025c6c1daeSBarry Smith 
203811af0c4SBarry Smith   Note:
2045c6c1daeSBarry Smith   A hyphen (-) must NOT be given at the beginning of the prefix name.
2055c6c1daeSBarry Smith   The first character of all runtime options is AUTOMATICALLY the hyphen.
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith   Level: advanced
2085c6c1daeSBarry Smith 
209c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerSetFromOptions()`, `PetscViewerAppendOptionsPrefix()`
2105c6c1daeSBarry Smith @*/
211d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetOptionsPrefix(PetscViewer viewer, const char prefix[])
212d71ae5a4SJacob Faibussowitsch {
2135c6c1daeSBarry Smith   PetscFunctionBegin;
2145c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2159566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)viewer, prefix));
2163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2175c6c1daeSBarry Smith }
2185c6c1daeSBarry Smith 
2195d83a8b1SBarry Smith /*@
220c410d8ccSBarry Smith   PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for
221c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
2225c6c1daeSBarry Smith 
223c3339decSBarry Smith   Logically Collective
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith   Input Parameters:
22601311c95SBarry Smith + viewer - the `PetscViewer` context
2275c6c1daeSBarry Smith - prefix - the prefix to prepend to all option names
2285c6c1daeSBarry Smith 
22901311c95SBarry Smith   Level: advanced
23001311c95SBarry Smith 
231811af0c4SBarry Smith   Note:
2325c6c1daeSBarry Smith   A hyphen (-) must NOT be given at the beginning of the prefix name.
2335c6c1daeSBarry Smith   The first character of all runtime options is AUTOMATICALLY the hyphen.
2345c6c1daeSBarry Smith 
235c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerGetOptionsPrefix()`, `PetscViewerSetOptionsPrefix()`
2365c6c1daeSBarry Smith @*/
237d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerAppendOptionsPrefix(PetscViewer viewer, const char prefix[])
238d71ae5a4SJacob Faibussowitsch {
2395c6c1daeSBarry Smith   PetscFunctionBegin;
2405c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2419566063dSJacob Faibussowitsch   PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)viewer, prefix));
2423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2435c6c1daeSBarry Smith }
2445c6c1daeSBarry Smith 
245cc4c1da9SBarry Smith /*@
246c410d8ccSBarry Smith   PetscViewerGetOptionsPrefix - Gets the prefix used for searching for
247c410d8ccSBarry Smith   `PetscViewer` options in the database during `PetscViewerSetFromOptions()`.
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith   Not Collective
2505c6c1daeSBarry Smith 
2515c6c1daeSBarry Smith   Input Parameter:
252811af0c4SBarry Smith . viewer - the `PetscViewer` context
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith   Output Parameter:
2555c6c1daeSBarry Smith . prefix - pointer to the prefix string used
2565c6c1daeSBarry Smith 
25701311c95SBarry Smith   Level: advanced
25801311c95SBarry Smith 
259aec76313SJacob Faibussowitsch   Fortran Notes:
260811af0c4SBarry Smith   The user should pass in a string 'prefix' of sufficient length to hold the prefix.
2615c6c1daeSBarry Smith 
262c410d8ccSBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerAppendOptionsPrefix()`, `PetscViewerSetOptionsPrefix()`
2635c6c1daeSBarry Smith @*/
264d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetOptionsPrefix(PetscViewer viewer, const char *prefix[])
265d71ae5a4SJacob Faibussowitsch {
2665c6c1daeSBarry Smith   PetscFunctionBegin;
2675c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2689566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetOptionsPrefix((PetscObject)viewer, prefix));
2693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2705c6c1daeSBarry Smith }
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith /*@
2735c6c1daeSBarry Smith   PetscViewerSetUp - Sets up the internal viewer data structures for the later use.
2745c6c1daeSBarry Smith 
275c3339decSBarry Smith   Collective
2765c6c1daeSBarry Smith 
2772fe279fdSBarry Smith   Input Parameter:
278811af0c4SBarry Smith . viewer - the `PetscViewer` context
2795c6c1daeSBarry Smith 
28001311c95SBarry Smith   Level: advanced
28101311c95SBarry Smith 
282811af0c4SBarry Smith   Note:
283811af0c4SBarry Smith   For basic use of the `PetscViewer` classes the user need not explicitly call
284811af0c4SBarry Smith   `PetscViewerSetUp()`, since these actions will happen automatically.
2855c6c1daeSBarry Smith 
286d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerDestroy()`
2875c6c1daeSBarry Smith @*/
288d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetUp(PetscViewer viewer)
289d71ae5a4SJacob Faibussowitsch {
2905c6c1daeSBarry Smith   PetscFunctionBegin;
2915c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
2923ba16761SJacob Faibussowitsch   if (viewer->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
293dbbe0bcdSBarry Smith   PetscTryTypeMethod(viewer, setup);
294c98fd787SBarry Smith   viewer->setupcalled = PETSC_TRUE;
2953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2965c6c1daeSBarry Smith }
2975c6c1daeSBarry Smith 
298ffeef943SBarry Smith /*@
2993f423023SBarry Smith   PetscViewerViewFromOptions - View from the viewer based on options in the options database
300fe2efc57SMark 
301c3339decSBarry Smith   Collective
302fe2efc57SMark 
303fe2efc57SMark   Input Parameters:
304811af0c4SBarry Smith + A    - the `PetscViewer` context
305811af0c4SBarry Smith . obj  - Optional object that provides the prefix for the option names
306736c3998SJose E. Roman - name - command line option
307fe2efc57SMark 
308fe2efc57SMark   Level: intermediate
309811af0c4SBarry Smith 
3103f423023SBarry Smith   Note:
3113f423023SBarry Smith   See `PetscObjectViewFromOptions()` for details on the viewers and formats support via this interface
3123f423023SBarry Smith 
313d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerView`, `PetscObjectViewFromOptions()`, `PetscViewerCreate()`
314fe2efc57SMark @*/
315d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerViewFromOptions(PetscViewer A, PetscObject obj, const char name[])
316d71ae5a4SJacob Faibussowitsch {
317fe2efc57SMark   PetscFunctionBegin;
318fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_VIEWER_CLASSID, 1);
3199566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
3203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
321fe2efc57SMark }
322fe2efc57SMark 
323ffeef943SBarry Smith /*@
3245c6c1daeSBarry Smith   PetscViewerView - Visualizes a viewer object.
3255c6c1daeSBarry Smith 
326c3339decSBarry Smith   Collective
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith   Input Parameters:
329f0d4698bSVaclav Hapla + v      - the viewer to be viewed
3305c6c1daeSBarry Smith - viewer - visualization context
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith   Level: beginner
3335c6c1daeSBarry Smith 
334d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerPushFormat()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`,
335db781477SPatrick Sanan           `PetscViewerSocketOpen()`, `PetscViewerBinaryOpen()`, `PetscViewerLoad()`
3365c6c1daeSBarry Smith @*/
337d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerView(PetscViewer v, PetscViewer viewer)
338d71ae5a4SJacob Faibussowitsch {
3395c6c1daeSBarry Smith   PetscBool         iascii;
3405c6c1daeSBarry Smith   PetscViewerFormat format;
341e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
342536b137fSBarry Smith   PetscBool issaws;
3430076e027SBarry Smith #endif
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith   PetscFunctionBegin;
3465c6c1daeSBarry Smith   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3475c6c1daeSBarry Smith   PetscValidType(v, 1);
34848a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v), &viewer));
3495c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
3505c6c1daeSBarry Smith   PetscCheckSameComm(v, 1, viewer, 2);
3515c6c1daeSBarry Smith 
3529566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
353e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
3549566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
3550076e027SBarry Smith #endif
3565c6c1daeSBarry Smith   if (iascii) {
3579566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(viewer, &format));
3589566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)v, viewer));
35998c3331eSBarry Smith     if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
36048a46eb9SPierre Jolivet       if (v->format) PetscCall(PetscViewerASCIIPrintf(viewer, "  Viewer format = %s\n", PetscViewerFormats[v->format]));
3619566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
362dbbe0bcdSBarry Smith       PetscTryTypeMethod(v, view, viewer);
3639566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
3645c6c1daeSBarry Smith     }
365e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
366536b137fSBarry Smith   } else if (issaws) {
3670076e027SBarry Smith     if (!((PetscObject)v)->amsmem) {
3689566063dSJacob Faibussowitsch       PetscCall(PetscObjectViewSAWs((PetscObject)v, viewer));
369dbbe0bcdSBarry Smith       PetscTryTypeMethod(v, view, viewer);
3700076e027SBarry Smith     }
3710076e027SBarry Smith #endif
3725c6c1daeSBarry Smith   }
3733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3745c6c1daeSBarry Smith }
3751d641e7bSMichael Lange 
3761d641e7bSMichael Lange /*@C
377811af0c4SBarry Smith   PetscViewerRead - Reads data from a `PetscViewer`
3781d641e7bSMichael Lange 
379d083f849SBarry Smith   Collective
3801d641e7bSMichael Lange 
3811d641e7bSMichael Lange   Input Parameters:
3821d641e7bSMichael Lange + viewer - The viewer
383c410d8ccSBarry Smith . data   - Location to write the data, treated as an array of the type defined by `datatype`
384060da220SMatthew G. Knepley . num    - Number of items of data to read
385aec76313SJacob Faibussowitsch - dtype  - Type of data to read
3861d641e7bSMichael Lange 
3872fe279fdSBarry Smith   Output Parameter:
38801311c95SBarry Smith . count - number of items of data actually read, or `NULL`
38901311c95SBarry Smith 
39001311c95SBarry Smith   Level: beginner
391f8e4bde8SMatthew G. Knepley 
3923f423023SBarry Smith   Notes:
393c410d8ccSBarry Smith   If datatype is `PETSC_STRING` and `num` is negative, reads until a newline character is found,
394632e26b4SStefano Zampini   until a maximum of (-num - 1) chars.
395632e26b4SStefano Zampini 
39601311c95SBarry Smith   Only certain viewers, such as `PETSCVIEWERBINARY` can be read from, see `PetscViewerReadable()`
3971d641e7bSMichael Lange 
398d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`,
39901311c95SBarry Smith           `PetscViewerReadable()`, `PetscViewerBinaryGetDescriptor()`,
400aec76313SJacob Faibussowitsch           `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`
4011d641e7bSMichael Lange @*/
402d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
403d71ae5a4SJacob Faibussowitsch {
4041d641e7bSMichael Lange   PetscFunctionBegin;
4051d641e7bSMichael Lange   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4061d641e7bSMichael Lange   if (dtype == PETSC_STRING) {
407060da220SMatthew G. Knepley     PetscInt c, i = 0, cnt;
4081d641e7bSMichael Lange     char    *s = (char *)data;
409632e26b4SStefano Zampini     if (num >= 0) {
410060da220SMatthew G. Knepley       for (c = 0; c < num; c++) {
4111d641e7bSMichael Lange         /* Skip leading whitespaces */
4129371c9d4SSatish Balay         do {
413f4f49eeaSPierre Jolivet           PetscUseTypeMethod(viewer, read, &s[i], 1, &cnt, PETSC_CHAR);
4149371c9d4SSatish Balay           if (!cnt) break;
4159371c9d4SSatish Balay         } while (s[i] == '\n' || s[i] == '\t' || s[i] == ' ' || s[i] == '\0' || s[i] == '\v' || s[i] == '\f' || s[i] == '\r');
4161d641e7bSMichael Lange         i++;
4171d641e7bSMichael Lange         /* Read strings one char at a time */
4189371c9d4SSatish Balay         do {
419f4f49eeaSPierre Jolivet           PetscUseTypeMethod(viewer, read, &s[i++], 1, &cnt, PETSC_CHAR);
4209371c9d4SSatish Balay           if (!cnt) break;
4219371c9d4SSatish 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');
4221d641e7bSMichael Lange         /* Terminate final string */
423060da220SMatthew G. Knepley         if (c == num - 1) s[i - 1] = '\0';
4241d641e7bSMichael Lange       }
425632e26b4SStefano Zampini     } else {
426632e26b4SStefano Zampini       /* Read until a \n is encountered (-num is the max size allowed) */
4279371c9d4SSatish Balay       do {
428f4f49eeaSPierre Jolivet         PetscUseTypeMethod(viewer, read, &s[i++], 1, &cnt, PETSC_CHAR);
4299371c9d4SSatish Balay         if (i == -num || !cnt) break;
4309371c9d4SSatish Balay       } while (s[i - 1] != '\n');
431632e26b4SStefano Zampini       /* Terminate final string */
432632e26b4SStefano Zampini       s[i - 1] = '\0';
433632e26b4SStefano Zampini       c        = i;
434632e26b4SStefano Zampini     }
435060da220SMatthew G. Knepley     if (count) *count = c;
43608401ef6SPierre Jolivet     else PetscCheck(c >= num, PetscObjectComm((PetscObject)viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %" PetscInt_FMT " < %" PetscInt_FMT " strings", c, num);
437dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(viewer, read, data, num, count, dtype);
4383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4391d641e7bSMichael Lange }
440e24fdd67SVaclav Hapla 
441af684e28SVaclav Hapla /*@
442c410d8ccSBarry Smith   PetscViewerReadable - Return a flag whether the viewer can be read from with `PetscViewerRead()`
443af684e28SVaclav Hapla 
444af684e28SVaclav Hapla   Not Collective
445af684e28SVaclav Hapla 
4462fe279fdSBarry Smith   Input Parameter:
447811af0c4SBarry Smith . viewer - the `PetscViewer` context
448af684e28SVaclav Hapla 
4492fe279fdSBarry Smith   Output Parameter:
450811af0c4SBarry Smith . flg - `PETSC_TRUE` if the viewer is readable, `PETSC_FALSE` otherwise
451af684e28SVaclav Hapla 
45201311c95SBarry Smith   Level: intermediate
45301311c95SBarry Smith 
454811af0c4SBarry Smith   Note:
455c410d8ccSBarry Smith   `PETSC_TRUE` means that viewer's `PetscViewerType` supports reading, that is `PetscViewerRead()`, (this holds e.g. for `PETSCVIEWERBINARY`)
456c410d8ccSBarry Smith   and the viewer is in a mode allowing reading, i.e. `PetscViewerFileGetMode()`
457811af0c4SBarry Smith   returns one of `FILE_MODE_READ`, `FILE_MODE_UPDATE`, `FILE_MODE_APPEND_UPDATE`.
458af684e28SVaclav Hapla 
45901311c95SBarry Smith .seealso: [](sec_viewers), `PetscViewerRead()`, `PetscViewer`, `PetscViewerWritable()`, `PetscViewerCheckReadable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
460af684e28SVaclav Hapla @*/
461d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerReadable(PetscViewer viewer, PetscBool *flg)
462d71ae5a4SJacob Faibussowitsch {
463e24fdd67SVaclav Hapla   PetscFileMode mode;
464e24fdd67SVaclav Hapla   PetscErrorCode (*f)(PetscViewer, PetscFileMode *) = NULL;
465e24fdd67SVaclav Hapla 
466e24fdd67SVaclav Hapla   PetscFunctionBegin;
467e24fdd67SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
4684f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
4699566063dSJacob Faibussowitsch   PetscCall(PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f));
470e24fdd67SVaclav Hapla   *flg = PETSC_FALSE;
4713ba16761SJacob Faibussowitsch   if (!f) PetscFunctionReturn(PETSC_SUCCESS);
4729566063dSJacob Faibussowitsch   PetscCall((*f)(viewer, &mode));
473e24fdd67SVaclav Hapla   switch (mode) {
474e24fdd67SVaclav Hapla   case FILE_MODE_READ:
475e24fdd67SVaclav Hapla   case FILE_MODE_UPDATE:
476d71ae5a4SJacob Faibussowitsch   case FILE_MODE_APPEND_UPDATE:
477d71ae5a4SJacob Faibussowitsch     *flg = PETSC_TRUE;
478d71ae5a4SJacob Faibussowitsch   default:
479d71ae5a4SJacob Faibussowitsch     break;
480e24fdd67SVaclav Hapla   }
4813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
482e24fdd67SVaclav Hapla }
483e24fdd67SVaclav Hapla 
484af684e28SVaclav Hapla /*@
485c410d8ccSBarry Smith   PetscViewerWritable - Return a flag whether the viewer can be written to with `PetscViewerWrite()`
486af684e28SVaclav Hapla 
487af684e28SVaclav Hapla   Not Collective
488af684e28SVaclav Hapla 
4892fe279fdSBarry Smith   Input Parameter:
490811af0c4SBarry Smith . viewer - the `PetscViewer` context
491af684e28SVaclav Hapla 
4922fe279fdSBarry Smith   Output Parameter:
493811af0c4SBarry Smith . flg - `PETSC_TRUE` if the viewer is writable, `PETSC_FALSE` otherwise
494af684e28SVaclav Hapla 
49501311c95SBarry Smith   Level: intermediate
49601311c95SBarry Smith 
497811af0c4SBarry Smith   Note:
498811af0c4SBarry Smith   `PETSC_TRUE` means viewer is in a mode allowing writing, i.e. `PetscViewerFileGetMode()`
499811af0c4SBarry Smith   returns one of `FILE_MODE_WRITE`, `FILE_MODE_APPEND`, `FILE_MODE_UPDATE`, `FILE_MODE_APPEND_UPDATE`.
500af684e28SVaclav Hapla 
501d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerReadable()`, `PetscViewerCheckWritable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
502af684e28SVaclav Hapla @*/
503d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerWritable(PetscViewer viewer, PetscBool *flg)
504d71ae5a4SJacob Faibussowitsch {
505e24fdd67SVaclav Hapla   PetscFileMode mode;
506e24fdd67SVaclav Hapla   PetscErrorCode (*f)(PetscViewer, PetscFileMode *) = NULL;
507e24fdd67SVaclav Hapla 
508e24fdd67SVaclav Hapla   PetscFunctionBegin;
509e24fdd67SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5104f572ea9SToby Isaac   PetscAssertPointer(flg, 2);
5119566063dSJacob Faibussowitsch   PetscCall(PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f));
512e24fdd67SVaclav Hapla   *flg = PETSC_TRUE;
5133ba16761SJacob Faibussowitsch   if (!f) PetscFunctionReturn(PETSC_SUCCESS);
5149566063dSJacob Faibussowitsch   PetscCall((*f)(viewer, &mode));
515e24fdd67SVaclav Hapla   if (mode == FILE_MODE_READ) *flg = PETSC_FALSE;
5163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
517e24fdd67SVaclav Hapla }
518e24fdd67SVaclav Hapla 
519af684e28SVaclav Hapla /*@
520811af0c4SBarry Smith   PetscViewerCheckReadable - Check whether the viewer can be read from, generates an error if not
521af684e28SVaclav Hapla 
522af684e28SVaclav Hapla   Collective
523af684e28SVaclav Hapla 
5242fe279fdSBarry Smith   Input Parameter:
525811af0c4SBarry Smith . viewer - the `PetscViewer` context
526af684e28SVaclav Hapla 
527af684e28SVaclav Hapla   Level: intermediate
528af684e28SVaclav Hapla 
529d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerReadable()`, `PetscViewerCheckWritable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
530af684e28SVaclav Hapla @*/
531d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCheckReadable(PetscViewer viewer)
532d71ae5a4SJacob Faibussowitsch {
533d01f05b1SVaclav Hapla   PetscBool flg;
534d01f05b1SVaclav Hapla 
535d01f05b1SVaclav Hapla   PetscFunctionBegin;
5360af448b7SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5379566063dSJacob Faibussowitsch   PetscCall(PetscViewerReadable(viewer, &flg));
53828b400f6SJacob 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)");
5393ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
540d01f05b1SVaclav Hapla }
541d01f05b1SVaclav Hapla 
542af684e28SVaclav Hapla /*@
543811af0c4SBarry Smith   PetscViewerCheckWritable - Check whether the viewer can be written to, generates an error if not
544af684e28SVaclav Hapla 
545af684e28SVaclav Hapla   Collective
546af684e28SVaclav Hapla 
5472fe279fdSBarry Smith   Input Parameter:
548811af0c4SBarry Smith . viewer - the `PetscViewer` context
549af684e28SVaclav Hapla 
550af684e28SVaclav Hapla   Level: intermediate
551af684e28SVaclav Hapla 
552d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerWritable()`, `PetscViewerCheckReadable()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetType()`
553af684e28SVaclav Hapla @*/
554d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCheckWritable(PetscViewer viewer)
555d71ae5a4SJacob Faibussowitsch {
556d01f05b1SVaclav Hapla   PetscBool flg;
557d01f05b1SVaclav Hapla 
558d01f05b1SVaclav Hapla   PetscFunctionBegin;
5590af448b7SVaclav Hapla   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5609566063dSJacob Faibussowitsch   PetscCall(PetscViewerWritable(viewer, &flg));
56128b400f6SJacob Faibussowitsch   PetscCheck(flg, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support writing, or is in FILE_MODE_READ mode");
5623ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
563d01f05b1SVaclav Hapla }
564