[petsc-users] matrix-free preconditionning of FGMRES

Darcoux Christine bouloumag at gmail.com
Sun Jan 16 19:03:44 CST 2011


2011/1/16 Barry Smith <bsmith at mcs.anl.gov>

>
> On Jan 16, 2011, at 5:59 PM, Darcoux Christine wrote:
>
> > I am new to PETSc and I am interested to use the nonlinear solver in a
> CFD code for low speed compressible fluid.
> >
> > According to some papers, it seems that GMRES (or any other Krylov
> method) could be used to precondition FGMRES in a way that is completely
> matrix-free. Is it something possible with the fgmres implementation
> provided by PETSc ?
>
>    Yes, but like anything with "matrix-free" is the question how you
> provide a decent preconditioner without forming any matrices. If you can do
> that then you are all set.
>
>  KSPSetOperators(ksp,A,B,...)   or SNESSetJacobian(snes,A,B, ....)  where A
> is a a MATSHELL that does matrix vector products or use MatCreateMFFD()
>
> -ksp_type fgmres -pc_type ksp -ksp_ksp_type gmres  -ksp_view
>
>  If B is some approximate representation of A then B will be used to
> construct the preconditioner, if you never have a matrix-representation but
> have a function/subroutine that is supposedly a good preconditioner then you
> would use PCSHELL to provide it. So there are several possibilities
> depending on what you have and what you want to do.
>
>  Barry
>
> > Christine
> >
>


Thank you for the detailled explanations. My idea is to simply precondition
fGMRES with GMRES to avoid creating a B that is an approximate
representation of A. If A is represented by a mat-vec routine, I think that
the preconditionner M (approximation of the inverse of A) could be defined
by the action of GMRES. Here's a code pseudo-code showing how I would like
to define such an M.

1. Define matrix A as a mat-vec operation (matrix free), right-hand-side b
and x0 a zero vector
2. The tricky part is now to define M by a mat-vec function like this

function precon_matvec(x) {
    //Basically, GMRES approximates inverse(A) with a polynomial
    // P(A) so that x = x0 + P(A)*r, where r is the residual.  Thus in the
    // call to GMRES, x0 is a zero vector and the right-hand-side is x.
    return gmres(A, x, x0, tolerance=gmres_tol, maxiter=10)
}

M = CreateMatrixFreePreconditionner (precon_matvec)

3. Now call fGMRES with the above M preconditionner

Is it possible to acheive something like this with PETSc ?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20110116/f58aa72a/attachment.htm>


More information about the petsc-users mailing list