xref: /petsc/src/ts/trajectory/interface/traj.c (revision fd9d3c6761d5b873eb5652a7f5c27b042621df3a)
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 
1853c0fce88SHong Zhang   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
186bc952696SBarry Smith 
1873c0fce88SHong Zhang .keywords: TS, trajectory, create
1883c0fce88SHong Zhang 
18964fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
190bc952696SBarry Smith @*/
191b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
192bc952696SBarry Smith {
193bc952696SBarry Smith   TSTrajectory   t;
194bc952696SBarry Smith   PetscErrorCode ierr;
195bc952696SBarry Smith 
196bc952696SBarry Smith   PetscFunctionBegin;
197b1d74d50SHong Zhang   PetscValidPointer(tj,2);
198b1d74d50SHong Zhang   *tj = NULL;
199bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
200bc952696SBarry Smith 
20173107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
20268bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
20364fc91eeSBarry Smith   t->keepfiles   = PETSC_TRUE;
204b1d74d50SHong Zhang   *tj  = t;
20584a45834SBarry Smith   ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr);
206e94726ebSBarry Smith   ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr);
207bc952696SBarry Smith   PetscFunctionReturn(0);
208bc952696SBarry Smith }
209bc952696SBarry Smith 
210bc952696SBarry Smith /*@C
211bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
212bc952696SBarry Smith 
213bc952696SBarry Smith   Collective on TS
214bc952696SBarry Smith 
215bc952696SBarry Smith   Input Parameters:
2163c0fce88SHong Zhang + tj   - the TSTrajectory context
2173c0fce88SHong Zhang . ts   - the TS context
2183c0fce88SHong Zhang - type - a known method
219bc952696SBarry Smith 
220bc952696SBarry Smith   Options Database Command:
221e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
222bc952696SBarry Smith 
223df5474d8SHong Zhang    Level: developer
224bc952696SBarry Smith 
2253c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
226bc952696SBarry Smith 
2273c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
228bc952696SBarry Smith 
229bc952696SBarry Smith @*/
230*fd9d3c67SJed Brown PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
231bc952696SBarry Smith {
232972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
233bc952696SBarry Smith   PetscBool      match;
234bc952696SBarry Smith   PetscErrorCode ierr;
235bc952696SBarry Smith 
236bc952696SBarry Smith   PetscFunctionBegin;
237972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
238972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
239bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
240bc952696SBarry Smith 
241bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
242bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
243972caf09SHong Zhang   if (tj->ops->destroy) {
244972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
245bc952696SBarry Smith 
246972caf09SHong Zhang     tj->ops->destroy = NULL;
247bc952696SBarry Smith   }
248972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
249bc952696SBarry Smith 
250972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
251972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
252bc952696SBarry Smith   PetscFunctionReturn(0);
253bc952696SBarry Smith }
254bc952696SBarry Smith 
255972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
256972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2579a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
2582b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
259bc952696SBarry Smith 
260bc952696SBarry Smith /*@C
261bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
262bc952696SBarry Smith 
263bc952696SBarry Smith   Not Collective
264bc952696SBarry Smith 
265df5474d8SHong Zhang   Level: developer
266bc952696SBarry Smith 
2673c0fce88SHong Zhang .keywords: TS, trajectory, register, all
2683c0fce88SHong Zhang 
2693c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
270bc952696SBarry Smith @*/
271bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
272bc952696SBarry Smith {
273bc952696SBarry Smith   PetscErrorCode ierr;
274bc952696SBarry Smith 
275bc952696SBarry Smith   PetscFunctionBegin;
276560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
277bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
278bc952696SBarry Smith 
279bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2801c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2819a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
2822b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
283bc952696SBarry Smith   PetscFunctionReturn(0);
284bc952696SBarry Smith }
285bc952696SBarry Smith 
286bc952696SBarry Smith /*@
287bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
288bc952696SBarry Smith 
289bc952696SBarry Smith    Collective on TSTrajectory
290bc952696SBarry Smith 
291bc952696SBarry Smith    Input Parameter:
2923c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
293bc952696SBarry Smith 
294df5474d8SHong Zhang    Level: developer
295bc952696SBarry Smith 
2963c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
297bc952696SBarry Smith 
2983c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
299bc952696SBarry Smith @*/
300972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
301bc952696SBarry Smith {
302bc952696SBarry Smith   PetscErrorCode ierr;
303bc952696SBarry Smith 
304bc952696SBarry Smith   PetscFunctionBegin;
305972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
306972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
307972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
308bc952696SBarry Smith 
3097f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
310972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
311aced365eSHong Zhang   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
31278fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
31364e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
31464e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
3159afe7f3eSBarry Smith   ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr);
316972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
317bc952696SBarry Smith   PetscFunctionReturn(0);
318bc952696SBarry Smith }
319bc952696SBarry Smith 
320bc952696SBarry Smith /*
321772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
322bc952696SBarry Smith 
323bc952696SBarry Smith   Collective on TSTrajectory
324bc952696SBarry Smith 
325bc952696SBarry Smith   Input Parameter:
3263c0fce88SHong Zhang + tj - the TSTrajectory context
3273c0fce88SHong Zhang - ts - the TS context
3283c0fce88SHong Zhang 
3293c0fce88SHong Zhang   Options Database Keys:
3303c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
331bc952696SBarry Smith 
332df5474d8SHong Zhang   Level: developer
333bc952696SBarry Smith 
3343c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
3353c0fce88SHong Zhang 
3363c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
337bc952696SBarry Smith */
3382bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
339bc952696SBarry Smith {
340bc952696SBarry Smith   PetscBool      opt;
341bc952696SBarry Smith   const char     *defaultType;
342bc952696SBarry Smith   char           typeName[256];
3439a53571cSHong Zhang   PetscBool      flg;
344bc952696SBarry Smith   PetscErrorCode ierr;
345bc952696SBarry Smith 
346bc952696SBarry Smith   PetscFunctionBegin;
347b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
348bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
349bc952696SBarry Smith 
350560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
351e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
352bc952696SBarry Smith   if (opt) {
353f416af30SBarry Smith     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
354972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
355bc952696SBarry Smith   } else {
356972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
357bc952696SBarry Smith   }
358bc952696SBarry Smith   PetscFunctionReturn(0);
359bc952696SBarry Smith }
360bc952696SBarry Smith 
361ed695a29SHong Zhang /*@
362ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
363ed695a29SHong Zhang 
364ed695a29SHong Zhang    Collective on TSTrajectory
365ed695a29SHong Zhang 
366ed695a29SHong Zhang    Input Arguments:
367ed695a29SHong Zhang +  tj - the TSTrajectory context
368ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
369ed695a29SHong Zhang 
3703c0fce88SHong Zhang    Options Database Keys:
371063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
3723c0fce88SHong Zhang 
373df5474d8SHong Zhang    Level: developer
374ed695a29SHong Zhang 
3753c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
3763c0fce88SHong Zhang 
3773c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
378ed695a29SHong Zhang @*/
3792bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
380ed695a29SHong Zhang {
381ed695a29SHong Zhang   PetscErrorCode ierr;
382ed695a29SHong Zhang 
383ed695a29SHong Zhang   PetscFunctionBegin;
384ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
385ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
386ed695a29SHong Zhang   if (flg) {
387ed695a29SHong Zhang     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
388ed695a29SHong Zhang   } else {
389ed695a29SHong Zhang     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
390ed695a29SHong Zhang   }
391ed695a29SHong Zhang   PetscFunctionReturn(0);
392ed695a29SHong Zhang }
393ed695a29SHong Zhang 
394bc952696SBarry Smith /*@
39564fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
39664fc91eeSBarry Smith 
39764fc91eeSBarry Smith    Collective on TSTrajectory
39864fc91eeSBarry Smith 
39964fc91eeSBarry Smith    Input Arguments:
40064fc91eeSBarry Smith +  tj - the TSTrajectory context
40164fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
40264fc91eeSBarry Smith 
40364fc91eeSBarry Smith    Options Database Keys:
40464fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
40564fc91eeSBarry Smith 
40664fc91eeSBarry Smith    Notes: 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.
40764fc91eeSBarry Smith 
40864fc91eeSBarry Smith    Level: advanced
40964fc91eeSBarry Smith 
41064fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor
41164fc91eeSBarry Smith 
41264fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
41364fc91eeSBarry Smith @*/
41464fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
41564fc91eeSBarry Smith {
41664fc91eeSBarry Smith   PetscFunctionBegin;
41764fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
41864fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
41964fc91eeSBarry Smith   tj->keepfiles = flg;
42064fc91eeSBarry Smith   PetscFunctionReturn(0);
42164fc91eeSBarry Smith }
42264fc91eeSBarry Smith 
423db901c5bSHong Zhang /*@C
42464e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
42564e38db7SHong Zhang 
42664e38db7SHong Zhang    Collective on TSTrajectory
42764e38db7SHong Zhang 
42864e38db7SHong Zhang    Input Arguments:
42964e38db7SHong Zhang +  tj      - the TSTrajectory context
43064e38db7SHong Zhang -  dirname - the directory name
43164e38db7SHong Zhang 
43264e38db7SHong Zhang    Options Database Keys:
43364e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
43464e38db7SHong Zhang 
4351585b412SBarry Smith    Notes: The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
4361585b412SBarry Smith 
43764e38db7SHong Zhang    Level: developer
43864e38db7SHong Zhang 
43964e38db7SHong Zhang .keywords: TS, trajectory, set
44064e38db7SHong Zhang 
44164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
44264e38db7SHong Zhang @*/
44364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
44464e38db7SHong Zhang {
44564e38db7SHong Zhang   PetscErrorCode ierr;
44664e38db7SHong Zhang   PetscFunctionBegin;
44764e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4489afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup");
44984a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
45064e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
45164e38db7SHong Zhang   PetscFunctionReturn(0);
45264e38db7SHong Zhang }
45364e38db7SHong Zhang 
454db901c5bSHong Zhang /*@C
45564e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
45664e38db7SHong Zhang 
45764e38db7SHong Zhang    Collective on TSTrajectory
45864e38db7SHong Zhang 
45964e38db7SHong Zhang    Input Arguments:
46064e38db7SHong Zhang +  tj      - the TSTrajectory context
4611585b412SBarry Smith -  filetemplate - the template
46264e38db7SHong Zhang 
46364e38db7SHong Zhang    Options Database Keys:
4641585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
4651585b412SBarry Smith 
466e94726ebSBarry Smith    Notes: The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
4671585b412SBarry Smith 
4681585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
4691585b412SBarry Smith    timestep counter
47064e38db7SHong Zhang 
47164e38db7SHong Zhang    Level: developer
47264e38db7SHong Zhang 
47364e38db7SHong Zhang .keywords: TS, trajectory, set
47464e38db7SHong Zhang 
4751585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
47664e38db7SHong Zhang @*/
47764e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
47864e38db7SHong Zhang {
47964e38db7SHong Zhang   PetscErrorCode ierr;
4809afe7f3eSBarry Smith   const char     *ptr,*ptr2;
4819afe7f3eSBarry Smith 
48264e38db7SHong Zhang   PetscFunctionBegin;
48364e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4849afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
4859afe7f3eSBarry Smith 
4869afe7f3eSBarry 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");
4879afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
4889afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
4899afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
4909afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
4919afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
4929afe7f3eSBarry 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");
4939afe7f3eSBarry Smith     if (ptr2) break;
4949afe7f3eSBarry Smith   }
49584a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
49664e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
49764e38db7SHong Zhang   PetscFunctionReturn(0);
49864e38db7SHong Zhang }
49964e38db7SHong Zhang 
50064e38db7SHong Zhang /*@
501bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
502bc952696SBarry Smith 
503bc952696SBarry Smith    Collective on TSTrajectory
504bc952696SBarry Smith 
505bc952696SBarry Smith    Input Parameter:
5063c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5073c0fce88SHong Zhang -  ts - the TS context
508bc952696SBarry Smith 
509bc952696SBarry Smith    Options Database Keys:
5103c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
51164fc91eeSBarry 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
512063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
513bc952696SBarry Smith 
514df5474d8SHong Zhang    Level: developer
515bc952696SBarry Smith 
51662b521acSHong Zhang    Notes: This is not normally called directly by users
517bc952696SBarry Smith 
5183c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
519bc952696SBarry Smith 
5203c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
521bc952696SBarry Smith @*/
522972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
523bc952696SBarry Smith {
524ed695a29SHong Zhang   PetscBool      set,flg;
52564e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
52664e38db7SHong Zhang   PetscErrorCode ierr;
527bc952696SBarry Smith 
528bc952696SBarry Smith   PetscFunctionBegin;
529b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
530972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
531b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
532972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
533ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
534aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
53564e38db7SHong Zhang 
53664fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
53764fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
53864e38db7SHong Zhang 
53964e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
54084a45834SBarry Smith   if (set) {
54164e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
54284a45834SBarry Smith   }
54364e38db7SHong Zhang 
5441585b412SBarry 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);
54564e38db7SHong Zhang   if (set) {
5461585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
54784a45834SBarry Smith   }
54864e38db7SHong Zhang 
54964e38db7SHong Zhang   /* Handle specific TSTrajectory options */
55062b521acSHong Zhang   if (tj->ops->setfromoptions) {
55162b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
55262b521acSHong Zhang   }
553bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
554bc952696SBarry Smith   PetscFunctionReturn(0);
555bc952696SBarry Smith }
55668bece0bSHong Zhang 
55768bece0bSHong Zhang /*@
55868bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
55968bece0bSHong Zhang    of a TS trajectory.
56068bece0bSHong Zhang 
56168bece0bSHong Zhang    Collective on TS
56268bece0bSHong Zhang 
56368bece0bSHong Zhang    Input Parameter:
5643c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
5653c0fce88SHong Zhang -  tj - the TS trajectory context
56668bece0bSHong Zhang 
567df5474d8SHong Zhang    Level: developer
56868bece0bSHong Zhang 
5693c0fce88SHong Zhang .keywords: TS, trajectory, setup
57068bece0bSHong Zhang 
57168bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
57268bece0bSHong Zhang @*/
57368bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
57468bece0bSHong Zhang {
57568bece0bSHong Zhang   PetscErrorCode ierr;
5769afe7f3eSBarry Smith   size_t         s1,s2;
57768bece0bSHong Zhang 
57868bece0bSHong Zhang   PetscFunctionBegin;
57968bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
58068bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
58168bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
58268bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
58368bece0bSHong Zhang 
58468bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
58568bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
58668bece0bSHong Zhang   }
58768bece0bSHong Zhang   if (tj->ops->setup) {
58868bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
58968bece0bSHong Zhang   }
59068bece0bSHong Zhang 
59168bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
59253b27ddbSHong Zhang 
59353b27ddbSHong Zhang   /* Set the counters to zero */
5941a5a771fSHong Zhang   tj->recomps    = 0;
59553b27ddbSHong Zhang   tj->diskreads  = 0;
59653b27ddbSHong Zhang   tj->diskwrites = 0;
5979afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
5989afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
59911e1d5c3SBarry Smith   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
60011e1d5c3SBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
60168bece0bSHong Zhang   PetscFunctionReturn(0);
60268bece0bSHong Zhang }
603