<p dir="ltr">Okay, I'll fix this with SNESCheckFunctionNorm() in both VI solvers in maint.</p>
<br><div class="gmail_quote"><div dir="ltr">On Wed, Oct 7, 2015, 17:23 Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
> On Oct 7, 2015, at 6:01 PM, Dmitry Karpeyev <<a href="mailto:karpeev@mcs.anl.gov" target="_blank">karpeev@mcs.anl.gov</a>> wrote:<br>
><br>
> Well, there is a RELAP7 (MOOSE-based code) that encounters that problem:<br>
> the equation of state returns a NaN that gets handled correctly (retried with a<br>
> smaller timestep), but once we turn on -snes_vi_monitor, "Cannot get here"<br>
> is thrown.<br>
<br>
   Yeah that is bad.<br>
<br>
> Apparently, the monitor is called before divergence is declared.<br>
><br>
> I don't think it's meaningless crap: it can tell the user how many NaNs there are,<br>
> which can give them an idea of how many mesh points stay into the nonphysical<br>
> regime.  If not there, it should be counted somewhere.  In any event, the code<br>
> shouldn't die with a PLIB error in this case.  How should we handle it?<br>
<br>
  I understand your point about providing useful information but I am afraid you are opening up a can of worms by wanting the to call the monitor function in this failed case. In all the other SNESSolve implementations    SNESCheckFunctionNorm(snes,fnorm); is called BEFORE anything else is done (monitor or converged test etc) so the monitor is not called on the "bad last iteration". It is just bad luck that in updating the code we forgot to put the SNESCheckFunctionNorm() into the vi solvers; it is missing in both SNESSolve_VINEWTONSSLS and SNESSolve_VINEWTONRSLS<br>
<br>
   The correct fix is to add the SNESCheckFunctionNorm() this will prevent the current crash and should go into maint. It should go immediately after the call to    ierr  = SNESLineSearchGetNorms(snes->linesearch, &xnorm, &gnorm, &ynorm);CHKERRQ(ierr); in both routines.<br>
<br>
  The "counting" of nonphysical points etc should not be handled by the VI monitor. It could be handled by SNESComputeFunction() perhaps.<br>
<br>
<br>
  Barry<br>
<br>
><br>
> On Wed, Oct 7, 2015 at 4:58 PM Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
> > On Oct 7, 2015, at 5:48 PM, Dmitry Karpeyev <<a href="mailto:karpeev@mcs.anl.gov" target="_blank">karpeev@mcs.anl.gov</a>> wrote:<br>
> ><br>
> > Now that we allow NaNs bubble up through the solver,<br>
> > this can trip mysterious-looking errors in SNESVI:<br>
> > PETSC_ERR_PLIB, "Can never get here"<br>
> > is thrown from SNESMonitorVI(), because a NaN in<br>
> > the residual can defeat all of the seemingly-exhaustive<br>
> > if-then-else branches counting the number of active constraints.<br>
><br>
>   Shouldn't the SNESSolver already returned as "failed" before it ever gets to SNESMonitorVI in this case? Since the vector was marked with some Nan's it means that something has gone wrong already and any data in there is meaningless crap? Why count meaningless crap?<br>
> ><br>
> > I think the fix should be to count the number of NaNs separately<br>
> > and report them alongside the legitimate active bounds to give<br>
> > the user as much useful information as possible.  Since this entails<br>
> > a substantial difference to the output format of -snes_vi_monitor,<br>
> > should the fix go to maint or master?<br>
><br>
>   Not maint.<br>
><br>
> ><br>
> > Dmitry.<br>
><br>
<br>
</blockquote></div>