Block matrices and Schur complement preconditioning

Matthew Knepley knepley at gmail.com
Wed Aug 27 16:42:50 CDT 2008


Just so I can remove this from my todo mail pile, it appears Barry is
doing this.
The actually Schur stuff is a new KSP thing so we do not link Mat to KSP, but
it should work as you want.

   Matt

On Mon, Aug 11, 2008 at 4:16 PM, Jed Brown <jed at 59a2.org> wrote:
> For context, I'm thinking of LNKS optimization or coupled indefinite
> systems, perhaps with many fields, where the Jacobian is applied matrix-free
> (using a MatShell in my usage).  In these circumstances, it isn't useful to
> actually form all the blocks in the Jacobian when constructing the
> preconditioning matrix, just those which are the operator or preconditioning
> matrix in a KSP inside the Schur complement/reduced space preconditioner.
> In order to make the preconditioner slightly more generic, it would be nice
> to have a matrix type which is really just a wrapper for the blocks which
> are actually needed by the preconditioner.  For a simple concrete example,
> consider a mixed discretization of the Stokes problem  J = [A B'; B 0]  where
> J is applied matrix-free.  For preconditioning, we'll need an approximate
> Schur complement  S = -B \tilde{A^{-1}} B'  where  \tilde{A^{-1}}  may be
> V-cycle of AMG applied to  \hat{A}  (an approximation to  A) which is the
> only matrix which needs to be actually formed.  Normally the pressure mass
> matrix  M  would also be formed to precondition  S.  Now we could define the
> preconditioning matrix  P = [\hat{A} 0; 0 M], but I don't like it.
>
> Of course  \hat{A}  and  M  need not have the same matrix type, but it seems
> logical to assemble them in the Jacobian assembly function.  What I
> currently do is to put them in the PCShell context and assemble them in
> PCSetUp(), but this means that the PC needs access to the problem
> description.  We could put them in P = [\hat{A} 0; 0 M] (of type MatShell)
> and extract the pieces with MatGetSubMatrix(), but it seems to me that
> MatGetSubMatrix() ought to be able to succeed with any valid pair of IS.
>
> So perhaps it would be useful to have another function MatGetSubBlock()
> which just takes a pair of integers and returns the block if it is
> available.  That is, we could have MatGetSubBlock(P,0,0,&Ahat) give the
> explicit viscosity matrix and MatGetSubBlock(J,1,0,&B) give a MatShell which
> implements B, but MatGetSubBlock(P,1,0,&Bhat) return NULL since an explicit
> form of that matrix is not available (or it could return the MatShell B).
> On the other hand, what should MatGetSubBlock(P,1,1,&C) give?  Logically, it
> should be the zero matrix or NULL, but the preconditioner needs to get
> access to M somehow.  So it looks like we are back to the original situation
> where the assembly code needs to know details about the preconditioner or
> the preconditioner needs to know how to assemble the matrices it needs.  We
> can get slightly more separation by using P as a container for those
> matrices that the preconditioner would need, but now its looking like P
> isn't a matrix at all (it wouldn't really make sense to implement
> MatMult()).
>
> Any ideas for a better way?
>
> Jed
>



-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which
their experiments lead.
-- Norbert Wiener




More information about the petsc-dev mailing list