xref: /petsc/src/ts/trajectory/interface/traj.c (revision 8a10d460d4e6f5b949e47072e9fa14e373d93611)
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;
8fe8322adSStefano Zampini PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs;
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 
243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, register
25bc952696SBarry Smith 
263c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll()
27bc952696SBarry Smith @*/
28972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
29bc952696SBarry Smith {
30bc952696SBarry Smith   PetscErrorCode ierr;
31bc952696SBarry Smith 
32bc952696SBarry Smith   PetscFunctionBegin;
33bc952696SBarry Smith   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
34bc952696SBarry Smith   PetscFunctionReturn(0);
35bc952696SBarry Smith }
36bc952696SBarry Smith 
37fe8322adSStefano Zampini /*@
38fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
39fe8322adSStefano Zampini 
40fe8322adSStefano Zampini   Collective on TSTrajectory
41fe8322adSStefano Zampini 
42fe8322adSStefano Zampini   Input Parameters:
43fe8322adSStefano Zampini + tj      - the trajectory object
44fe8322adSStefano Zampini . ts      - the time stepper object (optional)
45fe8322adSStefano Zampini . stepnum - the step number
46fe8322adSStefano Zampini . time    - the current time
47fe8322adSStefano Zampini - X       - the current solution
48fe8322adSStefano Zampini 
49fe8322adSStefano Zampini   Level: developer
50fe8322adSStefano Zampini 
51fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
52fe8322adSStefano Zampini 
53fe8322adSStefano Zampini .keywords: TS, trajectory, create
54fe8322adSStefano Zampini 
55fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs()
56fe8322adSStefano Zampini @*/
57bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
58bc952696SBarry Smith {
59bc952696SBarry Smith   PetscErrorCode ierr;
60bc952696SBarry Smith 
61bc952696SBarry Smith   PetscFunctionBegin;
62bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
63fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
64fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
65fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
66fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,4);
67fe8322adSStefano Zampini   PetscValidHeaderSpecific(X,VEC_CLASSID,5);
68fe8322adSStefano Zampini   if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
69fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
70fe8322adSStefano Zampini   if (tj->monitor) {
71fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
72fe8322adSStefano Zampini   }
73d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
74bc952696SBarry Smith   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
75d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
76ac1a7491SHong Zhang   if (tj->usehistory) {
77fe8322adSStefano Zampini     ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr);
78ac1a7491SHong Zhang   }
79fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
80bc952696SBarry Smith   PetscFunctionReturn(0);
81bc952696SBarry Smith }
82bc952696SBarry Smith 
83fe8322adSStefano Zampini /*@
84fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
85fe8322adSStefano Zampini 
86fe8322adSStefano Zampini   Not collective.
87fe8322adSStefano Zampini 
88fe8322adSStefano Zampini   Input Parameters:
89fe8322adSStefano Zampini . tj - the trajectory object
90fe8322adSStefano Zampini 
91fe8322adSStefano Zampini   Output Parameter:
92fe8322adSStefano Zampini . steps - the number of steps
93fe8322adSStefano Zampini 
94fe8322adSStefano Zampini   Level: developer
95fe8322adSStefano Zampini 
96fe8322adSStefano Zampini .keywords: TS, trajectory, create
97fe8322adSStefano Zampini 
98fe8322adSStefano Zampini .seealso: TSTrajectorySet()
99fe8322adSStefano Zampini @*/
100fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
101fe8322adSStefano Zampini {
102fe8322adSStefano Zampini   PetscErrorCode ierr;
103fe8322adSStefano Zampini 
104fe8322adSStefano Zampini   PetscFunctionBegin;
105fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
106fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
107fe8322adSStefano Zampini   ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr);
108fe8322adSStefano Zampini   PetscFunctionReturn(0);
109fe8322adSStefano Zampini }
110fe8322adSStefano Zampini 
111fe8322adSStefano Zampini /*@
112fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
113fe8322adSStefano Zampini 
114fe8322adSStefano Zampini   Collective on TS
115fe8322adSStefano Zampini 
116fe8322adSStefano Zampini   Input Parameters:
117fe8322adSStefano Zampini + tj      - the trajectory object
118fe8322adSStefano Zampini . ts      - the time stepper object
119fe8322adSStefano Zampini - stepnum - the step number
120fe8322adSStefano Zampini 
121fe8322adSStefano Zampini   Output Parameter:
122fe8322adSStefano Zampini . time    - the time associated with the step number
123fe8322adSStefano Zampini 
124fe8322adSStefano Zampini   Level: developer
125fe8322adSStefano Zampini 
126fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
127fe8322adSStefano Zampini 
128fe8322adSStefano Zampini .keywords: TS, trajectory, create
129fe8322adSStefano Zampini 
130fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution()
131fe8322adSStefano Zampini @*/
132c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
133bc952696SBarry Smith {
134bc952696SBarry Smith   PetscErrorCode ierr;
135bc952696SBarry Smith 
136bc952696SBarry Smith   PetscFunctionBegin;
137bc952696SBarry Smith   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
138fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
139fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
140fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
141fe8322adSStefano Zampini   PetscValidPointer(time,4);
142fe8322adSStefano Zampini   if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
143fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
14411e1d5c3SBarry Smith   if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
145fe8322adSStefano Zampini   if (tj->monitor) {
146fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
147fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
148fe8322adSStefano Zampini   }
149d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
150bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
151d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
152bc952696SBarry Smith   PetscFunctionReturn(0);
153bc952696SBarry Smith }
154bc952696SBarry Smith 
155fe8322adSStefano Zampini /*@
156fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
157fe8322adSStefano Zampini 
158fe8322adSStefano Zampini   Collective on TS
159fe8322adSStefano Zampini 
160fe8322adSStefano Zampini   Input Parameters:
161fe8322adSStefano Zampini + tj      - the trajectory object
162fe8322adSStefano Zampini . ts      - the time stepper object (optional)
163fe8322adSStefano Zampini - stepnum - the requested step number
164fe8322adSStefano Zampini 
165fe8322adSStefano Zampini   Input/Output Parameters:
166fe8322adSStefano Zampini . time - the time associated with the step number
167fe8322adSStefano Zampini 
168fe8322adSStefano Zampini   Output Parameters:
169fe8322adSStefano Zampini + U       - state vector (can be NULL)
170fe8322adSStefano Zampini - Udot    - time derivative of state vector (can be NULL)
171fe8322adSStefano Zampini 
172fe8322adSStefano Zampini   Level: developer
173fe8322adSStefano Zampini 
174fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
175fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
176fe8322adSStefano Zampini 
177fe8322adSStefano Zampini .keywords: TS, trajectory, create
178fe8322adSStefano Zampini 
179fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet()
180fe8322adSStefano Zampini @*/
181fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
182fe8322adSStefano Zampini {
183fe8322adSStefano Zampini   PetscErrorCode ierr;
184fe8322adSStefano Zampini 
185fe8322adSStefano Zampini   PetscFunctionBegin;
186fe8322adSStefano Zampini   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
187fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
188fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
189fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
190fe8322adSStefano Zampini   PetscValidPointer(time,4);
191fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
192fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
193fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
194fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
195fe8322adSStefano Zampini   ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
196fe8322adSStefano Zampini   if (tj->monitor) {
197fe8322adSStefano Zampini     PetscInt pU,pUdot;
198fe8322adSStefano Zampini     pU    = U ? 1 : 0;
199fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
200fe8322adSStefano Zampini     ierr  = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr);
201fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
202fe8322adSStefano Zampini   }
203fe8322adSStefano Zampini   if (U && tj->lag.caching) {
204fe8322adSStefano Zampini     PetscObjectId    id;
205fe8322adSStefano Zampini     PetscObjectState state;
206fe8322adSStefano Zampini 
207fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr);
208fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr);
209fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
210fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
211fe8322adSStefano Zampini     } else {
212fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
213fe8322adSStefano Zampini     }
214fe8322adSStefano Zampini     if (tj->monitor && !U) {
215fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
216fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr);
217fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
218fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
219fe8322adSStefano Zampini     }
220fe8322adSStefano Zampini   }
221fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
222fe8322adSStefano Zampini     PetscObjectId    id;
223fe8322adSStefano Zampini     PetscObjectState state;
224fe8322adSStefano Zampini 
225fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr);
226fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr);
227fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
228fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
229fe8322adSStefano Zampini     } else {
230fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
231fe8322adSStefano Zampini     }
232fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
233fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
234fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr);
235fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
236fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
237fe8322adSStefano Zampini     }
238fe8322adSStefano Zampini   }
239fe8322adSStefano Zampini   if (!U && !Udot) {
240fe8322adSStefano Zampini     ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
241fe8322adSStefano Zampini     PetscFunctionReturn(0);
242fe8322adSStefano Zampini   }
243fe8322adSStefano Zampini 
244fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
245fe8322adSStefano Zampini     if (tj->monitor) {
246fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
247fe8322adSStefano Zampini     }
248fe8322adSStefano Zampini     /* cached states will be updated in the function */
249fe8322adSStefano Zampini     ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr);
250fe8322adSStefano Zampini     if (tj->monitor) {
251fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
252fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
253fe8322adSStefano Zampini     }
254fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
255fe8322adSStefano Zampini     TS  fakets = ts;
256fe8322adSStefano Zampini     Vec U2;
257fe8322adSStefano Zampini 
258fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
259fe8322adSStefano Zampini     if (!ts) {
260fe8322adSStefano Zampini       ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr);
261fe8322adSStefano Zampini       if (!fakets) {
262fe8322adSStefano Zampini         ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr);
263fe8322adSStefano Zampini         ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr);
264fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr);
265fe8322adSStefano Zampini         ierr = VecDuplicate(U,&U2);CHKERRQ(ierr);
266fe8322adSStefano Zampini         ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr);
267fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr);
268fe8322adSStefano Zampini       }
269fe8322adSStefano Zampini     }
270fe8322adSStefano Zampini     ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr);
271fe8322adSStefano Zampini     ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr);
272fe8322adSStefano Zampini     ierr = VecCopy(U2,U);CHKERRQ(ierr);
273fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr);
274fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr);
275fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
276fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
277fe8322adSStefano Zampini   }
278fe8322adSStefano Zampini   ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
279fe8322adSStefano Zampini   PetscFunctionReturn(0);
280fe8322adSStefano Zampini }
281fe8322adSStefano Zampini 
282bc952696SBarry Smith /*@C
283bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
284bc952696SBarry Smith 
285bc952696SBarry Smith     Collective on TSTrajectory
286bc952696SBarry Smith 
287bc952696SBarry Smith     Input Parameters:
288b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
289bc952696SBarry Smith -   viewer - visualization context
290bc952696SBarry Smith 
291bc952696SBarry Smith     Options Database Key:
292e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
293bc952696SBarry Smith 
294bc952696SBarry Smith     Notes:
295bc952696SBarry Smith     The available visualization contexts include
296bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
297bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
298bc952696SBarry Smith          output where only the first processor opens
299bc952696SBarry Smith          the file.  All other processors send their
300bc952696SBarry Smith          data to the first processor to print.
301bc952696SBarry Smith 
302bc952696SBarry Smith     The user can open an alternative visualization context with
303bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
304bc952696SBarry Smith 
305df5474d8SHong Zhang     Level: developer
306bc952696SBarry Smith 
3073c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view
308bc952696SBarry Smith 
309bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
310bc952696SBarry Smith @*/
311b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
312bc952696SBarry Smith {
313bc952696SBarry Smith   PetscErrorCode ierr;
314bc952696SBarry Smith   PetscBool      iascii;
315bc952696SBarry Smith 
316bc952696SBarry Smith   PetscFunctionBegin;
3171a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
318bc952696SBarry Smith   if (!viewer) {
319b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
320bc952696SBarry Smith   }
321bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
322b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
323bc952696SBarry Smith 
324bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
325bc952696SBarry Smith   if (iascii) {
326b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
3271a5a771fSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
32853b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
32953b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
330b1d74d50SHong Zhang     if (tj->ops->view) {
331285336bfSHong Zhang       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
332b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
333285336bfSHong Zhang       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
334bc952696SBarry Smith     }
335bc952696SBarry Smith   }
336bc952696SBarry Smith   PetscFunctionReturn(0);
337bc952696SBarry Smith }
338bc952696SBarry Smith 
339bc952696SBarry Smith /*@C
34078fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
34178fbdcc8SBarry Smith 
34278fbdcc8SBarry Smith    Collective on TSTrajectory
34378fbdcc8SBarry Smith 
34478fbdcc8SBarry Smith    Input Parameters:
34578fbdcc8SBarry Smith +  tr - the trajectory context
34678fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
34778fbdcc8SBarry Smith 
34878fbdcc8SBarry Smith    Level: intermediate
34978fbdcc8SBarry Smith 
350db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
351db901c5bSHong Zhang 
35278fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view
35378fbdcc8SBarry Smith 
35478fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
35578fbdcc8SBarry Smith @*/
35678fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
35778fbdcc8SBarry Smith {
35878fbdcc8SBarry Smith   PetscErrorCode    ierr;
35978fbdcc8SBarry Smith 
36078fbdcc8SBarry Smith   PetscFunctionBegin;
361fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
362fe8322adSStefano Zampini   PetscValidPointer(names,2);
36378fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
36478fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
36578fbdcc8SBarry Smith   PetscFunctionReturn(0);
36678fbdcc8SBarry Smith }
36778fbdcc8SBarry Smith 
36878fbdcc8SBarry Smith /*@C
369fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
37008347785SBarry Smith 
37108347785SBarry Smith    Collective on TSLGCtx
37208347785SBarry Smith 
37308347785SBarry Smith    Input Parameters:
37408347785SBarry Smith +  tj - the TSTrajectory context
37508347785SBarry Smith .  transform - the transform function
37608347785SBarry Smith .  destroy - function to destroy the optional context
37708347785SBarry Smith -  ctx - optional context used by transform function
37808347785SBarry Smith 
37908347785SBarry Smith    Level: intermediate
38008347785SBarry Smith 
38108347785SBarry Smith .keywords: TSTrajectory,  vector, monitor, view
38208347785SBarry Smith 
38308347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
38408347785SBarry Smith @*/
38508347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
38608347785SBarry Smith {
38708347785SBarry Smith   PetscFunctionBegin;
388fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
38908347785SBarry Smith   tj->transform        = transform;
39008347785SBarry Smith   tj->transformdestroy = destroy;
39108347785SBarry Smith   tj->transformctx     = tctx;
39208347785SBarry Smith   PetscFunctionReturn(0);
39308347785SBarry Smith }
39408347785SBarry Smith 
395db901c5bSHong Zhang /*@
396bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
397bc952696SBarry Smith 
398bc952696SBarry Smith   Collective on MPI_Comm
399bc952696SBarry Smith 
400bc952696SBarry Smith   Input Parameter:
4013c0fce88SHong Zhang . comm - the communicator
402bc952696SBarry Smith 
403bc952696SBarry Smith   Output Parameter:
4043c0fce88SHong Zhang . tj   - the trajectory object
405bc952696SBarry Smith 
406df5474d8SHong Zhang   Level: developer
407bc952696SBarry Smith 
40895452b02SPatrick Sanan   Notes:
40995452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
410bc952696SBarry Smith 
4113c0fce88SHong Zhang .keywords: TS, trajectory, create
4123c0fce88SHong Zhang 
41364fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
414bc952696SBarry Smith @*/
415b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
416bc952696SBarry Smith {
417bc952696SBarry Smith   TSTrajectory   t;
418bc952696SBarry Smith   PetscErrorCode ierr;
419bc952696SBarry Smith 
420bc952696SBarry Smith   PetscFunctionBegin;
421b1d74d50SHong Zhang   PetscValidPointer(tj,2);
422b1d74d50SHong Zhang   *tj = NULL;
423bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
424bc952696SBarry Smith 
42573107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
42668bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
427fe8322adSStefano Zampini   ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr);
428fe8322adSStefano Zampini 
429fe8322adSStefano Zampini   t->lag.order            = 1;
430fe8322adSStefano Zampini   t->lag.L                = NULL;
431fe8322adSStefano Zampini   t->lag.T                = NULL;
432fe8322adSStefano Zampini   t->lag.W                = NULL;
433fe8322adSStefano Zampini   t->lag.WW               = NULL;
434fe8322adSStefano Zampini   t->lag.TW               = NULL;
435fe8322adSStefano Zampini   t->lag.TT               = NULL;
436fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
437fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
438fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
439fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
440fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
441fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
442fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
443fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
444fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
445fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
446fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
447fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
448ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
449b1d74d50SHong Zhang   *tj  = t;
450*8a10d460SHong Zhang   ierr = TSTrajectorySetFiletemplate(t,"TS-%06D.bin");CHKERRQ(ierr);
451bc952696SBarry Smith   PetscFunctionReturn(0);
452bc952696SBarry Smith }
453bc952696SBarry Smith 
454bc952696SBarry Smith /*@C
455bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
456bc952696SBarry Smith 
457bc952696SBarry Smith   Collective on TS
458bc952696SBarry Smith 
459bc952696SBarry Smith   Input Parameters:
4603c0fce88SHong Zhang + tj   - the TSTrajectory context
4613c0fce88SHong Zhang . ts   - the TS context
4623c0fce88SHong Zhang - type - a known method
463bc952696SBarry Smith 
464bc952696SBarry Smith   Options Database Command:
465e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
466bc952696SBarry Smith 
467df5474d8SHong Zhang    Level: developer
468bc952696SBarry Smith 
4693c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
470bc952696SBarry Smith 
471881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType()
472bc952696SBarry Smith 
473bc952696SBarry Smith @*/
474fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
475bc952696SBarry Smith {
476972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
477bc952696SBarry Smith   PetscBool      match;
478bc952696SBarry Smith   PetscErrorCode ierr;
479bc952696SBarry Smith 
480bc952696SBarry Smith   PetscFunctionBegin;
481972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
482972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
483bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
484bc952696SBarry Smith 
485bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
486bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
487972caf09SHong Zhang   if (tj->ops->destroy) {
488972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
489bc952696SBarry Smith 
490972caf09SHong Zhang     tj->ops->destroy = NULL;
491bc952696SBarry Smith   }
492972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
493bc952696SBarry Smith 
494972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
495972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
496bc952696SBarry Smith   PetscFunctionReturn(0);
497bc952696SBarry Smith }
498bc952696SBarry Smith 
499881c1a9bSHong Zhang /*@C
500881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
501881c1a9bSHong Zhang 
502881c1a9bSHong Zhang   Collective on TS
503881c1a9bSHong Zhang 
504881c1a9bSHong Zhang   Input Parameters:
505881c1a9bSHong Zhang + tj   - the TSTrajectory context
506881c1a9bSHong Zhang - ts   - the TS context
507881c1a9bSHong Zhang 
508881c1a9bSHong Zhang   Output Parameters:
509881c1a9bSHong Zhang . type - a known method
510881c1a9bSHong Zhang 
511881c1a9bSHong Zhang   Level: developer
512881c1a9bSHong Zhang 
513881c1a9bSHong Zhang .keywords: TS, trajectory, timestep, get, type
514881c1a9bSHong Zhang 
515881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType()
516881c1a9bSHong Zhang 
517881c1a9bSHong Zhang @*/
518881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
519881c1a9bSHong Zhang {
520881c1a9bSHong Zhang   PetscFunctionBegin;
521881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
522881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
523881c1a9bSHong Zhang   PetscFunctionReturn(0);
524881c1a9bSHong Zhang }
525881c1a9bSHong Zhang 
526972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
527972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5289a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5292b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
530bc952696SBarry Smith 
531bc952696SBarry Smith /*@C
532bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
533bc952696SBarry Smith 
534bc952696SBarry Smith   Not Collective
535bc952696SBarry Smith 
536df5474d8SHong Zhang   Level: developer
537bc952696SBarry Smith 
5383c0fce88SHong Zhang .keywords: TS, trajectory, register, all
5393c0fce88SHong Zhang 
5403c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
541bc952696SBarry Smith @*/
542bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
543bc952696SBarry Smith {
544bc952696SBarry Smith   PetscErrorCode ierr;
545bc952696SBarry Smith 
546bc952696SBarry Smith   PetscFunctionBegin;
547560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
548bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
549bc952696SBarry Smith 
550bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
5511c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
5529a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
5532b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
554bc952696SBarry Smith   PetscFunctionReturn(0);
555bc952696SBarry Smith }
556bc952696SBarry Smith 
557bc952696SBarry Smith /*@
5581550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5591550c9b9SHong Zhang 
5601550c9b9SHong Zhang    Collective on TSTrajectory
5611550c9b9SHong Zhang 
5621550c9b9SHong Zhang    Input Parameter:
5631550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5641550c9b9SHong Zhang 
5651550c9b9SHong Zhang    Level: developer
5661550c9b9SHong Zhang 
5671550c9b9SHong Zhang .keywords: TS, trajectory, timestep, reset
5681550c9b9SHong Zhang 
5691550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
5701550c9b9SHong Zhang @*/
5719a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5721550c9b9SHong Zhang {
5731550c9b9SHong Zhang   PetscErrorCode ierr;
5741550c9b9SHong Zhang 
5751550c9b9SHong Zhang   PetscFunctionBegin;
5769a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5779a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5789a992471SHong Zhang   if (tj->ops->reset) {
5799a992471SHong Zhang     ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr);
5809a992471SHong Zhang   }
5819a992471SHong Zhang   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
582fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr);
583fe8322adSStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr);
584fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5851550c9b9SHong Zhang   PetscFunctionReturn(0);
5861550c9b9SHong Zhang }
5871550c9b9SHong Zhang 
5881550c9b9SHong Zhang /*@
589bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
590bc952696SBarry Smith 
591bc952696SBarry Smith    Collective on TSTrajectory
592bc952696SBarry Smith 
593bc952696SBarry Smith    Input Parameter:
5943c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
595bc952696SBarry Smith 
596df5474d8SHong Zhang    Level: developer
597bc952696SBarry Smith 
5983c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
599bc952696SBarry Smith 
6003c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
601bc952696SBarry Smith @*/
602972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
603bc952696SBarry Smith {
604bc952696SBarry Smith   PetscErrorCode ierr;
605bc952696SBarry Smith 
606bc952696SBarry Smith   PetscFunctionBegin;
607972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
608972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
609972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
610bc952696SBarry Smith 
611fe8322adSStefano Zampini   ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr);
612fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr);
613fe8322adSStefano Zampini   ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr);
614fe8322adSStefano Zampini   ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr);
615fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr);
616fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr);
6179a992471SHong Zhang 
6187f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
619972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
620fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
621fe8322adSStefano Zampini     PetscMPIInt rank;
622fe8322adSStefano Zampini     MPI_Comm    comm;
623fe8322adSStefano Zampini 
624fe8322adSStefano Zampini     ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr);
625fe8322adSStefano Zampini     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
626*8a10d460SHong Zhang     if (!rank && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
627fe8322adSStefano Zampini       ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr);
628fe8322adSStefano Zampini     }
629fe8322adSStefano Zampini   }
63078fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
63164e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
63264e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
633972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
634bc952696SBarry Smith   PetscFunctionReturn(0);
635bc952696SBarry Smith }
636bc952696SBarry Smith 
637bc952696SBarry Smith /*
638772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
639bc952696SBarry Smith 
640bc952696SBarry Smith   Collective on TSTrajectory
641bc952696SBarry Smith 
642bc952696SBarry Smith   Input Parameter:
6433c0fce88SHong Zhang + tj - the TSTrajectory context
6443c0fce88SHong Zhang - ts - the TS context
6453c0fce88SHong Zhang 
6463c0fce88SHong Zhang   Options Database Keys:
6473c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
648bc952696SBarry Smith 
649df5474d8SHong Zhang   Level: developer
650bc952696SBarry Smith 
6513c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
6523c0fce88SHong Zhang 
6533c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
654bc952696SBarry Smith */
6552bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
656bc952696SBarry Smith {
657bc952696SBarry Smith   PetscBool      opt;
658bc952696SBarry Smith   const char     *defaultType;
659bc952696SBarry Smith   char           typeName[256];
660bc952696SBarry Smith   PetscErrorCode ierr;
661bc952696SBarry Smith 
662bc952696SBarry Smith   PetscFunctionBegin;
663b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
664bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
665bc952696SBarry Smith 
666560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
667e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
668bc952696SBarry Smith   if (opt) {
669972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
670bc952696SBarry Smith   } else {
671972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
672bc952696SBarry Smith   }
673bc952696SBarry Smith   PetscFunctionReturn(0);
674bc952696SBarry Smith }
675bc952696SBarry Smith 
676ed695a29SHong Zhang /*@
6779ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6789ffb3502SHong Zhang 
6799ffb3502SHong Zhang    Collective on TSTrajectory
6809ffb3502SHong Zhang 
6819ffb3502SHong Zhang    Input Arguments:
6829ffb3502SHong Zhang +  tj - the TSTrajectory context
6839ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6849ffb3502SHong Zhang 
6859ffb3502SHong Zhang    Options Database Keys:
6869ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6879ffb3502SHong Zhang 
6889ffb3502SHong Zhang    Level: advanced
6899ffb3502SHong Zhang 
6909ffb3502SHong Zhang .keywords: TS, trajectory, set, TSHistory
6919ffb3502SHong Zhang 
6929ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
6939ffb3502SHong Zhang @*/
6949ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6959ffb3502SHong Zhang {
6969ffb3502SHong Zhang   PetscFunctionBegin;
6979ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6989ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6999ffb3502SHong Zhang   tj->usehistory = flg;
7009ffb3502SHong Zhang   PetscFunctionReturn(0);
7019ffb3502SHong Zhang }
7029ffb3502SHong Zhang 
7039ffb3502SHong Zhang /*@
704ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
705ed695a29SHong Zhang 
706ed695a29SHong Zhang    Collective on TSTrajectory
707ed695a29SHong Zhang 
708ed695a29SHong Zhang    Input Arguments:
709ed695a29SHong Zhang +  tj - the TSTrajectory context
710ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
711ed695a29SHong Zhang 
7123c0fce88SHong Zhang    Options Database Keys:
713063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
7143c0fce88SHong Zhang 
715df5474d8SHong Zhang    Level: developer
716ed695a29SHong Zhang 
7173c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
7183c0fce88SHong Zhang 
7193c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
720ed695a29SHong Zhang @*/
7212bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
722ed695a29SHong Zhang {
723ed695a29SHong Zhang   PetscFunctionBegin;
724ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
725ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
726fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
727fe8322adSStefano Zampini   else tj->monitor = NULL;
728ed695a29SHong Zhang   PetscFunctionReturn(0);
729ed695a29SHong Zhang }
730ed695a29SHong Zhang 
731bc952696SBarry Smith /*@
73264fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
73364fc91eeSBarry Smith 
73464fc91eeSBarry Smith    Collective on TSTrajectory
73564fc91eeSBarry Smith 
73664fc91eeSBarry Smith    Input Arguments:
73764fc91eeSBarry Smith +  tj - the TSTrajectory context
73864fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
73964fc91eeSBarry Smith 
74064fc91eeSBarry Smith    Options Database Keys:
74164fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
74264fc91eeSBarry Smith 
74395452b02SPatrick Sanan    Notes:
74495452b02SPatrick 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.
74564fc91eeSBarry Smith 
74664fc91eeSBarry Smith    Level: advanced
74764fc91eeSBarry Smith 
74864fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor
74964fc91eeSBarry Smith 
75064fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
75164fc91eeSBarry Smith @*/
75264fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
75364fc91eeSBarry Smith {
75464fc91eeSBarry Smith   PetscFunctionBegin;
75564fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
75664fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
75764fc91eeSBarry Smith   tj->keepfiles = flg;
75864fc91eeSBarry Smith   PetscFunctionReturn(0);
75964fc91eeSBarry Smith }
76064fc91eeSBarry Smith 
761db901c5bSHong Zhang /*@C
76264e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
76364e38db7SHong Zhang 
76464e38db7SHong Zhang    Collective on TSTrajectory
76564e38db7SHong Zhang 
76664e38db7SHong Zhang    Input Arguments:
76764e38db7SHong Zhang +  tj      - the TSTrajectory context
76864e38db7SHong Zhang -  dirname - the directory name
76964e38db7SHong Zhang 
77064e38db7SHong Zhang    Options Database Keys:
77164e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
77264e38db7SHong Zhang 
77395452b02SPatrick Sanan    Notes:
77495452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7751585b412SBarry Smith 
77664e38db7SHong Zhang    Level: developer
77764e38db7SHong Zhang 
77864e38db7SHong Zhang .keywords: TS, trajectory, set
77964e38db7SHong Zhang 
78064e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
78164e38db7SHong Zhang @*/
78264e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
78364e38db7SHong Zhang {
78464e38db7SHong Zhang   PetscErrorCode ierr;
785a17281aeSStefano Zampini   PetscBool      flg;
786a17281aeSStefano Zampini 
78764e38db7SHong Zhang   PetscFunctionBegin;
78864e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
789a17281aeSStefano Zampini   ierr = PetscStrcmp(tj->dirname,dirname,&flg);CHKERRQ(ierr);
790a17281aeSStefano Zampini   if (!flg && tj->dirfiletemplate) {
791a17281aeSStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
792a17281aeSStefano Zampini   }
79384a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
79464e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
79564e38db7SHong Zhang   PetscFunctionReturn(0);
79664e38db7SHong Zhang }
79764e38db7SHong Zhang 
798db901c5bSHong Zhang /*@C
79964e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
80064e38db7SHong Zhang 
80164e38db7SHong Zhang    Collective on TSTrajectory
80264e38db7SHong Zhang 
80364e38db7SHong Zhang    Input Arguments:
80464e38db7SHong Zhang +  tj      - the TSTrajectory context
8051585b412SBarry Smith -  filetemplate - the template
80664e38db7SHong Zhang 
80764e38db7SHong Zhang    Options Database Keys:
8081585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
8091585b412SBarry Smith 
81095452b02SPatrick Sanan    Notes:
81195452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
8121585b412SBarry Smith 
8131585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
8141585b412SBarry Smith    timestep counter
81564e38db7SHong Zhang 
81664e38db7SHong Zhang    Level: developer
81764e38db7SHong Zhang 
81864e38db7SHong Zhang .keywords: TS, trajectory, set
81964e38db7SHong Zhang 
8201585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
82164e38db7SHong Zhang @*/
82264e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
82364e38db7SHong Zhang {
82464e38db7SHong Zhang   PetscErrorCode ierr;
8259afe7f3eSBarry Smith   const char     *ptr,*ptr2;
8269afe7f3eSBarry Smith 
82764e38db7SHong Zhang   PetscFunctionBegin;
82864e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
8299afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
8309afe7f3eSBarry Smith 
8319afe7f3eSBarry Smith   if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
8329afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
8339afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
8349afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
8359afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
8369afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
8379afe7f3eSBarry Smith     if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06D.bin");
8389afe7f3eSBarry Smith     if (ptr2) break;
8399afe7f3eSBarry Smith   }
84084a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
84164e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
84264e38db7SHong Zhang   PetscFunctionReturn(0);
84364e38db7SHong Zhang }
84464e38db7SHong Zhang 
84564e38db7SHong Zhang /*@
846bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
847bc952696SBarry Smith 
848bc952696SBarry Smith    Collective on TSTrajectory
849bc952696SBarry Smith 
850bc952696SBarry Smith    Input Parameter:
8513c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
8523c0fce88SHong Zhang -  ts - the TS context
853bc952696SBarry Smith 
854bc952696SBarry Smith    Options Database Keys:
8553c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
85664fc91eeSBarry 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
857063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
858bc952696SBarry Smith 
859df5474d8SHong Zhang    Level: developer
860bc952696SBarry Smith 
86195452b02SPatrick Sanan    Notes:
86295452b02SPatrick Sanan     This is not normally called directly by users
863bc952696SBarry Smith 
8643c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
865bc952696SBarry Smith 
8663c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
867bc952696SBarry Smith @*/
868972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
869bc952696SBarry Smith {
870ed695a29SHong Zhang   PetscBool      set,flg;
87164e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
87264e38db7SHong Zhang   PetscErrorCode ierr;
873bc952696SBarry Smith 
874bc952696SBarry Smith   PetscFunctionBegin;
875b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
876fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
877b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
878972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
879ac1a7491SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL);CHKERRQ(ierr);
880ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
881aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
882fe8322adSStefano Zampini   ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr);
883fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr);
884fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL);CHKERRQ(ierr);
885fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr);
88664fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
88764fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
88864e38db7SHong Zhang 
88964e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
89084a45834SBarry Smith   if (set) {
89164e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
89284a45834SBarry Smith   }
89364e38db7SHong Zhang 
8941585b412SBarry Smith   ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr);
89564e38db7SHong Zhang   if (set) {
8961585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
89784a45834SBarry Smith   }
89864e38db7SHong Zhang 
89964e38db7SHong Zhang   /* Handle specific TSTrajectory options */
90062b521acSHong Zhang   if (tj->ops->setfromoptions) {
90162b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
90262b521acSHong Zhang   }
903bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
904bc952696SBarry Smith   PetscFunctionReturn(0);
905bc952696SBarry Smith }
90668bece0bSHong Zhang 
90768bece0bSHong Zhang /*@
90868bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
90968bece0bSHong Zhang    of a TS trajectory.
91068bece0bSHong Zhang 
91168bece0bSHong Zhang    Collective on TS
91268bece0bSHong Zhang 
91368bece0bSHong Zhang    Input Parameter:
9143c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
9153c0fce88SHong Zhang -  tj - the TS trajectory context
91668bece0bSHong Zhang 
917df5474d8SHong Zhang    Level: developer
91868bece0bSHong Zhang 
9193c0fce88SHong Zhang .keywords: TS, trajectory, setup
92068bece0bSHong Zhang 
92168bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
92268bece0bSHong Zhang @*/
92368bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
92468bece0bSHong Zhang {
92568bece0bSHong Zhang   PetscErrorCode ierr;
9269afe7f3eSBarry Smith   size_t         s1,s2;
92768bece0bSHong Zhang 
92868bece0bSHong Zhang   PetscFunctionBegin;
92968bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
93068bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
931fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
93268bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
93368bece0bSHong Zhang 
93468bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
93568bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
93668bece0bSHong Zhang   }
93768bece0bSHong Zhang   if (tj->ops->setup) {
93868bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
93968bece0bSHong Zhang   }
94068bece0bSHong Zhang 
94168bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
94253b27ddbSHong Zhang 
94353b27ddbSHong Zhang   /* Set the counters to zero */
9441a5a771fSHong Zhang   tj->recomps    = 0;
94553b27ddbSHong Zhang   tj->diskreads  = 0;
94653b27ddbSHong Zhang   tj->diskwrites = 0;
9479afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
9489afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
949fe8322adSStefano Zampini   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
95011e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
95111e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
95268bece0bSHong Zhang   PetscFunctionReturn(0);
95368bece0bSHong Zhang }
954fe8322adSStefano Zampini 
955fe8322adSStefano Zampini /*@
956fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
957fe8322adSStefano Zampini 
958fe8322adSStefano Zampini    Collective on TSTrajectory
959fe8322adSStefano Zampini 
960fe8322adSStefano Zampini    Input Parameter:
961fe8322adSStefano Zampini +  tj  - the TS trajectory context
962fe8322adSStefano Zampini -  flg - the boolean flag
963fe8322adSStefano Zampini 
964fe8322adSStefano Zampini    Level: developer
965fe8322adSStefano Zampini 
966fe8322adSStefano Zampini .keywords: trajectory
967fe8322adSStefano Zampini 
968fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly()
969fe8322adSStefano Zampini @*/
970fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
971fe8322adSStefano Zampini {
972fe8322adSStefano Zampini   PetscFunctionBegin;
973fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
974fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
975fe8322adSStefano Zampini   tj->solution_only = solution_only;
976fe8322adSStefano Zampini   PetscFunctionReturn(0);
977fe8322adSStefano Zampini }
978fe8322adSStefano Zampini 
979fe8322adSStefano Zampini /*@
980fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
981fe8322adSStefano Zampini 
982fe8322adSStefano Zampini    Logically collective on TSTrajectory
983fe8322adSStefano Zampini 
984fe8322adSStefano Zampini    Input Parameter:
985fe8322adSStefano Zampini .  tj  - the TS trajectory context
986fe8322adSStefano Zampini 
987fe8322adSStefano Zampini    Output Parameter:
988fe8322adSStefano Zampini -  flg - the boolean flag
989fe8322adSStefano Zampini 
990fe8322adSStefano Zampini    Level: developer
991fe8322adSStefano Zampini 
992fe8322adSStefano Zampini .keywords: trajectory
993fe8322adSStefano Zampini 
994fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly()
995fe8322adSStefano Zampini @*/
996fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
997fe8322adSStefano Zampini {
998fe8322adSStefano Zampini   PetscFunctionBegin;
999fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1000fe8322adSStefano Zampini   PetscValidPointer(solution_only,2);
1001fe8322adSStefano Zampini   *solution_only = tj->solution_only;
1002fe8322adSStefano Zampini   PetscFunctionReturn(0);
1003fe8322adSStefano Zampini }
1004fe8322adSStefano Zampini 
1005fe8322adSStefano Zampini /*@
1006fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
1007fe8322adSStefano Zampini 
1008fe8322adSStefano Zampini    Collective on TSTrajectory
1009fe8322adSStefano Zampini 
1010fe8322adSStefano Zampini    Input Parameter:
1011fe8322adSStefano Zampini +  tj   - the TS trajectory context
1012fe8322adSStefano Zampini .  ts   - the TS solver context
1013fe8322adSStefano Zampini -  time - the requested time
1014fe8322adSStefano Zampini 
1015fe8322adSStefano Zampini    Output Parameter:
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 
1021fe8322adSStefano 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.
1022fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
1023fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
1024fe8322adSStefano Zampini 
1025fe8322adSStefano Zampini .keywords: trajectory
1026fe8322adSStefano Zampini 
1027fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs()
1028fe8322adSStefano Zampini @*/
1029fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
1030fe8322adSStefano Zampini {
1031fe8322adSStefano Zampini   PetscErrorCode ierr;
1032fe8322adSStefano Zampini 
1033fe8322adSStefano Zampini   PetscFunctionBegin;
1034fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1035fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
1036fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
1037fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
1038fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
1039fe8322adSStefano Zampini   if (U && !tj->U) {
1040fe8322adSStefano Zampini     DM dm;
1041fe8322adSStefano Zampini 
1042fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
1043fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr);
1044fe8322adSStefano Zampini   }
1045fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
1046fe8322adSStefano Zampini     DM dm;
1047fe8322adSStefano Zampini 
1048fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
1049fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr);
1050fe8322adSStefano Zampini   }
1051fe8322adSStefano Zampini   ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr);
1052fe8322adSStefano Zampini   if (U) {
10538860a134SJunchao Zhang     ierr = VecLockReadPush(tj->U);CHKERRQ(ierr);
1054fe8322adSStefano Zampini     *U   = tj->U;
1055fe8322adSStefano Zampini   }
1056fe8322adSStefano Zampini   if (Udot) {
10578860a134SJunchao Zhang     ierr  = VecLockReadPush(tj->Udot);CHKERRQ(ierr);
1058fe8322adSStefano Zampini     *Udot = tj->Udot;
1059fe8322adSStefano Zampini   }
1060fe8322adSStefano Zampini   PetscFunctionReturn(0);
1061fe8322adSStefano Zampini }
1062fe8322adSStefano Zampini 
1063fe8322adSStefano Zampini /*@
1064fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1065fe8322adSStefano Zampini 
1066fe8322adSStefano Zampini    Collective on TSTrajectory
1067fe8322adSStefano Zampini 
1068fe8322adSStefano Zampini    Input Parameter:
1069fe8322adSStefano Zampini +  tj   - the TS trajectory context
1070fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1071fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1072fe8322adSStefano Zampini 
1073fe8322adSStefano Zampini    Level: developer
1074fe8322adSStefano Zampini 
1075fe8322adSStefano Zampini .keywords: trajectory
1076fe8322adSStefano Zampini 
1077fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs()
1078fe8322adSStefano Zampini @*/
1079fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1080fe8322adSStefano Zampini {
1081fe8322adSStefano Zampini   PetscErrorCode ierr;
1082fe8322adSStefano Zampini 
1083fe8322adSStefano Zampini   PetscFunctionBegin;
1084fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1085fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1086fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
1087fe8322adSStefano Zampini   if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1088fe8322adSStefano Zampini   if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1089fe8322adSStefano Zampini   if (U) {
10908860a134SJunchao Zhang     ierr = VecLockReadPop(tj->U);CHKERRQ(ierr);
1091fe8322adSStefano Zampini     *U   = NULL;
1092fe8322adSStefano Zampini   }
1093fe8322adSStefano Zampini   if (Udot) {
10948860a134SJunchao Zhang     ierr  = VecLockReadPop(tj->Udot);CHKERRQ(ierr);
1095fe8322adSStefano Zampini     *Udot = NULL;
1096fe8322adSStefano Zampini   }
1097fe8322adSStefano Zampini   PetscFunctionReturn(0);
1098fe8322adSStefano Zampini }
1099