<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Dec 9, 2016 at 2:10 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On Dec 9, 2016, at 1:50 PM, Derek Gaston <<a href="mailto:friedmud@gmail.com">friedmud@gmail.com</a>> wrote:<br>
><br>
> Oh man!  Sorry Barry!  I swear I looked around before I sent the email.  I should have checked the FAQ a little more closely!<br>
><br>
> I can understand the reasoning in the FAQ... but I still wonder if it might not be useful to provide all three options (Function, Jacobian, FunctionJacobian).  In my case I could fill in each one to do the right thing.  That way PETSc could call the "FunctionJacobian" one when it knew it needed both<br>
<br>
</span>   Derek,<br>
<br>
      The code literally never knows if it will need a Jacobian following the function evaluation, yes at the first function evaluation it will need the Jacobian unless the function norm is sufficiently small but after that it is only a question of probabilities (which it can't know) whether it will need the Jacobian.<br>
<span class=""><br>
> (by default that could just farm out to the individual calls).  But you guys have definitely thought a lot more about this than I have.<br>
><br>
> So, do you still recommend what's suggested in the FAQ?  Save off the Jacobian computation during the residual computation and then use that when SNES asks for a Jacobian?<br>
<br>
</span>   Yes, try it. I think you can get away with simply putting the new Jacobian matrix values into the same Jacobian matrix that is regularly used so there is no need to "stash the values" somewhere else and copy them over later.<br>
<br>
   I'd be interested in hearing how the performance works out, compute always or compute only when requested.</blockquote><div><br></div><div>Can anyone write down a simple model for a concrete algorithm where this is more efficient? I would like to see the high level reasoning.</div><div><br></div><div>  Thanks,</div><div><br></div><div>    Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888"><br>
  Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
>  In the case of automatic differentiation this could make a pretty huge difference in time...<br>
><br>
> Derek<br>
><br>
> On Fri, Dec 9, 2016 at 1:49 PM Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
>   Sorry the title in the FAQ is a bit tongue-in-check.<br>
><br>
>   <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html#functionjacobian" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/<wbr>documentation/faq.html#<wbr>functionjacobian</a><br>
><br>
><br>
> > On Dec 9, 2016, at 12:45 PM, Derek Gaston <<a href="mailto:friedmud@gmail.com">friedmud@gmail.com</a>> wrote:<br>
> ><br>
> > Is there a way to tell SNES to simultaneously compute both the residual and the Jacobian in one callback?<br>
> ><br>
> > My code can compute both simultaneously and it will be more efficient (think FE where you can reuse the shape-functions, variables, material properties, etc. for both residual and Jacobian computation).  In addition, I also have automatic differentiation as an option which _definitely_ computes both efficiently (and actually computes residuals, by themselves, much slower).<br>
> ><br>
> > I was thinking that I may just save off the Jacobian whenever the initial residual computation is asked for by SNES... and then just return that Jacobian when SNES asks for it.  This may be a bit dicey though as SNES can ask for residual computations at many different points during the solve.<br>
> ><br>
> > Thanks for any help!<br>
> ><br>
> > Derek<br>
><br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div>
</div></div>