[petsc-users] TSSetPostStep for projected methods

Matthew Knepley knepley at gmail.com
Mon Feb 13 07:03:40 CST 2017


On Sun, Feb 12, 2017 at 3:21 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
> > On Feb 12, 2017, at 11:30 AM, Gideon Simpson <gideon.simpson at gmail.com>
> wrote:
> >
> > I’ve begun working on implementing a projected time stepping method for
> solving y’ = f(y), where g(y(t)) is an invariant of the flow.  Per a
> previous email exchange, it was suggested that I use TSSetPostStep to
> perform the projection routine, calling TSGetSolution obtain the current
> iterate, which will be corrected with the projection.  However, I noticed
> two things:
> >
> > 1.  The documentation for TSGetSolution says "This vector not changed
> until the solution at the next timestep has been calculated.”  Does that
> mean that if I make a change to the solution in a PostStep function, it
> won’t be captured until the next step?
>
>    No.
>
> >  What happens at the final time step?
>
>    Your function should still get called.
>
> >
> > 2.  The projection is nonlinear, requiring the use of a SNES.  I had
> originally thought that I would create/configure/destroy the SNES within
> the main routine of the code, and pass this to the PostStep through a user
> data structure.  However, the TSSetPostStep function seems to only take
> functions which are exclusively functions of the TS.  Likewise, I would
> need to create a residual vector, r, for the SNESSetFunction.  Is there a
> way to pass these data structures, so that they can be reused. or would
> they have to be created/destroyed within the PostStep function at each
> iterate?  How costly would that be?
>
>    After you create the SNES and the TS call PetscObjectCompose() to
> attach the SNES to the TS then inside your post-step you can use
> PetscObjectQuery() or if you want to pass in more than a SNES use
> PetscContainerCreate().
>

An alternative to what Barry suggests, which will definitely work, is to
use the DM.

  DMCreateShell(comm, &dm);
  DMSetApplicationContext(dm, ctx);
  TSSetDM(ts, dm);

In your function

  TSGetDM(ts, &dm);
  DMGetApplicationContext(dm, &ctx);

I prefer this to the Container route.

  Thanks,

     Matt


> >
> >
> > -gideon
> >
>
>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20170213/8c427b5c/attachment.html>


More information about the petsc-users mailing list