<html aria-label="message body">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<div>Dear Barry,<br>
thank you for the clear explanation and the fix. Indeed, the fact that the convergence test is turned off for the KSP smoothers should be indicated somewhere. </div>
<div><br>
The reason why I wanted to run the convergence test on the smoothers was because I wanted to study the effect of not inverting the smoother matrix completely, so I could choose an optimal maximum number of iterations. <br>
Now that I understand how it works, I will use the preconditioner accordingly. <br>
<br>
Thanks for the help.<br>
Best regards,<br>
Elena</div>
<br>
</div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Barry Smith <bsmith@petsc.dev><br>
<b>Sent:</b> 17 October 2025 01:17:17<br>
<b>To:</b> Moral Sanchez, Elena<br>
<b>Cc:</b> PETSc<br>
<b>Subject:</b> Re: [petsc-users] setting correct tolerances for MG smoother CG at the finest level</font>
<div> </div>
</div>
<div>
<div><br>
</div>
   I'm glad to hear that we finally got to the bottom of the problem you reported. Here is a quick explanation.
<div><br>
</div>
<div>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?</div>
<div><br>
</div>
<div>   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.</div>
<div><br>
</div>
<div>  Barry</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
<div>
<blockquote type="cite">
<div>On Oct 16, 2025, at 5:32 AM, Moral Sanchez, Elena <Elena.Moral.Sanchez@ipp.mpg.de> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div id="divtagdefaultwrapper" dir="ltr" style="font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; font-size: 12pt; font-family: Calibri, Helvetica, sans-serif;">
<div style="margin-top: 0px; margin-bottom: 0px;">Now the fine solver behaves as expected. This is what my callback function prints:</div>
<div style="margin-top: 0px; margin-bottom: 0px;">    MG lvl 0 (s=884): CG Iter 0/15 | res = 7.95e-01/1.00e-01 | 0.3 s<br>
    MG lvl 0 (s=884): CG Iter 1/15 | res = 9.09e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 2/15 | res = 8.89e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 3/15 | res = 3.05e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 4/15 | res = 3.25e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 5/15 | res = 2.30e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 6/15 | res = 3.22e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 7/15 | res = 1.22e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 8/15 | res = 1.04e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 9/15 | res = 1.11e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 10/15 | res = 7.50e-02/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl 0: 3<br>
    MG lvl -1 (s=524): CG Iter 0/15 | res = 1.38e-01/1.00e-01 | 2.3 s<br>
    MG lvl -1 (s=524): CG Iter 1/15 | res = 1.97e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 2/15 | res = 2.30e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 3/15 | res = 1.88e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 4/15 | res = 1.84e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 5/15 | res = 1.99e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 6/15 | res = 2.12e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 7/15 | res = 1.51e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 8/15 | res = 1.75e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 9/15 | res = 1.86e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 10/15 | res = 1.82e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 11/15 | res = 1.78e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 12/15 | res = 1.84e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 13/15 | res = 1.65e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 14/15 | res = 1.77e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 15/15 | res = 1.20e-01/1.00e-01 | 0.1 s<br>
    ConvergedReason MG lvl -1: -3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 5.18e+00/1.00e-01 | 1.3 s<br>
    MG lvl 0 (s=884): CG Iter 1/15 | res = 2.07e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 2/15 | res = 1.43e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 3/15 | res = 9.19e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 4/15 | res = 6.64e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 5/15 | res = 6.15e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 6/15 | res = 2.98e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 7/15 | res = 3.38e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 8/15 | res = 2.21e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 9/15 | res = 1.57e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 10/15 | res = 1.37e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 11/15 | res = 1.14e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 12/15 | res = 8.83e-02/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl -1: -3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 8.66e-02/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl 0: 3<br>
    MG lvl -1 (s=524): CG Iter 0/15 | res = 1.82e-01/1.00e-01 | 2.7 s<br>
    MG lvl -1 (s=524): CG Iter 1/15 | res = 3.60e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 2/15 | res = 4.27e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 3/15 | res = 3.57e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 4/15 | res = 4.22e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 5/15 | res = 4.43e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 6/15 | res = 3.81e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 7/15 | res = 2.96e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 8/15 | res = 2.78e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 9/15 | res = 3.23e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 10/15 | res = 2.80e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 11/15 | res = 4.66e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 12/15 | res = 3.31e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 13/15 | res = 2.83e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 14/15 | res = 3.29e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 15/15 | res = 2.13e-01/1.00e-01 | 0.1 s<br>
    ConvergedReason MG lvl -1: -3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 8.91e+00/1.00e-01 | 1.7 s<br>
    MG lvl 0 (s=884): CG Iter 1/15 | res = 3.61e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 2/15 | res = 3.19e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 3/15 | res = 1.74e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 4/15 | res = 9.98e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 5/15 | res = 9.44e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 6/15 | res = 7.69e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 7/15 | res = 4.48e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 8/15 | res = 4.97e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 9/15 | res = 3.94e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 10/15 | res = 2.40e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 11/15 | res = 2.67e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 12/15 | res = 2.04e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 13/15 | res = 1.67e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 14/15 | res = 1.78e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 15/15 | res = 1.43e-01/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl -1: -3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 7.26e-02/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl 0: 3<br>
    MG lvl -1 (s=524): CG Iter 0/15 | res = 1.54e-01/1.00e-01 | 3.5 s<br>
    MG lvl -1 (s=524): CG Iter 1/15 | res = 2.91e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 2/15 | res = 3.09e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 3/15 | res = 2.81e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 4/15 | res = 2.43e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 5/15 | res = 2.15e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 6/15 | res = 2.02e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 7/15 | res = 1.50e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 8/15 | res = 1.68e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 9/15 | res = 2.02e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 10/15 | res = 1.60e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 11/15 | res = 2.73e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 12/15 | res = 1.93e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 13/15 | res = 1.35e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 14/15 | res = 2.39e-01/1.00e-01 | 0.1 s<br>
    MG lvl -1 (s=524): CG Iter 15/15 | res = 1.64e-01/1.00e-01 | 0.1 s<br>
    ConvergedReason MG lvl -1: -3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 3.86e+00/1.00e-01 | 1.4 s<br>
    MG lvl 0 (s=884): CG Iter 1/15 | res = 1.76e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 2/15 | res = 1.71e+00/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 3/15 | res = 9.45e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 4/15 | res = 6.56e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 5/15 | res = 5.91e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 6/15 | res = 3.64e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 7/15 | res = 3.24e-01/1.00e-01 | 0.3 s<br>
    MG lvl 0 (s=884): CG Iter 8/15 | res = 3.45e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 9/15 | res = 2.20e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 10/15 | res = 1.51e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 11/15 | res = 1.56e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 12/15 | res = 1.17e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 13/15 | res = 1.01e-01/1.00e-01 | 0.2 s<br>
    MG lvl 0 (s=884): CG Iter 14/15 | res = 8.68e-02/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl -1: -3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 5.32e-02/1.00e-01 | 0.2 s<br>
    ConvergedReason MG lvl 0: 3<br>
    MG lvl -1 (s=524): CG Iter 0/15 | res = 9.22e-02/1.00e-01 | 3.2 s<br>
    ConvergedReason MG lvl -1: 3<br>
    MG lvl 0 (s=884): CG Iter 0/15 | res = 5.32e-02/1.00e-01 | 0.2 s</div>
<div style="margin-top: 0px; margin-bottom: 0px;">However, when I run the file without the flags</div>
<div style="margin-top: 0px; margin-bottom: 0px;">-mg_levels_ksp_convergence_test default -mg_levels_ksp_norm_type unpreconditioned</div>
<div style="margin-top: 0px; margin-bottom: 0px;">then it behaves as before. </div>
<div style="margin-top: 0px; margin-bottom: 0px;">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.</div>
<div style="margin-top: 0px; margin-bottom: 0px;"><br>
</div>
<div style="margin-top: 0px; margin-bottom: 0px;">Elena</div>
<div style="margin-top: 0px; margin-bottom: 0px;"><br>
</div>
<div class="moz-cite-prefix">On 10/14/25 19:19, Barry Smith wrote:<br>
</div>
<blockquote type="cite">-mg_levels_ksp_convergence_test default -mg_levels_ksp_norm_type unpreconditioned</blockquote>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</body>
</html>