> On Jan 26, 2018, at 2:15 PM, Kong, Fande <[email protected]> wrote:
>
>
>
> On Mon, Jan 8, 2018 at 2:15 PM, Smith, Barry F. <[email protected]> wrote:
>
>
> > On Jan 8, 2018, at 2:59 PM, Alexander Lindsay <[email protected]>
> > wrote:
> >
> > Is there any elegant way to tell whether SNESComputeFunction is being
> > called under different conceptual contexts?
> >
> > E.g. non-linear residual evaluation vs. Jacobian formation from finite
> > differencing vs. Jacobian-vector products from finite differencing?
>
> Under normal usage with the options database no.
>
> Hi Barry,
>
> How difficult to provide an API? Is it possible?
>
>
>
> If you have some reason to know you could write three functions and provide
> them to SNESSetFunction(), MatMFFDSetFunction(), and
> MatFDColoringSetFunction(). Note that these functions have slightly different
> calling sequences but you can have all of them call the same underlying
> common function if you are only interested in, for example, how many times
> the function is used for each purpose.
>
> If we use this way for the Jacobian-free Newton, the function evaluation will
> be called twice at the first linear iteration because the computed residual
> vector at the nonlinear step is not reused. Any way to reuse the function
> residual of the Newton step instead of recomputing a new residual at the
> first linear iteration?
It does reuse the function evaluation. Why do you think it does not? If you
look at MatMult_MFFD() you will see the lines of code
/* compute func(U) as base for differencing; only needed first time in and
not when provided by user */
if (ctx->ncurrenth == 1 && ctx->current_f_allocated) {
ierr = (*ctx->func)(ctx->funcctx,U,F);CHKERRQ(ierr);
}
since the if is satisfied it does not compute the function at the base
location. To double check I ran src/snes/examples/tutorials/ex19 with -snes_mf
in the debugger and verified that the "extra" function evaluations are not done.
Barry
>
> Fande,
>
>
>
> Barry
>
>
>
> >
> > Alex
>
>