xref: /honee/src/honee-ksp.c (revision c0d10d1ddfa51fc3c0a8079706784eb95f3ed88f)
116cb6b6bSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
216cb6b6bSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
316cb6b6bSJames Wright 
416cb6b6bSJames Wright /// @file
516cb6b6bSJames Wright /// KSP related functiosn for HONEE
616cb6b6bSJames Wright 
7*1c58d510SJames Wright #include <petscksp.h>
816cb6b6bSJames Wright 
KSPPostSolve_Honee(KSP ksp,Vec rhs,Vec x,void * ctx)916cb6b6bSJames Wright PetscErrorCode KSPPostSolve_Honee(KSP ksp, Vec rhs, Vec x, void *ctx) {
1016cb6b6bSJames Wright   const PetscReal *residual_history;
1116cb6b6bSJames Wright   PetscReal        first_residual, last_residual;
1216cb6b6bSJames Wright   PetscInt         num_its = -1, tab_level;
1316cb6b6bSJames Wright   PetscViewer      viewer  = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)ksp));
1416cb6b6bSJames Wright 
1516cb6b6bSJames Wright   PetscFunctionBeginUser;
1616cb6b6bSJames Wright   PetscCall(KSPGetResidualHistory(ksp, &residual_history, &num_its));
1716cb6b6bSJames Wright   first_residual = residual_history[0];
1816cb6b6bSJames Wright   last_residual  = residual_history[num_its - 1];
1916cb6b6bSJames Wright   PetscCall(PetscObjectGetTabLevel((PetscObject)ksp, &tab_level));
2016cb6b6bSJames Wright   PetscCall(PetscViewerASCIIAddTab(viewer, tab_level + 1));
2116cb6b6bSJames Wright   PetscCall(PetscViewerASCIIPrintf(viewer, "KSP Residual Summary: R_0 %.4e R_last %.4e R_last/R_0 %.4e\n", first_residual, last_residual,
2216cb6b6bSJames Wright                                    last_residual / first_residual));
2316cb6b6bSJames Wright   PetscCall(PetscViewerASCIISubtractTab(viewer, tab_level + 1));
2416cb6b6bSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
2516cb6b6bSJames Wright }
26