/*@C KSPMonitorSAWs - monitor solution using SAWs Logically Collective on KSP Input Parameters: + ksp - iterative context . n - iteration number . rnorm - 2-norm (preconditioned) residual value (may be estimated). - ctx - PetscViewer of type SAWs Level: advanced .keywords: KSP, CG, monitor, SAWs, singular values .seealso: KSPMonitorSingularValue(), KSPComputeExtremeSingularValues(), PetscViewerSAWsOpen() @*/ PetscErrorCode KSPMonitorSAWs(KSP ksp,PetscInt n,PetscReal rnorm,void *ctx) { PetscErrorCode ierr; KSPMonitor_SAWs *mon = (KSPMonitor_SAWs*)ctx; PetscReal emax,emin; PetscMPIInt rank; PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_CLASSID,1); ierr = KSPComputeExtremeSingularValues(ksp,&emax,&emin);CHKERRQ(ierr); ierr = PetscFree2(mon->eigr,mon->eigi);CHKERRQ(ierr); ierr = PetscMalloc2(n,&mon->eigr,n,&mon->eigi);CHKERRQ(ierr); if (n) { ierr = KSPComputeEigenvalues(ksp,n,mon->eigr,mon->eigi,&mon->neigs);CHKERRQ(ierr); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); if (!rank) { SAWs_Delete("/PETSc/ksp_monitor_saws/eigr"); SAWs_Delete("/PETSc/ksp_monitor_saws/eigi"); PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/rnorm",&ksp->rnorm,1,SAWs_READ,SAWs_DOUBLE)); PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/neigs",&mon->neigs,1,SAWs_READ,SAWs_INT)); if (mon->neigs > 0) { PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigr",mon->eigr,mon->neigs,SAWs_READ,SAWs_DOUBLE)); PetscStackCallSAWs(SAWs_Register,("/PETSc/ksp_monitor_saws/eigi",mon->eigi,mon->neigs,SAWs_READ,SAWs_DOUBLE)); } ierr = PetscInfo2(ksp,"KSP extreme singular values min=%g max=%g\n",(double)emin,(double)emax);CHKERRQ(ierr); ierr = PetscSAWsBlock();CHKERRQ(ierr); } } PetscFunctionReturn(0); }
/*@C PetscObjectSAWsBlock - Blocks the object if PetscObjectSAWsSetBlock() has been called Collective on PetscObject Input Parameters: . obj - the Petsc variable Thus must be cast with a (PetscObject), for example, PetscObjectSetName((PetscObject)mat,name); Level: advanced Concepts: publishing object .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsSetBlock() @*/ PetscErrorCode PetscObjectSAWsBlock(PetscObject obj) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); if (!obj->amspublishblock || !obj->amsmem) PetscFunctionReturn(0); ierr = PetscSAWsBlock();CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C SNESMonitorSAWs - monitor solution using SAWs Logically Collective on SNES Input Parameters: + snes - iterative context . n - iteration number . rnorm - 2-norm (preconditioned) residual value (may be estimated). - ctx - PetscViewer of type SAWs Level: advanced .keywords: SNES, monitor, SAWs .seealso: PetscViewerSAWsOpen() @*/ PetscErrorCode SNESMonitorSAWs(SNES snes,PetscInt n,PetscReal rnorm,void *ctx) { PetscErrorCode ierr; PetscMPIInt rank; PetscFunctionBegin; PetscValidHeaderSpecific(snes,SNES_CLASSID,1); ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); if (!rank) { PetscStackCallSAWs(SAWs_Register,("/PETSc/snes_monitor_saws/its",&snes->iter,1,SAWs_READ,SAWs_INT)); PetscStackCallSAWs(SAWs_Register,("/PETSc/snes_monitor_saws/rnorm",&snes->norm,1,SAWs_READ,SAWs_DOUBLE)); ierr = PetscSAWsBlock();CHKERRQ(ierr); } PetscFunctionReturn(0); }