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 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: `SNESMonitorSAWs()`, `SNESMonitorSAWsDestroy()` 22 @*/ 23 PetscErrorCode SNESMonitorSAWsCreate(SNES snes, void **ctx) { 24 SNESMonitor_SAWs *mon; 25 26 PetscFunctionBegin; 27 PetscCall(PetscNewLog(snes, &mon)); 28 mon->viewer = PETSC_VIEWER_SAWS_(PetscObjectComm((PetscObject)snes)); 29 PetscCheck(mon->viewer, PetscObjectComm((PetscObject)snes), PETSC_ERR_PLIB, "Cannot create SAWs default viewer"); 30 *ctx = (void *)mon; 31 PetscFunctionReturn(0); 32 } 33 34 /*@C 35 SNESMonitorSAWsDestroy - destroy a monitor context created with SNESMonitorSAWsCreate() 36 37 Collective 38 39 Input Parameter: 40 . ctx - monitor context 41 42 Level: developer 43 44 .seealso: `SNESMonitorSAWsCreate()` 45 @*/ 46 PetscErrorCode SNESMonitorSAWsDestroy(void **ctx) { 47 PetscFunctionBegin; 48 PetscCall(PetscFree(*ctx)); 49 PetscFunctionReturn(0); 50 } 51 52 /*@C 53 SNESMonitorSAWs - monitor solution using SAWs 54 55 Logically Collective on SNES 56 57 Input Parameters: 58 + snes - iterative context 59 . n - iteration number 60 . rnorm - 2-norm (preconditioned) residual value (may be estimated). 61 - ctx - PetscViewer of type SAWs 62 63 Level: advanced 64 65 .seealso: `PetscViewerSAWsOpen()` 66 @*/ 67 PetscErrorCode SNESMonitorSAWs(SNES snes, PetscInt n, PetscReal rnorm, void *ctx) { 68 PetscMPIInt rank; 69 70 PetscFunctionBegin; 71 PetscValidHeaderSpecific(snes, SNES_CLASSID, 1); 72 73 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 74 if (rank == 0) { 75 PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/its", &snes->iter, 1, SAWs_READ, SAWs_INT)); 76 PetscCallSAWs(SAWs_Register, ("/PETSc/snes_monitor_saws/rnorm", &snes->norm, 1, SAWs_READ, SAWs_DOUBLE)); 77 PetscCall(PetscSAWsBlock()); 78 } 79 PetscFunctionReturn(0); 80 } 81