xref: /petsc/src/ts/trajectory/interface/traj.c (revision dadcf80911fb48939c55327431ae8d7e47dbe367)
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 
243c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll()
25bc952696SBarry Smith @*/
26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
27bc952696SBarry Smith {
28bc952696SBarry Smith   PetscFunctionBegin;
295f80ce2aSJacob Faibussowitsch   CHKERRQ(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 
49fe8322adSStefano Zampini .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) {
635f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only));
64fe8322adSStefano Zampini   }
655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0));
665f80ce2aSJacob Faibussowitsch   CHKERRQ((*tj->ops->set)(tj,ts,stepnum,time,X));
675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0));
68ac1a7491SHong Zhang   if (tj->usehistory) {
695f80ce2aSJacob Faibussowitsch     CHKERRQ(TSHistoryUpdate(tj->tsh,stepnum,time));
70ac1a7491SHong Zhang   }
71fe8322adSStefano Zampini   if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL;
72bc952696SBarry Smith   PetscFunctionReturn(0);
73bc952696SBarry Smith }
74bc952696SBarry Smith 
75fe8322adSStefano Zampini /*@
76fe8322adSStefano Zampini   TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet().
77fe8322adSStefano Zampini 
78fe8322adSStefano Zampini   Not collective.
79fe8322adSStefano Zampini 
80fe8322adSStefano Zampini   Input Parameters:
81fe8322adSStefano Zampini . tj - the trajectory object
82fe8322adSStefano Zampini 
83fe8322adSStefano Zampini   Output Parameter:
84fe8322adSStefano Zampini . steps - the number of steps
85fe8322adSStefano Zampini 
86fe8322adSStefano Zampini   Level: developer
87fe8322adSStefano Zampini 
88fe8322adSStefano Zampini .seealso: TSTrajectorySet()
89fe8322adSStefano Zampini @*/
90fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps)
91fe8322adSStefano Zampini {
92fe8322adSStefano Zampini   PetscFunctionBegin;
93fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
94fe8322adSStefano Zampini   PetscValidIntPointer(steps,2);
955f80ce2aSJacob Faibussowitsch   CHKERRQ(TSHistoryGetNumSteps(tj->tsh,steps));
96fe8322adSStefano Zampini   PetscFunctionReturn(0);
97fe8322adSStefano Zampini }
98fe8322adSStefano Zampini 
99fe8322adSStefano Zampini /*@
100fe8322adSStefano Zampini   TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory
101fe8322adSStefano Zampini 
102fe8322adSStefano Zampini   Collective on TS
103fe8322adSStefano Zampini 
104fe8322adSStefano Zampini   Input Parameters:
105fe8322adSStefano Zampini + tj      - the trajectory object
106fe8322adSStefano Zampini . ts      - the time stepper object
107fe8322adSStefano Zampini - stepnum - the step number
108fe8322adSStefano Zampini 
109fe8322adSStefano Zampini   Output Parameter:
110fe8322adSStefano Zampini . time    - the time associated with the step number
111fe8322adSStefano Zampini 
112fe8322adSStefano Zampini   Level: developer
113fe8322adSStefano Zampini 
114fe8322adSStefano Zampini   Notes: Usually one does not call this routine, it is called automatically during TSSolve()
115fe8322adSStefano Zampini 
116fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution()
117fe8322adSStefano Zampini @*/
118c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
119bc952696SBarry Smith {
120bc952696SBarry Smith   PetscFunctionBegin;
1213c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
122fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
123fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
124fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
125*dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
1263c633725SBarry Smith   PetscCheck(tj->ops->get,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name);
1273c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1283c633725SBarry Smith   PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
129fe8322adSStefano Zampini   if (tj->monitor) {
1305f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only));
1315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFlush(tj->monitor));
132fe8322adSStefano Zampini   }
1335f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0));
1345f80ce2aSJacob Faibussowitsch   CHKERRQ((*tj->ops->get)(tj,ts,stepnum,time));
1355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0));
136bc952696SBarry Smith   PetscFunctionReturn(0);
137bc952696SBarry Smith }
138bc952696SBarry Smith 
139fe8322adSStefano Zampini /*@
140fe8322adSStefano Zampini   TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS
141fe8322adSStefano Zampini 
142fe8322adSStefano Zampini   Collective on TS
143fe8322adSStefano Zampini 
144fe8322adSStefano Zampini   Input Parameters:
145fe8322adSStefano Zampini + tj      - the trajectory object
146fe8322adSStefano Zampini . ts      - the time stepper object (optional)
147fe8322adSStefano Zampini - stepnum - the requested step number
148fe8322adSStefano Zampini 
1496b867d5aSJose E. Roman   Input/Output Parameter:
150fe8322adSStefano Zampini 
151fe8322adSStefano Zampini   Output Parameters:
152f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number
153f1a722f8SMatthew G. Knepley . U    - state vector (can be NULL)
154fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL)
155fe8322adSStefano Zampini 
156fe8322adSStefano Zampini   Level: developer
157fe8322adSStefano Zampini 
158fe8322adSStefano Zampini   Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory.
159fe8322adSStefano Zampini          If the requested time does not match any in the trajectory, Lagrangian interpolations are returned.
160fe8322adSStefano Zampini 
161fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet()
162fe8322adSStefano Zampini @*/
163fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot)
164fe8322adSStefano Zampini {
165fe8322adSStefano Zampini   PetscFunctionBegin;
1663c633725SBarry Smith   PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
167fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
168fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
169fe8322adSStefano Zampini   PetscValidLogicalCollectiveInt(tj,stepnum,3);
170*dadcf809SJacob Faibussowitsch   PetscValidRealPointer(time,4);
171fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5);
172fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6);
173fe8322adSStefano Zampini   if (!U && !Udot) PetscFunctionReturn(0);
1743c633725SBarry Smith   PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first");
1755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0));
176fe8322adSStefano Zampini   if (tj->monitor) {
177fe8322adSStefano Zampini     PetscInt pU,pUdot;
178fe8322adSStefano Zampini     pU    = U ? 1 : 0;
179fe8322adSStefano Zampini     pUdot = Udot ? 1 : 0;
1805f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time));
1815f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerFlush(tj->monitor));
182fe8322adSStefano Zampini   }
183fe8322adSStefano Zampini   if (U && tj->lag.caching) {
184fe8322adSStefano Zampini     PetscObjectId    id;
185fe8322adSStefano Zampini     PetscObjectState state;
186fe8322adSStefano Zampini 
1875f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectStateGet((PetscObject)U,&state));
1885f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectGetId((PetscObject)U,&id));
189fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
190fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL;
191fe8322adSStefano Zampini     } else {
192fe8322adSStefano Zampini       if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL;
193fe8322adSStefano Zampini     }
194fe8322adSStefano Zampini     if (tj->monitor && !U) {
1955f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPushTab(tj->monitor));
1965f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n"));
1975f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPopTab(tj->monitor));
1985f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerFlush(tj->monitor));
199fe8322adSStefano Zampini     }
200fe8322adSStefano Zampini   }
201fe8322adSStefano Zampini   if (Udot && tj->lag.caching) {
202fe8322adSStefano Zampini     PetscObjectId    id;
203fe8322adSStefano Zampini     PetscObjectState state;
204fe8322adSStefano Zampini 
2055f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectStateGet((PetscObject)Udot,&state));
2065f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectGetId((PetscObject)Udot,&id));
207fe8322adSStefano Zampini     if (stepnum == PETSC_DECIDE) {
208fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL;
209fe8322adSStefano Zampini     } else {
210fe8322adSStefano Zampini       if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL;
211fe8322adSStefano Zampini     }
212fe8322adSStefano Zampini     if (tj->monitor && !Udot) {
2135f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPushTab(tj->monitor));
2145f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n"));
2155f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPopTab(tj->monitor));
2165f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerFlush(tj->monitor));
217fe8322adSStefano Zampini     }
218fe8322adSStefano Zampini   }
219fe8322adSStefano Zampini   if (!U && !Udot) {
2205f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
221fe8322adSStefano Zampini     PetscFunctionReturn(0);
222fe8322adSStefano Zampini   }
223fe8322adSStefano Zampini 
224fe8322adSStefano Zampini   if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */
225fe8322adSStefano Zampini     if (tj->monitor) {
2265f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPushTab(tj->monitor));
227fe8322adSStefano Zampini     }
228fe8322adSStefano Zampini     /* cached states will be updated in the function */
2295f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot));
230fe8322adSStefano Zampini     if (tj->monitor) {
2315f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPopTab(tj->monitor));
2325f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerFlush(tj->monitor));
233fe8322adSStefano Zampini     }
234fe8322adSStefano Zampini   } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */
235fe8322adSStefano Zampini     TS  fakets = ts;
236fe8322adSStefano Zampini     Vec U2;
237fe8322adSStefano Zampini 
238fe8322adSStefano Zampini     /* use a fake TS if ts is missing */
239fe8322adSStefano Zampini     if (!ts) {
2405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets));
241fe8322adSStefano Zampini       if (!fakets) {
2425f80ce2aSJacob Faibussowitsch         CHKERRQ(TSCreate(PetscObjectComm((PetscObject)tj),&fakets));
2435f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets));
2445f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscObjectDereference((PetscObject)fakets));
2455f80ce2aSJacob Faibussowitsch         CHKERRQ(VecDuplicate(U,&U2));
2465f80ce2aSJacob Faibussowitsch         CHKERRQ(TSSetSolution(fakets,U2));
2475f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscObjectDereference((PetscObject)U2));
248fe8322adSStefano Zampini       }
249fe8322adSStefano Zampini     }
2505f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectoryGet(tj,fakets,stepnum,time));
2515f80ce2aSJacob Faibussowitsch     CHKERRQ(TSGetSolution(fakets,&U2));
2525f80ce2aSJacob Faibussowitsch     CHKERRQ(VecCopy(U2,U));
2535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state));
2545f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id));
255fe8322adSStefano Zampini     tj->lag.Ucached.time = *time;
256fe8322adSStefano Zampini     tj->lag.Ucached.step = stepnum;
257fe8322adSStefano Zampini   }
2585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0));
259fe8322adSStefano Zampini   PetscFunctionReturn(0);
260fe8322adSStefano Zampini }
261fe8322adSStefano Zampini 
262bc952696SBarry Smith /*@C
263fe2efc57SMark    TSTrajectoryViewFromOptions - View from Options
264fe2efc57SMark 
265fe2efc57SMark    Collective on TSTrajectory
266fe2efc57SMark 
267fe2efc57SMark    Input Parameters:
268fe2efc57SMark +  A - the TSTrajectory context
269736c3998SJose E. Roman .  obj - Optional object
270736c3998SJose E. Roman -  name - command line option
271fe2efc57SMark 
272fe2efc57SMark    Level: intermediate
273fe2efc57SMark .seealso:  TSTrajectory, TSTrajectoryView, PetscObjectViewFromOptions(), TSTrajectoryCreate()
274fe2efc57SMark @*/
275fe2efc57SMark PetscErrorCode  TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[])
276fe2efc57SMark {
277fe2efc57SMark   PetscFunctionBegin;
278fe2efc57SMark   PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1);
2795f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectViewFromOptions((PetscObject)A,obj,name));
280fe2efc57SMark   PetscFunctionReturn(0);
281fe2efc57SMark }
282fe2efc57SMark 
283fe2efc57SMark /*@C
284bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
285bc952696SBarry Smith 
286bc952696SBarry Smith     Collective on TSTrajectory
287bc952696SBarry Smith 
288bc952696SBarry Smith     Input Parameters:
289b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
290bc952696SBarry Smith -   viewer - visualization context
291bc952696SBarry Smith 
292bc952696SBarry Smith     Options Database Key:
293e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
294bc952696SBarry Smith 
295bc952696SBarry Smith     Notes:
296bc952696SBarry Smith     The available visualization contexts include
297bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
298bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
299bc952696SBarry Smith          output where only the first processor opens
300bc952696SBarry Smith          the file.  All other processors send their
301bc952696SBarry Smith          data to the first processor to print.
302bc952696SBarry Smith 
303bc952696SBarry Smith     The user can open an alternative visualization context with
304bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
305bc952696SBarry Smith 
306df5474d8SHong Zhang     Level: developer
307bc952696SBarry Smith 
308bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
309bc952696SBarry Smith @*/
310b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
311bc952696SBarry Smith {
312bc952696SBarry Smith   PetscBool      iascii;
313bc952696SBarry Smith 
314bc952696SBarry Smith   PetscFunctionBegin;
3151a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
316bc952696SBarry Smith   if (!viewer) {
3175f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer));
318bc952696SBarry Smith   }
319bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
320b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
321bc952696SBarry Smith 
3225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii));
323bc952696SBarry Smith   if (iascii) {
3245f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer));
3255f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps));
3265f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads));
3275f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites));
328b1d74d50SHong Zhang     if (tj->ops->view) {
3295f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPushTab(viewer));
3305f80ce2aSJacob Faibussowitsch       CHKERRQ((*tj->ops->view)(tj,viewer));
3315f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPopTab(viewer));
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 .seealso: TSTrajectory, TSGetTrajectory()
35178fbdcc8SBarry Smith @*/
35278fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
35378fbdcc8SBarry Smith {
35478fbdcc8SBarry Smith   PetscFunctionBegin;
355fe8322adSStefano Zampini   PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1);
356fe8322adSStefano Zampini   PetscValidPointer(names,2);
3575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrArrayDestroy(&ctx->names));
3585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrArrayallocpy(names,&ctx->names));
35978fbdcc8SBarry Smith   PetscFunctionReturn(0);
36078fbdcc8SBarry Smith }
36178fbdcc8SBarry Smith 
36278fbdcc8SBarry Smith /*@C
363fe8322adSStefano Zampini    TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk
36408347785SBarry Smith 
36508347785SBarry Smith    Collective on TSLGCtx
36608347785SBarry Smith 
36708347785SBarry Smith    Input Parameters:
36808347785SBarry Smith +  tj - the TSTrajectory context
36908347785SBarry Smith .  transform - the transform function
37008347785SBarry Smith .  destroy - function to destroy the optional context
37108347785SBarry Smith -  ctx - optional context used by transform function
37208347785SBarry Smith 
37308347785SBarry Smith    Level: intermediate
37408347785SBarry Smith 
37508347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
37608347785SBarry Smith @*/
37708347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
37808347785SBarry Smith {
37908347785SBarry Smith   PetscFunctionBegin;
380fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
38108347785SBarry Smith   tj->transform        = transform;
38208347785SBarry Smith   tj->transformdestroy = destroy;
38308347785SBarry Smith   tj->transformctx     = tctx;
38408347785SBarry Smith   PetscFunctionReturn(0);
38508347785SBarry Smith }
38608347785SBarry Smith 
387db901c5bSHong Zhang /*@
388bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
389bc952696SBarry Smith 
390d083f849SBarry Smith   Collective
391bc952696SBarry Smith 
392bc952696SBarry Smith   Input Parameter:
3933c0fce88SHong Zhang . comm - the communicator
394bc952696SBarry Smith 
395bc952696SBarry Smith   Output Parameter:
3963c0fce88SHong Zhang . tj   - the trajectory object
397bc952696SBarry Smith 
398df5474d8SHong Zhang   Level: developer
399bc952696SBarry Smith 
40095452b02SPatrick Sanan   Notes:
40195452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
402bc952696SBarry Smith 
40364fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
404bc952696SBarry Smith @*/
405b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
406bc952696SBarry Smith {
407bc952696SBarry Smith   TSTrajectory   t;
408bc952696SBarry Smith 
409bc952696SBarry Smith   PetscFunctionBegin;
410b1d74d50SHong Zhang   PetscValidPointer(tj,2);
411b1d74d50SHong Zhang   *tj = NULL;
4125f80ce2aSJacob Faibussowitsch   CHKERRQ(TSInitializePackage());
413bc952696SBarry Smith 
4145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView));
41568bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
4165f80ce2aSJacob Faibussowitsch   CHKERRQ(TSHistoryCreate(comm,&t->tsh));
417fe8322adSStefano Zampini 
418fe8322adSStefano Zampini   t->lag.order            = 1;
419fe8322adSStefano Zampini   t->lag.L                = NULL;
420fe8322adSStefano Zampini   t->lag.T                = NULL;
421fe8322adSStefano Zampini   t->lag.W                = NULL;
422fe8322adSStefano Zampini   t->lag.WW               = NULL;
423fe8322adSStefano Zampini   t->lag.TW               = NULL;
424fe8322adSStefano Zampini   t->lag.TT               = NULL;
425fe8322adSStefano Zampini   t->lag.caching          = PETSC_TRUE;
426fe8322adSStefano Zampini   t->lag.Ucached.id       = 0;
427fe8322adSStefano Zampini   t->lag.Ucached.state    = -1;
428fe8322adSStefano Zampini   t->lag.Ucached.time     = PETSC_MIN_REAL;
429fe8322adSStefano Zampini   t->lag.Ucached.step     = PETSC_MAX_INT;
430fe8322adSStefano Zampini   t->lag.Udotcached.id    = 0;
431fe8322adSStefano Zampini   t->lag.Udotcached.state = -1;
432fe8322adSStefano Zampini   t->lag.Udotcached.time  = PETSC_MIN_REAL;
433fe8322adSStefano Zampini   t->lag.Udotcached.step  = PETSC_MAX_INT;
434fe8322adSStefano Zampini   t->adjoint_solve_mode   = PETSC_TRUE;
435fe8322adSStefano Zampini   t->solution_only        = PETSC_FALSE;
436fe8322adSStefano Zampini   t->keepfiles            = PETSC_FALSE;
437ac1a7491SHong Zhang   t->usehistory           = PETSC_TRUE;
438b1d74d50SHong Zhang   *tj  = t;
4395f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectorySetFiletemplate(t,"TS-%06D.bin"));
440bc952696SBarry Smith   PetscFunctionReturn(0);
441bc952696SBarry Smith }
442bc952696SBarry Smith 
443bc952696SBarry Smith /*@C
444bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
445bc952696SBarry Smith 
446bc952696SBarry Smith   Collective on TS
447bc952696SBarry Smith 
448bc952696SBarry Smith   Input Parameters:
4493c0fce88SHong Zhang + tj   - the TSTrajectory context
4503c0fce88SHong Zhang . ts   - the TS context
4513c0fce88SHong Zhang - type - a known method
452bc952696SBarry Smith 
453bc952696SBarry Smith   Options Database Command:
454e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
455bc952696SBarry Smith 
456df5474d8SHong Zhang    Level: developer
457bc952696SBarry Smith 
458881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType()
459bc952696SBarry Smith 
460bc952696SBarry Smith @*/
461fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
462bc952696SBarry Smith {
463972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
464bc952696SBarry Smith   PetscBool      match;
465bc952696SBarry Smith 
466bc952696SBarry Smith   PetscFunctionBegin;
467972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)tj,type,&match));
469bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
470bc952696SBarry Smith 
4715f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListFind(TSTrajectoryList,type,&r));
4723c633725SBarry Smith   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
473972caf09SHong Zhang   if (tj->ops->destroy) {
4745f80ce2aSJacob Faibussowitsch     CHKERRQ((*(tj)->ops->destroy)(tj));
475bc952696SBarry Smith 
476972caf09SHong Zhang     tj->ops->destroy = NULL;
477bc952696SBarry Smith   }
4785f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMemzero(tj->ops,sizeof(*tj->ops)));
479bc952696SBarry Smith 
4805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject)tj,type));
4815f80ce2aSJacob Faibussowitsch   CHKERRQ((*r)(tj,ts));
482bc952696SBarry Smith   PetscFunctionReturn(0);
483bc952696SBarry Smith }
484bc952696SBarry Smith 
485881c1a9bSHong Zhang /*@C
486881c1a9bSHong Zhang   TSTrajectoryGetType - Gets the trajectory type
487881c1a9bSHong Zhang 
488881c1a9bSHong Zhang   Collective on TS
489881c1a9bSHong Zhang 
490881c1a9bSHong Zhang   Input Parameters:
491881c1a9bSHong Zhang + tj   - the TSTrajectory context
492881c1a9bSHong Zhang - ts   - the TS context
493881c1a9bSHong Zhang 
494881c1a9bSHong Zhang   Output Parameters:
495881c1a9bSHong Zhang . type - a known method
496881c1a9bSHong Zhang 
497881c1a9bSHong Zhang   Level: developer
498881c1a9bSHong Zhang 
499881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType()
500881c1a9bSHong Zhang 
501881c1a9bSHong Zhang @*/
502881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type)
503881c1a9bSHong Zhang {
504881c1a9bSHong Zhang   PetscFunctionBegin;
505881c1a9bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
506881c1a9bSHong Zhang   if (type) *type = ((PetscObject)tj)->type_name;
507881c1a9bSHong Zhang   PetscFunctionReturn(0);
508881c1a9bSHong Zhang }
509881c1a9bSHong Zhang 
510972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
511972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
5129a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
5132b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
514bc952696SBarry Smith 
515bc952696SBarry Smith /*@C
516bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
517bc952696SBarry Smith 
518bc952696SBarry Smith   Not Collective
519bc952696SBarry Smith 
520df5474d8SHong Zhang   Level: developer
521bc952696SBarry Smith 
5223c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
523bc952696SBarry Smith @*/
524bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
525bc952696SBarry Smith {
526bc952696SBarry Smith   PetscFunctionBegin;
527560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
528bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
529bc952696SBarry Smith 
5305f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic));
5315f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile));
5325f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory));
5335f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization));
534bc952696SBarry Smith   PetscFunctionReturn(0);
535bc952696SBarry Smith }
536bc952696SBarry Smith 
537bc952696SBarry Smith /*@
5381550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
5391550c9b9SHong Zhang 
5401550c9b9SHong Zhang    Collective on TSTrajectory
5411550c9b9SHong Zhang 
5421550c9b9SHong Zhang    Input Parameter:
5431550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5441550c9b9SHong Zhang 
5451550c9b9SHong Zhang    Level: developer
5461550c9b9SHong Zhang 
5471550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
5481550c9b9SHong Zhang @*/
5499a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj)
5501550c9b9SHong Zhang {
5511550c9b9SHong Zhang   PetscFunctionBegin;
5529a992471SHong Zhang   if (!tj) PetscFunctionReturn(0);
5539a992471SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5549a992471SHong Zhang   if (tj->ops->reset) {
5555f80ce2aSJacob Faibussowitsch     CHKERRQ((*tj->ops->reset)(tj));
5569a992471SHong Zhang   }
5575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(tj->dirfiletemplate));
5585f80ce2aSJacob Faibussowitsch   CHKERRQ(TSHistoryDestroy(&tj->tsh));
5595f80ce2aSJacob Faibussowitsch   CHKERRQ(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh));
560fe8322adSStefano Zampini   tj->setupcalled = PETSC_FALSE;
5611550c9b9SHong Zhang   PetscFunctionReturn(0);
5621550c9b9SHong Zhang }
5631550c9b9SHong Zhang 
5641550c9b9SHong Zhang /*@
565bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
566bc952696SBarry Smith 
567bc952696SBarry Smith    Collective on TSTrajectory
568bc952696SBarry Smith 
569bc952696SBarry Smith    Input Parameter:
5703c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
571bc952696SBarry Smith 
572df5474d8SHong Zhang    Level: developer
573bc952696SBarry Smith 
5743c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
575bc952696SBarry Smith @*/
576972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
577bc952696SBarry Smith {
578bc952696SBarry Smith   PetscFunctionBegin;
579972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
580972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
581c793f718SLisandro Dalcin   if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);}
582bc952696SBarry Smith 
5835f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryReset(*tj));
5845f80ce2aSJacob Faibussowitsch   CHKERRQ(TSHistoryDestroy(&(*tj)->tsh));
5855f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W));
5865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW));
5875f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&(*tj)->U));
5885f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&(*tj)->Udot));
5899a992471SHong Zhang 
5905f80ce2aSJacob Faibussowitsch   if ((*tj)->transformdestroy) CHKERRQ((*(*tj)->transformdestroy)((*tj)->transformctx));
5915f80ce2aSJacob Faibussowitsch   if ((*tj)->ops->destroy) CHKERRQ((*(*tj)->ops->destroy)((*tj)));
592fe8322adSStefano Zampini   if (!((*tj)->keepfiles)) {
593fe8322adSStefano Zampini     PetscMPIInt rank;
594fe8322adSStefano Zampini     MPI_Comm    comm;
595fe8322adSStefano Zampini 
5965f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectGetComm((PetscObject)(*tj),&comm));
5975f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_rank(comm,&rank));
598dd400576SPatrick Sanan     if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */
5995f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscRMTree((*tj)->dirname));
600fe8322adSStefano Zampini     }
601fe8322adSStefano Zampini   }
6025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrArrayDestroy(&(*tj)->names));
6035f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*tj)->dirname));
6045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*tj)->filetemplate));
6055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(tj));
606bc952696SBarry Smith   PetscFunctionReturn(0);
607bc952696SBarry Smith }
608bc952696SBarry Smith 
609bc952696SBarry Smith /*
610772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
611bc952696SBarry Smith 
612bc952696SBarry Smith   Collective on TSTrajectory
613bc952696SBarry Smith 
614bc952696SBarry Smith   Input Parameter:
6153c0fce88SHong Zhang + tj - the TSTrajectory context
6163c0fce88SHong Zhang - ts - the TS context
6173c0fce88SHong Zhang 
6183c0fce88SHong Zhang   Options Database Keys:
6193c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
620bc952696SBarry Smith 
621df5474d8SHong Zhang   Level: developer
622bc952696SBarry Smith 
6233c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
624bc952696SBarry Smith */
6252bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
626bc952696SBarry Smith {
627bc952696SBarry Smith   PetscBool      opt;
628bc952696SBarry Smith   const char     *defaultType;
629bc952696SBarry Smith   char           typeName[256];
630bc952696SBarry Smith 
631bc952696SBarry Smith   PetscFunctionBegin;
632b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
633bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
634bc952696SBarry Smith 
6355f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryRegisterAll());
6365f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt));
637bc952696SBarry Smith   if (opt) {
6385f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectorySetType(tj,ts,typeName));
639bc952696SBarry Smith   } else {
6405f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectorySetType(tj,ts,defaultType));
641bc952696SBarry Smith   }
642bc952696SBarry Smith   PetscFunctionReturn(0);
643bc952696SBarry Smith }
644bc952696SBarry Smith 
645ed695a29SHong Zhang /*@
6469ffb3502SHong Zhang    TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory
6479ffb3502SHong Zhang 
6489ffb3502SHong Zhang    Collective on TSTrajectory
6499ffb3502SHong Zhang 
6504165533cSJose E. Roman    Input Parameters:
6519ffb3502SHong Zhang +  tj - the TSTrajectory context
6529ffb3502SHong Zhang -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
6539ffb3502SHong Zhang 
6549ffb3502SHong Zhang    Options Database Keys:
6559ffb3502SHong Zhang .  -ts_trajectory_use_history - have it use TSHistory
6569ffb3502SHong Zhang 
6579ffb3502SHong Zhang    Level: advanced
6589ffb3502SHong Zhang 
6599ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
6609ffb3502SHong Zhang @*/
6619ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg)
6629ffb3502SHong Zhang {
6639ffb3502SHong Zhang   PetscFunctionBegin;
6649ffb3502SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
6659ffb3502SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
6669ffb3502SHong Zhang   tj->usehistory = flg;
6679ffb3502SHong Zhang   PetscFunctionReturn(0);
6689ffb3502SHong Zhang }
6699ffb3502SHong Zhang 
6709ffb3502SHong Zhang /*@
671ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
672ed695a29SHong Zhang 
673ed695a29SHong Zhang    Collective on TSTrajectory
674ed695a29SHong Zhang 
6754165533cSJose E. Roman    Input Parameters:
676ed695a29SHong Zhang +  tj - the TSTrajectory context
677ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
678ed695a29SHong Zhang 
6793c0fce88SHong Zhang    Options Database Keys:
680063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
6813c0fce88SHong Zhang 
682df5474d8SHong Zhang    Level: developer
683ed695a29SHong Zhang 
6843c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
685ed695a29SHong Zhang @*/
6862bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
687ed695a29SHong Zhang {
688ed695a29SHong Zhang   PetscFunctionBegin;
689ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
690ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
691fe8322adSStefano Zampini   if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj));
692fe8322adSStefano Zampini   else tj->monitor = NULL;
693ed695a29SHong Zhang   PetscFunctionReturn(0);
694ed695a29SHong Zhang }
695ed695a29SHong Zhang 
696bc952696SBarry Smith /*@
69764fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
69864fc91eeSBarry Smith 
69964fc91eeSBarry Smith    Collective on TSTrajectory
70064fc91eeSBarry Smith 
7014165533cSJose E. Roman    Input Parameters:
70264fc91eeSBarry Smith +  tj - the TSTrajectory context
70364fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
70464fc91eeSBarry Smith 
70564fc91eeSBarry Smith    Options Database Keys:
70664fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
70764fc91eeSBarry Smith 
70895452b02SPatrick Sanan    Notes:
70995452b02SPatrick 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.
71064fc91eeSBarry Smith 
71164fc91eeSBarry Smith    Level: advanced
71264fc91eeSBarry Smith 
71364fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
71464fc91eeSBarry Smith @*/
71564fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
71664fc91eeSBarry Smith {
71764fc91eeSBarry Smith   PetscFunctionBegin;
71864fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
71964fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
72064fc91eeSBarry Smith   tj->keepfiles = flg;
72164fc91eeSBarry Smith   PetscFunctionReturn(0);
72264fc91eeSBarry Smith }
72364fc91eeSBarry Smith 
724db901c5bSHong Zhang /*@C
72564e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
72664e38db7SHong Zhang 
72764e38db7SHong Zhang    Collective on TSTrajectory
72864e38db7SHong Zhang 
7294165533cSJose E. Roman    Input Parameters:
73064e38db7SHong Zhang +  tj      - the TSTrajectory context
73164e38db7SHong Zhang -  dirname - the directory name
73264e38db7SHong Zhang 
73364e38db7SHong Zhang    Options Database Keys:
73464e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
73564e38db7SHong Zhang 
73695452b02SPatrick Sanan    Notes:
73795452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
7381585b412SBarry Smith 
73964e38db7SHong Zhang    Level: developer
74064e38db7SHong Zhang 
74164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
74264e38db7SHong Zhang @*/
74364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
74464e38db7SHong Zhang {
745a17281aeSStefano Zampini   PetscBool      flg;
746a17281aeSStefano Zampini 
74764e38db7SHong Zhang   PetscFunctionBegin;
74864e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcmp(tj->dirname,dirname,&flg));
750a17281aeSStefano Zampini   if (!flg && tj->dirfiletemplate) {
751a17281aeSStefano Zampini     SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup");
752a17281aeSStefano Zampini   }
7535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(tj->dirname));
7545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(dirname,&tj->dirname));
75564e38db7SHong Zhang   PetscFunctionReturn(0);
75664e38db7SHong Zhang }
75764e38db7SHong Zhang 
758db901c5bSHong Zhang /*@C
75964e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
76064e38db7SHong Zhang 
76164e38db7SHong Zhang    Collective on TSTrajectory
76264e38db7SHong Zhang 
7634165533cSJose E. Roman    Input Parameters:
76464e38db7SHong Zhang +  tj      - the TSTrajectory context
7651585b412SBarry Smith -  filetemplate - the template
76664e38db7SHong Zhang 
76764e38db7SHong Zhang    Options Database Keys:
7681585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
7691585b412SBarry Smith 
77095452b02SPatrick Sanan    Notes:
77195452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
7721585b412SBarry Smith 
7731585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
7741585b412SBarry Smith    timestep counter
77564e38db7SHong Zhang 
77664e38db7SHong Zhang    Level: developer
77764e38db7SHong Zhang 
7781585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
77964e38db7SHong Zhang @*/
78064e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
78164e38db7SHong Zhang {
7829afe7f3eSBarry Smith   const char     *ptr,*ptr2;
7839afe7f3eSBarry Smith 
78464e38db7SHong Zhang   PetscFunctionBegin;
78564e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
7863c633725SBarry Smith   PetscCheck(!tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
7879afe7f3eSBarry Smith 
7883c633725SBarry Smith   PetscCheck(filetemplate[0],PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
7899afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
7905f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrstr(filetemplate,"%",(char**)&ptr));
7913c633725SBarry Smith   PetscCheck(ptr,PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
7929afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
7935f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrchr("DdiouxX",*ptr,(char**)&ptr2));
7943c633725SBarry Smith     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-%%06D.bin");
7959afe7f3eSBarry Smith     if (ptr2) break;
7969afe7f3eSBarry Smith   }
7975f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(tj->filetemplate));
7985f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(filetemplate,&tj->filetemplate));
79964e38db7SHong Zhang   PetscFunctionReturn(0);
80064e38db7SHong Zhang }
80164e38db7SHong Zhang 
80264e38db7SHong Zhang /*@
803bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
804bc952696SBarry Smith 
805bc952696SBarry Smith    Collective on TSTrajectory
806bc952696SBarry Smith 
807d8d19677SJose E. Roman    Input Parameters:
8083c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
8093c0fce88SHong Zhang -  ts - the TS context
810bc952696SBarry Smith 
811bc952696SBarry Smith    Options Database Keys:
8123c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
81364fc91eeSBarry 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
814063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
815bc952696SBarry Smith 
816df5474d8SHong Zhang    Level: developer
817bc952696SBarry Smith 
81895452b02SPatrick Sanan    Notes:
81995452b02SPatrick Sanan     This is not normally called directly by users
820bc952696SBarry Smith 
8213c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
822bc952696SBarry Smith @*/
823972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
824bc952696SBarry Smith {
825ed695a29SHong Zhang   PetscBool      set,flg;
82664e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
82764e38db7SHong Zhang   PetscErrorCode ierr;
828bc952696SBarry Smith 
829bc952696SBarry Smith   PetscFunctionBegin;
830b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
831fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
832b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
8335f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts));
8345f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL));
8355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set));
8365f80ce2aSJacob Faibussowitsch   if (set) CHKERRQ(TSTrajectorySetMonitor(tj,flg));
8375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL));
8385f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL));
8395f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL));
8405f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL));
8415f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set));
8425f80ce2aSJacob Faibussowitsch   if (set) CHKERRQ(TSTrajectorySetKeepFiles(tj,flg));
84364e38db7SHong Zhang 
8445f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set));
84584a45834SBarry Smith   if (set) {
8465f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectorySetDirname(tj,dirname));
84784a45834SBarry Smith   }
84864e38db7SHong Zhang 
8495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set));
85064e38db7SHong Zhang   if (set) {
8515f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectorySetFiletemplate(tj,filetemplate));
85284a45834SBarry Smith   }
85364e38db7SHong Zhang 
85464e38db7SHong Zhang   /* Handle specific TSTrajectory options */
85562b521acSHong Zhang   if (tj->ops->setfromoptions) {
8565f80ce2aSJacob Faibussowitsch     CHKERRQ((*tj->ops->setfromoptions)(PetscOptionsObject,tj));
85762b521acSHong Zhang   }
858bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
859bc952696SBarry Smith   PetscFunctionReturn(0);
860bc952696SBarry Smith }
86168bece0bSHong Zhang 
86268bece0bSHong Zhang /*@
86368bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
86468bece0bSHong Zhang    of a TS trajectory.
86568bece0bSHong Zhang 
86668bece0bSHong Zhang    Collective on TS
86768bece0bSHong Zhang 
868d8d19677SJose E. Roman    Input Parameters:
8693c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
8703c0fce88SHong Zhang -  tj - the TS trajectory context
87168bece0bSHong Zhang 
872df5474d8SHong Zhang    Level: developer
87368bece0bSHong Zhang 
87468bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
87568bece0bSHong Zhang @*/
87668bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
87768bece0bSHong Zhang {
8789afe7f3eSBarry Smith   size_t         s1,s2;
87968bece0bSHong Zhang 
88068bece0bSHong Zhang   PetscFunctionBegin;
88168bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
88268bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
883fe8322adSStefano Zampini   if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2);
88468bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
88568bece0bSHong Zhang 
8865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0));
88768bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
8885f80ce2aSJacob Faibussowitsch     CHKERRQ(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC));
88968bece0bSHong Zhang   }
89068bece0bSHong Zhang   if (tj->ops->setup) {
8915f80ce2aSJacob Faibussowitsch     CHKERRQ((*tj->ops->setup)(tj,ts));
89268bece0bSHong Zhang   }
89368bece0bSHong Zhang 
89468bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
89553b27ddbSHong Zhang 
89653b27ddbSHong Zhang   /* Set the counters to zero */
8971a5a771fSHong Zhang   tj->recomps    = 0;
89853b27ddbSHong Zhang   tj->diskreads  = 0;
89953b27ddbSHong Zhang   tj->diskwrites = 0;
9005f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(tj->dirname,&s1));
9015f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(tj->filetemplate,&s2));
9025f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(tj->dirfiletemplate));
9035f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate));
9045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate));
9055f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0));
90668bece0bSHong Zhang   PetscFunctionReturn(0);
90768bece0bSHong Zhang }
908fe8322adSStefano Zampini 
909fe8322adSStefano Zampini /*@
910fe8322adSStefano Zampini    TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also.
911fe8322adSStefano Zampini 
912fe8322adSStefano Zampini    Collective on TSTrajectory
913fe8322adSStefano Zampini 
914d8d19677SJose E. Roman    Input Parameters:
915fe8322adSStefano Zampini +  tj  - the TS trajectory context
916fe8322adSStefano Zampini -  flg - the boolean flag
917fe8322adSStefano Zampini 
918fe8322adSStefano Zampini    Level: developer
919fe8322adSStefano Zampini 
920fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly()
921fe8322adSStefano Zampini @*/
922fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only)
923fe8322adSStefano Zampini {
924fe8322adSStefano Zampini   PetscFunctionBegin;
925fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
926fe8322adSStefano Zampini   PetscValidLogicalCollectiveBool(tj,solution_only,2);
927fe8322adSStefano Zampini   tj->solution_only = solution_only;
928fe8322adSStefano Zampini   PetscFunctionReturn(0);
929fe8322adSStefano Zampini }
930fe8322adSStefano Zampini 
931fe8322adSStefano Zampini /*@
932fe8322adSStefano Zampini    TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly.
933fe8322adSStefano Zampini 
934fe8322adSStefano Zampini    Logically collective on TSTrajectory
935fe8322adSStefano Zampini 
936fe8322adSStefano Zampini    Input Parameter:
937fe8322adSStefano Zampini .  tj  - the TS trajectory context
938fe8322adSStefano Zampini 
939fe8322adSStefano Zampini    Output Parameter:
940d8d19677SJose E. Roman .  flg - the boolean flag
941fe8322adSStefano Zampini 
942fe8322adSStefano Zampini    Level: developer
943fe8322adSStefano Zampini 
944fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly()
945fe8322adSStefano Zampini @*/
946fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only)
947fe8322adSStefano Zampini {
948fe8322adSStefano Zampini   PetscFunctionBegin;
949fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
950*dadcf809SJacob Faibussowitsch   PetscValidBoolPointer(solution_only,2);
951fe8322adSStefano Zampini   *solution_only = tj->solution_only;
952fe8322adSStefano Zampini   PetscFunctionReturn(0);
953fe8322adSStefano Zampini }
954fe8322adSStefano Zampini 
955fe8322adSStefano Zampini /*@
956fe8322adSStefano Zampini    TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors.
957fe8322adSStefano Zampini 
958fe8322adSStefano Zampini    Collective on TSTrajectory
959fe8322adSStefano Zampini 
960d8d19677SJose E. Roman    Input Parameters:
961fe8322adSStefano Zampini +  tj   - the TS trajectory context
962fe8322adSStefano Zampini .  ts   - the TS solver context
963fe8322adSStefano Zampini -  time - the requested time
964fe8322adSStefano Zampini 
965d8d19677SJose E. Roman    Output Parameters:
966fe8322adSStefano Zampini +  U    - state vector at given time (can be interpolated)
967fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
968fe8322adSStefano Zampini 
969fe8322adSStefano Zampini    Level: developer
970fe8322adSStefano Zampini 
971fe8322adSStefano 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.
972fe8322adSStefano Zampini           This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by
973fe8322adSStefano Zampini           calling TSTrajectoryRestoreUpdatedHistoryVecs().
974fe8322adSStefano Zampini 
975fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs()
976fe8322adSStefano Zampini @*/
977fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot)
978fe8322adSStefano Zampini {
979fe8322adSStefano Zampini   PetscFunctionBegin;
980fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
981fe8322adSStefano Zampini   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
982fe8322adSStefano Zampini   PetscValidLogicalCollectiveReal(tj,time,3);
983fe8322adSStefano Zampini   if (U) PetscValidPointer(U,4);
984fe8322adSStefano Zampini   if (Udot) PetscValidPointer(Udot,5);
985fe8322adSStefano Zampini   if (U && !tj->U) {
986fe8322adSStefano Zampini     DM dm;
987fe8322adSStefano Zampini 
9885f80ce2aSJacob Faibussowitsch     CHKERRQ(TSGetDM(ts,&dm));
9895f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateGlobalVector(dm,&tj->U));
990fe8322adSStefano Zampini   }
991fe8322adSStefano Zampini   if (Udot && !tj->Udot) {
992fe8322adSStefano Zampini     DM dm;
993fe8322adSStefano Zampini 
9945f80ce2aSJacob Faibussowitsch     CHKERRQ(TSGetDM(ts,&dm));
9955f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCreateGlobalVector(dm,&tj->Udot));
996fe8322adSStefano Zampini   }
9975f80ce2aSJacob Faibussowitsch   CHKERRQ(TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL));
998fe8322adSStefano Zampini   if (U) {
9995f80ce2aSJacob Faibussowitsch     CHKERRQ(VecLockReadPush(tj->U));
1000fe8322adSStefano Zampini     *U   = tj->U;
1001fe8322adSStefano Zampini   }
1002fe8322adSStefano Zampini   if (Udot) {
10035f80ce2aSJacob Faibussowitsch     CHKERRQ(VecLockReadPush(tj->Udot));
1004fe8322adSStefano Zampini     *Udot = tj->Udot;
1005fe8322adSStefano Zampini   }
1006fe8322adSStefano Zampini   PetscFunctionReturn(0);
1007fe8322adSStefano Zampini }
1008fe8322adSStefano Zampini 
1009fe8322adSStefano Zampini /*@
1010fe8322adSStefano Zampini    TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs().
1011fe8322adSStefano Zampini 
1012fe8322adSStefano Zampini    Collective on TSTrajectory
1013fe8322adSStefano Zampini 
1014d8d19677SJose E. Roman    Input Parameters:
1015fe8322adSStefano Zampini +  tj   - the TS trajectory context
1016fe8322adSStefano Zampini .  U    - state vector at given time (can be interpolated)
1017fe8322adSStefano Zampini -  Udot - time-derivative vector at given time (can be interpolated)
1018fe8322adSStefano Zampini 
1019fe8322adSStefano Zampini    Level: developer
1020fe8322adSStefano Zampini 
1021fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs()
1022fe8322adSStefano Zampini @*/
1023fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot)
1024fe8322adSStefano Zampini {
1025fe8322adSStefano Zampini   PetscFunctionBegin;
1026fe8322adSStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
1027fe8322adSStefano Zampini   if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2);
1028fe8322adSStefano Zampini   if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3);
10293c633725SBarry Smith   PetscCheck(!U || *U == tj->U,PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
10303c633725SBarry Smith   PetscCheck(!Udot || *Udot == tj->Udot,PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()");
1031fe8322adSStefano Zampini   if (U) {
10325f80ce2aSJacob Faibussowitsch     CHKERRQ(VecLockReadPop(tj->U));
1033fe8322adSStefano Zampini     *U   = NULL;
1034fe8322adSStefano Zampini   }
1035fe8322adSStefano Zampini   if (Udot) {
10365f80ce2aSJacob Faibussowitsch     CHKERRQ(VecLockReadPop(tj->Udot));
1037fe8322adSStefano Zampini     *Udot = NULL;
1038fe8322adSStefano Zampini   }
1039fe8322adSStefano Zampini   PetscFunctionReturn(0);
1040fe8322adSStefano Zampini }
1041