<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 14.06.21 15:02, Matthew Knepley
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAMYG4GnMUp8r1BLJq7ysCDP7go7gkU799BA9n+frNm29_F8hCQ@mail.gmail.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <div dir="ltr">
        <div dir="ltr">On Mon, Jun 14, 2021 at 8:45 AM Anton Popov <<a
            href="mailto:popov@uni-mainz.de" moz-do-not-send="true">popov@uni-mainz.de</a>>
          wrote:<br>
        </div>
        <div class="gmail_quote">
          <blockquote class="gmail_quote" style="margin:0px 0px 0px
            0.8ex;border-left:1px solid
            rgb(204,204,204);padding-left:1ex">
            <div>
              <p>Hi Barry & Matt,<br>
                <br>
                thanks for your quick response. These options were
                exactly what I needed and expected:<br>
                <br>
                -pc_mg_galerkin pmat<br>
                -pc_use_amat false<br>
                <br>
                I just assumed that it’s a default behavior of the PC
                object.<br>
                <br>
                So to clarify my case, I don't use nonlinear multigrid.
                Galerkin is expected to deal with Pmat only, and it's
                enough if Amat implements a matrix-vector product for
                the Krylov accelerator.<br>
                <br>
                Matt, the reason for switching Amat during the iteration
                is a quite common Picard-Newton combination. Jacobian
                matrix gives accurate updates close to the solution, but
                is rather unstable far form the solution. Picard matrix
                (approximate Jacobian) is quite the opposite – it’s kind
                of stable, but slow. So the idea is to begin the
                iteration with Picard matrix, and switch to the Jacobian
                later.<br>
                <br>
                If the assembled matrices are used, then the standard
                SNES interface is just perfect. I can decide how to fill
                the matrices. But I don’t bother with  Jacobian assembly
                and want to use a built-in MFFD approximation instead. I
                did quite a few tests previously and figured out that
                MFFD is practically the same as closed-from matrix-free
                Jacobian for the later stages of the iteration. The
                Picard matrix still does a good job as a preconditioner.
                But it is important to start the iteration with Picard
                and only change to MFFD later.<br>
                <br>
                Is my workaround with the shell matrix acceptable, or
                there is a better solution?</p>
            </div>
          </blockquote>
          <div>It is fine. However, I wonder if you have time to try out
            a slightly different solution. I experimented with this, and
            it worked as well for me as switching between</div>
          <div>Picard and Newton. I made a SNESCOMPOSITE with Picard and
            Newton as the two components. I made Newton take a single
            step, and then adjusted the</div>
          <div>Picard steps a little.The additiveoptimal variant always
            converged for me, and took the same or less time. I also
            used left preconditioning of Picard by Newton,</div>
          <div>but that is more involved, and for my simple problem was
            not a lot better. The advantage I see is that both solves
            are not plain vanilla, and you do not have any</div>
          <div>switching logic.</div>
          <div><br>
          </div>
        </div>
      </div>
    </blockquote>
    <p>hmmm, this sounds really interesting. I will definitely look into
      this possibility. Thanks Matt.</p>
    <p>Thanks,</p>
    <p>Anton<br>
    </p>
    <p><br>
    </p>
    <blockquote type="cite"
