First, sorry for the long email...<br><br>I think the construction of the prolongation/restriction operators, the local part of the coarse matrix and the assembling (or subassembling) of the global coarse matrix should all belong to PCIS (with PCBDDC and PCNN as subclasses). In fact, for both PCBDDC and PCNN all stuffs involved in the preconditioner application can be viewed as a subassembled matrices (Prolongation/Restrictions, static condensation also). This would need to change the actual structure of MATIS and allowing for the creation of rectangular operators mapping between two different spaces; MATIS creation will thus need both LocalToGlobalMapping (row mapping) and GlobalToLocalMapping (column mapping) arguments to be created. A brand new logic in PCIS setup I would like can be<br>

<br>PCISSetup() /* common to all PCIS methods */<br>"PCISDealWithAllLocalStuffNeededByTheSpecificNonOverlappingMethod()" <br>PCISCreateRestrictionAndProlongationOperators(pc)<br>PCISAssembleLocalCoarseMat(pc)<br>
PCISCreatePartitionOfCoarseMesh(pc,&partition)<br>PCISAssembleGlobalCoarseMat(pc,partition)<br><br>"PCISDealWithAllLocalStuffNeededByTheSpecificNonOverlappingMethod()"  will contain the construction of the "Neumann" solver (for BDDC, it is actually a saddle point problem)<br>
<br>For PCBDDC and PCNN:<br><br>PCISCreateRestrictionAndProlongation_NN will create a MATIS representing a default P which, in case of a scalar PDE, will be the constant function scaled by the partition of unity operator, with global dimensions N x sum^N_{i=1}pcis->n with N the number of subdomains and pcis->n the size of the local matis matrix (local dirichlet plus interface nodes) (in case of more complex vector valued PDEs it will need a MatNearNullSpace object as already implemented in BDDC)<br>
<br>PCISCreateRestrictionAndProlongation_BDDC: (in case of exact solvers for the Dirichlet problems) default P will be of size n_coarse_dofs*sum^N_{i=1}pcis->n_B with local matrices of P the actual pcbddc->coarse_phi_B<br>
<br>PCISCreateRestrictionAndProlongation_BDDC: (in case of inexact solvers for
 the Dirichlet problems) default P will be of size 
n_coarse_dofs*sum^N_{i=1}pcis->n with local matrices of P the 
actual pcbddc->coarse_phi_B concatenated with pcbddc->coarse_phi_D (pcis->n=pcis->n_B+pcis->n_D)<br><br>PCISAssembleLocalCoarseMat will assemble the sequential matrix representing subdomains' contribution to the global coarse matrix (_NN and _BDDC cases can be easily written using already existing codes)<br>
<br>PCISAssembleCoarseMat(pc,IS partition) would then decide how to finally assemble the coarse matrix depending on the partition passed in (and possibly change the row mapping of the default prolongation operators). <br>
<br>Does this logic fits what you have in mind?<br><br><div class="gmail_quote">
2012/5/12 Jed Brown <span dir="ltr"><<a href="mailto:jedbrown@mcs.anl.gov" target="_blank">jedbrown@mcs.anl.gov</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div><div class="gmail_quote">On Fri, May 11, 2012 at 6:11 PM, Stefano Zampini <span dir="ltr"><<a href="mailto:stefano.zampini@gmail.com" target="_blank">stefano.zampini@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p>Isn't PtAP still the right operation, you just have a particular implementation that takes advantage of structure?</p>


</blockquote><div><br></div></div><div>yes it is, but since it is an expensive operations (P is dense), in BDDC, once you solved the local problems to create P, you have almost straigthly (and at a very low cost) the columns of the coarse matrix. The latter can be obtained (as it is implemented in the code) as C^T\Lambda where C is the local sparse  matrix of constraints, and \Lambda is a dense and small matrix of lagrange multipliers.</div>


<div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<p>I know you can also assemble B A^{-1} B^T, which is the same thing, and maybe we should provide a generic op for that.</p></blockquote></div><div>What is B? the jump operator?</div></blockquote></div><br></div><div>Your C above.</div>


<div><br></div><div>I have other algorithms in mind where the the interpolants would be constructed somewhat differently. I may need to think a bit about what the right common operation is for that case. I just feel like we may be getting too tightly dependent on the specific BDDC algorithm (which has exponential condition number growth in the number of levels), which we probably want to generalize in the future.</div>


</blockquote></div><br><br clear="all"><br>-- <br>Stefano<br>