xref: /petsc/src/ts/trajectory/interface/traj.c (revision 1550c9b98ed21cfb2c630bd3cd398012499560df)
1bc952696SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3bc952696SBarry Smith 
4bc952696SBarry Smith PetscFunctionList TSTrajectoryList              = NULL;
5bc952696SBarry Smith PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
6bc952696SBarry Smith PetscClassId      TSTRAJECTORY_CLASSID;
7d0d044f3SHong Zhang PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get;
8bc952696SBarry Smith 
9bc952696SBarry Smith /*@C
10bc952696SBarry Smith   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
11bc952696SBarry Smith 
12bc952696SBarry Smith   Not Collective
13bc952696SBarry Smith 
14bc952696SBarry Smith   Input Parameters:
153c0fce88SHong Zhang + name        - the name of a new user-defined creation routine
163c0fce88SHong Zhang - create_func - the creation routine itself
17bc952696SBarry Smith 
18bc952696SBarry Smith   Notes:
19bc952696SBarry Smith   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
20bc952696SBarry Smith 
21df5474d8SHong Zhang   Level: developer
22bc952696SBarry Smith 
233c0fce88SHong Zhang .keywords: TS, trajectory, timestep, register
24bc952696SBarry Smith 
253c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll()
26bc952696SBarry Smith @*/
27972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
28bc952696SBarry Smith {
29bc952696SBarry Smith   PetscErrorCode ierr;
30bc952696SBarry Smith 
31bc952696SBarry Smith   PetscFunctionBegin;
32bc952696SBarry Smith   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
33bc952696SBarry Smith   PetscFunctionReturn(0);
34bc952696SBarry Smith }
35bc952696SBarry Smith 
36bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
37bc952696SBarry Smith {
38bc952696SBarry Smith   PetscErrorCode ierr;
39bc952696SBarry Smith 
40bc952696SBarry Smith   PetscFunctionBegin;
41bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
42d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
43bc952696SBarry Smith   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
44d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
45bc952696SBarry Smith   PetscFunctionReturn(0);
46bc952696SBarry Smith }
47bc952696SBarry Smith 
48c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
49bc952696SBarry Smith {
50bc952696SBarry Smith   PetscErrorCode ierr;
51bc952696SBarry Smith 
52bc952696SBarry Smith   PetscFunctionBegin;
53bc952696SBarry Smith   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
5411e1d5c3SBarry Smith   if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
55d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
56bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
57d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
58bc952696SBarry Smith   PetscFunctionReturn(0);
59bc952696SBarry Smith }
60bc952696SBarry Smith 
61bc952696SBarry Smith /*@C
62bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
63bc952696SBarry Smith 
64bc952696SBarry Smith     Collective on TSTrajectory
65bc952696SBarry Smith 
66bc952696SBarry Smith     Input Parameters:
67b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
68bc952696SBarry Smith -   viewer - visualization context
69bc952696SBarry Smith 
70bc952696SBarry Smith     Options Database Key:
71e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
72bc952696SBarry Smith 
73bc952696SBarry Smith     Notes:
74bc952696SBarry Smith     The available visualization contexts include
75bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
76bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
77bc952696SBarry Smith          output where only the first processor opens
78bc952696SBarry Smith          the file.  All other processors send their
79bc952696SBarry Smith          data to the first processor to print.
80bc952696SBarry Smith 
81bc952696SBarry Smith     The user can open an alternative visualization context with
82bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
83bc952696SBarry Smith 
84df5474d8SHong Zhang     Level: developer
85bc952696SBarry Smith 
863c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view
87bc952696SBarry Smith 
88bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
89bc952696SBarry Smith @*/
90b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
91bc952696SBarry Smith {
92bc952696SBarry Smith   PetscErrorCode ierr;
93bc952696SBarry Smith   PetscBool      iascii;
94bc952696SBarry Smith 
95bc952696SBarry Smith   PetscFunctionBegin;
961a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
97bc952696SBarry Smith   if (!viewer) {
98b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
99bc952696SBarry Smith   }
100bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
101b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
102bc952696SBarry Smith 
103bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
104bc952696SBarry Smith   if (iascii) {
105b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
1061a5a771fSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
10753b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
10853b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
109b1d74d50SHong Zhang     if (tj->ops->view) {
110285336bfSHong Zhang       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
111b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
112285336bfSHong Zhang       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
113bc952696SBarry Smith     }
114bc952696SBarry Smith   }
115bc952696SBarry Smith   PetscFunctionReturn(0);
116bc952696SBarry Smith }
117bc952696SBarry Smith 
118bc952696SBarry Smith /*@C
11978fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
12078fbdcc8SBarry Smith 
12178fbdcc8SBarry Smith    Collective on TSTrajectory
12278fbdcc8SBarry Smith 
12378fbdcc8SBarry Smith    Input Parameters:
12478fbdcc8SBarry Smith +  tr - the trajectory context
12578fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
12678fbdcc8SBarry Smith 
12778fbdcc8SBarry Smith    Level: intermediate
12878fbdcc8SBarry Smith 
129db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
130db901c5bSHong Zhang 
13178fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view
13278fbdcc8SBarry Smith 
13378fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
13478fbdcc8SBarry Smith @*/
13578fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
13678fbdcc8SBarry Smith {
13778fbdcc8SBarry Smith   PetscErrorCode    ierr;
13878fbdcc8SBarry Smith 
13978fbdcc8SBarry Smith   PetscFunctionBegin;
14078fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
14178fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
14278fbdcc8SBarry Smith   PetscFunctionReturn(0);
14378fbdcc8SBarry Smith }
14478fbdcc8SBarry Smith 
14578fbdcc8SBarry Smith /*@C
14608347785SBarry Smith    TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk
14708347785SBarry Smith 
14808347785SBarry Smith    Collective on TSLGCtx
14908347785SBarry Smith 
15008347785SBarry Smith    Input Parameters:
15108347785SBarry Smith +  tj - the TSTrajectory context
15208347785SBarry Smith .  transform - the transform function
15308347785SBarry Smith .  destroy - function to destroy the optional context
15408347785SBarry Smith -  ctx - optional context used by transform function
15508347785SBarry Smith 
15608347785SBarry Smith    Level: intermediate
15708347785SBarry Smith 
15808347785SBarry Smith .keywords: TSTrajectory,  vector, monitor, view
15908347785SBarry Smith 
16008347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
16108347785SBarry Smith @*/
16208347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
16308347785SBarry Smith {
16408347785SBarry Smith   PetscFunctionBegin;
16508347785SBarry Smith   tj->transform        = transform;
16608347785SBarry Smith   tj->transformdestroy = destroy;
16708347785SBarry Smith   tj->transformctx     = tctx;
16808347785SBarry Smith   PetscFunctionReturn(0);
16908347785SBarry Smith }
17008347785SBarry Smith 
17108347785SBarry Smith 
172db901c5bSHong Zhang /*@
173bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
174bc952696SBarry Smith 
175bc952696SBarry Smith   Collective on MPI_Comm
176bc952696SBarry Smith 
177bc952696SBarry Smith   Input Parameter:
1783c0fce88SHong Zhang . comm - the communicator
179bc952696SBarry Smith 
180bc952696SBarry Smith   Output Parameter:
1813c0fce88SHong Zhang . tj   - the trajectory object
182bc952696SBarry Smith 
183df5474d8SHong Zhang   Level: developer
184bc952696SBarry Smith 
18595452b02SPatrick Sanan   Notes:
18695452b02SPatrick Sanan     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
187bc952696SBarry Smith 
1883c0fce88SHong Zhang .keywords: TS, trajectory, create
1893c0fce88SHong Zhang 
19064fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
191bc952696SBarry Smith @*/
192b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
193bc952696SBarry Smith {
194bc952696SBarry Smith   TSTrajectory   t;
195bc952696SBarry Smith   PetscErrorCode ierr;
196bc952696SBarry Smith 
197bc952696SBarry Smith   PetscFunctionBegin;
198b1d74d50SHong Zhang   PetscValidPointer(tj,2);
199b1d74d50SHong Zhang   *tj = NULL;
200bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
201bc952696SBarry Smith 
20273107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
20368bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
20464fc91eeSBarry Smith   t->keepfiles   = PETSC_TRUE;
205b1d74d50SHong Zhang   *tj  = t;
20684a45834SBarry Smith   ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr);
207e94726ebSBarry Smith   ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr);
208bc952696SBarry Smith   PetscFunctionReturn(0);
209bc952696SBarry Smith }
210bc952696SBarry Smith 
211bc952696SBarry Smith /*@C
212bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
213bc952696SBarry Smith 
214bc952696SBarry Smith   Collective on TS
215bc952696SBarry Smith 
216bc952696SBarry Smith   Input Parameters:
2173c0fce88SHong Zhang + tj   - the TSTrajectory context
2183c0fce88SHong Zhang . ts   - the TS context
2193c0fce88SHong Zhang - type - a known method
220bc952696SBarry Smith 
221bc952696SBarry Smith   Options Database Command:
222e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
223bc952696SBarry Smith 
224df5474d8SHong Zhang    Level: developer
225bc952696SBarry Smith 
2263c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
227bc952696SBarry Smith 
2283c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
229bc952696SBarry Smith 
230bc952696SBarry Smith @*/
231fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
232bc952696SBarry Smith {
233972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
234bc952696SBarry Smith   PetscBool      match;
235bc952696SBarry Smith   PetscErrorCode ierr;
236bc952696SBarry Smith 
237bc952696SBarry Smith   PetscFunctionBegin;
238972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
239972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
240bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
241bc952696SBarry Smith 
242bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
243bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
244972caf09SHong Zhang   if (tj->ops->destroy) {
245972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
246bc952696SBarry Smith 
247972caf09SHong Zhang     tj->ops->destroy = NULL;
248bc952696SBarry Smith   }
249972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
250bc952696SBarry Smith 
251972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
252972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
253bc952696SBarry Smith   PetscFunctionReturn(0);
254bc952696SBarry Smith }
255bc952696SBarry Smith 
256972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
257972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2589a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
2592b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
260bc952696SBarry Smith 
261bc952696SBarry Smith /*@C
262bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
263bc952696SBarry Smith 
264bc952696SBarry Smith   Not Collective
265bc952696SBarry Smith 
266df5474d8SHong Zhang   Level: developer
267bc952696SBarry Smith 
2683c0fce88SHong Zhang .keywords: TS, trajectory, register, all
2693c0fce88SHong Zhang 
2703c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
271bc952696SBarry Smith @*/
272bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
273bc952696SBarry Smith {
274bc952696SBarry Smith   PetscErrorCode ierr;
275bc952696SBarry Smith 
276bc952696SBarry Smith   PetscFunctionBegin;
277560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
278bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
279bc952696SBarry Smith 
280bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2811c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2829a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
2832b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
284bc952696SBarry Smith   PetscFunctionReturn(0);
285bc952696SBarry Smith }
286bc952696SBarry Smith 
287bc952696SBarry Smith /*@
288*1550c9b9SHong Zhang    TSTrajectoryReset - Resets a trajectory context
289*1550c9b9SHong Zhang 
290*1550c9b9SHong Zhang    Collective on TSTrajectory
291*1550c9b9SHong Zhang 
292*1550c9b9SHong Zhang    Input Parameter:
293*1550c9b9SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
294*1550c9b9SHong Zhang 
295*1550c9b9SHong Zhang    Level: developer
296*1550c9b9SHong Zhang 
297*1550c9b9SHong Zhang .keywords: TS, trajectory, timestep, reset
298*1550c9b9SHong Zhang 
299*1550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
300*1550c9b9SHong Zhang @*/
301*1550c9b9SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory *tj)
302*1550c9b9SHong Zhang {
303*1550c9b9SHong Zhang   PetscErrorCode ierr;
304*1550c9b9SHong Zhang 
305*1550c9b9SHong Zhang   PetscFunctionBegin;
306*1550c9b9SHong Zhang   if (!*tj) PetscFunctionReturn(0);
307*1550c9b9SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
308*1550c9b9SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
309*1550c9b9SHong Zhang   if ((*tj)->ops->reset) {ierr = (*(*tj)->ops->reset)((*tj));CHKERRQ(ierr);}
310*1550c9b9SHong Zhang   (*tj)->setupcalled = PETSC_FALSE;
311*1550c9b9SHong Zhang   PetscFunctionReturn(0);
312*1550c9b9SHong Zhang }
313*1550c9b9SHong Zhang 
314*1550c9b9SHong Zhang /*@
315bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
316bc952696SBarry Smith 
317bc952696SBarry Smith    Collective on TSTrajectory
318bc952696SBarry Smith 
319bc952696SBarry Smith    Input Parameter:
3203c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
321bc952696SBarry Smith 
322df5474d8SHong Zhang    Level: developer
323bc952696SBarry Smith 
3243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
325bc952696SBarry Smith 
3263c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
327bc952696SBarry Smith @*/
328972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
329bc952696SBarry Smith {
330bc952696SBarry Smith   PetscErrorCode ierr;
331bc952696SBarry Smith 
332bc952696SBarry Smith   PetscFunctionBegin;
333972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
334972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
335972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
336bc952696SBarry Smith 
3377f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
338972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
339aced365eSHong Zhang   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
34078fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
34164e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
34264e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
3439afe7f3eSBarry Smith   ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr);
344972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
345bc952696SBarry Smith   PetscFunctionReturn(0);
346bc952696SBarry Smith }
347bc952696SBarry Smith 
348bc952696SBarry Smith /*
349772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
350bc952696SBarry Smith 
351bc952696SBarry Smith   Collective on TSTrajectory
352bc952696SBarry Smith 
353bc952696SBarry Smith   Input Parameter:
3543c0fce88SHong Zhang + tj - the TSTrajectory context
3553c0fce88SHong Zhang - ts - the TS context
3563c0fce88SHong Zhang 
3573c0fce88SHong Zhang   Options Database Keys:
3583c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
359bc952696SBarry Smith 
360df5474d8SHong Zhang   Level: developer
361bc952696SBarry Smith 
3623c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
3633c0fce88SHong Zhang 
3643c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
365bc952696SBarry Smith */
3662bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
367bc952696SBarry Smith {
368bc952696SBarry Smith   PetscBool      opt;
369bc952696SBarry Smith   const char     *defaultType;
370bc952696SBarry Smith   char           typeName[256];
3719a53571cSHong Zhang   PetscBool      flg;
372bc952696SBarry Smith   PetscErrorCode ierr;
373bc952696SBarry Smith 
374bc952696SBarry Smith   PetscFunctionBegin;
375b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
376bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
377bc952696SBarry Smith 
378560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
379e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
380bc952696SBarry Smith   if (opt) {
381f416af30SBarry Smith     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
382972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
383bc952696SBarry Smith   } else {
384972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
385bc952696SBarry Smith   }
386bc952696SBarry Smith   PetscFunctionReturn(0);
387bc952696SBarry Smith }
388bc952696SBarry Smith 
389ed695a29SHong Zhang /*@
390ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
391ed695a29SHong Zhang 
392ed695a29SHong Zhang    Collective on TSTrajectory
393ed695a29SHong Zhang 
394ed695a29SHong Zhang    Input Arguments:
395ed695a29SHong Zhang +  tj - the TSTrajectory context
396ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
397ed695a29SHong Zhang 
3983c0fce88SHong Zhang    Options Database Keys:
399063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
4003c0fce88SHong Zhang 
401df5474d8SHong Zhang    Level: developer
402ed695a29SHong Zhang 
4033c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
4043c0fce88SHong Zhang 
4053c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
406ed695a29SHong Zhang @*/
4072bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
408ed695a29SHong Zhang {
409ed695a29SHong Zhang   PetscErrorCode ierr;
410ed695a29SHong Zhang 
411ed695a29SHong Zhang   PetscFunctionBegin;
412ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
413ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
414ed695a29SHong Zhang   if (flg) {
415ed695a29SHong Zhang     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
416ed695a29SHong Zhang   } else {
417ed695a29SHong Zhang     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
418ed695a29SHong Zhang   }
419ed695a29SHong Zhang   PetscFunctionReturn(0);
420ed695a29SHong Zhang }
421ed695a29SHong Zhang 
422bc952696SBarry Smith /*@
42364fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
42464fc91eeSBarry Smith 
42564fc91eeSBarry Smith    Collective on TSTrajectory
42664fc91eeSBarry Smith 
42764fc91eeSBarry Smith    Input Arguments:
42864fc91eeSBarry Smith +  tj - the TSTrajectory context
42964fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
43064fc91eeSBarry Smith 
43164fc91eeSBarry Smith    Options Database Keys:
43264fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
43364fc91eeSBarry Smith 
43495452b02SPatrick Sanan    Notes:
43595452b02SPatrick 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.
43664fc91eeSBarry Smith 
43764fc91eeSBarry Smith    Level: advanced
43864fc91eeSBarry Smith 
43964fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor
44064fc91eeSBarry Smith 
44164fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
44264fc91eeSBarry Smith @*/
44364fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
44464fc91eeSBarry Smith {
44564fc91eeSBarry Smith   PetscFunctionBegin;
44664fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
44764fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
44864fc91eeSBarry Smith   tj->keepfiles = flg;
44964fc91eeSBarry Smith   PetscFunctionReturn(0);
45064fc91eeSBarry Smith }
45164fc91eeSBarry Smith 
452db901c5bSHong Zhang /*@C
45364e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
45464e38db7SHong Zhang 
45564e38db7SHong Zhang    Collective on TSTrajectory
45664e38db7SHong Zhang 
45764e38db7SHong Zhang    Input Arguments:
45864e38db7SHong Zhang +  tj      - the TSTrajectory context
45964e38db7SHong Zhang -  dirname - the directory name
46064e38db7SHong Zhang 
46164e38db7SHong Zhang    Options Database Keys:
46264e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
46364e38db7SHong Zhang 
46495452b02SPatrick Sanan    Notes:
46595452b02SPatrick Sanan     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
4661585b412SBarry Smith 
46764e38db7SHong Zhang    Level: developer
46864e38db7SHong Zhang 
46964e38db7SHong Zhang .keywords: TS, trajectory, set
47064e38db7SHong Zhang 
47164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
47264e38db7SHong Zhang @*/
47364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
47464e38db7SHong Zhang {
47564e38db7SHong Zhang   PetscErrorCode ierr;
47664e38db7SHong Zhang   PetscFunctionBegin;
47764e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4789afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup");
47984a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
48064e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
48164e38db7SHong Zhang   PetscFunctionReturn(0);
48264e38db7SHong Zhang }
48364e38db7SHong Zhang 
484db901c5bSHong Zhang /*@C
48564e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
48664e38db7SHong Zhang 
48764e38db7SHong Zhang    Collective on TSTrajectory
48864e38db7SHong Zhang 
48964e38db7SHong Zhang    Input Arguments:
49064e38db7SHong Zhang +  tj      - the TSTrajectory context
4911585b412SBarry Smith -  filetemplate - the template
49264e38db7SHong Zhang 
49364e38db7SHong Zhang    Options Database Keys:
4941585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
4951585b412SBarry Smith 
49695452b02SPatrick Sanan    Notes:
49795452b02SPatrick Sanan     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
4981585b412SBarry Smith 
4991585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
5001585b412SBarry Smith    timestep counter
50164e38db7SHong Zhang 
50264e38db7SHong Zhang    Level: developer
50364e38db7SHong Zhang 
50464e38db7SHong Zhang .keywords: TS, trajectory, set
50564e38db7SHong Zhang 
5061585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
50764e38db7SHong Zhang @*/
50864e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
50964e38db7SHong Zhang {
51064e38db7SHong Zhang   PetscErrorCode ierr;
5119afe7f3eSBarry Smith   const char     *ptr,*ptr2;
5129afe7f3eSBarry Smith 
51364e38db7SHong Zhang   PetscFunctionBegin;
51464e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
5159afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
5169afe7f3eSBarry Smith 
5179afe7f3eSBarry Smith   if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
5189afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
5199afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
5209afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
5219afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
5229afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
5239afe7f3eSBarry Smith     if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06D.bin");
5249afe7f3eSBarry Smith     if (ptr2) break;
5259afe7f3eSBarry Smith   }
52684a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
52764e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
52864e38db7SHong Zhang   PetscFunctionReturn(0);
52964e38db7SHong Zhang }
53064e38db7SHong Zhang 
53164e38db7SHong Zhang /*@
532bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
533bc952696SBarry Smith 
534bc952696SBarry Smith    Collective on TSTrajectory
535bc952696SBarry Smith 
536bc952696SBarry Smith    Input Parameter:
5373c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5383c0fce88SHong Zhang -  ts - the TS context
539bc952696SBarry Smith 
540bc952696SBarry Smith    Options Database Keys:
5413c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
54264fc91eeSBarry 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
543063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
544bc952696SBarry Smith 
545df5474d8SHong Zhang    Level: developer
546bc952696SBarry Smith 
54795452b02SPatrick Sanan    Notes:
54895452b02SPatrick Sanan     This is not normally called directly by users
549bc952696SBarry Smith 
5503c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
551bc952696SBarry Smith 
5523c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
553bc952696SBarry Smith @*/
554972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
555bc952696SBarry Smith {
556ed695a29SHong Zhang   PetscBool      set,flg;
55764e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
55864e38db7SHong Zhang   PetscErrorCode ierr;
559bc952696SBarry Smith 
560bc952696SBarry Smith   PetscFunctionBegin;
561b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
562972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
563b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
564972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
565ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
566aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
56764e38db7SHong Zhang 
56864fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
56964fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
57064e38db7SHong Zhang 
57164e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
57284a45834SBarry Smith   if (set) {
57364e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
57484a45834SBarry Smith   }
57564e38db7SHong Zhang 
5761585b412SBarry Smith   ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr);
57764e38db7SHong Zhang   if (set) {
5781585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
57984a45834SBarry Smith   }
58064e38db7SHong Zhang 
58164e38db7SHong Zhang   /* Handle specific TSTrajectory options */
58262b521acSHong Zhang   if (tj->ops->setfromoptions) {
58362b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
58462b521acSHong Zhang   }
585bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
586bc952696SBarry Smith   PetscFunctionReturn(0);
587bc952696SBarry Smith }
58868bece0bSHong Zhang 
58968bece0bSHong Zhang /*@
59068bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
59168bece0bSHong Zhang    of a TS trajectory.
59268bece0bSHong Zhang 
59368bece0bSHong Zhang    Collective on TS
59468bece0bSHong Zhang 
59568bece0bSHong Zhang    Input Parameter:
5963c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
5973c0fce88SHong Zhang -  tj - the TS trajectory context
59868bece0bSHong Zhang 
599df5474d8SHong Zhang    Level: developer
60068bece0bSHong Zhang 
6013c0fce88SHong Zhang .keywords: TS, trajectory, setup
60268bece0bSHong Zhang 
60368bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
60468bece0bSHong Zhang @*/
60568bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
60668bece0bSHong Zhang {
60768bece0bSHong Zhang   PetscErrorCode ierr;
6089afe7f3eSBarry Smith   size_t         s1,s2;
60968bece0bSHong Zhang 
61068bece0bSHong Zhang   PetscFunctionBegin;
61168bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
61268bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
61368bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
61468bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
61568bece0bSHong Zhang 
61668bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
61768bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
61868bece0bSHong Zhang   }
61968bece0bSHong Zhang   if (tj->ops->setup) {
62068bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
62168bece0bSHong Zhang   }
62268bece0bSHong Zhang 
62368bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
62453b27ddbSHong Zhang 
62553b27ddbSHong Zhang   /* Set the counters to zero */
6261a5a771fSHong Zhang   tj->recomps    = 0;
62753b27ddbSHong Zhang   tj->diskreads  = 0;
62853b27ddbSHong Zhang   tj->diskwrites = 0;
6299afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
6309afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
63111e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
63211e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
63368bece0bSHong Zhang   PetscFunctionReturn(0);
63468bece0bSHong Zhang }
635