xref: /petsc/src/ts/trajectory/interface/traj.c (revision 049d1499c2574605777f33bb2bf8a19c8ef17d29)
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;
82bf6d308SHong Zhang PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp;
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 
24db781477SPatrick Sanan .seealso: `TSTrajectoryRegisterAll()`
25bc952696SBarry Smith @*/
26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
27bc952696SBarry Smith {
28bc952696SBarry Smith   PetscFunctionBegin;
299566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TSTrajectoryList,sname,function));
30bc952696SBarry Smith   PetscFunctionReturn(0);
31bc952696SBarry Smith }
32bc952696SBarry Smith 
33fe8322adSStefano Zampini /*@
34fe8322adSStefano Zampini   TSTrajectorySet - Sets a vector of state in the trajectory object
35fe8322adSStefano Zampini 
36fe8322adSStefano Zampini   Collective on TSTrajectory
37fe8322adSStefano Zampini 
38fe8322adSStefano Zampini   Input Parameters:
39fe8322adSStefano Zampini + tj      - the trajectory object
40fe8322adSStefano Zampini . ts      - the time stepper object (optional)
41fe8322adSStefano Zampini . stepnum - the step number
42fe8322adSStefano Zampini . time    - the current time
43fe8322adSStefano Zampini - X       - the current solution
44fe8322adSStefano Zampini 
45fe8322adSStefano Zampini   Level: developer
46fe8322adSStefano Zampini 
47fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
48fe8322adSStefano Zampini 
49db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()`
50fe8322adSStefano Zampini @*/
51bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
52bc952696SBarry Smith {
53bc952696SBarry Smith   PetscFunctionBegin;
54bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
55fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
56fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
57fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
58fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,4);
59fe8322adSStefano Zampini   PetscValidHeaderSpecific(X,VEC_CLASSID,5);
603c633725SBarry Smith   PetscCheck(tj->ops->set,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
613c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
62fe8322adSStefano Zampini   if (tj->monitor) {
6363a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n",stepnum,(double)time,(PetscInt)!tj->solution_only));
64fe8322adSStefano Zampini   }
659566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0));
669566063dSJacob Faibussowitsch   PetscCall((*tj->ops->set)(tj,ts,stepnum,time,X));
679566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0));
681baa6e33SBarry Smith   if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh,stepnum,time));
69fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
70bc952696SBarry Smith   PetscFunctionReturn(0);
71bc952696SBarry Smith }
72bc952696SBarry Smith 
73fe8322adSStefano Zampini /*@
74fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
75fe8322adSStefano Zampini 
76fe8322adSStefano Zampini   Not collective.
77fe8322adSStefano Zampini 
78fe8322adSStefano Zampini   Input Parameters:
79fe8322adSStefano Zampini . tj - the trajectory object
80fe8322adSStefano Zampini 
81fe8322adSStefano Zampini   Output Parameter:
82fe8322adSStefano Zampini . steps - the number of steps
83fe8322adSStefano Zampini 
84fe8322adSStefano Zampini   Level: developer
85fe8322adSStefano Zampini 
86db781477SPatrick Sanan .seealso: `TSTrajectorySet()`
87fe8322adSStefano Zampini @*/
88fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
89fe8322adSStefano Zampini {
90fe8322adSStefano Zampini   PetscFunctionBegin;
91fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
92fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
939566063dSJacob Faibussowitsch   PetscCall(TSHistoryGetNumSteps(tj->tsh,steps));
94fe8322adSStefano Zampini   PetscFunctionReturn(0);
95fe8322adSStefano Zampini }
96fe8322adSStefano Zampini 
97fe8322adSStefano Zampini /*@
98fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
99fe8322adSStefano Zampini 
100fe8322adSStefano Zampini   Collective on TS
101fe8322adSStefano Zampini 
102fe8322adSStefano Zampini   Input Parameters:
103fe8322adSStefano Zampini + tj      - the trajectory object
104fe8322adSStefano Zampini . ts      - the time stepper object
105fe8322adSStefano Zampini - stepnum - the step number
106fe8322adSStefano Zampini 
107fe8322adSStefano Zampini   Output Parameter:
108fe8322adSStefano Zampini . time    - the time associated with the step number
109fe8322adSStefano Zampini 
110fe8322adSStefano Zampini   Level: developer
111fe8322adSStefano Zampini 
112fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
113fe8322adSStefano Zampini 
114db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()`
115fe8322adSStefano Zampini @*/
116c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
117bc952696SBarry Smith {
118bc952696SBarry Smith   PetscFunctionBegin;
1193c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
120fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
121fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
122fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
123dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
1243c633725SBarry Smith   PetscCheck(tj->ops->get,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
1253c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1263c633725SBarry Smith   PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
127fe8322adSStefano Zampini   if (tj->monitor) {
12863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n",stepnum,(PetscInt)!tj->solution_only));
1299566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
130fe8322adSStefano Zampini   }
1319566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0));
1329566063dSJacob Faibussowitsch   PetscCall((*tj->ops->get)(tj,ts,stepnum,time));
1339566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0));
134bc952696SBarry Smith   PetscFunctionReturn(0);
135bc952696SBarry Smith }
136bc952696SBarry Smith 
137fe8322adSStefano Zampini /*@
138fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
139fe8322adSStefano Zampini 
140fe8322adSStefano Zampini   Collective on TS
141fe8322adSStefano Zampini 
142fe8322adSStefano Zampini   Input Parameters:
143fe8322adSStefano Zampini + tj      - the trajectory object
144fe8322adSStefano Zampini . ts      - the time stepper object (optional)
145fe8322adSStefano Zampini - stepnum - the requested step number
146fe8322adSStefano Zampini 
1476b867d5aSJose E. Roman   Input/Output Parameter:
148fe8322adSStefano Zampini 
149fe8322adSStefano Zampini   Output Parameters:
150f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number
151f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
152fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
153fe8322adSStefano Zampini 
154fe8322adSStefano Zampini   Level: developer
155fe8322adSStefano Zampini 
156fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
157fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
158fe8322adSStefano Zampini 
159db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()`
160fe8322adSStefano Zampini @*/
161fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
162fe8322adSStefano Zampini {
163fe8322adSStefano Zampini   PetscFunctionBegin;
1643c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
165fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
166fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
167fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
168dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
169fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
170fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
171fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
1723c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1739566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0));
174fe8322adSStefano Zampini   if (tj->monitor) {
175fe8322adSStefano Zampini     PetscInt pU,pUdot;
176fe8322adSStefano Zampini     pU    = U ? 1 : 0;
177fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
17863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n",pU,pUdot,stepnum,(double)*time));
1799566063dSJacob Faibussowitsch     PetscCall(PetscViewerFlush(tj->monitor));
180fe8322adSStefano Zampini   }
181fe8322adSStefano Zampini   if (U && tj->lag.caching) {
182fe8322adSStefano Zampini     PetscObjectId    id;
183fe8322adSStefano Zampini     PetscObjectState state;
184fe8322adSStefano Zampini 
1859566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U,&state));
1869566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U,&id));
187fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
188fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
189fe8322adSStefano Zampini     } else {
190fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
191fe8322adSStefano Zampini     }
192fe8322adSStefano Zampini     if (tj->monitor && !U) {
1939566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
1949566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n"));
1959566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
1969566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
197fe8322adSStefano Zampini     }
198fe8322adSStefano Zampini   }
199fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
200fe8322adSStefano Zampini     PetscObjectId    id;
201fe8322adSStefano Zampini     PetscObjectState state;
202fe8322adSStefano Zampini 
2039566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)Udot,&state));
2049566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)Udot,&id));
205fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
206fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
207fe8322adSStefano Zampini     } else {
208fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
209fe8322adSStefano Zampini     }
210fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2119566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(tj->monitor));
2129566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n"));
2139566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2149566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
215fe8322adSStefano Zampini     }
216fe8322adSStefano Zampini   }
217fe8322adSStefano Zampini   if (!U && !Udot) {
2189566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
219fe8322adSStefano Zampini     PetscFunctionReturn(0);
220fe8322adSStefano Zampini   }
221fe8322adSStefano Zampini 
222fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
2231baa6e33SBarry Smith     if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor));
224fe8322adSStefano Zampini     /* cached states will be updated in the function */
2259566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot));
226fe8322adSStefano Zampini     if (tj->monitor) {
2279566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(tj->monitor));
2289566063dSJacob Faibussowitsch       PetscCall(PetscViewerFlush(tj->monitor));
229fe8322adSStefano Zampini     }
230fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
231fe8322adSStefano Zampini     TS  fakets = ts;
232fe8322adSStefano Zampini     Vec U2;
233fe8322adSStefano Zampini 
234fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
235fe8322adSStefano Zampini     if (!ts) {
2369566063dSJacob Faibussowitsch       PetscCall(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets));
237fe8322adSStefano Zampini       if (!fakets) {
2389566063dSJacob Faibussowitsch         PetscCall(TSCreate(PetscObjectComm((PetscObject)tj),&fakets));
2399566063dSJacob Faibussowitsch         PetscCall(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets));
2409566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)fakets));
2419566063dSJacob Faibussowitsch         PetscCall(VecDuplicate(U,&U2));
2429566063dSJacob Faibussowitsch         PetscCall(TSSetSolution(fakets,U2));
2439566063dSJacob Faibussowitsch         PetscCall(PetscObjectDereference((PetscObject)U2));
244fe8322adSStefano Zampini       }
245fe8322adSStefano Zampini     }
2469566063dSJacob Faibussowitsch     PetscCall(TSTrajectoryGet(tj,fakets,stepnum,time));
2479566063dSJacob Faibussowitsch     PetscCall(TSGetSolution(fakets,&U2));
2489566063dSJacob Faibussowitsch     PetscCall(VecCopy(U2,U));
2499566063dSJacob Faibussowitsch     PetscCall(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state));
2509566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id));
251fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
252fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
253fe8322adSStefano Zampini   }
2549566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
255fe8322adSStefano Zampini   PetscFunctionReturn(0);
256fe8322adSStefano Zampini }
257fe8322adSStefano Zampini 
258bc952696SBarry Smith /*@C
259fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
260fe2efc57SMark 
261fe2efc57SMark    Collective on TSTrajectory
262fe2efc57SMark 
263fe2efc57SMark    Input Parameters:
264fe2efc57SMark +  A - the TSTrajectory context
265736c3998SJose E. Roman .  obj - Optional object
266736c3998SJose E. Roman -  name - command line option
267fe2efc57SMark 
268fe2efc57SMark    Level: intermediate
269db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()`
270fe2efc57SMark @*/
271fe2efc57SMark PetscErrorCode  TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])
272fe2efc57SMark {
273fe2efc57SMark   PetscFunctionBegin;
274fe2efc57SMark   PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1);
2759566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name));
276fe2efc57SMark   PetscFunctionReturn(0);
277fe2efc57SMark }
278fe2efc57SMark 
279fe2efc57SMark /*@C
280bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
281bc952696SBarry Smith 
282bc952696SBarry Smith     Collective on TSTrajectory
283bc952696SBarry Smith 
284bc952696SBarry Smith     Input Parameters:
285b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
286bc952696SBarry Smith -   viewer - visualization context
287bc952696SBarry Smith 
288bc952696SBarry Smith     Options Database Key:
289e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
290bc952696SBarry Smith 
291bc952696SBarry Smith     Notes:
292bc952696SBarry Smith     The available visualization contexts include
293bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
294bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
295bc952696SBarry Smith          output where only the first processor opens
296bc952696SBarry Smith          the file.  All other processors send their
297bc952696SBarry Smith          data to the first processor to print.
298bc952696SBarry Smith 
299bc952696SBarry Smith     The user can open an alternative visualization context with
300bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
301bc952696SBarry Smith 
302df5474d8SHong Zhang     Level: developer
303bc952696SBarry Smith 
304db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`
305bc952696SBarry Smith @*/
306b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
307bc952696SBarry Smith {
308bc952696SBarry Smith   PetscBool      iascii;
309bc952696SBarry Smith 
310bc952696SBarry Smith   PetscFunctionBegin;
3111a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
312bc952696SBarry Smith   if (!viewer) {
3139566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer));
314bc952696SBarry Smith   }
315bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
316b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
317bc952696SBarry Smith 
3189566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
319bc952696SBarry Smith   if (iascii) {
3209566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer));
32163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n",tj->recomps));
32263a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %" PetscInt_FMT "\n",tj->diskreads));
32363a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %" PetscInt_FMT "\n",tj->diskwrites));
324b1d74d50SHong Zhang     if (tj->ops->view) {
3259566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
3269566063dSJacob Faibussowitsch       PetscCall((*tj->ops->view)(tj,viewer));
3279566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
328bc952696SBarry Smith     }
329bc952696SBarry Smith   }
330bc952696SBarry Smith   PetscFunctionReturn(0);
331bc952696SBarry Smith }
332bc952696SBarry Smith 
333bc952696SBarry Smith /*@C
33478fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
33578fbdcc8SBarry Smith 
33678fbdcc8SBarry Smith    Collective on TSTrajectory
33778fbdcc8SBarry Smith 
33878fbdcc8SBarry Smith    Input Parameters:
33978fbdcc8SBarry Smith +  tr - the trajectory context
34078fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
34178fbdcc8SBarry Smith 
34278fbdcc8SBarry Smith    Level: intermediate
34378fbdcc8SBarry Smith 
344db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
345db901c5bSHong Zhang 
346db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()`
34778fbdcc8SBarry Smith @*/
34878fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
34978fbdcc8SBarry Smith {
35078fbdcc8SBarry Smith   PetscFunctionBegin;
351fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
352fe8322adSStefano Zampini   PetscValidPointer(names,2);
3539566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&ctx->names));
3549566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names,&ctx->names));
35578fbdcc8SBarry Smith   PetscFunctionReturn(0);
35678fbdcc8SBarry Smith }
35778fbdcc8SBarry Smith 
35878fbdcc8SBarry Smith /*@C
359fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
36008347785SBarry Smith 
36108347785SBarry Smith    Collective on TSLGCtx
36208347785SBarry Smith 
36308347785SBarry Smith    Input Parameters:
36408347785SBarry Smith +  tj - the TSTrajectory context
36508347785SBarry Smith .  transform - the transform function
36608347785SBarry Smith .  destroy - function to destroy the optional context
36708347785SBarry Smith -  ctx - optional context used by transform function
36808347785SBarry Smith 
36908347785SBarry Smith    Level: intermediate
37008347785SBarry Smith 
371db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()`
37208347785SBarry Smith @*/
37308347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
37408347785SBarry Smith {
37508347785SBarry Smith   PetscFunctionBegin;
376fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
37708347785SBarry Smith   tj->transform        = transform;
37808347785SBarry Smith   tj->transformdestroy = destroy;
37908347785SBarry Smith   tj->transformctx     = tctx;
38008347785SBarry Smith   PetscFunctionReturn(0);
38108347785SBarry Smith }
38208347785SBarry Smith 
383db901c5bSHong Zhang /*@
384bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
385bc952696SBarry Smith 
386d083f849SBarry Smith   Collective
387bc952696SBarry Smith 
388bc952696SBarry Smith   Input Parameter:
3893c0fce88SHong Zhang . comm - the communicator
390bc952696SBarry Smith 
391bc952696SBarry Smith   Output Parameter:
3923c0fce88SHong Zhang . tj   - the trajectory object
393bc952696SBarry Smith 
394df5474d8SHong Zhang   Level: developer
395bc952696SBarry Smith 
39695452b02SPatrick Sanan   Notes:
39795452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
398bc952696SBarry Smith 
399db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()`
400bc952696SBarry Smith @*/
401b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
402bc952696SBarry Smith {
403bc952696SBarry Smith   TSTrajectory   t;
404bc952696SBarry Smith 
405bc952696SBarry Smith   PetscFunctionBegin;
406b1d74d50SHong Zhang   PetscValidPointer(tj,2);
407b1d74d50SHong Zhang   *tj = NULL;
4089566063dSJacob Faibussowitsch   PetscCall(TSInitializePackage());
409bc952696SBarry Smith 
4109566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView));
41168bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4129566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(comm,&t->tsh));
413fe8322adSStefano Zampini 
414fe8322adSStefano Zampini   t->lag.order            = 1;
415fe8322adSStefano Zampini   t->lag.L                = NULL;
416fe8322adSStefano Zampini   t->lag.T                = NULL;
417fe8322adSStefano Zampini   t->lag.W                = NULL;
418fe8322adSStefano Zampini   t->lag.WW               = NULL;
419fe8322adSStefano Zampini   t->lag.TW               = NULL;
420fe8322adSStefano Zampini   t->lag.TT               = NULL;
421fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
422fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
423fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
424fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
425fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
426fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
427fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
428fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
429fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
430fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
431fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
432fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
433ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
434b1d74d50SHong Zhang   *tj  = t;
43563a3b9bcSJacob Faibussowitsch   PetscCall(TSTrajectorySetFiletemplate(t,"TS-%06" PetscInt_FMT ".bin"));
436bc952696SBarry Smith   PetscFunctionReturn(0);
437bc952696SBarry Smith }
438bc952696SBarry Smith 
439bc952696SBarry Smith /*@C
440bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
441bc952696SBarry Smith 
442bc952696SBarry Smith   Collective on TS
443bc952696SBarry Smith 
444bc952696SBarry Smith   Input Parameters:
4453c0fce88SHong Zhang + tj   - the TSTrajectory context
4463c0fce88SHong Zhang . ts   - the TS context
4473c0fce88SHong Zhang - type - a known method
448bc952696SBarry Smith 
449bc952696SBarry Smith   Options Database Command:
450e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
451bc952696SBarry Smith 
452df5474d8SHong Zhang    Level: developer
453bc952696SBarry Smith 
454db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()`
455bc952696SBarry Smith 
456bc952696SBarry Smith @*/
457fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
458bc952696SBarry Smith {
459972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
460bc952696SBarry Smith   PetscBool      match;
461bc952696SBarry Smith 
462bc952696SBarry Smith   PetscFunctionBegin;
463972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4649566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)tj,type,&match));
465bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
466bc952696SBarry Smith 
4679566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TSTrajectoryList,type,&r));
4683c633725SBarry Smith   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
469972caf09SHong Zhang   if (tj->ops->destroy) {
4709566063dSJacob Faibussowitsch     PetscCall((*(tj)->ops->destroy)(tj));
471bc952696SBarry Smith 
472972caf09SHong Zhang     tj->ops->destroy = NULL;
473bc952696SBarry Smith   }
4749566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(tj->ops,sizeof(*tj->ops)));
475bc952696SBarry Smith 
4769566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)tj,type));
4779566063dSJacob Faibussowitsch   PetscCall((*r)(tj,ts));
478bc952696SBarry Smith   PetscFunctionReturn(0);
479bc952696SBarry Smith }
480bc952696SBarry Smith 
481881c1a9bSHong Zhang /*@C
482881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
483881c1a9bSHong Zhang 
484881c1a9bSHong Zhang   Collective on TS
485881c1a9bSHong Zhang 
486881c1a9bSHong Zhang   Input Parameters:
487881c1a9bSHong Zhang + tj   - the TSTrajectory context
488881c1a9bSHong Zhang - ts   - the TS context
489881c1a9bSHong Zhang 
490881c1a9bSHong Zhang   Output Parameters:
491881c1a9bSHong Zhang . type - a known method
492881c1a9bSHong Zhang 
493881c1a9bSHong Zhang   Level: developer
494881c1a9bSHong Zhang 
495db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`
496881c1a9bSHong Zhang 
497881c1a9bSHong Zhang @*/
498881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
499881c1a9bSHong Zhang {
500881c1a9bSHong Zhang   PetscFunctionBegin;
501881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
502881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
503881c1a9bSHong Zhang   PetscFunctionReturn(0);
504881c1a9bSHong Zhang }
505881c1a9bSHong Zhang 
506972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
507972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5089a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5092b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
510bc952696SBarry Smith 
511bc952696SBarry Smith /*@C
512bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
513bc952696SBarry Smith 
514bc952696SBarry Smith   Not Collective
515bc952696SBarry Smith 
516df5474d8SHong Zhang   Level: developer
517bc952696SBarry Smith 
518db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()`
519bc952696SBarry Smith @*/
520bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
521bc952696SBarry Smith {
522bc952696SBarry Smith   PetscFunctionBegin;
523560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
524bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
525bc952696SBarry Smith 
5269566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic));
5279566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile));
5289566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory));
5299566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization));
530bc952696SBarry Smith   PetscFunctionReturn(0);
531bc952696SBarry Smith }
532bc952696SBarry Smith 
533bc952696SBarry Smith /*@
5341550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5351550c9b9SHong Zhang 
5361550c9b9SHong Zhang    Collective on TSTrajectory
5371550c9b9SHong Zhang 
5381550c9b9SHong Zhang    Input Parameter:
5391550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5401550c9b9SHong Zhang 
5411550c9b9SHong Zhang    Level: developer
5421550c9b9SHong Zhang 
543db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
5441550c9b9SHong Zhang @*/
5459a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5461550c9b9SHong Zhang {
5471550c9b9SHong Zhang   PetscFunctionBegin;
5489a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5499a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5501baa6e33SBarry Smith   if (tj->ops->reset) PetscCall((*tj->ops->reset)(tj));
5519566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
5529566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&tj->tsh));
5539566063dSJacob Faibussowitsch   PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh));
554fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5551550c9b9SHong Zhang   PetscFunctionReturn(0);
5561550c9b9SHong Zhang }
5571550c9b9SHong Zhang 
5581550c9b9SHong Zhang /*@
559bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
560bc952696SBarry Smith 
561bc952696SBarry Smith    Collective on TSTrajectory
562bc952696SBarry Smith 
563bc952696SBarry Smith    Input Parameter:
5643c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
565bc952696SBarry Smith 
566df5474d8SHong Zhang    Level: developer
567bc952696SBarry Smith 
568db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()`
569bc952696SBarry Smith @*/
570972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
571bc952696SBarry Smith {
572bc952696SBarry Smith   PetscFunctionBegin;
573972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
574972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
575c793f718SLisandro Dalcin   if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);}
576bc952696SBarry Smith 
5779566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryReset(*tj));
5789566063dSJacob Faibussowitsch   PetscCall(TSHistoryDestroy(&(*tj)->tsh));
5799566063dSJacob Faibussowitsch   PetscCall(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W));
5809566063dSJacob Faibussowitsch   PetscCall(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW));
5819566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->U));
5829566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*tj)->Udot));
5839a992471SHong Zhang 
5849566063dSJacob Faibussowitsch   if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx));
5859566063dSJacob Faibussowitsch   if ((*tj)->ops->destroy) PetscCall((*(*tj)->ops->destroy)((*tj)));
586fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
587fe8322adSStefano Zampini     PetscMPIInt rank;
588fe8322adSStefano Zampini     MPI_Comm    comm;
589fe8322adSStefano Zampini 
5909566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetComm((PetscObject)(*tj),&comm));
5919566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm,&rank));
592dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5939566063dSJacob Faibussowitsch       PetscCall(PetscRMTree((*tj)->dirname));
594fe8322adSStefano Zampini     }
595fe8322adSStefano Zampini   }
5969566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*tj)->names));
5979566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->dirname));
5989566063dSJacob Faibussowitsch   PetscCall(PetscFree((*tj)->filetemplate));
5999566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(tj));
600bc952696SBarry Smith   PetscFunctionReturn(0);
601bc952696SBarry Smith }
602bc952696SBarry Smith 
603bc952696SBarry Smith /*
604772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
605bc952696SBarry Smith 
606bc952696SBarry Smith   Collective on TSTrajectory
607bc952696SBarry Smith 
608bc952696SBarry Smith   Input Parameter:
6093c0fce88SHong Zhang + tj - the TSTrajectory context
6103c0fce88SHong Zhang - ts - the TS context
6113c0fce88SHong Zhang 
6123c0fce88SHong Zhang   Options Database Keys:
6133c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
614bc952696SBarry Smith 
615df5474d8SHong Zhang   Level: developer
616bc952696SBarry Smith 
617db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()`
618bc952696SBarry Smith */
6192bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
620bc952696SBarry Smith {
621bc952696SBarry Smith   PetscBool      opt;
622bc952696SBarry Smith   const char     *defaultType;
623bc952696SBarry Smith   char           typeName[256];
624bc952696SBarry Smith 
625bc952696SBarry Smith   PetscFunctionBegin;
626b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
627bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
628bc952696SBarry Smith 
6299566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryRegisterAll());
6309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt));
631bc952696SBarry Smith   if (opt) {
6329566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,typeName));
633bc952696SBarry Smith   } else {
6349566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,defaultType));
635bc952696SBarry Smith   }
636bc952696SBarry Smith   PetscFunctionReturn(0);
637bc952696SBarry Smith }
638bc952696SBarry Smith 
639ed695a29SHong Zhang /*@
6409ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6419ffb3502SHong Zhang 
6429ffb3502SHong Zhang    Collective on TSTrajectory
6439ffb3502SHong Zhang 
6444165533cSJose E. Roman    Input Parameters:
6459ffb3502SHong Zhang +  tj - the TSTrajectory context
6469ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6479ffb3502SHong Zhang 
6489ffb3502SHong Zhang    Options Database Keys:
6499ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6509ffb3502SHong Zhang 
6519ffb3502SHong Zhang    Level: advanced
6529ffb3502SHong Zhang 
653db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
6549ffb3502SHong Zhang @*/
6559ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6569ffb3502SHong Zhang {
6579ffb3502SHong Zhang   PetscFunctionBegin;
6589ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6599ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6609ffb3502SHong Zhang   tj->usehistory = flg;
6619ffb3502SHong Zhang   PetscFunctionReturn(0);
6629ffb3502SHong Zhang }
6639ffb3502SHong Zhang 
6649ffb3502SHong Zhang /*@
665ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
666ed695a29SHong Zhang 
667ed695a29SHong Zhang    Collective on TSTrajectory
668ed695a29SHong Zhang 
6694165533cSJose E. Roman    Input Parameters:
670ed695a29SHong Zhang +  tj - the TSTrajectory context
671ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
672ed695a29SHong Zhang 
6733c0fce88SHong Zhang    Options Database Keys:
674063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6753c0fce88SHong Zhang 
676df5474d8SHong Zhang    Level: developer
677ed695a29SHong Zhang 
678db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`
679ed695a29SHong Zhang @*/
6802bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
681ed695a29SHong Zhang {
682ed695a29SHong Zhang   PetscFunctionBegin;
683ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
684ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
685fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
686fe8322adSStefano Zampini   else tj->monitor = NULL;
687ed695a29SHong Zhang   PetscFunctionReturn(0);
688ed695a29SHong Zhang }
689ed695a29SHong Zhang 
690bc952696SBarry Smith /*@
69164fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
69264fc91eeSBarry Smith 
69364fc91eeSBarry Smith    Collective on TSTrajectory
69464fc91eeSBarry Smith 
6954165533cSJose E. Roman    Input Parameters:
69664fc91eeSBarry Smith +  tj - the TSTrajectory context
69764fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
69864fc91eeSBarry Smith 
69964fc91eeSBarry Smith    Options Database Keys:
70064fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
70164fc91eeSBarry Smith 
70295452b02SPatrick Sanan    Notes:
70395452b02SPatrick 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.
70464fc91eeSBarry Smith 
70564fc91eeSBarry Smith    Level: advanced
70664fc91eeSBarry Smith 
707db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()`
70864fc91eeSBarry Smith @*/
70964fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
71064fc91eeSBarry Smith {
71164fc91eeSBarry Smith   PetscFunctionBegin;
71264fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
71364fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
71464fc91eeSBarry Smith   tj->keepfiles = flg;
71564fc91eeSBarry Smith   PetscFunctionReturn(0);
71664fc91eeSBarry Smith }
71764fc91eeSBarry Smith 
718db901c5bSHong Zhang /*@C
71964e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
72064e38db7SHong Zhang 
72164e38db7SHong Zhang    Collective on TSTrajectory
72264e38db7SHong Zhang 
7234165533cSJose E. Roman    Input Parameters:
72464e38db7SHong Zhang +  tj      - the TSTrajectory context
72564e38db7SHong Zhang -  dirname - the directory name
72664e38db7SHong Zhang 
72764e38db7SHong Zhang    Options Database Keys:
72864e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
72964e38db7SHong Zhang 
73095452b02SPatrick Sanan    Notes:
73195452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7321585b412SBarry Smith 
73364e38db7SHong Zhang    Level: developer
73464e38db7SHong Zhang 
735c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()`
73664e38db7SHong Zhang @*/
73764e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
73864e38db7SHong Zhang {
739a17281aeSStefano Zampini   PetscBool      flg;
740a17281aeSStefano Zampini 
74164e38db7SHong Zhang   PetscFunctionBegin;
74264e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7439566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(tj->dirname,dirname,&flg));
744*049d1499SBarry Smith   PetscCheck(flg || !tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
7459566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirname));
7469566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(dirname,&tj->dirname));
74764e38db7SHong Zhang   PetscFunctionReturn(0);
74864e38db7SHong Zhang }
74964e38db7SHong Zhang 
750db901c5bSHong Zhang /*@C
75164e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
75264e38db7SHong Zhang 
75364e38db7SHong Zhang    Collective on TSTrajectory
75464e38db7SHong Zhang 
7554165533cSJose E. Roman    Input Parameters:
75664e38db7SHong Zhang +  tj      - the TSTrajectory context
7571585b412SBarry Smith -  filetemplate - the template
75864e38db7SHong Zhang 
75964e38db7SHong Zhang    Options Database Keys:
7601585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7611585b412SBarry Smith 
76295452b02SPatrick Sanan    Notes:
76363a3b9bcSJacob Faibussowitsch     The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading /
7641585b412SBarry Smith 
76563a3b9bcSJacob Faibussowitsch    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06" PetscInt_FMT " is replaced by the
7661585b412SBarry Smith    timestep counter
76764e38db7SHong Zhang 
76864e38db7SHong Zhang    Level: developer
76964e38db7SHong Zhang 
770c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()`
77164e38db7SHong Zhang @*/
77264e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
77364e38db7SHong Zhang {
7749afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7759afe7f3eSBarry Smith 
77664e38db7SHong Zhang   PetscFunctionBegin;
77764e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
77863a3b9bcSJacob Faibussowitsch   PetscValidCharPointer(filetemplate,2);
7793c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
7809afe7f3eSBarry Smith 
78163a3b9bcSJacob Faibussowitsch   PetscCheck(filetemplate[0],PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin");
7829afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7839566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(filetemplate,"%",(char**)&ptr));
78463a3b9bcSJacob Faibussowitsch   PetscCheck(ptr,PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin");
7859afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
78663a3b9bcSJacob Faibussowitsch     PetscCall(PetscStrchr(PetscInt_FMT "DiouxX",*ptr,(char**)&ptr2));
78763a3b9bcSJacob Faibussowitsch     PetscCheck(ptr2 || (*ptr >= '0' && *ptr <= '9'),PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06" PetscInt_FMT ".bin");
7889afe7f3eSBarry Smith     if (ptr2) break;
7899afe7f3eSBarry Smith   }
7909566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->filetemplate));
7919566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(filetemplate,&tj->filetemplate));
79264e38db7SHong Zhang   PetscFunctionReturn(0);
79364e38db7SHong Zhang }
79464e38db7SHong Zhang 
79564e38db7SHong Zhang /*@
796bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
797bc952696SBarry Smith 
798bc952696SBarry Smith    Collective on TSTrajectory
799bc952696SBarry Smith 
800d8d19677SJose E. Roman    Input Parameters:
8013c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
8023c0fce88SHong Zhang -  ts - the TS context
803bc952696SBarry Smith 
804bc952696SBarry Smith    Options Database Keys:
8053c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
80664fc91eeSBarry 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
807063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
808bc952696SBarry Smith 
809df5474d8SHong Zhang    Level: developer
810bc952696SBarry Smith 
81195452b02SPatrick Sanan    Notes:
81295452b02SPatrick Sanan     This is not normally called directly by users
813bc952696SBarry Smith 
814db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()`
815bc952696SBarry Smith @*/
816972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
817bc952696SBarry Smith {
818ed695a29SHong Zhang   PetscBool      set,flg;
81964e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
820bc952696SBarry Smith 
821bc952696SBarry Smith   PetscFunctionBegin;
822b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
823fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
824d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)tj);
8259566063dSJacob Faibussowitsch   PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts));
8269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL));
8279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set));
8289566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetMonitor(tj,flg));
8299566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL));
8309566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL));
8319566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL));
8329566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL));
8339566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set));
8349566063dSJacob Faibussowitsch   if (set) PetscCall(TSTrajectorySetKeepFiles(tj,flg));
83564e38db7SHong Zhang 
8369566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set));
8371baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetDirname(tj,dirname));
83864e38db7SHong Zhang 
83963a3b9bcSJacob Faibussowitsch   PetscCall(PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set));
8401baa6e33SBarry Smith   if (set) PetscCall(TSTrajectorySetFiletemplate(tj,filetemplate));
84164e38db7SHong Zhang 
84264e38db7SHong Zhang   /* Handle specific TSTrajectory options */
8431baa6e33SBarry Smith   if (tj->ops->setfromoptions) PetscCall((*tj->ops->setfromoptions)(PetscOptionsObject,tj));
844d0609cedSBarry Smith   PetscOptionsEnd();
845bc952696SBarry Smith   PetscFunctionReturn(0);
846bc952696SBarry Smith }
84768bece0bSHong Zhang 
84868bece0bSHong Zhang /*@
84968bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
85068bece0bSHong Zhang    of a TS trajectory.
85168bece0bSHong Zhang 
85268bece0bSHong Zhang    Collective on TS
85368bece0bSHong Zhang 
854d8d19677SJose E. Roman    Input Parameters:
8553c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8563c0fce88SHong Zhang -  tj - the TS trajectory context
85768bece0bSHong Zhang 
858df5474d8SHong Zhang    Level: developer
85968bece0bSHong Zhang 
860db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`
86168bece0bSHong Zhang @*/
86268bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
86368bece0bSHong Zhang {
8649afe7f3eSBarry Smith   size_t         s1,s2;
86568bece0bSHong Zhang 
86668bece0bSHong Zhang   PetscFunctionBegin;
86768bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
86868bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
869fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
87068bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
87168bece0bSHong Zhang 
8729566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0));
87368bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
8749566063dSJacob Faibussowitsch     PetscCall(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC));
87568bece0bSHong Zhang   }
8761baa6e33SBarry Smith   if (tj->ops->setup) PetscCall((*tj->ops->setup)(tj,ts));
87768bece0bSHong Zhang 
87868bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
87953b27ddbSHong Zhang 
88053b27ddbSHong Zhang   /* Set the counters to zero */
8811a5a771fSHong Zhang   tj->recomps    = 0;
88253b27ddbSHong Zhang   tj->diskreads  = 0;
88353b27ddbSHong Zhang   tj->diskwrites = 0;
8849566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->dirname,&s1));
8859566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(tj->filetemplate,&s2));
8869566063dSJacob Faibussowitsch   PetscCall(PetscFree(tj->dirfiletemplate));
8879566063dSJacob Faibussowitsch   PetscCall(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate));
8889566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate));
8899566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0));
89068bece0bSHong Zhang   PetscFunctionReturn(0);
89168bece0bSHong Zhang }
892fe8322adSStefano Zampini 
893fe8322adSStefano Zampini /*@
894fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
895fe8322adSStefano Zampini 
896fe8322adSStefano Zampini    Collective on TSTrajectory
897fe8322adSStefano Zampini 
898d8d19677SJose E. Roman    Input Parameters:
899fe8322adSStefano Zampini +  tj  - the TS trajectory context
900fe8322adSStefano Zampini -  flg - the boolean flag
901fe8322adSStefano Zampini 
902fe8322adSStefano Zampini    Level: developer
903fe8322adSStefano Zampini 
904db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()`
905fe8322adSStefano Zampini @*/
906fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
907fe8322adSStefano Zampini {
908fe8322adSStefano Zampini   PetscFunctionBegin;
909fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
910fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
911fe8322adSStefano Zampini   tj->solution_only = solution_only;
912fe8322adSStefano Zampini   PetscFunctionReturn(0);
913fe8322adSStefano Zampini }
914fe8322adSStefano Zampini 
915fe8322adSStefano Zampini /*@
916fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
917fe8322adSStefano Zampini 
918fe8322adSStefano Zampini    Logically collective on TSTrajectory
919fe8322adSStefano Zampini 
920fe8322adSStefano Zampini    Input Parameter:
921fe8322adSStefano Zampini .  tj  - the TS trajectory context
922fe8322adSStefano Zampini 
923fe8322adSStefano Zampini    Output Parameter:
924d8d19677SJose E. Roman .  flg - the boolean flag
925fe8322adSStefano Zampini 
926fe8322adSStefano Zampini    Level: developer
927fe8322adSStefano Zampini 
928db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()`
929fe8322adSStefano Zampini @*/
930fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
931fe8322adSStefano Zampini {
932fe8322adSStefano Zampini   PetscFunctionBegin;
933fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
934dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only,2);
935fe8322adSStefano Zampini   *solution_only = tj->solution_only;
936fe8322adSStefano Zampini   PetscFunctionReturn(0);
937fe8322adSStefano Zampini }
938fe8322adSStefano Zampini 
939fe8322adSStefano Zampini /*@
940fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
941fe8322adSStefano Zampini 
942fe8322adSStefano Zampini    Collective on TSTrajectory
943fe8322adSStefano Zampini 
944d8d19677SJose E. Roman    Input Parameters:
945fe8322adSStefano Zampini +  tj   - the TS trajectory context
946fe8322adSStefano Zampini .  ts   - the TS solver context
947fe8322adSStefano Zampini -  time - the requested time
948fe8322adSStefano Zampini 
949d8d19677SJose E. Roman    Output Parameters:
950fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
951fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
952fe8322adSStefano Zampini 
953fe8322adSStefano Zampini    Level: developer
954fe8322adSStefano Zampini 
955fe8322adSStefano 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.
956fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
957fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
958fe8322adSStefano Zampini 
959db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()`
960fe8322adSStefano Zampini @*/
961fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
962fe8322adSStefano Zampini {
963fe8322adSStefano Zampini   PetscFunctionBegin;
964fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
965fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
966fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
967fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
968fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
969fe8322adSStefano Zampini   if (U && !tj->U) {
970fe8322adSStefano Zampini     DM dm;
971fe8322adSStefano Zampini 
9729566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts,&dm));
9739566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm,&tj->U));
974fe8322adSStefano Zampini   }
975fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
976fe8322adSStefano Zampini     DM dm;
977fe8322adSStefano Zampini 
9789566063dSJacob Faibussowitsch     PetscCall(TSGetDM(ts,&dm));
9799566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm,&tj->Udot));
980fe8322adSStefano Zampini   }
9819566063dSJacob Faibussowitsch   PetscCall(TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL));
982fe8322adSStefano Zampini   if (U) {
9839566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->U));
984fe8322adSStefano Zampini     *U   = tj->U;
985fe8322adSStefano Zampini   }
986fe8322adSStefano Zampini   if (Udot) {
9879566063dSJacob Faibussowitsch     PetscCall(VecLockReadPush(tj->Udot));
988fe8322adSStefano Zampini     *Udot = tj->Udot;
989fe8322adSStefano Zampini   }
990fe8322adSStefano Zampini   PetscFunctionReturn(0);
991fe8322adSStefano Zampini }
992fe8322adSStefano Zampini 
993fe8322adSStefano Zampini /*@
994fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
995fe8322adSStefano Zampini 
996fe8322adSStefano Zampini    Collective on TSTrajectory
997fe8322adSStefano Zampini 
998d8d19677SJose E. Roman    Input Parameters:
999fe8322adSStefano Zampini +  tj   - the TS trajectory context
1000fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1001fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1002fe8322adSStefano Zampini 
1003fe8322adSStefano Zampini    Level: developer
1004fe8322adSStefano Zampini 
1005db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()`
1006fe8322adSStefano Zampini @*/
1007fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1008fe8322adSStefano Zampini {
1009fe8322adSStefano Zampini   PetscFunctionBegin;
1010fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1011fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1012fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
10133c633725SBarry Smith   PetscCheck(!U || *U == tj->U,PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10143c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot,PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1015fe8322adSStefano Zampini   if (U) {
10169566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->U));
1017fe8322adSStefano Zampini     *U   = NULL;
1018fe8322adSStefano Zampini   }
1019fe8322adSStefano Zampini   if (Udot) {
10209566063dSJacob Faibussowitsch     PetscCall(VecLockReadPop(tj->Udot));
1021fe8322adSStefano Zampini     *Udot = NULL;
1022fe8322adSStefano Zampini   }
1023fe8322adSStefano Zampini   PetscFunctionReturn(0);
1024fe8322adSStefano Zampini }
1025