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 11c3339decSBarry Smith Collective 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 21420bcc1bSBarry Smith .seealso: [](ch_snes), `SNESMonitorSet()`, `SNES`, `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()` 22c67b8539SHong Zhang @*/ 23d71ae5a4SJacob Faibussowitsch PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx) 24d71ae5a4SJacob Faibussowitsch { 25c67b8539SHong Zhang SNESMonitor_SAWs *mon; 26c67b8539SHong Zhang 27c67b8539SHong Zhang PetscFunctionBegin; 284dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&mon)); 29c67b8539SHong Zhang mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes)); 3028b400f6SJacob Faibussowitsch PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer"); 31c67b8539SHong Zhang *ctx = (void *)mon; 323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 33c67b8539SHong Zhang } 34c67b8539SHong Zhang 35c67b8539SHong Zhang /*@C 36f6dfbefdSBarry Smith SNESMonitorSAWsDestroy - destroy a monitor context created with `SNESMonitorSAWsCreate()` 37c67b8539SHong Zhang 38c67b8539SHong Zhang Collective 39c67b8539SHong Zhang 404165533cSJose E. Roman Input Parameter: 41c67b8539SHong Zhang . ctx - monitor context 42c67b8539SHong Zhang 43c67b8539SHong Zhang Level: developer 44c67b8539SHong Zhang 45420bcc1bSBarry Smith .seealso: [](ch_snes), `SNESMonitorSAWsCreate()` 46c67b8539SHong Zhang @*/ 47*2a8381b2SBarry Smith PetscErrorCode SNESMonitorSAWsDestroy(PetscCtxRt ctx) 48d71ae5a4SJacob Faibussowitsch { 49c67b8539SHong Zhang PetscFunctionBegin; 50*2a8381b2SBarry Smith PetscCall(PetscFree(*(void **)ctx)); 513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 52c67b8539SHong Zhang } 53c67b8539SHong Zhang 54c67b8539SHong Zhang /*@C 55f6dfbefdSBarry Smith SNESMonitorSAWs - monitor solution process of `SNES` using SAWs 56c67b8539SHong Zhang 57c3339decSBarry Smith Collective 58c67b8539SHong Zhang 59c67b8539SHong Zhang Input Parameters: 60c67b8539SHong Zhang + snes - iterative context 61c67b8539SHong Zhang . n - iteration number 62c67b8539SHong Zhang . rnorm - 2-norm (preconditioned) residual value (may be estimated). 63f6dfbefdSBarry Smith - ctx - `PetscViewer` of type `PETSCVIEWERSAWS` 64c67b8539SHong Zhang 65c67b8539SHong Zhang Level: advanced 66c67b8539SHong Zhang 67420bcc1bSBarry Smith .seealso: [](ch_snes), `PetscViewerSAWsOpen()`, `SNESMonitorSAWsDestroy()`, `SNESMonitorSAWsCreate()` 68c67b8539SHong Zhang @*/ 69*2a8381b2SBarry Smith PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, PetscCtx ctx) 70d71ae5a4SJacob Faibussowitsch { 71c67b8539SHong Zhang PetscMPIInt rank; 72c67b8539SHong Zhang 73c67b8539SHong Zhang PetscFunctionBegin; 74c67b8539SHong Zhang PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); 75c67b8539SHong Zhang 769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 77dd400576SPatrick Sanan if (rank == 0) { 78792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT)); 79792fecdfSBarry Smith PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE)); 809566063dSJacob Faibussowitsch PetscCall(PetscSAWsBlock()); 81c67b8539SHong Zhang } 823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 83c67b8539SHong Zhang } 84