xref: /petsc/src/ts/trajectory/interface/traj.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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
11bc952696SBarry 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 
19bc952696SBarry Smith   Notes:
20bc952696SBarry Smith   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
21bc952696SBarry Smith 
22df5474d8SHong Zhang   Level: developer
23bc952696SBarry Smith 
24db781477SPatrick Sanan .seealso: `TSTrajectoryRegisterAll()`
25bc952696SBarry Smith @*/
269371c9d4SSatish Balay PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS)) {
27bc952696SBarry Smith   PetscFunctionBegin;
289566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function));
29bc952696SBarry Smith   PetscFunctionReturn(0);
30bc952696SBarry Smith }
31bc952696SBarry Smith 
32fe8322adSStefano Zampini /*@
33fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
34fe8322adSStefano Zampini 
35fe8322adSStefano Zampini   Collective on TSTrajectory
36fe8322adSStefano Zampini 
37fe8322adSStefano Zampini   Input Parameters:
38fe8322adSStefano Zampini + tj      - the trajectory object
39fe8322adSStefano Zampini . ts      - the time stepper object (optional)
40fe8322adSStefano Zampini . stepnum - the step number
41fe8322adSStefano Zampini . time    - the current time
42fe8322adSStefano Zampini - X       - the current solution
43fe8322adSStefano Zampini 
44fe8322adSStefano Zampini   Level: developer
45fe8322adSStefano Zampini 
46fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
47fe8322adSStefano Zampini 
48db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()`
49fe8322adSStefano Zampini @*/
509371c9d4SSatish Balay PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X) {
51bc952696SBarry Smith   PetscFunctionBegin;
52bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
53fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
54fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
55fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
56fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 4);
57fe8322adSStefano Zampini   PetscValidHeaderSpecific(X, VEC_CLASSID, 5);
583c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
59*48a46eb9SPierre 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));
609566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0));
61dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, set, ts, stepnum, time, X);
629566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0));
631baa6e33SBarry Smith   if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time));
64fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
65bc952696SBarry Smith   PetscFunctionReturn(0);
66bc952696SBarry Smith }
67bc952696SBarry Smith 
68fe8322adSStefano Zampini /*@
69fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
70fe8322adSStefano Zampini 
71fe8322adSStefano Zampini   Not collective.
72fe8322adSStefano Zampini 
73fe8322adSStefano Zampini   Input Parameters:
74fe8322adSStefano Zampini . tj - the trajectory object
75fe8322adSStefano Zampini 
76fe8322adSStefano Zampini   Output Parameter:
77fe8322adSStefano Zampini . steps - the number of steps
78fe8322adSStefano Zampini 
79fe8322adSStefano Zampini   Level: developer
80fe8322adSStefano Zampini 
81db781477SPatrick Sanan .seealso: `TSTrajectorySet()`
82fe8322adSStefano Zampini @*/
839371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) {
84fe8322adSStefano Zampini   PetscFunctionBegin;
85fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
86fe8322adSStefano Zampini   PetscValidIntPointer(steps, 2);
879566063dSJacob Faibussowitsch   PetscCall(TSHistoryGetNumSteps(tj->tsh, steps));
88fe8322adSStefano Zampini   PetscFunctionReturn(0);
89fe8322adSStefano Zampini }
90fe8322adSStefano Zampini 
91fe8322adSStefano Zampini /*@
92fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
93fe8322adSStefano Zampini 
94fe8322adSStefano Zampini   Collective on TS
95fe8322adSStefano Zampini 
96fe8322adSStefano Zampini   Input Parameters:
97fe8322adSStefano Zampini + tj      - the trajectory object
98fe8322adSStefano Zampini . ts      - the time stepper object
99fe8322adSStefano Zampini - stepnum - the step number
100fe8322adSStefano Zampini 
101fe8322adSStefano Zampini   Output Parameter:
102fe8322adSStefano Zampini . time    - the time associated with the step number
103fe8322adSStefano Zampini 
104fe8322adSStefano Zampini   Level: developer
105fe8322adSStefano Zampini 
106fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
107fe8322adSStefano Zampini 
108db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
109fe8322adSStefano Zampini @*/
1109371c9d4SSatish Balay PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time) {
111bc952696SBarry Smith   PetscFunctionBegin;
1123c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
113fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
114fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
115fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
116dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
1173c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1183c633725SBarry Smith   PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number");
119fe8322adSStefano Zampini   if (tj->monitor) {
12063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only));
1219566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
122fe8322adSStefano Zampini   }
1239566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0));
124dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, get, ts, stepnum, time);
1259566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0));
126bc952696SBarry Smith   PetscFunctionReturn(0);
127bc952696SBarry Smith }
128bc952696SBarry Smith 
129fe8322adSStefano Zampini /*@
130fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
131fe8322adSStefano Zampini 
132fe8322adSStefano Zampini   Collective on TS
133fe8322adSStefano Zampini 
134fe8322adSStefano Zampini   Input Parameters:
135fe8322adSStefano Zampini + tj      - the trajectory object
136fe8322adSStefano Zampini . ts      - the time stepper object (optional)
137fe8322adSStefano Zampini - stepnum - the requested step number
138fe8322adSStefano Zampini 
1396b867d5aSJose E. Roman   Input/Output Parameter:
140fe8322adSStefano Zampini 
141fe8322adSStefano Zampini   Output Parameters:
142f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number
143f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
144fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
145fe8322adSStefano Zampini 
146fe8322adSStefano Zampini   Level: developer
147fe8322adSStefano Zampini 
148fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
149fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
150fe8322adSStefano Zampini 
151db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
152fe8322adSStefano Zampini @*/
1539371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot) {
154fe8322adSStefano Zampini   PetscFunctionBegin;
1553c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
156fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
157fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
158fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
159dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
160fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5);
161fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6);
162fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
1633c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1649566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0));
165fe8322adSStefano Zampini   if (tj->monitor) {
166fe8322adSStefano Zampini     PetscInt pU, pUdot;
167fe8322adSStefano Zampini     pU    = U ? 1 : 0;
168fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
16963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time));
1709566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
171fe8322adSStefano Zampini   }
172fe8322adSStefano Zampini   if (U && tj->lag.caching) {
173fe8322adSStefano Zampini     PetscObjectId    id;
174fe8322adSStefano Zampini     PetscObjectState state;
175fe8322adSStefano Zampini 
1769566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &state));
1779566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &id));
178fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
179fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
180fe8322adSStefano Zampini     } else {
181fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
182fe8322adSStefano Zampini     }
183fe8322adSStefano Zampini     if (tj->monitor && !U) {
1849566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1859566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n"));
1869566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1879566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
188fe8322adSStefano Zampini     }
189fe8322adSStefano Zampini   }
190fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
191fe8322adSStefano Zampini     PetscObjectId    id;
192fe8322adSStefano Zampini     PetscObjectState state;
193fe8322adSStefano Zampini 
1949566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot, &state));
1959566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot, &id));
196fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
197fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
198fe8322adSStefano Zampini     } else {
199fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
200fe8322adSStefano Zampini     }
201fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2029566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2039566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n"));
2049566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2059566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
206fe8322adSStefano Zampini     }
207fe8322adSStefano Zampini   }
208fe8322adSStefano Zampini   if (!U && !Udot) {
2099566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
210fe8322adSStefano Zampini     PetscFunctionReturn(0);
211fe8322adSStefano Zampini   }
212fe8322adSStefano Zampini 
213fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2141baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
215fe8322adSStefano Zampini     /* cached states will be updated in the function */
2169566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot));
217fe8322adSStefano Zampini     if (tj->monitor) {
2189566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2199566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
220fe8322adSStefano Zampini     }
221fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
222fe8322adSStefano Zampini     TS  fakets = ts;
223fe8322adSStefano Zampini     Vec U2;
224fe8322adSStefano Zampini 
225fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
226fe8322adSStefano Zampini     if (!ts) {
2279566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets));
228fe8322adSStefano Zampini       if (!fakets) {
2299566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets));
2309566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets));
2319566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2329566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U, &U2));
2339566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets, U2));
2349566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
235fe8322adSStefano Zampini       }
236fe8322adSStefano Zampini     }
2379566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time));
2389566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets, &U2));
2399566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2, U));
2409566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state));
2419566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id));
242fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
243fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
244fe8322adSStefano Zampini   }
2459566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
246fe8322adSStefano Zampini   PetscFunctionReturn(0);
247fe8322adSStefano Zampini }
248fe8322adSStefano Zampini 
249bc952696SBarry Smith /*@C
250fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
251fe2efc57SMark 
252fe2efc57SMark    Collective on TSTrajectory
253fe2efc57SMark 
254fe2efc57SMark    Input Parameters:
255fe2efc57SMark +  A - the TSTrajectory context
256736c3998SJose E. Roman .  obj - Optional object
257736c3998SJose E. Roman -  name - command line option
258fe2efc57SMark 
259fe2efc57SMark    Level: intermediate
260db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
261fe2efc57SMark @*/
2629371c9d4SSatish Balay PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[]) {
263fe2efc57SMark   PetscFunctionBegin;
264fe2efc57SMark   PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1);
2659566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
266fe2efc57SMark   PetscFunctionReturn(0);
267fe2efc57SMark }
268fe2efc57SMark 
269fe2efc57SMark /*@C
270bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
271bc952696SBarry Smith 
272bc952696SBarry Smith     Collective on TSTrajectory
273bc952696SBarry Smith 
274bc952696SBarry Smith     Input Parameters:
275b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
276bc952696SBarry Smith -   viewer - visualization context
277bc952696SBarry Smith 
278bc952696SBarry Smith     Options Database Key:
279e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
280bc952696SBarry Smith 
281bc952696SBarry Smith     Notes:
282bc952696SBarry Smith     The available visualization contexts include
283bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
284bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
285bc952696SBarry Smith          output where only the first processor opens
286bc952696SBarry Smith          the file.  All other processors send their
287bc952696SBarry Smith          data to the first processor to print.
288bc952696SBarry Smith 
289bc952696SBarry Smith     The user can open an alternative visualization context with
290bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
291bc952696SBarry Smith 
292df5474d8SHong Zhang     Level: developer
293bc952696SBarry Smith 
294db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`
295bc952696SBarry Smith @*/
2969371c9d4SSatish Balay PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer) {
297bc952696SBarry Smith   PetscBool iascii;
298bc952696SBarry Smith 
299bc952696SBarry Smith   PetscFunctionBegin;
3001a5a771fSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
301*48a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer));
302bc952696SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
303b1d74d50SHong Zhang   PetscCheckSameComm(tj, 1, viewer, 2);
304bc952696SBarry Smith 
3059566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
306bc952696SBarry Smith   if (iascii) {
3079566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer));
30863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps));
30963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads));
31063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites));
3119566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
312dbbe0bcdSBarry Smith     PetscTryTypeMethod(tj, view, viewer);
3139566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
314bc952696SBarry Smith   }
315bc952696SBarry Smith   PetscFunctionReturn(0);
316bc952696SBarry Smith }
317bc952696SBarry Smith 
318bc952696SBarry Smith /*@C
31978fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
32078fbdcc8SBarry Smith 
32178fbdcc8SBarry Smith    Collective on TSTrajectory
32278fbdcc8SBarry Smith 
32378fbdcc8SBarry Smith    Input Parameters:
32478fbdcc8SBarry Smith +  tr - the trajectory context
32578fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
32678fbdcc8SBarry Smith 
32778fbdcc8SBarry Smith    Level: intermediate
32878fbdcc8SBarry Smith 
329db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
330db901c5bSHong Zhang 
331db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()`
33278fbdcc8SBarry Smith @*/
3339371c9d4SSatish Balay PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names) {
33478fbdcc8SBarry Smith   PetscFunctionBegin;
335fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1);
336fe8322adSStefano Zampini   PetscValidPointer(names, 2);
3379566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3389566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names, &ctx->names));
33978fbdcc8SBarry Smith   PetscFunctionReturn(0);
34078fbdcc8SBarry Smith }
34178fbdcc8SBarry Smith 
34278fbdcc8SBarry Smith /*@C
343fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
34408347785SBarry Smith 
34508347785SBarry Smith    Collective on TSLGCtx
34608347785SBarry Smith 
34708347785SBarry Smith    Input Parameters:
34808347785SBarry Smith +  tj - the TSTrajectory context
34908347785SBarry Smith .  transform - the transform function
35008347785SBarry Smith .  destroy - function to destroy the optional context
35108347785SBarry Smith -  ctx - optional context used by transform function
35208347785SBarry Smith 
35308347785SBarry Smith    Level: intermediate
35408347785SBarry Smith 
355db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
35608347785SBarry Smith @*/
3579371c9d4SSatish Balay PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx) {
35808347785SBarry Smith   PetscFunctionBegin;
359fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
36008347785SBarry Smith   tj->transform        = transform;
36108347785SBarry Smith   tj->transformdestroy = destroy;
36208347785SBarry Smith   tj->transformctx     = tctx;
36308347785SBarry Smith   PetscFunctionReturn(0);
36408347785SBarry Smith }
36508347785SBarry Smith 
366db901c5bSHong Zhang /*@
367bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
368bc952696SBarry Smith 
369d083f849SBarry Smith   Collective
370bc952696SBarry Smith 
371bc952696SBarry Smith   Input Parameter:
3723c0fce88SHong Zhang . comm - the communicator
373bc952696SBarry Smith 
374bc952696SBarry Smith   Output Parameter:
3753c0fce88SHong Zhang . tj   - the trajectory object
376bc952696SBarry Smith 
377df5474d8SHong Zhang   Level: developer
378bc952696SBarry Smith 
37995452b02SPatrick Sanan   Notes:
38095452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
381bc952696SBarry Smith 
382db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
383bc952696SBarry Smith @*/
3849371c9d4SSatish Balay PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj) {
385bc952696SBarry Smith   TSTrajectory t;
386bc952696SBarry Smith 
387bc952696SBarry Smith   PetscFunctionBegin;
388b1d74d50SHong Zhang   PetscValidPointer(tj, 2);
389b1d74d50SHong Zhang   *tj = NULL;
3909566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
391bc952696SBarry Smith 
3929566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
39368bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
3949566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm, &t->tsh));
395fe8322adSStefano Zampini 
396fe8322adSStefano Zampini   t->lag.order            = 1;
397fe8322adSStefano Zampini   t->lag.L                = NULL;
398fe8322adSStefano Zampini   t->lag.T                = NULL;
399fe8322adSStefano Zampini   t->lag.W                = NULL;
400fe8322adSStefano Zampini   t->lag.WW               = NULL;
401fe8322adSStefano Zampini   t->lag.TW               = NULL;
402fe8322adSStefano Zampini   t->lag.TT               = NULL;
403fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
404fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
405fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
406fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
407fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
408fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
409fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
410fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
411fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
412fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
413fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
414fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
415ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
416b1d74d50SHong Zhang   *tj                     = t;
41763a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
418bc952696SBarry Smith   PetscFunctionReturn(0);
419bc952696SBarry Smith }
420bc952696SBarry Smith 
421bc952696SBarry Smith /*@C
422bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
423bc952696SBarry Smith 
424bc952696SBarry Smith   Collective on TS
425bc952696SBarry Smith 
426bc952696SBarry Smith   Input Parameters:
4273c0fce88SHong Zhang + tj   - the TSTrajectory context
4283c0fce88SHong Zhang . ts   - the TS context
4293c0fce88SHong Zhang - type - a known method
430bc952696SBarry Smith 
431bc952696SBarry Smith   Options Database Command:
432e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
433bc952696SBarry Smith 
434df5474d8SHong Zhang    Level: developer
435bc952696SBarry Smith 
436db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
437bc952696SBarry Smith 
438bc952696SBarry Smith @*/
4399371c9d4SSatish Balay PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type) {
440972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory, TS);
441bc952696SBarry Smith   PetscBool match;
442bc952696SBarry Smith 
443bc952696SBarry Smith   PetscFunctionBegin;
444972caf09SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4459566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
446bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
447bc952696SBarry Smith 
4489566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4493c633725SBarry Smith   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
450972caf09SHong Zhang   if (tj->ops->destroy) {
4519566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
452bc952696SBarry Smith 
453972caf09SHong Zhang     tj->ops->destroy = NULL;
454bc952696SBarry Smith   }
4559566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
456bc952696SBarry Smith 
4579566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4589566063dSJacob Faibussowitsch   PetscCall((*r)(tj, ts));
459bc952696SBarry Smith   PetscFunctionReturn(0);
460bc952696SBarry Smith }
461bc952696SBarry Smith 
462881c1a9bSHong Zhang /*@C
463881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
464881c1a9bSHong Zhang 
465881c1a9bSHong Zhang   Collective on TS
466881c1a9bSHong Zhang 
467881c1a9bSHong Zhang   Input Parameters:
468881c1a9bSHong Zhang + tj   - the TSTrajectory context
469881c1a9bSHong Zhang - ts   - the TS context
470881c1a9bSHong Zhang 
471881c1a9bSHong Zhang   Output Parameters:
472881c1a9bSHong Zhang . type - a known method
473881c1a9bSHong Zhang 
474881c1a9bSHong Zhang   Level: developer
475881c1a9bSHong Zhang 
476db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
477881c1a9bSHong Zhang 
478881c1a9bSHong Zhang @*/
4799371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type) {
480881c1a9bSHong Zhang   PetscFunctionBegin;
481881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
482881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
483881c1a9bSHong Zhang   PetscFunctionReturn(0);
484881c1a9bSHong Zhang }
485881c1a9bSHong Zhang 
486972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
487972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
4889a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
4892b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
490bc952696SBarry Smith 
491bc952696SBarry Smith /*@C
492bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
493bc952696SBarry Smith 
494bc952696SBarry Smith   Not Collective
495bc952696SBarry Smith 
496df5474d8SHong Zhang   Level: developer
497bc952696SBarry Smith 
498db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()`
499bc952696SBarry Smith @*/
5009371c9d4SSatish Balay PetscErrorCode TSTrajectoryRegisterAll(void) {
501bc952696SBarry Smith   PetscFunctionBegin;
502560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
503bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
504bc952696SBarry Smith 
5059566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5069566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5079566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5089566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
509bc952696SBarry Smith   PetscFunctionReturn(0);
510bc952696SBarry Smith }
511bc952696SBarry Smith 
512bc952696SBarry Smith /*@
5131550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5141550c9b9SHong Zhang 
5151550c9b9SHong Zhang    Collective on TSTrajectory
5161550c9b9SHong Zhang 
5171550c9b9SHong Zhang    Input Parameter:
5181550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5191550c9b9SHong Zhang 
5201550c9b9SHong Zhang    Level: developer
5211550c9b9SHong Zhang 
522db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5231550c9b9SHong Zhang @*/
5249371c9d4SSatish Balay PetscErrorCode TSTrajectoryReset(TSTrajectory tj) {
5251550c9b9SHong Zhang   PetscFunctionBegin;
5269a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5279a992471SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
528dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, reset);
5299566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5309566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5319566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
532fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5331550c9b9SHong Zhang   PetscFunctionReturn(0);
5341550c9b9SHong Zhang }
5351550c9b9SHong Zhang 
5361550c9b9SHong Zhang /*@
537bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
538bc952696SBarry Smith 
539bc952696SBarry Smith    Collective on TSTrajectory
540bc952696SBarry Smith 
541bc952696SBarry Smith    Input Parameter:
5423c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
543bc952696SBarry Smith 
544df5474d8SHong Zhang    Level: developer
545bc952696SBarry Smith 
546db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
547bc952696SBarry Smith @*/
5489371c9d4SSatish Balay PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) {
549bc952696SBarry Smith   PetscFunctionBegin;
550972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
551972caf09SHong Zhang   PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1);
5529371c9d4SSatish Balay   if (--((PetscObject)(*tj))->refct > 0) {
5539371c9d4SSatish Balay     *tj = NULL;
5549371c9d4SSatish Balay     PetscFunctionReturn(0);
5559371c9d4SSatish Balay   }
556bc952696SBarry Smith 
5579566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5589566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5599566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5609566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5619566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5629566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5639a992471SHong Zhang 
5649566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
565dbbe0bcdSBarry Smith   PetscTryTypeMethod((*tj), destroy);
566fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
567fe8322adSStefano Zampini     PetscMPIInt rank;
568fe8322adSStefano Zampini     MPI_Comm    comm;
569fe8322adSStefano Zampini 
5709566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm));
5719566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
572dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5739566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
574fe8322adSStefano Zampini     }
575fe8322adSStefano Zampini   }
5769566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5779566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5789566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5799566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
580bc952696SBarry Smith   PetscFunctionReturn(0);
581bc952696SBarry Smith }
582bc952696SBarry Smith 
583bc952696SBarry Smith /*
584772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
585bc952696SBarry Smith 
586bc952696SBarry Smith   Collective on TSTrajectory
587bc952696SBarry Smith 
588bc952696SBarry Smith   Input Parameter:
5893c0fce88SHong Zhang + tj - the TSTrajectory context
5903c0fce88SHong Zhang - ts - the TS context
5913c0fce88SHong Zhang 
5923c0fce88SHong Zhang   Options Database Keys:
5933c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
594bc952696SBarry Smith 
595df5474d8SHong Zhang   Level: developer
596bc952696SBarry Smith 
597db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
598bc952696SBarry Smith */
5999371c9d4SSatish Balay static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts) {
600bc952696SBarry Smith   PetscBool   opt;
601bc952696SBarry Smith   const char *defaultType;
602bc952696SBarry Smith   char        typeName[256];
603bc952696SBarry Smith 
604bc952696SBarry Smith   PetscFunctionBegin;
605b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
606bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
607bc952696SBarry Smith 
6089566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
610bc952696SBarry Smith   if (opt) {
6119566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, typeName));
612bc952696SBarry Smith   } else {
6139566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, defaultType));
614bc952696SBarry Smith   }
615bc952696SBarry Smith   PetscFunctionReturn(0);
616bc952696SBarry Smith }
617bc952696SBarry Smith 
618ed695a29SHong Zhang /*@
6199ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6209ffb3502SHong Zhang 
6219ffb3502SHong Zhang    Collective on TSTrajectory
6229ffb3502SHong Zhang 
6234165533cSJose E. Roman    Input Parameters:
6249ffb3502SHong Zhang +  tj - the TSTrajectory context
6259ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6269ffb3502SHong Zhang 
6279ffb3502SHong Zhang    Options Database Keys:
6289ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6299ffb3502SHong Zhang 
6309ffb3502SHong Zhang    Level: advanced
6319ffb3502SHong Zhang 
632db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6339ffb3502SHong Zhang @*/
6349371c9d4SSatish Balay PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg) {
6359ffb3502SHong Zhang   PetscFunctionBegin;
6369ffb3502SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6379ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
6389ffb3502SHong Zhang   tj->usehistory = flg;
6399ffb3502SHong Zhang   PetscFunctionReturn(0);
6409ffb3502SHong Zhang }
6419ffb3502SHong Zhang 
6429ffb3502SHong Zhang /*@
643ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
644ed695a29SHong Zhang 
645ed695a29SHong Zhang    Collective on TSTrajectory
646ed695a29SHong Zhang 
6474165533cSJose E. Roman    Input Parameters:
648ed695a29SHong Zhang +  tj - the TSTrajectory context
649ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
650ed695a29SHong Zhang 
6513c0fce88SHong Zhang    Options Database Keys:
652063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6533c0fce88SHong Zhang 
654df5474d8SHong Zhang    Level: developer
655ed695a29SHong Zhang 
656db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
657ed695a29SHong Zhang @*/
6589371c9d4SSatish Balay PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg) {
659ed695a29SHong Zhang   PetscFunctionBegin;
660ed695a29SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
661ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
662fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
663fe8322adSStefano Zampini   else tj->monitor = NULL;
664ed695a29SHong Zhang   PetscFunctionReturn(0);
665ed695a29SHong Zhang }
666ed695a29SHong Zhang 
667bc952696SBarry Smith /*@
66864fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
66964fc91eeSBarry Smith 
67064fc91eeSBarry Smith    Collective on TSTrajectory
67164fc91eeSBarry Smith 
6724165533cSJose E. Roman    Input Parameters:
67364fc91eeSBarry Smith +  tj - the TSTrajectory context
67464fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
67564fc91eeSBarry Smith 
67664fc91eeSBarry Smith    Options Database Keys:
67764fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
67864fc91eeSBarry Smith 
67995452b02SPatrick Sanan    Notes:
68095452b02SPatrick Sanan     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.
68164fc91eeSBarry Smith 
68264fc91eeSBarry Smith    Level: advanced
68364fc91eeSBarry Smith 
684db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
68564fc91eeSBarry Smith @*/
6869371c9d4SSatish Balay PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg) {
68764fc91eeSBarry Smith   PetscFunctionBegin;
68864fc91eeSBarry Smith   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
68964fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj, flg, 2);
69064fc91eeSBarry Smith   tj->keepfiles = flg;
69164fc91eeSBarry Smith   PetscFunctionReturn(0);
69264fc91eeSBarry Smith }
69364fc91eeSBarry Smith 
694db901c5bSHong Zhang /*@C
69564e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
69664e38db7SHong Zhang 
69764e38db7SHong Zhang    Collective on TSTrajectory
69864e38db7SHong Zhang 
6994165533cSJose E. Roman    Input Parameters:
70064e38db7SHong Zhang +  tj      - the TSTrajectory context
70164e38db7SHong Zhang -  dirname - the directory name
70264e38db7SHong Zhang 
70364e38db7SHong Zhang    Options Database Keys:
70464e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
70564e38db7SHong Zhang 
70695452b02SPatrick Sanan    Notes:
70795452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7081585b412SBarry Smith 
70964e38db7SHong Zhang    Level: developer
71064e38db7SHong Zhang 
711c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
71264e38db7SHong Zhang @*/
7139371c9d4SSatish Balay PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[]) {
714a17281aeSStefano Zampini   PetscBool flg;
715a17281aeSStefano Zampini 
71664e38db7SHong Zhang   PetscFunctionBegin;
71764e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7189566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
719049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7209566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7219566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname, &tj->dirname));
72264e38db7SHong Zhang   PetscFunctionReturn(0);
72364e38db7SHong Zhang }
72464e38db7SHong Zhang 
725db901c5bSHong Zhang /*@C
72664e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
72764e38db7SHong Zhang 
72864e38db7SHong Zhang    Collective on TSTrajectory
72964e38db7SHong Zhang 
7304165533cSJose E. Roman    Input Parameters:
73164e38db7SHong Zhang +  tj      - the TSTrajectory context
7321585b412SBarry Smith -  filetemplate - the template
73364e38db7SHong Zhang 
73464e38db7SHong Zhang    Options Database Keys:
7351585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7361585b412SBarry Smith 
73795452b02SPatrick Sanan    Notes:
73863a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7391585b412SBarry Smith 
74063a3b9bcSJacob Faibussowitsch    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
7411585b412SBarry Smith    timestep counter
74264e38db7SHong Zhang 
74364e38db7SHong Zhang    Level: developer
74464e38db7SHong Zhang 
745c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
74664e38db7SHong Zhang @*/
7479371c9d4SSatish Balay PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[]) {
7489afe7f3eSBarry Smith   const char *ptr, *ptr2;
7499afe7f3eSBarry Smith 
75064e38db7SHong Zhang   PetscFunctionBegin;
75164e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
75263a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(filetemplate, 2);
7533c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7549afe7f3eSBarry Smith 
75563a3b9bcSJacob 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");
7569afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7579566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
75863a3b9bcSJacob 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");
7599afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
76063a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
76163a3b9bcSJacob 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");
7629afe7f3eSBarry Smith     if (ptr2) break;
7639afe7f3eSBarry Smith   }
7649566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7659566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
76664e38db7SHong Zhang   PetscFunctionReturn(0);
76764e38db7SHong Zhang }
76864e38db7SHong Zhang 
76964e38db7SHong Zhang /*@
770bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
771bc952696SBarry Smith 
772bc952696SBarry Smith    Collective on TSTrajectory
773bc952696SBarry Smith 
774d8d19677SJose E. Roman    Input Parameters:
7753c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
7763c0fce88SHong Zhang -  ts - the TS context
777bc952696SBarry Smith 
778bc952696SBarry Smith    Options Database Keys:
7793c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
78064fc91eeSBarry Smith .  -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
781063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
782bc952696SBarry Smith 
783df5474d8SHong Zhang    Level: developer
784bc952696SBarry Smith 
78595452b02SPatrick Sanan    Notes:
78695452b02SPatrick Sanan     This is not normally called directly by users
787bc952696SBarry Smith 
788db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
789bc952696SBarry Smith @*/
7909371c9d4SSatish Balay PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts) {
791ed695a29SHong Zhang   PetscBool set, flg;
79264e38db7SHong Zhang   char      dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
793bc952696SBarry Smith 
794bc952696SBarry Smith   PetscFunctionBegin;
795b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
796fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
797d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
7989566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
7999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8009566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8019566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8029566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8039566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8049566063dSJacob 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));
8059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8069566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8079566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
80864e38db7SHong Zhang 
8099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8101baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
81164e38db7SHong Zhang 
81263a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8131baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
81464e38db7SHong Zhang 
81564e38db7SHong Zhang   /* Handle specific TSTrajectory options */
816dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
817d0609cedSBarry Smith   PetscOptionsEnd();
818bc952696SBarry Smith   PetscFunctionReturn(0);
819bc952696SBarry Smith }
82068bece0bSHong Zhang 
82168bece0bSHong Zhang /*@
82268bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
82368bece0bSHong Zhang    of a TS trajectory.
82468bece0bSHong Zhang 
82568bece0bSHong Zhang    Collective on TS
82668bece0bSHong Zhang 
827d8d19677SJose E. Roman    Input Parameters:
8283c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8293c0fce88SHong Zhang -  tj - the TS trajectory context
83068bece0bSHong Zhang 
831df5474d8SHong Zhang    Level: developer
83268bece0bSHong Zhang 
833db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
83468bece0bSHong Zhang @*/
8359371c9d4SSatish Balay PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts) {
8369afe7f3eSBarry Smith   size_t s1, s2;
83768bece0bSHong Zhang 
83868bece0bSHong Zhang   PetscFunctionBegin;
83968bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
84068bece0bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
841fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
84268bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
84368bece0bSHong Zhang 
8449566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
845*48a46eb9SPierre Jolivet   if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
846dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setup, ts);
84768bece0bSHong Zhang 
84868bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
84953b27ddbSHong Zhang 
85053b27ddbSHong Zhang   /* Set the counters to zero */
8511a5a771fSHong Zhang   tj->recomps    = 0;
85253b27ddbSHong Zhang   tj->diskreads  = 0;
85353b27ddbSHong Zhang   tj->diskwrites = 0;
8549566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname, &s1));
8559566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate, &s2));
8569566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8579566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8589566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8599566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
86068bece0bSHong Zhang   PetscFunctionReturn(0);
86168bece0bSHong Zhang }
862fe8322adSStefano Zampini 
863fe8322adSStefano Zampini /*@
864fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
865fe8322adSStefano Zampini 
866fe8322adSStefano Zampini    Collective on TSTrajectory
867fe8322adSStefano Zampini 
868d8d19677SJose E. Roman    Input Parameters:
869fe8322adSStefano Zampini +  tj  - the TS trajectory context
870fe8322adSStefano Zampini -  flg - the boolean flag
871fe8322adSStefano Zampini 
872fe8322adSStefano Zampini    Level: developer
873fe8322adSStefano Zampini 
874db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
875fe8322adSStefano Zampini @*/
8769371c9d4SSatish Balay PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only) {
877fe8322adSStefano Zampini   PetscFunctionBegin;
878fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
879fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj, solution_only, 2);
880fe8322adSStefano Zampini   tj->solution_only = solution_only;
881fe8322adSStefano Zampini   PetscFunctionReturn(0);
882fe8322adSStefano Zampini }
883fe8322adSStefano Zampini 
884fe8322adSStefano Zampini /*@
885fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
886fe8322adSStefano Zampini 
887fe8322adSStefano Zampini    Logically collective on TSTrajectory
888fe8322adSStefano Zampini 
889fe8322adSStefano Zampini    Input Parameter:
890fe8322adSStefano Zampini .  tj  - the TS trajectory context
891fe8322adSStefano Zampini 
892fe8322adSStefano Zampini    Output Parameter:
893d8d19677SJose E. Roman .  flg - the boolean flag
894fe8322adSStefano Zampini 
895fe8322adSStefano Zampini    Level: developer
896fe8322adSStefano Zampini 
897db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
898fe8322adSStefano Zampini @*/
8999371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only) {
900fe8322adSStefano Zampini   PetscFunctionBegin;
901fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
902dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only, 2);
903fe8322adSStefano Zampini   *solution_only = tj->solution_only;
904fe8322adSStefano Zampini   PetscFunctionReturn(0);
905fe8322adSStefano Zampini }
906fe8322adSStefano Zampini 
907fe8322adSStefano Zampini /*@
908fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
909fe8322adSStefano Zampini 
910fe8322adSStefano Zampini    Collective on TSTrajectory
911fe8322adSStefano Zampini 
912d8d19677SJose E. Roman    Input Parameters:
913fe8322adSStefano Zampini +  tj   - the TS trajectory context
914fe8322adSStefano Zampini .  ts   - the TS solver context
915fe8322adSStefano Zampini -  time - the requested time
916fe8322adSStefano Zampini 
917d8d19677SJose E. Roman    Output Parameters:
918fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
919fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
920fe8322adSStefano Zampini 
921fe8322adSStefano Zampini    Level: developer
922fe8322adSStefano Zampini 
923fe8322adSStefano Zampini    Notes: The vectors are interpolated if time does not match any time step stored in the TSTrajectory(). Pass NULL to not request a vector.
924fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
925fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
926fe8322adSStefano Zampini 
927db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
928fe8322adSStefano Zampini @*/
9299371c9d4SSatish Balay PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) {
930fe8322adSStefano Zampini   PetscFunctionBegin;
931fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
932fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
933fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 3);
934fe8322adSStefano Zampini   if (U) PetscValidPointer(U, 4);
935fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot, 5);
936fe8322adSStefano Zampini   if (U && !tj->U) {
937fe8322adSStefano Zampini     DM dm;
938fe8322adSStefano Zampini 
9399566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9409566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->U));
941fe8322adSStefano Zampini   }
942fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
943fe8322adSStefano Zampini     DM dm;
944fe8322adSStefano Zampini 
9459566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9469566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
947fe8322adSStefano Zampini   }
9489566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
949fe8322adSStefano Zampini   if (U) {
9509566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
951fe8322adSStefano Zampini     *U = tj->U;
952fe8322adSStefano Zampini   }
953fe8322adSStefano Zampini   if (Udot) {
9549566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
955fe8322adSStefano Zampini     *Udot = tj->Udot;
956fe8322adSStefano Zampini   }
957fe8322adSStefano Zampini   PetscFunctionReturn(0);
958fe8322adSStefano Zampini }
959fe8322adSStefano Zampini 
960fe8322adSStefano Zampini /*@
961fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
962fe8322adSStefano Zampini 
963fe8322adSStefano Zampini    Collective on TSTrajectory
964fe8322adSStefano Zampini 
965d8d19677SJose E. Roman    Input Parameters:
966fe8322adSStefano Zampini +  tj   - the TS trajectory context
967fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
968fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
969fe8322adSStefano Zampini 
970fe8322adSStefano Zampini    Level: developer
971fe8322adSStefano Zampini 
972db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()`
973fe8322adSStefano Zampini @*/
9749371c9d4SSatish Balay PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) {
975fe8322adSStefano Zampini   PetscFunctionBegin;
976fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
977fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
978fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
9793c633725SBarry Smith   PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
9803c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
981fe8322adSStefano Zampini   if (U) {
9829566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
983fe8322adSStefano Zampini     *U = NULL;
984fe8322adSStefano Zampini   }
985fe8322adSStefano Zampini   if (Udot) {
9869566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
987fe8322adSStefano Zampini     *Udot = NULL;
988fe8322adSStefano Zampini   }
989fe8322adSStefano Zampini   PetscFunctionReturn(0);
990fe8322adSStefano Zampini }
991