xref: /petsc/src/ts/trajectory/interface/traj.c (revision dbbe0bcd3f3a8fbab5a45420dc06f8387e5764c6)
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 @*/
26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
27bc952696SBarry Smith {
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 @*/
51bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
52bc952696SBarry Smith {
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");
61fe8322adSStefano Zampini   if (tj->monitor) {
6263a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n",stepnum,(double)time,(PetscInt)!tj->solution_only));
63fe8322adSStefano Zampini   }
649566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0));
65*dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj,set ,ts,stepnum,time,X);
669566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0));
671baa6e33SBarry Smith   if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh,stepnum,time));
68fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
69bc952696SBarry Smith   PetscFunctionReturn(0);
70bc952696SBarry Smith }
71bc952696SBarry Smith 
72fe8322adSStefano Zampini /*@
73fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
74fe8322adSStefano Zampini 
75fe8322adSStefano Zampini   Not collective.
76fe8322adSStefano Zampini 
77fe8322adSStefano Zampini   Input Parameters:
78fe8322adSStefano Zampini . tj - the trajectory object
79fe8322adSStefano Zampini 
80fe8322adSStefano Zampini   Output Parameter:
81fe8322adSStefano Zampini . steps - the number of steps
82fe8322adSStefano Zampini 
83fe8322adSStefano Zampini   Level: developer
84fe8322adSStefano Zampini 
85db781477SPatrick Sanan .seealso: `TSTrajectorySet()`
86fe8322adSStefano Zampini @*/
87fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
88fe8322adSStefano Zampini {
89fe8322adSStefano Zampini   PetscFunctionBegin;
90fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
91fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
929566063dSJacob Faibussowitsch   PetscCall(TSHistoryGetNumSteps(tj->tsh,steps));
93fe8322adSStefano Zampini   PetscFunctionReturn(0);
94fe8322adSStefano Zampini }
95fe8322adSStefano Zampini 
96fe8322adSStefano Zampini /*@
97fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
98fe8322adSStefano Zampini 
99fe8322adSStefano Zampini   Collective on TS
100fe8322adSStefano Zampini 
101fe8322adSStefano Zampini   Input Parameters:
102fe8322adSStefano Zampini + tj      - the trajectory object
103fe8322adSStefano Zampini . ts      - the time stepper object
104fe8322adSStefano Zampini - stepnum - the step number
105fe8322adSStefano Zampini 
106fe8322adSStefano Zampini   Output Parameter:
107fe8322adSStefano Zampini . time    - the time associated with the step number
108fe8322adSStefano Zampini 
109fe8322adSStefano Zampini   Level: developer
110fe8322adSStefano Zampini 
111fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
112fe8322adSStefano Zampini 
113db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
114fe8322adSStefano Zampini @*/
115c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
116bc952696SBarry Smith {
117bc952696SBarry Smith   PetscFunctionBegin;
1183c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
119fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
120fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
121fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
122dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
1233c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1243c633725SBarry Smith   PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
125fe8322adSStefano Zampini   if (tj->monitor) {
12663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n",stepnum,(PetscInt)!tj->solution_only));
1279566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
128fe8322adSStefano Zampini   }
1299566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0));
130*dbbe0bcdSBarry Smith   PetscUseTypeMethod(tj,get ,ts,stepnum,time);
1319566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0));
132bc952696SBarry Smith   PetscFunctionReturn(0);
133bc952696SBarry Smith }
134bc952696SBarry Smith 
135fe8322adSStefano Zampini /*@
136fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
137fe8322adSStefano Zampini 
138fe8322adSStefano Zampini   Collective on TS
139fe8322adSStefano Zampini 
140fe8322adSStefano Zampini   Input Parameters:
141fe8322adSStefano Zampini + tj      - the trajectory object
142fe8322adSStefano Zampini . ts      - the time stepper object (optional)
143fe8322adSStefano Zampini - stepnum - the requested step number
144fe8322adSStefano Zampini 
1456b867d5aSJose E. Roman   Input/Output Parameter:
146fe8322adSStefano Zampini 
147fe8322adSStefano Zampini   Output Parameters:
148f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number
149f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
150fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
151fe8322adSStefano Zampini 
152fe8322adSStefano Zampini   Level: developer
153fe8322adSStefano Zampini 
154fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
155fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
156fe8322adSStefano Zampini 
157db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
158fe8322adSStefano Zampini @*/
159fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
160fe8322adSStefano Zampini {
161fe8322adSStefano Zampini   PetscFunctionBegin;
1623c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
163fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
164fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
165fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
166dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
167fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
168fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
169fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
1703c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1719566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0));
172fe8322adSStefano Zampini   if (tj->monitor) {
173fe8322adSStefano Zampini     PetscInt pU,pUdot;
174fe8322adSStefano Zampini     pU    = U ? 1 : 0;
175fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
17663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n",pU,pUdot,stepnum,(double)*time));
1779566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
178fe8322adSStefano Zampini   }
179fe8322adSStefano Zampini   if (U && tj->lag.caching) {
180fe8322adSStefano Zampini     PetscObjectId    id;
181fe8322adSStefano Zampini     PetscObjectState state;
182fe8322adSStefano Zampini 
1839566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U,&state));
1849566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U,&id));
185fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
186fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
187fe8322adSStefano Zampini     } else {
188fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
189fe8322adSStefano Zampini     }
190fe8322adSStefano Zampini     if (tj->monitor && !U) {
1919566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1929566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n"));
1939566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1949566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
195fe8322adSStefano Zampini     }
196fe8322adSStefano Zampini   }
197fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
198fe8322adSStefano Zampini     PetscObjectId    id;
199fe8322adSStefano Zampini     PetscObjectState state;
200fe8322adSStefano Zampini 
2019566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot,&state));
2029566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot,&id));
203fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
204fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
205fe8322adSStefano Zampini     } else {
206fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
207fe8322adSStefano Zampini     }
208fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2099566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2109566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n"));
2119566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2129566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
213fe8322adSStefano Zampini     }
214fe8322adSStefano Zampini   }
215fe8322adSStefano Zampini   if (!U && !Udot) {
2169566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
217fe8322adSStefano Zampini     PetscFunctionReturn(0);
218fe8322adSStefano Zampini   }
219fe8322adSStefano Zampini 
220fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2211baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
222fe8322adSStefano Zampini     /* cached states will be updated in the function */
2239566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot));
224fe8322adSStefano Zampini     if (tj->monitor) {
2259566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2269566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
227fe8322adSStefano Zampini     }
228fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
229fe8322adSStefano Zampini     TS  fakets = ts;
230fe8322adSStefano Zampini     Vec U2;
231fe8322adSStefano Zampini 
232fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
233fe8322adSStefano Zampini     if (!ts) {
2349566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets));
235fe8322adSStefano Zampini       if (!fakets) {
2369566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj),&fakets));
2379566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets));
2389566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2399566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U,&U2));
2409566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets,U2));
2419566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
242fe8322adSStefano Zampini       }
243fe8322adSStefano Zampini     }
2449566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj,fakets,stepnum,time));
2459566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets,&U2));
2469566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2,U));
2479566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state));
2489566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id));
249fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
250fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
251fe8322adSStefano Zampini   }
2529566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
253fe8322adSStefano Zampini   PetscFunctionReturn(0);
254fe8322adSStefano Zampini }
255fe8322adSStefano Zampini 
256bc952696SBarry Smith /*@C
257fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
258fe2efc57SMark 
259fe2efc57SMark    Collective on TSTrajectory
260fe2efc57SMark 
261fe2efc57SMark    Input Parameters:
262fe2efc57SMark +  A - the TSTrajectory context
263736c3998SJose E. Roman .  obj - Optional object
264736c3998SJose E. Roman -  name - command line option
265fe2efc57SMark 
266fe2efc57SMark    Level: intermediate
267db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
268fe2efc57SMark @*/
269fe2efc57SMark PetscErrorCode  TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])
270fe2efc57SMark {
271fe2efc57SMark   PetscFunctionBegin;
272fe2efc57SMark   PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1);
2739566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name));
274fe2efc57SMark   PetscFunctionReturn(0);
275fe2efc57SMark }
276fe2efc57SMark 
277fe2efc57SMark /*@C
278bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
279bc952696SBarry Smith 
280bc952696SBarry Smith     Collective on TSTrajectory
281bc952696SBarry Smith 
282bc952696SBarry Smith     Input Parameters:
283b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
284bc952696SBarry Smith -   viewer - visualization context
285bc952696SBarry Smith 
286bc952696SBarry Smith     Options Database Key:
287e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
288bc952696SBarry Smith 
289bc952696SBarry Smith     Notes:
290bc952696SBarry Smith     The available visualization contexts include
291bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
292bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
293bc952696SBarry Smith          output where only the first processor opens
294bc952696SBarry Smith          the file.  All other processors send their
295bc952696SBarry Smith          data to the first processor to print.
296bc952696SBarry Smith 
297bc952696SBarry Smith     The user can open an alternative visualization context with
298bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
299bc952696SBarry Smith 
300df5474d8SHong Zhang     Level: developer
301bc952696SBarry Smith 
302db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`
303bc952696SBarry Smith @*/
304b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
305bc952696SBarry Smith {
306bc952696SBarry Smith   PetscBool      iascii;
307bc952696SBarry Smith 
308bc952696SBarry Smith   PetscFunctionBegin;
3091a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
310bc952696SBarry Smith   if (!viewer) {
3119566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer));
312bc952696SBarry Smith   }
313bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
314b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
315bc952696SBarry Smith 
3169566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
317bc952696SBarry Smith   if (iascii) {
3189566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer));
31963a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n",tj->recomps));
32063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %" PetscInt_FMT "\n",tj->diskreads));
32163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %" PetscInt_FMT "\n",tj->diskwrites));
3229566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
323*dbbe0bcdSBarry Smith     PetscTryTypeMethod(tj,view ,viewer);
3249566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
325bc952696SBarry Smith   }
326bc952696SBarry Smith   PetscFunctionReturn(0);
327bc952696SBarry Smith }
328bc952696SBarry Smith 
329bc952696SBarry Smith /*@C
33078fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
33178fbdcc8SBarry Smith 
33278fbdcc8SBarry Smith    Collective on TSTrajectory
33378fbdcc8SBarry Smith 
33478fbdcc8SBarry Smith    Input Parameters:
33578fbdcc8SBarry Smith +  tr - the trajectory context
33678fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
33778fbdcc8SBarry Smith 
33878fbdcc8SBarry Smith    Level: intermediate
33978fbdcc8SBarry Smith 
340db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
341db901c5bSHong Zhang 
342db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()`
34378fbdcc8SBarry Smith @*/
34478fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
34578fbdcc8SBarry Smith {
34678fbdcc8SBarry Smith   PetscFunctionBegin;
347fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
348fe8322adSStefano Zampini   PetscValidPointer(names,2);
3499566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3509566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names,&ctx->names));
35178fbdcc8SBarry Smith   PetscFunctionReturn(0);
35278fbdcc8SBarry Smith }
35378fbdcc8SBarry Smith 
35478fbdcc8SBarry Smith /*@C
355fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35608347785SBarry Smith 
35708347785SBarry Smith    Collective on TSLGCtx
35808347785SBarry Smith 
35908347785SBarry Smith    Input Parameters:
36008347785SBarry Smith +  tj - the TSTrajectory context
36108347785SBarry Smith .  transform - the transform function
36208347785SBarry Smith .  destroy - function to destroy the optional context
36308347785SBarry Smith -  ctx - optional context used by transform function
36408347785SBarry Smith 
36508347785SBarry Smith    Level: intermediate
36608347785SBarry Smith 
367db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
36808347785SBarry Smith @*/
36908347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
37008347785SBarry Smith {
37108347785SBarry Smith   PetscFunctionBegin;
372fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
37308347785SBarry Smith   tj->transform        = transform;
37408347785SBarry Smith   tj->transformdestroy = destroy;
37508347785SBarry Smith   tj->transformctx     = tctx;
37608347785SBarry Smith   PetscFunctionReturn(0);
37708347785SBarry Smith }
37808347785SBarry Smith 
379db901c5bSHong Zhang /*@
380bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
381bc952696SBarry Smith 
382d083f849SBarry Smith   Collective
383bc952696SBarry Smith 
384bc952696SBarry Smith   Input Parameter:
3853c0fce88SHong Zhang . comm - the communicator
386bc952696SBarry Smith 
387bc952696SBarry Smith   Output Parameter:
3883c0fce88SHong Zhang . tj   - the trajectory object
389bc952696SBarry Smith 
390df5474d8SHong Zhang   Level: developer
391bc952696SBarry Smith 
39295452b02SPatrick Sanan   Notes:
39395452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
394bc952696SBarry Smith 
395db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
396bc952696SBarry Smith @*/
397b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
398bc952696SBarry Smith {
399bc952696SBarry Smith   TSTrajectory   t;
400bc952696SBarry Smith 
401bc952696SBarry Smith   PetscFunctionBegin;
402b1d74d50SHong Zhang   PetscValidPointer(tj,2);
403b1d74d50SHong Zhang   *tj = NULL;
4049566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
405bc952696SBarry Smith 
4069566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView));
40768bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4089566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm,&t->tsh));
409fe8322adSStefano Zampini 
410fe8322adSStefano Zampini   t->lag.order            = 1;
411fe8322adSStefano Zampini   t->lag.L                = NULL;
412fe8322adSStefano Zampini   t->lag.T                = NULL;
413fe8322adSStefano Zampini   t->lag.W                = NULL;
414fe8322adSStefano Zampini   t->lag.WW               = NULL;
415fe8322adSStefano Zampini   t->lag.TW               = NULL;
416fe8322adSStefano Zampini   t->lag.TT               = NULL;
417fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
418fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
419fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
420fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
421fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
422fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
423fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
424fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
425fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
426fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
427fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
428fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
429ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
430b1d74d50SHong Zhang   *tj  = t;
43163a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t,"TS-%06" PetscInt_FMT ".bin"));
432bc952696SBarry Smith   PetscFunctionReturn(0);
433bc952696SBarry Smith }
434bc952696SBarry Smith 
435bc952696SBarry Smith /*@C
436bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
437bc952696SBarry Smith 
438bc952696SBarry Smith   Collective on TS
439bc952696SBarry Smith 
440bc952696SBarry Smith   Input Parameters:
4413c0fce88SHong Zhang + tj   - the TSTrajectory context
4423c0fce88SHong Zhang . ts   - the TS context
4433c0fce88SHong Zhang - type - a known method
444bc952696SBarry Smith 
445bc952696SBarry Smith   Options Database Command:
446e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
447bc952696SBarry Smith 
448df5474d8SHong Zhang    Level: developer
449bc952696SBarry Smith 
450db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
451bc952696SBarry Smith 
452bc952696SBarry Smith @*/
453fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
454bc952696SBarry Smith {
455972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
456bc952696SBarry Smith   PetscBool      match;
457bc952696SBarry Smith 
458bc952696SBarry Smith   PetscFunctionBegin;
459972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4609566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj,type,&match));
461bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
462bc952696SBarry Smith 
4639566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList,type,&r));
4643c633725SBarry Smith   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
465972caf09SHong Zhang   if (tj->ops->destroy) {
4669566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
467bc952696SBarry Smith 
468972caf09SHong Zhang     tj->ops->destroy = NULL;
469bc952696SBarry Smith   }
4709566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops,sizeof(*tj->ops)));
471bc952696SBarry Smith 
4729566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj,type));
4739566063dSJacob Faibussowitsch   PetscCall((*r)(tj,ts));
474bc952696SBarry Smith   PetscFunctionReturn(0);
475bc952696SBarry Smith }
476bc952696SBarry Smith 
477881c1a9bSHong Zhang /*@C
478881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
479881c1a9bSHong Zhang 
480881c1a9bSHong Zhang   Collective on TS
481881c1a9bSHong Zhang 
482881c1a9bSHong Zhang   Input Parameters:
483881c1a9bSHong Zhang + tj   - the TSTrajectory context
484881c1a9bSHong Zhang - ts   - the TS context
485881c1a9bSHong Zhang 
486881c1a9bSHong Zhang   Output Parameters:
487881c1a9bSHong Zhang . type - a known method
488881c1a9bSHong Zhang 
489881c1a9bSHong Zhang   Level: developer
490881c1a9bSHong Zhang 
491db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
492881c1a9bSHong Zhang 
493881c1a9bSHong Zhang @*/
494881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
495881c1a9bSHong Zhang {
496881c1a9bSHong Zhang   PetscFunctionBegin;
497881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
498881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
499881c1a9bSHong Zhang   PetscFunctionReturn(0);
500881c1a9bSHong Zhang }
501881c1a9bSHong Zhang 
502972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
503972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5049a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5052b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
506bc952696SBarry Smith 
507bc952696SBarry Smith /*@C
508bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
509bc952696SBarry Smith 
510bc952696SBarry Smith   Not Collective
511bc952696SBarry Smith 
512df5474d8SHong Zhang   Level: developer
513bc952696SBarry Smith 
514db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()`
515bc952696SBarry Smith @*/
516bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
517bc952696SBarry Smith {
518bc952696SBarry Smith   PetscFunctionBegin;
519560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
520bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
521bc952696SBarry Smith 
5229566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic));
5239566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile));
5249566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory));
5259566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization));
526bc952696SBarry Smith   PetscFunctionReturn(0);
527bc952696SBarry Smith }
528bc952696SBarry Smith 
529bc952696SBarry Smith /*@
5301550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5311550c9b9SHong Zhang 
5321550c9b9SHong Zhang    Collective on TSTrajectory
5331550c9b9SHong Zhang 
5341550c9b9SHong Zhang    Input Parameter:
5351550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5361550c9b9SHong Zhang 
5371550c9b9SHong Zhang    Level: developer
5381550c9b9SHong Zhang 
539db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5401550c9b9SHong Zhang @*/
5419a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5421550c9b9SHong Zhang {
5431550c9b9SHong Zhang   PetscFunctionBegin;
5449a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5459a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
546*dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj,reset);
5479566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5489566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5499566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh));
550fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5511550c9b9SHong Zhang   PetscFunctionReturn(0);
5521550c9b9SHong Zhang }
5531550c9b9SHong Zhang 
5541550c9b9SHong Zhang /*@
555bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
556bc952696SBarry Smith 
557bc952696SBarry Smith    Collective on TSTrajectory
558bc952696SBarry Smith 
559bc952696SBarry Smith    Input Parameter:
5603c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
561bc952696SBarry Smith 
562df5474d8SHong Zhang    Level: developer
563bc952696SBarry Smith 
564db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
565bc952696SBarry Smith @*/
566972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
567bc952696SBarry Smith {
568bc952696SBarry Smith   PetscFunctionBegin;
569972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
570972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
571c793f718SLisandro Dalcin   if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);}
572bc952696SBarry Smith 
5739566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5749566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5759566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W));
5769566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW));
5779566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5789566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5799a992471SHong Zhang 
5809566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
581*dbbe0bcdSBarry Smith   PetscTryTypeMethod((*tj),destroy);
582fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
583fe8322adSStefano Zampini     PetscMPIInt rank;
584fe8322adSStefano Zampini     MPI_Comm    comm;
585fe8322adSStefano Zampini 
5869566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj),&comm));
5879566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm,&rank));
588dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5899566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
590fe8322adSStefano Zampini     }
591fe8322adSStefano Zampini   }
5929566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5939566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5949566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5959566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
596bc952696SBarry Smith   PetscFunctionReturn(0);
597bc952696SBarry Smith }
598bc952696SBarry Smith 
599bc952696SBarry Smith /*
600772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
601bc952696SBarry Smith 
602bc952696SBarry Smith   Collective on TSTrajectory
603bc952696SBarry Smith 
604bc952696SBarry Smith   Input Parameter:
6053c0fce88SHong Zhang + tj - the TSTrajectory context
6063c0fce88SHong Zhang - ts - the TS context
6073c0fce88SHong Zhang 
6083c0fce88SHong Zhang   Options Database Keys:
6093c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
610bc952696SBarry Smith 
611df5474d8SHong Zhang   Level: developer
612bc952696SBarry Smith 
613db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
614bc952696SBarry Smith */
6152bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
616bc952696SBarry Smith {
617bc952696SBarry Smith   PetscBool      opt;
618bc952696SBarry Smith   const char     *defaultType;
619bc952696SBarry Smith   char           typeName[256];
620bc952696SBarry Smith 
621bc952696SBarry Smith   PetscFunctionBegin;
622b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
623bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
624bc952696SBarry Smith 
6259566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt));
627bc952696SBarry Smith   if (opt) {
6289566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,typeName));
629bc952696SBarry Smith   } else {
6309566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,defaultType));
631bc952696SBarry Smith   }
632bc952696SBarry Smith   PetscFunctionReturn(0);
633bc952696SBarry Smith }
634bc952696SBarry Smith 
635ed695a29SHong Zhang /*@
6369ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6379ffb3502SHong Zhang 
6389ffb3502SHong Zhang    Collective on TSTrajectory
6399ffb3502SHong Zhang 
6404165533cSJose E. Roman    Input Parameters:
6419ffb3502SHong Zhang +  tj - the TSTrajectory context
6429ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6439ffb3502SHong Zhang 
6449ffb3502SHong Zhang    Options Database Keys:
6459ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6469ffb3502SHong Zhang 
6479ffb3502SHong Zhang    Level: advanced
6489ffb3502SHong Zhang 
649db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6509ffb3502SHong Zhang @*/
6519ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6529ffb3502SHong Zhang {
6539ffb3502SHong Zhang   PetscFunctionBegin;
6549ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6559ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6569ffb3502SHong Zhang   tj->usehistory = flg;
6579ffb3502SHong Zhang   PetscFunctionReturn(0);
6589ffb3502SHong Zhang }
6599ffb3502SHong Zhang 
6609ffb3502SHong Zhang /*@
661ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
662ed695a29SHong Zhang 
663ed695a29SHong Zhang    Collective on TSTrajectory
664ed695a29SHong Zhang 
6654165533cSJose E. Roman    Input Parameters:
666ed695a29SHong Zhang +  tj - the TSTrajectory context
667ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
668ed695a29SHong Zhang 
6693c0fce88SHong Zhang    Options Database Keys:
670063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6713c0fce88SHong Zhang 
672df5474d8SHong Zhang    Level: developer
673ed695a29SHong Zhang 
674db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
675ed695a29SHong Zhang @*/
6762bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
677ed695a29SHong Zhang {
678ed695a29SHong Zhang   PetscFunctionBegin;
679ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
680ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
681fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
682fe8322adSStefano Zampini   else tj->monitor = NULL;
683ed695a29SHong Zhang   PetscFunctionReturn(0);
684ed695a29SHong Zhang }
685ed695a29SHong Zhang 
686bc952696SBarry Smith /*@
68764fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
68864fc91eeSBarry Smith 
68964fc91eeSBarry Smith    Collective on TSTrajectory
69064fc91eeSBarry Smith 
6914165533cSJose E. Roman    Input Parameters:
69264fc91eeSBarry Smith +  tj - the TSTrajectory context
69364fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
69464fc91eeSBarry Smith 
69564fc91eeSBarry Smith    Options Database Keys:
69664fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
69764fc91eeSBarry Smith 
69895452b02SPatrick Sanan    Notes:
69995452b02SPatrick 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.
70064fc91eeSBarry Smith 
70164fc91eeSBarry Smith    Level: advanced
70264fc91eeSBarry Smith 
703db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70464fc91eeSBarry Smith @*/
70564fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
70664fc91eeSBarry Smith {
70764fc91eeSBarry Smith   PetscFunctionBegin;
70864fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
70964fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
71064fc91eeSBarry Smith   tj->keepfiles = flg;
71164fc91eeSBarry Smith   PetscFunctionReturn(0);
71264fc91eeSBarry Smith }
71364fc91eeSBarry Smith 
714db901c5bSHong Zhang /*@C
71564e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
71664e38db7SHong Zhang 
71764e38db7SHong Zhang    Collective on TSTrajectory
71864e38db7SHong Zhang 
7194165533cSJose E. Roman    Input Parameters:
72064e38db7SHong Zhang +  tj      - the TSTrajectory context
72164e38db7SHong Zhang -  dirname - the directory name
72264e38db7SHong Zhang 
72364e38db7SHong Zhang    Options Database Keys:
72464e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
72564e38db7SHong Zhang 
72695452b02SPatrick Sanan    Notes:
72795452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7281585b412SBarry Smith 
72964e38db7SHong Zhang    Level: developer
73064e38db7SHong Zhang 
731c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73264e38db7SHong Zhang @*/
73364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
73464e38db7SHong Zhang {
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));
74364e38db7SHong Zhang   PetscFunctionReturn(0);
74464e38db7SHong Zhang }
74564e38db7SHong Zhang 
746db901c5bSHong Zhang /*@C
74764e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
74864e38db7SHong Zhang 
74964e38db7SHong Zhang    Collective on TSTrajectory
75064e38db7SHong Zhang 
7514165533cSJose E. Roman    Input Parameters:
75264e38db7SHong Zhang +  tj      - the TSTrajectory context
7531585b412SBarry Smith -  filetemplate - the template
75464e38db7SHong Zhang 
75564e38db7SHong Zhang    Options Database Keys:
7561585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7571585b412SBarry Smith 
75895452b02SPatrick Sanan    Notes:
75963a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7601585b412SBarry Smith 
76163a3b9bcSJacob 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
7621585b412SBarry Smith    timestep counter
76364e38db7SHong Zhang 
76464e38db7SHong Zhang    Level: developer
76564e38db7SHong Zhang 
766c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
76764e38db7SHong Zhang @*/
76864e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
76964e38db7SHong Zhang {
7709afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7719afe7f3eSBarry Smith 
77264e38db7SHong Zhang   PetscFunctionBegin;
77364e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
77463a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(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));
78864e38db7SHong Zhang   PetscFunctionReturn(0);
78964e38db7SHong Zhang }
79064e38db7SHong Zhang 
79164e38db7SHong Zhang /*@
792bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
793bc952696SBarry Smith 
794bc952696SBarry Smith    Collective on TSTrajectory
795bc952696SBarry Smith 
796d8d19677SJose E. Roman    Input Parameters:
7973c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
7983c0fce88SHong Zhang -  ts - the TS context
799bc952696SBarry Smith 
800bc952696SBarry Smith    Options Database Keys:
8013c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
80264fc91eeSBarry 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
803063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
804bc952696SBarry Smith 
805df5474d8SHong Zhang    Level: developer
806bc952696SBarry Smith 
80795452b02SPatrick Sanan    Notes:
80895452b02SPatrick Sanan     This is not normally called directly by users
809bc952696SBarry Smith 
810db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
811bc952696SBarry Smith @*/
812972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
813bc952696SBarry Smith {
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 */
839*dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj,setfromoptions,PetscOptionsObject);
840d0609cedSBarry Smith   PetscOptionsEnd();
841bc952696SBarry Smith   PetscFunctionReturn(0);
842bc952696SBarry Smith }
84368bece0bSHong Zhang 
84468bece0bSHong Zhang /*@
84568bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
84668bece0bSHong Zhang    of a TS trajectory.
84768bece0bSHong Zhang 
84868bece0bSHong Zhang    Collective on TS
84968bece0bSHong Zhang 
850d8d19677SJose E. Roman    Input Parameters:
8513c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8523c0fce88SHong Zhang -  tj - the TS trajectory context
85368bece0bSHong Zhang 
854df5474d8SHong Zhang    Level: developer
85568bece0bSHong Zhang 
856db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
85768bece0bSHong Zhang @*/
85868bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
85968bece0bSHong Zhang {
8609afe7f3eSBarry Smith   size_t         s1,s2;
86168bece0bSHong Zhang 
86268bece0bSHong Zhang   PetscFunctionBegin;
86368bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
86468bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
865fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
86668bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
86768bece0bSHong Zhang 
8689566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0));
86968bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
8709566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC));
87168bece0bSHong Zhang   }
872*dbbe0bcdSBarry Smith   PetscTryTypeMethod(tj,setup,ts);
87368bece0bSHong Zhang 
87468bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
87553b27ddbSHong Zhang 
87653b27ddbSHong Zhang   /* Set the counters to zero */
8771a5a771fSHong Zhang   tj->recomps    = 0;
87853b27ddbSHong Zhang   tj->diskreads  = 0;
87953b27ddbSHong Zhang   tj->diskwrites = 0;
8809566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname,&s1));
8819566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate,&s2));
8829566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8839566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate));
8849566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate));
8859566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0));
88668bece0bSHong Zhang   PetscFunctionReturn(0);
88768bece0bSHong Zhang }
888fe8322adSStefano Zampini 
889fe8322adSStefano Zampini /*@
890fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
891fe8322adSStefano Zampini 
892fe8322adSStefano Zampini    Collective on TSTrajectory
893fe8322adSStefano Zampini 
894d8d19677SJose E. Roman    Input Parameters:
895fe8322adSStefano Zampini +  tj  - the TS trajectory context
896fe8322adSStefano Zampini -  flg - the boolean flag
897fe8322adSStefano Zampini 
898fe8322adSStefano Zampini    Level: developer
899fe8322adSStefano Zampini 
900db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
901fe8322adSStefano Zampini @*/
902fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
903fe8322adSStefano Zampini {
904fe8322adSStefano Zampini   PetscFunctionBegin;
905fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
906fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
907fe8322adSStefano Zampini   tj->solution_only = solution_only;
908fe8322adSStefano Zampini   PetscFunctionReturn(0);
909fe8322adSStefano Zampini }
910fe8322adSStefano Zampini 
911fe8322adSStefano Zampini /*@
912fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
913fe8322adSStefano Zampini 
914fe8322adSStefano Zampini    Logically collective on TSTrajectory
915fe8322adSStefano Zampini 
916fe8322adSStefano Zampini    Input Parameter:
917fe8322adSStefano Zampini .  tj  - the TS trajectory context
918fe8322adSStefano Zampini 
919fe8322adSStefano Zampini    Output Parameter:
920d8d19677SJose E. Roman .  flg - the boolean flag
921fe8322adSStefano Zampini 
922fe8322adSStefano Zampini    Level: developer
923fe8322adSStefano Zampini 
924db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
925fe8322adSStefano Zampini @*/
926fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
927fe8322adSStefano Zampini {
928fe8322adSStefano Zampini   PetscFunctionBegin;
929fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
930dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only,2);
931fe8322adSStefano Zampini   *solution_only = tj->solution_only;
932fe8322adSStefano Zampini   PetscFunctionReturn(0);
933fe8322adSStefano Zampini }
934fe8322adSStefano Zampini 
935fe8322adSStefano Zampini /*@
936fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
937fe8322adSStefano Zampini 
938fe8322adSStefano Zampini    Collective on TSTrajectory
939fe8322adSStefano Zampini 
940d8d19677SJose E. Roman    Input Parameters:
941fe8322adSStefano Zampini +  tj   - the TS trajectory context
942fe8322adSStefano Zampini .  ts   - the TS solver context
943fe8322adSStefano Zampini -  time - the requested time
944fe8322adSStefano Zampini 
945d8d19677SJose E. Roman    Output Parameters:
946fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
947fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
948fe8322adSStefano Zampini 
949fe8322adSStefano Zampini    Level: developer
950fe8322adSStefano Zampini 
951fe8322adSStefano 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.
952fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
953fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
954fe8322adSStefano Zampini 
955db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
956fe8322adSStefano Zampini @*/
957fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
958fe8322adSStefano Zampini {
959fe8322adSStefano Zampini   PetscFunctionBegin;
960fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
961fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
962fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
963fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
964fe8322adSStefano Zampini   if (Udot) PetscValidPointer(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   }
986fe8322adSStefano Zampini   PetscFunctionReturn(0);
987fe8322adSStefano Zampini }
988fe8322adSStefano Zampini 
989fe8322adSStefano Zampini /*@
990fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
991fe8322adSStefano Zampini 
992fe8322adSStefano Zampini    Collective on TSTrajectory
993fe8322adSStefano Zampini 
994d8d19677SJose E. Roman    Input Parameters:
995fe8322adSStefano Zampini +  tj   - the TS trajectory 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 
1001db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()`
1002fe8322adSStefano Zampini @*/
1003fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1004fe8322adSStefano Zampini {
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   }
1019fe8322adSStefano Zampini   PetscFunctionReturn(0);
1020fe8322adSStefano Zampini }
1021