Do "what you would do for KSP" but with "SNES" so use
> MatCreateShell( ....) > MatShellSetOperation(....) SNESSetJacobian() and pass in your shell matrix as the Jacobian. > On Dec 2, 2015, at 5:09 PM, DU Yongle <[email protected]> wrote: > > Dear Sir/Madam: > > Sorry to bother, but I didn't find any information I need to implement > matrix-free functions for SNES after a long time search of the manual and > sample codes. > > Suppose I am solving nonlinear equation systems F(x) = 0, I have two choices: > > (1) MatCreateMFFD(snes, matJ): > This calculate matJ * x with a finite difference scheme. I can create a > function to calculate matJ * x, and link it to SNES by SNESSetJacobian. > However, I do not prefer this feature because I am calculating the mat-vec > product in another way. > > (2) MatCreateMF(snes, matJ): > Here, matJ is not defined explicitly. It is some operations (like mat-vec > product). must be linked to SNES, and must be linked to SNES through > SNESSetJacobian. > > For KSP solvers, I know that a matshell type can be created and a mat-vec > product can be assigned to matJ in this way: > MatCreateShell( ....) > MatShellSetOperation(....) > KSPSetOperators(ksp, matJ, matJ) > > How to do the similar operations for SNES if matJ is already created via > MatCreateMF? You would not use MatCreateMF() in your case. It only does finite difference scheme which is not what you want so why would you even consider it? > How to define the mat size and mat-vec product? What other operations are > required in a customized function in order to link it to SNES via > SNESSetJacobian? > > Thanks a for your help. > > Yongle Du > > > >
