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