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