xref: /petsc/src/ts/trajectory/interface/traj.c (revision ffeef943c8ee50edff320d8a3135bb0c94853e4c)
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 
13cc4c1da9SBarry Smith   Not Collective, No Fortran Support
14bc952696SBarry Smith 
15bc952696SBarry Smith   Input Parameters:
162fe279fdSBarry Smith + sname    - the name of a new user-defined creation routine
172fe279fdSBarry Smith - function - the creation routine itself
18bc952696SBarry Smith 
19df5474d8SHong Zhang   Level: developer
20bc952696SBarry Smith 
21bcf0153eSBarry Smith   Note:
22bcf0153eSBarry Smith   `TSTrajectoryRegister()` may be called multiple times to add several user-defined tses.
23bcf0153eSBarry Smith 
241cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryRegisterAll()`
25bc952696SBarry Smith @*/
26d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS))
27d71ae5a4SJacob Faibussowitsch {
28bc952696SBarry Smith   PetscFunctionBegin;
299566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function));
303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
31bc952696SBarry Smith }
32bc952696SBarry Smith 
33fe8322adSStefano Zampini /*@
34fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
35fe8322adSStefano Zampini 
36c3339decSBarry Smith   Collective
37fe8322adSStefano Zampini 
38fe8322adSStefano Zampini   Input Parameters:
39fe8322adSStefano Zampini + tj      - the trajectory object
40fe8322adSStefano Zampini . ts      - the time stepper object (optional)
41fe8322adSStefano Zampini . stepnum - the step number
42fe8322adSStefano Zampini . time    - the current time
43fe8322adSStefano Zampini - X       - the current solution
44fe8322adSStefano Zampini 
45fe8322adSStefano Zampini   Level: developer
46fe8322adSStefano Zampini 
47bcf0153eSBarry Smith   Note:
48bcf0153eSBarry Smith   Usually one does not call this routine, it is called automatically during `TSSolve()`
49fe8322adSStefano Zampini 
501cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()`
51fe8322adSStefano Zampini @*/
52d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
53d71ae5a4SJacob Faibussowitsch {
54bc952696SBarry Smith   PetscFunctionBegin;
553ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
56fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
57fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
58fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
59fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 4);
60fe8322adSStefano Zampini   PetscValidHeaderSpecific(X, VEC_CLASSID, 5);
613c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
6248a46eb9SPierre Jolivet   if (tj->monitor) PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n", stepnum, (double)time, (PetscInt)!tj->solution_only));
639566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0));
64dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, set, ts, stepnum, time, X);
659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0));
661baa6e33SBarry Smith   if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time));
67fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
69bc952696SBarry Smith }
70bc952696SBarry Smith 
71fe8322adSStefano Zampini /*@
72bcf0153eSBarry Smith   TSTrajectoryGetNumSteps - Return the number of steps registered in the `TSTrajectory` via `TSTrajectorySet()`.
73fe8322adSStefano Zampini 
7420f4b53cSBarry Smith   Not Collective.
75fe8322adSStefano Zampini 
762fe279fdSBarry Smith   Input Parameter:
77fe8322adSStefano Zampini . tj - the trajectory object
78fe8322adSStefano Zampini 
79fe8322adSStefano Zampini   Output Parameter:
80fe8322adSStefano Zampini . steps - the number of steps
81fe8322adSStefano Zampini 
82fe8322adSStefano Zampini   Level: developer
83fe8322adSStefano Zampini 
841cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectorySet()`
85fe8322adSStefano Zampini @*/
86d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
87d71ae5a4SJacob Faibussowitsch {
88fe8322adSStefano Zampini   PetscFunctionBegin;
89fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
904f572ea9SToby Isaac   PetscAssertPointer(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 
1131cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSSolve()`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
114fe8322adSStefano Zampini @*/
115d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time)
116d71ae5a4SJacob Faibussowitsch {
117bc952696SBarry Smith   PetscFunctionBegin;
1183c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
119fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
120fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
121fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
1224f572ea9SToby Isaac   PetscAssertPointer(time, 4);
1233c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1243c633725SBarry Smith   PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number");
125fe8322adSStefano Zampini   if (tj->monitor) {
12663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only));
1279566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
128fe8322adSStefano Zampini   }
1299566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0));
130dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, get, ts, stepnum, time);
1319566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0));
1323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
133bc952696SBarry Smith }
134bc952696SBarry Smith 
135fe8322adSStefano Zampini /*@
136bcf0153eSBarry Smith   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the `TSTrajectory` and, possibly, from the `TS`
137fe8322adSStefano Zampini 
138c3339decSBarry Smith   Collective
139fe8322adSStefano Zampini 
140fe8322adSStefano Zampini   Input Parameters:
141fe8322adSStefano Zampini + tj      - the trajectory object
142fe8322adSStefano Zampini . ts      - the time stepper object (optional)
143fe8322adSStefano Zampini - stepnum - the requested step number
144fe8322adSStefano Zampini 
145fe8322adSStefano Zampini   Output Parameters:
146bcf0153eSBarry Smith + time - On input time for the step if step number is `PETSC_DECIDE`, on output the time associated with the step number
1472fe279fdSBarry Smith . U    - state vector (can be `NULL`)
1482fe279fdSBarry Smith - Udot - time derivative of state vector (can be `NULL`)
149fe8322adSStefano Zampini 
150fe8322adSStefano Zampini   Level: developer
151fe8322adSStefano Zampini 
152bcf0153eSBarry Smith   Notes:
153bcf0153eSBarry Smith   If the step number is `PETSC_DECIDE`, the time argument is used to inquire the trajectory.
154fe8322adSStefano Zampini   If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
155fe8322adSStefano Zampini 
1561cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
157fe8322adSStefano Zampini @*/
158d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot)
159d71ae5a4SJacob Faibussowitsch {
160fe8322adSStefano Zampini   PetscFunctionBegin;
1613c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
162fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
163fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
164fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
1654f572ea9SToby Isaac   PetscAssertPointer(time, 4);
166fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5);
167fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6);
1683ba16761SJacob Faibussowitsch   if (!U && !Udot) PetscFunctionReturn(PETSC_SUCCESS);
1693c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1709566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0));
171fe8322adSStefano Zampini   if (tj->monitor) {
172fe8322adSStefano Zampini     PetscInt pU, pUdot;
173fe8322adSStefano Zampini     pU    = U ? 1 : 0;
174fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
17563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time));
1769566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
177fe8322adSStefano Zampini   }
178fe8322adSStefano Zampini   if (U && tj->lag.caching) {
179fe8322adSStefano Zampini     PetscObjectId    id;
180fe8322adSStefano Zampini     PetscObjectState state;
181fe8322adSStefano Zampini 
1829566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &state));
1839566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &id));
184fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
185fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
186fe8322adSStefano Zampini     } else {
187fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
188fe8322adSStefano Zampini     }
189fe8322adSStefano Zampini     if (tj->monitor && !U) {
1909566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1919566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n"));
1929566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1939566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
194fe8322adSStefano Zampini     }
195fe8322adSStefano Zampini   }
196fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
197fe8322adSStefano Zampini     PetscObjectId    id;
198fe8322adSStefano Zampini     PetscObjectState state;
199fe8322adSStefano Zampini 
2009566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot, &state));
2019566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot, &id));
202fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
203fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
204fe8322adSStefano Zampini     } else {
205fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
206fe8322adSStefano Zampini     }
207fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2089566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2099566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n"));
2109566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2119566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
212fe8322adSStefano Zampini     }
213fe8322adSStefano Zampini   }
214fe8322adSStefano Zampini   if (!U && !Udot) {
2159566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2163ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
217fe8322adSStefano Zampini   }
218fe8322adSStefano Zampini 
219fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2201baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
221fe8322adSStefano Zampini     /* cached states will be updated in the function */
2229566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot));
223fe8322adSStefano Zampini     if (tj->monitor) {
2249566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2259566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
226fe8322adSStefano Zampini     }
227fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
228fe8322adSStefano Zampini     TS  fakets = ts;
229fe8322adSStefano Zampini     Vec U2;
230fe8322adSStefano Zampini 
231fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
232fe8322adSStefano Zampini     if (!ts) {
2339566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets));
234fe8322adSStefano Zampini       if (!fakets) {
2359566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets));
2369566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets));
2379566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2389566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U, &U2));
2399566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets, U2));
2409566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
241fe8322adSStefano Zampini       }
242fe8322adSStefano Zampini     }
2439566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time));
2449566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets, &U2));
2459566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2, U));
2469566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state));
2479566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id));
248fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
249fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
250fe8322adSStefano Zampini   }
2519566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
2523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
253fe8322adSStefano Zampini }
254fe8322adSStefano Zampini 
255*ffeef943SBarry Smith /*@
256bcf0153eSBarry Smith   TSTrajectoryViewFromOptions - View a `TSTrajectory` based on values in the options database
257fe2efc57SMark 
258c3339decSBarry Smith   Collective
259fe2efc57SMark 
260fe2efc57SMark   Input Parameters:
261bcf0153eSBarry Smith + A    - the `TSTrajectory` context
262bcf0153eSBarry Smith . obj  - Optional object that provides prefix used for option name
263736c3998SJose E. Roman - name - command line option
264fe2efc57SMark 
265fe2efc57SMark   Level: intermediate
266bcf0153eSBarry Smith 
2671cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
268fe2efc57SMark @*/
269d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[])
270d71ae5a4SJacob Faibussowitsch {
271fe2efc57SMark   PetscFunctionBegin;
272fe2efc57SMark   PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1);
2739566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
2743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
275fe2efc57SMark }
276fe2efc57SMark 
277*ffeef943SBarry Smith /*@
278bc952696SBarry Smith   TSTrajectoryView - Prints information about the trajectory object
279bc952696SBarry Smith 
280c3339decSBarry Smith   Collective
281bc952696SBarry Smith 
282bc952696SBarry Smith   Input Parameters:
283bcf0153eSBarry Smith + tj     - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
284bc952696SBarry Smith - viewer - visualization context
285bc952696SBarry Smith 
286bc952696SBarry Smith   Options Database Key:
287bcf0153eSBarry Smith . -ts_trajectory_view - calls `TSTrajectoryView()` at end of `TSAdjointStep()`
288bcf0153eSBarry Smith 
289bcf0153eSBarry Smith   Level: developer
290bc952696SBarry Smith 
291bc952696SBarry Smith   Notes:
292bc952696SBarry Smith   The available visualization contexts include
293bcf0153eSBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
294bcf0153eSBarry Smith -     `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
295bc952696SBarry Smith   output where only the first processor opens
296bc952696SBarry Smith   the file.  All other processors send their
297bc952696SBarry Smith   data to the first processor to print.
298bc952696SBarry Smith 
299bc952696SBarry Smith   The user can open an alternative visualization context with
300bcf0153eSBarry Smith   `PetscViewerASCIIOpen()` - output to a specified file.
301bc952696SBarry Smith 
3021cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `PetscViewer`, `PetscViewerASCIIOpen()`
303bc952696SBarry Smith @*/
304d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer)
305d71ae5a4SJacob Faibussowitsch {
306bc952696SBarry Smith   PetscBool iascii;
307bc952696SBarry Smith 
308bc952696SBarry Smith   PetscFunctionBegin;
3091a5a771fSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
31048a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer));
311bc952696SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
312b1d74d50SHong Zhang   PetscCheckSameComm(tj, 1, viewer, 2);
313bc952696SBarry Smith 
3149566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
315bc952696SBarry Smith   if (iascii) {
3169566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer));
31763a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps));
31863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads));
31963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites));
3209566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
321dbbe0bcdSBarry Smith     PetscTryTypeMethod(tj, view, viewer);
3229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
323bc952696SBarry Smith   }
3243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
325bc952696SBarry Smith }
326bc952696SBarry Smith 
327bc952696SBarry Smith /*@C
32878fbdcc8SBarry Smith   TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
32978fbdcc8SBarry Smith 
330c3339decSBarry Smith   Collective
33178fbdcc8SBarry Smith 
33278fbdcc8SBarry Smith   Input Parameters:
333b43aa488SJacob Faibussowitsch + ctx   - the trajectory context
334dc9a610eSPierre Jolivet - names - the names of the components, final string must be `NULL`
33578fbdcc8SBarry Smith 
33678fbdcc8SBarry Smith   Level: intermediate
33778fbdcc8SBarry Smith 
338b43aa488SJacob Faibussowitsch   Fortran Notes:
339bcf0153eSBarry Smith   Fortran interface is not possible because of the string array argument
340db901c5bSHong Zhang 
3411cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSGetTrajectory()`
34278fbdcc8SBarry Smith @*/
343d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names)
344d71ae5a4SJacob Faibussowitsch {
34578fbdcc8SBarry Smith   PetscFunctionBegin;
346fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1);
3474f572ea9SToby Isaac   PetscAssertPointer(names, 2);
3489566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3499566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names, &ctx->names));
3503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
35178fbdcc8SBarry Smith }
35278fbdcc8SBarry Smith 
35378fbdcc8SBarry Smith /*@C
354fe8322adSStefano Zampini   TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35508347785SBarry Smith 
356c3339decSBarry Smith   Collective
35708347785SBarry Smith 
35808347785SBarry Smith   Input Parameters:
359bcf0153eSBarry Smith + tj        - the `TSTrajectory` context
36008347785SBarry Smith . transform - the transform function
36108347785SBarry Smith . destroy   - function to destroy the optional context
362b43aa488SJacob Faibussowitsch - tctx      - optional context used by transform function
36308347785SBarry Smith 
36408347785SBarry Smith   Level: intermediate
36508347785SBarry Smith 
3661cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
36708347785SBarry Smith @*/
368d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx)
369d71ae5a4SJacob Faibussowitsch {
37008347785SBarry Smith   PetscFunctionBegin;
371fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
37208347785SBarry Smith   tj->transform        = transform;
37308347785SBarry Smith   tj->transformdestroy = destroy;
37408347785SBarry Smith   tj->transformctx     = tctx;
3753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
37608347785SBarry Smith }
37708347785SBarry Smith 
378db901c5bSHong Zhang /*@
379bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
380bc952696SBarry Smith 
381d083f849SBarry Smith   Collective
382bc952696SBarry Smith 
383bc952696SBarry Smith   Input Parameter:
3843c0fce88SHong Zhang . comm - the communicator
385bc952696SBarry Smith 
386bc952696SBarry Smith   Output Parameter:
3873c0fce88SHong Zhang . tj - the trajectory object
388bc952696SBarry Smith 
389df5474d8SHong Zhang   Level: developer
390bc952696SBarry Smith 
39195452b02SPatrick Sanan   Notes:
392bcf0153eSBarry Smith   Usually one does not call this routine, it is called automatically when one calls `TSSetSaveTrajectory()`.
393bc952696SBarry Smith 
3941cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
395bc952696SBarry Smith @*/
396d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj)
397d71ae5a4SJacob Faibussowitsch {
398bc952696SBarry Smith   TSTrajectory t;
399bc952696SBarry Smith 
400bc952696SBarry Smith   PetscFunctionBegin;
4014f572ea9SToby Isaac   PetscAssertPointer(tj, 2);
402b1d74d50SHong Zhang   *tj = NULL;
4039566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
404bc952696SBarry Smith 
4059566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
40668bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4079566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm, &t->tsh));
408fe8322adSStefano Zampini 
409fe8322adSStefano Zampini   t->lag.order            = 1;
410fe8322adSStefano Zampini   t->lag.L                = NULL;
411fe8322adSStefano Zampini   t->lag.T                = NULL;
412fe8322adSStefano Zampini   t->lag.W                = NULL;
413fe8322adSStefano Zampini   t->lag.WW               = NULL;
414fe8322adSStefano Zampini   t->lag.TW               = NULL;
415fe8322adSStefano Zampini   t->lag.TT               = NULL;
416fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
417fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
418fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
419fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
420fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
421fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
422fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
423fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
424fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
425fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
426fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
427fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
428ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
429b1d74d50SHong Zhang   *tj                     = t;
43063a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
4313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
432bc952696SBarry Smith }
433bc952696SBarry Smith 
434cc4c1da9SBarry Smith /*@
435bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
436bc952696SBarry Smith 
437c3339decSBarry Smith   Collective
438bc952696SBarry Smith 
439bc952696SBarry Smith   Input Parameters:
440bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
441bcf0153eSBarry Smith . ts   - the `TS` context
4423c0fce88SHong Zhang - type - a known method
443bc952696SBarry Smith 
444bcf0153eSBarry Smith   Options Database Key:
445e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
446bc952696SBarry Smith 
447df5474d8SHong Zhang   Level: developer
448bc952696SBarry Smith 
449b43aa488SJacob Faibussowitsch   Developer Notes:
450bcf0153eSBarry Smith   Why does this option require access to the `TS`
451bc952696SBarry Smith 
4521cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
453bc952696SBarry Smith @*/
454d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type)
455d71ae5a4SJacob Faibussowitsch {
456972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory, TS);
457bc952696SBarry Smith   PetscBool match;
458bc952696SBarry Smith 
459bc952696SBarry Smith   PetscFunctionBegin;
460972caf09SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4619566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
4623ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
463bc952696SBarry Smith 
4649566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4656adde796SStefano Zampini   PetscCheck(r, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
4669927e4dfSBarry Smith   PetscTryTypeMethod(tj, destroy);
467972caf09SHong Zhang   tj->ops->destroy = NULL;
4689566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
469bc952696SBarry Smith 
4709566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4719566063dSJacob Faibussowitsch   PetscCall((*r)(tj, ts));
4723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
473bc952696SBarry Smith }
474bc952696SBarry Smith 
475cc4c1da9SBarry Smith /*@
476881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
477881c1a9bSHong Zhang 
478c3339decSBarry Smith   Collective
479881c1a9bSHong Zhang 
480881c1a9bSHong Zhang   Input Parameters:
481bcf0153eSBarry Smith + tj - the `TSTrajectory` context
482bcf0153eSBarry Smith - ts - the `TS` context
483881c1a9bSHong Zhang 
4842fe279fdSBarry Smith   Output Parameter:
485881c1a9bSHong Zhang . type - a known method
486881c1a9bSHong Zhang 
487881c1a9bSHong Zhang   Level: developer
488881c1a9bSHong Zhang 
4891cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
490881c1a9bSHong Zhang @*/
491d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type)
492d71ae5a4SJacob Faibussowitsch {
493881c1a9bSHong Zhang   PetscFunctionBegin;
494881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
495881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
4963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
497881c1a9bSHong Zhang }
498881c1a9bSHong Zhang 
499972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
500972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
5019a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
5022b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
503bc952696SBarry Smith 
504bc952696SBarry Smith /*@C
505bcf0153eSBarry Smith   TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package.
506bc952696SBarry Smith 
507bc952696SBarry Smith   Not Collective
508bc952696SBarry Smith 
509df5474d8SHong Zhang   Level: developer
510bc952696SBarry Smith 
5111cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()`
512bc952696SBarry Smith @*/
513d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void)
514d71ae5a4SJacob Faibussowitsch {
515bc952696SBarry Smith   PetscFunctionBegin;
5163ba16761SJacob Faibussowitsch   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
517bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
518bc952696SBarry Smith 
5199566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5209566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5219566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5229566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
5233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
524bc952696SBarry Smith }
525bc952696SBarry Smith 
526bc952696SBarry Smith /*@
5271550c9b9SHong Zhang   TSTrajectoryReset - Resets a trajectory context
5281550c9b9SHong Zhang 
529c3339decSBarry Smith   Collective
5301550c9b9SHong Zhang 
5311550c9b9SHong Zhang   Input Parameter:
532bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
5331550c9b9SHong Zhang 
5341550c9b9SHong Zhang   Level: developer
5351550c9b9SHong Zhang 
5361cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5371550c9b9SHong Zhang @*/
538d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
539d71ae5a4SJacob Faibussowitsch {
5401550c9b9SHong Zhang   PetscFunctionBegin;
5413ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
5429a992471SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
543dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, reset);
5449566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5459566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5469566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
547fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5491550c9b9SHong Zhang }
5501550c9b9SHong Zhang 
5511550c9b9SHong Zhang /*@
552bc952696SBarry Smith   TSTrajectoryDestroy - Destroys a trajectory context
553bc952696SBarry Smith 
554c3339decSBarry Smith   Collective
555bc952696SBarry Smith 
556bc952696SBarry Smith   Input Parameter:
557bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
558bc952696SBarry Smith 
559df5474d8SHong Zhang   Level: developer
560bc952696SBarry Smith 
5611cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
562bc952696SBarry Smith @*/
563d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
564d71ae5a4SJacob Faibussowitsch {
565bc952696SBarry Smith   PetscFunctionBegin;
5663ba16761SJacob Faibussowitsch   if (!*tj) PetscFunctionReturn(PETSC_SUCCESS);
567f4f49eeaSPierre Jolivet   PetscValidHeaderSpecific(*tj, TSTRAJECTORY_CLASSID, 1);
568f4f49eeaSPierre Jolivet   if (--((PetscObject)*tj)->refct > 0) {
5699371c9d4SSatish Balay     *tj = NULL;
5703ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
5719371c9d4SSatish Balay   }
572bc952696SBarry Smith 
5739566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5749566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5759566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5769566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5779566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5789566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5799a992471SHong Zhang 
5809566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
581f4f49eeaSPierre Jolivet   PetscTryTypeMethod(*tj, destroy);
582fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
583fe8322adSStefano Zampini     PetscMPIInt rank;
584fe8322adSStefano Zampini     MPI_Comm    comm;
585fe8322adSStefano Zampini 
586f4f49eeaSPierre Jolivet     PetscCall(PetscObjectGetComm((PetscObject)*tj, &comm));
5879566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
588dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5899566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
590fe8322adSStefano Zampini     }
591fe8322adSStefano Zampini   }
5929566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5939566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5949566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5959566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
5963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
597bc952696SBarry Smith }
598bc952696SBarry Smith 
599bc952696SBarry Smith /*
600bcf0153eSBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options.
601bc952696SBarry Smith 
602c3339decSBarry Smith   Collective
603bc952696SBarry Smith 
604bc952696SBarry Smith   Input Parameter:
605bcf0153eSBarry Smith + tj - the `TSTrajectory` context
6063c0fce88SHong Zhang - ts - the TS context
6073c0fce88SHong Zhang 
608bcf0153eSBarry Smith   Options Database Key:
6093c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
610bc952696SBarry Smith 
611df5474d8SHong Zhang   Level: developer
612bc952696SBarry Smith 
6131cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
614bc952696SBarry Smith */
615d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts)
616d71ae5a4SJacob Faibussowitsch {
617bc952696SBarry Smith   PetscBool   opt;
618bc952696SBarry Smith   const char *defaultType;
619bc952696SBarry Smith   char        typeName[256];
620bc952696SBarry Smith 
621bc952696SBarry Smith   PetscFunctionBegin;
622b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
623bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
624bc952696SBarry Smith 
6259566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
627bc952696SBarry Smith   if (opt) {
6289566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, typeName));
629bc952696SBarry Smith   } else {
6309566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, defaultType));
631bc952696SBarry Smith   }
6323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
633bc952696SBarry Smith }
634bc952696SBarry Smith 
635ed695a29SHong Zhang /*@
636bcf0153eSBarry Smith   TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory`
6379ffb3502SHong Zhang 
638c3339decSBarry Smith   Collective
6399ffb3502SHong Zhang 
6404165533cSJose E. Roman   Input Parameters:
641bcf0153eSBarry Smith + tj  - the `TSTrajectory` context
642bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
6439ffb3502SHong Zhang 
644bcf0153eSBarry Smith   Options Database Key:
645bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory`
6469ffb3502SHong Zhang 
6479ffb3502SHong Zhang   Level: advanced
6489ffb3502SHong Zhang 
6491cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6509ffb3502SHong Zhang @*/
651d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg)
652d71ae5a4SJacob Faibussowitsch {
6539ffb3502SHong Zhang   PetscFunctionBegin;
6549ffb3502SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6559ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
6569ffb3502SHong Zhang   tj->usehistory = flg;
6573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6589ffb3502SHong Zhang }
6599ffb3502SHong Zhang 
6609ffb3502SHong Zhang /*@
661bcf0153eSBarry Smith   TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller
662ed695a29SHong Zhang 
663c3339decSBarry Smith   Collective
664ed695a29SHong Zhang 
6654165533cSJose E. Roman   Input Parameters:
666bcf0153eSBarry Smith + tj  - the `TSTrajectory` context
667bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable
668ed695a29SHong Zhang 
669bcf0153eSBarry Smith   Options Database Key:
670bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information
6713c0fce88SHong Zhang 
672df5474d8SHong Zhang   Level: developer
673ed695a29SHong Zhang 
6741cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
675ed695a29SHong Zhang @*/
676d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg)
677d71ae5a4SJacob Faibussowitsch {
678ed695a29SHong Zhang   PetscFunctionBegin;
679ed695a29SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
680ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
681fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
682fe8322adSStefano Zampini   else tj->monitor = NULL;
6833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
684ed695a29SHong Zhang }
685ed695a29SHong Zhang 
686bc952696SBarry Smith /*@
687bcf0153eSBarry Smith   TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done
68864fc91eeSBarry Smith 
689c3339decSBarry Smith   Collective
69064fc91eeSBarry Smith 
6914165533cSJose E. Roman   Input Parameters:
692bcf0153eSBarry Smith + tj  - the `TSTrajectory` context
693bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
69464fc91eeSBarry Smith 
695bcf0153eSBarry Smith   Options Database Key:
69664fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files
69764fc91eeSBarry Smith 
69864fc91eeSBarry Smith   Level: advanced
69964fc91eeSBarry Smith 
700bcf0153eSBarry Smith   Note:
701bcf0153eSBarry 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.
702bcf0153eSBarry Smith 
7031cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70464fc91eeSBarry Smith @*/
705d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg)
706d71ae5a4SJacob Faibussowitsch {
70764fc91eeSBarry Smith   PetscFunctionBegin;
70864fc91eeSBarry Smith   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
70964fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj, flg, 2);
71064fc91eeSBarry Smith   tj->keepfiles = flg;
7113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
71264fc91eeSBarry Smith }
71364fc91eeSBarry Smith 
714cc4c1da9SBarry Smith /*@
715bcf0153eSBarry Smith   TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored.
71664e38db7SHong Zhang 
717c3339decSBarry Smith   Collective
71864e38db7SHong Zhang 
7194165533cSJose E. Roman   Input Parameters:
720bcf0153eSBarry Smith + tj      - the `TSTrajectory` context
72164e38db7SHong Zhang - dirname - the directory name
72264e38db7SHong Zhang 
723bcf0153eSBarry Smith   Options Database Key:
72464e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name
72564e38db7SHong Zhang 
72664e38db7SHong Zhang   Level: developer
72764e38db7SHong Zhang 
728bcf0153eSBarry Smith   Notes:
729bcf0153eSBarry Smith   The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()`
730bcf0153eSBarry Smith 
731bcf0153eSBarry Smith   If this is not called `TSTrajectory` selects a unique new name for the directory
732bcf0153eSBarry Smith 
7331cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73464e38db7SHong Zhang @*/
735d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[])
736d71ae5a4SJacob Faibussowitsch {
737a17281aeSStefano Zampini   PetscBool flg;
738a17281aeSStefano Zampini 
73964e38db7SHong Zhang   PetscFunctionBegin;
74064e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7419566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
742049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7439566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7449566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname, &tj->dirname));
7453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
74664e38db7SHong Zhang }
74764e38db7SHong Zhang 
748cc4c1da9SBarry Smith /*@
749bcf0153eSBarry Smith   TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints.
75064e38db7SHong Zhang 
751c3339decSBarry Smith   Collective
75264e38db7SHong Zhang 
7534165533cSJose E. Roman   Input Parameters:
754bcf0153eSBarry Smith + tj           - the `TSTrajectory` context
7551585b412SBarry Smith - filetemplate - the template
75664e38db7SHong Zhang 
757bcf0153eSBarry Smith   Options Database Key:
7581585b412SBarry Smith . -ts_trajectory_file_template - set the file name template
7591585b412SBarry Smith 
760bcf0153eSBarry Smith   Level: developer
761bcf0153eSBarry Smith 
76295452b02SPatrick Sanan   Notes:
76363a3b9bcSJacob Faibussowitsch   The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7641585b412SBarry Smith 
765bcf0153eSBarry 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
7661585b412SBarry Smith   timestep counter
76764e38db7SHong Zhang 
7681cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
76964e38db7SHong Zhang @*/
770d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[])
771d71ae5a4SJacob Faibussowitsch {
772bbcf679cSJacob Faibussowitsch   const char *ptr = NULL, *ptr2 = NULL;
7739afe7f3eSBarry Smith 
77464e38db7SHong Zhang   PetscFunctionBegin;
77564e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7764f572ea9SToby Isaac   PetscAssertPointer(filetemplate, 2);
7773c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7789afe7f3eSBarry Smith 
77963a3b9bcSJacob 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");
7809afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7819566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
78263a3b9bcSJacob 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");
7839afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
78463a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
78563a3b9bcSJacob 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");
7869afe7f3eSBarry Smith     if (ptr2) break;
7879afe7f3eSBarry Smith   }
7889566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7899566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
7903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
79164e38db7SHong Zhang }
79264e38db7SHong Zhang 
79364e38db7SHong Zhang /*@
794bcf0153eSBarry Smith   TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options.
795bc952696SBarry Smith 
796c3339decSBarry Smith   Collective
797bc952696SBarry Smith 
798d8d19677SJose E. Roman   Input Parameters:
799bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
800bcf0153eSBarry Smith - ts - the `TS` context
801bc952696SBarry Smith 
802bc952696SBarry Smith   Options Database Keys:
803bcf0153eSBarry Smith + -ts_trajectory_type <type>             - basic, memory, singlefile, visualization
804bcf0153eSBarry 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
805bcf0153eSBarry Smith - -ts_trajectory_monitor                 - print `TSTrajectory` information
806bc952696SBarry Smith 
807df5474d8SHong Zhang   Level: developer
808bc952696SBarry Smith 
809bcf0153eSBarry Smith   Note:
81095452b02SPatrick Sanan   This is not normally called directly by users
811bc952696SBarry Smith 
8121cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
813bc952696SBarry Smith @*/
814d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts)
815d71ae5a4SJacob Faibussowitsch {
816ed695a29SHong Zhang   PetscBool set, flg;
81764e38db7SHong Zhang   char      dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
818bc952696SBarry Smith 
819bc952696SBarry Smith   PetscFunctionBegin;
820b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
821fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
822d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8239566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
8249566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8269566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8289566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8299566063dSJacob 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));
8309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8329566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
83364e38db7SHong Zhang 
8349566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8351baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
83664e38db7SHong Zhang 
83763a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8381baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
83964e38db7SHong Zhang 
84064e38db7SHong Zhang   /* Handle specific TSTrajectory options */
841dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
842d0609cedSBarry Smith   PetscOptionsEnd();
8433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
844bc952696SBarry Smith }
84568bece0bSHong Zhang 
84668bece0bSHong Zhang /*@
84768bece0bSHong Zhang   TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
848bcf0153eSBarry Smith   of a `TS` `TSTrajectory`.
84968bece0bSHong Zhang 
850c3339decSBarry Smith   Collective
85168bece0bSHong Zhang 
852d8d19677SJose E. Roman   Input Parameters:
853bcf0153eSBarry Smith + tj - the `TSTrajectory` context
854bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()`
85568bece0bSHong Zhang 
856df5474d8SHong Zhang   Level: developer
85768bece0bSHong Zhang 
8581cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
85968bece0bSHong Zhang @*/
860d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts)
861d71ae5a4SJacob Faibussowitsch {
8629afe7f3eSBarry Smith   size_t s1, s2;
86368bece0bSHong Zhang 
86468bece0bSHong Zhang   PetscFunctionBegin;
8653ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
86668bece0bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
867fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
8683ba16761SJacob Faibussowitsch   if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
86968bece0bSHong Zhang 
8709566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
87148a46eb9SPierre Jolivet   if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
872dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setup, ts);
87368bece0bSHong Zhang 
87468bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
87553b27ddbSHong Zhang 
87653b27ddbSHong Zhang   /* Set the counters to zero */
8771a5a771fSHong Zhang   tj->recomps    = 0;
87853b27ddbSHong Zhang   tj->diskreads  = 0;
87953b27ddbSHong Zhang   tj->diskwrites = 0;
8809566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname, &s1));
8819566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate, &s2));
8829566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8839566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8849566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8859566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
8863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
88768bece0bSHong Zhang }
888fe8322adSStefano Zampini 
889fe8322adSStefano Zampini /*@
890bcf0153eSBarry Smith   TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information
891fe8322adSStefano Zampini 
892c3339decSBarry Smith   Collective
893fe8322adSStefano Zampini 
894d8d19677SJose E. Roman   Input Parameters:
895bcf0153eSBarry Smith + tj            - the `TSTrajectory` context obtained with `TSGetTrajectory()`
896b43aa488SJacob Faibussowitsch - solution_only - the boolean flag
897fe8322adSStefano Zampini 
898fe8322adSStefano Zampini   Level: developer
899fe8322adSStefano Zampini 
9001cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
901fe8322adSStefano Zampini @*/
902d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only)
903d71ae5a4SJacob Faibussowitsch {
904fe8322adSStefano Zampini   PetscFunctionBegin;
905fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
906fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj, solution_only, 2);
907fe8322adSStefano Zampini   tj->solution_only = solution_only;
9083ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
909fe8322adSStefano Zampini }
910fe8322adSStefano Zampini 
911fe8322adSStefano Zampini /*@
912bcf0153eSBarry Smith   TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`.
913fe8322adSStefano Zampini 
91420f4b53cSBarry Smith   Logically Collective
915fe8322adSStefano Zampini 
916fe8322adSStefano Zampini   Input Parameter:
917bcf0153eSBarry Smith . tj - the `TSTrajectory` context
918fe8322adSStefano Zampini 
919fe8322adSStefano Zampini   Output Parameter:
920b43aa488SJacob Faibussowitsch . solution_only - the boolean flag
921fe8322adSStefano Zampini 
922fe8322adSStefano Zampini   Level: developer
923fe8322adSStefano Zampini 
9241cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
925fe8322adSStefano Zampini @*/
926d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only)
927d71ae5a4SJacob Faibussowitsch {
928fe8322adSStefano Zampini   PetscFunctionBegin;
929fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
9304f572ea9SToby Isaac   PetscAssertPointer(solution_only, 2);
931fe8322adSStefano Zampini   *solution_only = tj->solution_only;
9323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
933fe8322adSStefano Zampini }
934fe8322adSStefano Zampini 
935fe8322adSStefano Zampini /*@
936fe8322adSStefano Zampini   TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
937fe8322adSStefano Zampini 
938c3339decSBarry Smith   Collective
939fe8322adSStefano Zampini 
940d8d19677SJose E. Roman   Input Parameters:
941bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
942bcf0153eSBarry Smith . ts   - the `TS` solver context
943fe8322adSStefano Zampini - time - the requested time
944fe8322adSStefano Zampini 
945d8d19677SJose E. Roman   Output Parameters:
946fe8322adSStefano Zampini + U    - state vector at given time (can be interpolated)
947fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated)
948fe8322adSStefano Zampini 
949fe8322adSStefano Zampini   Level: developer
950fe8322adSStefano Zampini 
951bcf0153eSBarry Smith   Notes:
952bcf0153eSBarry Smith   The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector.
953fe8322adSStefano Zampini 
954bcf0153eSBarry Smith   This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by
955bcf0153eSBarry Smith   calling `TSTrajectoryRestoreUpdatedHistoryVecs()`.
956bcf0153eSBarry Smith 
9571cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
958fe8322adSStefano Zampini @*/
959d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
960d71ae5a4SJacob Faibussowitsch {
961fe8322adSStefano Zampini   PetscFunctionBegin;
962fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
963fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
964fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 3);
9654f572ea9SToby Isaac   if (U) PetscAssertPointer(U, 4);
9664f572ea9SToby Isaac   if (Udot) PetscAssertPointer(Udot, 5);
967fe8322adSStefano Zampini   if (U && !tj->U) {
968fe8322adSStefano Zampini     DM dm;
969fe8322adSStefano Zampini 
9709566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9719566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->U));
972fe8322adSStefano Zampini   }
973fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
974fe8322adSStefano Zampini     DM dm;
975fe8322adSStefano Zampini 
9769566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9779566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
978fe8322adSStefano Zampini   }
9799566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
980fe8322adSStefano Zampini   if (U) {
9819566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
982fe8322adSStefano Zampini     *U = tj->U;
983fe8322adSStefano Zampini   }
984fe8322adSStefano Zampini   if (Udot) {
9859566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
986fe8322adSStefano Zampini     *Udot = tj->Udot;
987fe8322adSStefano Zampini   }
9883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
989fe8322adSStefano Zampini }
990fe8322adSStefano Zampini 
991fe8322adSStefano Zampini /*@
992bcf0153eSBarry Smith   TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`.
993fe8322adSStefano Zampini 
994c3339decSBarry Smith   Collective
995fe8322adSStefano Zampini 
996d8d19677SJose E. Roman   Input Parameters:
997bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
998fe8322adSStefano Zampini . U    - state vector at given time (can be interpolated)
999fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated)
1000fe8322adSStefano Zampini 
1001fe8322adSStefano Zampini   Level: developer
1002fe8322adSStefano Zampini 
10031cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()`
1004fe8322adSStefano Zampini @*/
1005d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1006d71ae5a4SJacob Faibussowitsch {
1007fe8322adSStefano Zampini   PetscFunctionBegin;
1008fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
1009fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
1010fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
10113c633725SBarry Smith   PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10123c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1013fe8322adSStefano Zampini   if (U) {
10149566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1015fe8322adSStefano Zampini     *U = NULL;
1016fe8322adSStefano Zampini   }
1017fe8322adSStefano Zampini   if (Udot) {
10189566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1019fe8322adSStefano Zampini     *Udot = NULL;
1020fe8322adSStefano Zampini   }
10213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1022fe8322adSStefano Zampini }
1023