cite="mid:CAMYG4GnMUp8r1BLJq7ysCDP7go7gkU799BA9n+frNm29_F8hCQ@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_quote">
          <div>  Thanks,</div>
          <div><br>
          </div>
          <div>    Matt</div>
          <div> </div>
          <blockquote class="gmail_quote" style="margin:0px 0px 0px
            0.8ex;border-left:1px solid
            rgb(204,204,204);padding-left:1ex">
            <div>
              <p> Thanks,<br>
                Anton <br>
              </p>
              <div>On 13.06.21 20:52, Barry Smith wrote:<br>
              </div>
              <blockquote type="cite">
                <div><br>
                </div>
                <div>  Anton,</div>
                <div><br>
                </div>
                  -pc_mg_galerkin pmat
                <div><br>
                </div>
                <div>  Though it seems simple, there is some subtly in
                  swapping out matrices with SNES.</div>
                <div><br>
                </div>
                <div>  When using multigrid with SNES there are at least
                  five distinct uses of the Jacobian operator. </div>
                <div>
                  <ol>
                    <ul>
                      <li>Perform matrix-vector product in line search
                        to check Wolf sufficient decrease convergence
                        criteria</li>
                      <li>Perform the matrix-vector product for the
                        Krylov accelerator of the system</li>
                      <li>Perform smoothing on the finest level of MG</li>
                      <li>Perform the matrix-vector product needed on
                        the finest level of MG to compute the residual
                        that will be restricted to the coarser level of
                        multigrid</li>
                      <li>When using Galerkin products to compute the
                        coarser grid operator performing the Galerkin
                        matrix triple product</li>
                    </ul>
                  </ol>
                  <div><br>
                  </div>
                  <div>when one swaps out the mat, which of these do
                    they wish to change? The first two seem to naturally
                    go together as do the last three. In your case I
                    presume you want to swap for the first two, but
                    always use pmat for the last three? To achieve this
                    you will also need -pc_use_amat  false</div>
                  <div><br>
                  </div>
                  <div>If you run with -info and -snes_view it will
                    print out some of the information about which
                    operator it is using for each case, but probably not
                    all of them.</div>
                  <div><br>
                  </div>
                  <div>Note: if the pmat is actually an accurate
                    computation of the Jacobian then it is likely best
                    not to ever use a matrix-free product. It is only
                    when pmat is approximated in some specific way that
                    using the matrix-free product would be useful to
                    insure the "Newton" method actually computes a
                    Newton step.</div>
                  <div><br>
                  </div>
                  <div>Barry</div>
                  <div><br>
                  </div>
                  <div><br>
                  </div>
                </div>
                <div>
                  <div><br>
                    <blockquote type="cite">
                      <div>On Jun 13, 2021, at 11:21 AM, Matthew Knepley
                        <<a href="mailto:knepley@gmail.com"
                          target="_blank" moz-do-not-send="true">knepley@gmail.com</a>>
                        wrote:</div>
                      <br>
                      <div>
                        <div dir="ltr">
                          <div dir="ltr">On Sun, Jun 13, 2021 at 10:55
                            AM Anton Popov <<a
                              href="mailto:popov@uni-mainz.de"
                              target="_blank" moz-do-not-send="true">popov@uni-mainz.de</a>>
                            wrote:<br>
                          </div>
                          <div class="gmail_quote">
                            <blockquote class="gmail_quote"
                              style="margin:0px 0px 0px
                              0.8ex;border-left:1px solid
                              rgb(204,204,204);padding-left:1ex">Hi,<br>
                              <br>
                              I want a simple(?) thing. I want to decide
                              and be able to assign the <br>
                              Jacobian matrix (Amat) on the fly within
                              the FormJacobian function (i.e. <br>
                              during Newton iteration) to one of the
                              following options:<br>
                              <br>
                              1) built-in MFFD approximation<br>
                              2) assembled preconditioner matrix (Pmat)<br>
                              <br>
                              I have not found this scenario
                              demonstrated in any example, therefore <br>
                              I’m asking how to do that.<br>
                              <br>
                              Currently I do the following:<br>
                              <br>
                              1) setup Amat as a shell matrix with a
                              MATOP_MULT operation that simply <br>
                              retrieves a matrix object form its context
                              and calls MatMult on it.<br>
                              <br>
                              2) if I need MFFD, I put a matrix
                              generated with MatCreateSNESMF in the <br>
                              Amat context (of course I also call
                              MatMFFDComputeJacobian before that).<br>
                              <br>
                              3) if I need Pmat, I simply put Pmat in
                              the Amat context.<br>
                              <br>
                              4) call MatAssemblyBegin/End on Amat<br>
                              <br>
                              So far so good.<br>
                              <br>
                              However, shell Amat and assembled Pmat
                              generate a problem if Galerkin <br>
                              multigrid is requested as a preconditioner
                              (I just test on 1 CPU):<br>
                              <br>
                              [0]PETSC ERROR: MatPtAP requires A, shell,
                              to be compatible with P, <br>
                              seqaij (Misses composed function
                              MatPtAP_shell_seqaij_C)<br>
                              [0]PETSC ERROR: #1 MatPtAP()<br>
                              [0]PETSC ERROR: #2 MatGalerkin()<br>
                              [0]PETSC ERROR: #3 PCSetUp_MG()<br>
                              [0]PETSC ERROR: #4 PCSetUp()<br>
                              [0]PETSC ERROR: #5 KSPSetUp()<br>
                              [0]PETSC ERROR: #6 KSPSolve()<br>
                              [0]PETSC ERROR: #7 SNESSolve_NEWTONLS()<br>
                              [0]PETSC ERROR: #8 SNESSolve()<br>
                              <br>
                              It seems like PETSc tries to apply
                              Galerkin coarsening to the shell Amat <br>
                              matrix instead of the assembled Pmat. Why?<br>
                              <br>
                              Pmat is internally generated by SNES using
                              a DMDA attached to SNES, so <br>
                              it has everything to define Galerkin
                              coarsening. And it actually works <br>
                              if I just get rid of the shell Amat.<br>
                              <br>
                              I can get around this problem by wrapping
                              a PC object in a shell matrix <br>
                              and pass it as Pmat. This is a rather ugly
                              approach, so I wonder how to <br>
                              resolve the situation in a better way, if
                              it is possible.<br>
                            </blockquote>
                            <div><br>
                            </div>
                            <div>Hi Anton,</div>
                            <div><br>
                            </div>
                            <div>You are correct that there is no
                              specific test, so I can believe that a bug
                              might be lurking here.</div>
                            <div>I believe the way it is supposed to
                              work is that you set the type of Galerkin
                              coarsening that you</div>
                            <div>want</div>
                            <div><br>
                            </div>
                            <div>  <a
