On Sun, Nov 25, 2012 at 5:20 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
   Matt,<br>
<br>
     The use of DMSetFunction/Jacobian was deprecated many months ago when KSPDM, SNESDM, and TSDM were introduced but you seem to be merrily using it to build a complete DMSetLocalFunction() infrastructure?   I already gave Jed and Peter a serious tongue lashing for "providing backward compatible support for DMSetFunction()" and not completely stripping it out when they wrote the replacement, as the PETSc style guide requires they should have done.<br>

<br>
<br>
   Everyone,<br>
<br>
   But now what are we going to do? We need to support<br>
<br>
1) the usual "global" SNES/TS/KSP Set Function/Jacobian<br>
<br>
2) special DM specific function/Jacobian evaluations such as<br>
<br>
     a)  finite elment style SNES/TS/KSP Set Local (ghosted) Function/Jacobin<br>
<br>
      b) DA oriented set local function/Jacobian<br>
<br>
<br>
The KSPDM/SNESDM/TSDM model seems ok for managing 1)  but how do we plan to manage all the 2)?  </blockquote><div><br></div><div>DMDASNESSetFunctionLocal() and similar. To use those routines, you must "know about DM", thus there is no hardship in setting your callbacks on the DM.<br>
<br>Note that SNESSetFunction() trivially redirects into DMSNESSetFunction() so it is doing nothing more than hiding DM from users that are not interested in using it.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 The comments in the code<br>
<br>
  /* This context/destroy pair allows implementation-specific routines such as DMDA local functions. */<br>
  PetscErrorCode (*destroy)(KSPDM);<br>
  void *data;<br></blockquote><div><br></div><div>A duplicate routine should be here, but nobody has written DMDAKSPSetComputeOperators() so it wasn't being used.<br><br><a href="https://bitbucket.org/petsc/petsc-dev/changeset/026daea85c5c24fc64f04357af2f13afc6b23697">https://bitbucket.org/petsc/petsc-dev/changeset/026daea85c5c24fc64f04357af2f13afc6b23697</a><br>
</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
  /* This context/destroy pair allows implementation-specific routines such as DMDA local functions. */<br>
  PetscErrorCode (*destroy)(SNESDM);<br>
  PetscErrorCode (*duplicate)(SNESDM,DM);<br>
  void *data;<br>
<br>
  /* This context/destroy pair allows implementation-specific routines such as DMDA local functions. */<br>
  PetscErrorCode (*destroy)(TSDM);<br>
  void *data;<br></blockquote><div><br></div><div>Duplicate was needed here.</div><div><br><a href="https://bitbucket.org/petsc/petsc-dev/changeset/d5619197e506fdb0622ba24b0e3c26ddbee596aa">https://bitbucket.org/petsc/petsc-dev/changeset/d5619197e506fdb0622ba24b0e3c26ddbee596aa</a><br>
</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
seem to indicate someone has thought about his but how the f it is planned to be done is unclear (and why SNES requires a duplicate but KSP and TS do not?).  In particular what is the user interface would it be<br>
<br>
SNESDMDASetLocalFunction/Jacobian()?  or DMDASNESSetLocalFunction/Jacobian()?<br></blockquote><div><br></div><div>DMDASNESSetFunctionLocal(), it has been there since March.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
I am also bothered by the more fundamental question of what is the expected user interface when there exists both<br>
<br>
SNESSetFunction()   and DMSNESSetFunction()?<br>
<br>
Are users suppose to either of them or just SNESSetFunction()? If just SNESSetFunction() then why is the level of DMSNESSetFunction() just advanced and not developer.   Having both of these is a major recipe for complete confusion for both users and developers.<br>
</blockquote><div><br></div><div>My expectation is that 90% of users of DM will be able to use the impl-specific local routines like DMDASNESSetFunctionLocal(). For the few that need something more general (e.g., multiple communication phases in residual evaluation), they could use either. DMSNESSetFunction() is slightly more powerful than SNESSetFunction() because it can be set independent of the SNES, but I think that is rarely important.</div>
<div><br></div><div>SNESSetFunction() is purely cosmetic, allowing people to use SNES without needing to know about the DM concept. We can delete it if "more than one way to do it" is worse that "yet another object to interact with", but I'm doubtful.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Also all the half-assed legacy support crap that has gotten in there makes the code incredibly fragile and is harder to get rid of then it should be.<br>
<br>
We need to pick a single consistent extensible model now and change everything to match that model, the current code makes us look like a bunch of Trilinos developers.<br>
<span class=""><font color="#888888"><br>
   Barry<br></font></span></blockquote></div></div>