[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