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