xref: /honee/src/honee-ksp.c (revision 16cb6b6b239e8baff914b40a55e48473a01b3121)
1*16cb6b6bSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2*16cb6b6bSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3*16cb6b6bSJames Wright 
4*16cb6b6bSJames Wright /// @file
5*16cb6b6bSJames Wright /// KSP related functiosn for HONEE
6*16cb6b6bSJames Wright 
7*16cb6b6bSJames Wright #include <petsc.h>
8*16cb6b6bSJames Wright 
9*16cb6b6bSJames Wright PetscErrorCode KSPPostSolve_Honee(KSP ksp, Vec rhs, Vec x, void *ctx) {
10*16cb6b6bSJames Wright   const PetscReal *residual_history;
11*16cb6b6bSJames Wright   PetscReal        first_residual, last_residual;
12*16cb6b6bSJames Wright   PetscInt         num_its = -1, tab_level;
13*16cb6b6bSJames Wright   PetscViewer      viewer  = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)ksp));
14*16cb6b6bSJames Wright 
15*16cb6b6bSJames Wright   PetscFunctionBeginUser;
16*16cb6b6bSJames Wright   PetscCall(KSPGetResidualHistory(ksp, &residual_history, &num_its));
17*16cb6b6bSJames Wright   first_residual = residual_history[0];
18*16cb6b6bSJames Wright   last_residual  = residual_history[num_its - 1];
19*16cb6b6bSJames Wright   PetscCall(PetscObjectGetTabLevel((PetscObject)ksp, &tab_level));
20*16cb6b6bSJames Wright   PetscCall(PetscViewerASCIIAddTab(viewer, tab_level + 1));
21*16cb6b6bSJames Wright   PetscCall(PetscViewerASCIIPrintf(viewer, "KSP Residual Summary: R_0 %.4e R_last %.4e R_last/R_0 %.4e\n", first_residual, last_residual,
22*16cb6b6bSJames Wright                                    last_residual / first_residual));
23*16cb6b6bSJames Wright   PetscCall(PetscViewerASCIISubtractTab(viewer, tab_level + 1));
24*16cb6b6bSJames Wright   PetscFunctionReturn(PETSC_SUCCESS);
25*16cb6b6bSJames Wright }
26