<div class="gmail_quote">On Sat, Oct 15, 2011 at 08:08, Ben Dudson <span dir="ltr"><<a href="mailto:benjamin.dudson@york.ac.uk">benjamin.dudson@york.ac.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div id=":1k4">I'm using the petsc-dev TS system to solve a system<br>
<br>
u' = F(u)<br>
<br>
and would like to supply my own preconditioner to the KSP linear solver inside the SNES nonlinear solver. The Jacobian of the system is difficult to evaluate, so I would like to remain matrix-free. I have however got an approximate inverse operator of the linear system being solved by KSP:<br>

<br>
(I - alpha*J)<br>
<br>
In SUNDIALS it's possible to supply a preconditioner function which is then called passing the system state, vector to be preconditioned, and the alpha parameter. To do this in PETSc, should I define a MatShell or PCShell, and is there a way to get alpha from the TS?</div>
</blockquote></div><br><div>You supply a PCShell that implements your custom preconditioner and set a callback for TSSetIJacobian(). That callback gives you the shift parameter that you can cache in your context.</div><div>
<br></div><div>If you have complicated nesting (e.g. several different PCShells on different multigrid levels or in different subdomains), you can make your software more modular if you create MatShells to hold the shift and perhaps other information that belongs in each context. For simpler cases, it's common to just have a shared application context in which case the PCShell knows what levels/subdomain/physics it is supposed to operate on.</div>