1 #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/ 2 #include <petscviewersaws.h> 3 4 typedef struct { 5 PetscViewer viewer; 6 } SNESMonitor_SAWs; 7 8 /*@C 9 SNESMonitorSAWsCreate - create an SAWs monitor context for `SNES` 10 11 Collective 12 13 Input Parameter: 14 . snes - `SNES` to monitor 15 16 Output Parameter: 17 . ctx - context for monitor 18 19 Level: developer 20 21 .seealso: `SNESSetMonitor()`, `SNES`, `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()` 22 @*/ 23 PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx) 24 { 25 SNESMonitor_SAWs *mon; 26 27 PetscFunctionBegin; 28 PetscCall(PetscNew(&mon)); 29 mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes)); 30 PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer"); 31 *ctx = (void *)mon; 32 PetscFunctionReturn(PETSC_SUCCESS); 33 } 34 35 /*@C 36 SNESMonitorSAWsDestroy - destroy a monitor context created with `SNESMonitorSAWsCreate()` 37 38 Collective 39 40 Input Parameter: 41 . ctx - monitor context 42 43 Level: developer 44 45 .seealso: `SNESMonitorSAWsCreate()` 46 @*/ 47 PetscErrorCode SNESMonitorSAWsDestroy(void **ctx) 48 { 49 PetscFunctionBegin; 50 PetscCall(PetscFree(*ctx)); 51 PetscFunctionReturn(PETSC_SUCCESS); 52 } 53 54 /*@C 55 SNESMonitorSAWs - monitor solution process of `SNES` using SAWs 56 57 Collective 58 59 Input Parameters: 60 + snes - iterative context 61 . n - iteration number 62 . rnorm - 2-norm (preconditioned) residual value (may be estimated). 63 - ctx - `PetscViewer` of type `PETSCVIEWERSAWS` 64 65 Level: advanced 66 67 .seealso: `PetscViewerSAWsOpen()`, `SNESMonitorSAWsDestroy()`, `SNESMonitorSAWsCreate()` 68 @*/ 69 PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, void *ctx) 70 { 71 PetscMPIInt rank; 72 73 PetscFunctionBegin; 74 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); 75 76 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 77 if (rank == 0) { 78 PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT)); 79 PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE)); 80 PetscCall(PetscSAWsBlock()); 81 } 82 PetscFunctionReturn(PETSC_SUCCESS); 83 } 84