I'm glad to hear that we finally got to the bottom of the problem you 
reported. Here is a quick explanation.

When PCMG constructs the KSP solver for each level of multigrid, it explicitly 
turns off the convergence test (meaning that it will also iterate the number of 
iterations you requested, irrespective of how much the residuals drop). We do 
this because this is conventionally done in multigrid (for example, always 
apply three iterations of smoothing). Passing in the options I sent you turns 
the convergence test BACK ON for each level. If you wish to use a convergence 
test on each level, you need to provide those options. Is there a particular 
reason you want to use a convergence test on the smoothers instead of the 
conventional fixed number of iterations?

   Because of my confusion as to why the convergence criteria seemed to 
"ignored," I modified the KSP code so that in KSPView it now explicitly lists 
when no convergence test is being used (the previous output implied the 
convergence test was used if monitoring was turned on even if no convergence 
test was used). Thus, in the future, there should be less confusion since the 
KSPView output will now be clear on when convergence testing is not being used.

  Barry



> On Oct 16, 2025, at 5:32 AM, Moral Sanchez, Elena 
> <[email protected]> wrote:
> 
> Now the fine solver behaves as expected. This is what my callback function 
> prints:
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 7.95e-01/1.00e-01 | 0.3 s
>     MG lvl 0 (s=884): CG Iter 1/15 | res = 9.09e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 2/15 | res = 8.89e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 3/15 | res = 3.05e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 4/15 | res = 3.25e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 5/15 | res = 2.30e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 6/15 | res = 3.22e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 7/15 | res = 1.22e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 8/15 | res = 1.04e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 9/15 | res = 1.11e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 10/15 | res = 7.50e-02/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl 0: 3
>     MG lvl -1 (s=524): CG Iter 0/15 | res = 1.38e-01/1.00e-01 | 2.3 s
>     MG lvl -1 (s=524): CG Iter 1/15 | res = 1.97e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 2/15 | res = 2.30e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 3/15 | res = 1.88e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 4/15 | res = 1.84e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 5/15 | res = 1.99e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 6/15 | res = 2.12e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 7/15 | res = 1.51e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 8/15 | res = 1.75e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 9/15 | res = 1.86e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 10/15 | res = 1.82e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 11/15 | res = 1.78e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 12/15 | res = 1.84e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 13/15 | res = 1.65e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 14/15 | res = 1.77e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 15/15 | res = 1.20e-01/1.00e-01 | 0.1 s
>     ConvergedReason MG lvl -1: -3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 5.18e+00/1.00e-01 | 1.3 s
>     MG lvl 0 (s=884): CG Iter 1/15 | res = 2.07e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 2/15 | res = 1.43e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 3/15 | res = 9.19e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 4/15 | res = 6.64e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 5/15 | res = 6.15e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 6/15 | res = 2.98e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 7/15 | res = 3.38e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 8/15 | res = 2.21e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 9/15 | res = 1.57e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 10/15 | res = 1.37e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 11/15 | res = 1.14e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 12/15 | res = 8.83e-02/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl -1: -3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 8.66e-02/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl 0: 3
>     MG lvl -1 (s=524): CG Iter 0/15 | res = 1.82e-01/1.00e-01 | 2.7 s
>     MG lvl -1 (s=524): CG Iter 1/15 | res = 3.60e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 2/15 | res = 4.27e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 3/15 | res = 3.57e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 4/15 | res = 4.22e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 5/15 | res = 4.43e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 6/15 | res = 3.81e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 7/15 | res = 2.96e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 8/15 | res = 2.78e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 9/15 | res = 3.23e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 10/15 | res = 2.80e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 11/15 | res = 4.66e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 12/15 | res = 3.31e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 13/15 | res = 2.83e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 14/15 | res = 3.29e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 15/15 | res = 2.13e-01/1.00e-01 | 0.1 s
>     ConvergedReason MG lvl -1: -3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 8.91e+00/1.00e-01 | 1.7 s
>     MG lvl 0 (s=884): CG Iter 1/15 | res = 3.61e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 2/15 | res = 3.19e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 3/15 | res = 1.74e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 4/15 | res = 9.98e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 5/15 | res = 9.44e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 6/15 | res = 7.69e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 7/15 | res = 4.48e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 8/15 | res = 4.97e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 9/15 | res = 3.94e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 10/15 | res = 2.40e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 11/15 | res = 2.67e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 12/15 | res = 2.04e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 13/15 | res = 1.67e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 14/15 | res = 1.78e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 15/15 | res = 1.43e-01/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl -1: -3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 7.26e-02/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl 0: 3
>     MG lvl -1 (s=524): CG Iter 0/15 | res = 1.54e-01/1.00e-01 | 3.5 s
>     MG lvl -1 (s=524): CG Iter 1/15 | res = 2.91e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 2/15 | res = 3.09e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 3/15 | res = 2.81e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 4/15 | res = 2.43e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 5/15 | res = 2.15e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 6/15 | res = 2.02e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 7/15 | res = 1.50e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 8/15 | res = 1.68e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 9/15 | res = 2.02e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 10/15 | res = 1.60e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 11/15 | res = 2.73e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 12/15 | res = 1.93e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 13/15 | res = 1.35e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 14/15 | res = 2.39e-01/1.00e-01 | 0.1 s
>     MG lvl -1 (s=524): CG Iter 15/15 | res = 1.64e-01/1.00e-01 | 0.1 s
>     ConvergedReason MG lvl -1: -3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 3.86e+00/1.00e-01 | 1.4 s
>     MG lvl 0 (s=884): CG Iter 1/15 | res = 1.76e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 2/15 | res = 1.71e+00/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 3/15 | res = 9.45e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 4/15 | res = 6.56e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 5/15 | res = 5.91e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 6/15 | res = 3.64e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 7/15 | res = 3.24e-01/1.00e-01 | 0.3 s
>     MG lvl 0 (s=884): CG Iter 8/15 | res = 3.45e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 9/15 | res = 2.20e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 10/15 | res = 1.51e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 11/15 | res = 1.56e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 12/15 | res = 1.17e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 13/15 | res = 1.01e-01/1.00e-01 | 0.2 s
>     MG lvl 0 (s=884): CG Iter 14/15 | res = 8.68e-02/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl -1: -3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 5.32e-02/1.00e-01 | 0.2 s
>     ConvergedReason MG lvl 0: 3
>     MG lvl -1 (s=524): CG Iter 0/15 | res = 9.22e-02/1.00e-01 | 3.2 s
>     ConvergedReason MG lvl -1: 3
>     MG lvl 0 (s=884): CG Iter 0/15 | res = 5.32e-02/1.00e-01 | 0.2 s
> However, when I run the file without the flags
> -mg_levels_ksp_convergence_test default -mg_levels_ksp_norm_type 
> unpreconditioned
> then it behaves as before. 
> I am setting the unpreconditioned norm for the smoothers. The corresponding 
> residual norms in the callback appear to be the same. So it seems like the 
> residual norm is computed correctly but the convergence criterion is 
> different.
> 
> Elena
> 
> On 10/14/25 19:19, Barry Smith wrote:
>> -mg_levels_ksp_convergence_test default -mg_levels_ksp_norm_type 
>> unpreconditioned

Reply via email to