<div dir="ltr"><div>Made that change and otherwise cleaned the example up so it looks quite simple now: <br></div><div><a href="https://bitbucket.org/psanan/ts_generic_rollback_example/">https://bitbucket.org/psanan/ts_generic_rollback_example/</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Mo., 3. Juni 2019 um 19:52 Uhr schrieb Patrick Sanan <<a href="mailto:patrick.sanan@gmail.com">patrick.sanan@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Mo., 3. Juni 2019 um 19:12 Uhr schrieb Matthew Knepley <<a href="mailto:knepley@gmail.com" target="_blank">knepley@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">On Mon, Jun 3, 2019 at 12:32 PM Patrick Sanan via petsc-users <<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Thanks again for the pointers! Here's a quick and dirty experiment as a proof of concept of this,  for interest:<div><a href="https://bitbucket.org/psanan/ts_generic_rollback_example/src/master/" target="_blank">https://bitbucket.org/psanan/ts_generic_rollback_example/src/master/</a><br><div><br></div><div>This composes an extra "last step's state" vector with the TS object, overrides ts->ops->rollback, and uses a pre-step hook to keep it up to date.</div><div><br></div><div>This allows *any* TS implementation (which doesn't already support it) to use TSRollBack(), which I do in a post-step hook.</div></div></div></div></blockquote><div><br></div><div>This is cool. Why are you wrapping the Vec in a Container instead of passing it directly?</div></div></div></blockquote><div>No good reason - I was initially going to also include other data there but then realized I didn't need to. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Di., 28. Mai 2019 um 17:04 Uhr schrieb Zhang, Hong <<a href="mailto:hongzhang@anl.gov" target="_blank">hongzhang@anl.gov</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">You are right that TSEvent is not suitable for this case.  To stop the timestepper, I would call TSSetConvergedReason(ts,TS_CONVERGED_USER) in a PostStep function.<br>
<br>
Hong (Mr.)<br>
<br>
> On May 28, 2019, at 4:36 AM, Patrick Sanan via petsc-users <<a href="mailto:petsc-users@mcs.anl.gov" target="_blank">petsc-users@mcs.anl.gov</a>> wrote:<br>
> <br>
> I'm working with/on a code which uses TSSUNDIALS, and I'd like to be able to stop the timestepper based on the value of the solution. In particular, I wish to enforce that a given concentration has not changed by more than a specified amount before stopping. Note that this is simpler than general event detection, as I'm happy stopping before the condition is satisfied and don't care about finding the point in time when the condition is satisfied exactly.<br>
> <br>
> As far as I know, PETSc's event handling interface isn't supported with the SUNDIALS implementation. (As an aside, I'd be happier using TSARKIMEX or another native timestepper, but so far haven't been able to avoid tiny timesteps).<br>
> <br>
> My question is whether the following approach has any obvious fatal flaw, and if any TS gurus have other/better/simpler ideas.<br>
> <br>
> The idea is to add my own logic, say with TSSetPreStep(), to:<br>
> <br>
> 1. Maintain the previous step's state (this is a 1d problem, so I'm not too concerned about the overhead of this)<br>
> 2. Check my condition, and if it's satisfied, dump the previous step's data, and use TSSetMaxTime() with the previous step's time, thus ending the solve.<br>
> <br>
<br>
</blockquote></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_-4300784563273684910gmail-m_-4182094196198489850gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>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><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>
</blockquote></div></div>
</blockquote></div>