xref: /petsc/src/ts/trajectory/interface/traj.c (revision 08347785e82e3cbb46d8d80d12ddee00beee7fed)
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 
21bc952696SBarry Smith   Level: advanced
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 
83bc952696SBarry Smith     Level: beginner
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
143*08347785SBarry Smith    TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk
144*08347785SBarry Smith 
145*08347785SBarry Smith    Collective on TSLGCtx
146*08347785SBarry Smith 
147*08347785SBarry Smith    Input Parameters:
148*08347785SBarry Smith +  tj - the TSTrajectory context
149*08347785SBarry Smith .  transform - the transform function
150*08347785SBarry Smith .  destroy - function to destroy the optional context
151*08347785SBarry Smith -  ctx - optional context used by transform function
152*08347785SBarry Smith 
153*08347785SBarry Smith    Level: intermediate
154*08347785SBarry Smith 
155*08347785SBarry Smith .keywords: TSTrajectory,  vector, monitor, view
156*08347785SBarry Smith 
157*08347785SBarry Smith .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
158*08347785SBarry Smith @*/
159*08347785SBarry Smith PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
160*08347785SBarry Smith {
161*08347785SBarry Smith   PetscFunctionBegin;
162*08347785SBarry Smith   tj->transform        = transform;
163*08347785SBarry Smith   tj->transformdestroy = destroy;
164*08347785SBarry Smith   tj->transformctx     = tctx;
165*08347785SBarry Smith   PetscFunctionReturn(0);
166*08347785SBarry Smith }
167*08347785SBarry Smith 
168*08347785SBarry Smith 
169*08347785SBarry 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 
180bc952696SBarry Smith   Level: advanced
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 
18678fbdcc8SBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory()
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;
200b1d74d50SHong Zhang   *tj = t;
201bc952696SBarry Smith   PetscFunctionReturn(0);
202bc952696SBarry Smith }
203bc952696SBarry Smith 
204bc952696SBarry Smith /*@C
205bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
206bc952696SBarry Smith 
207bc952696SBarry Smith   Collective on TS
208bc952696SBarry Smith 
209bc952696SBarry Smith   Input Parameters:
2103c0fce88SHong Zhang + tj   - the TSTrajectory context
2113c0fce88SHong Zhang . ts   - the TS context
2123c0fce88SHong Zhang - type - a known method
213bc952696SBarry Smith 
214bc952696SBarry Smith   Options Database Command:
215e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
216bc952696SBarry Smith 
217bc952696SBarry Smith    Level: intermediate
218bc952696SBarry Smith 
2193c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type
220bc952696SBarry Smith 
2213c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
222bc952696SBarry Smith 
223bc952696SBarry Smith @*/
224972caf09SHong Zhang PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
225bc952696SBarry Smith {
226972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
227bc952696SBarry Smith   PetscBool      match;
228bc952696SBarry Smith   PetscErrorCode ierr;
229bc952696SBarry Smith 
230bc952696SBarry Smith   PetscFunctionBegin;
231972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
232972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
233bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
234bc952696SBarry Smith 
235bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
236bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
237972caf09SHong Zhang   if (tj->ops->destroy) {
238972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
239bc952696SBarry Smith 
240972caf09SHong Zhang     tj->ops->destroy = NULL;
241bc952696SBarry Smith   }
242972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
243bc952696SBarry Smith 
244972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
245972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
246bc952696SBarry Smith   PetscFunctionReturn(0);
247bc952696SBarry Smith }
248bc952696SBarry Smith 
249972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
250972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2519a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
2522b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
253bc952696SBarry Smith 
254bc952696SBarry Smith /*@C
255bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
256bc952696SBarry Smith 
257bc952696SBarry Smith   Not Collective
258bc952696SBarry Smith 
259bc952696SBarry Smith   Level: advanced
260bc952696SBarry Smith 
2613c0fce88SHong Zhang .keywords: TS, trajectory, register, all
2623c0fce88SHong Zhang 
2633c0fce88SHong Zhang .seealso: TSTrajectoryRegister()
264bc952696SBarry Smith @*/
265bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
266bc952696SBarry Smith {
267bc952696SBarry Smith   PetscErrorCode ierr;
268bc952696SBarry Smith 
269bc952696SBarry Smith   PetscFunctionBegin;
270560360afSLisandro Dalcin   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
271bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
272bc952696SBarry Smith 
273bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2741c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2759a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
2762b043167SHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
277bc952696SBarry Smith   PetscFunctionReturn(0);
278bc952696SBarry Smith }
279bc952696SBarry Smith 
280bc952696SBarry Smith /*@
281bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
282bc952696SBarry Smith 
283bc952696SBarry Smith    Collective on TSTrajectory
284bc952696SBarry Smith 
285bc952696SBarry Smith    Input Parameter:
2863c0fce88SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
287bc952696SBarry Smith 
288bc952696SBarry Smith    Level: advanced
289bc952696SBarry Smith 
2903c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy
291bc952696SBarry Smith 
2923c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
293bc952696SBarry Smith @*/
294972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
295bc952696SBarry Smith {
296bc952696SBarry Smith   PetscErrorCode ierr;
297bc952696SBarry Smith 
298bc952696SBarry Smith   PetscFunctionBegin;
299972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
300972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
301972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
302bc952696SBarry Smith 
303*08347785SBarry Smith   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);}
304972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
305aced365eSHong Zhang   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
30678fbdcc8SBarry Smith   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
307972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
308bc952696SBarry Smith   PetscFunctionReturn(0);
309bc952696SBarry Smith }
310bc952696SBarry Smith 
311bc952696SBarry Smith /*
312772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
313bc952696SBarry Smith 
314bc952696SBarry Smith   Collective on TSTrajectory
315bc952696SBarry Smith 
316bc952696SBarry Smith   Input Parameter:
3173c0fce88SHong Zhang + tj - the TSTrajectory context
3183c0fce88SHong Zhang - ts - the TS context
3193c0fce88SHong Zhang 
3203c0fce88SHong Zhang   Options Database Keys:
3213c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
322bc952696SBarry Smith 
323bc952696SBarry Smith   Level: intermediate
324bc952696SBarry Smith 
3253c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type
3263c0fce88SHong Zhang 
3273c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
328bc952696SBarry Smith */
3292bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
330bc952696SBarry Smith {
331bc952696SBarry Smith   PetscBool      opt;
332bc952696SBarry Smith   const char     *defaultType;
333bc952696SBarry Smith   char           typeName[256];
3349a53571cSHong Zhang   PetscBool      flg;
335bc952696SBarry Smith   PetscErrorCode ierr;
336bc952696SBarry Smith 
337bc952696SBarry Smith   PetscFunctionBegin;
338b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
339bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
340bc952696SBarry Smith 
341560360afSLisandro Dalcin   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
342e210cd0eSHong Zhang   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
343bc952696SBarry Smith   if (opt) {
344f416af30SBarry Smith     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
345972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
346bc952696SBarry Smith   } else {
347972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
348bc952696SBarry Smith   }
349bc952696SBarry Smith   PetscFunctionReturn(0);
350bc952696SBarry Smith }
351bc952696SBarry Smith 
352ed695a29SHong Zhang /*@
353ed695a29SHong Zhang    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
354ed695a29SHong Zhang 
355ed695a29SHong Zhang    Collective on TSTrajectory
356ed695a29SHong Zhang 
357ed695a29SHong Zhang    Input Arguments:
358ed695a29SHong Zhang +  tj - the TSTrajectory context
359ed695a29SHong Zhang -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
360ed695a29SHong Zhang 
3613c0fce88SHong Zhang    Options Database Keys:
362063c0c7aSHong Zhang .  -ts_trajectory_monitor - print TSTrajectory information
3633c0fce88SHong Zhang 
364ed695a29SHong Zhang    Level: intermediate
365ed695a29SHong Zhang 
3663c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor
3673c0fce88SHong Zhang 
3683c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
369ed695a29SHong Zhang @*/
3702bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
371ed695a29SHong Zhang {
372ed695a29SHong Zhang   PetscErrorCode ierr;
373ed695a29SHong Zhang 
374ed695a29SHong Zhang   PetscFunctionBegin;
375ed695a29SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
376ed695a29SHong Zhang   PetscValidLogicalCollectiveBool(tj,flg,2);
377ed695a29SHong Zhang   if (flg) {
378ed695a29SHong Zhang     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
379ed695a29SHong Zhang   } else {
380ed695a29SHong Zhang     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
381ed695a29SHong Zhang   }
382ed695a29SHong Zhang   PetscFunctionReturn(0);
383ed695a29SHong Zhang }
384ed695a29SHong Zhang 
385bc952696SBarry Smith /*@
386bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
387bc952696SBarry Smith 
388bc952696SBarry Smith    Collective on TSTrajectory
389bc952696SBarry Smith 
390bc952696SBarry Smith    Input Parameter:
3913c0fce88SHong Zhang +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
3923c0fce88SHong Zhang -  ts - the TS context
393bc952696SBarry Smith 
394bc952696SBarry Smith    Options Database Keys:
3953c0fce88SHong Zhang +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
396063c0c7aSHong Zhang -  -ts_trajectory_monitor - print TSTrajectory information
397bc952696SBarry Smith 
398bc952696SBarry Smith    Level: advanced
399bc952696SBarry Smith 
40062b521acSHong Zhang    Notes: This is not normally called directly by users
401bc952696SBarry Smith 
4023c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database
403bc952696SBarry Smith 
4043c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
405bc952696SBarry Smith @*/
406972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
407bc952696SBarry Smith {
408bc952696SBarry Smith   PetscErrorCode ierr;
409ed695a29SHong Zhang   PetscBool      set,flg;
410bc952696SBarry Smith 
411bc952696SBarry Smith   PetscFunctionBegin;
412b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
413972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
414b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
415972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
416ed695a29SHong Zhang   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
417aced365eSHong Zhang   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
41862b521acSHong Zhang   /* Handle specific TS options */
41962b521acSHong Zhang   if (tj->ops->setfromoptions) {
42062b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
42162b521acSHong Zhang   }
422bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
423bc952696SBarry Smith   PetscFunctionReturn(0);
424bc952696SBarry Smith }
42568bece0bSHong Zhang 
42668bece0bSHong Zhang /*@
42768bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
42868bece0bSHong Zhang    of a TS trajectory.
42968bece0bSHong Zhang 
43068bece0bSHong Zhang    Collective on TS
43168bece0bSHong Zhang 
43268bece0bSHong Zhang    Input Parameter:
4333c0fce88SHong Zhang +  ts - the TS context obtained from TSCreate()
4343c0fce88SHong Zhang -  tj - the TS trajectory context
43568bece0bSHong Zhang 
43668bece0bSHong Zhang    Level: advanced
43768bece0bSHong Zhang 
4383c0fce88SHong Zhang .keywords: TS, trajectory, setup
43968bece0bSHong Zhang 
44068bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
44168bece0bSHong Zhang @*/
44268bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
44368bece0bSHong Zhang {
44468bece0bSHong Zhang   PetscErrorCode ierr;
44568bece0bSHong Zhang 
44668bece0bSHong Zhang   PetscFunctionBegin;
44768bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
44868bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
44968bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
45068bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
45168bece0bSHong Zhang 
45268bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
45368bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
45468bece0bSHong Zhang   }
45568bece0bSHong Zhang   if (tj->ops->setup) {
45668bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
45768bece0bSHong Zhang   }
45868bece0bSHong Zhang 
45968bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
46053b27ddbSHong Zhang 
46153b27ddbSHong Zhang   /* Set the counters to zero */
4621a5a771fSHong Zhang   tj->recomps    = 0;
46353b27ddbSHong Zhang   tj->diskreads  = 0;
46453b27ddbSHong Zhang   tj->diskwrites = 0;
46568bece0bSHong Zhang   PetscFunctionReturn(0);
46668bece0bSHong Zhang }
467