1af0996ceSBarry Smith #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/ 2c67b8539SHong Zhang #include <petscviewersaws.h> 3c67b8539SHong Zhang 4c67b8539SHong Zhang typedef struct { 5c67b8539SHong Zhang PetscViewer viewer; 6c67b8539SHong Zhang } SNESMonitor_SAWs; 7c67b8539SHong Zhang 8c67b8539SHong Zhang /*@C 9f6dfbefdSBarry Smith SNESMonitorSAWsCreate - create an SAWs monitor context for `SNES` 10c67b8539SHong Zhang 11f6dfbefdSBarry Smith Collective on snes 12c67b8539SHong Zhang 134165533cSJose E. Roman Input Parameter: 14f6dfbefdSBarry Smith . snes - `SNES` to monitor 15c67b8539SHong Zhang 164165533cSJose E. Roman Output Parameter: 17c67b8539SHong Zhang . ctx - context for monitor 18c67b8539SHong Zhang 19c67b8539SHong Zhang Level: developer 20c67b8539SHong Zhang 21f6dfbefdSBarry Smith .seealso: `SNESSetMonitor()`, `SNES`, `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()` 22c67b8539SHong Zhang @*/ 239371c9d4SSatish Balay PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx) { 24c67b8539SHong Zhang SNESMonitor_SAWs *mon; 25c67b8539SHong Zhang 26c67b8539SHong Zhang PetscFunctionBegin; 27*4dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&mon)); 28c67b8539SHong Zhang mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes)); 2928b400f6SJacob Faibussowitsch PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer"); 30c67b8539SHong Zhang *ctx = (void *)mon; 31c67b8539SHong Zhang PetscFunctionReturn(0); 32c67b8539SHong Zhang } 33c67b8539SHong Zhang 34c67b8539SHong Zhang /*@C 35f6dfbefdSBarry Smith SNESMonitorSAWsDestroy - destroy a monitor context created with `SNESMonitorSAWsCreate()` 36c67b8539SHong Zhang 37c67b8539SHong Zhang Collective 38c67b8539SHong Zhang 394165533cSJose E. Roman Input Parameter: 40c67b8539SHong Zhang . ctx - monitor context 41c67b8539SHong Zhang 42c67b8539SHong Zhang Level: developer 43c67b8539SHong Zhang 44db781477SPatrick Sanan .seealso: `SNESMonitorSAWsCreate()` 45c67b8539SHong Zhang @*/ 469371c9d4SSatish Balay PetscErrorCode SNESMonitorSAWsDestroy(void **ctx) { 47c67b8539SHong Zhang PetscFunctionBegin; 489566063dSJacob Faibussowitsch PetscCall(PetscFree(*ctx)); 49c67b8539SHong Zhang PetscFunctionReturn(0); 50c67b8539SHong Zhang } 51c67b8539SHong Zhang 52c67b8539SHong Zhang /*@C 53f6dfbefdSBarry Smith SNESMonitorSAWs - monitor solution process of `SNES` using SAWs 54c67b8539SHong Zhang 55f6dfbefdSBarry Smith Collective on snes 56c67b8539SHong Zhang 57c67b8539SHong Zhang Input Parameters: 58c67b8539SHong Zhang + snes - iterative context 59c67b8539SHong Zhang . n - iteration number 60c67b8539SHong Zhang . rnorm - 2-norm (preconditioned) residual value (may be estimated). 61f6dfbefdSBarry Smith - ctx - `PetscViewer` of type `PETSCVIEWERSAWS` 62c67b8539SHong Zhang 63c67b8539SHong Zhang Level: advanced 64c67b8539SHong Zhang 65f6dfbefdSBarry Smith .seealso: `PetscViewerSAWsOpen()`, `SNESMonitorSAWsDestroy()`, `SNESMonitorSAWsCreate()` 66c67b8539SHong Zhang @*/ 679371c9d4SSatish Balay PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, void *ctx) { 68c67b8539SHong Zhang PetscMPIInt rank; 69c67b8539SHong Zhang 70c67b8539SHong Zhang PetscFunctionBegin; 71c67b8539SHong Zhang PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); 72c67b8539SHong Zhang 739566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 74dd400576SPatrick Sanan if (rank == 0) { 75792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT)); 76792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE)); 779566063dSJacob Faibussowitsch PetscCall(PetscSAWsBlock()); 78c67b8539SHong Zhang } 79c67b8539SHong Zhang PetscFunctionReturn(0); 80c67b8539SHong Zhang } 81