xref: /petsc/src/ts/trajectory/interface/traj.c (revision 64e38db7c5aae0ecdbe282bf3dcdf34c98cb00d9)
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 
12878fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view
12978fbdcc8SBarry Smith 
13078fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory()
13178fbdcc8SBarry Smith @*/
13278fbdcc8SBarry Smith PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
13378fbdcc8SBarry Smith {
13478fbdcc8SBarry Smith   PetscErrorCode    ierr;
13578fbdcc8SBarry Smith 
13678fbdcc8SBarry Smith   PetscFunctionBegin;
13778fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
13878fbdcc8SBarry Smith   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
13978fbdcc8SBarry Smith   PetscFunctionReturn(0);
14078fbdcc8SBarry Smith }
14178fbdcc8SBarry Smith 
14278fbdcc8SBarry Smith /*@C
14308347785SBarry Smith    TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk
14408347785SBarry Smith 
14508347785SBarry Smith    Collective on TSLGCtx
14608347785SBarry Smith 
14708347785SBarry Smith    Input Parameters:
14808347785SBarry Smith +  tj - the TSTrajectory context
14908347785SBarry Smith .  transform - the transform function
15008347785SBarry Smith .  destroy - function to destroy the optional context
15108347785SBarry Smith -  ctx - optional context used by transform function
15208347785SBarry Smith 
15308347785SBarry Smith    Level: intermediate
15408347785SBarry Smith 
15508347785SBarry Smith .keywords: TSTrajectory,  vector, monitor, view
15608347785SBarry Smith 
15708347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
15808347785SBarry Smith @*/
15908347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
16008347785SBarry Smith {
16108347785SBarry Smith   PetscFunctionBegin;
16208347785SBarry Smith   tj->transform        = transform;
16308347785SBarry Smith   tj->transformdestroy = destroy;
16408347785SBarry Smith   tj->transformctx     = tctx;
16508347785SBarry Smith   PetscFunctionReturn(0);
16608347785SBarry Smith }
16708347785SBarry Smith 
16808347785SBarry Smith 
16908347785SBarry Smith /*@C
170bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
171bc952696SBarry Smith 
172bc952696SBarry Smith   Collective on MPI_Comm
173bc952696SBarry Smith 
174bc952696SBarry Smith   Input Parameter:
1753c0fce88SHong Zhang . comm - the communicator
176bc952696SBarry Smith 
177bc952696SBarry Smith   Output Parameter:
1783c0fce88SHong Zhang . tj   - the trajectory object
179bc952696SBarry Smith 
180df5474d8SHong Zhang   Level: developer
181bc952696SBarry Smith 
1823c0fce88SHong Zhang   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
183bc952696SBarry Smith 
1843c0fce88SHong Zhang .keywords: TS, trajectory, create
1853c0fce88SHong Zhang 
18664fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
187bc952696SBarry Smith @*/
188b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
189bc952696SBarry Smith {
190bc952696SBarry Smith   TSTrajectory   t;
191bc952696SBarry Smith   PetscErrorCode ierr;
192bc952696SBarry Smith 
193bc952696SBarry Smith   PetscFunctionBegin;
194b1d74d50SHong Zhang   PetscValidPointer(tj,2);
195b1d74d50SHong Zhang   *tj = NULL;
196bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
197bc952696SBarry Smith 
19873107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
19968bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
20064fc91eeSBarry Smith   t->keepfiles   = PETSC_TRUE;
201b1d74d50SHong Zhang   *tj = t;
202bc952696SBarry Smith   PetscFunctionReturn(0);
203bc952696SBarry Smith }
204bc952696SBarry Smith 
205bc952696SBarry Smith /*@C
206bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
207bc952696SBarry Smith 
208bc952696SBarry Smith   Collective on TS
209bc952696SBarry Smith 
210bc952696SBarry Smith   Input Parameters:
2113c0fce88SHong Zhang + tj   - the TSTrajectory context
2123c0fce88SHong Zhang . ts   - the TS context
2133c0fce88SHong Zhang - type - a known method
214bc952696SBarry Smith 
215bc952696SBarry Smith   Options Database Command:
216e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
217bc952696SBarry Smith 
218df5474d8SHong Zhang    Level: developer
219bc952696SBarry Smith 
2203c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
221bc952696SBarry Smith 
2223c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
223bc952696SBarry Smith 
224bc952696SBarry Smith @*/
225972caf09SHong Zhang PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
226bc952696SBarry Smith {
227972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
228bc952696SBarry Smith   PetscBool      match;
229bc952696SBarry Smith   PetscErrorCode ierr;
230bc952696SBarry Smith 
231bc952696SBarry Smith   PetscFunctionBegin;
232972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
233972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
234bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
235bc952696SBarry Smith 
236bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
237bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
238972caf09SHong Zhang   if (tj->ops->destroy) {
239972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
240bc952696SBarry Smith 
241972caf09SHong Zhang     tj->ops->destroy = NULL;
242bc952696SBarry Smith   }
243972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
244bc952696SBarry Smith 
245972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
246972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
247bc952696SBarry Smith   PetscFunctionReturn(0);
248bc952696SBarry Smith }
249bc952696SBarry Smith 
250972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
251972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2529a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
2532b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
254bc952696SBarry Smith 
255bc952696SBarry Smith /*@C
256bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
257bc952696SBarry Smith 
258bc952696SBarry Smith   Not Collective
259bc952696SBarry Smith 
260df5474d8SHong Zhang   Level: developer
261bc952696SBarry Smith 
2623c0fce88SHong Zhang .keywords: TS, trajectory, register, all
2633c0fce88SHong Zhang 
2643c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
265bc952696SBarry Smith @*/
266bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
267bc952696SBarry Smith {
268bc952696SBarry Smith   PetscErrorCode ierr;
269bc952696SBarry Smith 
270bc952696SBarry Smith   PetscFunctionBegin;
271560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
272bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
273bc952696SBarry Smith 
274bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2751c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2769a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
2772b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
278bc952696SBarry Smith   PetscFunctionReturn(0);
279bc952696SBarry Smith }
280bc952696SBarry Smith 
281bc952696SBarry Smith /*@
282bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
283bc952696SBarry Smith 
284bc952696SBarry Smith    Collective on TSTrajectory
285bc952696SBarry Smith 
286bc952696SBarry Smith    Input Parameter:
2873c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
288bc952696SBarry Smith 
289df5474d8SHong Zhang    Level: developer
290bc952696SBarry Smith 
2913c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
292bc952696SBarry Smith 
2933c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
294bc952696SBarry Smith @*/
295972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
296bc952696SBarry Smith {
297bc952696SBarry Smith   PetscErrorCode ierr;
298bc952696SBarry Smith 
299bc952696SBarry Smith   PetscFunctionBegin;
300972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
301972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
302972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
303bc952696SBarry Smith 
3047f79407eSBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
305972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
306aced365eSHong Zhang   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
30778fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
308*64e38db7SHong Zhang   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
309*64e38db7SHong Zhang   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
310972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
311bc952696SBarry Smith   PetscFunctionReturn(0);
312bc952696SBarry Smith }
313bc952696SBarry Smith 
314bc952696SBarry Smith /*
315772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
316bc952696SBarry Smith 
317bc952696SBarry Smith   Collective on TSTrajectory
318bc952696SBarry Smith 
319bc952696SBarry Smith   Input Parameter:
3203c0fce88SHong Zhang + tj - the TSTrajectory context
3213c0fce88SHong Zhang - ts - the TS context
3223c0fce88SHong Zhang 
3233c0fce88SHong Zhang   Options Database Keys:
3243c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
325bc952696SBarry Smith 
326df5474d8SHong Zhang   Level: developer
327bc952696SBarry Smith 
3283c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
3293c0fce88SHong Zhang 
3303c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
331bc952696SBarry Smith */
3322bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
333bc952696SBarry Smith {
334bc952696SBarry Smith   PetscBool      opt;
335bc952696SBarry Smith   const char     *defaultType;
336bc952696SBarry Smith   char           typeName[256];
3379a53571cSHong Zhang   PetscBool      flg;
338bc952696SBarry Smith   PetscErrorCode ierr;
339bc952696SBarry Smith 
340bc952696SBarry Smith   PetscFunctionBegin;
341b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
342bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
343bc952696SBarry Smith 
344560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
345e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
346bc952696SBarry Smith   if (opt) {
347f416af30SBarry Smith     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
348972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
349bc952696SBarry Smith   } else {
350972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
351bc952696SBarry Smith   }
352bc952696SBarry Smith   PetscFunctionReturn(0);
353bc952696SBarry Smith }
354bc952696SBarry Smith 
355ed695a29SHong Zhang /*@
356ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
357ed695a29SHong Zhang 
358ed695a29SHong Zhang    Collective on TSTrajectory
359ed695a29SHong Zhang 
360ed695a29SHong Zhang    Input Arguments:
361ed695a29SHong Zhang +  tj - the TSTrajectory context
362ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
363ed695a29SHong Zhang 
3643c0fce88SHong Zhang    Options Database Keys:
365063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
3663c0fce88SHong Zhang 
367df5474d8SHong Zhang    Level: developer
368ed695a29SHong Zhang 
3693c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
3703c0fce88SHong Zhang 
3713c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
372ed695a29SHong Zhang @*/
3732bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
374ed695a29SHong Zhang {
375ed695a29SHong Zhang   PetscErrorCode ierr;
376ed695a29SHong Zhang 
377ed695a29SHong Zhang   PetscFunctionBegin;
378ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
379ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
380ed695a29SHong Zhang   if (flg) {
381ed695a29SHong Zhang     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
382ed695a29SHong Zhang   } else {
383ed695a29SHong Zhang     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
384ed695a29SHong Zhang   }
385ed695a29SHong Zhang   PetscFunctionReturn(0);
386ed695a29SHong Zhang }
387ed695a29SHong Zhang 
388bc952696SBarry Smith /*@
38964fc91eeSBarry Smith    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
39064fc91eeSBarry Smith 
39164fc91eeSBarry Smith    Collective on TSTrajectory
39264fc91eeSBarry Smith 
39364fc91eeSBarry Smith    Input Arguments:
39464fc91eeSBarry Smith +  tj - the TSTrajectory context
39564fc91eeSBarry Smith -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
39664fc91eeSBarry Smith 
39764fc91eeSBarry Smith    Options Database Keys:
39864fc91eeSBarry Smith .  -ts_trajectory_keep_files - have it keep the files
39964fc91eeSBarry Smith 
40064fc91eeSBarry 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.
40164fc91eeSBarry Smith 
40264fc91eeSBarry Smith    Level: advanced
40364fc91eeSBarry Smith 
40464fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor
40564fc91eeSBarry Smith 
40664fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
40764fc91eeSBarry Smith @*/
40864fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
40964fc91eeSBarry Smith {
41064fc91eeSBarry Smith   PetscFunctionBegin;
41164fc91eeSBarry Smith   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
41264fc91eeSBarry Smith   PetscValidLogicalCollectiveBool(tj,flg,2);
41364fc91eeSBarry Smith   tj->keepfiles = flg;
41464fc91eeSBarry Smith   PetscFunctionReturn(0);
41564fc91eeSBarry Smith }
41664fc91eeSBarry Smith 
41764fc91eeSBarry Smith /*@
418*64e38db7SHong Zhang    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
419*64e38db7SHong Zhang 
420*64e38db7SHong Zhang    Collective on TSTrajectory
421*64e38db7SHong Zhang 
422*64e38db7SHong Zhang    Input Arguments:
423*64e38db7SHong Zhang +  tj      - the TSTrajectory context
424*64e38db7SHong Zhang -  dirname - the directory name
425*64e38db7SHong Zhang 
426*64e38db7SHong Zhang    Options Database Keys:
427*64e38db7SHong Zhang .  -ts_trajectory_dirname - set the directory name
428*64e38db7SHong Zhang 
429*64e38db7SHong Zhang    Level: developer
430*64e38db7SHong Zhang 
431*64e38db7SHong Zhang .keywords: TS, trajectory, set
432*64e38db7SHong Zhang 
433*64e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
434*64e38db7SHong Zhang @*/
435*64e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
436*64e38db7SHong Zhang {
437*64e38db7SHong Zhang   PetscErrorCode ierr;
438*64e38db7SHong Zhang   PetscFunctionBegin;
439*64e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
440*64e38db7SHong Zhang   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
441*64e38db7SHong Zhang   PetscFunctionReturn(0);
442*64e38db7SHong Zhang }
443*64e38db7SHong Zhang 
444*64e38db7SHong Zhang /*@
445*64e38db7SHong Zhang    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
446*64e38db7SHong Zhang 
447*64e38db7SHong Zhang    Collective on TSTrajectory
448*64e38db7SHong Zhang 
449*64e38db7SHong Zhang    Input Arguments:
450*64e38db7SHong Zhang +  tj      - the TSTrajectory context
451*64e38db7SHong Zhang -  filetemplate - the directory name
452*64e38db7SHong Zhang 
453*64e38db7SHong Zhang    Options Database Keys:
454*64e38db7SHong Zhang .  -ts_trajectory_file - set the file name template
455*64e38db7SHong Zhang 
456*64e38db7SHong Zhang    Level: developer
457*64e38db7SHong Zhang 
458*64e38db7SHong Zhang .keywords: TS, trajectory, set
459*64e38db7SHong Zhang 
460*64e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
461*64e38db7SHong Zhang @*/
462*64e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
463*64e38db7SHong Zhang {
464*64e38db7SHong Zhang   PetscErrorCode ierr;
465*64e38db7SHong Zhang   PetscFunctionBegin;
466*64e38db7SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
467*64e38db7SHong Zhang   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
468*64e38db7SHong Zhang   PetscFunctionReturn(0);
469*64e38db7SHong Zhang }
470*64e38db7SHong Zhang 
471*64e38db7SHong Zhang /*@
472bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
473bc952696SBarry Smith 
474bc952696SBarry Smith    Collective on TSTrajectory
475bc952696SBarry Smith 
476bc952696SBarry Smith    Input Parameter:
4773c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
4783c0fce88SHong Zhang -  ts - the TS context
479bc952696SBarry Smith 
480bc952696SBarry Smith    Options Database Keys:
4813c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
48264fc91eeSBarry 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
483063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
484bc952696SBarry Smith 
485df5474d8SHong Zhang    Level: developer
486bc952696SBarry Smith 
48762b521acSHong Zhang    Notes: This is not normally called directly by users
488bc952696SBarry Smith 
4893c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
490bc952696SBarry Smith 
4913c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
492bc952696SBarry Smith @*/
493972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
494bc952696SBarry Smith {
495ed695a29SHong Zhang   PetscBool      set,flg;
496*64e38db7SHong Zhang   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
497*64e38db7SHong Zhang   PetscErrorCode ierr;
498bc952696SBarry Smith 
499bc952696SBarry Smith   PetscFunctionBegin;
500b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
501972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
502b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
503972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
504ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
505aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
506*64e38db7SHong Zhang 
50764fc91eeSBarry Smith   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
50864fc91eeSBarry Smith   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
509*64e38db7SHong Zhang 
510*64e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
511*64e38db7SHong Zhang   if (!set) {
512*64e38db7SHong Zhang     ierr = PetscStrcpy(dirname,"SA-data");CHKERRQ(ierr);
513*64e38db7SHong Zhang   }
514*64e38db7SHong Zhang   ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
515*64e38db7SHong Zhang 
516*64e38db7SHong Zhang   ierr = PetscOptionsString("-ts_trajectory_file","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr);
517*64e38db7SHong Zhang   if (set) {
518*64e38db7SHong Zhang     size_t len;
519*64e38db7SHong Zhang     const char *ptr,*ptr2;
520*64e38db7SHong Zhang     if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file requires a file name template, e.g. filename-%%06D.bin");
521*64e38db7SHong Zhang     /* Do some cursory validation of the input. */
522*64e38db7SHong Zhang     ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
523*64e38db7SHong Zhang     if (!ptr) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file requires a file name template, e.g. filename-%%06D.bin");
524*64e38db7SHong Zhang     for (ptr++; ptr && *ptr; ptr++) {
525*64e38db7SHong Zhang       ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
526*64e38db7SHong Zhang       if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file, should look like filename-%%06D.bin");
527*64e38db7SHong Zhang       if (ptr2) break;
528*64e38db7SHong Zhang     }
529*64e38db7SHong Zhang     ierr = PetscStrcat(dirname,"/");CHKERRQ(ierr);
530*64e38db7SHong Zhang     ierr = PetscStrlen(filetemplate,&len);CHKERRQ(ierr);
531*64e38db7SHong Zhang     ierr = PetscStrncat(dirname,filetemplate,PETSC_MAX_PATH_LEN-len-1);CHKERRQ(ierr);
532*64e38db7SHong Zhang   } else {
533*64e38db7SHong Zhang     ierr = PetscStrcat(dirname,"/SA-%06D.bin");CHKERRQ(ierr);
534*64e38db7SHong Zhang   }
535*64e38db7SHong Zhang   ierr = TSTrajectorySetFiletemplate(tj,dirname);CHKERRQ(ierr);
536*64e38db7SHong Zhang 
537*64e38db7SHong Zhang   /* Handle specific TSTrajectory options */
53862b521acSHong Zhang   if (tj->ops->setfromoptions) {
53962b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
54062b521acSHong Zhang   }
541bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
542bc952696SBarry Smith   PetscFunctionReturn(0);
543bc952696SBarry Smith }
54468bece0bSHong Zhang 
54568bece0bSHong Zhang /*@
54668bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
54768bece0bSHong Zhang    of a TS trajectory.
54868bece0bSHong Zhang 
54968bece0bSHong Zhang    Collective on TS
55068bece0bSHong Zhang 
55168bece0bSHong Zhang    Input Parameter:
5523c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
5533c0fce88SHong Zhang -  tj - the TS trajectory context
55468bece0bSHong Zhang 
555df5474d8SHong Zhang    Level: developer
55668bece0bSHong Zhang 
5573c0fce88SHong Zhang .keywords: TS, trajectory, setup
55868bece0bSHong Zhang 
55968bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
56068bece0bSHong Zhang @*/
56168bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
56268bece0bSHong Zhang {
56368bece0bSHong Zhang   PetscErrorCode ierr;
56468bece0bSHong Zhang 
56568bece0bSHong Zhang   PetscFunctionBegin;
56668bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
56768bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
56868bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
56968bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
57068bece0bSHong Zhang 
57168bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
57268bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
57368bece0bSHong Zhang   }
57468bece0bSHong Zhang   if (tj->ops->setup) {
57568bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
57668bece0bSHong Zhang   }
57768bece0bSHong Zhang 
57868bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
57953b27ddbSHong Zhang 
58053b27ddbSHong Zhang   /* Set the counters to zero */
5811a5a771fSHong Zhang   tj->recomps    = 0;
58253b27ddbSHong Zhang   tj->diskreads  = 0;
58353b27ddbSHong Zhang   tj->diskwrites = 0;
58468bece0bSHong Zhang   PetscFunctionReturn(0);
58568bece0bSHong Zhang }
586