<div dir="ltr">Barry, appreciate your detailed answers. I will give it a try.<div><br></div><div>Best,</div><div><br></div><div>Ling</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 31, 2017 at 3:45 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"><br>
   PETSc doesn't use C++ exceptions. If a catastrophic unrecoverable error occurs each PETSc routine returns a nonzero error code. All the application can do in that case is end.<br>
<br>
  If a solver does not converge then PETSc does not use a nonzero error code, instead you obtain information from calls to SNESGetConvergedReason() (or KSPGetConvergedReason()) to determine if there was a convergence failure or not. If there was a lack of convergence PETSc solvers still remain in a valid state and there is no "cleanup" on the solver objects needed.<br>
<br>
   We have improved the PETSc handling of failed function evaluations, failed linear solvers etc in the past year so you MUST use the master branch of the PETSc repository and not the release version.<br>
<br>
   So your code can look like<br>
<br>
       SNESSolve()<br>
       SNESGetConvergedReason(snes,&<wbr>reason);<br>
       if (reason < 0) dt = .5*dt;<br>
       else no_converged = false;<br>
<br>
<br>
   Note that the PETSc TS time-stepping object already manages stuff like this as well as providing local error estimate controls so it is better to use the PETSc TS rather than using SNES and having to manage all the time-stepping yourself.<br>
<br>
   Barry<br>
<span class=""><br>
> On Mar 31, 2017, at 10:28 AM, Zou, Ling <<a href="mailto:ling.zou@inl.gov">ling.zou@inl.gov</a>> wrote:<br>
><br>
> Hi All,<br>
><br>
> I have done some researching in the PETSc email archive, but did not find a decent way to do it. Assume that, during a SNESSolve, something unphysical happening and a C++ exception is send,  and now I want to stop the SNESSolve and let it try a smaller time step.<br>
> Here are some pseudo code I have:<br>
><br>
> while(no_converged)<br>
> {<br>
>   try<br>
>   {<br>
>     SNESSolve(...);<br>
>     if (SNESSolve converged)<br>
>       no_converged = false;<br>
>   }<br>
>   catch(int err)<br>
>   {<br>
>     /* do some clean work here? */<br>
>     dt = 0.5 * dt;<br>
>   }<br>
> }<br>
><br>
> It seems to me that it is not a good way to do, as if an exception is thrown during SNESSolve, the code go to the error catching, changing time step, and immediately do SNESSolve again. I would expect that there should be some clean work needed before another SNESSolve call, as I commented in the code.<br>
><br>
> I found two related email threads:<br>
</span>> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.mcs.anl.gov_pipermail_petsc-2Dusers_2014-2DAugust_022597.html&d=DwIFAg&c=54IZrppPQZKX9mLzcGdPfFD1hxrcB__aEkJFOKJFd00&r=kuHHom1yjd94zUrBWecnYg&m=lP2oXFkw7mIXP8jrBmP9ibf6v7wu51fnRj9VeYDYS3k&s=RRKX6UIqdBWee88UeOAUNO8MHg6ULljCgZkCaTqCZCQ&e=" rel="noreferrer" target="_blank">https://urldefense.proofpoint.<wbr>com/v2/url?u=http-3A__lists.<wbr>mcs.anl.gov_pipermail_petsc-<wbr>2Dusers_2014-2DAugust_022597.<wbr>html&d=DwIFAg&c=<wbr>54IZrppPQZKX9mLzcGdPfFD1hxrcB_<wbr>_aEkJFOKJFd00&r=<wbr>kuHHom1yjd94zUrBWecnYg&m=<wbr>lP2oXFkw7mIXP8jrBmP9ibf6v7wu51<wbr>fnRj9VeYDYS3k&s=<wbr>RRKX6UIqdBWee88UeOAUNO8MHg6ULl<wbr>jCgZkCaTqCZCQ&e=</a><br>
> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.mcs.anl.gov_pipermail_petsc-2Dusers_2015-2DFebruary_024367.html&d=DwIFAg&c=54IZrppPQZKX9mLzcGdPfFD1hxrcB__aEkJFOKJFd00&r=kuHHom1yjd94zUrBWecnYg&m=lP2oXFkw7mIXP8jrBmP9ibf6v7wu51fnRj9VeYDYS3k&s=h1wm-wFX_C4uzDG0aa6uA7w1jAlnJmKUMvDNneULt4I&e=" rel="noreferrer" target="_blank">https://urldefense.proofpoint.<wbr>com/v2/url?u=http-3A__lists.<wbr>mcs.anl.gov_pipermail_petsc-<wbr>2Dusers_2015-2DFebruary_<wbr>024367.html&d=DwIFAg&c=<wbr>54IZrppPQZKX9mLzcGdPfFD1hxrcB_<wbr>_aEkJFOKJFd00&r=<wbr>kuHHom1yjd94zUrBWecnYg&m=<wbr>lP2oXFkw7mIXP8jrBmP9ibf6v7wu51<wbr>fnRj9VeYDYS3k&s=h1wm-wFX_<wbr>C4uzDG0aa6uA7w1jAlnJmKUMvDNneU<wbr>Lt4I&e=</a><br>
<div class="HOEnZb"><div class="h5">><br>
> But I don't see a clear answer there.<br>
> Any comments on this issue?<br>
><br>
> Best,<br>
><br>
> Ling<br>
<br>
</div></div></blockquote></div><br></div>