[petsc-users] norm of KSPBuildResidual does not match norm computed from KSPBuildSolution

Barry Smith bsmith at petsc.dev
Tue Nov 4 08:43:57 CST 2025


  Are you sure your matrix is symmetric, positive definite, and that the sign of all the diagonal entries is the same? 

  You can run with -ksp_view_mat binary -ksp_view_rhs binary. This will produce a file called binaryoutput, you can email that file.

  Barry




> On Nov 4, 2025, at 4:06 AM, Moral Sanchez, Elena <Elena.Moral.Sanchez at ipp.mpg.de> wrote:
> 
> Dear Barry,
> Thanks for the fast answer. Unfortunately in my case the discrepancy is huge. With the flags
>  -ksp_monitor_true_residual -ksp_norm_type unpreconditioned
> this is the output:
>   0 KSP unpreconditioned resid norm 5.568889644229e-01 true resid norm 5.568889644229e-01 ||r(i)||/||b|| 1.000000000000e+00
>   1 KSP unpreconditioned resid norm 2.831772665189e-01 true resid norm 2.831772665189e-01 ||r(i)||/||b|| 5.084986139245e-01
>   2 KSP unpreconditioned resid norm 1.875950094147e-01 true resid norm 1.875950094147e-01 ||r(i)||/||b|| 3.368625011435e-01
> and this is the output of my own monitor function:
> Iter 0/10 | res = 5.57e-01/1.00e-08 | 0.0 s
> difference KSPBuildSolution and u: 0.0
> UNPRECONDITIONED norm:  0.5568889644229376
> PRECONDITIONED norm:  2.049041078011257
> KSPBuildResidual 2-norm: 0.5568889644229299
> difference KSPBuildResidual and b-A(KSPBuildSolution): 6.573603152700697e-13
> 
> Iter 1/10 | res = 2.83e-01/1.00e-08 | 0.0 s
> difference KSPBuildSolution and u: 0.0
> UNPRECONDITIONED norm:  0.7661983589104541
> PRECONDITIONED norm:  2.7387602134717137
> KSPBuildResidual 2-norm: 0.2831772665189212
> difference KSPBuildResidual and b-A(KSPBuildSolution): 0.1700718741085172
> 
> Iter 2/10 | res = 1.88e-01/1.00e-08 | 0.0 s
> difference KSPBuildSolution and u: 0.0
> UNPRECONDITIONED norm:  0.7050518160900253
> PRECONDITIONED norm:  2.421773833445645
> KSPBuildResidual 2-norm: 0.18759500941469456
> difference KSPBuildResidual and b-A(KSPBuildSolution): 0.19327058976599623
> Here u is the vector in the KSPSolve. 
> After the first iteration, the residual computed from KSPBuildSolution and the residual from KSPBuildResidual diverge. They are the same when I run the same code without preconditioner.
> Another observation is that after convergence (wrt. unpreconditioned norm == 2-norm of KSPBuildResidual) the solution with and without preconditioner looks quite different. How is this possible if my preconditioner is SPD?
> 
> By the way, where can I find your implementation of "My monitor" in src/snes/tutorials/ex5.c? I tried to look at the Gitlab repository but could not find it.
> Thanks for the help.
> Cheers,
> Elena
> 
> 
> 
> 
> 
> On 11/4/25 03:01, Barry Smith wrote:
>>     0 KSP unpreconditioned resid norm 1.265943996096e+00 true resid norm 1.265943996096e+00 ||r(i)||/||b|| 1.000000000000e+00
>> My monitor 0 1.265943996096e+00

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20251104/4c9c6f83/attachment.html>


More information about the petsc-users mailing list