<div dir="ltr">On Fri, Oct 25, 2013 at 11:33 AM, Torquil Macdonald Sørensen <span dir="ltr"><<a href="mailto:torquil@gmail.com" target="_blank">torquil@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div><div><div>Hi!<br><br></div>I'm using PETSc 3.4.3, with only default runtime settings, to solve Ax=b, for complex numbers (I have used --with-scalar-type=complex).<br>
<br></div>After reading sections 4.3.1, 4.3.2, 4.3.3 in the manual, I decided to investigate the convergence in my program, since I'm having some problems when the system is larger. So, I'm running it with the options<br>

<br>-ksp_monitor_true_residual -ksp_converged_reason -ksp_view<br><br></div>The output shows that the relative tolerance required for convergence is 1e-5, but none of the reported norms are that small. Despite this, convergence is reported (CONVERGED_RTOL).<br>

<br></div><div>I though that CONVERGED_RTOL should indicate that ||r||_2/||b||_2 < 1e-5, where r is the preconditioned residual?<br></div><div><br></div><div>Here is the output of my program (which includes some code to compute the l_2 norm of b, just before KSPSolve is run):<br>

<br>*************************************************************<br>Norm of b: 0.179829<br>  0 KSP preconditioned resid norm 2.508789303280e+04 true resid norm 1.798290175843e-01 ||r(i)||/||b|| 1.000000000000e+00<br>  1 KSP preconditioned resid norm 1.856991132478e+00 true resid norm 3.186462510386e-01 ||r(i)||/||b|| 1.771940120227e+00<br>

  2 KSP preconditioned resid norm 1.704678606994e-01 true resid norm 4.004071321891e-02 ||r(i)||/||b|| 2.226599119363e-01<br></div></div></blockquote><div><br></div><div>So the relative preconditioned residual is:</div><div>
<br></div><div>  1.7e-01 / 2.5e+04 < 1.0e-5</div><div><br></div><div>while the relative true residual is 2.2e-1. This happens because you are using ILU(0). It can be really</div><div>crappy, and in this case the preconditioner is very ill-conditioned. I can't imagine a problem where I</div>
<div>would recommend using ILU, but its our default because its the only black-box PC that exists.</div><div><br></div><div>  Thanks</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div>Linear solve converged due to CONVERGED_RTOL iterations 2<br>KSP Object: 1 MPI processes<br>  type: gmres<br>
    GMRES: restart=30, using Classical (unmodified) Gram-Schmidt Orthogonalization with no iterative refinement<br>    GMRES: happy breakdown tolerance 1e-30<br>  maximum iterations=10000, initial guess is zero<br>  tolerances:  relative=1e-05, absolute=1e-50, divergence=10000<br>

  left preconditioning<br>  using PRECONDITIONED norm type for convergence test<br>PC Object: 1 MPI processes<br>  type: ilu<br>    ILU: out-of-place factorization<br>    0 levels of fill<br>    tolerance for zero pivot 2.22045e-14<br>

    using diagonal shift on blocks to prevent zero pivot [INBLOCKS]<br>    matrix ordering: natural<br>    factor fill ratio given 1, needed 1<br>      Factored matrix follows:<br>        Matrix Object:         1 MPI processes<br>

          type: seqaij<br>          rows=18, cols=18<br>          package used to perform factorization: petsc<br>          total: nonzeros=144, allocated nonzeros=144<br>          total number of mallocs used during MatSetValues calls =0<br>

            using I-node routines: found 9 nodes, limit used is 5<br>  linear system matrix = precond matrix:<br>  Matrix Object:   1 MPI processes<br>    type: seqaij<br>    rows=18, cols=18<br>    total: nonzeros=144, allocated nonzeros=360<br>

    total number of mallocs used during MatSetValues calls =18<br>      using I-node routines: found 9 nodes, limit used is 5<br>************************************************************************************************<br>

<br></div><div>Here is the code I used to get the l_2 norm of b:<br><br>PetscReal val;<br>VecNorm(b, NORM_2, &val);<br>PetscPrintf(PETSC_COMM_WORLD, "Norm of b: %G\n", val);<br></div><div><br></div><div>Best regards<span class=""><font color="#888888"><br>

</font></span></div><span class=""><font color="#888888"><div>Torquil Sørensen<br></div></font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener
</div></div>