xref: /petsc/src/ts/trajectory/interface/traj.c (revision fe8322adceea202af5179e23400eaf47190af617)
1af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
2*fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h>
3*fe8322adSStefano Zampini #include <petscdm.h>
4bc952696SBarry Smith 
5bc952696SBarry Smith PetscFunctionList TSTrajectoryList              = NULL;
6bc952696SBarry Smith PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
7bc952696SBarry Smith PetscClassId      TSTRAJECTORY_CLASSID;
8*fe8322adSStefano 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 
37*fe8322adSStefano Zampini /*@
38*fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
39*fe8322adSStefano Zampini 
40*fe8322adSStefano Zampini   Collective on TSTrajectory
41*fe8322adSStefano Zampini 
42*fe8322adSStefano Zampini   Input Parameters:
43*fe8322adSStefano Zampini + tj      - the trajectory object
44*fe8322adSStefano Zampini . ts      - the time stepper object (optional)
45*fe8322adSStefano Zampini . stepnum - the step number
46*fe8322adSStefano Zampini . time    - the current time
47*fe8322adSStefano Zampini - X       - the current solution
48*fe8322adSStefano Zampini 
49*fe8322adSStefano Zampini   Level: developer
50*fe8322adSStefano Zampini 
51*fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
52*fe8322adSStefano Zampini 
53*fe8322adSStefano Zampini .keywords: TS, trajectory, create
54*fe8322adSStefano Zampini 
55*fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs()
56*fe8322adSStefano 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);
63*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
64*fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
65*fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
66*fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,4);
67*fe8322adSStefano Zampini   PetscValidHeaderSpecific(X,VEC_CLASSID,5);
68*fe8322adSStefano Zampini   if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
69*fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
70*fe8322adSStefano Zampini   if (tj->monitor) {
71*fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
72*fe8322adSStefano 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);
76*fe8322adSStefano Zampini   ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr);
77*fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
78bc952696SBarry Smith   PetscFunctionReturn(0);
79bc952696SBarry Smith }
80bc952696SBarry Smith 
81*fe8322adSStefano Zampini /*@
82*fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
83*fe8322adSStefano Zampini 
84*fe8322adSStefano Zampini   Not collective.
85*fe8322adSStefano Zampini 
86*fe8322adSStefano Zampini   Input Parameters:
87*fe8322adSStefano Zampini . tj - the trajectory object
88*fe8322adSStefano Zampini 
89*fe8322adSStefano Zampini   Output Parameter:
90*fe8322adSStefano Zampini . steps - the number of steps
91*fe8322adSStefano Zampini 
92*fe8322adSStefano Zampini   Level: developer
93*fe8322adSStefano Zampini 
94*fe8322adSStefano Zampini .keywords: TS, trajectory, create
95*fe8322adSStefano Zampini 
96*fe8322adSStefano Zampini .seealso: TSTrajectorySet()
97*fe8322adSStefano Zampini @*/
98*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
99*fe8322adSStefano Zampini {
100*fe8322adSStefano Zampini   PetscErrorCode ierr;
101*fe8322adSStefano Zampini 
102*fe8322adSStefano Zampini   PetscFunctionBegin;
103*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
104*fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
105*fe8322adSStefano Zampini   ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr);
106*fe8322adSStefano Zampini   PetscFunctionReturn(0);
107*fe8322adSStefano Zampini }
108*fe8322adSStefano Zampini 
109*fe8322adSStefano Zampini /*@
110*fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
111*fe8322adSStefano Zampini 
112*fe8322adSStefano Zampini   Collective on TS
113*fe8322adSStefano Zampini 
114*fe8322adSStefano Zampini   Input Parameters:
115*fe8322adSStefano Zampini + tj      - the trajectory object
116*fe8322adSStefano Zampini . ts      - the time stepper object
117*fe8322adSStefano Zampini - stepnum - the step number
118*fe8322adSStefano Zampini 
119*fe8322adSStefano Zampini   Output Parameter:
120*fe8322adSStefano Zampini . time    - the time associated with the step number
121*fe8322adSStefano Zampini 
122*fe8322adSStefano Zampini   Level: developer
123*fe8322adSStefano Zampini 
124*fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
125*fe8322adSStefano Zampini 
126*fe8322adSStefano Zampini .keywords: TS, trajectory, create
127*fe8322adSStefano Zampini 
128*fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution()
129*fe8322adSStefano 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");
136*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
137*fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
138*fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
139*fe8322adSStefano Zampini   PetscValidPointer(time,4);
140*fe8322adSStefano Zampini   if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
141*fe8322adSStefano 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");
143*fe8322adSStefano Zampini   if (tj->monitor) {
144*fe8322adSStefano Zampini     ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr);
145*fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
146*fe8322adSStefano 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 
153*fe8322adSStefano Zampini /*@
154*fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
155*fe8322adSStefano Zampini 
156*fe8322adSStefano Zampini   Collective on TS
157*fe8322adSStefano Zampini 
158*fe8322adSStefano Zampini   Input Parameters:
159*fe8322adSStefano Zampini + tj      - the trajectory object
160*fe8322adSStefano Zampini . ts      - the time stepper object (optional)
161*fe8322adSStefano Zampini - stepnum - the requested step number
162*fe8322adSStefano Zampini 
163*fe8322adSStefano Zampini   Input/Output Parameters:
164*fe8322adSStefano Zampini . time - the time associated with the step number
165*fe8322adSStefano Zampini 
166*fe8322adSStefano Zampini   Output Parameters:
167*fe8322adSStefano Zampini + U       - state vector (can be NULL)
168*fe8322adSStefano Zampini - Udot    - time derivative of state vector (can be NULL)
169*fe8322adSStefano Zampini 
170*fe8322adSStefano Zampini   Level: developer
171*fe8322adSStefano Zampini 
172*fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
173*fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
174*fe8322adSStefano Zampini 
175*fe8322adSStefano Zampini .keywords: TS, trajectory, create
176*fe8322adSStefano Zampini 
177*fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet()
178*fe8322adSStefano Zampini @*/
179*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
180*fe8322adSStefano Zampini {
181*fe8322adSStefano Zampini   PetscErrorCode ierr;
182*fe8322adSStefano Zampini 
183*fe8322adSStefano Zampini   PetscFunctionBegin;
184*fe8322adSStefano Zampini   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
185*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
186*fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
187*fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
188*fe8322adSStefano Zampini   PetscValidPointer(time,4);
189*fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
190*fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
191*fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
192*fe8322adSStefano Zampini   if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
193*fe8322adSStefano Zampini   ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
194*fe8322adSStefano Zampini   if (tj->monitor) {
195*fe8322adSStefano Zampini     PetscInt pU,pUdot;
196*fe8322adSStefano Zampini     pU    = U ? 1 : 0;
197*fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
198*fe8322adSStefano Zampini     ierr  = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr);
199*fe8322adSStefano Zampini     ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
200*fe8322adSStefano Zampini   }
201*fe8322adSStefano Zampini   if (U && tj->lag.caching) {
202*fe8322adSStefano Zampini     PetscObjectId    id;
203*fe8322adSStefano Zampini     PetscObjectState state;
204*fe8322adSStefano Zampini 
205*fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr);
206*fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr);
207*fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
208*fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
209*fe8322adSStefano Zampini     } else {
210*fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
211*fe8322adSStefano Zampini     }
212*fe8322adSStefano Zampini     if (tj->monitor && !U) {
213*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
214*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr);
215*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
216*fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
217*fe8322adSStefano Zampini     }
218*fe8322adSStefano Zampini   }
219*fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
220*fe8322adSStefano Zampini     PetscObjectId    id;
221*fe8322adSStefano Zampini     PetscObjectState state;
222*fe8322adSStefano Zampini 
223*fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr);
224*fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr);
225*fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
226*fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
227*fe8322adSStefano Zampini     } else {
228*fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
229*fe8322adSStefano Zampini     }
230*fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
231*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
232*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr);
233*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
234*fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
235*fe8322adSStefano Zampini     }
236*fe8322adSStefano Zampini   }
237*fe8322adSStefano Zampini   if (!U && !Udot) {
238*fe8322adSStefano Zampini     ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
239*fe8322adSStefano Zampini     PetscFunctionReturn(0);
240*fe8322adSStefano Zampini   }
241*fe8322adSStefano Zampini 
242*fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
243*fe8322adSStefano Zampini     if (tj->monitor) {
244*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr);
245*fe8322adSStefano Zampini     }
246*fe8322adSStefano Zampini     /* cached states will be updated in the function */
247*fe8322adSStefano Zampini     ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr);
248*fe8322adSStefano Zampini     if (tj->monitor) {
249*fe8322adSStefano Zampini       ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr);
250*fe8322adSStefano Zampini       ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr);
251*fe8322adSStefano Zampini     }
252*fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
253*fe8322adSStefano Zampini     TS  fakets = ts;
254*fe8322adSStefano Zampini     Vec U2;
255*fe8322adSStefano Zampini 
256*fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
257*fe8322adSStefano Zampini     if (!ts) {
258*fe8322adSStefano Zampini       ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr);
259*fe8322adSStefano Zampini       if (!fakets) {
260*fe8322adSStefano Zampini         ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr);
261*fe8322adSStefano Zampini         ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr);
262*fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr);
263*fe8322adSStefano Zampini         ierr = VecDuplicate(U,&U2);CHKERRQ(ierr);
264*fe8322adSStefano Zampini         ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr);
265*fe8322adSStefano Zampini         ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr);
266*fe8322adSStefano Zampini       }
267*fe8322adSStefano Zampini     }
268*fe8322adSStefano Zampini     ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr);
269*fe8322adSStefano Zampini     ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr);
270*fe8322adSStefano Zampini     ierr = VecCopy(U2,U);CHKERRQ(ierr);
271*fe8322adSStefano Zampini     ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr);
272*fe8322adSStefano Zampini     ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr);
273*fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
274*fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
275*fe8322adSStefano Zampini   }
276*fe8322adSStefano Zampini   ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr);
277*fe8322adSStefano Zampini   PetscFunctionReturn(0);
278*fe8322adSStefano Zampini }
279*fe8322adSStefano 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;
359*fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
360*fe8322adSStefano 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
367*fe8322adSStefano 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;
386*fe8322adSStefano 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;
425*fe8322adSStefano Zampini   ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr);
426*fe8322adSStefano Zampini 
427*fe8322adSStefano Zampini   t->lag.order            = 1;
428*fe8322adSStefano Zampini   t->lag.L                = NULL;
429*fe8322adSStefano Zampini   t->lag.T                = NULL;
430*fe8322adSStefano Zampini   t->lag.W                = NULL;
431*fe8322adSStefano Zampini   t->lag.WW               = NULL;
432*fe8322adSStefano Zampini   t->lag.TW               = NULL;
433*fe8322adSStefano Zampini   t->lag.TT               = NULL;
434*fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
435*fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
436*fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
437*fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
438*fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
439*fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
440*fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
441*fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
442*fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
443*fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
444*fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
445*fe8322adSStefano 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);
553*fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr);
554*fe8322adSStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr);
555*fe8322adSStefano 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 
582*fe8322adSStefano Zampini   ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr);
583*fe8322adSStefano Zampini   ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr);
584*fe8322adSStefano Zampini   ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr);
585*fe8322adSStefano Zampini   ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr);
586*fe8322adSStefano Zampini   ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr);
587*fe8322adSStefano 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);}
591*fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
592*fe8322adSStefano Zampini     PetscMPIInt rank;
593*fe8322adSStefano Zampini     MPI_Comm    comm;
594*fe8322adSStefano Zampini 
595*fe8322adSStefano Zampini     ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr);
596*fe8322adSStefano Zampini     ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
597*fe8322adSStefano Zampini     if (!rank) { /* we own the directory, so we run PetscRMTree on it */
598*fe8322adSStefano Zampini       ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr);
599*fe8322adSStefano Zampini     }
600*fe8322adSStefano 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);
670*fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
671*fe8322adSStefano 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;
72964e38db7SHong Zhang   PetscFunctionBegin;
73064e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
731*fe8322adSStefano Zampini   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
73284a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
73364e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
73464e38db7SHong Zhang   PetscFunctionReturn(0);
73564e38db7SHong Zhang }
73664e38db7SHong Zhang 
737db901c5bSHong Zhang /*@C
73864e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
73964e38db7SHong Zhang 
74064e38db7SHong Zhang    Collective on TSTrajectory
74164e38db7SHong Zhang 
74264e38db7SHong Zhang    Input Arguments:
74364e38db7SHong Zhang +  tj      - the TSTrajectory context
7441585b412SBarry Smith -  filetemplate - the template
74564e38db7SHong Zhang 
74664e38db7SHong Zhang    Options Database Keys:
7471585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7481585b412SBarry Smith 
74995452b02SPatrick Sanan    Notes:
75095452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
7511585b412SBarry Smith 
7521585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
7531585b412SBarry Smith    timestep counter
75464e38db7SHong Zhang 
75564e38db7SHong Zhang    Level: developer
75664e38db7SHong Zhang 
75764e38db7SHong Zhang .keywords: TS, trajectory, set
75864e38db7SHong Zhang 
7591585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
76064e38db7SHong Zhang @*/
76164e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
76264e38db7SHong Zhang {
76364e38db7SHong Zhang   PetscErrorCode ierr;
7649afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7659afe7f3eSBarry Smith 
76664e38db7SHong Zhang   PetscFunctionBegin;
76764e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7689afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
7699afe7f3eSBarry Smith 
7709afe7f3eSBarry 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");
7719afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7729afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
7739afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
7749afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
7759afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
7769afe7f3eSBarry 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");
7779afe7f3eSBarry Smith     if (ptr2) break;
7789afe7f3eSBarry Smith   }
77984a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
78064e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
78164e38db7SHong Zhang   PetscFunctionReturn(0);
78264e38db7SHong Zhang }
78364e38db7SHong Zhang 
78464e38db7SHong Zhang /*@
785bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
786bc952696SBarry Smith 
787bc952696SBarry Smith    Collective on TSTrajectory
788bc952696SBarry Smith 
789bc952696SBarry Smith    Input Parameter:
7903c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
7913c0fce88SHong Zhang -  ts - the TS context
792bc952696SBarry Smith 
793bc952696SBarry Smith    Options Database Keys:
7943c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
79564fc91eeSBarry 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
796063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
797bc952696SBarry Smith 
798df5474d8SHong Zhang    Level: developer
799bc952696SBarry Smith 
80095452b02SPatrick Sanan    Notes:
80195452b02SPatrick Sanan     This is not normally called directly by users
802bc952696SBarry Smith 
8033c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
804bc952696SBarry Smith 
8053c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
806bc952696SBarry Smith @*/
807972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
808bc952696SBarry Smith {
809ed695a29SHong Zhang   PetscBool      set,flg;
81064e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
81164e38db7SHong Zhang   PetscErrorCode ierr;
812bc952696SBarry Smith 
813bc952696SBarry Smith   PetscFunctionBegin;
814b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
815*fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
816b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
817972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
818ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
819aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
820*fe8322adSStefano Zampini   ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr);
821*fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr);
822*fe8322adSStefano 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);
823*fe8322adSStefano Zampini   ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr);
82464fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
82564fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
82664e38db7SHong Zhang 
82764e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
82884a45834SBarry Smith   if (set) {
82964e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
83084a45834SBarry Smith   }
83164e38db7SHong Zhang 
8321585b412SBarry 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);
83364e38db7SHong Zhang   if (set) {
8341585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
83584a45834SBarry Smith   }
83664e38db7SHong Zhang 
83764e38db7SHong Zhang   /* Handle specific TSTrajectory options */
83862b521acSHong Zhang   if (tj->ops->setfromoptions) {
83962b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
84062b521acSHong Zhang   }
841bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
842bc952696SBarry Smith   PetscFunctionReturn(0);
843bc952696SBarry Smith }
84468bece0bSHong Zhang 
84568bece0bSHong Zhang /*@
84668bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
84768bece0bSHong Zhang    of a TS trajectory.
84868bece0bSHong Zhang 
84968bece0bSHong Zhang    Collective on TS
85068bece0bSHong Zhang 
85168bece0bSHong Zhang    Input Parameter:
8523c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8533c0fce88SHong Zhang -  tj - the TS trajectory context
85468bece0bSHong Zhang 
855df5474d8SHong Zhang    Level: developer
85668bece0bSHong Zhang 
8573c0fce88SHong Zhang .keywords: TS, trajectory, setup
85868bece0bSHong Zhang 
85968bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
86068bece0bSHong Zhang @*/
86168bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
86268bece0bSHong Zhang {
86368bece0bSHong Zhang   PetscErrorCode ierr;
8649afe7f3eSBarry Smith   size_t         s1,s2;
86568bece0bSHong Zhang 
86668bece0bSHong Zhang   PetscFunctionBegin;
86768bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
86868bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
869*fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
87068bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
87168bece0bSHong Zhang 
87268bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
87368bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
87468bece0bSHong Zhang   }
87568bece0bSHong Zhang   if (tj->ops->setup) {
87668bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
87768bece0bSHong Zhang   }
87868bece0bSHong Zhang 
87968bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
88053b27ddbSHong Zhang 
88153b27ddbSHong Zhang   /* Set the counters to zero */
8821a5a771fSHong Zhang   tj->recomps    = 0;
88353b27ddbSHong Zhang   tj->diskreads  = 0;
88453b27ddbSHong Zhang   tj->diskwrites = 0;
8859afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
8869afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
887*fe8322adSStefano Zampini   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
88811e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
88911e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
89068bece0bSHong Zhang   PetscFunctionReturn(0);
89168bece0bSHong Zhang }
892*fe8322adSStefano Zampini 
893*fe8322adSStefano Zampini /*@
894*fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
895*fe8322adSStefano Zampini 
896*fe8322adSStefano Zampini    Collective on TSTrajectory
897*fe8322adSStefano Zampini 
898*fe8322adSStefano Zampini    Input Parameter:
899*fe8322adSStefano Zampini +  tj  - the TS trajectory context
900*fe8322adSStefano Zampini -  flg - the boolean flag
901*fe8322adSStefano Zampini 
902*fe8322adSStefano Zampini    Level: developer
903*fe8322adSStefano Zampini 
904*fe8322adSStefano Zampini .keywords: trajectory
905*fe8322adSStefano Zampini 
906*fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly()
907*fe8322adSStefano Zampini @*/
908*fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
909*fe8322adSStefano Zampini {
910*fe8322adSStefano Zampini   PetscFunctionBegin;
911*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
912*fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
913*fe8322adSStefano Zampini   tj->solution_only = solution_only;
914*fe8322adSStefano Zampini   PetscFunctionReturn(0);
915*fe8322adSStefano Zampini }
916*fe8322adSStefano Zampini 
917*fe8322adSStefano Zampini /*@
918*fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
919*fe8322adSStefano Zampini 
920*fe8322adSStefano Zampini    Logically collective on TSTrajectory
921*fe8322adSStefano Zampini 
922*fe8322adSStefano Zampini    Input Parameter:
923*fe8322adSStefano Zampini .  tj  - the TS trajectory context
924*fe8322adSStefano Zampini 
925*fe8322adSStefano Zampini    Output Parameter:
926*fe8322adSStefano Zampini -  flg - the boolean flag
927*fe8322adSStefano Zampini 
928*fe8322adSStefano Zampini    Level: developer
929*fe8322adSStefano Zampini 
930*fe8322adSStefano Zampini .keywords: trajectory
931*fe8322adSStefano Zampini 
932*fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly()
933*fe8322adSStefano Zampini @*/
934*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
935*fe8322adSStefano Zampini {
936*fe8322adSStefano Zampini   PetscFunctionBegin;
937*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
938*fe8322adSStefano Zampini   PetscValidPointer(solution_only,2);
939*fe8322adSStefano Zampini   *solution_only = tj->solution_only;
940*fe8322adSStefano Zampini   PetscFunctionReturn(0);
941*fe8322adSStefano Zampini }
942*fe8322adSStefano Zampini 
943*fe8322adSStefano Zampini /*@
944*fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
945*fe8322adSStefano Zampini 
946*fe8322adSStefano Zampini    Collective on TSTrajectory
947*fe8322adSStefano Zampini 
948*fe8322adSStefano Zampini    Input Parameter:
949*fe8322adSStefano Zampini +  tj   - the TS trajectory context
950*fe8322adSStefano Zampini .  ts   - the TS solver context
951*fe8322adSStefano Zampini -  time - the requested time
952*fe8322adSStefano Zampini 
953*fe8322adSStefano Zampini    Output Parameter:
954*fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
955*fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
956*fe8322adSStefano Zampini 
957*fe8322adSStefano Zampini    Level: developer
958*fe8322adSStefano Zampini 
959*fe8322adSStefano 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.
960*fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
961*fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
962*fe8322adSStefano Zampini 
963*fe8322adSStefano Zampini .keywords: trajectory
964*fe8322adSStefano Zampini 
965*fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs()
966*fe8322adSStefano Zampini @*/
967*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
968*fe8322adSStefano Zampini {
969*fe8322adSStefano Zampini   PetscErrorCode ierr;
970*fe8322adSStefano Zampini 
971*fe8322adSStefano Zampini   PetscFunctionBegin;
972*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
973*fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
974*fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
975*fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
976*fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
977*fe8322adSStefano Zampini   if (U && !tj->U) {
978*fe8322adSStefano Zampini     DM dm;
979*fe8322adSStefano Zampini 
980*fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
981*fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr);
982*fe8322adSStefano Zampini   }
983*fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
984*fe8322adSStefano Zampini     DM dm;
985*fe8322adSStefano Zampini 
986*fe8322adSStefano Zampini     ierr = TSGetDM(ts,&dm);CHKERRQ(ierr);
987*fe8322adSStefano Zampini     ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr);
988*fe8322adSStefano Zampini   }
989*fe8322adSStefano Zampini   ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr);
990*fe8322adSStefano Zampini   if (U) {
991*fe8322adSStefano Zampini     ierr = VecLockPush(tj->U);CHKERRQ(ierr);
992*fe8322adSStefano Zampini     *U   = tj->U;
993*fe8322adSStefano Zampini   }
994*fe8322adSStefano Zampini   if (Udot) {
995*fe8322adSStefano Zampini     ierr  = VecLockPush(tj->Udot);CHKERRQ(ierr);
996*fe8322adSStefano Zampini     *Udot = tj->Udot;
997*fe8322adSStefano Zampini   }
998*fe8322adSStefano Zampini   PetscFunctionReturn(0);
999*fe8322adSStefano Zampini }
1000*fe8322adSStefano Zampini 
1001*fe8322adSStefano Zampini /*@
1002*fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1003*fe8322adSStefano Zampini 
1004*fe8322adSStefano Zampini    Collective on TSTrajectory
1005*fe8322adSStefano Zampini 
1006*fe8322adSStefano Zampini    Input Parameter:
1007*fe8322adSStefano Zampini +  tj   - the TS trajectory context
1008*fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1009*fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1010*fe8322adSStefano Zampini 
1011*fe8322adSStefano Zampini    Level: developer
1012*fe8322adSStefano Zampini 
1013*fe8322adSStefano Zampini .keywords: trajectory
1014*fe8322adSStefano Zampini 
1015*fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs()
1016*fe8322adSStefano Zampini @*/
1017*fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1018*fe8322adSStefano Zampini {
1019*fe8322adSStefano Zampini   PetscErrorCode ierr;
1020*fe8322adSStefano Zampini 
1021*fe8322adSStefano Zampini   PetscFunctionBegin;
1022*fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1023*fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1024*fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
1025*fe8322adSStefano Zampini   if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1026*fe8322adSStefano Zampini   if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1027*fe8322adSStefano Zampini   if (U) {
1028*fe8322adSStefano Zampini     ierr = VecLockPop(tj->U);CHKERRQ(ierr);
1029*fe8322adSStefano Zampini     *U   = NULL;
1030*fe8322adSStefano Zampini   }
1031*fe8322adSStefano Zampini   if (Udot) {
1032*fe8322adSStefano Zampini     ierr  = VecLockPop(tj->Udot);CHKERRQ(ierr);
1033*fe8322adSStefano Zampini     *Udot = NULL;
1034*fe8322adSStefano Zampini   }
1035*fe8322adSStefano Zampini   PetscFunctionReturn(0);
1036*fe8322adSStefano Zampini }
1037