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