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.

Reply via email to