xref: /petsc/src/ts/trajectory/interface/traj.c (revision 20f4b53cbb5e9bd9ef12b76a8697d60d197cda17)
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:
163c0fce88SHong Zhang + name        - the name of a new user-defined creation routine
173c0fce88SHong Zhang - create_func - 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 
24bcf0153eSBarry Smith .seealso: [](chapter_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 
50bcf0153eSBarry Smith .seealso: [](chapter_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 
74*20f4b53cSBarry Smith   Not Collective.
75fe8322adSStefano Zampini 
76fe8322adSStefano Zampini   Input Parameters:
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 
84bcf0153eSBarry Smith .seealso: [](chapter_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 
113bcf0153eSBarry Smith .seealso: [](chapter_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 
1456b867d5aSJose E. Roman   Input/Output Parameter:
146fe8322adSStefano Zampini 
147fe8322adSStefano Zampini   Output Parameters:
148bcf0153eSBarry Smith + time - On input time for the step if step number is `PETSC_DECIDE`, on output the time associated with the step number
149f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
150fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
151fe8322adSStefano Zampini 
152fe8322adSStefano Zampini   Level: developer
153fe8322adSStefano Zampini 
154bcf0153eSBarry Smith   Notes:
155bcf0153eSBarry Smith   If the step number is `PETSC_DECIDE`, the time argument is used to inquire the trajectory.
156fe8322adSStefano Zampini   If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
157fe8322adSStefano Zampini 
158bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
159fe8322adSStefano Zampini @*/
160d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot)
161d71ae5a4SJacob Faibussowitsch {
162fe8322adSStefano Zampini   PetscFunctionBegin;
1633c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
164fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
165fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
166fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
167dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
168fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5);
169fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6);
1703ba16761SJacob Faibussowitsch   if (!U && !Udot) PetscFunctionReturn(PETSC_SUCCESS);
1713c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1729566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0));
173fe8322adSStefano Zampini   if (tj->monitor) {
174fe8322adSStefano Zampini     PetscInt pU, pUdot;
175fe8322adSStefano Zampini     pU    = U ? 1 : 0;
176fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
17763a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time));
1789566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
179fe8322adSStefano Zampini   }
180fe8322adSStefano Zampini   if (U && tj->lag.caching) {
181fe8322adSStefano Zampini     PetscObjectId    id;
182fe8322adSStefano Zampini     PetscObjectState state;
183fe8322adSStefano Zampini 
1849566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &state));
1859566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &id));
186fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
187fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
188fe8322adSStefano Zampini     } else {
189fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
190fe8322adSStefano Zampini     }
191fe8322adSStefano Zampini     if (tj->monitor && !U) {
1929566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1939566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n"));
1949566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1959566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
196fe8322adSStefano Zampini     }
197fe8322adSStefano Zampini   }
198fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
199fe8322adSStefano Zampini     PetscObjectId    id;
200fe8322adSStefano Zampini     PetscObjectState state;
201fe8322adSStefano Zampini 
2029566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot, &state));
2039566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot, &id));
204fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
205fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
206fe8322adSStefano Zampini     } else {
207fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
208fe8322adSStefano Zampini     }
209fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2109566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2119566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n"));
2129566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2139566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
214fe8322adSStefano Zampini     }
215fe8322adSStefano Zampini   }
216fe8322adSStefano Zampini   if (!U && !Udot) {
2179566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2183ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
219fe8322adSStefano Zampini   }
220fe8322adSStefano Zampini 
221fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2221baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
223fe8322adSStefano Zampini     /* cached states will be updated in the function */
2249566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot));
225fe8322adSStefano Zampini     if (tj->monitor) {
2269566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2279566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
228fe8322adSStefano Zampini     }
229fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
230fe8322adSStefano Zampini     TS  fakets = ts;
231fe8322adSStefano Zampini     Vec U2;
232fe8322adSStefano Zampini 
233fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
234fe8322adSStefano Zampini     if (!ts) {
2359566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets));
236fe8322adSStefano Zampini       if (!fakets) {
2379566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets));
2389566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets));
2399566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2409566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U, &U2));
2419566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets, U2));
2429566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
243fe8322adSStefano Zampini       }
244fe8322adSStefano Zampini     }
2459566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time));
2469566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets, &U2));
2479566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2, U));
2489566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state));
2499566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id));
250fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
251fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
252fe8322adSStefano Zampini   }
2539566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2543ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
255fe8322adSStefano Zampini }
256fe8322adSStefano Zampini 
257bc952696SBarry Smith /*@C
258bcf0153eSBarry Smith    TSTrajectoryViewFromOptions - View a `TSTrajectory` based on values in the options database
259fe2efc57SMark 
260c3339decSBarry Smith    Collective
261fe2efc57SMark 
262fe2efc57SMark    Input Parameters:
263bcf0153eSBarry Smith +  A - the `TSTrajectory` context
264bcf0153eSBarry Smith .  obj - Optional object that provides prefix used for option name
265736c3998SJose E. Roman -  name - command line option
266fe2efc57SMark 
267fe2efc57SMark    Level: intermediate
268bcf0153eSBarry Smith 
269bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
270fe2efc57SMark @*/
271d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[])
272d71ae5a4SJacob Faibussowitsch {
273fe2efc57SMark   PetscFunctionBegin;
274fe2efc57SMark   PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1);
2759566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
2763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
277fe2efc57SMark }
278fe2efc57SMark 
279fe2efc57SMark /*@C
280bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
281bc952696SBarry Smith 
282c3339decSBarry Smith     Collective
283bc952696SBarry Smith 
284bc952696SBarry Smith     Input Parameters:
285bcf0153eSBarry Smith +   tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
286bc952696SBarry Smith -   viewer - visualization context
287bc952696SBarry Smith 
288bc952696SBarry Smith     Options Database Key:
289bcf0153eSBarry Smith .   -ts_trajectory_view - calls `TSTrajectoryView()` at end of `TSAdjointStep()`
290bcf0153eSBarry Smith 
291bcf0153eSBarry Smith     Level: developer
292bc952696SBarry Smith 
293bc952696SBarry Smith     Notes:
294bc952696SBarry Smith     The available visualization contexts include
295bcf0153eSBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
296bcf0153eSBarry Smith -     `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
297bc952696SBarry Smith          output where only the first processor opens
298bc952696SBarry Smith          the file.  All other processors send their
299bc952696SBarry Smith          data to the first processor to print.
300bc952696SBarry Smith 
301bc952696SBarry Smith     The user can open an alternative visualization context with
302bcf0153eSBarry Smith     `PetscViewerASCIIOpen()` - output to a specified file.
303bc952696SBarry Smith 
304bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `PetscViewer`, `PetscViewerASCIIOpen()`
305bc952696SBarry Smith @*/
306d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer)
307d71ae5a4SJacob Faibussowitsch {
308bc952696SBarry Smith   PetscBool iascii;
309bc952696SBarry Smith 
310bc952696SBarry Smith   PetscFunctionBegin;
3111a5a771fSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
31248a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer));
313bc952696SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
314b1d74d50SHong Zhang   PetscCheckSameComm(tj, 1, viewer, 2);
315bc952696SBarry Smith 
3169566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
317bc952696SBarry Smith   if (iascii) {
3189566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer));
31963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps));
32063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads));
32163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites));
3229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
323dbbe0bcdSBarry Smith     PetscTryTypeMethod(tj, view, viewer);
3249566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
325bc952696SBarry Smith   }
3263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
327bc952696SBarry Smith }
328bc952696SBarry Smith 
329bc952696SBarry Smith /*@C
33078fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
33178fbdcc8SBarry Smith 
332c3339decSBarry Smith    Collective
33378fbdcc8SBarry Smith 
33478fbdcc8SBarry Smith    Input Parameters:
33578fbdcc8SBarry Smith +  tr - the trajectory context
33678fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
33778fbdcc8SBarry Smith 
33878fbdcc8SBarry Smith    Level: intermediate
33978fbdcc8SBarry Smith 
340bcf0153eSBarry Smith    Fortran Note:
341bcf0153eSBarry Smith    Fortran interface is not possible because of the string array argument
342db901c5bSHong Zhang 
343bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSGetTrajectory()`
34478fbdcc8SBarry Smith @*/
345d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names)
346d71ae5a4SJacob Faibussowitsch {
34778fbdcc8SBarry Smith   PetscFunctionBegin;
348fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1);
349fe8322adSStefano Zampini   PetscValidPointer(names, 2);
3509566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3519566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names, &ctx->names));
3523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
35378fbdcc8SBarry Smith }
35478fbdcc8SBarry Smith 
35578fbdcc8SBarry Smith /*@C
356fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35708347785SBarry Smith 
358c3339decSBarry Smith    Collective
35908347785SBarry Smith 
36008347785SBarry Smith    Input Parameters:
361bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
36208347785SBarry Smith .  transform - the transform function
36308347785SBarry Smith .  destroy - function to destroy the optional context
36408347785SBarry Smith -  ctx - optional context used by transform function
36508347785SBarry Smith 
36608347785SBarry Smith    Level: intermediate
36708347785SBarry Smith 
368bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
36908347785SBarry Smith @*/
370d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx)
371d71ae5a4SJacob Faibussowitsch {
37208347785SBarry Smith   PetscFunctionBegin;
373fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
37408347785SBarry Smith   tj->transform        = transform;
37508347785SBarry Smith   tj->transformdestroy = destroy;
37608347785SBarry Smith   tj->transformctx     = tctx;
3773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
37808347785SBarry Smith }
37908347785SBarry Smith 
380db901c5bSHong Zhang /*@
381bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
382bc952696SBarry Smith 
383d083f849SBarry Smith   Collective
384bc952696SBarry Smith 
385bc952696SBarry Smith   Input Parameter:
3863c0fce88SHong Zhang . comm - the communicator
387bc952696SBarry Smith 
388bc952696SBarry Smith   Output Parameter:
3893c0fce88SHong Zhang . tj   - the trajectory object
390bc952696SBarry Smith 
391df5474d8SHong Zhang   Level: developer
392bc952696SBarry Smith 
39395452b02SPatrick Sanan   Notes:
394bcf0153eSBarry Smith     Usually one does not call this routine, it is called automatically when one calls `TSSetSaveTrajectory()`.
395bc952696SBarry Smith 
396bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
397bc952696SBarry Smith @*/
398d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj)
399d71ae5a4SJacob Faibussowitsch {
400bc952696SBarry Smith   TSTrajectory t;
401bc952696SBarry Smith 
402bc952696SBarry Smith   PetscFunctionBegin;
403b1d74d50SHong Zhang   PetscValidPointer(tj, 2);
404b1d74d50SHong Zhang   *tj = NULL;
4059566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
406bc952696SBarry Smith 
4079566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
40868bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4099566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm, &t->tsh));
410fe8322adSStefano Zampini 
411fe8322adSStefano Zampini   t->lag.order            = 1;
412fe8322adSStefano Zampini   t->lag.L                = NULL;
413fe8322adSStefano Zampini   t->lag.T                = NULL;
414fe8322adSStefano Zampini   t->lag.W                = NULL;
415fe8322adSStefano Zampini   t->lag.WW               = NULL;
416fe8322adSStefano Zampini   t->lag.TW               = NULL;
417fe8322adSStefano Zampini   t->lag.TT               = NULL;
418fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
419fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
420fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
421fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
422fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
423fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
424fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
425fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
426fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
427fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
428fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
429fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
430ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
431b1d74d50SHong Zhang   *tj                     = t;
43263a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
4333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
434bc952696SBarry Smith }
435bc952696SBarry Smith 
436bc952696SBarry Smith /*@C
437bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
438bc952696SBarry Smith 
439c3339decSBarry Smith   Collective
440bc952696SBarry Smith 
441bc952696SBarry Smith   Input Parameters:
442bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
443bcf0153eSBarry Smith . ts   - the `TS` context
4443c0fce88SHong Zhang - type - a known method
445bc952696SBarry Smith 
446bcf0153eSBarry Smith   Options Database Key:
447e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
448bc952696SBarry Smith 
449df5474d8SHong Zhang    Level: developer
450bc952696SBarry Smith 
451bcf0153eSBarry Smith   Developer Note:
452bcf0153eSBarry Smith   Why does this option require access to the `TS`
453bc952696SBarry Smith 
454bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
455bc952696SBarry Smith @*/
456d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type)
457d71ae5a4SJacob Faibussowitsch {
458972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory, TS);
459bc952696SBarry Smith   PetscBool match;
460bc952696SBarry Smith 
461bc952696SBarry Smith   PetscFunctionBegin;
462972caf09SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4639566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
4643ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
465bc952696SBarry Smith 
4669566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4673c633725SBarry Smith   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
468972caf09SHong Zhang   if (tj->ops->destroy) {
4699566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
470bc952696SBarry Smith 
471972caf09SHong Zhang     tj->ops->destroy = NULL;
472bc952696SBarry Smith   }
4739566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
474bc952696SBarry Smith 
4759566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4769566063dSJacob Faibussowitsch   PetscCall((*r)(tj, ts));
4773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
478bc952696SBarry Smith }
479bc952696SBarry Smith 
480881c1a9bSHong Zhang /*@C
481881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
482881c1a9bSHong Zhang 
483c3339decSBarry Smith   Collective
484881c1a9bSHong Zhang 
485881c1a9bSHong Zhang   Input Parameters:
486bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
487bcf0153eSBarry Smith - ts   - the `TS` context
488881c1a9bSHong Zhang 
489881c1a9bSHong Zhang   Output Parameters:
490881c1a9bSHong Zhang . type - a known method
491881c1a9bSHong Zhang 
492881c1a9bSHong Zhang   Level: developer
493881c1a9bSHong Zhang 
494bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
495881c1a9bSHong Zhang @*/
496d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type)
497d71ae5a4SJacob Faibussowitsch {
498881c1a9bSHong Zhang   PetscFunctionBegin;
499881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
500881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
5013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
502881c1a9bSHong Zhang }
503881c1a9bSHong Zhang 
504972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
505972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
5069a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
5072b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
508bc952696SBarry Smith 
509bc952696SBarry Smith /*@C
510bcf0153eSBarry Smith   TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package.
511bc952696SBarry Smith 
512bc952696SBarry Smith   Not Collective
513bc952696SBarry Smith 
514df5474d8SHong Zhang   Level: developer
515bc952696SBarry Smith 
516bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryRegister()`
517bc952696SBarry Smith @*/
518d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void)
519d71ae5a4SJacob Faibussowitsch {
520bc952696SBarry Smith   PetscFunctionBegin;
5213ba16761SJacob Faibussowitsch   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
522bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
523bc952696SBarry Smith 
5249566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5259566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5269566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5279566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
5283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
529bc952696SBarry Smith }
530bc952696SBarry Smith 
531bc952696SBarry Smith /*@
5321550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5331550c9b9SHong Zhang 
534c3339decSBarry Smith    Collective
5351550c9b9SHong Zhang 
5361550c9b9SHong Zhang    Input Parameter:
537bcf0153eSBarry Smith .  tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
5381550c9b9SHong Zhang 
5391550c9b9SHong Zhang    Level: developer
5401550c9b9SHong Zhang 
541bcf0153eSBarry Smith .seealso: [](chapter_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5421550c9b9SHong Zhang @*/
543d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
544d71ae5a4SJacob Faibussowitsch {
5451550c9b9SHong Zhang   PetscFunctionBegin;
5463ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
5479a992471SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
548dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, reset);
5499566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5509566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5519566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
552fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5541550c9b9SHong Zhang }
5551550c9b9SHong Zhang 
5561550c9b9SHong Zhang /*@
557bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
558bc952696SBarry Smith 
559c3339decSBarry Smith    Collective
560bc952696SBarry Smith 
561bc952696SBarry Smith    Input Parameter:
562bcf0153eSBarry Smith .  tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
563bc952696SBarry Smith 
564df5474d8SHong Zhang    Level: developer
565bc952696SBarry Smith 
566bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
567bc952696SBarry Smith @*/
568d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
569d71ae5a4SJacob Faibussowitsch {
570bc952696SBarry Smith   PetscFunctionBegin;
5713ba16761SJacob Faibussowitsch   if (!*tj) PetscFunctionReturn(PETSC_SUCCESS);
572972caf09SHong Zhang   PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1);
5739371c9d4SSatish Balay   if (--((PetscObject)(*tj))->refct > 0) {
5749371c9d4SSatish Balay     *tj = NULL;
5753ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
5769371c9d4SSatish Balay   }
577bc952696SBarry Smith 
5789566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5799566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5809566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5819566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5829566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5839566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5849a992471SHong Zhang 
5859566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
586dbbe0bcdSBarry Smith   PetscTryTypeMethod((*tj), destroy);
587fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
588fe8322adSStefano Zampini     PetscMPIInt rank;
589fe8322adSStefano Zampini     MPI_Comm    comm;
590fe8322adSStefano Zampini 
5919566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm));
5929566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
593dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5949566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
595fe8322adSStefano Zampini     }
596fe8322adSStefano Zampini   }
5979566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5989566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5999566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
6009566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
6013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
602bc952696SBarry Smith }
603bc952696SBarry Smith 
604bc952696SBarry Smith /*
605bcf0153eSBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options.
606bc952696SBarry Smith 
607c3339decSBarry Smith   Collective
608bc952696SBarry Smith 
609bc952696SBarry Smith   Input Parameter:
610bcf0153eSBarry Smith + tj - the `TSTrajectory` context
6113c0fce88SHong Zhang - ts - the TS context
6123c0fce88SHong Zhang 
613bcf0153eSBarry Smith   Options Database Key:
6143c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
615bc952696SBarry Smith 
616df5474d8SHong Zhang   Level: developer
617bc952696SBarry Smith 
618bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
619bc952696SBarry Smith */
620d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts)
621d71ae5a4SJacob Faibussowitsch {
622bc952696SBarry Smith   PetscBool   opt;
623bc952696SBarry Smith   const char *defaultType;
624bc952696SBarry Smith   char        typeName[256];
625bc952696SBarry Smith 
626bc952696SBarry Smith   PetscFunctionBegin;
627b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
628bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
629bc952696SBarry Smith 
6309566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
632bc952696SBarry Smith   if (opt) {
6339566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, typeName));
634bc952696SBarry Smith   } else {
6359566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, defaultType));
636bc952696SBarry Smith   }
6373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
638bc952696SBarry Smith }
639bc952696SBarry Smith 
640ed695a29SHong Zhang /*@
641bcf0153eSBarry Smith    TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory`
6429ffb3502SHong Zhang 
643c3339decSBarry Smith    Collective
6449ffb3502SHong Zhang 
6454165533cSJose E. Roman    Input Parameters:
646bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
647bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
6489ffb3502SHong Zhang 
649bcf0153eSBarry Smith    Options Database Key:
650bcf0153eSBarry Smith .  -ts_trajectory_use_history - have it use `TSHistory`
6519ffb3502SHong Zhang 
6529ffb3502SHong Zhang    Level: advanced
6539ffb3502SHong Zhang 
654bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6559ffb3502SHong Zhang @*/
656d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg)
657d71ae5a4SJacob Faibussowitsch {
6589ffb3502SHong Zhang   PetscFunctionBegin;
6599ffb3502SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6609ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
6619ffb3502SHong Zhang   tj->usehistory = flg;
6623ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6639ffb3502SHong Zhang }
6649ffb3502SHong Zhang 
6659ffb3502SHong Zhang /*@
666bcf0153eSBarry Smith    TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller
667ed695a29SHong Zhang 
668c3339decSBarry Smith    Collective
669ed695a29SHong Zhang 
6704165533cSJose E. Roman    Input Parameters:
671bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
672bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable
673ed695a29SHong Zhang 
674bcf0153eSBarry Smith    Options Database Key:
675bcf0153eSBarry Smith .  -ts_trajectory_monitor - print `TSTrajectory` information
6763c0fce88SHong Zhang 
677df5474d8SHong Zhang    Level: developer
678ed695a29SHong Zhang 
679bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
680ed695a29SHong Zhang @*/
681d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg)
682d71ae5a4SJacob Faibussowitsch {
683ed695a29SHong Zhang   PetscFunctionBegin;
684ed695a29SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
685ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
686fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
687fe8322adSStefano Zampini   else tj->monitor = NULL;
6883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
689ed695a29SHong Zhang }
690ed695a29SHong Zhang 
691bc952696SBarry Smith /*@
692bcf0153eSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done
69364fc91eeSBarry Smith 
694c3339decSBarry Smith    Collective
69564fc91eeSBarry Smith 
6964165533cSJose E. Roman    Input Parameters:
697bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
698bcf0153eSBarry Smith -  flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
69964fc91eeSBarry Smith 
700bcf0153eSBarry Smith    Options Database Key:
70164fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
70264fc91eeSBarry Smith 
70364fc91eeSBarry Smith    Level: advanced
70464fc91eeSBarry Smith 
705bcf0153eSBarry Smith    Note:
706bcf0153eSBarry 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.
707bcf0153eSBarry Smith 
708bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70964fc91eeSBarry Smith @*/
710d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg)
711d71ae5a4SJacob Faibussowitsch {
71264fc91eeSBarry Smith   PetscFunctionBegin;
71364fc91eeSBarry Smith   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
71464fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj, flg, 2);
71564fc91eeSBarry Smith   tj->keepfiles = flg;
7163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
71764fc91eeSBarry Smith }
71864fc91eeSBarry Smith 
719db901c5bSHong Zhang /*@C
720bcf0153eSBarry Smith    TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored.
72164e38db7SHong Zhang 
722c3339decSBarry Smith    Collective
72364e38db7SHong Zhang 
7244165533cSJose E. Roman    Input Parameters:
725bcf0153eSBarry Smith +  tj      - the `TSTrajectory` context
72664e38db7SHong Zhang -  dirname - the directory name
72764e38db7SHong Zhang 
728bcf0153eSBarry Smith    Options Database Key:
72964e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
73064e38db7SHong Zhang 
73164e38db7SHong Zhang    Level: developer
73264e38db7SHong Zhang 
733bcf0153eSBarry Smith    Notes:
734bcf0153eSBarry Smith     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()`
735bcf0153eSBarry Smith 
736bcf0153eSBarry Smith    If this is not called `TSTrajectory` selects a unique new name for the directory
737bcf0153eSBarry Smith 
738bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73964e38db7SHong Zhang @*/
740d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[])
741d71ae5a4SJacob Faibussowitsch {
742a17281aeSStefano Zampini   PetscBool flg;
743a17281aeSStefano Zampini 
74464e38db7SHong Zhang   PetscFunctionBegin;
74564e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7469566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
747049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7489566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7499566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname, &tj->dirname));
7503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
75164e38db7SHong Zhang }
75264e38db7SHong Zhang 
753db901c5bSHong Zhang /*@C
754bcf0153eSBarry Smith    TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints.
75564e38db7SHong Zhang 
756c3339decSBarry Smith    Collective
75764e38db7SHong Zhang 
7584165533cSJose E. Roman    Input Parameters:
759bcf0153eSBarry Smith +  tj      - the `TSTrajectory` context
7601585b412SBarry Smith -  filetemplate - the template
76164e38db7SHong Zhang 
762bcf0153eSBarry Smith    Options Database Key:
7631585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7641585b412SBarry Smith 
765bcf0153eSBarry Smith    Level: developer
766bcf0153eSBarry Smith 
76795452b02SPatrick Sanan    Notes:
76863a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7691585b412SBarry Smith 
770bcf0153eSBarry 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
7711585b412SBarry Smith    timestep counter
77264e38db7SHong Zhang 
773bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
77464e38db7SHong Zhang @*/
775d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[])
776d71ae5a4SJacob Faibussowitsch {
777bbcf679cSJacob Faibussowitsch   const char *ptr = NULL, *ptr2 = NULL;
7789afe7f3eSBarry Smith 
77964e38db7SHong Zhang   PetscFunctionBegin;
78064e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
78163a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(filetemplate, 2);
7823c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7839afe7f3eSBarry Smith 
78463a3b9bcSJacob 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");
7859afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7869566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
78763a3b9bcSJacob 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");
7889afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
78963a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
79063a3b9bcSJacob 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");
7919afe7f3eSBarry Smith     if (ptr2) break;
7929afe7f3eSBarry Smith   }
7939566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7949566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
7953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
79664e38db7SHong Zhang }
79764e38db7SHong Zhang 
79864e38db7SHong Zhang /*@
799bcf0153eSBarry Smith    TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options.
800bc952696SBarry Smith 
801c3339decSBarry Smith    Collective
802bc952696SBarry Smith 
803d8d19677SJose E. Roman    Input Parameters:
804bcf0153eSBarry Smith +  tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
805bcf0153eSBarry Smith -  ts - the `TS` context
806bc952696SBarry Smith 
807bc952696SBarry Smith    Options Database Keys:
808bcf0153eSBarry Smith +  -ts_trajectory_type <type> - basic, memory, singlefile, visualization
809bcf0153eSBarry 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
810bcf0153eSBarry Smith -  -ts_trajectory_monitor - print `TSTrajectory` information
811bc952696SBarry Smith 
812df5474d8SHong Zhang    Level: developer
813bc952696SBarry Smith 
814bcf0153eSBarry Smith    Note:
81595452b02SPatrick Sanan     This is not normally called directly by users
816bc952696SBarry Smith 
817bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
818bc952696SBarry Smith @*/
819d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts)
820d71ae5a4SJacob Faibussowitsch {
821ed695a29SHong Zhang   PetscBool set, flg;
82264e38db7SHong Zhang   char      dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
823bc952696SBarry Smith 
824bc952696SBarry Smith   PetscFunctionBegin;
825b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
826fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
827d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8289566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
8299566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8319566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8329566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8339566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8349566063dSJacob 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));
8359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8369566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8379566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
83864e38db7SHong Zhang 
8399566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8401baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
84164e38db7SHong Zhang 
84263a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8431baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
84464e38db7SHong Zhang 
84564e38db7SHong Zhang   /* Handle specific TSTrajectory options */
846dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
847d0609cedSBarry Smith   PetscOptionsEnd();
8483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
849bc952696SBarry Smith }
85068bece0bSHong Zhang 
85168bece0bSHong Zhang /*@
85268bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
853bcf0153eSBarry Smith    of a `TS` `TSTrajectory`.
85468bece0bSHong Zhang 
855c3339decSBarry Smith    Collective
85668bece0bSHong Zhang 
857d8d19677SJose E. Roman    Input Parameters:
858bcf0153eSBarry Smith +  tj - the `TSTrajectory` context
859bcf0153eSBarry Smith -  ts - the TS context obtained from `TSCreate()`
86068bece0bSHong Zhang 
861df5474d8SHong Zhang    Level: developer
86268bece0bSHong Zhang 
863bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
86468bece0bSHong Zhang @*/
865d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts)
866d71ae5a4SJacob Faibussowitsch {
8679afe7f3eSBarry Smith   size_t s1, s2;
86868bece0bSHong Zhang 
86968bece0bSHong Zhang   PetscFunctionBegin;
8703ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
87168bece0bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
872fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
8733ba16761SJacob Faibussowitsch   if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
87468bece0bSHong Zhang 
8759566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
87648a46eb9SPierre Jolivet   if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
877dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setup, ts);
87868bece0bSHong Zhang 
87968bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
88053b27ddbSHong Zhang 
88153b27ddbSHong Zhang   /* Set the counters to zero */
8821a5a771fSHong Zhang   tj->recomps    = 0;
88353b27ddbSHong Zhang   tj->diskreads  = 0;
88453b27ddbSHong Zhang   tj->diskwrites = 0;
8859566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname, &s1));
8869566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate, &s2));
8879566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8889566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8899566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8909566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
8913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
89268bece0bSHong Zhang }
893fe8322adSStefano Zampini 
894fe8322adSStefano Zampini /*@
895bcf0153eSBarry Smith    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information
896fe8322adSStefano Zampini 
897c3339decSBarry Smith    Collective
898fe8322adSStefano Zampini 
899d8d19677SJose E. Roman    Input Parameters:
900bcf0153eSBarry Smith +  tj  - the `TSTrajectory` context obtained with `TSGetTrajectory()`
901fe8322adSStefano Zampini -  flg - the boolean flag
902fe8322adSStefano Zampini 
903fe8322adSStefano Zampini    Level: developer
904fe8322adSStefano Zampini 
905bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
906fe8322adSStefano Zampini @*/
907d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only)
908d71ae5a4SJacob Faibussowitsch {
909fe8322adSStefano Zampini   PetscFunctionBegin;
910fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
911fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj, solution_only, 2);
912fe8322adSStefano Zampini   tj->solution_only = solution_only;
9133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
914fe8322adSStefano Zampini }
915fe8322adSStefano Zampini 
916fe8322adSStefano Zampini /*@
917bcf0153eSBarry Smith    TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`.
918fe8322adSStefano Zampini 
919*20f4b53cSBarry Smith    Logically Collective
920fe8322adSStefano Zampini 
921fe8322adSStefano Zampini    Input Parameter:
922bcf0153eSBarry Smith .  tj  - the `TSTrajectory` context
923fe8322adSStefano Zampini 
924fe8322adSStefano Zampini    Output Parameter:
925d8d19677SJose E. Roman .  flg - the boolean flag
926fe8322adSStefano Zampini 
927fe8322adSStefano Zampini    Level: developer
928fe8322adSStefano Zampini 
929bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
930fe8322adSStefano Zampini @*/
931d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only)
932d71ae5a4SJacob Faibussowitsch {
933fe8322adSStefano Zampini   PetscFunctionBegin;
934fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
935dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only, 2);
936fe8322adSStefano Zampini   *solution_only = tj->solution_only;
9373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
938fe8322adSStefano Zampini }
939fe8322adSStefano Zampini 
940fe8322adSStefano Zampini /*@
941fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
942fe8322adSStefano Zampini 
943c3339decSBarry Smith    Collective
944fe8322adSStefano Zampini 
945d8d19677SJose E. Roman    Input Parameters:
946bcf0153eSBarry Smith +  tj   - the `TSTrajectory` context
947bcf0153eSBarry Smith .  ts   - the `TS` solver context
948fe8322adSStefano Zampini -  time - the requested time
949fe8322adSStefano Zampini 
950d8d19677SJose E. Roman    Output Parameters:
951fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
952fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
953fe8322adSStefano Zampini 
954fe8322adSStefano Zampini    Level: developer
955fe8322adSStefano Zampini 
956bcf0153eSBarry Smith    Notes:
957bcf0153eSBarry Smith    The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector.
958fe8322adSStefano Zampini 
959bcf0153eSBarry Smith    This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by
960bcf0153eSBarry Smith    calling `TSTrajectoryRestoreUpdatedHistoryVecs()`.
961bcf0153eSBarry Smith 
962bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
963fe8322adSStefano Zampini @*/
964d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
965d71ae5a4SJacob Faibussowitsch {
966fe8322adSStefano Zampini   PetscFunctionBegin;
967fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
968fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
969fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 3);
970fe8322adSStefano Zampini   if (U) PetscValidPointer(U, 4);
971fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot, 5);
972fe8322adSStefano Zampini   if (U && !tj->U) {
973fe8322adSStefano Zampini     DM dm;
974fe8322adSStefano Zampini 
9759566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9769566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->U));
977fe8322adSStefano Zampini   }
978fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
979fe8322adSStefano Zampini     DM dm;
980fe8322adSStefano Zampini 
9819566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9829566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
983fe8322adSStefano Zampini   }
9849566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
985fe8322adSStefano Zampini   if (U) {
9869566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
987fe8322adSStefano Zampini     *U = tj->U;
988fe8322adSStefano Zampini   }
989fe8322adSStefano Zampini   if (Udot) {
9909566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
991fe8322adSStefano Zampini     *Udot = tj->Udot;
992fe8322adSStefano Zampini   }
9933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
994fe8322adSStefano Zampini }
995fe8322adSStefano Zampini 
996fe8322adSStefano Zampini /*@
997bcf0153eSBarry Smith    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`.
998fe8322adSStefano Zampini 
999c3339decSBarry Smith    Collective
1000fe8322adSStefano Zampini 
1001d8d19677SJose E. Roman    Input Parameters:
1002bcf0153eSBarry Smith +  tj   - the `TSTrajectory` context
1003fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1004fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1005fe8322adSStefano Zampini 
1006fe8322adSStefano Zampini    Level: developer
1007fe8322adSStefano Zampini 
1008bcf0153eSBarry Smith .seealso: [](chapter_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()`
1009fe8322adSStefano Zampini @*/
1010d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1011d71ae5a4SJacob Faibussowitsch {
1012fe8322adSStefano Zampini   PetscFunctionBegin;
1013fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
1014fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
1015fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
10163c633725SBarry Smith   PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10173c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1018fe8322adSStefano Zampini   if (U) {
10199566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1020fe8322adSStefano Zampini     *U = NULL;
1021fe8322adSStefano Zampini   }
1022fe8322adSStefano Zampini   if (Udot) {
10239566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1024fe8322adSStefano Zampini     *Udot = NULL;
1025fe8322adSStefano Zampini   }
10263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1027fe8322adSStefano Zampini }
1028