xref: /petsc/src/ts/trajectory/interface/traj.c (revision c2e3fba1fe1cda7e6350bbca19c4ed35ce95940a)
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->ops->set,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
613c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
62fe8322adSStefano Zampini   if (tj->monitor) {
6363a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n",stepnum,(double)time,(PetscInt)!tj->solution_only));
64fe8322adSStefano Zampini   }
659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0));
669566063dSJacob Faibussowitsch   PetscCall((*tj->ops->set)(tj,ts,stepnum,time,X));
679566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0));
68ac1a7491SHong Zhang   if (tj->usehistory) {
699566063dSJacob Faibussowitsch     PetscCall(TSHistoryUpdate(tj->tsh,stepnum,time));
70ac1a7491SHong Zhang   }
71fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
72bc952696SBarry Smith   PetscFunctionReturn(0);
73bc952696SBarry Smith }
74bc952696SBarry Smith 
75fe8322adSStefano Zampini /*@
76fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
77fe8322adSStefano Zampini 
78fe8322adSStefano Zampini   Not collective.
79fe8322adSStefano Zampini 
80fe8322adSStefano Zampini   Input Parameters:
81fe8322adSStefano Zampini . tj - the trajectory object
82fe8322adSStefano Zampini 
83fe8322adSStefano Zampini   Output Parameter:
84fe8322adSStefano Zampini . steps - the number of steps
85fe8322adSStefano Zampini 
86fe8322adSStefano Zampini   Level: developer
87fe8322adSStefano Zampini 
88db781477SPatrick Sanan .seealso: `TSTrajectorySet()`
89fe8322adSStefano Zampini @*/
90fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
91fe8322adSStefano Zampini {
92fe8322adSStefano Zampini   PetscFunctionBegin;
93fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
94fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
959566063dSJacob Faibussowitsch   PetscCall(TSHistoryGetNumSteps(tj->tsh,steps));
96fe8322adSStefano Zampini   PetscFunctionReturn(0);
97fe8322adSStefano Zampini }
98fe8322adSStefano Zampini 
99fe8322adSStefano Zampini /*@
100fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
101fe8322adSStefano Zampini 
102fe8322adSStefano Zampini   Collective on TS
103fe8322adSStefano Zampini 
104fe8322adSStefano Zampini   Input Parameters:
105fe8322adSStefano Zampini + tj      - the trajectory object
106fe8322adSStefano Zampini . ts      - the time stepper object
107fe8322adSStefano Zampini - stepnum - the step number
108fe8322adSStefano Zampini 
109fe8322adSStefano Zampini   Output Parameter:
110fe8322adSStefano Zampini . time    - the time associated with the step number
111fe8322adSStefano Zampini 
112fe8322adSStefano Zampini   Level: developer
113fe8322adSStefano Zampini 
114fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
115fe8322adSStefano Zampini 
116db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
117fe8322adSStefano Zampini @*/
118c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
119bc952696SBarry Smith {
120bc952696SBarry Smith   PetscFunctionBegin;
1213c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
122fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
123fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
124fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
125dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
1263c633725SBarry Smith   PetscCheck(tj->ops->get,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
1273c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1283c633725SBarry Smith   PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
129fe8322adSStefano Zampini   if (tj->monitor) {
13063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n",stepnum,(PetscInt)!tj->solution_only));
1319566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
132fe8322adSStefano Zampini   }
1339566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0));
1349566063dSJacob Faibussowitsch   PetscCall((*tj->ops->get)(tj,ts,stepnum,time));
1359566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0));
136bc952696SBarry Smith   PetscFunctionReturn(0);
137bc952696SBarry Smith }
138bc952696SBarry Smith 
139fe8322adSStefano Zampini /*@
140fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
141fe8322adSStefano Zampini 
142fe8322adSStefano Zampini   Collective on TS
143fe8322adSStefano Zampini 
144fe8322adSStefano Zampini   Input Parameters:
145fe8322adSStefano Zampini + tj      - the trajectory object
146fe8322adSStefano Zampini . ts      - the time stepper object (optional)
147fe8322adSStefano Zampini - stepnum - the requested step number
148fe8322adSStefano Zampini 
1496b867d5aSJose E. Roman   Input/Output Parameter:
150fe8322adSStefano Zampini 
151fe8322adSStefano Zampini   Output Parameters:
152f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number
153f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
154fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
155fe8322adSStefano Zampini 
156fe8322adSStefano Zampini   Level: developer
157fe8322adSStefano Zampini 
158fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
159fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
160fe8322adSStefano Zampini 
161db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
162fe8322adSStefano Zampini @*/
163fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
164fe8322adSStefano Zampini {
165fe8322adSStefano Zampini   PetscFunctionBegin;
1663c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
167fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
168fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
169fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
170dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
171fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
172fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
173fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
1743c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1759566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0));
176fe8322adSStefano Zampini   if (tj->monitor) {
177fe8322adSStefano Zampini     PetscInt pU,pUdot;
178fe8322adSStefano Zampini     pU    = U ? 1 : 0;
179fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
18063a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n",pU,pUdot,stepnum,(double)*time));
1819566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
182fe8322adSStefano Zampini   }
183fe8322adSStefano Zampini   if (U && tj->lag.caching) {
184fe8322adSStefano Zampini     PetscObjectId    id;
185fe8322adSStefano Zampini     PetscObjectState state;
186fe8322adSStefano Zampini 
1879566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U,&state));
1889566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U,&id));
189fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
190fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
191fe8322adSStefano Zampini     } else {
192fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
193fe8322adSStefano Zampini     }
194fe8322adSStefano Zampini     if (tj->monitor && !U) {
1959566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1969566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n"));
1979566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1989566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
199fe8322adSStefano Zampini     }
200fe8322adSStefano Zampini   }
201fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
202fe8322adSStefano Zampini     PetscObjectId    id;
203fe8322adSStefano Zampini     PetscObjectState state;
204fe8322adSStefano Zampini 
2059566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot,&state));
2069566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot,&id));
207fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
208fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
209fe8322adSStefano Zampini     } else {
210fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
211fe8322adSStefano Zampini     }
212fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2139566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2149566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n"));
2159566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2169566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
217fe8322adSStefano Zampini     }
218fe8322adSStefano Zampini   }
219fe8322adSStefano Zampini   if (!U && !Udot) {
2209566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
221fe8322adSStefano Zampini     PetscFunctionReturn(0);
222fe8322adSStefano Zampini   }
223fe8322adSStefano Zampini 
224fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
225fe8322adSStefano Zampini     if (tj->monitor) {
2269566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
227fe8322adSStefano Zampini     }
228fe8322adSStefano Zampini     /* cached states will be updated in the function */
2299566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot));
230fe8322adSStefano Zampini     if (tj->monitor) {
2319566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2329566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
233fe8322adSStefano Zampini     }
234fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
235fe8322adSStefano Zampini     TS  fakets = ts;
236fe8322adSStefano Zampini     Vec U2;
237fe8322adSStefano Zampini 
238fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
239fe8322adSStefano Zampini     if (!ts) {
2409566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets));
241fe8322adSStefano Zampini       if (!fakets) {
2429566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj),&fakets));
2439566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets));
2449566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2459566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U,&U2));
2469566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets,U2));
2479566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
248fe8322adSStefano Zampini       }
249fe8322adSStefano Zampini     }
2509566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj,fakets,stepnum,time));
2519566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets,&U2));
2529566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2,U));
2539566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state));
2549566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id));
255fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
256fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
257fe8322adSStefano Zampini   }
2589566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
259fe8322adSStefano Zampini   PetscFunctionReturn(0);
260fe8322adSStefano Zampini }
261fe8322adSStefano Zampini 
262bc952696SBarry Smith /*@C
263fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
264fe2efc57SMark 
265fe2efc57SMark    Collective on TSTrajectory
266fe2efc57SMark 
267fe2efc57SMark    Input Parameters:
268fe2efc57SMark +  A - the TSTrajectory context
269736c3998SJose E. Roman .  obj - Optional object
270736c3998SJose E. Roman -  name - command line option
271fe2efc57SMark 
272fe2efc57SMark    Level: intermediate
273db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
274fe2efc57SMark @*/
275fe2efc57SMark PetscErrorCode  TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])
276fe2efc57SMark {
277fe2efc57SMark   PetscFunctionBegin;
278fe2efc57SMark   PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1);
2799566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name));
280fe2efc57SMark   PetscFunctionReturn(0);
281fe2efc57SMark }
282fe2efc57SMark 
283fe2efc57SMark /*@C
284bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
285bc952696SBarry Smith 
286bc952696SBarry Smith     Collective on TSTrajectory
287bc952696SBarry Smith 
288bc952696SBarry Smith     Input Parameters:
289b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
290bc952696SBarry Smith -   viewer - visualization context
291bc952696SBarry Smith 
292bc952696SBarry Smith     Options Database Key:
293e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
294bc952696SBarry Smith 
295bc952696SBarry Smith     Notes:
296bc952696SBarry Smith     The available visualization contexts include
297bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
298bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
299bc952696SBarry Smith          output where only the first processor opens
300bc952696SBarry Smith          the file.  All other processors send their
301bc952696SBarry Smith          data to the first processor to print.
302bc952696SBarry Smith 
303bc952696SBarry Smith     The user can open an alternative visualization context with
304bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
305bc952696SBarry Smith 
306df5474d8SHong Zhang     Level: developer
307bc952696SBarry Smith 
308db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`
309bc952696SBarry Smith @*/
310b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
311bc952696SBarry Smith {
312bc952696SBarry Smith   PetscBool      iascii;
313bc952696SBarry Smith 
314bc952696SBarry Smith   PetscFunctionBegin;
3151a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
316bc952696SBarry Smith   if (!viewer) {
3179566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer));
318bc952696SBarry Smith   }
319bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
320b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
321bc952696SBarry Smith 
3229566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
323bc952696SBarry Smith   if (iascii) {
3249566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer));
32563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n",tj->recomps));
32663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %" PetscInt_FMT "\n",tj->diskreads));
32763a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %" PetscInt_FMT "\n",tj->diskwrites));
328b1d74d50SHong Zhang     if (tj->ops->view) {
3299566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
3309566063dSJacob Faibussowitsch       PetscCall((*tj->ops->view)(tj,viewer));
3319566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
332bc952696SBarry Smith     }
333bc952696SBarry Smith   }
334bc952696SBarry Smith   PetscFunctionReturn(0);
335bc952696SBarry Smith }
336bc952696SBarry Smith 
337bc952696SBarry Smith /*@C
33878fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
33978fbdcc8SBarry Smith 
34078fbdcc8SBarry Smith    Collective on TSTrajectory
34178fbdcc8SBarry Smith 
34278fbdcc8SBarry Smith    Input Parameters:
34378fbdcc8SBarry Smith +  tr - the trajectory context
34478fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
34578fbdcc8SBarry Smith 
34678fbdcc8SBarry Smith    Level: intermediate
34778fbdcc8SBarry Smith 
348db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
349db901c5bSHong Zhang 
350db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()`
35178fbdcc8SBarry Smith @*/
35278fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
35378fbdcc8SBarry Smith {
35478fbdcc8SBarry Smith   PetscFunctionBegin;
355fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
356fe8322adSStefano Zampini   PetscValidPointer(names,2);
3579566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3589566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names,&ctx->names));
35978fbdcc8SBarry Smith   PetscFunctionReturn(0);
36078fbdcc8SBarry Smith }
36178fbdcc8SBarry Smith 
36278fbdcc8SBarry Smith /*@C
363fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
36408347785SBarry Smith 
36508347785SBarry Smith    Collective on TSLGCtx
36608347785SBarry Smith 
36708347785SBarry Smith    Input Parameters:
36808347785SBarry Smith +  tj - the TSTrajectory context
36908347785SBarry Smith .  transform - the transform function
37008347785SBarry Smith .  destroy - function to destroy the optional context
37108347785SBarry Smith -  ctx - optional context used by transform function
37208347785SBarry Smith 
37308347785SBarry Smith    Level: intermediate
37408347785SBarry Smith 
375db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
37608347785SBarry Smith @*/
37708347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
37808347785SBarry Smith {
37908347785SBarry Smith   PetscFunctionBegin;
380fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
38108347785SBarry Smith   tj->transform        = transform;
38208347785SBarry Smith   tj->transformdestroy = destroy;
38308347785SBarry Smith   tj->transformctx     = tctx;
38408347785SBarry Smith   PetscFunctionReturn(0);
38508347785SBarry Smith }
38608347785SBarry Smith 
387db901c5bSHong Zhang /*@
388bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
389bc952696SBarry Smith 
390d083f849SBarry Smith   Collective
391bc952696SBarry Smith 
392bc952696SBarry Smith   Input Parameter:
3933c0fce88SHong Zhang . comm - the communicator
394bc952696SBarry Smith 
395bc952696SBarry Smith   Output Parameter:
3963c0fce88SHong Zhang . tj   - the trajectory object
397bc952696SBarry Smith 
398df5474d8SHong Zhang   Level: developer
399bc952696SBarry Smith 
40095452b02SPatrick Sanan   Notes:
40195452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
402bc952696SBarry Smith 
403db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
404bc952696SBarry Smith @*/
405b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
406bc952696SBarry Smith {
407bc952696SBarry Smith   TSTrajectory   t;
408bc952696SBarry Smith 
409bc952696SBarry Smith   PetscFunctionBegin;
410b1d74d50SHong Zhang   PetscValidPointer(tj,2);
411b1d74d50SHong Zhang   *tj = NULL;
4129566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
413bc952696SBarry Smith 
4149566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView));
41568bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4169566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm,&t->tsh));
417fe8322adSStefano Zampini 
418fe8322adSStefano Zampini   t->lag.order            = 1;
419fe8322adSStefano Zampini   t->lag.L                = NULL;
420fe8322adSStefano Zampini   t->lag.T                = NULL;
421fe8322adSStefano Zampini   t->lag.W                = NULL;
422fe8322adSStefano Zampini   t->lag.WW               = NULL;
423fe8322adSStefano Zampini   t->lag.TW               = NULL;
424fe8322adSStefano Zampini   t->lag.TT               = NULL;
425fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
426fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
427fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
428fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
429fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
430fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
431fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
432fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
433fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
434fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
435fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
436fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
437ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
438b1d74d50SHong Zhang   *tj  = t;
43963a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t,"TS-%06" PetscInt_FMT ".bin"));
440bc952696SBarry Smith   PetscFunctionReturn(0);
441bc952696SBarry Smith }
442bc952696SBarry Smith 
443bc952696SBarry Smith /*@C
444bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
445bc952696SBarry Smith 
446bc952696SBarry Smith   Collective on TS
447bc952696SBarry Smith 
448bc952696SBarry Smith   Input Parameters:
4493c0fce88SHong Zhang + tj   - the TSTrajectory context
4503c0fce88SHong Zhang . ts   - the TS context
4513c0fce88SHong Zhang - type - a known method
452bc952696SBarry Smith 
453bc952696SBarry Smith   Options Database Command:
454e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
455bc952696SBarry Smith 
456df5474d8SHong Zhang    Level: developer
457bc952696SBarry Smith 
458db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
459bc952696SBarry Smith 
460bc952696SBarry Smith @*/
461fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
462bc952696SBarry Smith {
463972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
464bc952696SBarry Smith   PetscBool      match;
465bc952696SBarry Smith 
466bc952696SBarry Smith   PetscFunctionBegin;
467972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4689566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj,type,&match));
469bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
470bc952696SBarry Smith 
4719566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList,type,&r));
4723c633725SBarry Smith   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
473972caf09SHong Zhang   if (tj->ops->destroy) {
4749566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
475bc952696SBarry Smith 
476972caf09SHong Zhang     tj->ops->destroy = NULL;
477bc952696SBarry Smith   }
4789566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops,sizeof(*tj->ops)));
479bc952696SBarry Smith 
4809566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj,type));
4819566063dSJacob Faibussowitsch   PetscCall((*r)(tj,ts));
482bc952696SBarry Smith   PetscFunctionReturn(0);
483bc952696SBarry Smith }
484bc952696SBarry Smith 
485881c1a9bSHong Zhang /*@C
486881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
487881c1a9bSHong Zhang 
488881c1a9bSHong Zhang   Collective on TS
489881c1a9bSHong Zhang 
490881c1a9bSHong Zhang   Input Parameters:
491881c1a9bSHong Zhang + tj   - the TSTrajectory context
492881c1a9bSHong Zhang - ts   - the TS context
493881c1a9bSHong Zhang 
494881c1a9bSHong Zhang   Output Parameters:
495881c1a9bSHong Zhang . type - a known method
496881c1a9bSHong Zhang 
497881c1a9bSHong Zhang   Level: developer
498881c1a9bSHong Zhang 
499db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
500881c1a9bSHong Zhang 
501881c1a9bSHong Zhang @*/
502881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
503881c1a9bSHong Zhang {
504881c1a9bSHong Zhang   PetscFunctionBegin;
505881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
506881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
507881c1a9bSHong Zhang   PetscFunctionReturn(0);
508881c1a9bSHong Zhang }
509881c1a9bSHong Zhang 
510972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
511972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5129a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5132b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
514bc952696SBarry Smith 
515bc952696SBarry Smith /*@C
516bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
517bc952696SBarry Smith 
518bc952696SBarry Smith   Not Collective
519bc952696SBarry Smith 
520df5474d8SHong Zhang   Level: developer
521bc952696SBarry Smith 
522db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()`
523bc952696SBarry Smith @*/
524bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
525bc952696SBarry Smith {
526bc952696SBarry Smith   PetscFunctionBegin;
527560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
528bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
529bc952696SBarry Smith 
5309566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic));
5319566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile));
5329566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory));
5339566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization));
534bc952696SBarry Smith   PetscFunctionReturn(0);
535bc952696SBarry Smith }
536bc952696SBarry Smith 
537bc952696SBarry Smith /*@
5381550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5391550c9b9SHong Zhang 
5401550c9b9SHong Zhang    Collective on TSTrajectory
5411550c9b9SHong Zhang 
5421550c9b9SHong Zhang    Input Parameter:
5431550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5441550c9b9SHong Zhang 
5451550c9b9SHong Zhang    Level: developer
5461550c9b9SHong Zhang 
547db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5481550c9b9SHong Zhang @*/
5499a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5501550c9b9SHong Zhang {
5511550c9b9SHong Zhang   PetscFunctionBegin;
5529a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5539a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5549a992471SHong Zhang   if (tj->ops->reset) {
5559566063dSJacob Faibussowitsch     PetscCall((*tj->ops->reset)(tj));
5569a992471SHong Zhang   }
5579566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5589566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5599566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh));
560fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5611550c9b9SHong Zhang   PetscFunctionReturn(0);
5621550c9b9SHong Zhang }
5631550c9b9SHong Zhang 
5641550c9b9SHong Zhang /*@
565bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
566bc952696SBarry Smith 
567bc952696SBarry Smith    Collective on TSTrajectory
568bc952696SBarry Smith 
569bc952696SBarry Smith    Input Parameter:
5703c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
571bc952696SBarry Smith 
572df5474d8SHong Zhang    Level: developer
573bc952696SBarry Smith 
574db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
575bc952696SBarry Smith @*/
576972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
577bc952696SBarry Smith {
578bc952696SBarry Smith   PetscFunctionBegin;
579972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
580972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
581c793f718SLisandro Dalcin   if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);}
582bc952696SBarry Smith 
5839566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5849566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5859566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W));
5869566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW));
5879566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5889566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5899a992471SHong Zhang 
5909566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
5919566063dSJacob Faibussowitsch   if ((*tj)->ops->destroy) PetscCall((*(*tj)->ops->destroy)((*tj)));
592fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
593fe8322adSStefano Zampini     PetscMPIInt rank;
594fe8322adSStefano Zampini     MPI_Comm    comm;
595fe8322adSStefano Zampini 
5969566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj),&comm));
5979566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm,&rank));
598dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5999566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
600fe8322adSStefano Zampini     }
601fe8322adSStefano Zampini   }
6029566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
6039566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
6049566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
6059566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
606bc952696SBarry Smith   PetscFunctionReturn(0);
607bc952696SBarry Smith }
608bc952696SBarry Smith 
609bc952696SBarry Smith /*
610772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
611bc952696SBarry Smith 
612bc952696SBarry Smith   Collective on TSTrajectory
613bc952696SBarry Smith 
614bc952696SBarry Smith   Input Parameter:
6153c0fce88SHong Zhang + tj - the TSTrajectory context
6163c0fce88SHong Zhang - ts - the TS context
6173c0fce88SHong Zhang 
6183c0fce88SHong Zhang   Options Database Keys:
6193c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
620bc952696SBarry Smith 
621df5474d8SHong Zhang   Level: developer
622bc952696SBarry Smith 
623db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
624bc952696SBarry Smith */
6252bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
626bc952696SBarry Smith {
627bc952696SBarry Smith   PetscBool      opt;
628bc952696SBarry Smith   const char     *defaultType;
629bc952696SBarry Smith   char           typeName[256];
630bc952696SBarry Smith 
631bc952696SBarry Smith   PetscFunctionBegin;
632b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
633bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
634bc952696SBarry Smith 
6359566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6369566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt));
637bc952696SBarry Smith   if (opt) {
6389566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,typeName));
639bc952696SBarry Smith   } else {
6409566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,defaultType));
641bc952696SBarry Smith   }
642bc952696SBarry Smith   PetscFunctionReturn(0);
643bc952696SBarry Smith }
644bc952696SBarry Smith 
645ed695a29SHong Zhang /*@
6469ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6479ffb3502SHong Zhang 
6489ffb3502SHong Zhang    Collective on TSTrajectory
6499ffb3502SHong Zhang 
6504165533cSJose E. Roman    Input Parameters:
6519ffb3502SHong Zhang +  tj - the TSTrajectory context
6529ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6539ffb3502SHong Zhang 
6549ffb3502SHong Zhang    Options Database Keys:
6559ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6569ffb3502SHong Zhang 
6579ffb3502SHong Zhang    Level: advanced
6589ffb3502SHong Zhang 
659db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6609ffb3502SHong Zhang @*/
6619ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6629ffb3502SHong Zhang {
6639ffb3502SHong Zhang   PetscFunctionBegin;
6649ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6659ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6669ffb3502SHong Zhang   tj->usehistory = flg;
6679ffb3502SHong Zhang   PetscFunctionReturn(0);
6689ffb3502SHong Zhang }
6699ffb3502SHong Zhang 
6709ffb3502SHong Zhang /*@
671ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
672ed695a29SHong Zhang 
673ed695a29SHong Zhang    Collective on TSTrajectory
674ed695a29SHong Zhang 
6754165533cSJose E. Roman    Input Parameters:
676ed695a29SHong Zhang +  tj - the TSTrajectory context
677ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
678ed695a29SHong Zhang 
6793c0fce88SHong Zhang    Options Database Keys:
680063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6813c0fce88SHong Zhang 
682df5474d8SHong Zhang    Level: developer
683ed695a29SHong Zhang 
684db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
685ed695a29SHong Zhang @*/
6862bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
687ed695a29SHong Zhang {
688ed695a29SHong Zhang   PetscFunctionBegin;
689ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
690ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
691fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
692fe8322adSStefano Zampini   else tj->monitor = NULL;
693ed695a29SHong Zhang   PetscFunctionReturn(0);
694ed695a29SHong Zhang }
695ed695a29SHong Zhang 
696bc952696SBarry Smith /*@
69764fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
69864fc91eeSBarry Smith 
69964fc91eeSBarry Smith    Collective on TSTrajectory
70064fc91eeSBarry Smith 
7014165533cSJose E. Roman    Input Parameters:
70264fc91eeSBarry Smith +  tj - the TSTrajectory context
70364fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
70464fc91eeSBarry Smith 
70564fc91eeSBarry Smith    Options Database Keys:
70664fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
70764fc91eeSBarry Smith 
70895452b02SPatrick Sanan    Notes:
70995452b02SPatrick 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.
71064fc91eeSBarry Smith 
71164fc91eeSBarry Smith    Level: advanced
71264fc91eeSBarry Smith 
713db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
71464fc91eeSBarry Smith @*/
71564fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
71664fc91eeSBarry Smith {
71764fc91eeSBarry Smith   PetscFunctionBegin;
71864fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
71964fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
72064fc91eeSBarry Smith   tj->keepfiles = flg;
72164fc91eeSBarry Smith   PetscFunctionReturn(0);
72264fc91eeSBarry Smith }
72364fc91eeSBarry Smith 
724db901c5bSHong Zhang /*@C
72564e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
72664e38db7SHong Zhang 
72764e38db7SHong Zhang    Collective on TSTrajectory
72864e38db7SHong Zhang 
7294165533cSJose E. Roman    Input Parameters:
73064e38db7SHong Zhang +  tj      - the TSTrajectory context
73164e38db7SHong Zhang -  dirname - the directory name
73264e38db7SHong Zhang 
73364e38db7SHong Zhang    Options Database Keys:
73464e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
73564e38db7SHong Zhang 
73695452b02SPatrick Sanan    Notes:
73795452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7381585b412SBarry Smith 
73964e38db7SHong Zhang    Level: developer
74064e38db7SHong Zhang 
741*c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
74264e38db7SHong Zhang @*/
74364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
74464e38db7SHong Zhang {
745a17281aeSStefano Zampini   PetscBool      flg;
746a17281aeSStefano Zampini 
74764e38db7SHong Zhang   PetscFunctionBegin;
74864e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7499566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname,dirname,&flg));
750a17281aeSStefano Zampini   if (!flg && tj->dirfiletemplate) {
751a17281aeSStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
752a17281aeSStefano Zampini   }
7539566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7549566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname,&tj->dirname));
75564e38db7SHong Zhang   PetscFunctionReturn(0);
75664e38db7SHong Zhang }
75764e38db7SHong Zhang 
758db901c5bSHong Zhang /*@C
75964e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
76064e38db7SHong Zhang 
76164e38db7SHong Zhang    Collective on TSTrajectory
76264e38db7SHong Zhang 
7634165533cSJose E. Roman    Input Parameters:
76464e38db7SHong Zhang +  tj      - the TSTrajectory context
7651585b412SBarry Smith -  filetemplate - the template
76664e38db7SHong Zhang 
76764e38db7SHong Zhang    Options Database Keys:
7681585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7691585b412SBarry Smith 
77095452b02SPatrick Sanan    Notes:
77163a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7721585b412SBarry Smith 
77363a3b9bcSJacob 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
7741585b412SBarry Smith    timestep counter
77564e38db7SHong Zhang 
77664e38db7SHong Zhang    Level: developer
77764e38db7SHong Zhang 
778*c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
77964e38db7SHong Zhang @*/
78064e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
78164e38db7SHong Zhang {
7829afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7839afe7f3eSBarry Smith 
78464e38db7SHong Zhang   PetscFunctionBegin;
78564e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
78663a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(filetemplate,2);
7873c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
7889afe7f3eSBarry Smith 
78963a3b9bcSJacob 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");
7909afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7919566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate,"%",(char**)&ptr));
79263a3b9bcSJacob 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");
7939afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
79463a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX",*ptr,(char**)&ptr2));
79563a3b9bcSJacob 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");
7969afe7f3eSBarry Smith     if (ptr2) break;
7979afe7f3eSBarry Smith   }
7989566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7999566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate,&tj->filetemplate));
80064e38db7SHong Zhang   PetscFunctionReturn(0);
80164e38db7SHong Zhang }
80264e38db7SHong Zhang 
80364e38db7SHong Zhang /*@
804bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
805bc952696SBarry Smith 
806bc952696SBarry Smith    Collective on TSTrajectory
807bc952696SBarry Smith 
808d8d19677SJose E. Roman    Input Parameters:
8093c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
8103c0fce88SHong Zhang -  ts - the TS context
811bc952696SBarry Smith 
812bc952696SBarry Smith    Options Database Keys:
8133c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
81464fc91eeSBarry 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
815063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
816bc952696SBarry Smith 
817df5474d8SHong Zhang    Level: developer
818bc952696SBarry Smith 
81995452b02SPatrick Sanan    Notes:
82095452b02SPatrick Sanan     This is not normally called directly by users
821bc952696SBarry Smith 
822db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
823bc952696SBarry Smith @*/
824972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
825bc952696SBarry Smith {
826ed695a29SHong Zhang   PetscBool      set,flg;
82764e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
828bc952696SBarry Smith 
829bc952696SBarry Smith   PetscFunctionBegin;
830b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
831fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
832d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8339566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts));
8349566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL));
8359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set));
8369566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj,flg));
8379566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL));
8389566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL));
8399566063dSJacob 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));
8409566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL));
8419566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set));
8429566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj,flg));
84364e38db7SHong Zhang 
8449566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set));
84584a45834SBarry Smith   if (set) {
8469566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetDirname(tj,dirname));
84784a45834SBarry Smith   }
84864e38db7SHong Zhang 
84963a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set));
85064e38db7SHong Zhang   if (set) {
8519566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetFiletemplate(tj,filetemplate));
85284a45834SBarry Smith   }
85364e38db7SHong Zhang 
85464e38db7SHong Zhang   /* Handle specific TSTrajectory options */
85562b521acSHong Zhang   if (tj->ops->setfromoptions) {
8569566063dSJacob Faibussowitsch     PetscCall((*tj->ops->setfromoptions)(PetscOptionsObject,tj));
85762b521acSHong Zhang   }
858d0609cedSBarry Smith   PetscOptionsEnd();
859bc952696SBarry Smith   PetscFunctionReturn(0);
860bc952696SBarry Smith }
86168bece0bSHong Zhang 
86268bece0bSHong Zhang /*@
86368bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
86468bece0bSHong Zhang    of a TS trajectory.
86568bece0bSHong Zhang 
86668bece0bSHong Zhang    Collective on TS
86768bece0bSHong Zhang 
868d8d19677SJose E. Roman    Input Parameters:
8693c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8703c0fce88SHong Zhang -  tj - the TS trajectory context
87168bece0bSHong Zhang 
872df5474d8SHong Zhang    Level: developer
87368bece0bSHong Zhang 
874db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
87568bece0bSHong Zhang @*/
87668bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
87768bece0bSHong Zhang {
8789afe7f3eSBarry Smith   size_t         s1,s2;
87968bece0bSHong Zhang 
88068bece0bSHong Zhang   PetscFunctionBegin;
88168bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
88268bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
883fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
88468bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
88568bece0bSHong Zhang 
8869566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0));
88768bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
8889566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC));
88968bece0bSHong Zhang   }
89068bece0bSHong Zhang   if (tj->ops->setup) {
8919566063dSJacob Faibussowitsch     PetscCall((*tj->ops->setup)(tj,ts));
89268bece0bSHong Zhang   }
89368bece0bSHong Zhang 
89468bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
89553b27ddbSHong Zhang 
89653b27ddbSHong Zhang   /* Set the counters to zero */
8971a5a771fSHong Zhang   tj->recomps    = 0;
89853b27ddbSHong Zhang   tj->diskreads  = 0;
89953b27ddbSHong Zhang   tj->diskwrites = 0;
9009566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname,&s1));
9019566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate,&s2));
9029566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
9039566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate));
9049566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate));
9059566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0));
90668bece0bSHong Zhang   PetscFunctionReturn(0);
90768bece0bSHong Zhang }
908fe8322adSStefano Zampini 
909fe8322adSStefano Zampini /*@
910fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
911fe8322adSStefano Zampini 
912fe8322adSStefano Zampini    Collective on TSTrajectory
913fe8322adSStefano Zampini 
914d8d19677SJose E. Roman    Input Parameters:
915fe8322adSStefano Zampini +  tj  - the TS trajectory context
916fe8322adSStefano Zampini -  flg - the boolean flag
917fe8322adSStefano Zampini 
918fe8322adSStefano Zampini    Level: developer
919fe8322adSStefano Zampini 
920db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
921fe8322adSStefano Zampini @*/
922fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
923fe8322adSStefano Zampini {
924fe8322adSStefano Zampini   PetscFunctionBegin;
925fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
926fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
927fe8322adSStefano Zampini   tj->solution_only = solution_only;
928fe8322adSStefano Zampini   PetscFunctionReturn(0);
929fe8322adSStefano Zampini }
930fe8322adSStefano Zampini 
931fe8322adSStefano Zampini /*@
932fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
933fe8322adSStefano Zampini 
934fe8322adSStefano Zampini    Logically collective on TSTrajectory
935fe8322adSStefano Zampini 
936fe8322adSStefano Zampini    Input Parameter:
937fe8322adSStefano Zampini .  tj  - the TS trajectory context
938fe8322adSStefano Zampini 
939fe8322adSStefano Zampini    Output Parameter:
940d8d19677SJose E. Roman .  flg - the boolean flag
941fe8322adSStefano Zampini 
942fe8322adSStefano Zampini    Level: developer
943fe8322adSStefano Zampini 
944db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
945fe8322adSStefano Zampini @*/
946fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
947fe8322adSStefano Zampini {
948fe8322adSStefano Zampini   PetscFunctionBegin;
949fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
950dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only,2);
951fe8322adSStefano Zampini   *solution_only = tj->solution_only;
952fe8322adSStefano Zampini   PetscFunctionReturn(0);
953fe8322adSStefano Zampini }
954fe8322adSStefano Zampini 
955fe8322adSStefano Zampini /*@
956fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
957fe8322adSStefano Zampini 
958fe8322adSStefano Zampini    Collective on TSTrajectory
959fe8322adSStefano Zampini 
960d8d19677SJose E. Roman    Input Parameters:
961fe8322adSStefano Zampini +  tj   - the TS trajectory context
962fe8322adSStefano Zampini .  ts   - the TS solver context
963fe8322adSStefano Zampini -  time - the requested time
964fe8322adSStefano Zampini 
965d8d19677SJose E. Roman    Output Parameters:
966fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
967fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
968fe8322adSStefano Zampini 
969fe8322adSStefano Zampini    Level: developer
970fe8322adSStefano Zampini 
971fe8322adSStefano 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.
972fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
973fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
974fe8322adSStefano Zampini 
975db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
976fe8322adSStefano Zampini @*/
977fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
978fe8322adSStefano Zampini {
979fe8322adSStefano Zampini   PetscFunctionBegin;
980fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
981fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
982fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
983fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
984fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
985fe8322adSStefano Zampini   if (U && !tj->U) {
986fe8322adSStefano Zampini     DM dm;
987fe8322adSStefano Zampini 
9889566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts,&dm));
9899566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm,&tj->U));
990fe8322adSStefano Zampini   }
991fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
992fe8322adSStefano Zampini     DM dm;
993fe8322adSStefano Zampini 
9949566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts,&dm));
9959566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm,&tj->Udot));
996fe8322adSStefano Zampini   }
9979566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL));
998fe8322adSStefano Zampini   if (U) {
9999566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
1000fe8322adSStefano Zampini     *U   = tj->U;
1001fe8322adSStefano Zampini   }
1002fe8322adSStefano Zampini   if (Udot) {
10039566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
1004fe8322adSStefano Zampini     *Udot = tj->Udot;
1005fe8322adSStefano Zampini   }
1006fe8322adSStefano Zampini   PetscFunctionReturn(0);
1007fe8322adSStefano Zampini }
1008fe8322adSStefano Zampini 
1009fe8322adSStefano Zampini /*@
1010fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1011fe8322adSStefano Zampini 
1012fe8322adSStefano Zampini    Collective on TSTrajectory
1013fe8322adSStefano Zampini 
1014d8d19677SJose E. Roman    Input Parameters:
1015fe8322adSStefano Zampini +  tj   - the TS trajectory context
1016fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1017fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1018fe8322adSStefano Zampini 
1019fe8322adSStefano Zampini    Level: developer
1020fe8322adSStefano Zampini 
1021db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()`
1022fe8322adSStefano Zampini @*/
1023fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1024fe8322adSStefano Zampini {
1025fe8322adSStefano Zampini   PetscFunctionBegin;
1026fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1027fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1028fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
10293c633725SBarry Smith   PetscCheck(!U || *U == tj->U,PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10303c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot,PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1031fe8322adSStefano Zampini   if (U) {
10329566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1033fe8322adSStefano Zampini     *U   = NULL;
1034fe8322adSStefano Zampini   }
1035fe8322adSStefano Zampini   if (Udot) {
10369566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1037fe8322adSStefano Zampini     *Udot = NULL;
1038fe8322adSStefano Zampini   }
1039fe8322adSStefano Zampini   PetscFunctionReturn(0);
1040fe8322adSStefano Zampini }
1041