On Mar 8, 2012, at 4:49 PM, Jed Brown wrote:
> On Thu, Mar 8, 2012 at 15:40, Barry Smith <bsmith at mcs.anl.gov> wrote:
> But the LSC_L reflects properties of the true operator while LSC_Lp reflects
> properties of the matrix from which you build the preconditioner.
>
> Only if you used -pc_fieldsplit_real_diagonal. My concern is that pc->mat is
> a MatSchurComplement that is not likely to be made by the user (the user
> never has access to it in PCFieldSplit so there is no way it can be anything
> else). If we actually used the MatGetSchurComplement() interface, the user
> would have an opportunity to see it, but it's not practical to do that
> currently because it would duplicate the submatrices.
>
> Hence LSC_L should be attached to pc->mat
>
> So why not check in pc->mat first and if not there check in pc->pmat
>
Jed,
As you know, currently when using PCFIELDSPLIT we have the presentation:
ilink = jac->head;
ierr = ISComplement(ilink->is,rstart,rend,&ccis);CHKERRQ(ierr);
ierr =
MatGetSubMatrix(pc->mat,ilink->is,ccis,MAT_INITIAL_MATRIX,&jac->B);CHKERRQ(ierr);
ierr = ISDestroy(&ccis);CHKERRQ(ierr);
ilink = ilink->next;
ierr = ISComplement(ilink->is,rstart,rend,&ccis);CHKERRQ(ierr);
ierr =
MatGetSubMatrix(pc->mat,ilink->is,ccis,MAT_INITIAL_MATRIX,&jac->C);CHKERRQ(ierr);
ierr = ISDestroy(&ccis);CHKERRQ(ierr);
/* Use mat[0] (diagonal block of the real matrix) preconditioned by
pmat[0] */
ierr =
MatCreateSchurComplement(jac->mat[0],jac->pmat[0],jac->B,jac->C,jac->mat[1],&jac->schur);CHKERRQ(ierr);
I think it makes sense for the L to be attached by the user to the user
provided pc->mat and pc->pmat , (for example the ComputeFunction() the user
provides could attach the L directly to the Jacobian they produce) with our
current design this means PCFIELDSPLIT here needs to pull the L out of the
pc->mat and put it into the jac->schur. Kind of ugly but workable.
An alternative is to refactor MatCreateSchurComplement() to take the
original matrix and the IS as arguments and basically suck in all the code
above into the MatCreateSchurComplement() this routine would automatically pull
the L out of the input matrix and stick it into the created Schur matrix,
How would you like to proceed.
Barry