this is regarding ts->total_steps. What is the actual purpose of it?

You claim it is a unique identifier, but actually TSAdjointStep decrements
it.
We should come to an agreement on it, as it is used to monitoring a TSSolve
call, and to save the trajectory, as per commit

https://bitbucket.org/petsc/petsc/commits/938c94ca59bdacf9e5030aef0fd03ca8c4ad6971

Right now, if we do
TSSolve() // with number of steps n_steps_1
TSSolve() // with number of steps n_steps_2

the output of a monitor will be
0 ...
..
n_steps_1
// here starts the monitoring of the second solve
n_steps_1
....

n_steps_1 + n_steps_2

Instead, if we do
TSSolve()
TSAdjointSolve()
TSSolve()

the output will be

0 ...
..
n_steps_1
// here starts the monitoring of the adjoint solve
n_steps_1
...
0
// here starts the monitoring of the second solve
0
....

n_steps_1
Why not using ts->steps instead of ts->total_steps in TSMonitor and
TSSetTrajectory? We should be really careful when modifying  interface code.


2017-07-26 13:11 GMT+03:00 Stefano Zampini <stefano.zamp...@gmail.com>:

>
>
> 2017-07-25 22:45 GMT+03:00 Zhang, Hong <hongzh...@anl.gov>:
>
>>
>>
>> >
>> > Actually, it is not usable: take for example TSTrajectoryGet() with a
>> given step number: then, if I want to use BASIC it will always return the
>> last step recorded from the previous TSSolve (this behavior is common to
>> all the TSTrajectory implementantions)
>>
>> This is not the expected behavior. Can you provide more details on how
>> you used TSTrajectoryGet()? How did you know it is the last step recorded
>> from the previous TSSolve?
>>
>>
> Hong,
>
> it's clear from the code, since in every implementation of
> TSTrajectoryGet_XXX TSGetTotalSteps is overwriting the stepnumber passed in
> by the user
> A patch is attached, that removes this extra call. Could you please check
> that the patch does not break the adjoint examples?
> The patch should be fine, since TSTrajectoryGet is just used in
> TSAdjointSolve and it is always called using ts->total_steps as stepnum.
>
> [szampini@localhost petsc]$ git grep "TSTrajectoryGet("
> include/petscts.h:PETSC_EXTERN PetscErrorCode TSTrajectoryGet(TSTrajectory,
> TS,PetscInt,PetscReal*);
> src/ts/interface/ts.c:    ierr = TSTrajectoryGet(ts->
> trajectory,ts,ts->total_steps,&ts->ptime);CHKERRQ(ierr);
> src/ts/interface/ts.c:  ierr = TSTrajectoryGet(ts->
> trajectory,ts,ts->total_steps,&ts->ptime);CHKERRQ(ierr);
> src/ts/trajectory/interface/traj.c:PetscErrorCode
> TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
>
>
>>
>> total_steps is automatically incremented in TSSolve(), which serves as a
>> unique identifier for a time step. TSTrajectory is marked as 'developer
>> level'. The implementation is quite tricky. I am willing to help if you
>> have some specific needs.
>>
>>
> The continuous adjoint code that I have uses two different TS solvers, one
> for forward, one for backward. To compute the gradient, I need to inquire
> the trajectory of the forward solver in a post step routine and compute the
> gradient. Inquiring the trajectory by the time argument and not only by the
> stepnum would be the best, so that one can (in principle) use adaptive time
> stepping in both solvers, without worrying about the matching time steps.
> For this, it would be great if we can have a TSTrajectory that computes on
> the fly if the requested time is not present in the recorded history.
> For now, I can write my own map from forward time to forward step number
> and inquire the trajectory just with the step number.
>
>
>
>> Thanks,
>> Hong (Mr.)
>>
>> >
>> > I would really like to reuse TSTrajectory for a continuous adjoint
>> problem I'm currently working on, and I believe this class should be
>> somewhat refactored. Here are a couple of examples from the public API
>> >
>> > PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt
>> stepnum,PetscReal *time)
>> > {
>> >   PetscErrorCode ierr;
>> >
>> >   PetscFunctionBegin;
>> >   if (!tj) 
>> > SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS
>> solver did not save trajectory");
>> >
>> > ....
>> >
>> > PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt
>> stepnum,PetscReal time,Vec X)
>> > {
>> >   PetscErrorCode ierr;
>> >
>> >   PetscFunctionBegin;
>> >   if (!tj) PetscFunctionReturn(0);
>> >
>> > We can use this thread to start a discussion on how it can be
>> refactored, and I'm willing to contribute.
>> >
>> > I personally believe TSTrajectory should not be exposed in the public
>> API (at least put in the private headers) in the upcoming release.
>> >
>> > Thanks,
>> > --
>> > Stefano
>>
>>
>
>
> --
> Stefano
>



-- 
Stefano

Reply via email to