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.
