Note that you can add -snes_fd_operator and get Newton's method with a preconditioner built from the Picard matrix.
Barry > On Feb 10, 2020, at 11:16 AM, Jed Brown <[email protected]> wrote: > > Olek Niewiarowski <[email protected]> writes: > >> Barry, >> Thank you for your help and detailed suggestions. I will try to implement >> what you proposed and will follow-up with any questions. In the meantime, I >> just want to make sure I understand the use of SNESSetPicard: >> r - vector to store function value >> b - function evaluation routine - my F(u) function >> Amat - matrix with which A(x) x - b(x) is to be computed - a >> MatCreateLRC() -- what's the best way of passing in scalar k? > > Typically via the context argument, similar to any SNES example. > >> Pmat - matrix from which preconditioner is computed (usually the same as >> Amat) - a regular Mat() >> J - function to compute matrix value, see >> SNESJacobianFunction<https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/SNES/SNESJacobianFunction.html#SNESJacobianFunction> >> for details on its calling sequence -- computes K + kaa' >> >> By the way, the manual page states "we do not recommend using this routine. >> It is far better to provide the nonlinear function F() and some >> approximation to the Jacobian and use an approximate Newton solver :-)" > > Yep, this is mainly for when someone has legacy code to compute a matrix > as a nonlinear function of the state U, but not a matrix-free way to > compute a residual. Implementing as Newton (with inexact > matrix/preconditioner) is more flexible and often enables faster > convergence.
