Jonas Mairhofer <[email protected]> writes:

> Hi all,
>
> I am using PETSc to solve a system of nonlinear equations arising from 
> Density Functional Theory. Depending on the actual problem setup the 
> residulas of the matrix-free linear solver (GMRES)
> stagnate and the nonlinear system converges only slowly.
> Besides preconditioning my second idea to improve the performance of the 
> linear solver was to use a higher order approximation of the 
> Jacobi-vector product. Therefore, I am trying to write a user defined 
> subroutine that calculates the approximation of the matrix-free 
> Jacobi-Vector product, i.e. I would like to have a routine which can 
> replace the default 1st order approximation
>
> J(x)*v  = (F(x+eps*v) - F(x) ) / eps
>
> for instance by a 2nd order approximation such as
>
> J(x)*v = (F(x+eps*v) - F(x-eps*v) ) / 2eps
>
> So assuming that I have a subroutine which claculates the approximation 
> of J(x)*v, how do I get PETSc to use this result in the SNES solver?

Unless you are trying to add the centered difference code to the PETSc
library, you should create a MatShell that computes the action by your
formula.  Note that the centered difference does not help with rounding
error, so you'll likely want to use a larger step size (eps) and rely on
the function having sufficient smoothness if you hope to achieve better
accuracy than the one-sided difference.

Attachment: pgpvMPiWbbviy.pgp
Description: PGP signature

Reply via email to