<br><br><div class="gmail_quote">On Wed Nov 12 2014 at 7:49:28 PM Jed Brown <<a href="mailto:jed@jedbrown.org">jed@jedbrown.org</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> writes:<br>
>    Perhaps we need a generic way of attaching null spaces to parts of<br>
>    matrices and to parts of matrices in different basis (which is what<br>
>    a Schur complement is). So (and this is likely overly simplistic)<br>
>    one could supply a null space, an index set, and a flag indicating<br>
>    either "part of the matrix" or the "Schur complement of the matrix<br>
>    with respect to an index set".  These provided null spaces could<br>
>    then be used by the preconditioners (like Fieldsplit) that<br>
>    manipulate parts of the matrix or Schur complement.<br>
<br>
Yes, this is conceptually right, but it looks to me like it gets hairy<br>
for recursive splitting.<br></blockquote><div><br></div><div>I don't think we can anticipate every possible solver configuration and hang enough additional information on the objects we passed down a deeply-nested solver hierarchy.  Even if we could, we could end up with very long lists of flags and objects, and complicated case statements to sift through the flags attached to the Mat.  Also, what if the split in question is a couple of levels down the solver hierarchy (not at all out of the question for many multiphysics problems)?  The user doesn't get to create that Mat or PC and, therefore, doesn't have an opportunity to pass down the necessary extra information. </div><div><br></div><div>I think the problem-specific solver configuration can be carried out by an additional user-specified callback (attached, e.g., using PCSetUserSetUp()) called from PCSetUp().</div><div>The problem of propagating it down the hierarchy can be solved by using DMs (even DMShell would do, as it carries an ApplicationCtx) and a consistent use of DMFieldSplitRestrictHook (by analogy with other restriction hooks, like DMSubDomainRestrictHook).  DMFieldSplitRestrict() would be called when creating each split and one of the restriction hooks would transfer the necessary contexts.  </div><div><br></div><div>This is a bit heavyweight, but flexible and logically consistent, it seems to me, and no worse that what has to be done to propagate things like DMSNES/DMKSP through the MG hierarchy. (N)ASM uses something similar, too.</div><div><br></div><div>Dmitry.</div></div>