/*@C KSPMonitorTrueResidualMaxNorm - Prints the true residual max norm as well as the preconditioned residual norm at each iteration of an iterative solver. Collective on KSP Input Parameters: + ksp - iterative context . n - iteration number . rnorm - norm (preconditioned) residual value (may be estimated). - dummy - an ASCII viewer Options Database Key: . -ksp_monitor_max - Activates KSPMonitorTrueResidualMaxNorm() Notes: This could be implemented (better) with a flag in ksp. Level: intermediate .keywords: KSP, default, monitor, residual .seealso: KSPMonitorSet(), KSPMonitorDefault(), KSPMonitorLGResidualNormCreate(),KSPMonitorTrueResidualNorm() @*/ PetscErrorCode KSPMonitorTrueResidualMaxNorm(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy) { PetscErrorCode ierr; Vec resid; PetscReal truenorm,bnorm; PetscViewer viewer = (PetscViewer)dummy; char normtype[256]; PetscFunctionBegin; PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4); ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); if (n == 0 && ((PetscObject)ksp)->prefix) { ierr = PetscViewerASCIIPrintf(viewer," Residual norms (max) for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr); } ierr = KSPBuildResidual(ksp,NULL,NULL,&resid);CHKERRQ(ierr); ierr = VecNorm(resid,NORM_INFINITY,&truenorm);CHKERRQ(ierr); ierr = VecDestroy(&resid);CHKERRQ(ierr); ierr = VecNorm(ksp->vec_rhs,NORM_INFINITY,&bnorm);CHKERRQ(ierr); ierr = PetscStrncpy(normtype,KSPNormTypes[ksp->normtype],sizeof(normtype));CHKERRQ(ierr); ierr = PetscStrtolower(normtype);CHKERRQ(ierr); /* ierr = PetscViewerASCIIPrintf(viewer,"%3D KSP %s resid norm %14.12e true resid norm %14.12e ||r(i)||_inf/||b||_inf %14.12e\n",n,normtype,(double)rnorm,(double)truenorm,(double)(truenorm/bnorm));CHKERRQ(ierr); */ ierr = PetscViewerASCIIPrintf(viewer,"%3D KSP true resid max norm %14.12e ||r(i)||/||b|| %14.12e\n",n,(double)truenorm,(double)(truenorm/bnorm));CHKERRQ(ierr); ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C KSPMonitorTrueResidualNorm - Prints the true residual norm as well as the preconditioned residual norm at each iteration of an iterative solver. Collective on KSP Input Parameters: + ksp - iterative context . n - iteration number . rnorm - 2-norm (preconditioned) residual value (may be estimated). - dummy - unused monitor context Options Database Key: . -ksp_monitor_true_residual - Activates KSPMonitorTrueResidualNorm() Notes: When using right preconditioning, these values are equivalent. Level: intermediate .keywords: KSP, default, monitor, residual .seealso: KSPMonitorSet(), KSPMonitorDefault(), KSPMonitorLGResidualNormCreate(),KSPMonitorTrueResidualMaxNorm() @*/ PetscErrorCode KSPMonitorTrueResidualNorm(KSP ksp,PetscInt n,PetscReal rnorm,void *dummy) { PetscErrorCode ierr; Vec resid; PetscReal truenorm,bnorm; PetscViewer viewer = (PetscViewer)dummy; char normtype[256]; PetscFunctionBegin; if (!viewer) { ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ksp),&viewer);CHKERRQ(ierr); } ierr = PetscViewerASCIIAddTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); if (n == 0 && ((PetscObject)ksp)->prefix) { ierr = PetscViewerASCIIPrintf(viewer," Residual norms for %s solve.\n",((PetscObject)ksp)->prefix);CHKERRQ(ierr); } ierr = KSPBuildResidual(ksp,NULL,NULL,&resid);CHKERRQ(ierr); ierr = VecNorm(resid,NORM_2,&truenorm);CHKERRQ(ierr); ierr = VecDestroy(&resid);CHKERRQ(ierr); ierr = VecNorm(ksp->vec_rhs,NORM_2,&bnorm);CHKERRQ(ierr); ierr = PetscStrncpy(normtype,KSPNormTypes[ksp->normtype],sizeof(normtype));CHKERRQ(ierr); ierr = PetscStrtolower(normtype);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"%3D KSP %s resid norm %14.12e true resid norm %14.12e ||r(i)||/||b|| %14.12e\n",n,normtype,(double)rnorm,(double)truenorm,(double)(truenorm/bnorm));CHKERRQ(ierr); ierr = PetscViewerASCIISubtractTab(viewer,((PetscObject)ksp)->tablevel);CHKERRQ(ierr); PetscFunctionReturn(0); }