On Tue, Mar 15, 2011 at 21:39, Matthew Knepley <knepley at gmail.com> wrote:

> Here is the scenario. I have a FieldSplit solve with 4 splits. For the 4th
> split, I have
> a good preconditioner matrix. In the linear case, KSP, I am just doing
> this:
>
>     err = KSPSetUp(_ksp);
>     err = KSPGetPC(_ksp, &pc);
>     err = PCFieldSplitGetSubKSP(pc, &num, &ksps);
>
>     MatStructure flag;
>     err = KSPGetOperators(ksps[num-1], &A, PETSC_NULL, &flag);
>     err = PetscObjectReference((PetscObject) A);
>     err = KSPSetOperators(ksps[num-1], A, _precondMatrix, flag);
>     err = PetscFree(ksps);
>

Yuck.


> which works fine. However, if we embed this in a nonlinear solve, so that I
> now call
>
>     err = SNESGetKSP(_snes, &ksp);
>    <same code>
>
> then the PC matrix for the 4th split is ignored. This happens because
> SNESSolve_LS()
> calls KSPSetOperators() right before the solve. This causes FS to pull out
> the same
> matrices again and overwrite my special PC matrix.
>

The preconditioning matrix for this piece should be put into the global
preconditioning matrix, perhaps stored as a MatNest. Fieldsplit should take
that matrix apart for preconditioning and it'll find the preconditioning
matrix for this part. More tricky is dealing with auxiliary operators such
as appear in approximate-commutator Schur complement preconditioners. The
current method is punting, you PetscObjectCompose the auxiliary matrix.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20110315/c62c27a6/attachment.html>

Reply via email to