xref: /petsc/src/ts/trajectory/interface/traj.c (revision 589a23caa660d2a5f330cc8d1ed213e9cfaf51a7)
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 .seealso: TSTrajectoryRegisterAll()
25bc952696SBarry Smith @*/
26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
27bc952696SBarry Smith {
28bc952696SBarry Smith   PetscErrorCode ierr;
29bc952696SBarry Smith 
30bc952696SBarry Smith   PetscFunctionBegin;
31bc952696SBarry Smith   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
32bc952696SBarry Smith   PetscFunctionReturn(0);
33bc952696SBarry Smith }
34bc952696SBarry Smith 
35fe8322adSStefano Zampini /*@
36fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
37fe8322adSStefano Zampini 
38fe8322adSStefano Zampini   Collective on TSTrajectory
39fe8322adSStefano Zampini 
40fe8322adSStefano Zampini   Input Parameters:
41fe8322adSStefano Zampini + tj      - the trajectory object
42fe8322adSStefano Zampini . ts      - the time stepper object (optional)
43fe8322adSStefano Zampini . stepnum - the step number
44fe8322adSStefano Zampini . time    - the current time
45fe8322adSStefano Zampini - X       - the current solution
46fe8322adSStefano Zampini 
47fe8322adSStefano Zampini   Level: developer
48fe8322adSStefano Zampini 
49fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
50fe8322adSStefano Zampini 
51fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs()
52fe8322adSStefano Zampini @*/
53bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
54bc952696SBarry Smith {
55bc952696SBarry Smith   PetscErrorCode ierr;
56bc952696SBarry Smith 
57bc952696SBarry Smith   PetscFunctionBegin;
58bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
59fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
60fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
61fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
62fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,4);
63fe8322adSStefano Zampini   PetscValidHeaderSpecific(X,VEC_CLASSID,5);
64fe8322adSStefano Zampini   if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
65fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
66fe8322adSStefano Zampini   if (tj->monitor) {
67fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
68fe8322adSStefano Zampini   }
69d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
70bc952696SBarry Smith   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
71d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
72ac1a7491SHong Zhang   if (tj->usehistory) {
73fe8322adSStefano Zampini     ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr);
74ac1a7491SHong Zhang   }
75fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
76bc952696SBarry Smith   PetscFunctionReturn(0);
77bc952696SBarry Smith }
78bc952696SBarry Smith 
79fe8322adSStefano Zampini /*@
80fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
81fe8322adSStefano Zampini 
82fe8322adSStefano Zampini   Not collective.
83fe8322adSStefano Zampini 
84fe8322adSStefano Zampini   Input Parameters:
85fe8322adSStefano Zampini . tj - the trajectory object
86fe8322adSStefano Zampini 
87fe8322adSStefano Zampini   Output Parameter:
88fe8322adSStefano Zampini . steps - the number of steps
89fe8322adSStefano Zampini 
90fe8322adSStefano Zampini   Level: developer
91fe8322adSStefano Zampini 
92fe8322adSStefano Zampini .seealso: TSTrajectorySet()
93fe8322adSStefano Zampini @*/
94fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
95fe8322adSStefano Zampini {
96fe8322adSStefano Zampini   PetscErrorCode ierr;
97fe8322adSStefano Zampini 
98fe8322adSStefano Zampini   PetscFunctionBegin;
99fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
100fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
101fe8322adSStefano Zampini   ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr);
102fe8322adSStefano Zampini   PetscFunctionReturn(0);
103fe8322adSStefano Zampini }
104fe8322adSStefano Zampini 
105fe8322adSStefano Zampini /*@
106fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
107fe8322adSStefano Zampini 
108fe8322adSStefano Zampini   Collective on TS
109fe8322adSStefano Zampini 
110fe8322adSStefano Zampini   Input Parameters:
111fe8322adSStefano Zampini + tj      - the trajectory object
112fe8322adSStefano Zampini . ts      - the time stepper object
113fe8322adSStefano Zampini - stepnum - the step number
114fe8322adSStefano Zampini 
115fe8322adSStefano Zampini   Output Parameter:
116fe8322adSStefano Zampini . time    - the time associated with the step number
117fe8322adSStefano Zampini 
118fe8322adSStefano Zampini   Level: developer
119fe8322adSStefano Zampini 
120fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
121fe8322adSStefano Zampini 
122fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution()
123fe8322adSStefano Zampini @*/
124c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
125bc952696SBarry Smith {
126bc952696SBarry Smith   PetscErrorCode ierr;
127bc952696SBarry Smith 
128bc952696SBarry Smith   PetscFunctionBegin;
129bc952696SBarry Smith   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
130fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
131fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
132fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
133fe8322adSStefano Zampini   PetscValidPointer(time,4);
134fe8322adSStefano Zampini   if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
135fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
13611e1d5c3SBarry Smith   if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
137fe8322adSStefano Zampini   if (tj->monitor) {
138fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
139fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
140fe8322adSStefano Zampini   }
141d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
142bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
143d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
144bc952696SBarry Smith   PetscFunctionReturn(0);
145bc952696SBarry Smith }
146bc952696SBarry Smith 
147fe8322adSStefano Zampini /*@
148fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
149fe8322adSStefano Zampini 
150fe8322adSStefano Zampini   Collective on TS
151fe8322adSStefano Zampini 
152fe8322adSStefano Zampini   Input Parameters:
153fe8322adSStefano Zampini + tj      - the trajectory object
154fe8322adSStefano Zampini . ts      - the time stepper object (optional)
155fe8322adSStefano Zampini - stepnum - the requested step number
156fe8322adSStefano Zampini 
157fe8322adSStefano Zampini   Input/Output Parameters:
158fe8322adSStefano Zampini . time - the time associated with the step number
159fe8322adSStefano Zampini 
160fe8322adSStefano Zampini   Output Parameters:
161fe8322adSStefano Zampini + U       - state vector (can be NULL)
162fe8322adSStefano Zampini - Udot    - time derivative of state vector (can be NULL)
163fe8322adSStefano Zampini 
164fe8322adSStefano Zampini   Level: developer
165fe8322adSStefano Zampini 
166fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
167fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
168fe8322adSStefano Zampini 
169fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet()
170fe8322adSStefano Zampini @*/
171fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
172fe8322adSStefano Zampini {
173fe8322adSStefano Zampini   PetscErrorCode ierr;
174fe8322adSStefano Zampini 
175fe8322adSStefano Zampini   PetscFunctionBegin;
176fe8322adSStefano Zampini   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
177fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
178fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
179fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
180fe8322adSStefano Zampini   PetscValidPointer(time,4);
181fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
182fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
183fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
184fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
185fe8322adSStefano Zampini   ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
186fe8322adSStefano Zampini   if (tj->monitor) {
187fe8322adSStefano Zampini     PetscInt pU,pUdot;
188fe8322adSStefano Zampini     pU    = U ? 1 : 0;
189fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
190fe8322adSStefano Zampini     ierr  = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr);
191fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
192fe8322adSStefano Zampini   }
193fe8322adSStefano Zampini   if (U && tj->lag.caching) {
194fe8322adSStefano Zampini     PetscObjectId    id;
195fe8322adSStefano Zampini     PetscObjectState state;
196fe8322adSStefano Zampini 
197fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr);
198fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr);
199fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
200fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
201fe8322adSStefano Zampini     } else {
202fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
203fe8322adSStefano Zampini     }
204fe8322adSStefano Zampini     if (tj->monitor && !U) {
205fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
206fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr);
207fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
208fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
209fe8322adSStefano Zampini     }
210fe8322adSStefano Zampini   }
211fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
212fe8322adSStefano Zampini     PetscObjectId    id;
213fe8322adSStefano Zampini     PetscObjectState state;
214fe8322adSStefano Zampini 
215fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr);
216fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr);
217fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
218fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
219fe8322adSStefano Zampini     } else {
220fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
221fe8322adSStefano Zampini     }
222fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
223fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
224fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr);
225fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
226fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
227fe8322adSStefano Zampini     }
228fe8322adSStefano Zampini   }
229fe8322adSStefano Zampini   if (!U && !Udot) {
230fe8322adSStefano Zampini     ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
231fe8322adSStefano Zampini     PetscFunctionReturn(0);
232fe8322adSStefano Zampini   }
233fe8322adSStefano Zampini 
234fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
235fe8322adSStefano Zampini     if (tj->monitor) {
236fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
237fe8322adSStefano Zampini     }
238fe8322adSStefano Zampini     /* cached states will be updated in the function */
239fe8322adSStefano Zampini     ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr);
240fe8322adSStefano Zampini     if (tj->monitor) {
241fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
242fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
243fe8322adSStefano Zampini     }
244fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
245fe8322adSStefano Zampini     TS  fakets = ts;
246fe8322adSStefano Zampini     Vec U2;
247fe8322adSStefano Zampini 
248fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
249fe8322adSStefano Zampini     if (!ts) {
250fe8322adSStefano Zampini       ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr);
251fe8322adSStefano Zampini       if (!fakets) {
252fe8322adSStefano Zampini         ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr);
253fe8322adSStefano Zampini         ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr);
254fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr);
255fe8322adSStefano Zampini         ierr = VecDuplicate(U,&U2);CHKERRQ(ierr);
256fe8322adSStefano Zampini         ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr);
257fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr);
258fe8322adSStefano Zampini       }
259fe8322adSStefano Zampini     }
260fe8322adSStefano Zampini     ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr);
261fe8322adSStefano Zampini     ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr);
262fe8322adSStefano Zampini     ierr = VecCopy(U2,U);CHKERRQ(ierr);
263fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr);
264fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr);
265fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
266fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
267fe8322adSStefano Zampini   }
268fe8322adSStefano Zampini   ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
269fe8322adSStefano Zampini   PetscFunctionReturn(0);
270fe8322adSStefano Zampini }
271fe8322adSStefano Zampini 
272bc952696SBarry Smith /*@C
273fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
274fe2efc57SMark 
275fe2efc57SMark    Collective on TSTrajectory
276fe2efc57SMark 
277fe2efc57SMark    Input Parameters:
278fe2efc57SMark +  A - the TSTrajectory context
279736c3998SJose E. Roman .  obj - Optional object
280736c3998SJose E. Roman -  name - command line option
281fe2efc57SMark 
282fe2efc57SMark    Level: intermediate
283fe2efc57SMark .seealso:  TSTrajectory, TSTrajectoryView, PetscObjectViewFromOptions(), TSTrajectoryCreate()
284fe2efc57SMark @*/
285fe2efc57SMark PetscErrorCode  TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])
286fe2efc57SMark {
287fe2efc57SMark   PetscErrorCode ierr;
288fe2efc57SMark 
289fe2efc57SMark   PetscFunctionBegin;
290fe2efc57SMark   PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1);
291fe2efc57SMark   ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr);
292fe2efc57SMark   PetscFunctionReturn(0);
293fe2efc57SMark }
294fe2efc57SMark 
295fe2efc57SMark /*@C
296bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
297bc952696SBarry Smith 
298bc952696SBarry Smith     Collective on TSTrajectory
299bc952696SBarry Smith 
300bc952696SBarry Smith     Input Parameters:
301b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
302bc952696SBarry Smith -   viewer - visualization context
303bc952696SBarry Smith 
304bc952696SBarry Smith     Options Database Key:
305e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
306bc952696SBarry Smith 
307bc952696SBarry Smith     Notes:
308bc952696SBarry Smith     The available visualization contexts include
309bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
310bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
311bc952696SBarry Smith          output where only the first processor opens
312bc952696SBarry Smith          the file.  All other processors send their
313bc952696SBarry Smith          data to the first processor to print.
314bc952696SBarry Smith 
315bc952696SBarry Smith     The user can open an alternative visualization context with
316bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
317bc952696SBarry Smith 
318df5474d8SHong Zhang     Level: developer
319bc952696SBarry Smith 
320bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
321bc952696SBarry Smith @*/
322b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
323bc952696SBarry Smith {
324bc952696SBarry Smith   PetscErrorCode ierr;
325bc952696SBarry Smith   PetscBool      iascii;
326bc952696SBarry Smith 
327bc952696SBarry Smith   PetscFunctionBegin;
3281a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
329bc952696SBarry Smith   if (!viewer) {
330b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
331bc952696SBarry Smith   }
332bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
333b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
334bc952696SBarry Smith 
335bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
336bc952696SBarry Smith   if (iascii) {
337b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
3381a5a771fSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
33953b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
34053b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
341b1d74d50SHong Zhang     if (tj->ops->view) {
342285336bfSHong Zhang       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
343b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
344285336bfSHong Zhang       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
345bc952696SBarry Smith     }
346bc952696SBarry Smith   }
347bc952696SBarry Smith   PetscFunctionReturn(0);
348bc952696SBarry Smith }
349bc952696SBarry Smith 
350bc952696SBarry Smith /*@C
35178fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
35278fbdcc8SBarry Smith 
35378fbdcc8SBarry Smith    Collective on TSTrajectory
35478fbdcc8SBarry Smith 
35578fbdcc8SBarry Smith    Input Parameters:
35678fbdcc8SBarry Smith +  tr - the trajectory context
35778fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
35878fbdcc8SBarry Smith 
35978fbdcc8SBarry Smith    Level: intermediate
36078fbdcc8SBarry Smith 
361db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
362db901c5bSHong Zhang 
36378fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
36478fbdcc8SBarry Smith @*/
36578fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
36678fbdcc8SBarry Smith {
36778fbdcc8SBarry Smith   PetscErrorCode    ierr;
36878fbdcc8SBarry Smith 
36978fbdcc8SBarry Smith   PetscFunctionBegin;
370fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
371fe8322adSStefano Zampini   PetscValidPointer(names,2);
37278fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
37378fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
37478fbdcc8SBarry Smith   PetscFunctionReturn(0);
37578fbdcc8SBarry Smith }
37678fbdcc8SBarry Smith 
37778fbdcc8SBarry Smith /*@C
378fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
37908347785SBarry Smith 
38008347785SBarry Smith    Collective on TSLGCtx
38108347785SBarry Smith 
38208347785SBarry Smith    Input Parameters:
38308347785SBarry Smith +  tj - the TSTrajectory context
38408347785SBarry Smith .  transform - the transform function
38508347785SBarry Smith .  destroy - function to destroy the optional context
38608347785SBarry Smith -  ctx - optional context used by transform function
38708347785SBarry Smith 
38808347785SBarry Smith    Level: intermediate
38908347785SBarry Smith 
39008347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
39108347785SBarry Smith @*/
39208347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
39308347785SBarry Smith {
39408347785SBarry Smith   PetscFunctionBegin;
395fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
39608347785SBarry Smith   tj->transform        = transform;
39708347785SBarry Smith   tj->transformdestroy = destroy;
39808347785SBarry Smith   tj->transformctx     = tctx;
39908347785SBarry Smith   PetscFunctionReturn(0);
40008347785SBarry Smith }
40108347785SBarry Smith 
402db901c5bSHong Zhang /*@
403bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
404bc952696SBarry Smith 
405d083f849SBarry Smith   Collective
406bc952696SBarry Smith 
407bc952696SBarry Smith   Input Parameter:
4083c0fce88SHong Zhang . comm - the communicator
409bc952696SBarry Smith 
410bc952696SBarry Smith   Output Parameter:
4113c0fce88SHong Zhang . tj   - the trajectory object
412bc952696SBarry Smith 
413df5474d8SHong Zhang   Level: developer
414bc952696SBarry Smith 
41595452b02SPatrick Sanan   Notes:
41695452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
417bc952696SBarry Smith 
41864fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
419bc952696SBarry Smith @*/
420b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
421bc952696SBarry Smith {
422bc952696SBarry Smith   TSTrajectory   t;
423bc952696SBarry Smith   PetscErrorCode ierr;
424bc952696SBarry Smith 
425bc952696SBarry Smith   PetscFunctionBegin;
426b1d74d50SHong Zhang   PetscValidPointer(tj,2);
427b1d74d50SHong Zhang   *tj = NULL;
428bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
429bc952696SBarry Smith 
43073107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
43168bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
432fe8322adSStefano Zampini   ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr);
433fe8322adSStefano Zampini 
434fe8322adSStefano Zampini   t->lag.order            = 1;
435fe8322adSStefano Zampini   t->lag.L                = NULL;
436fe8322adSStefano Zampini   t->lag.T                = NULL;
437fe8322adSStefano Zampini   t->lag.W                = NULL;
438fe8322adSStefano Zampini   t->lag.WW               = NULL;
439fe8322adSStefano Zampini   t->lag.TW               = NULL;
440fe8322adSStefano Zampini   t->lag.TT               = NULL;
441fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
442fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
443fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
444fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
445fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
446fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
447fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
448fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
449fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
450fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
451fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
452fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
453ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
454b1d74d50SHong Zhang   *tj  = t;
4558a10d460SHong Zhang   ierr = TSTrajectorySetFiletemplate(t,"TS-%06D.bin");CHKERRQ(ierr);
456bc952696SBarry Smith   PetscFunctionReturn(0);
457bc952696SBarry Smith }
458bc952696SBarry Smith 
459bc952696SBarry Smith /*@C
460bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
461bc952696SBarry Smith 
462bc952696SBarry Smith   Collective on TS
463bc952696SBarry Smith 
464bc952696SBarry Smith   Input Parameters:
4653c0fce88SHong Zhang + tj   - the TSTrajectory context
4663c0fce88SHong Zhang . ts   - the TS context
4673c0fce88SHong Zhang - type - a known method
468bc952696SBarry Smith 
469bc952696SBarry Smith   Options Database Command:
470e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
471bc952696SBarry Smith 
472df5474d8SHong Zhang    Level: developer
473bc952696SBarry Smith 
474881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType()
475bc952696SBarry Smith 
476bc952696SBarry Smith @*/
477fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
478bc952696SBarry Smith {
479972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
480bc952696SBarry Smith   PetscBool      match;
481bc952696SBarry Smith   PetscErrorCode ierr;
482bc952696SBarry Smith 
483bc952696SBarry Smith   PetscFunctionBegin;
484972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
485972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
486bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
487bc952696SBarry Smith 
488bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
489bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
490972caf09SHong Zhang   if (tj->ops->destroy) {
491972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
492bc952696SBarry Smith 
493972caf09SHong Zhang     tj->ops->destroy = NULL;
494bc952696SBarry Smith   }
495972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
496bc952696SBarry Smith 
497972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
498972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
499bc952696SBarry Smith   PetscFunctionReturn(0);
500bc952696SBarry Smith }
501bc952696SBarry Smith 
502881c1a9bSHong Zhang /*@C
503881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
504881c1a9bSHong Zhang 
505881c1a9bSHong Zhang   Collective on TS
506881c1a9bSHong Zhang 
507881c1a9bSHong Zhang   Input Parameters:
508881c1a9bSHong Zhang + tj   - the TSTrajectory context
509881c1a9bSHong Zhang - ts   - the TS context
510881c1a9bSHong Zhang 
511881c1a9bSHong Zhang   Output Parameters:
512881c1a9bSHong Zhang . type - a known method
513881c1a9bSHong Zhang 
514881c1a9bSHong Zhang   Level: developer
515881c1a9bSHong Zhang 
516881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType()
517881c1a9bSHong Zhang 
518881c1a9bSHong Zhang @*/
519881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
520881c1a9bSHong Zhang {
521881c1a9bSHong Zhang   PetscFunctionBegin;
522881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
523881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
524881c1a9bSHong Zhang   PetscFunctionReturn(0);
525881c1a9bSHong Zhang }
526881c1a9bSHong Zhang 
527972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
528972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5299a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5302b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
531bc952696SBarry Smith 
532bc952696SBarry Smith /*@C
533bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
534bc952696SBarry Smith 
535bc952696SBarry Smith   Not Collective
536bc952696SBarry Smith 
537df5474d8SHong Zhang   Level: developer
538bc952696SBarry Smith 
5393c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
540bc952696SBarry Smith @*/
541bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
542bc952696SBarry Smith {
543bc952696SBarry Smith   PetscErrorCode ierr;
544bc952696SBarry Smith 
545bc952696SBarry Smith   PetscFunctionBegin;
546560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
547bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
548bc952696SBarry Smith 
549bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
5501c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
5519a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
5522b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
553bc952696SBarry Smith   PetscFunctionReturn(0);
554bc952696SBarry Smith }
555bc952696SBarry Smith 
556bc952696SBarry Smith /*@
5571550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5581550c9b9SHong Zhang 
5591550c9b9SHong Zhang    Collective on TSTrajectory
5601550c9b9SHong Zhang 
5611550c9b9SHong Zhang    Input Parameter:
5621550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5631550c9b9SHong Zhang 
5641550c9b9SHong Zhang    Level: developer
5651550c9b9SHong Zhang 
5661550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
5671550c9b9SHong Zhang @*/
5689a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5691550c9b9SHong Zhang {
5701550c9b9SHong Zhang   PetscErrorCode ierr;
5711550c9b9SHong Zhang 
5721550c9b9SHong Zhang   PetscFunctionBegin;
5739a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5749a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5759a992471SHong Zhang   if (tj->ops->reset) {
5769a992471SHong Zhang     ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr);
5779a992471SHong Zhang   }
5789a992471SHong Zhang   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
579fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr);
580fe8322adSStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr);
581fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5821550c9b9SHong Zhang   PetscFunctionReturn(0);
5831550c9b9SHong Zhang }
5841550c9b9SHong Zhang 
5851550c9b9SHong Zhang /*@
586bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
587bc952696SBarry Smith 
588bc952696SBarry Smith    Collective on TSTrajectory
589bc952696SBarry Smith 
590bc952696SBarry Smith    Input Parameter:
5913c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
592bc952696SBarry Smith 
593df5474d8SHong Zhang    Level: developer
594bc952696SBarry Smith 
5953c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
596bc952696SBarry Smith @*/
597972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
598bc952696SBarry Smith {
599bc952696SBarry Smith   PetscErrorCode ierr;
600bc952696SBarry Smith 
601bc952696SBarry Smith   PetscFunctionBegin;
602972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
603972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
604c793f718SLisandro Dalcin   if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);}
605bc952696SBarry Smith 
606fe8322adSStefano Zampini   ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr);
607fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr);
608fe8322adSStefano Zampini   ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr);
609fe8322adSStefano Zampini   ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr);
610fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr);
611fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr);
6129a992471SHong Zhang 
6137f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
614972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
615fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
616fe8322adSStefano Zampini     PetscMPIInt rank;
617fe8322adSStefano Zampini     MPI_Comm    comm;
618fe8322adSStefano Zampini 
619fe8322adSStefano Zampini     ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr);
620fe8322adSStefano Zampini     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
6218a10d460SHong Zhang     if (!rank && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
622fe8322adSStefano Zampini       ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr);
623fe8322adSStefano Zampini     }
624fe8322adSStefano Zampini   }
62578fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
62664e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
62764e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
628972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
629bc952696SBarry Smith   PetscFunctionReturn(0);
630bc952696SBarry Smith }
631bc952696SBarry Smith 
632bc952696SBarry Smith /*
633772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
634bc952696SBarry Smith 
635bc952696SBarry Smith   Collective on TSTrajectory
636bc952696SBarry Smith 
637bc952696SBarry Smith   Input Parameter:
6383c0fce88SHong Zhang + tj - the TSTrajectory context
6393c0fce88SHong Zhang - ts - the TS context
6403c0fce88SHong Zhang 
6413c0fce88SHong Zhang   Options Database Keys:
6423c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
643bc952696SBarry Smith 
644df5474d8SHong Zhang   Level: developer
645bc952696SBarry Smith 
6463c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
647bc952696SBarry Smith */
6482bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
649bc952696SBarry Smith {
650bc952696SBarry Smith   PetscBool      opt;
651bc952696SBarry Smith   const char     *defaultType;
652bc952696SBarry Smith   char           typeName[256];
653bc952696SBarry Smith   PetscErrorCode ierr;
654bc952696SBarry Smith 
655bc952696SBarry Smith   PetscFunctionBegin;
656b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
657bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
658bc952696SBarry Smith 
659560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
660e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
661bc952696SBarry Smith   if (opt) {
662972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
663bc952696SBarry Smith   } else {
664972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
665bc952696SBarry Smith   }
666bc952696SBarry Smith   PetscFunctionReturn(0);
667bc952696SBarry Smith }
668bc952696SBarry Smith 
669ed695a29SHong Zhang /*@
6709ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6719ffb3502SHong Zhang 
6729ffb3502SHong Zhang    Collective on TSTrajectory
6739ffb3502SHong Zhang 
6749ffb3502SHong Zhang    Input Arguments:
6759ffb3502SHong Zhang +  tj - the TSTrajectory context
6769ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6779ffb3502SHong Zhang 
6789ffb3502SHong Zhang    Options Database Keys:
6799ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6809ffb3502SHong Zhang 
6819ffb3502SHong Zhang    Level: advanced
6829ffb3502SHong Zhang 
6839ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
6849ffb3502SHong Zhang @*/
6859ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6869ffb3502SHong Zhang {
6879ffb3502SHong Zhang   PetscFunctionBegin;
6889ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6899ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6909ffb3502SHong Zhang   tj->usehistory = flg;
6919ffb3502SHong Zhang   PetscFunctionReturn(0);
6929ffb3502SHong Zhang }
6939ffb3502SHong Zhang 
6949ffb3502SHong Zhang /*@
695ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
696ed695a29SHong Zhang 
697ed695a29SHong Zhang    Collective on TSTrajectory
698ed695a29SHong Zhang 
699ed695a29SHong Zhang    Input Arguments:
700ed695a29SHong Zhang +  tj - the TSTrajectory context
701ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
702ed695a29SHong Zhang 
7033c0fce88SHong Zhang    Options Database Keys:
704063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
7053c0fce88SHong Zhang 
706df5474d8SHong Zhang    Level: developer
707ed695a29SHong Zhang 
7083c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
709ed695a29SHong Zhang @*/
7102bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
711ed695a29SHong Zhang {
712ed695a29SHong Zhang   PetscFunctionBegin;
713ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
714ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
715fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
716fe8322adSStefano Zampini   else tj->monitor = NULL;
717ed695a29SHong Zhang   PetscFunctionReturn(0);
718ed695a29SHong Zhang }
719ed695a29SHong Zhang 
720bc952696SBarry Smith /*@
72164fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
72264fc91eeSBarry Smith 
72364fc91eeSBarry Smith    Collective on TSTrajectory
72464fc91eeSBarry Smith 
72564fc91eeSBarry Smith    Input Arguments:
72664fc91eeSBarry Smith +  tj - the TSTrajectory context
72764fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
72864fc91eeSBarry Smith 
72964fc91eeSBarry Smith    Options Database Keys:
73064fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
73164fc91eeSBarry Smith 
73295452b02SPatrick Sanan    Notes:
73395452b02SPatrick 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.
73464fc91eeSBarry Smith 
73564fc91eeSBarry Smith    Level: advanced
73664fc91eeSBarry Smith 
73764fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
73864fc91eeSBarry Smith @*/
73964fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
74064fc91eeSBarry Smith {
74164fc91eeSBarry Smith   PetscFunctionBegin;
74264fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
74364fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
74464fc91eeSBarry Smith   tj->keepfiles = flg;
74564fc91eeSBarry Smith   PetscFunctionReturn(0);
74664fc91eeSBarry Smith }
74764fc91eeSBarry Smith 
748db901c5bSHong Zhang /*@C
74964e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
75064e38db7SHong Zhang 
75164e38db7SHong Zhang    Collective on TSTrajectory
75264e38db7SHong Zhang 
75364e38db7SHong Zhang    Input Arguments:
75464e38db7SHong Zhang +  tj      - the TSTrajectory context
75564e38db7SHong Zhang -  dirname - the directory name
75664e38db7SHong Zhang 
75764e38db7SHong Zhang    Options Database Keys:
75864e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
75964e38db7SHong Zhang 
76095452b02SPatrick Sanan    Notes:
76195452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7621585b412SBarry Smith 
76364e38db7SHong Zhang    Level: developer
76464e38db7SHong Zhang 
76564e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
76664e38db7SHong Zhang @*/
76764e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
76864e38db7SHong Zhang {
76964e38db7SHong Zhang   PetscErrorCode ierr;
770a17281aeSStefano Zampini   PetscBool      flg;
771a17281aeSStefano Zampini 
77264e38db7SHong Zhang   PetscFunctionBegin;
77364e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
774a17281aeSStefano Zampini   ierr = PetscStrcmp(tj->dirname,dirname,&flg);CHKERRQ(ierr);
775a17281aeSStefano Zampini   if (!flg && tj->dirfiletemplate) {
776a17281aeSStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
777a17281aeSStefano Zampini   }
77884a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
77964e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
78064e38db7SHong Zhang   PetscFunctionReturn(0);
78164e38db7SHong Zhang }
78264e38db7SHong Zhang 
783db901c5bSHong Zhang /*@C
78464e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
78564e38db7SHong Zhang 
78664e38db7SHong Zhang    Collective on TSTrajectory
78764e38db7SHong Zhang 
78864e38db7SHong Zhang    Input Arguments:
78964e38db7SHong Zhang +  tj      - the TSTrajectory context
7901585b412SBarry Smith -  filetemplate - the template
79164e38db7SHong Zhang 
79264e38db7SHong Zhang    Options Database Keys:
7931585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7941585b412SBarry Smith 
79595452b02SPatrick Sanan    Notes:
79695452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
7971585b412SBarry Smith 
7981585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
7991585b412SBarry Smith    timestep counter
80064e38db7SHong Zhang 
80164e38db7SHong Zhang    Level: developer
80264e38db7SHong Zhang 
8031585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
80464e38db7SHong Zhang @*/
80564e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
80664e38db7SHong Zhang {
80764e38db7SHong Zhang   PetscErrorCode ierr;
8089afe7f3eSBarry Smith   const char     *ptr,*ptr2;
8099afe7f3eSBarry Smith 
81064e38db7SHong Zhang   PetscFunctionBegin;
81164e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
8129afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
8139afe7f3eSBarry Smith 
8149afe7f3eSBarry 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");
8159afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
8169afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
8179afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
8189afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
8199afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
8209afe7f3eSBarry 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");
8219afe7f3eSBarry Smith     if (ptr2) break;
8229afe7f3eSBarry Smith   }
82384a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
82464e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
82564e38db7SHong Zhang   PetscFunctionReturn(0);
82664e38db7SHong Zhang }
82764e38db7SHong Zhang 
82864e38db7SHong Zhang /*@
829bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
830bc952696SBarry Smith 
831bc952696SBarry Smith    Collective on TSTrajectory
832bc952696SBarry Smith 
833bc952696SBarry Smith    Input Parameter:
8343c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
8353c0fce88SHong Zhang -  ts - the TS context
836bc952696SBarry Smith 
837bc952696SBarry Smith    Options Database Keys:
8383c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
83964fc91eeSBarry 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
840063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
841bc952696SBarry Smith 
842df5474d8SHong Zhang    Level: developer
843bc952696SBarry Smith 
84495452b02SPatrick Sanan    Notes:
84595452b02SPatrick Sanan     This is not normally called directly by users
846bc952696SBarry Smith 
8473c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
848bc952696SBarry Smith @*/
849972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
850bc952696SBarry Smith {
851ed695a29SHong Zhang   PetscBool      set,flg;
85264e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
85364e38db7SHong Zhang   PetscErrorCode ierr;
854bc952696SBarry Smith 
855bc952696SBarry Smith   PetscFunctionBegin;
856b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
857fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
858b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
859972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
860ac1a7491SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL);CHKERRQ(ierr);
861ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
862aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
863fe8322adSStefano Zampini   ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr);
864fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr);
865fe8322adSStefano 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);
866fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr);
86764fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
86864fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
86964e38db7SHong Zhang 
870*589a23caSBarry Smith   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set);CHKERRQ(ierr);
87184a45834SBarry Smith   if (set) {
87264e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
87384a45834SBarry Smith   }
87464e38db7SHong Zhang 
875*589a23caSBarry Smith   ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set);CHKERRQ(ierr);
87664e38db7SHong Zhang   if (set) {
8771585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
87884a45834SBarry Smith   }
87964e38db7SHong Zhang 
88064e38db7SHong Zhang   /* Handle specific TSTrajectory options */
88162b521acSHong Zhang   if (tj->ops->setfromoptions) {
88262b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
88362b521acSHong Zhang   }
884bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
885bc952696SBarry Smith   PetscFunctionReturn(0);
886bc952696SBarry Smith }
88768bece0bSHong Zhang 
88868bece0bSHong Zhang /*@
88968bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
89068bece0bSHong Zhang    of a TS trajectory.
89168bece0bSHong Zhang 
89268bece0bSHong Zhang    Collective on TS
89368bece0bSHong Zhang 
89468bece0bSHong Zhang    Input Parameter:
8953c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8963c0fce88SHong Zhang -  tj - the TS trajectory context
89768bece0bSHong Zhang 
898df5474d8SHong Zhang    Level: developer
89968bece0bSHong Zhang 
90068bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
90168bece0bSHong Zhang @*/
90268bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
90368bece0bSHong Zhang {
90468bece0bSHong Zhang   PetscErrorCode ierr;
9059afe7f3eSBarry Smith   size_t         s1,s2;
90668bece0bSHong Zhang 
90768bece0bSHong Zhang   PetscFunctionBegin;
90868bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
90968bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
910fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
91168bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
91268bece0bSHong Zhang 
91368bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
91468bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
91568bece0bSHong Zhang   }
91668bece0bSHong Zhang   if (tj->ops->setup) {
91768bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
91868bece0bSHong Zhang   }
91968bece0bSHong Zhang 
92068bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
92153b27ddbSHong Zhang 
92253b27ddbSHong Zhang   /* Set the counters to zero */
9231a5a771fSHong Zhang   tj->recomps    = 0;
92453b27ddbSHong Zhang   tj->diskreads  = 0;
92553b27ddbSHong Zhang   tj->diskwrites = 0;
9269afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
9279afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
928fe8322adSStefano Zampini   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
92911e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
93011e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
93168bece0bSHong Zhang   PetscFunctionReturn(0);
93268bece0bSHong Zhang }
933fe8322adSStefano Zampini 
934fe8322adSStefano Zampini /*@
935fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
936fe8322adSStefano Zampini 
937fe8322adSStefano Zampini    Collective on TSTrajectory
938fe8322adSStefano Zampini 
939fe8322adSStefano Zampini    Input Parameter:
940fe8322adSStefano Zampini +  tj  - the TS trajectory context
941fe8322adSStefano Zampini -  flg - the boolean flag
942fe8322adSStefano Zampini 
943fe8322adSStefano Zampini    Level: developer
944fe8322adSStefano Zampini 
945fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly()
946fe8322adSStefano Zampini @*/
947fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
948fe8322adSStefano Zampini {
949fe8322adSStefano Zampini   PetscFunctionBegin;
950fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
951fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
952fe8322adSStefano Zampini   tj->solution_only = solution_only;
953fe8322adSStefano Zampini   PetscFunctionReturn(0);
954fe8322adSStefano Zampini }
955fe8322adSStefano Zampini 
956fe8322adSStefano Zampini /*@
957fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
958fe8322adSStefano Zampini 
959fe8322adSStefano Zampini    Logically collective on TSTrajectory
960fe8322adSStefano Zampini 
961fe8322adSStefano Zampini    Input Parameter:
962fe8322adSStefano Zampini .  tj  - the TS trajectory context
963fe8322adSStefano Zampini 
964fe8322adSStefano Zampini    Output Parameter:
965fe8322adSStefano Zampini -  flg - the boolean flag
966fe8322adSStefano Zampini 
967fe8322adSStefano Zampini    Level: developer
968fe8322adSStefano Zampini 
969fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly()
970fe8322adSStefano Zampini @*/
971fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
972fe8322adSStefano Zampini {
973fe8322adSStefano Zampini   PetscFunctionBegin;
974fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
975fe8322adSStefano Zampini   PetscValidPointer(solution_only,2);
976fe8322adSStefano Zampini   *solution_only = tj->solution_only;
977fe8322adSStefano Zampini   PetscFunctionReturn(0);
978fe8322adSStefano Zampini }
979fe8322adSStefano Zampini 
980fe8322adSStefano Zampini /*@
981fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
982fe8322adSStefano Zampini 
983fe8322adSStefano Zampini    Collective on TSTrajectory
984fe8322adSStefano Zampini 
985fe8322adSStefano Zampini    Input Parameter:
986fe8322adSStefano Zampini +  tj   - the TS trajectory context
987fe8322adSStefano Zampini .  ts   - the TS solver context
988fe8322adSStefano Zampini -  time - the requested time
989fe8322adSStefano Zampini 
990fe8322adSStefano Zampini    Output Parameter:
991fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
992fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
993fe8322adSStefano Zampini 
994fe8322adSStefano Zampini    Level: developer
995fe8322adSStefano Zampini 
996fe8322adSStefano 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.
997fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
998fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
999fe8322adSStefano Zampini 
1000fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs()
1001fe8322adSStefano Zampini @*/
1002fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
1003fe8322adSStefano Zampini {
1004fe8322adSStefano Zampini   PetscErrorCode ierr;
1005fe8322adSStefano Zampini 
1006fe8322adSStefano Zampini   PetscFunctionBegin;
1007fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1008fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
1009fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
1010fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
1011fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
1012fe8322adSStefano Zampini   if (U && !tj->U) {
1013fe8322adSStefano Zampini     DM dm;
1014fe8322adSStefano Zampini 
1015fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
1016fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr);
1017fe8322adSStefano Zampini   }
1018fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
1019fe8322adSStefano Zampini     DM dm;
1020fe8322adSStefano Zampini 
1021fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
1022fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr);
1023fe8322adSStefano Zampini   }
1024fe8322adSStefano Zampini   ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr);
1025fe8322adSStefano Zampini   if (U) {
10268860a134SJunchao Zhang     ierr = VecLockReadPush(tj->U);CHKERRQ(ierr);
1027fe8322adSStefano Zampini     *U   = tj->U;
1028fe8322adSStefano Zampini   }
1029fe8322adSStefano Zampini   if (Udot) {
10308860a134SJunchao Zhang     ierr  = VecLockReadPush(tj->Udot);CHKERRQ(ierr);
1031fe8322adSStefano Zampini     *Udot = tj->Udot;
1032fe8322adSStefano Zampini   }
1033fe8322adSStefano Zampini   PetscFunctionReturn(0);
1034fe8322adSStefano Zampini }
1035fe8322adSStefano Zampini 
1036fe8322adSStefano Zampini /*@
1037fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1038fe8322adSStefano Zampini 
1039fe8322adSStefano Zampini    Collective on TSTrajectory
1040fe8322adSStefano Zampini 
1041fe8322adSStefano Zampini    Input Parameter:
1042fe8322adSStefano Zampini +  tj   - the TS trajectory context
1043fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1044fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1045fe8322adSStefano Zampini 
1046fe8322adSStefano Zampini    Level: developer
1047fe8322adSStefano Zampini 
1048fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs()
1049fe8322adSStefano Zampini @*/
1050fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1051fe8322adSStefano Zampini {
1052fe8322adSStefano Zampini   PetscErrorCode ierr;
1053fe8322adSStefano Zampini 
1054fe8322adSStefano Zampini   PetscFunctionBegin;
1055fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1056fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1057fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
1058fe8322adSStefano Zampini   if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1059fe8322adSStefano Zampini   if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1060fe8322adSStefano Zampini   if (U) {
10618860a134SJunchao Zhang     ierr = VecLockReadPop(tj->U);CHKERRQ(ierr);
1062fe8322adSStefano Zampini     *U   = NULL;
1063fe8322adSStefano Zampini   }
1064fe8322adSStefano Zampini   if (Udot) {
10658860a134SJunchao Zhang     ierr  = VecLockReadPop(tj->Udot);CHKERRQ(ierr);
1066fe8322adSStefano Zampini     *Udot = NULL;
1067fe8322adSStefano Zampini   }
1068fe8322adSStefano Zampini   PetscFunctionReturn(0);
1069fe8322adSStefano Zampini }
1070