diff --git a/src/solvers/cheb_solver.cu b/src/solvers/cheb_solver.cu index 95070b0b..9d1fabc8 100644 --- a/src/solvers/cheb_solver.cu +++ b/src/solvers/cheb_solver.cu @@ -282,6 +282,15 @@ Chebyshev_Solver::solve_init( VVector &b, VVector &x, bool xIsZero ) int offset, size; A.getOffsetAndSizeForView(A.getViewExterior(), &offset, &size); + // Ensure x is actually zero when xIsZero is claimed. + // Callers (e.g. PCG) pass xIsZero=true but may not have zeroed the buffer. + // Without this, solve_iteration's "x += gamma*p" accumulates onto stale data + // from the previous outer iteration, causing divergence. + if (xIsZero) + { + fill(x, types::util::get_zero()); + } + // Run one iteration of preconditioner with zero initial guess if (no_preconditioner) {