xref: /petsc/src/ts/trajectory/interface/traj.c (revision e94726eb989a075e0a621a904a75bf8cecc8ece5)
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");
54d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
55bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
56d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
57bc952696SBarry Smith   PetscFunctionReturn(0);
58bc952696SBarry Smith }
59bc952696SBarry Smith 
60bc952696SBarry Smith /*@C
61bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
62bc952696SBarry Smith 
63bc952696SBarry Smith     Collective on TSTrajectory
64bc952696SBarry Smith 
65bc952696SBarry Smith     Input Parameters:
66b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
67bc952696SBarry Smith -   viewer - visualization context
68bc952696SBarry Smith 
69bc952696SBarry Smith     Options Database Key:
70e210cd0eSHong Zhang .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
71bc952696SBarry Smith 
72bc952696SBarry Smith     Notes:
73bc952696SBarry Smith     The available visualization contexts include
74bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
75bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
76bc952696SBarry Smith          output where only the first processor opens
77bc952696SBarry Smith          the file.  All other processors send their
78bc952696SBarry Smith          data to the first processor to print.
79bc952696SBarry Smith 
80bc952696SBarry Smith     The user can open an alternative visualization context with
81bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
82bc952696SBarry Smith 
83df5474d8SHong Zhang     Level: developer
84bc952696SBarry Smith 
853c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view
86bc952696SBarry Smith 
87bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
88bc952696SBarry Smith @*/
89b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
90bc952696SBarry Smith {
91bc952696SBarry Smith   PetscErrorCode ierr;
92bc952696SBarry Smith   PetscBool      iascii;
93bc952696SBarry Smith 
94bc952696SBarry Smith   PetscFunctionBegin;
951a5a771fSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
96bc952696SBarry Smith   if (!viewer) {
97b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
98bc952696SBarry Smith   }
99bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
100b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
101bc952696SBarry Smith 
102bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
103bc952696SBarry Smith   if (iascii) {
104b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
1051a5a771fSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
10653b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
10753b27ddbSHong Zhang     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
108b1d74d50SHong Zhang     if (tj->ops->view) {
109285336bfSHong Zhang       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
110b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
111285336bfSHong Zhang       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
112bc952696SBarry Smith     }
113bc952696SBarry Smith   }
114bc952696SBarry Smith   PetscFunctionReturn(0);
115bc952696SBarry Smith }
116bc952696SBarry Smith 
117bc952696SBarry Smith /*@C
11878fbdcc8SBarry Smith    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
11978fbdcc8SBarry Smith 
12078fbdcc8SBarry Smith    Collective on TSTrajectory
12178fbdcc8SBarry Smith 
12278fbdcc8SBarry Smith    Input Parameters:
12378fbdcc8SBarry Smith +  tr - the trajectory context
12478fbdcc8SBarry Smith -  names - the names of the components, final string must be NULL
12578fbdcc8SBarry Smith 
12678fbdcc8SBarry Smith    Level: intermediate
12778fbdcc8SBarry Smith 
128db901c5bSHong Zhang    Note: Fortran interface is not possible because of the string array argument
129db901c5bSHong Zhang 
13078fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view
13178fbdcc8SBarry Smith 
13278fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
13378fbdcc8SBarry Smith @*/
13478fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
13578fbdcc8SBarry Smith {
13678fbdcc8SBarry Smith   PetscErrorCode    ierr;
13778fbdcc8SBarry Smith 
13878fbdcc8SBarry Smith   PetscFunctionBegin;
13978fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
14078fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
14178fbdcc8SBarry Smith   PetscFunctionReturn(0);
14278fbdcc8SBarry Smith }
14378fbdcc8SBarry Smith 
14478fbdcc8SBarry Smith /*@C
14508347785SBarry Smith    TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk
14608347785SBarry Smith 
14708347785SBarry Smith    Collective on TSLGCtx
14808347785SBarry Smith 
14908347785SBarry Smith    Input Parameters:
15008347785SBarry Smith +  tj - the TSTrajectory context
15108347785SBarry Smith .  transform - the transform function
15208347785SBarry Smith .  destroy - function to destroy the optional context
15308347785SBarry Smith -  ctx - optional context used by transform function
15408347785SBarry Smith 
15508347785SBarry Smith    Level: intermediate
15608347785SBarry Smith 
15708347785SBarry Smith .keywords: TSTrajectory,  vector, monitor, view
15808347785SBarry Smith 
15908347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
16008347785SBarry Smith @*/
16108347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
16208347785SBarry Smith {
16308347785SBarry Smith   PetscFunctionBegin;
16408347785SBarry Smith   tj->transform        = transform;
16508347785SBarry Smith   tj->transformdestroy = destroy;
16608347785SBarry Smith   tj->transformctx     = tctx;
16708347785SBarry Smith   PetscFunctionReturn(0);
16808347785SBarry Smith }
16908347785SBarry Smith 
17008347785SBarry Smith 
171db901c5bSHong Zhang /*@
172bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
173bc952696SBarry Smith 
174bc952696SBarry Smith   Collective on MPI_Comm
175bc952696SBarry Smith 
176bc952696SBarry Smith   Input Parameter:
1773c0fce88SHong Zhang . comm - the communicator
178bc952696SBarry Smith 
179bc952696SBarry Smith   Output Parameter:
1803c0fce88SHong Zhang . tj   - the trajectory object
181bc952696SBarry Smith 
182df5474d8SHong Zhang   Level: developer
183bc952696SBarry Smith 
1843c0fce88SHong Zhang   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
185bc952696SBarry Smith 
1863c0fce88SHong Zhang .keywords: TS, trajectory, create
1873c0fce88SHong Zhang 
18864fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
189bc952696SBarry Smith @*/
190b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
191bc952696SBarry Smith {
192bc952696SBarry Smith   TSTrajectory   t;
193bc952696SBarry Smith   PetscErrorCode ierr;
194bc952696SBarry Smith 
195bc952696SBarry Smith   PetscFunctionBegin;
196b1d74d50SHong Zhang   PetscValidPointer(tj,2);
197b1d74d50SHong Zhang   *tj = NULL;
198bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
199bc952696SBarry Smith 
20073107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
20168bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
20264fc91eeSBarry Smith   t->keepfiles   = PETSC_TRUE;
203b1d74d50SHong Zhang   *tj  = t;
20484a45834SBarry Smith   ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr);
205*e94726ebSBarry Smith   ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr);
206bc952696SBarry Smith   PetscFunctionReturn(0);
207bc952696SBarry Smith }
208bc952696SBarry Smith 
209bc952696SBarry Smith /*@C
210bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
211bc952696SBarry Smith 
212bc952696SBarry Smith   Collective on TS
213bc952696SBarry Smith 
214bc952696SBarry Smith   Input Parameters:
2153c0fce88SHong Zhang + tj   - the TSTrajectory context
2163c0fce88SHong Zhang . ts   - the TS context
2173c0fce88SHong Zhang - type - a known method
218bc952696SBarry Smith 
219bc952696SBarry Smith   Options Database Command:
220e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
221bc952696SBarry Smith 
222df5474d8SHong Zhang    Level: developer
223bc952696SBarry Smith 
2243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
225bc952696SBarry Smith 
2263c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
227bc952696SBarry Smith 
228bc952696SBarry Smith @*/
229972caf09SHong Zhang PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
230bc952696SBarry Smith {
231972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
232bc952696SBarry Smith   PetscBool      match;
233bc952696SBarry Smith   PetscErrorCode ierr;
234bc952696SBarry Smith 
235bc952696SBarry Smith   PetscFunctionBegin;
236972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
237972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
238bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
239bc952696SBarry Smith 
240bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
241bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
242972caf09SHong Zhang   if (tj->ops->destroy) {
243972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
244bc952696SBarry Smith 
245972caf09SHong Zhang     tj->ops->destroy = NULL;
246bc952696SBarry Smith   }
247972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
248bc952696SBarry Smith 
249972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
250972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
251bc952696SBarry Smith   PetscFunctionReturn(0);
252bc952696SBarry Smith }
253bc952696SBarry Smith 
254972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
255972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2569a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
2572b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
258bc952696SBarry Smith 
259bc952696SBarry Smith /*@C
260bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
261bc952696SBarry Smith 
262bc952696SBarry Smith   Not Collective
263bc952696SBarry Smith 
264df5474d8SHong Zhang   Level: developer
265bc952696SBarry Smith 
2663c0fce88SHong Zhang .keywords: TS, trajectory, register, all
2673c0fce88SHong Zhang 
2683c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
269bc952696SBarry Smith @*/
270bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
271bc952696SBarry Smith {
272bc952696SBarry Smith   PetscErrorCode ierr;
273bc952696SBarry Smith 
274bc952696SBarry Smith   PetscFunctionBegin;
275560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
276bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
277bc952696SBarry Smith 
278bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2791c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2809a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
2812b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
282bc952696SBarry Smith   PetscFunctionReturn(0);
283bc952696SBarry Smith }
284bc952696SBarry Smith 
285bc952696SBarry Smith /*@
286bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
287bc952696SBarry Smith 
288bc952696SBarry Smith    Collective on TSTrajectory
289bc952696SBarry Smith 
290bc952696SBarry Smith    Input Parameter:
2913c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
292bc952696SBarry Smith 
293df5474d8SHong Zhang    Level: developer
294bc952696SBarry Smith 
2953c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
296bc952696SBarry Smith 
2973c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
298bc952696SBarry Smith @*/
299972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
300bc952696SBarry Smith {
301bc952696SBarry Smith   PetscErrorCode ierr;
302bc952696SBarry Smith 
303bc952696SBarry Smith   PetscFunctionBegin;
304972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
305972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
306972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
307bc952696SBarry Smith 
3087f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
309972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
310aced365eSHong Zhang   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
31178fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
31264e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
31364e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
3149afe7f3eSBarry Smith   ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr);
315972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
316bc952696SBarry Smith   PetscFunctionReturn(0);
317bc952696SBarry Smith }
318bc952696SBarry Smith 
319bc952696SBarry Smith /*
320772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
321bc952696SBarry Smith 
322bc952696SBarry Smith   Collective on TSTrajectory
323bc952696SBarry Smith 
324bc952696SBarry Smith   Input Parameter:
3253c0fce88SHong Zhang + tj - the TSTrajectory context
3263c0fce88SHong Zhang - ts - the TS context
3273c0fce88SHong Zhang 
3283c0fce88SHong Zhang   Options Database Keys:
3293c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
330bc952696SBarry Smith 
331df5474d8SHong Zhang   Level: developer
332bc952696SBarry Smith 
3333c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
3343c0fce88SHong Zhang 
3353c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
336bc952696SBarry Smith */
3372bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
338bc952696SBarry Smith {
339bc952696SBarry Smith   PetscBool      opt;
340bc952696SBarry Smith   const char     *defaultType;
341bc952696SBarry Smith   char           typeName[256];
3429a53571cSHong Zhang   PetscBool      flg;
343bc952696SBarry Smith   PetscErrorCode ierr;
344bc952696SBarry Smith 
345bc952696SBarry Smith   PetscFunctionBegin;
346b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
347bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
348bc952696SBarry Smith 
349560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
350e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
351bc952696SBarry Smith   if (opt) {
352f416af30SBarry Smith     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
353972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
354bc952696SBarry Smith   } else {
355972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
356bc952696SBarry Smith   }
357bc952696SBarry Smith   PetscFunctionReturn(0);
358bc952696SBarry Smith }
359bc952696SBarry Smith 
360ed695a29SHong Zhang /*@
361ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
362ed695a29SHong Zhang 
363ed695a29SHong Zhang    Collective on TSTrajectory
364ed695a29SHong Zhang 
365ed695a29SHong Zhang    Input Arguments:
366ed695a29SHong Zhang +  tj - the TSTrajectory context
367ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
368ed695a29SHong Zhang 
3693c0fce88SHong Zhang    Options Database Keys:
370063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
3713c0fce88SHong Zhang 
372df5474d8SHong Zhang    Level: developer
373ed695a29SHong Zhang 
3743c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
3753c0fce88SHong Zhang 
3763c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
377ed695a29SHong Zhang @*/
3782bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
379ed695a29SHong Zhang {
380ed695a29SHong Zhang   PetscErrorCode ierr;
381ed695a29SHong Zhang 
382ed695a29SHong Zhang   PetscFunctionBegin;
383ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
384ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
385ed695a29SHong Zhang   if (flg) {
386ed695a29SHong Zhang     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
387ed695a29SHong Zhang   } else {
388ed695a29SHong Zhang     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
389ed695a29SHong Zhang   }
390ed695a29SHong Zhang   PetscFunctionReturn(0);
391ed695a29SHong Zhang }
392ed695a29SHong Zhang 
393bc952696SBarry Smith /*@
39464fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
39564fc91eeSBarry Smith 
39664fc91eeSBarry Smith    Collective on TSTrajectory
39764fc91eeSBarry Smith 
39864fc91eeSBarry Smith    Input Arguments:
39964fc91eeSBarry Smith +  tj - the TSTrajectory context
40064fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
40164fc91eeSBarry Smith 
40264fc91eeSBarry Smith    Options Database Keys:
40364fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
40464fc91eeSBarry Smith 
40564fc91eeSBarry 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.
40664fc91eeSBarry Smith 
40764fc91eeSBarry Smith    Level: advanced
40864fc91eeSBarry Smith 
40964fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor
41064fc91eeSBarry Smith 
41164fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
41264fc91eeSBarry Smith @*/
41364fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
41464fc91eeSBarry Smith {
41564fc91eeSBarry Smith   PetscFunctionBegin;
41664fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
41764fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
41864fc91eeSBarry Smith   tj->keepfiles = flg;
41964fc91eeSBarry Smith   PetscFunctionReturn(0);
42064fc91eeSBarry Smith }
42164fc91eeSBarry Smith 
422db901c5bSHong Zhang /*@C
42364e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
42464e38db7SHong Zhang 
42564e38db7SHong Zhang    Collective on TSTrajectory
42664e38db7SHong Zhang 
42764e38db7SHong Zhang    Input Arguments:
42864e38db7SHong Zhang +  tj      - the TSTrajectory context
42964e38db7SHong Zhang -  dirname - the directory name
43064e38db7SHong Zhang 
43164e38db7SHong Zhang    Options Database Keys:
43264e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
43364e38db7SHong Zhang 
4341585b412SBarry Smith    Notes: The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
4351585b412SBarry Smith 
43664e38db7SHong Zhang    Level: developer
43764e38db7SHong Zhang 
43864e38db7SHong Zhang .keywords: TS, trajectory, set
43964e38db7SHong Zhang 
44064e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
44164e38db7SHong Zhang @*/
44264e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
44364e38db7SHong Zhang {
44464e38db7SHong Zhang   PetscErrorCode ierr;
44564e38db7SHong Zhang   PetscFunctionBegin;
44664e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4479afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup");
44884a45834SBarry Smith   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
44964e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
45064e38db7SHong Zhang   PetscFunctionReturn(0);
45164e38db7SHong Zhang }
45264e38db7SHong Zhang 
453db901c5bSHong Zhang /*@C
45464e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
45564e38db7SHong Zhang 
45664e38db7SHong Zhang    Collective on TSTrajectory
45764e38db7SHong Zhang 
45864e38db7SHong Zhang    Input Arguments:
45964e38db7SHong Zhang +  tj      - the TSTrajectory context
4601585b412SBarry Smith -  filetemplate - the template
46164e38db7SHong Zhang 
46264e38db7SHong Zhang    Options Database Keys:
4631585b412SBarry Smith .  -ts_trajectory_file_template - set the file name template
4641585b412SBarry Smith 
465*e94726ebSBarry Smith    Notes: The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
4661585b412SBarry Smith 
4671585b412SBarry Smith    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
4681585b412SBarry Smith    timestep counter
46964e38db7SHong Zhang 
47064e38db7SHong Zhang    Level: developer
47164e38db7SHong Zhang 
47264e38db7SHong Zhang .keywords: TS, trajectory, set
47364e38db7SHong Zhang 
4741585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
47564e38db7SHong Zhang @*/
47664e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
47764e38db7SHong Zhang {
47864e38db7SHong Zhang   PetscErrorCode ierr;
4799afe7f3eSBarry Smith   const char     *ptr,*ptr2;
4809afe7f3eSBarry Smith 
48164e38db7SHong Zhang   PetscFunctionBegin;
48264e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
4839afe7f3eSBarry Smith   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
4849afe7f3eSBarry Smith 
4859afe7f3eSBarry 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");
4869afe7f3eSBarry Smith   /* Do some cursory validation of the input. */
4879afe7f3eSBarry Smith   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
4889afe7f3eSBarry Smith   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
4899afe7f3eSBarry Smith   for (ptr++; ptr && *ptr; ptr++) {
4909afe7f3eSBarry Smith     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
4919afe7f3eSBarry 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");
4929afe7f3eSBarry Smith     if (ptr2) break;
4939afe7f3eSBarry Smith   }
49484a45834SBarry Smith   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
49564e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
49664e38db7SHong Zhang   PetscFunctionReturn(0);
49764e38db7SHong Zhang }
49864e38db7SHong Zhang 
49964e38db7SHong Zhang /*@
500bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
501bc952696SBarry Smith 
502bc952696SBarry Smith    Collective on TSTrajectory
503bc952696SBarry Smith 
504bc952696SBarry Smith    Input Parameter:
5053c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
5063c0fce88SHong Zhang -  ts - the TS context
507bc952696SBarry Smith 
508bc952696SBarry Smith    Options Database Keys:
5093c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
51064fc91eeSBarry 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
511063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
512bc952696SBarry Smith 
513df5474d8SHong Zhang    Level: developer
514bc952696SBarry Smith 
51562b521acSHong Zhang    Notes: This is not normally called directly by users
516bc952696SBarry Smith 
5173c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
518bc952696SBarry Smith 
5193c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
520bc952696SBarry Smith @*/
521972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
522bc952696SBarry Smith {
523ed695a29SHong Zhang   PetscBool      set,flg;
52464e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
52564e38db7SHong Zhang   PetscErrorCode ierr;
526bc952696SBarry Smith 
527bc952696SBarry Smith   PetscFunctionBegin;
528b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
529972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
530b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
531972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
532ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
533aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
53464e38db7SHong Zhang 
53564fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
53664fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
53764e38db7SHong Zhang 
53864e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
53984a45834SBarry Smith   if (set) {
54064e38db7SHong Zhang     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
54184a45834SBarry Smith   }
54264e38db7SHong Zhang 
5431585b412SBarry 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);
54464e38db7SHong Zhang   if (set) {
5451585b412SBarry Smith     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
54684a45834SBarry Smith   }
54764e38db7SHong Zhang 
54864e38db7SHong Zhang   /* Handle specific TSTrajectory options */
54962b521acSHong Zhang   if (tj->ops->setfromoptions) {
55062b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
55162b521acSHong Zhang   }
552bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
553bc952696SBarry Smith   PetscFunctionReturn(0);
554bc952696SBarry Smith }
55568bece0bSHong Zhang 
55668bece0bSHong Zhang /*@
55768bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
55868bece0bSHong Zhang    of a TS trajectory.
55968bece0bSHong Zhang 
56068bece0bSHong Zhang    Collective on TS
56168bece0bSHong Zhang 
56268bece0bSHong Zhang    Input Parameter:
5633c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
5643c0fce88SHong Zhang -  tj - the TS trajectory context
56568bece0bSHong Zhang 
566df5474d8SHong Zhang    Level: developer
56768bece0bSHong Zhang 
5683c0fce88SHong Zhang .keywords: TS, trajectory, setup
56968bece0bSHong Zhang 
57068bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
57168bece0bSHong Zhang @*/
57268bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
57368bece0bSHong Zhang {
57468bece0bSHong Zhang   PetscErrorCode ierr;
5759afe7f3eSBarry Smith   size_t         s1,s2;
57668bece0bSHong Zhang 
57768bece0bSHong Zhang   PetscFunctionBegin;
57868bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
57968bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
58068bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
58168bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
58268bece0bSHong Zhang 
58368bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
58468bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
58568bece0bSHong Zhang   }
58668bece0bSHong Zhang   if (tj->ops->setup) {
58768bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
58868bece0bSHong Zhang   }
58968bece0bSHong Zhang 
59068bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
59153b27ddbSHong Zhang 
59253b27ddbSHong Zhang   /* Set the counters to zero */
5931a5a771fSHong Zhang   tj->recomps    = 0;
59453b27ddbSHong Zhang   tj->diskreads  = 0;
59553b27ddbSHong Zhang   tj->diskwrites = 0;
5969afe7f3eSBarry Smith   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
5979afe7f3eSBarry Smith   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
598*e94726ebSBarry Smith   ierr = PetscMalloc((s1 + s2 + 2)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
599*e94726ebSBarry Smith   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+1,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
60068bece0bSHong Zhang   PetscFunctionReturn(0);
60168bece0bSHong Zhang }
602