xref: /petsc/src/ts/trajectory/interface/traj.c (revision 8860a1345bb13588f3290163e72ce904901dbfb9)
1af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h>
3fe8322adSStefano Zampini #include <petscdm.h>
4bc952696SBarry Smith 
5bc952696SBarry Smith PetscFunctionList TSTrajectoryList              = NULL;
6bc952696SBarry Smith PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
7bc952696SBarry Smith PetscClassId      TSTRAJECTORY_CLASSID;
8fe8322adSStefano Zampini PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs;
9bc952696SBarry Smith 
10bc952696SBarry Smith /*@C
11bc952696SBarry Smith   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
12bc952696SBarry Smith 
13bc952696SBarry Smith   Not Collective
14bc952696SBarry Smith 
15bc952696SBarry Smith   Input Parameters:
163c0fce88SHong Zhang + name        - the name of a new user-defined creation routine
173c0fce88SHong Zhang - create_func - the creation routine itself
18bc952696SBarry Smith 
19bc952696SBarry Smith   Notes:
20bc952696SBarry Smith   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
21bc952696SBarry Smith 
22df5474d8SHong Zhang   Level: developer
23bc952696SBarry Smith 
243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, register
25bc952696SBarry Smith 
263c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll()
27bc952696SBarry Smith @*/
28972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
29bc952696SBarry Smith {
30bc952696SBarry Smith   PetscErrorCode ierr;
31bc952696SBarry Smith 
32bc952696SBarry Smith   PetscFunctionBegin;
33bc952696SBarry Smith   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
34bc952696SBarry Smith   PetscFunctionReturn(0);
35bc952696SBarry Smith }
36bc952696SBarry Smith 
37fe8322adSStefano Zampini /*@
38fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
39fe8322adSStefano Zampini 
40fe8322adSStefano Zampini   Collective on TSTrajectory
41fe8322adSStefano Zampini 
42fe8322adSStefano Zampini   Input Parameters:
43fe8322adSStefano Zampini + tj      - the trajectory object
44fe8322adSStefano Zampini . ts      - the time stepper object (optional)
45fe8322adSStefano Zampini . stepnum - the step number
46fe8322adSStefano Zampini . time    - the current time
47fe8322adSStefano Zampini - X       - the current solution
48fe8322adSStefano Zampini 
49fe8322adSStefano Zampini   Level: developer
50fe8322adSStefano Zampini 
51fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
52fe8322adSStefano Zampini 
53fe8322adSStefano Zampini .keywords: TS, trajectory, create
54fe8322adSStefano Zampini 
55fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs()
56fe8322adSStefano Zampini @*/
57bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
58bc952696SBarry Smith {
59bc952696SBarry Smith   PetscErrorCode ierr;
60bc952696SBarry Smith 
61bc952696SBarry Smith   PetscFunctionBegin;
62bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
63fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
64fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
65fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
66fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,4);
67fe8322adSStefano Zampini   PetscValidHeaderSpecific(X,VEC_CLASSID,5);
68fe8322adSStefano Zampini   if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
69fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
70fe8322adSStefano Zampini   if (tj->monitor) {
71fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
72fe8322adSStefano Zampini   }
73d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
74bc952696SBarry Smith   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
75d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
76fe8322adSStefano Zampini   ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr);
77fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
78bc952696SBarry Smith   PetscFunctionReturn(0);
79bc952696SBarry Smith }
80bc952696SBarry Smith 
81fe8322adSStefano Zampini /*@
82fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
83fe8322adSStefano Zampini 
84fe8322adSStefano Zampini   Not collective.
85fe8322adSStefano Zampini 
86fe8322adSStefano Zampini   Input Parameters:
87fe8322adSStefano Zampini . tj - the trajectory object
88fe8322adSStefano Zampini 
89fe8322adSStefano Zampini   Output Parameter:
90fe8322adSStefano Zampini . steps - the number of steps
91fe8322adSStefano Zampini 
92fe8322adSStefano Zampini   Level: developer
93fe8322adSStefano Zampini 
94fe8322adSStefano Zampini .keywords: TS, trajectory, create
95fe8322adSStefano Zampini 
96fe8322adSStefano Zampini .seealso: TSTrajectorySet()
97fe8322adSStefano Zampini @*/
98fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
99fe8322adSStefano Zampini {
100fe8322adSStefano Zampini   PetscErrorCode ierr;
101fe8322adSStefano Zampini 
102fe8322adSStefano Zampini   PetscFunctionBegin;
103fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
104fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
105fe8322adSStefano Zampini   ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr);
106fe8322adSStefano Zampini   PetscFunctionReturn(0);
107fe8322adSStefano Zampini }
108fe8322adSStefano Zampini 
109fe8322adSStefano Zampini /*@
110fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
111fe8322adSStefano Zampini 
112fe8322adSStefano Zampini   Collective on TS
113fe8322adSStefano Zampini 
114fe8322adSStefano Zampini   Input Parameters:
115fe8322adSStefano Zampini + tj      - the trajectory object
116fe8322adSStefano Zampini . ts      - the time stepper object
117fe8322adSStefano Zampini - stepnum - the step number
118fe8322adSStefano Zampini 
119fe8322adSStefano Zampini   Output Parameter:
120fe8322adSStefano Zampini . time    - the time associated with the step number
121fe8322adSStefano Zampini 
122fe8322adSStefano Zampini   Level: developer
123fe8322adSStefano Zampini 
124fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
125fe8322adSStefano Zampini 
126fe8322adSStefano Zampini .keywords: TS, trajectory, create
127fe8322adSStefano Zampini 
128fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution()
129fe8322adSStefano Zampini @*/
130c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
131bc952696SBarry Smith {
132bc952696SBarry Smith   PetscErrorCode ierr;
133bc952696SBarry Smith 
134bc952696SBarry Smith   PetscFunctionBegin;
135bc952696SBarry Smith   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
136fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
137fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
138fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
139fe8322adSStefano Zampini   PetscValidPointer(time,4);
140fe8322adSStefano Zampini   if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
141fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
14211e1d5c3SBarry Smith   if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
143fe8322adSStefano Zampini   if (tj->monitor) {
144fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
145fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
146fe8322adSStefano Zampini   }
147d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
148bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
149d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
150bc952696SBarry Smith   PetscFunctionReturn(0);
151bc952696SBarry Smith }
152bc952696SBarry Smith 
153fe8322adSStefano Zampini /*@
154fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
155fe8322adSStefano Zampini 
156fe8322adSStefano Zampini   Collective on TS
157fe8322adSStefano Zampini 
158fe8322adSStefano Zampini   Input Parameters:
159fe8322adSStefano Zampini + tj      - the trajectory object
160fe8322adSStefano Zampini . ts      - the time stepper object (optional)
161fe8322adSStefano Zampini - stepnum - the requested step number
162fe8322adSStefano Zampini 
163fe8322adSStefano Zampini   Input/Output Parameters:
164fe8322adSStefano Zampini . time - the time associated with the step number
165fe8322adSStefano Zampini 
166fe8322adSStefano Zampini   Output Parameters:
167fe8322adSStefano Zampini + U       - state vector (can be NULL)
168fe8322adSStefano Zampini - Udot    - time derivative of state vector (can be NULL)
169fe8322adSStefano Zampini 
170fe8322adSStefano Zampini   Level: developer
171fe8322adSStefano Zampini 
172fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
173fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
174fe8322adSStefano Zampini 
175fe8322adSStefano Zampini .keywords: TS, trajectory, create
176fe8322adSStefano Zampini 
177fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet()
178fe8322adSStefano Zampini @*/
179fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
180fe8322adSStefano Zampini {
181fe8322adSStefano Zampini   PetscErrorCode ierr;
182fe8322adSStefano Zampini 
183fe8322adSStefano Zampini   PetscFunctionBegin;
184fe8322adSStefano Zampini   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
185fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
186fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
187fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
188fe8322adSStefano Zampini   PetscValidPointer(time,4);
189fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
190fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
191fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
192fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
193fe8322adSStefano Zampini   ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
194fe8322adSStefano Zampini   if (tj->monitor) {
195fe8322adSStefano Zampini     PetscInt pU,pUdot;
196fe8322adSStefano Zampini     pU    = U ? 1 : 0;
197fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
198fe8322adSStefano Zampini     ierr  = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr);
199fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
200fe8322adSStefano Zampini   }
201fe8322adSStefano Zampini   if (U && tj->lag.caching) {
202fe8322adSStefano Zampini     PetscObjectId    id;
203fe8322adSStefano Zampini     PetscObjectState state;
204fe8322adSStefano Zampini 
205fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr);
206fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr);
207fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
208fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
209fe8322adSStefano Zampini     } else {
210fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
211fe8322adSStefano Zampini     }
212fe8322adSStefano Zampini     if (tj->monitor && !U) {
213fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
214fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr);
215fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
216fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
217fe8322adSStefano Zampini     }
218fe8322adSStefano Zampini   }
219fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
220fe8322adSStefano Zampini     PetscObjectId    id;
221fe8322adSStefano Zampini     PetscObjectState state;
222fe8322adSStefano Zampini 
223fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr);
224fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr);
225fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
226fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
227fe8322adSStefano Zampini     } else {
228fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
229fe8322adSStefano Zampini     }
230fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
231fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
232fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr);
233fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
234fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
235fe8322adSStefano Zampini     }
236fe8322adSStefano Zampini   }
237fe8322adSStefano Zampini   if (!U && !Udot) {
238fe8322adSStefano Zampini     ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
239fe8322adSStefano Zampini     PetscFunctionReturn(0);
240fe8322adSStefano Zampini   }
241fe8322adSStefano Zampini 
242fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
243fe8322adSStefano Zampini     if (tj->monitor) {
244fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
245fe8322adSStefano Zampini     }
246fe8322adSStefano Zampini     /* cached states will be updated in the function */
247fe8322adSStefano Zampini     ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr);
248fe8322adSStefano Zampini     if (tj->monitor) {
249fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
250fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
251fe8322adSStefano Zampini     }
252fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
253fe8322adSStefano Zampini     TS  fakets = ts;
254fe8322adSStefano Zampini     Vec U2;
255fe8322adSStefano Zampini 
256fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
257fe8322adSStefano Zampini     if (!ts) {
258fe8322adSStefano Zampini       ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr);
259fe8322adSStefano Zampini       if (!fakets) {
260fe8322adSStefano Zampini         ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr);
261fe8322adSStefano Zampini         ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr);
262fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr);
263fe8322adSStefano Zampini         ierr = VecDuplicate(U,&U2);CHKERRQ(ierr);
264fe8322adSStefano Zampini         ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr);
265fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr);
266fe8322adSStefano Zampini       }
267fe8322adSStefano Zampini     }
268fe8322adSStefano Zampini     ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr);
269fe8322adSStefano Zampini     ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr);
270fe8322adSStefano Zampini     ierr = VecCopy(U2,U);CHKERRQ(ierr);
271fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr);
272fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr);
273fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
274fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
275fe8322adSStefano Zampini   }
276fe8322adSStefano Zampini   ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
277fe8322adSStefano Zampini   PetscFunctionReturn(0);
278fe8322adSStefano Zampini }
279fe8322adSStefano Zampini 
280bc952696SBarry Smith /*@C
281bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
282bc952696SBarry Smith 
283bc952696SBarry Smith     Collective on TSTrajectory
284bc952696SBarry Smith 
285bc952696SBarry Smith     Input Parameters:
286b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
287bc952696SBarry Smith -   viewer - visualization context
288bc952696SBarry Smith 
289bc952696SBarry Smith     Options Database Key:
290e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
291bc952696SBarry Smith 
292bc952696SBarry Smith     Notes:
293bc952696SBarry Smith     The available visualization contexts include
294bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
295bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
296bc952696SBarry Smith          output where only the first processor opens
297bc952696SBarry Smith          the file.  All other processors send their
298bc952696SBarry Smith          data to the first processor to print.
299bc952696SBarry Smith 
300bc952696SBarry Smith     The user can open an alternative visualization context with
301bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
302bc952696SBarry Smith 
303df5474d8SHong Zhang     Level: developer
304bc952696SBarry Smith 
3053c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view
306bc952696SBarry Smith 
307bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
308bc952696SBarry Smith @*/
309b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
310bc952696SBarry Smith {
311bc952696SBarry Smith   PetscErrorCode ierr;
312bc952696SBarry Smith   PetscBool      iascii;
313bc952696SBarry Smith 
314bc952696SBarry Smith   PetscFunctionBegin;
3151a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
316bc952696SBarry Smith   if (!viewer) {
317b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
318bc952696SBarry Smith   }
319bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
320b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
321bc952696SBarry Smith 
322bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
323bc952696SBarry Smith   if (iascii) {
324b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
3251a5a771fSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
32653b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
32753b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
328b1d74d50SHong Zhang     if (tj->ops->view) {
329285336bfSHong Zhang       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
330b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
331285336bfSHong Zhang       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
332bc952696SBarry Smith     }
333bc952696SBarry Smith   }
334bc952696SBarry Smith   PetscFunctionReturn(0);
335bc952696SBarry Smith }
336bc952696SBarry Smith 
337bc952696SBarry Smith /*@C
33878fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
33978fbdcc8SBarry Smith 
34078fbdcc8SBarry Smith    Collective on TSTrajectory
34178fbdcc8SBarry Smith 
34278fbdcc8SBarry Smith    Input Parameters:
34378fbdcc8SBarry Smith +  tr - the trajectory context
34478fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
34578fbdcc8SBarry Smith 
34678fbdcc8SBarry Smith    Level: intermediate
34778fbdcc8SBarry Smith 
348db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
349db901c5bSHong Zhang 
35078fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view
35178fbdcc8SBarry Smith 
35278fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
35378fbdcc8SBarry Smith @*/
35478fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
35578fbdcc8SBarry Smith {
35678fbdcc8SBarry Smith   PetscErrorCode    ierr;
35778fbdcc8SBarry Smith 
35878fbdcc8SBarry Smith   PetscFunctionBegin;
359fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
360fe8322adSStefano Zampini   PetscValidPointer(names,2);
36178fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
36278fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
36378fbdcc8SBarry Smith   PetscFunctionReturn(0);
36478fbdcc8SBarry Smith }
36578fbdcc8SBarry Smith 
36678fbdcc8SBarry Smith /*@C
367fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
36808347785SBarry Smith 
36908347785SBarry Smith    Collective on TSLGCtx
37008347785SBarry Smith 
37108347785SBarry Smith    Input Parameters:
37208347785SBarry Smith +  tj - the TSTrajectory context
37308347785SBarry Smith .  transform - the transform function
37408347785SBarry Smith .  destroy - function to destroy the optional context
37508347785SBarry Smith -  ctx - optional context used by transform function
37608347785SBarry Smith 
37708347785SBarry Smith    Level: intermediate
37808347785SBarry Smith 
37908347785SBarry Smith .keywords: TSTrajectory,  vector, monitor, view
38008347785SBarry Smith 
38108347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
38208347785SBarry Smith @*/
38308347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
38408347785SBarry Smith {
38508347785SBarry Smith   PetscFunctionBegin;
386fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
38708347785SBarry Smith   tj->transform        = transform;
38808347785SBarry Smith   tj->transformdestroy = destroy;
38908347785SBarry Smith   tj->transformctx     = tctx;
39008347785SBarry Smith   PetscFunctionReturn(0);
39108347785SBarry Smith }
39208347785SBarry Smith 
393db901c5bSHong Zhang /*@
394bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
395bc952696SBarry Smith 
396bc952696SBarry Smith   Collective on MPI_Comm
397bc952696SBarry Smith 
398bc952696SBarry Smith   Input Parameter:
3993c0fce88SHong Zhang . comm - the communicator
400bc952696SBarry Smith 
401bc952696SBarry Smith   Output Parameter:
4023c0fce88SHong Zhang . tj   - the trajectory object
403bc952696SBarry Smith 
404df5474d8SHong Zhang   Level: developer
405bc952696SBarry Smith 
40695452b02SPatrick Sanan   Notes:
40795452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
408bc952696SBarry Smith 
4093c0fce88SHong Zhang .keywords: TS, trajectory, create
4103c0fce88SHong Zhang 
41164fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
412bc952696SBarry Smith @*/
413b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
414bc952696SBarry Smith {
415bc952696SBarry Smith   TSTrajectory   t;
416bc952696SBarry Smith   PetscErrorCode ierr;
417bc952696SBarry Smith 
418bc952696SBarry Smith   PetscFunctionBegin;
419b1d74d50SHong Zhang   PetscValidPointer(tj,2);
420b1d74d50SHong Zhang   *tj = NULL;
421bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
422bc952696SBarry Smith 
42373107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
42468bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
425fe8322adSStefano Zampini   ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr);
426fe8322adSStefano Zampini 
427fe8322adSStefano Zampini   t->lag.order            = 1;
428fe8322adSStefano Zampini   t->lag.L                = NULL;
429fe8322adSStefano Zampini   t->lag.T                = NULL;
430fe8322adSStefano Zampini   t->lag.W                = NULL;
431fe8322adSStefano Zampini   t->lag.WW               = NULL;
432fe8322adSStefano Zampini   t->lag.TW               = NULL;
433fe8322adSStefano Zampini   t->lag.TT               = NULL;
434fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
435fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
436fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
437fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
438fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
439fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
440fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
441fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
442fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
443fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
444fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
445fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
446b1d74d50SHong Zhang   *tj  = t;
44784a45834SBarry Smith   ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr);
448e94726ebSBarry Smith   ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr);
449bc952696SBarry Smith   PetscFunctionReturn(0);
450bc952696SBarry Smith }
451bc952696SBarry Smith 
452bc952696SBarry Smith /*@C
453bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
454bc952696SBarry Smith 
455bc952696SBarry Smith   Collective on TS
456bc952696SBarry Smith 
457bc952696SBarry Smith   Input Parameters:
4583c0fce88SHong Zhang + tj   - the TSTrajectory context
4593c0fce88SHong Zhang . ts   - the TS context
4603c0fce88SHong Zhang - type - a known method
461bc952696SBarry Smith 
462bc952696SBarry Smith   Options Database Command:
463e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
464bc952696SBarry Smith 
465df5474d8SHong Zhang    Level: developer
466bc952696SBarry Smith 
4673c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
468bc952696SBarry Smith 
4693c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
470bc952696SBarry Smith 
471bc952696SBarry Smith @*/
472fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
473bc952696SBarry Smith {
474972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
475bc952696SBarry Smith   PetscBool      match;
476bc952696SBarry Smith   PetscErrorCode ierr;
477bc952696SBarry Smith 
478bc952696SBarry Smith   PetscFunctionBegin;
479972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
480972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
481bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
482bc952696SBarry Smith 
483bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
484bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
485972caf09SHong Zhang   if (tj->ops->destroy) {
486972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
487bc952696SBarry Smith 
488972caf09SHong Zhang     tj->ops->destroy = NULL;
489bc952696SBarry Smith   }
490972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
491bc952696SBarry Smith 
492972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
493972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
494bc952696SBarry Smith   PetscFunctionReturn(0);
495bc952696SBarry Smith }
496bc952696SBarry Smith 
497972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
498972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
4999a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5002b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
501bc952696SBarry Smith 
502bc952696SBarry Smith /*@C
503bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
504bc952696SBarry Smith 
505bc952696SBarry Smith   Not Collective
506bc952696SBarry Smith 
507df5474d8SHong Zhang   Level: developer
508bc952696SBarry Smith 
5093c0fce88SHong Zhang .keywords: TS, trajectory, register, all
5103c0fce88SHong Zhang 
5113c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
512bc952696SBarry Smith @*/
513bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
514bc952696SBarry Smith {
515bc952696SBarry Smith   PetscErrorCode ierr;
516bc952696SBarry Smith 
517bc952696SBarry Smith   PetscFunctionBegin;
518560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
519bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
520bc952696SBarry Smith 
521bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
5221c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
5239a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
5242b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
525bc952696SBarry Smith   PetscFunctionReturn(0);
526bc952696SBarry Smith }
527bc952696SBarry Smith 
528bc952696SBarry Smith /*@
5291550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5301550c9b9SHong Zhang 
5311550c9b9SHong Zhang    Collective on TSTrajectory
5321550c9b9SHong Zhang 
5331550c9b9SHong Zhang    Input Parameter:
5341550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5351550c9b9SHong Zhang 
5361550c9b9SHong Zhang    Level: developer
5371550c9b9SHong Zhang 
5381550c9b9SHong Zhang .keywords: TS, trajectory, timestep, reset
5391550c9b9SHong Zhang 
5401550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
5411550c9b9SHong Zhang @*/
5429a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5431550c9b9SHong Zhang {
5441550c9b9SHong Zhang   PetscErrorCode ierr;
5451550c9b9SHong Zhang 
5461550c9b9SHong Zhang   PetscFunctionBegin;
5479a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5489a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5499a992471SHong Zhang   if (tj->ops->reset) {
5509a992471SHong Zhang     ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr);
5519a992471SHong Zhang   }
5529a992471SHong Zhang   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
553fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr);
554fe8322adSStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr);
555fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5561550c9b9SHong Zhang   PetscFunctionReturn(0);
5571550c9b9SHong Zhang }
5581550c9b9SHong Zhang 
5591550c9b9SHong Zhang /*@
560bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
561bc952696SBarry Smith 
562bc952696SBarry Smith    Collective on TSTrajectory
563bc952696SBarry Smith 
564bc952696SBarry Smith    Input Parameter:
5653c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
566bc952696SBarry Smith 
567df5474d8SHong Zhang    Level: developer
568bc952696SBarry Smith 
5693c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
570bc952696SBarry Smith 
5713c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
572bc952696SBarry Smith @*/
573972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
574bc952696SBarry Smith {
575bc952696SBarry Smith   PetscErrorCode ierr;
576bc952696SBarry Smith 
577bc952696SBarry Smith   PetscFunctionBegin;
578972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
579972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
580972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
581bc952696SBarry Smith 
582fe8322adSStefano Zampini   ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr);
583fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr);
584fe8322adSStefano Zampini   ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr);
585fe8322adSStefano Zampini   ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr);
586fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr);
587fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr);
5889a992471SHong Zhang 
5897f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
590972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
591fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
592fe8322adSStefano Zampini     PetscMPIInt rank;
593fe8322adSStefano Zampini     MPI_Comm    comm;
594fe8322adSStefano Zampini 
595fe8322adSStefano Zampini     ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr);
596fe8322adSStefano Zampini     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
597fe8322adSStefano Zampini     if (!rank) { /* we own the directory, so we run PetscRMTree on it */
598fe8322adSStefano Zampini       ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr);
599fe8322adSStefano Zampini     }
600fe8322adSStefano Zampini   }
60178fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
60264e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
60364e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
604972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
605bc952696SBarry Smith   PetscFunctionReturn(0);
606bc952696SBarry Smith }
607bc952696SBarry Smith 
608bc952696SBarry Smith /*
609772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
610bc952696SBarry Smith 
611bc952696SBarry Smith   Collective on TSTrajectory
612bc952696SBarry Smith 
613bc952696SBarry Smith   Input Parameter:
6143c0fce88SHong Zhang + tj - the TSTrajectory context
6153c0fce88SHong Zhang - ts - the TS context
6163c0fce88SHong Zhang 
6173c0fce88SHong Zhang   Options Database Keys:
6183c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
619bc952696SBarry Smith 
620df5474d8SHong Zhang   Level: developer
621bc952696SBarry Smith 
6223c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
6233c0fce88SHong Zhang 
6243c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
625bc952696SBarry Smith */
6262bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
627bc952696SBarry Smith {
628bc952696SBarry Smith   PetscBool      opt;
629bc952696SBarry Smith   const char     *defaultType;
630bc952696SBarry Smith   char           typeName[256];
631bc952696SBarry Smith   PetscErrorCode ierr;
632bc952696SBarry Smith 
633bc952696SBarry Smith   PetscFunctionBegin;
634b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
635bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
636bc952696SBarry Smith 
637560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
638e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
639bc952696SBarry Smith   if (opt) {
640972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
641bc952696SBarry Smith   } else {
642972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
643bc952696SBarry Smith   }
644bc952696SBarry Smith   PetscFunctionReturn(0);
645bc952696SBarry Smith }
646bc952696SBarry Smith 
647ed695a29SHong Zhang /*@
648ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
649ed695a29SHong Zhang 
650ed695a29SHong Zhang    Collective on TSTrajectory
651ed695a29SHong Zhang 
652ed695a29SHong Zhang    Input Arguments:
653ed695a29SHong Zhang +  tj - the TSTrajectory context
654ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
655ed695a29SHong Zhang 
6563c0fce88SHong Zhang    Options Database Keys:
657063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6583c0fce88SHong Zhang 
659df5474d8SHong Zhang    Level: developer
660ed695a29SHong Zhang 
6613c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
6623c0fce88SHong Zhang 
6633c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
664ed695a29SHong Zhang @*/
6652bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
666ed695a29SHong Zhang {
667ed695a29SHong Zhang   PetscFunctionBegin;
668ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
669ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
670fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
671fe8322adSStefano Zampini   else tj->monitor = NULL;
672ed695a29SHong Zhang   PetscFunctionReturn(0);
673ed695a29SHong Zhang }
674ed695a29SHong Zhang 
675bc952696SBarry Smith /*@
67664fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
67764fc91eeSBarry Smith 
67864fc91eeSBarry Smith    Collective on TSTrajectory
67964fc91eeSBarry Smith 
68064fc91eeSBarry Smith    Input Arguments:
68164fc91eeSBarry Smith +  tj - the TSTrajectory context
68264fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
68364fc91eeSBarry Smith 
68464fc91eeSBarry Smith    Options Database Keys:
68564fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
68664fc91eeSBarry Smith 
68795452b02SPatrick Sanan    Notes:
68895452b02SPatrick 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.
68964fc91eeSBarry Smith 
69064fc91eeSBarry Smith    Level: advanced
69164fc91eeSBarry Smith 
69264fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor
69364fc91eeSBarry Smith 
69464fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
69564fc91eeSBarry Smith @*/
69664fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
69764fc91eeSBarry Smith {
69864fc91eeSBarry Smith   PetscFunctionBegin;
69964fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
70064fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
70164fc91eeSBarry Smith   tj->keepfiles = flg;
70264fc91eeSBarry Smith   PetscFunctionReturn(0);
70364fc91eeSBarry Smith }
70464fc91eeSBarry Smith 
705db901c5bSHong Zhang /*@C
70664e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
70764e38db7SHong Zhang 
70864e38db7SHong Zhang    Collective on TSTrajectory
70964e38db7SHong Zhang 
71064e38db7SHong Zhang    Input Arguments:
71164e38db7SHong Zhang +  tj      - the TSTrajectory context
71264e38db7SHong Zhang -  dirname - the directory name
71364e38db7SHong Zhang 
71464e38db7SHong Zhang    Options Database Keys:
71564e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
71664e38db7SHong Zhang 
71795452b02SPatrick Sanan    Notes:
71895452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7191585b412SBarry Smith 
72064e38db7SHong Zhang    Level: developer
72164e38db7SHong Zhang 
72264e38db7SHong Zhang .keywords: TS, trajectory, set
72364e38db7SHong Zhang 
72464e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
72564e38db7SHong Zhang @*/
72664e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
72764e38db7SHong Zhang {
72864e38db7SHong Zhang   PetscErrorCode ierr;
729a17281aeSStefano Zampini   PetscBool      flg;
730a17281aeSStefano Zampini 
73164e38db7SHong Zhang   PetscFunctionBegin;
73264e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
733a17281aeSStefano Zampini   ierr = PetscStrcmp(tj->dirname,dirname,&flg);CHKERRQ(ierr);
734a17281aeSStefano Zampini   if (!flg && tj->dirfiletemplate) {
735a17281aeSStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
736a17281aeSStefano Zampini   }
73784a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
73864e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
73964e38db7SHong Zhang   PetscFunctionReturn(0);
74064e38db7SHong Zhang }
74164e38db7SHong Zhang 
742db901c5bSHong Zhang /*@C
74364e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
74464e38db7SHong Zhang 
74564e38db7SHong Zhang    Collective on TSTrajectory
74664e38db7SHong Zhang 
74764e38db7SHong Zhang    Input Arguments:
74864e38db7SHong Zhang +  tj      - the TSTrajectory context
7491585b412SBarry Smith -  filetemplate - the template
75064e38db7SHong Zhang 
75164e38db7SHong Zhang    Options Database Keys:
7521585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7531585b412SBarry Smith 
75495452b02SPatrick Sanan    Notes:
75595452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
7561585b412SBarry Smith 
7571585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
7581585b412SBarry Smith    timestep counter
75964e38db7SHong Zhang 
76064e38db7SHong Zhang    Level: developer
76164e38db7SHong Zhang 
76264e38db7SHong Zhang .keywords: TS, trajectory, set
76364e38db7SHong Zhang 
7641585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
76564e38db7SHong Zhang @*/
76664e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
76764e38db7SHong Zhang {
76864e38db7SHong Zhang   PetscErrorCode ierr;
7699afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7709afe7f3eSBarry Smith 
77164e38db7SHong Zhang   PetscFunctionBegin;
77264e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7739afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
7749afe7f3eSBarry Smith 
7759afe7f3eSBarry 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");
7769afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7779afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
7789afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
7799afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
7809afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
7819afe7f3eSBarry 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");
7829afe7f3eSBarry Smith     if (ptr2) break;
7839afe7f3eSBarry Smith   }
78484a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
78564e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
78664e38db7SHong Zhang   PetscFunctionReturn(0);
78764e38db7SHong Zhang }
78864e38db7SHong Zhang 
78964e38db7SHong Zhang /*@
790bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
791bc952696SBarry Smith 
792bc952696SBarry Smith    Collective on TSTrajectory
793bc952696SBarry Smith 
794bc952696SBarry Smith    Input Parameter:
7953c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
7963c0fce88SHong Zhang -  ts - the TS context
797bc952696SBarry Smith 
798bc952696SBarry Smith    Options Database Keys:
7993c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
80064fc91eeSBarry 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
801063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
802bc952696SBarry Smith 
803df5474d8SHong Zhang    Level: developer
804bc952696SBarry Smith 
80595452b02SPatrick Sanan    Notes:
80695452b02SPatrick Sanan     This is not normally called directly by users
807bc952696SBarry Smith 
8083c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
809bc952696SBarry Smith 
8103c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
811bc952696SBarry Smith @*/
812972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
813bc952696SBarry Smith {
814ed695a29SHong Zhang   PetscBool      set,flg;
81564e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
81664e38db7SHong Zhang   PetscErrorCode ierr;
817bc952696SBarry Smith 
818bc952696SBarry Smith   PetscFunctionBegin;
819b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
820fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
821b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
822972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
823ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
824aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
825fe8322adSStefano Zampini   ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr);
826fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr);
827fe8322adSStefano 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);
828fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr);
82964fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
83064fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
83164e38db7SHong Zhang 
83264e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
83384a45834SBarry Smith   if (set) {
83464e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
83584a45834SBarry Smith   }
83664e38db7SHong Zhang 
8371585b412SBarry 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);
83864e38db7SHong Zhang   if (set) {
8391585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
84084a45834SBarry Smith   }
84164e38db7SHong Zhang 
84264e38db7SHong Zhang   /* Handle specific TSTrajectory options */
84362b521acSHong Zhang   if (tj->ops->setfromoptions) {
84462b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
84562b521acSHong Zhang   }
846bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
847bc952696SBarry Smith   PetscFunctionReturn(0);
848bc952696SBarry Smith }
84968bece0bSHong Zhang 
85068bece0bSHong Zhang /*@
85168bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
85268bece0bSHong Zhang    of a TS trajectory.
85368bece0bSHong Zhang 
85468bece0bSHong Zhang    Collective on TS
85568bece0bSHong Zhang 
85668bece0bSHong Zhang    Input Parameter:
8573c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8583c0fce88SHong Zhang -  tj - the TS trajectory context
85968bece0bSHong Zhang 
860df5474d8SHong Zhang    Level: developer
86168bece0bSHong Zhang 
8623c0fce88SHong Zhang .keywords: TS, trajectory, setup
86368bece0bSHong Zhang 
86468bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
86568bece0bSHong Zhang @*/
86668bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
86768bece0bSHong Zhang {
86868bece0bSHong Zhang   PetscErrorCode ierr;
8699afe7f3eSBarry Smith   size_t         s1,s2;
87068bece0bSHong Zhang 
87168bece0bSHong Zhang   PetscFunctionBegin;
87268bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
87368bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
874fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
87568bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
87668bece0bSHong Zhang 
87768bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
87868bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
87968bece0bSHong Zhang   }
88068bece0bSHong Zhang   if (tj->ops->setup) {
88168bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
88268bece0bSHong Zhang   }
88368bece0bSHong Zhang 
88468bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
88553b27ddbSHong Zhang 
88653b27ddbSHong Zhang   /* Set the counters to zero */
8871a5a771fSHong Zhang   tj->recomps    = 0;
88853b27ddbSHong Zhang   tj->diskreads  = 0;
88953b27ddbSHong Zhang   tj->diskwrites = 0;
8909afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
8919afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
892fe8322adSStefano Zampini   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
89311e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
89411e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
89568bece0bSHong Zhang   PetscFunctionReturn(0);
89668bece0bSHong Zhang }
897fe8322adSStefano Zampini 
898fe8322adSStefano Zampini /*@
899fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
900fe8322adSStefano Zampini 
901fe8322adSStefano Zampini    Collective on TSTrajectory
902fe8322adSStefano Zampini 
903fe8322adSStefano Zampini    Input Parameter:
904fe8322adSStefano Zampini +  tj  - the TS trajectory context
905fe8322adSStefano Zampini -  flg - the boolean flag
906fe8322adSStefano Zampini 
907fe8322adSStefano Zampini    Level: developer
908fe8322adSStefano Zampini 
909fe8322adSStefano Zampini .keywords: trajectory
910fe8322adSStefano Zampini 
911fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly()
912fe8322adSStefano Zampini @*/
913fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
914fe8322adSStefano Zampini {
915fe8322adSStefano Zampini   PetscFunctionBegin;
916fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
917fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
918fe8322adSStefano Zampini   tj->solution_only = solution_only;
919fe8322adSStefano Zampini   PetscFunctionReturn(0);
920fe8322adSStefano Zampini }
921fe8322adSStefano Zampini 
922fe8322adSStefano Zampini /*@
923fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
924fe8322adSStefano Zampini 
925fe8322adSStefano Zampini    Logically collective on TSTrajectory
926fe8322adSStefano Zampini 
927fe8322adSStefano Zampini    Input Parameter:
928fe8322adSStefano Zampini .  tj  - the TS trajectory context
929fe8322adSStefano Zampini 
930fe8322adSStefano Zampini    Output Parameter:
931fe8322adSStefano Zampini -  flg - the boolean flag
932fe8322adSStefano Zampini 
933fe8322adSStefano Zampini    Level: developer
934fe8322adSStefano Zampini 
935fe8322adSStefano Zampini .keywords: trajectory
936fe8322adSStefano Zampini 
937fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly()
938fe8322adSStefano Zampini @*/
939fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
940fe8322adSStefano Zampini {
941fe8322adSStefano Zampini   PetscFunctionBegin;
942fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
943fe8322adSStefano Zampini   PetscValidPointer(solution_only,2);
944fe8322adSStefano Zampini   *solution_only = tj->solution_only;
945fe8322adSStefano Zampini   PetscFunctionReturn(0);
946fe8322adSStefano Zampini }
947fe8322adSStefano Zampini 
948fe8322adSStefano Zampini /*@
949fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
950fe8322adSStefano Zampini 
951fe8322adSStefano Zampini    Collective on TSTrajectory
952fe8322adSStefano Zampini 
953fe8322adSStefano Zampini    Input Parameter:
954fe8322adSStefano Zampini +  tj   - the TS trajectory context
955fe8322adSStefano Zampini .  ts   - the TS solver context
956fe8322adSStefano Zampini -  time - the requested time
957fe8322adSStefano Zampini 
958fe8322adSStefano Zampini    Output Parameter:
959fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
960fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
961fe8322adSStefano Zampini 
962fe8322adSStefano Zampini    Level: developer
963fe8322adSStefano Zampini 
964fe8322adSStefano 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.
965fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
966fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
967fe8322adSStefano Zampini 
968fe8322adSStefano Zampini .keywords: trajectory
969fe8322adSStefano Zampini 
970fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs()
971fe8322adSStefano Zampini @*/
972fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
973fe8322adSStefano Zampini {
974fe8322adSStefano Zampini   PetscErrorCode ierr;
975fe8322adSStefano Zampini 
976fe8322adSStefano Zampini   PetscFunctionBegin;
977fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
978fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
979fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
980fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
981fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
982fe8322adSStefano Zampini   if (U && !tj->U) {
983fe8322adSStefano Zampini     DM dm;
984fe8322adSStefano Zampini 
985fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
986fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr);
987fe8322adSStefano Zampini   }
988fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
989fe8322adSStefano Zampini     DM dm;
990fe8322adSStefano Zampini 
991fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
992fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr);
993fe8322adSStefano Zampini   }
994fe8322adSStefano Zampini   ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr);
995fe8322adSStefano Zampini   if (U) {
996*8860a134SJunchao Zhang     ierr = VecLockReadPush(tj->U);CHKERRQ(ierr);
997fe8322adSStefano Zampini     *U   = tj->U;
998fe8322adSStefano Zampini   }
999fe8322adSStefano Zampini   if (Udot) {
1000*8860a134SJunchao Zhang     ierr  = VecLockReadPush(tj->Udot);CHKERRQ(ierr);
1001fe8322adSStefano Zampini     *Udot = tj->Udot;
1002fe8322adSStefano Zampini   }
1003fe8322adSStefano Zampini   PetscFunctionReturn(0);
1004fe8322adSStefano Zampini }
1005fe8322adSStefano Zampini 
1006fe8322adSStefano Zampini /*@
1007fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1008fe8322adSStefano Zampini 
1009fe8322adSStefano Zampini    Collective on TSTrajectory
1010fe8322adSStefano Zampini 
1011fe8322adSStefano Zampini    Input Parameter:
1012fe8322adSStefano Zampini +  tj   - the TS trajectory context
1013fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1014fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1015fe8322adSStefano Zampini 
1016fe8322adSStefano Zampini    Level: developer
1017fe8322adSStefano Zampini 
1018fe8322adSStefano Zampini .keywords: trajectory
1019fe8322adSStefano Zampini 
1020fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs()
1021fe8322adSStefano Zampini @*/
1022fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1023fe8322adSStefano Zampini {
1024fe8322adSStefano Zampini   PetscErrorCode ierr;
1025fe8322adSStefano Zampini 
1026fe8322adSStefano Zampini   PetscFunctionBegin;
1027fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1028fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1029fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
1030fe8322adSStefano Zampini   if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1031fe8322adSStefano Zampini   if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1032fe8322adSStefano Zampini   if (U) {
1033*8860a134SJunchao Zhang     ierr = VecLockReadPop(tj->U);CHKERRQ(ierr);
1034fe8322adSStefano Zampini     *U   = NULL;
1035fe8322adSStefano Zampini   }
1036fe8322adSStefano Zampini   if (Udot) {
1037*8860a134SJunchao Zhang     ierr  = VecLockReadPop(tj->Udot);CHKERRQ(ierr);
1038fe8322adSStefano Zampini     *Udot = NULL;
1039fe8322adSStefano Zampini   }
1040fe8322adSStefano Zampini   PetscFunctionReturn(0);
1041fe8322adSStefano Zampini }
1042