xref: /petsc/src/ts/trajectory/interface/traj.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h"  I*/
2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h>
3fe8322adSStefano Zampini #include <petscdm.h>
4bc952696SBarry Smith 
5bc952696SBarry Smith PetscFunctionList TSTrajectoryList              = NULL;
6bc952696SBarry Smith PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
7bc952696SBarry Smith PetscClassId      TSTRAJECTORY_CLASSID;
82bf6d308SHong Zhang PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp;
9bc952696SBarry Smith 
10bc952696SBarry Smith /*@C
11bc952696SBarry Smith   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
12bc952696SBarry Smith 
13bc952696SBarry Smith   Not Collective
14bc952696SBarry Smith 
15bc952696SBarry Smith   Input Parameters:
163c0fce88SHong Zhang + name        - the name of a new user-defined creation routine
173c0fce88SHong Zhang - create_func - the creation routine itself
18bc952696SBarry Smith 
19bc952696SBarry Smith   Notes:
20bc952696SBarry Smith   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
21bc952696SBarry Smith 
22df5474d8SHong Zhang   Level: developer
23bc952696SBarry Smith 
24db781477SPatrick Sanan .seealso: `TSTrajectoryRegisterAll()`
25bc952696SBarry Smith @*/
26*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegister(const char sname[], PetscErrorCode (*function)(TSTrajectory, TS))
27*d71ae5a4SJacob Faibussowitsch {
28bc952696SBarry Smith   PetscFunctionBegin;
299566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TSTrajectoryList, sname, function));
30bc952696SBarry Smith   PetscFunctionReturn(0);
31bc952696SBarry Smith }
32bc952696SBarry Smith 
33fe8322adSStefano Zampini /*@
34fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
35fe8322adSStefano Zampini 
36fe8322adSStefano Zampini   Collective on TSTrajectory
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 
47fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
48fe8322adSStefano Zampini 
49db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()`
50fe8322adSStefano Zampini @*/
51*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal time, Vec X)
52*d71ae5a4SJacob Faibussowitsch {
53bc952696SBarry Smith   PetscFunctionBegin;
54bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
55fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
56fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
57fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
58fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 4);
59fe8322adSStefano Zampini   PetscValidHeaderSpecific(X, VEC_CLASSID, 5);
603c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
6148a46eb9SPierre 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));
629566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set, tj, ts, 0, 0));
63dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, set, ts, stepnum, time, X);
649566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set, tj, ts, 0, 0));
651baa6e33SBarry Smith   if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh, stepnum, time));
66fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
67bc952696SBarry Smith   PetscFunctionReturn(0);
68bc952696SBarry Smith }
69bc952696SBarry Smith 
70fe8322adSStefano Zampini /*@
71fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
72fe8322adSStefano Zampini 
73fe8322adSStefano Zampini   Not collective.
74fe8322adSStefano Zampini 
75fe8322adSStefano Zampini   Input Parameters:
76fe8322adSStefano Zampini . tj - the trajectory object
77fe8322adSStefano Zampini 
78fe8322adSStefano Zampini   Output Parameter:
79fe8322adSStefano Zampini . steps - the number of steps
80fe8322adSStefano Zampini 
81fe8322adSStefano Zampini   Level: developer
82fe8322adSStefano Zampini 
83db781477SPatrick Sanan .seealso: `TSTrajectorySet()`
84fe8322adSStefano Zampini @*/
85*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
86*d71ae5a4SJacob Faibussowitsch {
87fe8322adSStefano Zampini   PetscFunctionBegin;
88fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
89fe8322adSStefano Zampini   PetscValidIntPointer(steps, 2);
909566063dSJacob Faibussowitsch   PetscCall(TSHistoryGetNumSteps(tj->tsh, steps));
91fe8322adSStefano Zampini   PetscFunctionReturn(0);
92fe8322adSStefano Zampini }
93fe8322adSStefano Zampini 
94fe8322adSStefano Zampini /*@
95fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
96fe8322adSStefano Zampini 
97fe8322adSStefano Zampini   Collective on TS
98fe8322adSStefano Zampini 
99fe8322adSStefano Zampini   Input Parameters:
100fe8322adSStefano Zampini + tj      - the trajectory object
101fe8322adSStefano Zampini . ts      - the time stepper object
102fe8322adSStefano Zampini - stepnum - the step number
103fe8322adSStefano Zampini 
104fe8322adSStefano Zampini   Output Parameter:
105fe8322adSStefano Zampini . time    - the time associated with the step number
106fe8322adSStefano Zampini 
107fe8322adSStefano Zampini   Level: developer
108fe8322adSStefano Zampini 
109fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
110fe8322adSStefano Zampini 
111db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
112fe8322adSStefano Zampini @*/
113*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGet(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time)
114*d71ae5a4SJacob Faibussowitsch {
115bc952696SBarry Smith   PetscFunctionBegin;
1163c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
117fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
118fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
119fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
120dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
1213c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1223c633725SBarry Smith   PetscCheck(stepnum >= 0, PetscObjectComm((PetscObject)tj), PETSC_ERR_PLIB, "Requesting negative step number");
123fe8322adSStefano Zampini   if (tj->monitor) {
12463a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n", stepnum, (PetscInt)!tj->solution_only));
1259566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
126fe8322adSStefano Zampini   }
1279566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get, tj, ts, 0, 0));
128dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj, get, ts, stepnum, time);
1299566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get, tj, ts, 0, 0));
130bc952696SBarry Smith   PetscFunctionReturn(0);
131bc952696SBarry Smith }
132bc952696SBarry Smith 
133fe8322adSStefano Zampini /*@
134fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
135fe8322adSStefano Zampini 
136fe8322adSStefano Zampini   Collective on TS
137fe8322adSStefano Zampini 
138fe8322adSStefano Zampini   Input Parameters:
139fe8322adSStefano Zampini + tj      - the trajectory object
140fe8322adSStefano Zampini . ts      - the time stepper object (optional)
141fe8322adSStefano Zampini - stepnum - the requested step number
142fe8322adSStefano Zampini 
1436b867d5aSJose E. Roman   Input/Output Parameter:
144fe8322adSStefano Zampini 
145fe8322adSStefano Zampini   Output Parameters:
146f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number
147f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
148fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
149fe8322adSStefano Zampini 
150fe8322adSStefano Zampini   Level: developer
151fe8322adSStefano Zampini 
152fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
153fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
154fe8322adSStefano Zampini 
155db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
156fe8322adSStefano Zampini @*/
157*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj, TS ts, PetscInt stepnum, PetscReal *time, Vec U, Vec Udot)
158*d71ae5a4SJacob Faibussowitsch {
159fe8322adSStefano Zampini   PetscFunctionBegin;
1603c633725SBarry Smith   PetscCheck(tj, PetscObjectComm((PetscObject)ts), PETSC_ERR_ARG_WRONGSTATE, "TS solver did not save trajectory");
161fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
162fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
163fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj, stepnum, 3);
164dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time, 4);
165fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U, VEC_CLASSID, 5);
166fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot, VEC_CLASSID, 6);
167fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
1683c633725SBarry Smith   PetscCheck(tj->setupcalled, PetscObjectComm((PetscObject)tj), PETSC_ERR_ORDER, "TSTrajectorySetUp should be called first");
1699566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs, tj, ts, 0, 0));
170fe8322adSStefano Zampini   if (tj->monitor) {
171fe8322adSStefano Zampini     PetscInt pU, pUdot;
172fe8322adSStefano Zampini     pU    = U ? 1 : 0;
173fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
17463a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n", pU, pUdot, stepnum, (double)*time));
1759566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
176fe8322adSStefano Zampini   }
177fe8322adSStefano Zampini   if (U && tj->lag.caching) {
178fe8322adSStefano Zampini     PetscObjectId    id;
179fe8322adSStefano Zampini     PetscObjectState state;
180fe8322adSStefano Zampini 
1819566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &state));
1829566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &id));
183fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
184fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
185fe8322adSStefano Zampini     } else {
186fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
187fe8322adSStefano Zampini     }
188fe8322adSStefano Zampini     if (tj->monitor && !U) {
1899566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1909566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "State vector cached\n"));
1919566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1929566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
193fe8322adSStefano Zampini     }
194fe8322adSStefano Zampini   }
195fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
196fe8322adSStefano Zampini     PetscObjectId    id;
197fe8322adSStefano Zampini     PetscObjectState state;
198fe8322adSStefano Zampini 
1999566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot, &state));
2009566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot, &id));
201fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
202fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
203fe8322adSStefano Zampini     } else {
204fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
205fe8322adSStefano Zampini     }
206fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2079566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2089566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor, "Derivative vector cached\n"));
2099566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2109566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
211fe8322adSStefano Zampini     }
212fe8322adSStefano Zampini   }
213fe8322adSStefano Zampini   if (!U && !Udot) {
2149566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
215fe8322adSStefano Zampini     PetscFunctionReturn(0);
216fe8322adSStefano Zampini   }
217fe8322adSStefano Zampini 
218fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2191baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
220fe8322adSStefano Zampini     /* cached states will be updated in the function */
2219566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj, ts, *time, U, Udot));
222fe8322adSStefano Zampini     if (tj->monitor) {
2239566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2249566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
225fe8322adSStefano Zampini     }
226fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
227fe8322adSStefano Zampini     TS  fakets = ts;
228fe8322adSStefano Zampini     Vec U2;
229fe8322adSStefano Zampini 
230fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
231fe8322adSStefano Zampini     if (!ts) {
2329566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj, "__fake_ts", (PetscObject *)&fakets));
233fe8322adSStefano Zampini       if (!fakets) {
2349566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj), &fakets));
2359566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj, "__fake_ts", (PetscObject)fakets));
2369566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2379566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U, &U2));
2389566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets, U2));
2399566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
240fe8322adSStefano Zampini       }
241fe8322adSStefano Zampini     }
2429566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj, fakets, stepnum, time));
2439566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets, &U2));
2449566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2, U));
2459566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U, &tj->lag.Ucached.state));
2469566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U, &tj->lag.Ucached.id));
247fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
248fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
249fe8322adSStefano Zampini   }
2509566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs, tj, ts, 0, 0));
251fe8322adSStefano Zampini   PetscFunctionReturn(0);
252fe8322adSStefano Zampini }
253fe8322adSStefano Zampini 
254bc952696SBarry Smith /*@C
255fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
256fe2efc57SMark 
257fe2efc57SMark    Collective on TSTrajectory
258fe2efc57SMark 
259fe2efc57SMark    Input Parameters:
260fe2efc57SMark +  A - the TSTrajectory context
261736c3998SJose E. Roman .  obj - Optional object
262736c3998SJose E. Roman -  name - command line option
263fe2efc57SMark 
264fe2efc57SMark    Level: intermediate
265db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
266fe2efc57SMark @*/
267*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A, PetscObject obj, const char name[])
268*d71ae5a4SJacob Faibussowitsch {
269fe2efc57SMark   PetscFunctionBegin;
270fe2efc57SMark   PetscValidHeaderSpecific(A, TSTRAJECTORY_CLASSID, 1);
2719566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
272fe2efc57SMark   PetscFunctionReturn(0);
273fe2efc57SMark }
274fe2efc57SMark 
275fe2efc57SMark /*@C
276bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
277bc952696SBarry Smith 
278bc952696SBarry Smith     Collective on TSTrajectory
279bc952696SBarry Smith 
280bc952696SBarry Smith     Input Parameters:
281b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
282bc952696SBarry Smith -   viewer - visualization context
283bc952696SBarry Smith 
284bc952696SBarry Smith     Options Database Key:
285e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
286bc952696SBarry Smith 
287bc952696SBarry Smith     Notes:
288bc952696SBarry Smith     The available visualization contexts include
289bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
290bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
291bc952696SBarry Smith          output where only the first processor opens
292bc952696SBarry Smith          the file.  All other processors send their
293bc952696SBarry Smith          data to the first processor to print.
294bc952696SBarry Smith 
295bc952696SBarry Smith     The user can open an alternative visualization context with
296bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
297bc952696SBarry Smith 
298df5474d8SHong Zhang     Level: developer
299bc952696SBarry Smith 
300db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`
301bc952696SBarry Smith @*/
302*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryView(TSTrajectory tj, PetscViewer viewer)
303*d71ae5a4SJacob Faibussowitsch {
304bc952696SBarry Smith   PetscBool iascii;
305bc952696SBarry Smith 
306bc952696SBarry Smith   PetscFunctionBegin;
3071a5a771fSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
30848a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj), &viewer));
309bc952696SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
310b1d74d50SHong Zhang   PetscCheckSameComm(tj, 1, viewer, 2);
311bc952696SBarry Smith 
3129566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
313bc952696SBarry Smith   if (iascii) {
3149566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj, viewer));
31563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n", tj->recomps));
31663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint reads = %" PetscInt_FMT "\n", tj->diskreads));
31763a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  disk checkpoint writes = %" PetscInt_FMT "\n", tj->diskwrites));
3189566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
319dbbe0bcdSBarry Smith     PetscTryTypeMethod(tj, view, viewer);
3209566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
321bc952696SBarry Smith   }
322bc952696SBarry Smith   PetscFunctionReturn(0);
323bc952696SBarry Smith }
324bc952696SBarry Smith 
325bc952696SBarry Smith /*@C
32678fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
32778fbdcc8SBarry Smith 
32878fbdcc8SBarry Smith    Collective on TSTrajectory
32978fbdcc8SBarry Smith 
33078fbdcc8SBarry Smith    Input Parameters:
33178fbdcc8SBarry Smith +  tr - the trajectory context
33278fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
33378fbdcc8SBarry Smith 
33478fbdcc8SBarry Smith    Level: intermediate
33578fbdcc8SBarry Smith 
336db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
337db901c5bSHong Zhang 
338db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()`
33978fbdcc8SBarry Smith @*/
340*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx, const char *const *names)
341*d71ae5a4SJacob Faibussowitsch {
34278fbdcc8SBarry Smith   PetscFunctionBegin;
343fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx, TSTRAJECTORY_CLASSID, 1);
344fe8322adSStefano Zampini   PetscValidPointer(names, 2);
3459566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3469566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names, &ctx->names));
34778fbdcc8SBarry Smith   PetscFunctionReturn(0);
34878fbdcc8SBarry Smith }
34978fbdcc8SBarry Smith 
35078fbdcc8SBarry Smith /*@C
351fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35208347785SBarry Smith 
35308347785SBarry Smith    Collective on TSLGCtx
35408347785SBarry Smith 
35508347785SBarry Smith    Input Parameters:
35608347785SBarry Smith +  tj - the TSTrajectory context
35708347785SBarry Smith .  transform - the transform function
35808347785SBarry Smith .  destroy - function to destroy the optional context
35908347785SBarry Smith -  ctx - optional context used by transform function
36008347785SBarry Smith 
36108347785SBarry Smith    Level: intermediate
36208347785SBarry Smith 
363db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
36408347785SBarry Smith @*/
365*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj, PetscErrorCode (*transform)(void *, Vec, Vec *), PetscErrorCode (*destroy)(void *), void *tctx)
366*d71ae5a4SJacob Faibussowitsch {
36708347785SBarry Smith   PetscFunctionBegin;
368fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
36908347785SBarry Smith   tj->transform        = transform;
37008347785SBarry Smith   tj->transformdestroy = destroy;
37108347785SBarry Smith   tj->transformctx     = tctx;
37208347785SBarry Smith   PetscFunctionReturn(0);
37308347785SBarry Smith }
37408347785SBarry Smith 
375db901c5bSHong Zhang /*@
376bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
377bc952696SBarry Smith 
378d083f849SBarry Smith   Collective
379bc952696SBarry Smith 
380bc952696SBarry Smith   Input Parameter:
3813c0fce88SHong Zhang . comm - the communicator
382bc952696SBarry Smith 
383bc952696SBarry Smith   Output Parameter:
3843c0fce88SHong Zhang . tj   - the trajectory object
385bc952696SBarry Smith 
386df5474d8SHong Zhang   Level: developer
387bc952696SBarry Smith 
38895452b02SPatrick Sanan   Notes:
38995452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
390bc952696SBarry Smith 
391db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
392bc952696SBarry Smith @*/
393*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryCreate(MPI_Comm comm, TSTrajectory *tj)
394*d71ae5a4SJacob Faibussowitsch {
395bc952696SBarry Smith   TSTrajectory t;
396bc952696SBarry Smith 
397bc952696SBarry Smith   PetscFunctionBegin;
398b1d74d50SHong Zhang   PetscValidPointer(tj, 2);
399b1d74d50SHong Zhang   *tj = NULL;
4009566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
401bc952696SBarry Smith 
4029566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t, TSTRAJECTORY_CLASSID, "TSTrajectory", "Time stepping", "TS", comm, TSTrajectoryDestroy, TSTrajectoryView));
40368bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4049566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm, &t->tsh));
405fe8322adSStefano Zampini 
406fe8322adSStefano Zampini   t->lag.order            = 1;
407fe8322adSStefano Zampini   t->lag.L                = NULL;
408fe8322adSStefano Zampini   t->lag.T                = NULL;
409fe8322adSStefano Zampini   t->lag.W                = NULL;
410fe8322adSStefano Zampini   t->lag.WW               = NULL;
411fe8322adSStefano Zampini   t->lag.TW               = NULL;
412fe8322adSStefano Zampini   t->lag.TT               = NULL;
413fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
414fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
415fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
416fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
417fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
418fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
419fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
420fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
421fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
422fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
423fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
424fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
425ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
426b1d74d50SHong Zhang   *tj                     = t;
42763a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t, "TS-%06" PetscInt_FMT ".bin"));
428bc952696SBarry Smith   PetscFunctionReturn(0);
429bc952696SBarry Smith }
430bc952696SBarry Smith 
431bc952696SBarry Smith /*@C
432bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
433bc952696SBarry Smith 
434bc952696SBarry Smith   Collective on TS
435bc952696SBarry Smith 
436bc952696SBarry Smith   Input Parameters:
4373c0fce88SHong Zhang + tj   - the TSTrajectory context
4383c0fce88SHong Zhang . ts   - the TS context
4393c0fce88SHong Zhang - type - a known method
440bc952696SBarry Smith 
441bc952696SBarry Smith   Options Database Command:
442e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
443bc952696SBarry Smith 
444df5474d8SHong Zhang    Level: developer
445bc952696SBarry Smith 
446db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
447bc952696SBarry Smith 
448bc952696SBarry Smith @*/
449*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetType(TSTrajectory tj, TS ts, TSTrajectoryType type)
450*d71ae5a4SJacob Faibussowitsch {
451972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory, TS);
452bc952696SBarry Smith   PetscBool match;
453bc952696SBarry Smith 
454bc952696SBarry Smith   PetscFunctionBegin;
455972caf09SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
4569566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj, type, &match));
457bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
458bc952696SBarry Smith 
4599566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList, type, &r));
4603c633725SBarry Smith   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TSTrajectory type: %s", type);
461972caf09SHong Zhang   if (tj->ops->destroy) {
4629566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
463bc952696SBarry Smith 
464972caf09SHong Zhang     tj->ops->destroy = NULL;
465bc952696SBarry Smith   }
4669566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops, sizeof(*tj->ops)));
467bc952696SBarry Smith 
4689566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj, type));
4699566063dSJacob Faibussowitsch   PetscCall((*r)(tj, ts));
470bc952696SBarry Smith   PetscFunctionReturn(0);
471bc952696SBarry Smith }
472bc952696SBarry Smith 
473881c1a9bSHong Zhang /*@C
474881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
475881c1a9bSHong Zhang 
476881c1a9bSHong Zhang   Collective on TS
477881c1a9bSHong Zhang 
478881c1a9bSHong Zhang   Input Parameters:
479881c1a9bSHong Zhang + tj   - the TSTrajectory context
480881c1a9bSHong Zhang - ts   - the TS context
481881c1a9bSHong Zhang 
482881c1a9bSHong Zhang   Output Parameters:
483881c1a9bSHong Zhang . type - a known method
484881c1a9bSHong Zhang 
485881c1a9bSHong Zhang   Level: developer
486881c1a9bSHong Zhang 
487db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
488881c1a9bSHong Zhang 
489881c1a9bSHong Zhang @*/
490*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetType(TSTrajectory tj, TS ts, TSTrajectoryType *type)
491*d71ae5a4SJacob Faibussowitsch {
492881c1a9bSHong Zhang   PetscFunctionBegin;
493881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
494881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
495881c1a9bSHong Zhang   PetscFunctionReturn(0);
496881c1a9bSHong Zhang }
497881c1a9bSHong Zhang 
498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory, TS);
499972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory, TS);
5009a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory, TS);
5012b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory, TS);
502bc952696SBarry Smith 
503bc952696SBarry Smith /*@C
504bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
505bc952696SBarry Smith 
506bc952696SBarry Smith   Not Collective
507bc952696SBarry Smith 
508df5474d8SHong Zhang   Level: developer
509bc952696SBarry Smith 
510db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()`
511bc952696SBarry Smith @*/
512*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRegisterAll(void)
513*d71ae5a4SJacob Faibussowitsch {
514bc952696SBarry Smith   PetscFunctionBegin;
515560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
516bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
517bc952696SBarry Smith 
5189566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC, TSTrajectoryCreate_Basic));
5199566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE, TSTrajectoryCreate_Singlefile));
5209566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY, TSTrajectoryCreate_Memory));
5219566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION, TSTrajectoryCreate_Visualization));
522bc952696SBarry Smith   PetscFunctionReturn(0);
523bc952696SBarry Smith }
524bc952696SBarry Smith 
525bc952696SBarry Smith /*@
5261550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5271550c9b9SHong Zhang 
5281550c9b9SHong Zhang    Collective on TSTrajectory
5291550c9b9SHong Zhang 
5301550c9b9SHong Zhang    Input Parameter:
5311550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5321550c9b9SHong Zhang 
5331550c9b9SHong Zhang    Level: developer
5341550c9b9SHong Zhang 
535db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5361550c9b9SHong Zhang @*/
537*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
538*d71ae5a4SJacob Faibussowitsch {
5391550c9b9SHong Zhang   PetscFunctionBegin;
5409a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5419a992471SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
542dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, reset);
5439566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5449566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5459566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj), &tj->tsh));
546fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5471550c9b9SHong Zhang   PetscFunctionReturn(0);
5481550c9b9SHong Zhang }
5491550c9b9SHong Zhang 
5501550c9b9SHong Zhang /*@
551bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
552bc952696SBarry Smith 
553bc952696SBarry Smith    Collective on TSTrajectory
554bc952696SBarry Smith 
555bc952696SBarry Smith    Input Parameter:
5563c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
557bc952696SBarry Smith 
558df5474d8SHong Zhang    Level: developer
559bc952696SBarry Smith 
560db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
561bc952696SBarry Smith @*/
562*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
563*d71ae5a4SJacob Faibussowitsch {
564bc952696SBarry Smith   PetscFunctionBegin;
565972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
566972caf09SHong Zhang   PetscValidHeaderSpecific((*tj), TSTRAJECTORY_CLASSID, 1);
5679371c9d4SSatish Balay   if (--((PetscObject)(*tj))->refct > 0) {
5689371c9d4SSatish Balay     *tj = NULL;
5699371c9d4SSatish Balay     PetscFunctionReturn(0);
5709371c9d4SSatish Balay   }
571bc952696SBarry Smith 
5729566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5739566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5749566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order + 1, &(*tj)->lag.W));
5759566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L, (*tj)->lag.T, (*tj)->lag.WW, (*tj)->lag.TT, (*tj)->lag.TW));
5769566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5779566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5789a992471SHong Zhang 
5799566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
580dbbe0bcdSBarry Smith   PetscTryTypeMethod((*tj), destroy);
581fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
582fe8322adSStefano Zampini     PetscMPIInt rank;
583fe8322adSStefano Zampini     MPI_Comm    comm;
584fe8322adSStefano Zampini 
5859566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj), &comm));
5869566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
587dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5889566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
589fe8322adSStefano Zampini     }
590fe8322adSStefano Zampini   }
5919566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5929566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5939566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5949566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
595bc952696SBarry Smith   PetscFunctionReturn(0);
596bc952696SBarry Smith }
597bc952696SBarry Smith 
598bc952696SBarry Smith /*
599772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
600bc952696SBarry Smith 
601bc952696SBarry Smith   Collective on TSTrajectory
602bc952696SBarry Smith 
603bc952696SBarry Smith   Input Parameter:
6043c0fce88SHong Zhang + tj - the TSTrajectory context
6053c0fce88SHong Zhang - ts - the TS context
6063c0fce88SHong Zhang 
6073c0fce88SHong Zhang   Options Database Keys:
6083c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
609bc952696SBarry Smith 
610df5474d8SHong Zhang   Level: developer
611bc952696SBarry Smith 
612db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
613bc952696SBarry Smith */
614*d71ae5a4SJacob Faibussowitsch static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject, TSTrajectory tj, TS ts)
615*d71ae5a4SJacob Faibussowitsch {
616bc952696SBarry Smith   PetscBool   opt;
617bc952696SBarry Smith   const char *defaultType;
618bc952696SBarry Smith   char        typeName[256];
619bc952696SBarry Smith 
620bc952696SBarry Smith   PetscFunctionBegin;
621b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
622bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
623bc952696SBarry Smith 
6249566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type", "TSTrajectory method", "TSTrajectorySetType", TSTrajectoryList, defaultType, typeName, 256, &opt));
626bc952696SBarry Smith   if (opt) {
6279566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, typeName));
628bc952696SBarry Smith   } else {
6299566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj, ts, defaultType));
630bc952696SBarry Smith   }
631bc952696SBarry Smith   PetscFunctionReturn(0);
632bc952696SBarry Smith }
633bc952696SBarry Smith 
634ed695a29SHong Zhang /*@
6359ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6369ffb3502SHong Zhang 
6379ffb3502SHong Zhang    Collective on TSTrajectory
6389ffb3502SHong Zhang 
6394165533cSJose E. Roman    Input Parameters:
6409ffb3502SHong Zhang +  tj - the TSTrajectory context
6419ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6429ffb3502SHong Zhang 
6439ffb3502SHong Zhang    Options Database Keys:
6449ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6459ffb3502SHong Zhang 
6469ffb3502SHong Zhang    Level: advanced
6479ffb3502SHong Zhang 
648db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6499ffb3502SHong Zhang @*/
650*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj, PetscBool flg)
651*d71ae5a4SJacob Faibussowitsch {
6529ffb3502SHong Zhang   PetscFunctionBegin;
6539ffb3502SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
6549ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
6559ffb3502SHong Zhang   tj->usehistory = flg;
6569ffb3502SHong Zhang   PetscFunctionReturn(0);
6579ffb3502SHong Zhang }
6589ffb3502SHong Zhang 
6599ffb3502SHong Zhang /*@
660ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
661ed695a29SHong Zhang 
662ed695a29SHong Zhang    Collective on TSTrajectory
663ed695a29SHong Zhang 
6644165533cSJose E. Roman    Input Parameters:
665ed695a29SHong Zhang +  tj - the TSTrajectory context
666ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
667ed695a29SHong Zhang 
6683c0fce88SHong Zhang    Options Database Keys:
669063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6703c0fce88SHong Zhang 
671df5474d8SHong Zhang    Level: developer
672ed695a29SHong Zhang 
673db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
674ed695a29SHong Zhang @*/
675*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj, PetscBool flg)
676*d71ae5a4SJacob Faibussowitsch {
677ed695a29SHong Zhang   PetscFunctionBegin;
678ed695a29SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
679ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj, flg, 2);
680fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
681fe8322adSStefano Zampini   else tj->monitor = NULL;
682ed695a29SHong Zhang   PetscFunctionReturn(0);
683ed695a29SHong Zhang }
684ed695a29SHong Zhang 
685bc952696SBarry Smith /*@
68664fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
68764fc91eeSBarry Smith 
68864fc91eeSBarry Smith    Collective on TSTrajectory
68964fc91eeSBarry Smith 
6904165533cSJose E. Roman    Input Parameters:
69164fc91eeSBarry Smith +  tj - the TSTrajectory context
69264fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
69364fc91eeSBarry Smith 
69464fc91eeSBarry Smith    Options Database Keys:
69564fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
69664fc91eeSBarry Smith 
69795452b02SPatrick Sanan    Notes:
69895452b02SPatrick Sanan     By default the TSTrajectory used for adjoint computations, TSTRAJECTORYBASIC, removes the files it generates at the end of the run. This causes the files to be kept.
69964fc91eeSBarry Smith 
70064fc91eeSBarry Smith    Level: advanced
70164fc91eeSBarry Smith 
702db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70364fc91eeSBarry Smith @*/
704*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj, PetscBool flg)
705*d71ae5a4SJacob Faibussowitsch {
70664fc91eeSBarry Smith   PetscFunctionBegin;
70764fc91eeSBarry Smith   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
70864fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj, flg, 2);
70964fc91eeSBarry Smith   tj->keepfiles = flg;
71064fc91eeSBarry Smith   PetscFunctionReturn(0);
71164fc91eeSBarry Smith }
71264fc91eeSBarry Smith 
713db901c5bSHong Zhang /*@C
71464e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
71564e38db7SHong Zhang 
71664e38db7SHong Zhang    Collective on TSTrajectory
71764e38db7SHong Zhang 
7184165533cSJose E. Roman    Input Parameters:
71964e38db7SHong Zhang +  tj      - the TSTrajectory context
72064e38db7SHong Zhang -  dirname - the directory name
72164e38db7SHong Zhang 
72264e38db7SHong Zhang    Options Database Keys:
72364e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
72464e38db7SHong Zhang 
72595452b02SPatrick Sanan    Notes:
72695452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7271585b412SBarry Smith 
72864e38db7SHong Zhang    Level: developer
72964e38db7SHong Zhang 
730c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73164e38db7SHong Zhang @*/
732*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj, const char dirname[])
733*d71ae5a4SJacob Faibussowitsch {
734a17281aeSStefano Zampini   PetscBool flg;
735a17281aeSStefano Zampini 
73664e38db7SHong Zhang   PetscFunctionBegin;
73764e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
7389566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname, dirname, &flg));
739049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set directoryname after TSTrajectory has been setup");
7409566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7419566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname, &tj->dirname));
74264e38db7SHong Zhang   PetscFunctionReturn(0);
74364e38db7SHong Zhang }
74464e38db7SHong Zhang 
745db901c5bSHong Zhang /*@C
74664e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
74764e38db7SHong Zhang 
74864e38db7SHong Zhang    Collective on TSTrajectory
74964e38db7SHong Zhang 
7504165533cSJose E. Roman    Input Parameters:
75164e38db7SHong Zhang +  tj      - the TSTrajectory context
7521585b412SBarry Smith -  filetemplate - the template
75364e38db7SHong Zhang 
75464e38db7SHong Zhang    Options Database Keys:
7551585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7561585b412SBarry Smith 
75795452b02SPatrick Sanan    Notes:
75863a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7591585b412SBarry Smith 
76063a3b9bcSJacob Faibussowitsch    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06" PetscInt_FMT " is replaced by the
7611585b412SBarry Smith    timestep counter
76264e38db7SHong Zhang 
76364e38db7SHong Zhang    Level: developer
76464e38db7SHong Zhang 
765c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
76664e38db7SHong Zhang @*/
767*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj, const char filetemplate[])
768*d71ae5a4SJacob Faibussowitsch {
7699afe7f3eSBarry Smith   const char *ptr, *ptr2;
7709afe7f3eSBarry Smith 
77164e38db7SHong Zhang   PetscFunctionBegin;
77264e38db7SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
77363a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(filetemplate, 2);
7743c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate, PetscObjectComm((PetscObject)tj), PETSC_ERR_ARG_WRONGSTATE, "Cannot set filetemplate after TSTrajectory has been setup");
7759afe7f3eSBarry Smith 
77663a3b9bcSJacob 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");
7779afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7789566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate, "%", (char **)&ptr));
77963a3b9bcSJacob 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");
7809afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
78163a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX", *ptr, (char **)&ptr2));
78263a3b9bcSJacob 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");
7839afe7f3eSBarry Smith     if (ptr2) break;
7849afe7f3eSBarry Smith   }
7859566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7869566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate, &tj->filetemplate));
78764e38db7SHong Zhang   PetscFunctionReturn(0);
78864e38db7SHong Zhang }
78964e38db7SHong Zhang 
79064e38db7SHong Zhang /*@
791bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
792bc952696SBarry Smith 
793bc952696SBarry Smith    Collective on TSTrajectory
794bc952696SBarry Smith 
795d8d19677SJose E. Roman    Input Parameters:
7963c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
7973c0fce88SHong Zhang -  ts - the TS context
798bc952696SBarry Smith 
799bc952696SBarry Smith    Options Database Keys:
8003c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
80164fc91eeSBarry Smith .  -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
802063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
803bc952696SBarry Smith 
804df5474d8SHong Zhang    Level: developer
805bc952696SBarry Smith 
80695452b02SPatrick Sanan    Notes:
80795452b02SPatrick Sanan     This is not normally called directly by users
808bc952696SBarry Smith 
809db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
810bc952696SBarry Smith @*/
811*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj, TS ts)
812*d71ae5a4SJacob Faibussowitsch {
813ed695a29SHong Zhang   PetscBool set, flg;
81464e38db7SHong Zhang   char      dirname[PETSC_MAX_PATH_LEN], filetemplate[PETSC_MAX_PATH_LEN];
815bc952696SBarry Smith 
816bc952696SBarry Smith   PetscFunctionBegin;
817b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
818fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
819d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8209566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject, tj, ts));
8219566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history", "Turn on/off usage of TSHistory", NULL, tj->usehistory, &tj->usehistory, NULL));
8229566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor", "Print checkpointing schedules", "TSTrajectorySetMonitor", tj->monitor ? PETSC_TRUE : PETSC_FALSE, &flg, &set));
8239566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj, flg));
8249566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order", "Interpolation order for reconstruction", NULL, tj->lag.order, &tj->lag.order, NULL));
8259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching", "Turn on/off caching of TSTrajectoryGetVecs input", NULL, tj->lag.caching, &tj->lag.caching, NULL));
8269566063dSJacob 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));
8279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only", "Checkpoint solution only", "TSTrajectorySetSolutionOnly", tj->solution_only, &tj->solution_only, NULL));
8289566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files", "Keep any trajectory files generated during the run", "TSTrajectorySetKeepFiles", tj->keepfiles, &flg, &set));
8299566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj, flg));
83064e38db7SHong Zhang 
8319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname", "Directory name for TSTrajectory file", "TSTrajectorySetDirname", NULL, dirname, sizeof(dirname) - 14, &set));
8321baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj, dirname));
83364e38db7SHong Zhang 
83463a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template", "Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin", "TSTrajectorySetFiletemplate", NULL, filetemplate, sizeof(filetemplate), &set));
8351baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj, filetemplate));
83664e38db7SHong Zhang 
83764e38db7SHong Zhang   /* Handle specific TSTrajectory options */
838dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setfromoptions, PetscOptionsObject);
839d0609cedSBarry Smith   PetscOptionsEnd();
840bc952696SBarry Smith   PetscFunctionReturn(0);
841bc952696SBarry Smith }
84268bece0bSHong Zhang 
84368bece0bSHong Zhang /*@
84468bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
84568bece0bSHong Zhang    of a TS trajectory.
84668bece0bSHong Zhang 
84768bece0bSHong Zhang    Collective on TS
84868bece0bSHong Zhang 
849d8d19677SJose E. Roman    Input Parameters:
8503c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8513c0fce88SHong Zhang -  tj - the TS trajectory context
85268bece0bSHong Zhang 
853df5474d8SHong Zhang    Level: developer
85468bece0bSHong Zhang 
855db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
85668bece0bSHong Zhang @*/
857*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetUp(TSTrajectory tj, TS ts)
858*d71ae5a4SJacob Faibussowitsch {
8599afe7f3eSBarry Smith   size_t s1, s2;
86068bece0bSHong Zhang 
86168bece0bSHong Zhang   PetscFunctionBegin;
86268bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
86368bece0bSHong Zhang   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
864fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
86568bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
86668bece0bSHong Zhang 
8679566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp, tj, ts, 0, 0));
86848a46eb9SPierre Jolivet   if (!((PetscObject)tj)->type_name) PetscCall(TSTrajectorySetType(tj, ts, TSTRAJECTORYBASIC));
869dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj, setup, ts);
87068bece0bSHong Zhang 
87168bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
87253b27ddbSHong Zhang 
87353b27ddbSHong Zhang   /* Set the counters to zero */
8741a5a771fSHong Zhang   tj->recomps    = 0;
87553b27ddbSHong Zhang   tj->diskreads  = 0;
87653b27ddbSHong Zhang   tj->diskwrites = 0;
8779566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname, &s1));
8789566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate, &s2));
8799566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8809566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10) * sizeof(char), &tj->dirfiletemplate));
8819566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate, s1 + s2 + 10, "%s/%s", tj->dirname, tj->filetemplate));
8829566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp, tj, ts, 0, 0));
88368bece0bSHong Zhang   PetscFunctionReturn(0);
88468bece0bSHong Zhang }
885fe8322adSStefano Zampini 
886fe8322adSStefano Zampini /*@
887fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
888fe8322adSStefano Zampini 
889fe8322adSStefano Zampini    Collective on TSTrajectory
890fe8322adSStefano Zampini 
891d8d19677SJose E. Roman    Input Parameters:
892fe8322adSStefano Zampini +  tj  - the TS trajectory context
893fe8322adSStefano Zampini -  flg - the boolean flag
894fe8322adSStefano Zampini 
895fe8322adSStefano Zampini    Level: developer
896fe8322adSStefano Zampini 
897db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
898fe8322adSStefano Zampini @*/
899*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj, PetscBool solution_only)
900*d71ae5a4SJacob Faibussowitsch {
901fe8322adSStefano Zampini   PetscFunctionBegin;
902fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
903fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj, solution_only, 2);
904fe8322adSStefano Zampini   tj->solution_only = solution_only;
905fe8322adSStefano Zampini   PetscFunctionReturn(0);
906fe8322adSStefano Zampini }
907fe8322adSStefano Zampini 
908fe8322adSStefano Zampini /*@
909fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
910fe8322adSStefano Zampini 
911fe8322adSStefano Zampini    Logically collective on TSTrajectory
912fe8322adSStefano Zampini 
913fe8322adSStefano Zampini    Input Parameter:
914fe8322adSStefano Zampini .  tj  - the TS trajectory context
915fe8322adSStefano Zampini 
916fe8322adSStefano Zampini    Output Parameter:
917d8d19677SJose E. Roman .  flg - the boolean flag
918fe8322adSStefano Zampini 
919fe8322adSStefano Zampini    Level: developer
920fe8322adSStefano Zampini 
921db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
922fe8322adSStefano Zampini @*/
923*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj, PetscBool *solution_only)
924*d71ae5a4SJacob Faibussowitsch {
925fe8322adSStefano Zampini   PetscFunctionBegin;
926fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
927dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only, 2);
928fe8322adSStefano Zampini   *solution_only = tj->solution_only;
929fe8322adSStefano Zampini   PetscFunctionReturn(0);
930fe8322adSStefano Zampini }
931fe8322adSStefano Zampini 
932fe8322adSStefano Zampini /*@
933fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
934fe8322adSStefano Zampini 
935fe8322adSStefano Zampini    Collective on TSTrajectory
936fe8322adSStefano Zampini 
937d8d19677SJose E. Roman    Input Parameters:
938fe8322adSStefano Zampini +  tj   - the TS trajectory context
939fe8322adSStefano Zampini .  ts   - the TS solver context
940fe8322adSStefano Zampini -  time - the requested time
941fe8322adSStefano Zampini 
942d8d19677SJose E. Roman    Output Parameters:
943fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
944fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
945fe8322adSStefano Zampini 
946fe8322adSStefano Zampini    Level: developer
947fe8322adSStefano Zampini 
948fe8322adSStefano Zampini    Notes: The vectors are interpolated if time does not match any time step stored in the TSTrajectory(). Pass NULL to not request a vector.
949fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
950fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
951fe8322adSStefano Zampini 
952db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
953fe8322adSStefano Zampini @*/
954*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
955*d71ae5a4SJacob Faibussowitsch {
956fe8322adSStefano Zampini   PetscFunctionBegin;
957fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
958fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts, TS_CLASSID, 2);
959fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj, time, 3);
960fe8322adSStefano Zampini   if (U) PetscValidPointer(U, 4);
961fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot, 5);
962fe8322adSStefano Zampini   if (U && !tj->U) {
963fe8322adSStefano Zampini     DM dm;
964fe8322adSStefano Zampini 
9659566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9669566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->U));
967fe8322adSStefano Zampini   }
968fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
969fe8322adSStefano Zampini     DM dm;
970fe8322adSStefano Zampini 
9719566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts, &dm));
9729566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &tj->Udot));
973fe8322adSStefano Zampini   }
9749566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj, ts, PETSC_DECIDE, &time, U ? tj->U : NULL, Udot ? tj->Udot : NULL));
975fe8322adSStefano Zampini   if (U) {
9769566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
977fe8322adSStefano Zampini     *U = tj->U;
978fe8322adSStefano Zampini   }
979fe8322adSStefano Zampini   if (Udot) {
9809566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
981fe8322adSStefano Zampini     *Udot = tj->Udot;
982fe8322adSStefano Zampini   }
983fe8322adSStefano Zampini   PetscFunctionReturn(0);
984fe8322adSStefano Zampini }
985fe8322adSStefano Zampini 
986fe8322adSStefano Zampini /*@
987fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
988fe8322adSStefano Zampini 
989fe8322adSStefano Zampini    Collective on TSTrajectory
990fe8322adSStefano Zampini 
991d8d19677SJose E. Roman    Input Parameters:
992fe8322adSStefano Zampini +  tj   - the TS trajectory context
993fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
994fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
995fe8322adSStefano Zampini 
996fe8322adSStefano Zampini    Level: developer
997fe8322adSStefano Zampini 
998db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()`
999fe8322adSStefano Zampini @*/
1000*d71ae5a4SJacob Faibussowitsch PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1001*d71ae5a4SJacob Faibussowitsch {
1002fe8322adSStefano Zampini   PetscFunctionBegin;
1003fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj, TSTRAJECTORY_CLASSID, 1);
1004fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U, VEC_CLASSID, 2);
1005fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot, VEC_CLASSID, 3);
10063c633725SBarry Smith   PetscCheck(!U || *U == tj->U, PetscObjectComm((PetscObject)*U), PETSC_ERR_USER, "U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10073c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot, PetscObjectComm((PetscObject)*Udot), PETSC_ERR_USER, "Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1008fe8322adSStefano Zampini   if (U) {
10099566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1010fe8322adSStefano Zampini     *U = NULL;
1011fe8322adSStefano Zampini   }
1012fe8322adSStefano Zampini   if (Udot) {
10139566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1014fe8322adSStefano Zampini     *Udot = NULL;
1015fe8322adSStefano Zampini   }
1016fe8322adSStefano Zampini   PetscFunctionReturn(0);
1017fe8322adSStefano Zampini }
1018