xref: /petsc/src/ts/trajectory/interface/traj.c (revision 1cc06b555e92f8ec64db10330b8bbd830e5bc876)
1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h"  I*/
2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h>
3fe8322adSStefano Zampini #include <petscdm.h>
4bc952696SBarry Smith 
5bc952696SBarry Smith PetscFunctionList TSTrajectoryList              = NULL;
6bc952696SBarry Smith PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
7bc952696SBarry Smith PetscClassId      TSTRAJECTORY_CLASSID;
82bf6d308SHong Zhang PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp;
9bc952696SBarry Smith 
10bc952696SBarry Smith /*@C
11bcf0153eSBarry Smith   TSTrajectoryRegister - Adds a way of storing trajectories to the `TS` package
12bc952696SBarry Smith 
13bc952696SBarry Smith   Not Collective
14bc952696SBarry Smith 
15bc952696SBarry Smith   Input Parameters:
162fe279fdSBarry Smith + sname        - the name of a new user-defined creation routine
172fe279fdSBarry Smith - function - the creation routine itself
18bc952696SBarry Smith 
19df5474d8SHong Zhang   Level: developer
20bc952696SBarry Smith 
21bcf0153eSBarry Smith   Note:
22bcf0153eSBarry Smith   `TSTrajectoryRegister()` may be called multiple times to add several user-defined tses.
23bcf0153eSBarry Smith 
24*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryRegisterAll()`
25bc952696SBarry Smith @*/
26d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS))
27d71ae5a4SJacob Faibussowitsch {
28bc952696SBarry Smith   PetscFunctionBegin;
299566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function));
303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
31bc952696SBarry Smith }
32bc952696SBarry Smith 
33fe8322adSStefano Zampini /*@
34fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
35fe8322adSStefano Zampini 
36c3339decSBarry Smith   Collective
37fe8322adSStefano Zampini 
38fe8322adSStefano Zampini   Input Parameters:
39fe8322adSStefano Zampini + tj      - the trajectory object
40fe8322adSStefano Zampini . ts      - the time stepper object (optional)
41fe8322adSStefano Zampini . stepnum - the step number
42fe8322adSStefano Zampini . time    - the current time
43fe8322adSStefano Zampini - X       - the current solution
44fe8322adSStefano Zampini 
45fe8322adSStefano Zampini   Level: developer
46fe8322adSStefano Zampini 
47bcf0153eSBarry Smith   Note:
48bcf0153eSBarry Smith   Usually one does not call this routine, it is called automatically during `TSSolve()`
49fe8322adSStefano Zampini 
50*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()`
51fe8322adSStefano Zampini @*/
52d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
53d71ae5a4SJacob Faibussowitsch {
54bc952696SBarry Smith   PetscFunctionBegin;
553ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
56fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
57fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
58fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
59fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 4);
60fe8322adSStefano Zampini   PetscValidHeaderSpecific(X, VEC_CLASSID, 5);
613c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
6248a46eb9SPierre Jolivet   if (tj->monitor) PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n", stepnum, (double)time, (PetscInt)!tj->solution_only));
639566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0));
64dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, set, ts, stepnum, time, X);
659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0));
661baa6e33SBarry Smith   if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time));
67fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
69bc952696SBarry Smith }
70bc952696SBarry Smith 
71fe8322adSStefano Zampini /*@
72bcf0153eSBarry Smith   TSTrajectoryGetNumSteps - Return the number of steps registered in the `TSTrajectory` via `TSTrajectorySet()`.
73fe8322adSStefano Zampini 
7420f4b53cSBarry Smith   Not Collective.
75fe8322adSStefano Zampini 
762fe279fdSBarry Smith   Input Parameter:
77fe8322adSStefano Zampini . tj - the trajectory object
78fe8322adSStefano Zampini 
79fe8322adSStefano Zampini   Output Parameter:
80fe8322adSStefano Zampini . steps - the number of steps
81fe8322adSStefano Zampini 
82fe8322adSStefano Zampini   Level: developer
83fe8322adSStefano Zampini 
84*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectorySet()`
85fe8322adSStefano Zampini @*/
86d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
87d71ae5a4SJacob Faibussowitsch {
88fe8322adSStefano Zampini   PetscFunctionBegin;
89fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
90fe8322adSStefano Zampini   PetscValidIntPointer(steps, 2);
919566063dSJacob Faibussowitsch   PetscCall(TSHistoryGetNumSteps(tj->tsh, steps));
923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
93fe8322adSStefano Zampini }
94fe8322adSStefano Zampini 
95fe8322adSStefano Zampini /*@
96bcf0153eSBarry Smith   TSTrajectoryGet - Updates the solution vector of a time stepper object by querying the `TSTrajectory`
97fe8322adSStefano Zampini 
98c3339decSBarry Smith   Collective
99fe8322adSStefano Zampini 
100fe8322adSStefano Zampini   Input Parameters:
101fe8322adSStefano Zampini + tj      - the trajectory object
102fe8322adSStefano Zampini . ts      - the time stepper object
103fe8322adSStefano Zampini - stepnum - the step number
104fe8322adSStefano Zampini 
105fe8322adSStefano Zampini   Output Parameter:
106fe8322adSStefano Zampini . time    - the time associated with the step number
107fe8322adSStefano Zampini 
108fe8322adSStefano Zampini   Level: developer
109fe8322adSStefano Zampini 
110bcf0153eSBarry Smith   Note:
111bcf0153eSBarry Smith   Usually one does not call this routine, it is called automatically during `TSSolve()`
112fe8322adSStefano Zampini 
113*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSSolve()`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
114fe8322adSStefano Zampini @*/
115d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time)
116d71ae5a4SJacob Faibussowitsch {
117bc952696SBarry Smith   PetscFunctionBegin;
1183c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
119fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
120fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
121fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
122dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
1233c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1243c633725SBarry Smith   PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number");
125fe8322adSStefano Zampini   if (tj->monitor) {
12663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only));
1279566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
128fe8322adSStefano Zampini   }
1299566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0));
130dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, get, ts, stepnum, time);
1319566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0));
1323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
133bc952696SBarry Smith }
134bc952696SBarry Smith 
135fe8322adSStefano Zampini /*@
136bcf0153eSBarry Smith   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the `TSTrajectory` and, possibly, from the `TS`
137fe8322adSStefano Zampini 
138c3339decSBarry Smith   Collective
139fe8322adSStefano Zampini 
140fe8322adSStefano Zampini   Input Parameters:
141fe8322adSStefano Zampini + tj      - the trajectory object
142fe8322adSStefano Zampini . ts      - the time stepper object (optional)
143fe8322adSStefano Zampini - stepnum - the requested step number
144fe8322adSStefano Zampini 
145fe8322adSStefano Zampini   Output Parameters:
146bcf0153eSBarry Smith + time - On input time for the step if step number is `PETSC_DECIDE`, on output the time associated with the step number
1472fe279fdSBarry Smith . U    - state vector (can be `NULL`)
1482fe279fdSBarry Smith - Udot - time derivative of state vector (can be `NULL`)
149fe8322adSStefano Zampini 
150fe8322adSStefano Zampini   Level: developer
151fe8322adSStefano Zampini 
152bcf0153eSBarry Smith   Notes:
153bcf0153eSBarry Smith   If the step number is `PETSC_DECIDE`, the time argument is used to inquire the trajectory.
154fe8322adSStefano Zampini   If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
155fe8322adSStefano Zampini 
156*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
157fe8322adSStefano Zampini @*/
158d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot)
159d71ae5a4SJacob Faibussowitsch {
160fe8322adSStefano Zampini   PetscFunctionBegin;
1613c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
162fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
163fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
164fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
165dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
166fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5);
167fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6);
1683ba16761SJacob Faibussowitsch   if (!U && !Udot) PetscFunctionReturn(PETSC_SUCCESS);
1693c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1709566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0));
171fe8322adSStefano Zampini   if (tj->monitor) {
172fe8322adSStefano Zampini     PetscInt pU, pUdot;
173fe8322adSStefano Zampini     pU    = U ? 1 : 0;
174fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
17563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time));
1769566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
177fe8322adSStefano Zampini   }
178fe8322adSStefano Zampini   if (U && tj->lag.caching) {
179fe8322adSStefano Zampini     PetscObjectId    id;
180fe8322adSStefano Zampini     PetscObjectState state;
181fe8322adSStefano Zampini 
1829566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &state));
1839566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &id));
184fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
185fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
186fe8322adSStefano Zampini     } else {
187fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
188fe8322adSStefano Zampini     }
189fe8322adSStefano Zampini     if (tj->monitor && !U) {
1909566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1919566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n"));
1929566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1939566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
194fe8322adSStefano Zampini     }
195fe8322adSStefano Zampini   }
196fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
197fe8322adSStefano Zampini     PetscObjectId    id;
198fe8322adSStefano Zampini     PetscObjectState state;
199fe8322adSStefano Zampini 
2009566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot, &state));
2019566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot, &id));
202fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
203fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
204fe8322adSStefano Zampini     } else {
205fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
206fe8322adSStefano Zampini     }
207fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2089566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2099566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n"));
2109566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2119566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
212fe8322adSStefano Zampini     }
213fe8322adSStefano Zampini   }
214fe8322adSStefano Zampini   if (!U && !Udot) {
2159566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2163ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
217fe8322adSStefano Zampini   }
218fe8322adSStefano Zampini 
219fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2201baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
221fe8322adSStefano Zampini     /* cached states will be updated in the function */
2229566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot));
223fe8322adSStefano Zampini     if (tj->monitor) {
2249566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2259566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
226fe8322adSStefano Zampini     }
227fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
228fe8322adSStefano Zampini     TS  fakets = ts;
229fe8322adSStefano Zampini     Vec U2;
230fe8322adSStefano Zampini 
231fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
232fe8322adSStefano Zampini     if (!ts) {
2339566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets));
234fe8322adSStefano Zampini       if (!fakets) {
2359566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets));
2369566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets));
2379566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2389566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U, &U2));
2399566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets, U2));
2409566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
241fe8322adSStefano Zampini       }
242fe8322adSStefano Zampini     }
2439566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time));
2449566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets, &U2));
2459566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2, U));
2469566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state));
2479566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id));
248fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
249fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
250fe8322adSStefano Zampini   }
2519566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
253fe8322adSStefano Zampini }
254fe8322adSStefano Zampini 
255bc952696SBarry Smith /*@C
256bcf0153eSBarry Smith    TSTrajectoryViewFromOptions - View a `TSTrajectory` based on values in the options database
257fe2efc57SMark 
258c3339decSBarry Smith    Collective
259fe2efc57SMark 
260fe2efc57SMark    Input Parameters:
261bcf0153eSBarry Smith +  A - the `TSTrajectory` context
262bcf0153eSBarry Smith .  obj - Optional object that provides prefix used for option name
263736c3998SJose E. Roman -  name - command line option
264fe2efc57SMark 
265fe2efc57SMark    Level: intermediate
266bcf0153eSBarry Smith 
267*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
268fe2efc57SMark @*/
269d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[])
270d71ae5a4SJacob Faibussowitsch {
271fe2efc57SMark   PetscFunctionBegin;
272fe2efc57SMark   PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1);
2739566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
2743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
275fe2efc57SMark }
276fe2efc57SMark 
277fe2efc57SMark /*@C
278bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
279bc952696SBarry Smith 
280c3339decSBarry Smith     Collective
281bc952696SBarry Smith 
282bc952696SBarry Smith     Input Parameters:
283bcf0153eSBarry Smith +   tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
284bc952696SBarry Smith -   viewer - visualization context
285bc952696SBarry Smith 
286bc952696SBarry Smith     Options Database Key:
287bcf0153eSBarry Smith .   -ts_trajectory_view - calls `TSTrajectoryView()` at end of `TSAdjointStep()`
288bcf0153eSBarry Smith 
289bcf0153eSBarry Smith     Level: developer
290bc952696SBarry Smith 
291bc952696SBarry Smith     Notes:
292bc952696SBarry Smith     The available visualization contexts include
293bcf0153eSBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
294bcf0153eSBarry Smith -     `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
295bc952696SBarry Smith          output where only the first processor opens
296bc952696SBarry Smith          the file.  All other processors send their
297bc952696SBarry Smith          data to the first processor to print.
298bc952696SBarry Smith 
299bc952696SBarry Smith     The user can open an alternative visualization context with
300bcf0153eSBarry Smith     `PetscViewerASCIIOpen()` - output to a specified file.
301bc952696SBarry Smith 
302*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `PetscViewer`, `PetscViewerASCIIOpen()`
303bc952696SBarry Smith @*/
304d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer)
305d71ae5a4SJacob Faibussowitsch {
306bc952696SBarry Smith   PetscBool iascii;
307bc952696SBarry Smith 
308bc952696SBarry Smith   PetscFunctionBegin;
3091a5a771fSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
31048a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer));
311bc952696SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
312b1d74d50SHong Zhang   PetscCheckSameComm(tj, 1, viewer, 2);
313bc952696SBarry Smith 
3149566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
315bc952696SBarry Smith   if (iascii) {
3169566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer));
31763a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps));
31863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads));
31963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites));
3209566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
321dbbe0bcdSBarry Smith     PetscTryTypeMethod(tj, view, viewer);
3229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
323bc952696SBarry Smith   }
3243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
325bc952696SBarry Smith }
326bc952696SBarry Smith 
327bc952696SBarry Smith /*@C
32878fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
32978fbdcc8SBarry Smith 
330c3339decSBarry Smith    Collective
33178fbdcc8SBarry Smith 
33278fbdcc8SBarry Smith    Input Parameters:
33378fbdcc8SBarry Smith +  tr - the trajectory context
33478fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
33578fbdcc8SBarry Smith 
33678fbdcc8SBarry Smith    Level: intermediate
33778fbdcc8SBarry Smith 
338bcf0153eSBarry Smith    Fortran Note:
339bcf0153eSBarry Smith    Fortran interface is not possible because of the string array argument
340db901c5bSHong Zhang 
341*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSGetTrajectory()`
34278fbdcc8SBarry Smith @*/
343d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names)
344d71ae5a4SJacob Faibussowitsch {
34578fbdcc8SBarry Smith   PetscFunctionBegin;
346fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1);
347fe8322adSStefano Zampini   PetscValidPointer(names, 2);
3489566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3499566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names, &ctx->names));
3503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
35178fbdcc8SBarry Smith }
35278fbdcc8SBarry Smith 
35378fbdcc8SBarry Smith /*@C
354fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35508347785SBarry Smith 
356c3339decSBarry Smith    Collective
35708347785SBarry Smith 
35808347785SBarry Smith    Input Parameters:
359bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
36008347785SBarry Smith .  transform - the transform function
36108347785SBarry Smith .  destroy - function to destroy the optional context
36208347785SBarry Smith -  ctx - optional context used by transform function
36308347785SBarry Smith 
36408347785SBarry Smith    Level: intermediate
36508347785SBarry Smith 
366*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
36708347785SBarry Smith @*/
368d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx)
369d71ae5a4SJacob Faibussowitsch {
37008347785SBarry Smith   PetscFunctionBegin;
371fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
37208347785SBarry Smith   tj->transform        = transform;
37308347785SBarry Smith   tj->transformdestroy = destroy;
37408347785SBarry Smith   tj->transformctx     = tctx;
3753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
37608347785SBarry Smith }
37708347785SBarry Smith 
378db901c5bSHong Zhang /*@
379bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
380bc952696SBarry Smith 
381d083f849SBarry Smith   Collective
382bc952696SBarry Smith 
383bc952696SBarry Smith   Input Parameter:
3843c0fce88SHong Zhang . comm - the communicator
385bc952696SBarry Smith 
386bc952696SBarry Smith   Output Parameter:
3873c0fce88SHong Zhang . tj   - the trajectory object
388bc952696SBarry Smith 
389df5474d8SHong Zhang   Level: developer
390bc952696SBarry Smith 
39195452b02SPatrick Sanan   Notes:
392bcf0153eSBarry Smith     Usually one does not call this routine, it is called automatically when one calls `TSSetSaveTrajectory()`.
393bc952696SBarry Smith 
394*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
395bc952696SBarry Smith @*/
396d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj)
397d71ae5a4SJacob Faibussowitsch {
398bc952696SBarry Smith   TSTrajectory t;
399bc952696SBarry Smith 
400bc952696SBarry Smith   PetscFunctionBegin;
401b1d74d50SHong Zhang   PetscValidPointer(tj, 2);
402b1d74d50SHong Zhang   *tj = NULL;
4039566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
404bc952696SBarry Smith 
4059566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
40668bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4079566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm, &t->tsh));
408fe8322adSStefano Zampini 
409fe8322adSStefano Zampini   t->lag.order            = 1;
410fe8322adSStefano Zampini   t->lag.L                = NULL;
411fe8322adSStefano Zampini   t->lag.T                = NULL;
412fe8322adSStefano Zampini   t->lag.W                = NULL;
413fe8322adSStefano Zampini   t->lag.WW               = NULL;
414fe8322adSStefano Zampini   t->lag.TW               = NULL;
415fe8322adSStefano Zampini   t->lag.TT               = NULL;
416fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
417fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
418fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
419fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
420fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
421fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
422fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
423fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
424fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
425fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
426fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
427fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
428ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
429b1d74d50SHong Zhang   *tj                     = t;
43063a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
4313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
432bc952696SBarry Smith }
433bc952696SBarry Smith 
434bc952696SBarry Smith /*@C
435bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
436bc952696SBarry Smith 
437c3339decSBarry Smith   Collective
438bc952696SBarry Smith 
439bc952696SBarry Smith   Input Parameters:
440bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
441bcf0153eSBarry Smith . ts   - the `TS` context
4423c0fce88SHong Zhang - type - a known method
443bc952696SBarry Smith 
444bcf0153eSBarry Smith   Options Database Key:
445e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
446bc952696SBarry Smith 
447df5474d8SHong Zhang    Level: developer
448bc952696SBarry Smith 
449bcf0153eSBarry Smith   Developer Note:
450bcf0153eSBarry Smith   Why does this option require access to the `TS`
451bc952696SBarry Smith 
452*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
453bc952696SBarry Smith @*/
454d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type)
455d71ae5a4SJacob Faibussowitsch {
456972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory, TS);
457bc952696SBarry Smith   PetscBool match;
458bc952696SBarry Smith 
459bc952696SBarry Smith   PetscFunctionBegin;
460972caf09SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4619566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
4623ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
463bc952696SBarry Smith 
4649566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4653c633725SBarry Smith   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
466972caf09SHong Zhang   if (tj->ops->destroy) {
4679566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
468bc952696SBarry Smith 
469972caf09SHong Zhang     tj->ops->destroy = NULL;
470bc952696SBarry Smith   }
4719566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
472bc952696SBarry Smith 
4739566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4749566063dSJacob Faibussowitsch   PetscCall((*r)(tj, ts));
4753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
476bc952696SBarry Smith }
477bc952696SBarry Smith 
478881c1a9bSHong Zhang /*@C
479881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
480881c1a9bSHong Zhang 
481c3339decSBarry Smith   Collective
482881c1a9bSHong Zhang 
483881c1a9bSHong Zhang   Input Parameters:
484bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
485bcf0153eSBarry Smith - ts   - the `TS` context
486881c1a9bSHong Zhang 
4872fe279fdSBarry Smith   Output Parameter:
488881c1a9bSHong Zhang . type - a known method
489881c1a9bSHong Zhang 
490881c1a9bSHong Zhang   Level: developer
491881c1a9bSHong Zhang 
492*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
493881c1a9bSHong Zhang @*/
494d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type)
495d71ae5a4SJacob Faibussowitsch {
496881c1a9bSHong Zhang   PetscFunctionBegin;
497881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
498881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
4993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
500881c1a9bSHong Zhang }
501881c1a9bSHong Zhang 
502972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
503972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
5049a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
5052b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
506bc952696SBarry Smith 
507bc952696SBarry Smith /*@C
508bcf0153eSBarry Smith   TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package.
509bc952696SBarry Smith 
510bc952696SBarry Smith   Not Collective
511bc952696SBarry Smith 
512df5474d8SHong Zhang   Level: developer
513bc952696SBarry Smith 
514*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()`
515bc952696SBarry Smith @*/
516d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void)
517d71ae5a4SJacob Faibussowitsch {
518bc952696SBarry Smith   PetscFunctionBegin;
5193ba16761SJacob Faibussowitsch   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
520bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
521bc952696SBarry Smith 
5229566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5239566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5249566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5259566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
5263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
527bc952696SBarry Smith }
528bc952696SBarry Smith 
529bc952696SBarry Smith /*@
5301550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5311550c9b9SHong Zhang 
532c3339decSBarry Smith    Collective
5331550c9b9SHong Zhang 
5341550c9b9SHong Zhang    Input Parameter:
535bcf0153eSBarry Smith .  tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
5361550c9b9SHong Zhang 
5371550c9b9SHong Zhang    Level: developer
5381550c9b9SHong Zhang 
539*1cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5401550c9b9SHong Zhang @*/
541d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
542d71ae5a4SJacob Faibussowitsch {
5431550c9b9SHong Zhang   PetscFunctionBegin;
5443ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
5459a992471SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
546dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, reset);
5479566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5489566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5499566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
550fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5521550c9b9SHong Zhang }
5531550c9b9SHong Zhang 
5541550c9b9SHong Zhang /*@
555bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
556bc952696SBarry Smith 
557c3339decSBarry Smith    Collective
558bc952696SBarry Smith 
559bc952696SBarry Smith    Input Parameter:
560bcf0153eSBarry Smith .  tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
561bc952696SBarry Smith 
562df5474d8SHong Zhang    Level: developer
563bc952696SBarry Smith 
564*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
565bc952696SBarry Smith @*/
566d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
567d71ae5a4SJacob Faibussowitsch {
568bc952696SBarry Smith   PetscFunctionBegin;
5693ba16761SJacob Faibussowitsch   if (!*tj) PetscFunctionReturn(PETSC_SUCCESS);
570972caf09SHong Zhang   PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1);
5719371c9d4SSatish Balay   if (--((PetscObject)(*tj))->refct > 0) {
5729371c9d4SSatish Balay     *tj = NULL;
5733ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
5749371c9d4SSatish Balay   }
575bc952696SBarry Smith 
5769566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5779566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5789566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5799566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5809566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5819566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5829a992471SHong Zhang 
5839566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
584dbbe0bcdSBarry Smith   PetscTryTypeMethod((*tj), destroy);
585fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
586fe8322adSStefano Zampini     PetscMPIInt rank;
587fe8322adSStefano Zampini     MPI_Comm    comm;
588fe8322adSStefano Zampini 
5899566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm));
5909566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
591dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5929566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
593fe8322adSStefano Zampini     }
594fe8322adSStefano Zampini   }
5959566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5969566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5979566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5989566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
5993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
600bc952696SBarry Smith }
601bc952696SBarry Smith 
602bc952696SBarry Smith /*
603bcf0153eSBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options.
604bc952696SBarry Smith 
605c3339decSBarry Smith   Collective
606bc952696SBarry Smith 
607bc952696SBarry Smith   Input Parameter:
608bcf0153eSBarry Smith + tj - the `TSTrajectory` context
6093c0fce88SHong Zhang - ts - the TS context
6103c0fce88SHong Zhang 
611bcf0153eSBarry Smith   Options Database Key:
6123c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
613bc952696SBarry Smith 
614df5474d8SHong Zhang   Level: developer
615bc952696SBarry Smith 
616*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
617bc952696SBarry Smith */
618d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts)
619d71ae5a4SJacob Faibussowitsch {
620bc952696SBarry Smith   PetscBool   opt;
621bc952696SBarry Smith   const char *defaultType;
622bc952696SBarry Smith   char        typeName[256];
623bc952696SBarry Smith 
624bc952696SBarry Smith   PetscFunctionBegin;
625b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
626bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
627bc952696SBarry Smith 
6289566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6299566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
630bc952696SBarry Smith   if (opt) {
6319566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, typeName));
632bc952696SBarry Smith   } else {
6339566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, defaultType));
634bc952696SBarry Smith   }
6353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
636bc952696SBarry Smith }
637bc952696SBarry Smith 
638ed695a29SHong Zhang /*@
639bcf0153eSBarry Smith    TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory`
6409ffb3502SHong Zhang 
641c3339decSBarry Smith    Collective
6429ffb3502SHong Zhang 
6434165533cSJose E. Roman    Input Parameters:
644bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
645bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
6469ffb3502SHong Zhang 
647bcf0153eSBarry Smith    Options Database Key:
648bcf0153eSBarry Smith .  -ts_trajectory_use_history - have it use `TSHistory`
6499ffb3502SHong Zhang 
6509ffb3502SHong Zhang    Level: advanced
6519ffb3502SHong Zhang 
652*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6539ffb3502SHong Zhang @*/
654d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg)
655d71ae5a4SJacob Faibussowitsch {
6569ffb3502SHong Zhang   PetscFunctionBegin;
6579ffb3502SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6589ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
6599ffb3502SHong Zhang   tj->usehistory = flg;
6603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6619ffb3502SHong Zhang }
6629ffb3502SHong Zhang 
6639ffb3502SHong Zhang /*@
664bcf0153eSBarry Smith    TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller
665ed695a29SHong Zhang 
666c3339decSBarry Smith    Collective
667ed695a29SHong Zhang 
6684165533cSJose E. Roman    Input Parameters:
669bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
670bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable
671ed695a29SHong Zhang 
672bcf0153eSBarry Smith    Options Database Key:
673bcf0153eSBarry Smith .  -ts_trajectory_monitor - print `TSTrajectory` information
6743c0fce88SHong Zhang 
675df5474d8SHong Zhang    Level: developer
676ed695a29SHong Zhang 
677*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
678ed695a29SHong Zhang @*/
679d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg)
680d71ae5a4SJacob Faibussowitsch {
681ed695a29SHong Zhang   PetscFunctionBegin;
682ed695a29SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
683ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
684fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
685fe8322adSStefano Zampini   else tj->monitor = NULL;
6863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
687ed695a29SHong Zhang }
688ed695a29SHong Zhang 
689bc952696SBarry Smith /*@
690bcf0153eSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done
69164fc91eeSBarry Smith 
692c3339decSBarry Smith    Collective
69364fc91eeSBarry Smith 
6944165533cSJose E. Roman    Input Parameters:
695bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
696bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
69764fc91eeSBarry Smith 
698bcf0153eSBarry Smith    Options Database Key:
69964fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
70064fc91eeSBarry Smith 
70164fc91eeSBarry Smith    Level: advanced
70264fc91eeSBarry Smith 
703bcf0153eSBarry Smith    Note:
704bcf0153eSBarry Smith     By default the `TSTrajectory` used for adjoint computations, `TSTRAJECTORYBASIC`, removes the files it generates at the end of the run. This causes the files to be kept.
705bcf0153eSBarry Smith 
706*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70764fc91eeSBarry Smith @*/
708d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg)
709d71ae5a4SJacob Faibussowitsch {
71064fc91eeSBarry Smith   PetscFunctionBegin;
71164fc91eeSBarry Smith   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
71264fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj, flg, 2);
71364fc91eeSBarry Smith   tj->keepfiles = flg;
7143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
71564fc91eeSBarry Smith }
71664fc91eeSBarry Smith 
717db901c5bSHong Zhang /*@C
718bcf0153eSBarry Smith    TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored.
71964e38db7SHong Zhang 
720c3339decSBarry Smith    Collective
72164e38db7SHong Zhang 
7224165533cSJose E. Roman    Input Parameters:
723bcf0153eSBarry Smith +  tj      - the `TSTrajectory` context
72464e38db7SHong Zhang -  dirname - the directory name
72564e38db7SHong Zhang 
726bcf0153eSBarry Smith    Options Database Key:
72764e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
72864e38db7SHong Zhang 
72964e38db7SHong Zhang    Level: developer
73064e38db7SHong Zhang 
731bcf0153eSBarry Smith    Notes:
732bcf0153eSBarry Smith     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()`
733bcf0153eSBarry Smith 
734bcf0153eSBarry Smith    If this is not called `TSTrajectory` selects a unique new name for the directory
735bcf0153eSBarry Smith 
736*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73764e38db7SHong Zhang @*/
738d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[])
739d71ae5a4SJacob Faibussowitsch {
740a17281aeSStefano Zampini   PetscBool flg;
741a17281aeSStefano Zampini 
74264e38db7SHong Zhang   PetscFunctionBegin;
74364e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7449566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
745049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7469566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7479566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname, &tj->dirname));
7483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
74964e38db7SHong Zhang }
75064e38db7SHong Zhang 
751db901c5bSHong Zhang /*@C
752bcf0153eSBarry Smith    TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints.
75364e38db7SHong Zhang 
754c3339decSBarry Smith    Collective
75564e38db7SHong Zhang 
7564165533cSJose E. Roman    Input Parameters:
757bcf0153eSBarry Smith +  tj      - the `TSTrajectory` context
7581585b412SBarry Smith -  filetemplate - the template
75964e38db7SHong Zhang 
760bcf0153eSBarry Smith    Options Database Key:
7611585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7621585b412SBarry Smith 
763bcf0153eSBarry Smith    Level: developer
764bcf0153eSBarry Smith 
76595452b02SPatrick Sanan    Notes:
76663a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7671585b412SBarry Smith 
768bcf0153eSBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by `TSTrajectorySetDirname()`. The %06" PetscInt_FMT " is replaced by the
7691585b412SBarry Smith    timestep counter
77064e38db7SHong Zhang 
771*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
77264e38db7SHong Zhang @*/
773d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[])
774d71ae5a4SJacob Faibussowitsch {
775bbcf679cSJacob Faibussowitsch   const char *ptr = NULL, *ptr2 = NULL;
7769afe7f3eSBarry Smith 
77764e38db7SHong Zhang   PetscFunctionBegin;
77864e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
77963a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(filetemplate, 2);
7803c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7819afe7f3eSBarry Smith 
78263a3b9bcSJacob Faibussowitsch   PetscCheck(filetemplate[0], PetscObjectComm((PetscObject)tj), PETSC_ERR_USER, "-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin");
7839afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7849566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
78563a3b9bcSJacob Faibussowitsch   PetscCheck(ptr, PetscObjectComm((PetscObject)tj), PETSC_ERR_USER, "-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin");
7869afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
78763a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
78863a3b9bcSJacob Faibussowitsch     PetscCheck(ptr2 || (*ptr >= '0' && *ptr <= '9'), PetscObjectComm((PetscObject)tj), PETSC_ERR_USER, "Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06" PetscInt_FMT ".bin");
7899afe7f3eSBarry Smith     if (ptr2) break;
7909afe7f3eSBarry Smith   }
7919566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7929566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
7933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
79464e38db7SHong Zhang }
79564e38db7SHong Zhang 
79664e38db7SHong Zhang /*@
797bcf0153eSBarry Smith    TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options.
798bc952696SBarry Smith 
799c3339decSBarry Smith    Collective
800bc952696SBarry Smith 
801d8d19677SJose E. Roman    Input Parameters:
802bcf0153eSBarry Smith +  tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
803bcf0153eSBarry Smith -  ts - the `TS` context
804bc952696SBarry Smith 
805bc952696SBarry Smith    Options Database Keys:
806bcf0153eSBarry Smith +  -ts_trajectory_type <type> - basic, memory, singlefile, visualization
807bcf0153eSBarry Smith .  -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for singlefile and visualization
808bcf0153eSBarry Smith -  -ts_trajectory_monitor - print `TSTrajectory` information
809bc952696SBarry Smith 
810df5474d8SHong Zhang    Level: developer
811bc952696SBarry Smith 
812bcf0153eSBarry Smith    Note:
81395452b02SPatrick Sanan     This is not normally called directly by users
814bc952696SBarry Smith 
815*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
816bc952696SBarry Smith @*/
817d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts)
818d71ae5a4SJacob Faibussowitsch {
819ed695a29SHong Zhang   PetscBool set, flg;
82064e38db7SHong Zhang   char      dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
821bc952696SBarry Smith 
822bc952696SBarry Smith   PetscFunctionBegin;
823b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
824fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
825d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8269566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
8279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8289566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8299566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8329566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_adjointmode", "Instruct the trajectory that will be used in a TSAdjointSolve()", NULL, tj->adjoint_solve_mode, &tj->adjoint_solve_mode, NULL));
8339566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8349566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8359566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
83664e38db7SHong Zhang 
8379566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8381baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
83964e38db7SHong Zhang 
84063a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8411baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
84264e38db7SHong Zhang 
84364e38db7SHong Zhang   /* Handle specific TSTrajectory options */
844dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
845d0609cedSBarry Smith   PetscOptionsEnd();
8463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
847bc952696SBarry Smith }
84868bece0bSHong Zhang 
84968bece0bSHong Zhang /*@
85068bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
851bcf0153eSBarry Smith    of a `TS` `TSTrajectory`.
85268bece0bSHong Zhang 
853c3339decSBarry Smith    Collective
85468bece0bSHong Zhang 
855d8d19677SJose E. Roman    Input Parameters:
856bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
857bcf0153eSBarry Smith -  ts - the TS context obtained from `TSCreate()`
85868bece0bSHong Zhang 
859df5474d8SHong Zhang    Level: developer
86068bece0bSHong Zhang 
861*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
86268bece0bSHong Zhang @*/
863d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts)
864d71ae5a4SJacob Faibussowitsch {
8659afe7f3eSBarry Smith   size_t s1, s2;
86668bece0bSHong Zhang 
86768bece0bSHong Zhang   PetscFunctionBegin;
8683ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
86968bece0bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
870fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
8713ba16761SJacob Faibussowitsch   if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
87268bece0bSHong Zhang 
8739566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
87448a46eb9SPierre Jolivet   if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
875dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setup, ts);
87668bece0bSHong Zhang 
87768bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
87853b27ddbSHong Zhang 
87953b27ddbSHong Zhang   /* Set the counters to zero */
8801a5a771fSHong Zhang   tj->recomps    = 0;
88153b27ddbSHong Zhang   tj->diskreads  = 0;
88253b27ddbSHong Zhang   tj->diskwrites = 0;
8839566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname, &s1));
8849566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate, &s2));
8859566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8869566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8879566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8889566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
8893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
89068bece0bSHong Zhang }
891fe8322adSStefano Zampini 
892fe8322adSStefano Zampini /*@
893bcf0153eSBarry Smith    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information
894fe8322adSStefano Zampini 
895c3339decSBarry Smith    Collective
896fe8322adSStefano Zampini 
897d8d19677SJose E. Roman    Input Parameters:
898bcf0153eSBarry Smith +  tj  - the `TSTrajectory` context obtained with `TSGetTrajectory()`
899fe8322adSStefano Zampini -  flg - the boolean flag
900fe8322adSStefano Zampini 
901fe8322adSStefano Zampini    Level: developer
902fe8322adSStefano Zampini 
903*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
904fe8322adSStefano Zampini @*/
905d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only)
906d71ae5a4SJacob Faibussowitsch {
907fe8322adSStefano Zampini   PetscFunctionBegin;
908fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
909fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj, solution_only, 2);
910fe8322adSStefano Zampini   tj->solution_only = solution_only;
9113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
912fe8322adSStefano Zampini }
913fe8322adSStefano Zampini 
914fe8322adSStefano Zampini /*@
915bcf0153eSBarry Smith    TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`.
916fe8322adSStefano Zampini 
91720f4b53cSBarry Smith    Logically Collective
918fe8322adSStefano Zampini 
919fe8322adSStefano Zampini    Input Parameter:
920bcf0153eSBarry Smith .  tj  - the `TSTrajectory` context
921fe8322adSStefano Zampini 
922fe8322adSStefano Zampini    Output Parameter:
923d8d19677SJose E. Roman .  flg - the boolean flag
924fe8322adSStefano Zampini 
925fe8322adSStefano Zampini    Level: developer
926fe8322adSStefano Zampini 
927*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
928fe8322adSStefano Zampini @*/
929d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only)
930d71ae5a4SJacob Faibussowitsch {
931fe8322adSStefano Zampini   PetscFunctionBegin;
932fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
933dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only, 2);
934fe8322adSStefano Zampini   *solution_only = tj->solution_only;
9353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
936fe8322adSStefano Zampini }
937fe8322adSStefano Zampini 
938fe8322adSStefano Zampini /*@
939fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
940fe8322adSStefano Zampini 
941c3339decSBarry Smith    Collective
942fe8322adSStefano Zampini 
943d8d19677SJose E. Roman    Input Parameters:
944bcf0153eSBarry Smith +  tj   - the `TSTrajectory` context
945bcf0153eSBarry Smith .  ts   - the `TS` solver context
946fe8322adSStefano Zampini -  time - the requested time
947fe8322adSStefano Zampini 
948d8d19677SJose E. Roman    Output Parameters:
949fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
950fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
951fe8322adSStefano Zampini 
952fe8322adSStefano Zampini    Level: developer
953fe8322adSStefano Zampini 
954bcf0153eSBarry Smith    Notes:
955bcf0153eSBarry Smith    The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector.
956fe8322adSStefano Zampini 
957bcf0153eSBarry Smith    This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by
958bcf0153eSBarry Smith    calling `TSTrajectoryRestoreUpdatedHistoryVecs()`.
959bcf0153eSBarry Smith 
960*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
961fe8322adSStefano Zampini @*/
962d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
963d71ae5a4SJacob Faibussowitsch {
964fe8322adSStefano Zampini   PetscFunctionBegin;
965fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
966fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
967fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 3);
968fe8322adSStefano Zampini   if (U) PetscValidPointer(U, 4);
969fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot, 5);
970fe8322adSStefano Zampini   if (U && !tj->U) {
971fe8322adSStefano Zampini     DM dm;
972fe8322adSStefano Zampini 
9739566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9749566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->U));
975fe8322adSStefano Zampini   }
976fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
977fe8322adSStefano Zampini     DM dm;
978fe8322adSStefano Zampini 
9799566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9809566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
981fe8322adSStefano Zampini   }
9829566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
983fe8322adSStefano Zampini   if (U) {
9849566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
985fe8322adSStefano Zampini     *U = tj->U;
986fe8322adSStefano Zampini   }
987fe8322adSStefano Zampini   if (Udot) {
9889566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
989fe8322adSStefano Zampini     *Udot = tj->Udot;
990fe8322adSStefano Zampini   }
9913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
992fe8322adSStefano Zampini }
993fe8322adSStefano Zampini 
994fe8322adSStefano Zampini /*@
995bcf0153eSBarry Smith    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`.
996fe8322adSStefano Zampini 
997c3339decSBarry Smith    Collective
998fe8322adSStefano Zampini 
999d8d19677SJose E. Roman    Input Parameters:
1000bcf0153eSBarry Smith +  tj   - the `TSTrajectory` context
1001fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1002fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1003fe8322adSStefano Zampini 
1004fe8322adSStefano Zampini    Level: developer
1005fe8322adSStefano Zampini 
1006*1cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()`
1007fe8322adSStefano Zampini @*/
1008d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1009d71ae5a4SJacob Faibussowitsch {
1010fe8322adSStefano Zampini   PetscFunctionBegin;
1011fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
1012fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
1013fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
10143c633725SBarry Smith   PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10153c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1016fe8322adSStefano Zampini   if (U) {
10179566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1018fe8322adSStefano Zampini     *U = NULL;
1019fe8322adSStefano Zampini   }
1020fe8322adSStefano Zampini   if (Udot) {
10219566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1022fe8322adSStefano Zampini     *Udot = NULL;
1023fe8322adSStefano Zampini   }
10243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1025fe8322adSStefano Zampini }
1026