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