xref: /petsc/src/ts/trajectory/interface/traj.c (revision d083f849a86f1f43e18d534ee43954e2786cb29a)
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
273bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
274bc952696SBarry Smith 
275bc952696SBarry Smith     Collective on TSTrajectory
276bc952696SBarry Smith 
277bc952696SBarry Smith     Input Parameters:
278b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
279bc952696SBarry Smith -   viewer - visualization context
280bc952696SBarry Smith 
281bc952696SBarry Smith     Options Database Key:
282e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
283bc952696SBarry Smith 
284bc952696SBarry Smith     Notes:
285bc952696SBarry Smith     The available visualization contexts include
286bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
287bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
288bc952696SBarry Smith          output where only the first processor opens
289bc952696SBarry Smith          the file.  All other processors send their
290bc952696SBarry Smith          data to the first processor to print.
291bc952696SBarry Smith 
292bc952696SBarry Smith     The user can open an alternative visualization context with
293bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
294bc952696SBarry Smith 
295df5474d8SHong Zhang     Level: developer
296bc952696SBarry Smith 
297bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
298bc952696SBarry Smith @*/
299b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
300bc952696SBarry Smith {
301bc952696SBarry Smith   PetscErrorCode ierr;
302bc952696SBarry Smith   PetscBool      iascii;
303bc952696SBarry Smith 
304bc952696SBarry Smith   PetscFunctionBegin;
3051a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
306bc952696SBarry Smith   if (!viewer) {
307b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
308bc952696SBarry Smith   }
309bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
310b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
311bc952696SBarry Smith 
312bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
313bc952696SBarry Smith   if (iascii) {
314b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
3151a5a771fSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
31653b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
31753b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
318b1d74d50SHong Zhang     if (tj->ops->view) {
319285336bfSHong Zhang       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
320b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
321285336bfSHong Zhang       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
322bc952696SBarry Smith     }
323bc952696SBarry Smith   }
324bc952696SBarry Smith   PetscFunctionReturn(0);
325bc952696SBarry Smith }
326bc952696SBarry Smith 
327bc952696SBarry Smith /*@C
32878fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
32978fbdcc8SBarry Smith 
33078fbdcc8SBarry Smith    Collective on TSTrajectory
33178fbdcc8SBarry Smith 
33278fbdcc8SBarry Smith    Input Parameters:
33378fbdcc8SBarry Smith +  tr - the trajectory context
33478fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
33578fbdcc8SBarry Smith 
33678fbdcc8SBarry Smith    Level: intermediate
33778fbdcc8SBarry Smith 
338db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
339db901c5bSHong Zhang 
34078fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
34178fbdcc8SBarry Smith @*/
34278fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
34378fbdcc8SBarry Smith {
34478fbdcc8SBarry Smith   PetscErrorCode    ierr;
34578fbdcc8SBarry Smith 
34678fbdcc8SBarry Smith   PetscFunctionBegin;
347fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
348fe8322adSStefano Zampini   PetscValidPointer(names,2);
34978fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
35078fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
35178fbdcc8SBarry Smith   PetscFunctionReturn(0);
35278fbdcc8SBarry Smith }
35378fbdcc8SBarry Smith 
35478fbdcc8SBarry Smith /*@C
355fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
35608347785SBarry Smith 
35708347785SBarry Smith    Collective on TSLGCtx
35808347785SBarry Smith 
35908347785SBarry Smith    Input Parameters:
36008347785SBarry Smith +  tj - the TSTrajectory context
36108347785SBarry Smith .  transform - the transform function
36208347785SBarry Smith .  destroy - function to destroy the optional context
36308347785SBarry Smith -  ctx - optional context used by transform function
36408347785SBarry Smith 
36508347785SBarry Smith    Level: intermediate
36608347785SBarry Smith 
36708347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
36808347785SBarry Smith @*/
36908347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
37008347785SBarry Smith {
37108347785SBarry Smith   PetscFunctionBegin;
372fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
37308347785SBarry Smith   tj->transform        = transform;
37408347785SBarry Smith   tj->transformdestroy = destroy;
37508347785SBarry Smith   tj->transformctx     = tctx;
37608347785SBarry Smith   PetscFunctionReturn(0);
37708347785SBarry Smith }
37808347785SBarry Smith 
379db901c5bSHong Zhang /*@
380bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
381bc952696SBarry Smith 
382*d083f849SBarry Smith   Collective
383bc952696SBarry Smith 
384bc952696SBarry Smith   Input Parameter:
3853c0fce88SHong Zhang . comm - the communicator
386bc952696SBarry Smith 
387bc952696SBarry Smith   Output Parameter:
3883c0fce88SHong Zhang . tj   - the trajectory object
389bc952696SBarry Smith 
390df5474d8SHong Zhang   Level: developer
391bc952696SBarry Smith 
39295452b02SPatrick Sanan   Notes:
39395452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
394bc952696SBarry Smith 
39564fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
396bc952696SBarry Smith @*/
397b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
398bc952696SBarry Smith {
399bc952696SBarry Smith   TSTrajectory   t;
400bc952696SBarry Smith   PetscErrorCode ierr;
401bc952696SBarry Smith 
402bc952696SBarry Smith   PetscFunctionBegin;
403b1d74d50SHong Zhang   PetscValidPointer(tj,2);
404b1d74d50SHong Zhang   *tj = NULL;
405bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
406bc952696SBarry Smith 
40773107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
40868bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
409fe8322adSStefano Zampini   ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr);
410fe8322adSStefano Zampini 
411fe8322adSStefano Zampini   t->lag.order            = 1;
412fe8322adSStefano Zampini   t->lag.L                = NULL;
413fe8322adSStefano Zampini   t->lag.T                = NULL;
414fe8322adSStefano Zampini   t->lag.W                = NULL;
415fe8322adSStefano Zampini   t->lag.WW               = NULL;
416fe8322adSStefano Zampini   t->lag.TW               = NULL;
417fe8322adSStefano Zampini   t->lag.TT               = NULL;
418fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
419fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
420fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
421fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
422fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
423fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
424fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
425fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
426fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
427fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
428fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
429fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
430ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
431b1d74d50SHong Zhang   *tj  = t;
4328a10d460SHong Zhang   ierr = TSTrajectorySetFiletemplate(t,"TS-%06D.bin");CHKERRQ(ierr);
433bc952696SBarry Smith   PetscFunctionReturn(0);
434bc952696SBarry Smith }
435bc952696SBarry Smith 
436bc952696SBarry Smith /*@C
437bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
438bc952696SBarry Smith 
439bc952696SBarry Smith   Collective on TS
440bc952696SBarry Smith 
441bc952696SBarry Smith   Input Parameters:
4423c0fce88SHong Zhang + tj   - the TSTrajectory context
4433c0fce88SHong Zhang . ts   - the TS context
4443c0fce88SHong Zhang - type - a known method
445bc952696SBarry Smith 
446bc952696SBarry Smith   Options Database Command:
447e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
448bc952696SBarry Smith 
449df5474d8SHong Zhang    Level: developer
450bc952696SBarry Smith 
451881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType()
452bc952696SBarry Smith 
453bc952696SBarry Smith @*/
454fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
455bc952696SBarry Smith {
456972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
457bc952696SBarry Smith   PetscBool      match;
458bc952696SBarry Smith   PetscErrorCode ierr;
459bc952696SBarry Smith 
460bc952696SBarry Smith   PetscFunctionBegin;
461972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
462972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
463bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
464bc952696SBarry Smith 
465bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
466bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
467972caf09SHong Zhang   if (tj->ops->destroy) {
468972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
469bc952696SBarry Smith 
470972caf09SHong Zhang     tj->ops->destroy = NULL;
471bc952696SBarry Smith   }
472972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
473bc952696SBarry Smith 
474972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
475972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
476bc952696SBarry Smith   PetscFunctionReturn(0);
477bc952696SBarry Smith }
478bc952696SBarry Smith 
479881c1a9bSHong Zhang /*@C
480881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
481881c1a9bSHong Zhang 
482881c1a9bSHong Zhang   Collective on TS
483881c1a9bSHong Zhang 
484881c1a9bSHong Zhang   Input Parameters:
485881c1a9bSHong Zhang + tj   - the TSTrajectory context
486881c1a9bSHong Zhang - ts   - the TS context
487881c1a9bSHong Zhang 
488881c1a9bSHong Zhang   Output Parameters:
489881c1a9bSHong Zhang . type - a known method
490881c1a9bSHong Zhang 
491881c1a9bSHong Zhang   Level: developer
492881c1a9bSHong Zhang 
493881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType()
494881c1a9bSHong Zhang 
495881c1a9bSHong Zhang @*/
496881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
497881c1a9bSHong Zhang {
498881c1a9bSHong Zhang   PetscFunctionBegin;
499881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
500881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
501881c1a9bSHong Zhang   PetscFunctionReturn(0);
502881c1a9bSHong Zhang }
503881c1a9bSHong Zhang 
504972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
505972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5069a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5072b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
508bc952696SBarry Smith 
509bc952696SBarry Smith /*@C
510bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
511bc952696SBarry Smith 
512bc952696SBarry Smith   Not Collective
513bc952696SBarry Smith 
514df5474d8SHong Zhang   Level: developer
515bc952696SBarry Smith 
5163c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
517bc952696SBarry Smith @*/
518bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
519bc952696SBarry Smith {
520bc952696SBarry Smith   PetscErrorCode ierr;
521bc952696SBarry Smith 
522bc952696SBarry Smith   PetscFunctionBegin;
523560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
524bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
525bc952696SBarry Smith 
526bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
5271c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
5289a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
5292b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
530bc952696SBarry Smith   PetscFunctionReturn(0);
531bc952696SBarry Smith }
532bc952696SBarry Smith 
533bc952696SBarry Smith /*@
5341550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5351550c9b9SHong Zhang 
5361550c9b9SHong Zhang    Collective on TSTrajectory
5371550c9b9SHong Zhang 
5381550c9b9SHong Zhang    Input Parameter:
5391550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5401550c9b9SHong Zhang 
5411550c9b9SHong Zhang    Level: developer
5421550c9b9SHong Zhang 
5431550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
5441550c9b9SHong Zhang @*/
5459a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5461550c9b9SHong Zhang {
5471550c9b9SHong Zhang   PetscErrorCode ierr;
5481550c9b9SHong Zhang 
5491550c9b9SHong Zhang   PetscFunctionBegin;
5509a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5519a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5529a992471SHong Zhang   if (tj->ops->reset) {
5539a992471SHong Zhang     ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr);
5549a992471SHong Zhang   }
5559a992471SHong Zhang   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
556fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr);
557fe8322adSStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr);
558fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5591550c9b9SHong Zhang   PetscFunctionReturn(0);
5601550c9b9SHong Zhang }
5611550c9b9SHong Zhang 
5621550c9b9SHong Zhang /*@
563bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
564bc952696SBarry Smith 
565bc952696SBarry Smith    Collective on TSTrajectory
566bc952696SBarry Smith 
567bc952696SBarry Smith    Input Parameter:
5683c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
569bc952696SBarry Smith 
570df5474d8SHong Zhang    Level: developer
571bc952696SBarry Smith 
5723c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
573bc952696SBarry Smith @*/
574972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
575bc952696SBarry Smith {
576bc952696SBarry Smith   PetscErrorCode ierr;
577bc952696SBarry Smith 
578bc952696SBarry Smith   PetscFunctionBegin;
579972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
580972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
581972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
582bc952696SBarry Smith 
583fe8322adSStefano Zampini   ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr);
584fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr);
585fe8322adSStefano Zampini   ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr);
586fe8322adSStefano Zampini   ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr);
587fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr);
588fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr);
5899a992471SHong Zhang 
5907f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
591972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
592fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
593fe8322adSStefano Zampini     PetscMPIInt rank;
594fe8322adSStefano Zampini     MPI_Comm    comm;
595fe8322adSStefano Zampini 
596fe8322adSStefano Zampini     ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr);
597fe8322adSStefano Zampini     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
5988a10d460SHong Zhang     if (!rank && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
599fe8322adSStefano Zampini       ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr);
600fe8322adSStefano Zampini     }
601fe8322adSStefano Zampini   }
60278fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
60364e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
60464e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
605972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
606bc952696SBarry Smith   PetscFunctionReturn(0);
607bc952696SBarry Smith }
608bc952696SBarry Smith 
609bc952696SBarry Smith /*
610772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
611bc952696SBarry Smith 
612bc952696SBarry Smith   Collective on TSTrajectory
613bc952696SBarry Smith 
614bc952696SBarry Smith   Input Parameter:
6153c0fce88SHong Zhang + tj - the TSTrajectory context
6163c0fce88SHong Zhang - ts - the TS context
6173c0fce88SHong Zhang 
6183c0fce88SHong Zhang   Options Database Keys:
6193c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
620bc952696SBarry Smith 
621df5474d8SHong Zhang   Level: developer
622bc952696SBarry Smith 
6233c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
624bc952696SBarry Smith */
6252bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
626bc952696SBarry Smith {
627bc952696SBarry Smith   PetscBool      opt;
628bc952696SBarry Smith   const char     *defaultType;
629bc952696SBarry Smith   char           typeName[256];
630bc952696SBarry Smith   PetscErrorCode ierr;
631bc952696SBarry Smith 
632bc952696SBarry Smith   PetscFunctionBegin;
633b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
634bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
635bc952696SBarry Smith 
636560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
637e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
638bc952696SBarry Smith   if (opt) {
639972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
640bc952696SBarry Smith   } else {
641972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
642bc952696SBarry Smith   }
643bc952696SBarry Smith   PetscFunctionReturn(0);
644bc952696SBarry Smith }
645bc952696SBarry Smith 
646ed695a29SHong Zhang /*@
6479ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6489ffb3502SHong Zhang 
6499ffb3502SHong Zhang    Collective on TSTrajectory
6509ffb3502SHong Zhang 
6519ffb3502SHong Zhang    Input Arguments:
6529ffb3502SHong Zhang +  tj - the TSTrajectory context
6539ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6549ffb3502SHong Zhang 
6559ffb3502SHong Zhang    Options Database Keys:
6569ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6579ffb3502SHong Zhang 
6589ffb3502SHong Zhang    Level: advanced
6599ffb3502SHong Zhang 
6609ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
6619ffb3502SHong Zhang @*/
6629ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6639ffb3502SHong Zhang {
6649ffb3502SHong Zhang   PetscFunctionBegin;
6659ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6669ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6679ffb3502SHong Zhang   tj->usehistory = flg;
6689ffb3502SHong Zhang   PetscFunctionReturn(0);
6699ffb3502SHong Zhang }
6709ffb3502SHong Zhang 
6719ffb3502SHong Zhang /*@
672ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
673ed695a29SHong Zhang 
674ed695a29SHong Zhang    Collective on TSTrajectory
675ed695a29SHong Zhang 
676ed695a29SHong Zhang    Input Arguments:
677ed695a29SHong Zhang +  tj - the TSTrajectory context
678ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
679ed695a29SHong Zhang 
6803c0fce88SHong Zhang    Options Database Keys:
681063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6823c0fce88SHong Zhang 
683df5474d8SHong Zhang    Level: developer
684ed695a29SHong Zhang 
6853c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
686ed695a29SHong Zhang @*/
6872bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
688ed695a29SHong Zhang {
689ed695a29SHong Zhang   PetscFunctionBegin;
690ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
691ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
692fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
693fe8322adSStefano Zampini   else tj->monitor = NULL;
694ed695a29SHong Zhang   PetscFunctionReturn(0);
695ed695a29SHong Zhang }
696ed695a29SHong Zhang 
697bc952696SBarry Smith /*@
69864fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
69964fc91eeSBarry Smith 
70064fc91eeSBarry Smith    Collective on TSTrajectory
70164fc91eeSBarry Smith 
70264fc91eeSBarry Smith    Input Arguments:
70364fc91eeSBarry Smith +  tj - the TSTrajectory context
70464fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
70564fc91eeSBarry Smith 
70664fc91eeSBarry Smith    Options Database Keys:
70764fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
70864fc91eeSBarry Smith 
70995452b02SPatrick Sanan    Notes:
71095452b02SPatrick 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.
71164fc91eeSBarry Smith 
71264fc91eeSBarry Smith    Level: advanced
71364fc91eeSBarry Smith 
71464fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
71564fc91eeSBarry Smith @*/
71664fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
71764fc91eeSBarry Smith {
71864fc91eeSBarry Smith   PetscFunctionBegin;
71964fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
72064fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
72164fc91eeSBarry Smith   tj->keepfiles = flg;
72264fc91eeSBarry Smith   PetscFunctionReturn(0);
72364fc91eeSBarry Smith }
72464fc91eeSBarry Smith 
725db901c5bSHong Zhang /*@C
72664e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
72764e38db7SHong Zhang 
72864e38db7SHong Zhang    Collective on TSTrajectory
72964e38db7SHong Zhang 
73064e38db7SHong Zhang    Input Arguments:
73164e38db7SHong Zhang +  tj      - the TSTrajectory context
73264e38db7SHong Zhang -  dirname - the directory name
73364e38db7SHong Zhang 
73464e38db7SHong Zhang    Options Database Keys:
73564e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
73664e38db7SHong Zhang 
73795452b02SPatrick Sanan    Notes:
73895452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7391585b412SBarry Smith 
74064e38db7SHong Zhang    Level: developer
74164e38db7SHong Zhang 
74264e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
74364e38db7SHong Zhang @*/
74464e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
74564e38db7SHong Zhang {
74664e38db7SHong Zhang   PetscErrorCode ierr;
747a17281aeSStefano Zampini   PetscBool      flg;
748a17281aeSStefano Zampini 
74964e38db7SHong Zhang   PetscFunctionBegin;
75064e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
751a17281aeSStefano Zampini   ierr = PetscStrcmp(tj->dirname,dirname,&flg);CHKERRQ(ierr);
752a17281aeSStefano Zampini   if (!flg && tj->dirfiletemplate) {
753a17281aeSStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
754a17281aeSStefano Zampini   }
75584a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
75664e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
75764e38db7SHong Zhang   PetscFunctionReturn(0);
75864e38db7SHong Zhang }
75964e38db7SHong Zhang 
760db901c5bSHong Zhang /*@C
76164e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
76264e38db7SHong Zhang 
76364e38db7SHong Zhang    Collective on TSTrajectory
76464e38db7SHong Zhang 
76564e38db7SHong Zhang    Input Arguments:
76664e38db7SHong Zhang +  tj      - the TSTrajectory context
7671585b412SBarry Smith -  filetemplate - the template
76864e38db7SHong Zhang 
76964e38db7SHong Zhang    Options Database Keys:
7701585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7711585b412SBarry Smith 
77295452b02SPatrick Sanan    Notes:
77395452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
7741585b412SBarry Smith 
7751585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
7761585b412SBarry Smith    timestep counter
77764e38db7SHong Zhang 
77864e38db7SHong Zhang    Level: developer
77964e38db7SHong Zhang 
7801585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
78164e38db7SHong Zhang @*/
78264e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
78364e38db7SHong Zhang {
78464e38db7SHong Zhang   PetscErrorCode ierr;
7859afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7869afe7f3eSBarry Smith 
78764e38db7SHong Zhang   PetscFunctionBegin;
78864e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7899afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
7909afe7f3eSBarry Smith 
7919afe7f3eSBarry 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");
7929afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7939afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
7949afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
7959afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
7969afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
7979afe7f3eSBarry 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");
7989afe7f3eSBarry Smith     if (ptr2) break;
7999afe7f3eSBarry Smith   }
80084a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
80164e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
80264e38db7SHong Zhang   PetscFunctionReturn(0);
80364e38db7SHong Zhang }
80464e38db7SHong Zhang 
80564e38db7SHong Zhang /*@
806bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
807bc952696SBarry Smith 
808bc952696SBarry Smith    Collective on TSTrajectory
809bc952696SBarry Smith 
810bc952696SBarry Smith    Input Parameter:
8113c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
8123c0fce88SHong Zhang -  ts - the TS context
813bc952696SBarry Smith 
814bc952696SBarry Smith    Options Database Keys:
8153c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
81664fc91eeSBarry 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
817063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
818bc952696SBarry Smith 
819df5474d8SHong Zhang    Level: developer
820bc952696SBarry Smith 
82195452b02SPatrick Sanan    Notes:
82295452b02SPatrick Sanan     This is not normally called directly by users
823bc952696SBarry Smith 
8243c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
825bc952696SBarry Smith @*/
826972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
827bc952696SBarry Smith {
828ed695a29SHong Zhang   PetscBool      set,flg;
82964e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
83064e38db7SHong Zhang   PetscErrorCode ierr;
831bc952696SBarry Smith 
832bc952696SBarry Smith   PetscFunctionBegin;
833b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
834fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
835b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
836972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
837ac1a7491SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL);CHKERRQ(ierr);
838ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
839aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
840fe8322adSStefano Zampini   ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr);
841fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr);
842fe8322adSStefano 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);
843fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr);
84464fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
84564fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
84664e38db7SHong Zhang 
84764e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
84884a45834SBarry Smith   if (set) {
84964e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
85084a45834SBarry Smith   }
85164e38db7SHong Zhang 
8521585b412SBarry 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);
85364e38db7SHong Zhang   if (set) {
8541585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
85584a45834SBarry Smith   }
85664e38db7SHong Zhang 
85764e38db7SHong Zhang   /* Handle specific TSTrajectory options */
85862b521acSHong Zhang   if (tj->ops->setfromoptions) {
85962b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
86062b521acSHong Zhang   }
861bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
862bc952696SBarry Smith   PetscFunctionReturn(0);
863bc952696SBarry Smith }
86468bece0bSHong Zhang 
86568bece0bSHong Zhang /*@
86668bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
86768bece0bSHong Zhang    of a TS trajectory.
86868bece0bSHong Zhang 
86968bece0bSHong Zhang    Collective on TS
87068bece0bSHong Zhang 
87168bece0bSHong Zhang    Input Parameter:
8723c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8733c0fce88SHong Zhang -  tj - the TS trajectory context
87468bece0bSHong Zhang 
875df5474d8SHong Zhang    Level: developer
87668bece0bSHong Zhang 
87768bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
87868bece0bSHong Zhang @*/
87968bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
88068bece0bSHong Zhang {
88168bece0bSHong Zhang   PetscErrorCode ierr;
8829afe7f3eSBarry Smith   size_t         s1,s2;
88368bece0bSHong Zhang 
88468bece0bSHong Zhang   PetscFunctionBegin;
88568bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
88668bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
887fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
88868bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
88968bece0bSHong Zhang 
89068bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
89168bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
89268bece0bSHong Zhang   }
89368bece0bSHong Zhang   if (tj->ops->setup) {
89468bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
89568bece0bSHong Zhang   }
89668bece0bSHong Zhang 
89768bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
89853b27ddbSHong Zhang 
89953b27ddbSHong Zhang   /* Set the counters to zero */
9001a5a771fSHong Zhang   tj->recomps    = 0;
90153b27ddbSHong Zhang   tj->diskreads  = 0;
90253b27ddbSHong Zhang   tj->diskwrites = 0;
9039afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
9049afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
905fe8322adSStefano Zampini   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
90611e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
90711e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
90868bece0bSHong Zhang   PetscFunctionReturn(0);
90968bece0bSHong Zhang }
910fe8322adSStefano Zampini 
911fe8322adSStefano Zampini /*@
912fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
913fe8322adSStefano Zampini 
914fe8322adSStefano Zampini    Collective on TSTrajectory
915fe8322adSStefano Zampini 
916fe8322adSStefano Zampini    Input Parameter:
917fe8322adSStefano Zampini +  tj  - the TS trajectory context
918fe8322adSStefano Zampini -  flg - the boolean flag
919fe8322adSStefano Zampini 
920fe8322adSStefano Zampini    Level: developer
921fe8322adSStefano Zampini 
922fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly()
923fe8322adSStefano Zampini @*/
924fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
925fe8322adSStefano Zampini {
926fe8322adSStefano Zampini   PetscFunctionBegin;
927fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
928fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
929fe8322adSStefano Zampini   tj->solution_only = solution_only;
930fe8322adSStefano Zampini   PetscFunctionReturn(0);
931fe8322adSStefano Zampini }
932fe8322adSStefano Zampini 
933fe8322adSStefano Zampini /*@
934fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
935fe8322adSStefano Zampini 
936fe8322adSStefano Zampini    Logically collective on TSTrajectory
937fe8322adSStefano Zampini 
938fe8322adSStefano Zampini    Input Parameter:
939fe8322adSStefano Zampini .  tj  - the TS trajectory context
940fe8322adSStefano Zampini 
941fe8322adSStefano Zampini    Output Parameter:
942fe8322adSStefano Zampini -  flg - the boolean flag
943fe8322adSStefano Zampini 
944fe8322adSStefano Zampini    Level: developer
945fe8322adSStefano Zampini 
946fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly()
947fe8322adSStefano Zampini @*/
948fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
949fe8322adSStefano Zampini {
950fe8322adSStefano Zampini   PetscFunctionBegin;
951fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
952fe8322adSStefano Zampini   PetscValidPointer(solution_only,2);
953fe8322adSStefano Zampini   *solution_only = tj->solution_only;
954fe8322adSStefano Zampini   PetscFunctionReturn(0);
955fe8322adSStefano Zampini }
956fe8322adSStefano Zampini 
957fe8322adSStefano Zampini /*@
958fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
959fe8322adSStefano Zampini 
960fe8322adSStefano Zampini    Collective on TSTrajectory
961fe8322adSStefano Zampini 
962fe8322adSStefano Zampini    Input Parameter:
963fe8322adSStefano Zampini +  tj   - the TS trajectory context
964fe8322adSStefano Zampini .  ts   - the TS solver context
965fe8322adSStefano Zampini -  time - the requested time
966fe8322adSStefano Zampini 
967fe8322adSStefano Zampini    Output Parameter:
968fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
969fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
970fe8322adSStefano Zampini 
971fe8322adSStefano Zampini    Level: developer
972fe8322adSStefano Zampini 
973fe8322adSStefano 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.
974fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
975fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
976fe8322adSStefano Zampini 
977fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs()
978fe8322adSStefano Zampini @*/
979fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
980fe8322adSStefano Zampini {
981fe8322adSStefano Zampini   PetscErrorCode ierr;
982fe8322adSStefano Zampini 
983fe8322adSStefano Zampini   PetscFunctionBegin;
984fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
985fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
986fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
987fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
988fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
989fe8322adSStefano Zampini   if (U && !tj->U) {
990fe8322adSStefano Zampini     DM dm;
991fe8322adSStefano Zampini 
992fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
993fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr);
994fe8322adSStefano Zampini   }
995fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
996fe8322adSStefano Zampini     DM dm;
997fe8322adSStefano Zampini 
998fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
999fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr);
1000fe8322adSStefano Zampini   }
1001fe8322adSStefano Zampini   ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr);
1002fe8322adSStefano Zampini   if (U) {
10038860a134SJunchao Zhang     ierr = VecLockReadPush(tj->U);CHKERRQ(ierr);
1004fe8322adSStefano Zampini     *U   = tj->U;
1005fe8322adSStefano Zampini   }
1006fe8322adSStefano Zampini   if (Udot) {
10078860a134SJunchao Zhang     ierr  = VecLockReadPush(tj->Udot);CHKERRQ(ierr);
1008fe8322adSStefano Zampini     *Udot = tj->Udot;
1009fe8322adSStefano Zampini   }
1010fe8322adSStefano Zampini   PetscFunctionReturn(0);
1011fe8322adSStefano Zampini }
1012fe8322adSStefano Zampini 
1013fe8322adSStefano Zampini /*@
1014fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1015fe8322adSStefano Zampini 
1016fe8322adSStefano Zampini    Collective on TSTrajectory
1017fe8322adSStefano Zampini 
1018fe8322adSStefano Zampini    Input Parameter:
1019fe8322adSStefano Zampini +  tj   - the TS trajectory context
1020fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1021fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1022fe8322adSStefano Zampini 
1023fe8322adSStefano Zampini    Level: developer
1024fe8322adSStefano Zampini 
1025fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs()
1026fe8322adSStefano Zampini @*/
1027fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1028fe8322adSStefano Zampini {
1029fe8322adSStefano Zampini   PetscErrorCode ierr;
1030fe8322adSStefano Zampini 
1031fe8322adSStefano Zampini   PetscFunctionBegin;
1032fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1033fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1034fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
1035fe8322adSStefano Zampini   if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1036fe8322adSStefano Zampini   if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1037fe8322adSStefano Zampini   if (U) {
10388860a134SJunchao Zhang     ierr = VecLockReadPop(tj->U);CHKERRQ(ierr);
1039fe8322adSStefano Zampini     *U   = NULL;
1040fe8322adSStefano Zampini   }
1041fe8322adSStefano Zampini   if (Udot) {
10428860a134SJunchao Zhang     ierr  = VecLockReadPop(tj->Udot);CHKERRQ(ierr);
1043fe8322adSStefano Zampini     *Udot = NULL;
1044fe8322adSStefano Zampini   }
1045fe8322adSStefano Zampini   PetscFunctionReturn(0);
1046fe8322adSStefano Zampini }
1047