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