xref: /petsc/src/ts/trajectory/interface/traj.c (revision b31b2f82859ff8548562364efb89146f661bbcd9)
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 @*/
TSTrajectoryRegister(const char sname[],PetscErrorCode (* function)(TSTrajectory,TS))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 @*/
TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)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 @*/
TSTrajectoryGetNumSteps(TSTrajectory tj,PetscInt * steps)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 @*/
TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal * time)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 @*/
TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal * time,Vec U,Vec Udot)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 
255ffeef943SBarry 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 @*/
TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])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 
277ffeef943SBarry 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 @*/
TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)304d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer)
305d71ae5a4SJacob Faibussowitsch {
3069f196a02SMartin Diehl   PetscBool isascii;
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 
3149f196a02SMartin Diehl   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
3159f196a02SMartin Diehl   if (isascii) {
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 @*/
TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const * names)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 @*/
TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (* transform)(void *,Vec,Vec *),PetscCtxDestroyFn * destroy,void * tctx)368*98cba041SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscCtxDestroyFn *destroy, 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 @*/
TSTrajectoryCreate(MPI_Comm comm,TSTrajectory * tj)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);
4029566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
403bc952696SBarry Smith 
4049566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
40568bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4069566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm, &t->tsh));
407fe8322adSStefano Zampini   t->lag.order            = 1;
408fe8322adSStefano Zampini   t->lag.L                = NULL;
409fe8322adSStefano Zampini   t->lag.T                = NULL;
410fe8322adSStefano Zampini   t->lag.W                = NULL;
411fe8322adSStefano Zampini   t->lag.WW               = NULL;
412fe8322adSStefano Zampini   t->lag.TW               = NULL;
413fe8322adSStefano Zampini   t->lag.TT               = NULL;
414fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
415fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
416fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
417fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
4181690c2aeSBarry Smith   t->lag.Ucached.step     = PETSC_INT_MAX;
419fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
420fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
421fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
4221690c2aeSBarry Smith   t->lag.Udotcached.step  = PETSC_INT_MAX;
423fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
424fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
425fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
426ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
427b1d74d50SHong Zhang   *tj                     = t;
42863a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
4293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
430bc952696SBarry Smith }
431bc952696SBarry Smith 
432cc4c1da9SBarry Smith /*@
433bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
434bc952696SBarry Smith 
435c3339decSBarry Smith   Collective
436bc952696SBarry Smith 
437bc952696SBarry Smith   Input Parameters:
438bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
439bcf0153eSBarry Smith . ts   - the `TS` context
4403c0fce88SHong Zhang - type - a known method
441bc952696SBarry Smith 
442bcf0153eSBarry Smith   Options Database Key:
443e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
444bc952696SBarry Smith 
445df5474d8SHong Zhang   Level: developer
446bc952696SBarry Smith 
447b43aa488SJacob Faibussowitsch   Developer Notes:
448bcf0153eSBarry Smith   Why does this option require access to the `TS`
449bc952696SBarry Smith 
4501cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
451bc952696SBarry Smith @*/
TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)452d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type)
453d71ae5a4SJacob Faibussowitsch {
454972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory, TS);
455bc952696SBarry Smith   PetscBool match;
456bc952696SBarry Smith 
457bc952696SBarry Smith   PetscFunctionBegin;
458972caf09SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
4603ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
461bc952696SBarry Smith 
4629566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4636adde796SStefano Zampini   PetscCheck(r, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
4649927e4dfSBarry Smith   PetscTryTypeMethod(tj, destroy);
465972caf09SHong Zhang   tj->ops->destroy = NULL;
4669566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
467bc952696SBarry Smith 
4689566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4699566063dSJacob Faibussowitsch   PetscCall((*r)(tj, ts));
4703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
471bc952696SBarry Smith }
472bc952696SBarry Smith 
473cc4c1da9SBarry Smith /*@
474881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
475881c1a9bSHong Zhang 
476c3339decSBarry Smith   Collective
477881c1a9bSHong Zhang 
478881c1a9bSHong Zhang   Input Parameters:
479bcf0153eSBarry Smith + tj - the `TSTrajectory` context
480bcf0153eSBarry Smith - ts - the `TS` context
481881c1a9bSHong Zhang 
4822fe279fdSBarry Smith   Output Parameter:
483881c1a9bSHong Zhang . type - a known method
484881c1a9bSHong Zhang 
485881c1a9bSHong Zhang   Level: developer
486881c1a9bSHong Zhang 
4871cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
488881c1a9bSHong Zhang @*/
TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType * type)489d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type)
490d71ae5a4SJacob Faibussowitsch {
491881c1a9bSHong Zhang   PetscFunctionBegin;
492881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
493881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
4943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
495881c1a9bSHong Zhang }
496881c1a9bSHong Zhang 
497972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
4999a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
5002b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
501bc952696SBarry Smith 
502bc952696SBarry Smith /*@C
503bcf0153eSBarry Smith   TSTrajectoryRegisterAll - Registers all of the `TSTrajectory` storage schecmes in the `TS` package.
504bc952696SBarry Smith 
505bc952696SBarry Smith   Not Collective
506bc952696SBarry Smith 
507df5474d8SHong Zhang   Level: developer
508bc952696SBarry Smith 
5091cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryRegister()`
510bc952696SBarry Smith @*/
TSTrajectoryRegisterAll(void)511d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void)
512d71ae5a4SJacob Faibussowitsch {
513bc952696SBarry Smith   PetscFunctionBegin;
5143ba16761SJacob Faibussowitsch   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
515bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
516bc952696SBarry Smith 
5179566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5189566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5199566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5209566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
5213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
522bc952696SBarry Smith }
523bc952696SBarry Smith 
524bc952696SBarry Smith /*@
5251550c9b9SHong Zhang   TSTrajectoryReset - Resets a trajectory context
5261550c9b9SHong Zhang 
527c3339decSBarry Smith   Collective
5281550c9b9SHong Zhang 
5291550c9b9SHong Zhang   Input Parameter:
530bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
5311550c9b9SHong Zhang 
5321550c9b9SHong Zhang   Level: developer
5331550c9b9SHong Zhang 
5341cc06b55SBarry Smith .seealso: [](ch_ts), `TS`, `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5351550c9b9SHong Zhang @*/
TSTrajectoryReset(TSTrajectory tj)536d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
537d71ae5a4SJacob Faibussowitsch {
5381550c9b9SHong Zhang   PetscFunctionBegin;
5393ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
5409a992471SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
541dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, reset);
5429566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5439566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5449566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
545fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5471550c9b9SHong Zhang }
5481550c9b9SHong Zhang 
5491550c9b9SHong Zhang /*@
550bc952696SBarry Smith   TSTrajectoryDestroy - Destroys a trajectory context
551bc952696SBarry Smith 
552c3339decSBarry Smith   Collective
553bc952696SBarry Smith 
554bc952696SBarry Smith   Input Parameter:
555bcf0153eSBarry Smith . tj - the `TSTrajectory` context obtained from `TSTrajectoryCreate()`
556bc952696SBarry Smith 
557df5474d8SHong Zhang   Level: developer
558bc952696SBarry Smith 
5591cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
560bc952696SBarry Smith @*/
TSTrajectoryDestroy(TSTrajectory * tj)561d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
562d71ae5a4SJacob Faibussowitsch {
563bc952696SBarry Smith   PetscFunctionBegin;
5643ba16761SJacob Faibussowitsch   if (!*tj) PetscFunctionReturn(PETSC_SUCCESS);
565f4f49eeaSPierre Jolivet   PetscValidHeaderSpecific(*tj, TSTRAJECTORY_CLASSID, 1);
566f4f49eeaSPierre Jolivet   if (--((PetscObject)*tj)->refct > 0) {
5679371c9d4SSatish Balay     *tj = NULL;
5683ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
5699371c9d4SSatish Balay   }
570bc952696SBarry Smith 
5719566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5729566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5739566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5749566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5759566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5769566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5779a992471SHong Zhang 
578*98cba041SBarry Smith   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)(&(*tj)->transformctx));
579f4f49eeaSPierre Jolivet   PetscTryTypeMethod(*tj, destroy);
580fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
581fe8322adSStefano Zampini     PetscMPIInt rank;
582fe8322adSStefano Zampini     MPI_Comm    comm;
583fe8322adSStefano Zampini 
584f4f49eeaSPierre Jolivet     PetscCall(PetscObjectGetComm((PetscObject)*tj, &comm));
5859566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
586dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5879566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
588fe8322adSStefano Zampini     }
589fe8322adSStefano Zampini   }
5909566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5919566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5929566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5939566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
5943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
595bc952696SBarry Smith }
596bc952696SBarry Smith 
597bc952696SBarry Smith /*
598bcf0153eSBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of `TSTrajectory` from user options.
599bc952696SBarry Smith 
600c3339decSBarry Smith   Collective
601bc952696SBarry Smith 
602bc952696SBarry Smith   Input Parameter:
603bcf0153eSBarry Smith + tj - the `TSTrajectory` context
6043c0fce88SHong Zhang - ts - the TS context
6053c0fce88SHong Zhang 
606bcf0153eSBarry Smith   Options Database Key:
6073c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
608bc952696SBarry Smith 
609df5474d8SHong Zhang   Level: developer
610bc952696SBarry Smith 
6111cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryType`, `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
612bc952696SBarry Smith */
TSTrajectorySetTypeFromOptions_Private(PetscOptionItems PetscOptionsObject,TSTrajectory tj,TS ts)613ce78bad3SBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems PetscOptionsObject, TSTrajectory tj, TS ts)
614d71ae5a4SJacob Faibussowitsch {
615bc952696SBarry Smith   PetscBool   opt;
616bc952696SBarry Smith   const char *defaultType;
617bc952696SBarry Smith   char        typeName[256];
618bc952696SBarry Smith 
619bc952696SBarry Smith   PetscFunctionBegin;
620b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
621bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
622bc952696SBarry Smith 
6239566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6249566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
625bc952696SBarry Smith   if (opt) {
6269566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, typeName));
627bc952696SBarry Smith   } else {
6289566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, defaultType));
629bc952696SBarry Smith   }
6303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
631bc952696SBarry Smith }
632bc952696SBarry Smith 
633ed695a29SHong Zhang /*@
634bcf0153eSBarry Smith   TSTrajectorySetUseHistory - Use `TSHistory` in `TSTrajectory`
6359ffb3502SHong Zhang 
636c3339decSBarry Smith   Collective
6379ffb3502SHong Zhang 
6384165533cSJose E. Roman   Input Parameters:
639bcf0153eSBarry Smith + tj  - the `TSTrajectory` context
640bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
6419ffb3502SHong Zhang 
642bcf0153eSBarry Smith   Options Database Key:
643bcf0153eSBarry Smith . -ts_trajectory_use_history - have it use `TSHistory`
6449ffb3502SHong Zhang 
6459ffb3502SHong Zhang   Level: advanced
6469ffb3502SHong Zhang 
6471cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6489ffb3502SHong Zhang @*/
TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)649d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg)
650d71ae5a4SJacob Faibussowitsch {
6519ffb3502SHong Zhang   PetscFunctionBegin;
6529ffb3502SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6539ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
6549ffb3502SHong Zhang   tj->usehistory = flg;
6553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6569ffb3502SHong Zhang }
6579ffb3502SHong Zhang 
6589ffb3502SHong Zhang /*@
659bcf0153eSBarry Smith   TSTrajectorySetMonitor - Monitor the schedules generated by the `TSTrajectory` checkpointing controller
660ed695a29SHong Zhang 
661c3339decSBarry Smith   Collective
662ed695a29SHong Zhang 
6634165533cSJose E. Roman   Input Parameters:
664bcf0153eSBarry Smith + tj  - the `TSTrajectory` context
665bcf0153eSBarry Smith - flg - `PETSC_TRUE` to active a monitor, `PETSC_FALSE` to disable
666ed695a29SHong Zhang 
667bcf0153eSBarry Smith   Options Database Key:
668bcf0153eSBarry Smith . -ts_trajectory_monitor - print `TSTrajectory` information
6693c0fce88SHong Zhang 
670df5474d8SHong Zhang   Level: developer
671ed695a29SHong Zhang 
6721cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
673ed695a29SHong Zhang @*/
TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)674d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg)
675d71ae5a4SJacob Faibussowitsch {
676ed695a29SHong Zhang   PetscFunctionBegin;
677ed695a29SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
678ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
679fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
680fe8322adSStefano Zampini   else tj->monitor = NULL;
6813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
682ed695a29SHong Zhang }
683ed695a29SHong Zhang 
684bc952696SBarry Smith /*@
685bcf0153eSBarry Smith   TSTrajectorySetKeepFiles - Keep the files generated by the `TSTrajectory` once the program is done
68664fc91eeSBarry Smith 
687c3339decSBarry Smith   Collective
68864fc91eeSBarry Smith 
6894165533cSJose E. Roman   Input Parameters:
690bcf0153eSBarry Smith + tj  - the `TSTrajectory` context
691bcf0153eSBarry Smith - flg - `PETSC_TRUE` to save, `PETSC_FALSE` to disable
69264fc91eeSBarry Smith 
693bcf0153eSBarry Smith   Options Database Key:
69464fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files
69564fc91eeSBarry Smith 
69664fc91eeSBarry Smith   Level: advanced
69764fc91eeSBarry Smith 
698bcf0153eSBarry Smith   Note:
699bcf0153eSBarry 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.
700bcf0153eSBarry Smith 
7011cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70264fc91eeSBarry Smith @*/
TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)703d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg)
704d71ae5a4SJacob Faibussowitsch {
70564fc91eeSBarry Smith   PetscFunctionBegin;
70664fc91eeSBarry Smith   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
70764fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj, flg, 2);
70864fc91eeSBarry Smith   tj->keepfiles = flg;
7093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
71064fc91eeSBarry Smith }
71164fc91eeSBarry Smith 
712cc4c1da9SBarry Smith /*@
713bcf0153eSBarry Smith   TSTrajectorySetDirname - Specify the name of the directory where `TSTrajectory` disk checkpoints are stored.
71464e38db7SHong Zhang 
715c3339decSBarry Smith   Collective
71664e38db7SHong Zhang 
7174165533cSJose E. Roman   Input Parameters:
718bcf0153eSBarry Smith + tj      - the `TSTrajectory` context
71964e38db7SHong Zhang - dirname - the directory name
72064e38db7SHong Zhang 
721bcf0153eSBarry Smith   Options Database Key:
72264e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name
72364e38db7SHong Zhang 
72464e38db7SHong Zhang   Level: developer
72564e38db7SHong Zhang 
726bcf0153eSBarry Smith   Notes:
727bcf0153eSBarry Smith   The final location of the files is determined by dirname/filetemplate where filetemplate was provided by `TSTrajectorySetFiletemplate()`
728bcf0153eSBarry Smith 
729bcf0153eSBarry Smith   If this is not called `TSTrajectory` selects a unique new name for the directory
730bcf0153eSBarry Smith 
7311cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73264e38db7SHong Zhang @*/
TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])733d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[])
734d71ae5a4SJacob Faibussowitsch {
735a17281aeSStefano Zampini   PetscBool flg;
736a17281aeSStefano Zampini 
73764e38db7SHong Zhang   PetscFunctionBegin;
73864e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7399566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
740049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7419566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7429566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname, &tj->dirname));
7433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
74464e38db7SHong Zhang }
74564e38db7SHong Zhang 
746cc4c1da9SBarry Smith /*@
747bcf0153eSBarry Smith   TSTrajectorySetFiletemplate - Specify the name template for the files storing `TSTrajectory` checkpoints.
74864e38db7SHong Zhang 
749c3339decSBarry Smith   Collective
75064e38db7SHong Zhang 
7514165533cSJose E. Roman   Input Parameters:
752bcf0153eSBarry Smith + tj           - the `TSTrajectory` context
7531585b412SBarry Smith - filetemplate - the template
75464e38db7SHong Zhang 
755bcf0153eSBarry Smith   Options Database Key:
7561585b412SBarry Smith . -ts_trajectory_file_template - set the file name template
7571585b412SBarry Smith 
758bcf0153eSBarry Smith   Level: developer
759bcf0153eSBarry Smith 
76095452b02SPatrick Sanan   Notes:
76163a3b9bcSJacob Faibussowitsch   The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7621585b412SBarry Smith 
763bcf0153eSBarry 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
7641585b412SBarry Smith   timestep counter
76564e38db7SHong Zhang 
7661cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
76764e38db7SHong Zhang @*/
TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])768d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[])
769d71ae5a4SJacob Faibussowitsch {
770bbcf679cSJacob Faibussowitsch   const char *ptr = NULL, *ptr2 = NULL;
7719afe7f3eSBarry Smith 
77264e38db7SHong Zhang   PetscFunctionBegin;
77364e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7744f572ea9SToby Isaac   PetscAssertPointer(filetemplate, 2);
7753c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7769afe7f3eSBarry Smith 
77763a3b9bcSJacob 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");
7789afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7799566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
78063a3b9bcSJacob 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");
7819afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
78263a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
78363a3b9bcSJacob 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");
7849afe7f3eSBarry Smith     if (ptr2) break;
7859afe7f3eSBarry Smith   }
7869566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7879566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
7883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
78964e38db7SHong Zhang }
79064e38db7SHong Zhang 
79164e38db7SHong Zhang /*@
792bcf0153eSBarry Smith   TSTrajectorySetFromOptions - Sets various `TSTrajectory` parameters from user options.
793bc952696SBarry Smith 
794c3339decSBarry Smith   Collective
795bc952696SBarry Smith 
796d8d19677SJose E. Roman   Input Parameters:
797bcf0153eSBarry Smith + tj - the `TSTrajectory` context obtained from `TSGetTrajectory()`
798bcf0153eSBarry Smith - ts - the `TS` context
799bc952696SBarry Smith 
800bc952696SBarry Smith   Options Database Keys:
801bcf0153eSBarry Smith + -ts_trajectory_type <type>             - basic, memory, singlefile, visualization
802bcf0153eSBarry 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
803bcf0153eSBarry Smith - -ts_trajectory_monitor                 - print `TSTrajectory` information
804bc952696SBarry Smith 
805df5474d8SHong Zhang   Level: developer
806bc952696SBarry Smith 
807bcf0153eSBarry Smith   Note:
80895452b02SPatrick Sanan   This is not normally called directly by users
809bc952696SBarry Smith 
8101cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
811bc952696SBarry Smith @*/
TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)812d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts)
813d71ae5a4SJacob Faibussowitsch {
814ed695a29SHong Zhang   PetscBool set, flg;
81564e38db7SHong Zhang   char      dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
816bc952696SBarry Smith 
817bc952696SBarry Smith   PetscFunctionBegin;
818b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
819fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
820d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8219566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
8229566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8239566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8249566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8279566063dSJacob 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));
8289566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8299566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8309566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
83164e38db7SHong Zhang 
8329566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8331baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
83464e38db7SHong Zhang 
83563a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8361baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
83764e38db7SHong Zhang 
83864e38db7SHong Zhang   /* Handle specific TSTrajectory options */
839dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
840d0609cedSBarry Smith   PetscOptionsEnd();
8413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
842bc952696SBarry Smith }
84368bece0bSHong Zhang 
84468bece0bSHong Zhang /*@
84568bece0bSHong Zhang   TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
846bcf0153eSBarry Smith   of a `TS` `TSTrajectory`.
84768bece0bSHong Zhang 
848c3339decSBarry Smith   Collective
84968bece0bSHong Zhang 
850d8d19677SJose E. Roman   Input Parameters:
851bcf0153eSBarry Smith + tj - the `TSTrajectory` context
852bcf0153eSBarry Smith - ts - the TS context obtained from `TSCreate()`
85368bece0bSHong Zhang 
854df5474d8SHong Zhang   Level: developer
85568bece0bSHong Zhang 
8561cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
85768bece0bSHong Zhang @*/
TSTrajectorySetUp(TSTrajectory tj,TS ts)858d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts)
859d71ae5a4SJacob Faibussowitsch {
8609afe7f3eSBarry Smith   size_t s1, s2;
86168bece0bSHong Zhang 
86268bece0bSHong Zhang   PetscFunctionBegin;
8633ba16761SJacob Faibussowitsch   if (!tj) PetscFunctionReturn(PETSC_SUCCESS);
86468bece0bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
865fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
8663ba16761SJacob Faibussowitsch   if (tj->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
86768bece0bSHong Zhang 
8689566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
86948a46eb9SPierre Jolivet   if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
870dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setup, ts);
87168bece0bSHong Zhang 
87268bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
87353b27ddbSHong Zhang 
87453b27ddbSHong Zhang   /* Set the counters to zero */
8751a5a771fSHong Zhang   tj->recomps    = 0;
87653b27ddbSHong Zhang   tj->diskreads  = 0;
87753b27ddbSHong Zhang   tj->diskwrites = 0;
8789566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname, &s1));
8799566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate, &s2));
8809566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8819566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8829566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8839566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
8843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
88568bece0bSHong Zhang }
886fe8322adSStefano Zampini 
887fe8322adSStefano Zampini /*@
888bcf0153eSBarry Smith   TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage information
889fe8322adSStefano Zampini 
890c3339decSBarry Smith   Collective
891fe8322adSStefano Zampini 
892d8d19677SJose E. Roman   Input Parameters:
893bcf0153eSBarry Smith + tj            - the `TSTrajectory` context obtained with `TSGetTrajectory()`
894b43aa488SJacob Faibussowitsch - solution_only - the boolean flag
895fe8322adSStefano Zampini 
896fe8322adSStefano Zampini   Level: developer
897fe8322adSStefano Zampini 
8981cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
899fe8322adSStefano Zampini @*/
TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)900d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only)
901d71ae5a4SJacob Faibussowitsch {
902fe8322adSStefano Zampini   PetscFunctionBegin;
903fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
904fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj, solution_only, 2);
905fe8322adSStefano Zampini   tj->solution_only = solution_only;
9063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
907fe8322adSStefano Zampini }
908fe8322adSStefano Zampini 
909fe8322adSStefano Zampini /*@
910bcf0153eSBarry Smith   TSTrajectoryGetSolutionOnly - Gets the value set with `TSTrajectorySetSolutionOnly()`.
911fe8322adSStefano Zampini 
91220f4b53cSBarry Smith   Logically Collective
913fe8322adSStefano Zampini 
914fe8322adSStefano Zampini   Input Parameter:
915bcf0153eSBarry Smith . tj - the `TSTrajectory` context
916fe8322adSStefano Zampini 
917fe8322adSStefano Zampini   Output Parameter:
918b43aa488SJacob Faibussowitsch . solution_only - the boolean flag
919fe8322adSStefano Zampini 
920fe8322adSStefano Zampini   Level: developer
921fe8322adSStefano Zampini 
9221cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
923fe8322adSStefano Zampini @*/
TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool * solution_only)924d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only)
925d71ae5a4SJacob Faibussowitsch {
926fe8322adSStefano Zampini   PetscFunctionBegin;
927fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
9284f572ea9SToby Isaac   PetscAssertPointer(solution_only, 2);
929fe8322adSStefano Zampini   *solution_only = tj->solution_only;
9303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
931fe8322adSStefano Zampini }
932fe8322adSStefano Zampini 
933fe8322adSStefano Zampini /*@
934fe8322adSStefano Zampini   TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
935fe8322adSStefano Zampini 
936c3339decSBarry Smith   Collective
937fe8322adSStefano Zampini 
938d8d19677SJose E. Roman   Input Parameters:
939bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
940bcf0153eSBarry Smith . ts   - the `TS` solver context
941fe8322adSStefano Zampini - time - the requested time
942fe8322adSStefano Zampini 
943d8d19677SJose E. Roman   Output Parameters:
944fe8322adSStefano Zampini + U    - state vector at given time (can be interpolated)
945fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated)
946fe8322adSStefano Zampini 
947fe8322adSStefano Zampini   Level: developer
948fe8322adSStefano Zampini 
949bcf0153eSBarry Smith   Notes:
950bcf0153eSBarry Smith   The vectors are interpolated if time does not match any time step stored in the `TSTrajectory()`. Pass NULL to not request a vector.
951fe8322adSStefano Zampini 
952bcf0153eSBarry Smith   This function differs from `TSTrajectoryGetVecs()` since the vectors obtained cannot be modified, and they need to be returned by
953bcf0153eSBarry Smith   calling `TSTrajectoryRestoreUpdatedHistoryVecs()`.
954bcf0153eSBarry Smith 
9551cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
956fe8322adSStefano Zampini @*/
TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj,TS ts,PetscReal time,Vec * U,Vec * Udot)957d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
958d71ae5a4SJacob Faibussowitsch {
959fe8322adSStefano Zampini   PetscFunctionBegin;
960fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
961fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
962fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 3);
9634f572ea9SToby Isaac   if (U) PetscAssertPointer(U, 4);
9644f572ea9SToby Isaac   if (Udot) PetscAssertPointer(Udot, 5);
965fe8322adSStefano Zampini   if (U && !tj->U) {
966fe8322adSStefano Zampini     DM dm;
967fe8322adSStefano Zampini 
9689566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9699566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->U));
970fe8322adSStefano Zampini   }
971fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
972fe8322adSStefano Zampini     DM dm;
973fe8322adSStefano Zampini 
9749566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9759566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
976fe8322adSStefano Zampini   }
9779566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
978fe8322adSStefano Zampini   if (U) {
9799566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
980fe8322adSStefano Zampini     *U = tj->U;
981fe8322adSStefano Zampini   }
982fe8322adSStefano Zampini   if (Udot) {
9839566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
984fe8322adSStefano Zampini     *Udot = tj->Udot;
985fe8322adSStefano Zampini   }
9863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
987fe8322adSStefano Zampini }
988fe8322adSStefano Zampini 
989fe8322adSStefano Zampini /*@
990bcf0153eSBarry Smith   TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with `TSTrajectoryGetUpdatedHistoryVecs()`.
991fe8322adSStefano Zampini 
992c3339decSBarry Smith   Collective
993fe8322adSStefano Zampini 
994d8d19677SJose E. Roman   Input Parameters:
995bcf0153eSBarry Smith + tj   - the `TSTrajectory` context
996fe8322adSStefano Zampini . U    - state vector at given time (can be interpolated)
997fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated)
998fe8322adSStefano Zampini 
999fe8322adSStefano Zampini   Level: developer
1000fe8322adSStefano Zampini 
10011cc06b55SBarry Smith .seealso: [](ch_ts), `TSTrajectory`, `TSTrajectoryGetUpdatedHistoryVecs()`
1002fe8322adSStefano Zampini @*/
TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj,Vec * U,Vec * Udot)1003d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1004d71ae5a4SJacob Faibussowitsch {
1005fe8322adSStefano Zampini   PetscFunctionBegin;
1006fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
1007fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
1008fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
10093c633725SBarry Smith   PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10103c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1011fe8322adSStefano Zampini   if (U) {
10129566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1013fe8322adSStefano Zampini     *U = NULL;
1014fe8322adSStefano Zampini   }
1015fe8322adSStefano Zampini   if (Udot) {
10169566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1017fe8322adSStefano Zampini     *Udot = NULL;
1018fe8322adSStefano Zampini   }
10193ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1020fe8322adSStefano Zampini }
1021