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 { 25 SNESMonitor_SAWs *mon; 26 27 PetscFunctionBegin; 28 PetscCall(PetscNewLog(snes,&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(0); 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(0); 52 } 53 54 /*@C 55 SNESMonitorSAWs - monitor solution using SAWs 56 57 Logically Collective on SNES 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 SAWs 64 65 Level: advanced 66 67 .seealso: `PetscViewerSAWsOpen()` 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(0); 83 } 84