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