[petsc-users] TSSetPostStep for projected methods

Barry Smith bsmith at mcs.anl.gov
Sun Feb 12 15:21:15 CST 2017


> 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().

> 
> 
> -gideon
> 



More information about the petsc-users mailing list