href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PCMGSetGalerkin.html"
                                target="_blank" moz-do-not-send="true">https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PCMGSetGalerkin.html</a></div>
                            <div><br>
                            </div>
                            <div>So I am thinking you want 'pmat' only,
                              and you would be in charge of making the
                              coarse MFFD operator</div>
                            <div>and telling PCMG about it. I could
                              imagine that you might want us to
                              automatically do that, but we would</div>
                            <div>need some way to know that it is MFFD,
                              and with the scheme above we do not have
                              that.</div>
                            <div><br>
                            </div>
                            <div>What is the advantage of switching
                              representations during the Newton
                              iteration?</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:1px solid
                              rgb(204,204,204);padding-left:1ex">
                              Thanks.<br>
                              Anton<br>
                            </blockquote>
                          </div>
                          -- <br>
                          <div dir="ltr">
                            <div dir="ltr">
                              <div>
                                <div dir="ltr">
                                  <div>
                                    <div dir="ltr">
                                      <div>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><br>
                                      </div>
                                      <div><a
                                          href="http://www.cse.buffalo.edu/~knepley/"
                                          target="_blank"
                                          moz-do-not-send="true">https://www.cse.buffalo.edu/~knepley/</a><br>
                                      </div>
                                    </div>
                                  </div>
                                </div>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                    </blockquote>
                  </div>
                  <br>
                </div>
              </blockquote>
            </div>
          </blockquote>
        </div>
        <br clear="all">
        <div><br>
        </div>
        -- <br>
        <div dir="ltr" class="gmail_signature">
          <div dir="ltr">
            <div>
              <div dir="ltr">
                <div>
                  <div dir="ltr">
                    <div>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><br>
                    </div>
                    <div><a href="http://www.cse.buffalo.edu/~knepley/"
                        target="_blank" moz-do-not-send="true">https://www.cse.buffalo.edu/~knepley/</a><br>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
  </body>
</html>