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