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