<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">2013/7/6 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">
[Moving to petsc-dev]<br>
<br>
Stefano Zampini <<a href="mailto:pullrequests-reply@bitbucket.org">pullrequests-reply@bitbucket.org</a>> writes:<br>
<br>
> --- you can reply above this line ---<br>
><br>
> New comment on pull request:<br>
><br>
> <a href="https://bitbucket.org/petsc/petsc/pull-request/62/pcbddc-bugfix-in-pcpostsolve_bddc#comment-361980" target="_blank">https://bitbucket.org/petsc/petsc/pull-request/62/pcbddc-bugfix-in-pcpostsolve_bddc#comment-361980</a><br>

><br>
> Stefano Zampini said:<br>
><br>
> I'm on a two days holiday, I will remove function pointers as soon as<br>
> I will come back home (Monday). Then you can merge a complete branch<br>
> with a clean history as you like ;-)<br>
<br>
Should I just add the following, or did you have more in mind?<br>
<br>
diff --git i/src/ksp/pc/impls/bddc/bddc.c w/src/ksp/pc/impls/bddc/bddc.c<br>
index 14c8718..d56745e 100644<br>
--- i/src/ksp/pc/impls/bddc/bddc.c<br>
+++ w/src/ksp/pc/impls/bddc/bddc.c<br>
@@ -933,7 +933,7 @@ static PetscErrorCode PCBDDCMatFETIDPGetRHS_BDDC(Mat fetidp_mat, Vec standard_rh<br>
<br>
   /* change of basis for physical rhs if needed<br>
      It also changes the rhs in case of dirichlet boundaries */<br>
-  (*mat_ctx->pc->ops->presolve)(mat_ctx->pc,NULL,standard_rhs,NULL);<br>
+  ierr = PCPreSolve_BDDC(mat_ctx->pc,NULL,standard_rhs,NULL);CHKERRQ(ierr);<br>
   /* store vectors for computation of fetidp final solution */<br>
   ierr = VecScatterBegin(pcis->global_to_D,standard_rhs,mat_ctx->temp_solution_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);<br>
   ierr = VecScatterEnd(pcis->global_to_D,standard_rhs,mat_ctx->temp_solution_D,INSERT_VALUES,SCATTER_FORWARD);CHKERRQ(ierr);<br>
@@ -1044,7 +1044,7 @@ static PetscErrorCode PCBDDCMatFETIDPGetSolution_BDDC(Mat fetidp_mat, Vec fetidp<br>
   ierr = VecScatterEnd  (pcis->global_to_D,pcis->vec1_D,standard_sol,INSERT_VALUES,SCATTER_REVERSE);CHKERRQ(ierr);<br>
   /* final change of basis if needed<br>
      Is also sums the dirichlet part removed during RHS assembling */<br>
-  (*mat_ctx->pc->ops->postsolve)(mat_ctx->pc,NULL,NULL,standard_sol);<br>
+  ierr = PCPostSolve_BDDC(mat_ctx->pc,NULL,NULL,standard_sol);CHKERRQ(ierr);<br>
   PetscFunctionReturn(0);<br>
<br>
 }<br>
<br></blockquote><div>Right. <br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
> Maybe I was not clear regarding Pre and Post solves, there's not<br>
> special code (except the if (..) guards) for FETI-DP into<br>
> PCPreSolve_BDDC and PCPostSolve_BDDC; they are needed by the BDDC<br>
> itself when the change of basis has been requested and/or some rows of<br>
> the MATIS matrix has been zeroed out to impose dirichlet<br>
> conditions. More specifically, change of basis is completely<br>
> trasparent to the user: MATIS local matrices are changed during<br>
> presolve and then restored back in postsolve.<br>
<br>
I'm not opposed to doing the change of basis in pre/post solve, but I<br>
don't think anyone liked the fragility induced by -ksp_diagonal_scale,<br>
which is the same kind of thing.<br>
<br></blockquote><div><br></div><div>The PCBDDC user has also the possibility of not using the change of basis (now it is the default).<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

> Regarding FETI-DP: the current code (which is working great by the<br>
> way) is built on top of the PCBDDC class and it is still at its<br>
> infancy regarding a fully integration with PETSc and its<br>
> classes. PCPreSolve_BDDC and PCPostSolve_BDDC should be exactly where<br>
> they currently are in FETI-DP code, since FETI-DP context uses the<br>
> BDDC preconditioner (through the private function<br>
> PCBDDCApplyInterfacePreconditioner) to compute Matrix vector<br>
> multiplication in Krylov methods.<br>
<br>
I think this tracks off into a discussion that I'd like to get others'<br>
opinions about.  We currently have a very simple PCGalerkin that can<br>
formulate a problem in an alternative space (PCMG can do something<br>
similar and more).  We could have an enhanced version called PCFETIDP<br>
that does this setup for FETI-DP.  I don't consider it acceptable to ask<br>
the user to do anything special for FETI-DP beyond that which is<br>
algorithmically critical (MATIS Neumann matrices).<br>
<br></blockquote><div><br></div><div>In my mind, MatFETIDP should be created starting by a MATIS matrix (as PCBDDC) but the code placed either in ksp/pc or ksp/ksp, since it uses internaly a PCBDDC, in order to not break "--with-single-library" builds. As a preconditioner for FETI-DP system, now the default is the so called Dirichlet preconditioner, which can be built starting from the MATIS. Exposing Mat and PC object for FETI, then the user will need MatFETIDPGetRHS and MatFETIDPGetSolution in order to switch between the physical space of degrees of freedom and the space of FETI lagrange multipliers. <br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
> We should decide how to definitively embed FETIDP into PETSc; does it<br>
> should be a KSP? What should be the calling sequence for the user to<br>
> build the FETI-DP matrix? Barry? Maybe we should move this to a<br>
> separate thread.<br>
</blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr"><pre cols="72"><font><span style="font-family:garamond,serif"><span style="font-family:garamond,serif"></span>Ph. D. Stefano Zampini<br>CINECA  
SuperComputing Applications and Innovations Department - SCAI
Via dei Tizii, 6 00185 Roma - ITALY
------------------------------------------------------------------------------------------------------------------------
Email: <a href="mailto:s.zampini@cineca.it" target="_blank"><span>s.zampini@cineca.it</span></a>
SkypeID: stefano.zampini
GoogleTalk: <a href="mailto:stefano.zampini@gmail.com" target="_blank">stefano.zampini@gmail.com</a>
Tel: <a value="+390644486720">+39 06.44486.707<br></a></span></font><a value="+390644486720"><font><span style="font-family:garamond,serif">------------------------------------------------------------------------------------------------------------------------
</span></font><br></a></pre></div>
</div></div>