xref: /petsc/src/ts/trajectory/interface/traj.c (revision 1550c9b98ed21cfb2c630bd3cd398012499560df)
1 
2 #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3 
4 PetscFunctionList TSTrajectoryList              = NULL;
5 PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
6 PetscClassId      TSTRAJECTORY_CLASSID;
7 PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get;
8 
9 /*@C
10   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
11 
12   Not Collective
13 
14   Input Parameters:
15 + name        - the name of a new user-defined creation routine
16 - create_func - the creation routine itself
17 
18   Notes:
19   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
20 
21   Level: developer
22 
23 .keywords: TS, trajectory, timestep, register
24 
25 .seealso: TSTrajectoryRegisterAll()
26 @*/
27 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
28 {
29   PetscErrorCode ierr;
30 
31   PetscFunctionBegin;
32   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
33   PetscFunctionReturn(0);
34 }
35 
36 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
37 {
38   PetscErrorCode ierr;
39 
40   PetscFunctionBegin;
41   if (!tj) PetscFunctionReturn(0);
42   ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
43   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
44   ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
45   PetscFunctionReturn(0);
46 }
47 
48 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
49 {
50   PetscErrorCode ierr;
51 
52   PetscFunctionBegin;
53   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
54   if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number");
55   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
56   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
57   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
58   PetscFunctionReturn(0);
59 }
60 
61 /*@C
62     TSTrajectoryView - Prints information about the trajectory object
63 
64     Collective on TSTrajectory
65 
66     Input Parameters:
67 +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
68 -   viewer - visualization context
69 
70     Options Database Key:
71 .   -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
72 
73     Notes:
74     The available visualization contexts include
75 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
76 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
77          output where only the first processor opens
78          the file.  All other processors send their
79          data to the first processor to print.
80 
81     The user can open an alternative visualization context with
82     PetscViewerASCIIOpen() - output to a specified file.
83 
84     Level: developer
85 
86 .keywords: TS, trajectory, timestep, view
87 
88 .seealso: PetscViewerASCIIOpen()
89 @*/
90 PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
91 {
92   PetscErrorCode ierr;
93   PetscBool      iascii;
94 
95   PetscFunctionBegin;
96   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
97   if (!viewer) {
98     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
99   }
100   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
101   PetscCheckSameComm(tj,1,viewer,2);
102 
103   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
104   if (iascii) {
105     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
106     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
107     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
108     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
109     if (tj->ops->view) {
110       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
111       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
112       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
113     }
114   }
115   PetscFunctionReturn(0);
116 }
117 
118 /*@C
119    TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory
120 
121    Collective on TSTrajectory
122 
123    Input Parameters:
124 +  tr - the trajectory context
125 -  names - the names of the components, final string must be NULL
126 
127    Level: intermediate
128 
129    Note: Fortran interface is not possible because of the string array argument
130 
131 .keywords: TS, TSTrajectory, vector, monitor, view
132 
133 .seealso: TSTrajectory, TSGetTrajectory()
134 @*/
135 PetscErrorCode  TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names)
136 {
137   PetscErrorCode    ierr;
138 
139   PetscFunctionBegin;
140   ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr);
141   ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr);
142   PetscFunctionReturn(0);
143 }
144 
145 /*@C
146    TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk
147 
148    Collective on TSLGCtx
149 
150    Input Parameters:
151 +  tj - the TSTrajectory context
152 .  transform - the transform function
153 .  destroy - function to destroy the optional context
154 -  ctx - optional context used by transform function
155 
156    Level: intermediate
157 
158 .keywords: TSTrajectory,  vector, monitor, view
159 
160 .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
161 @*/
162 PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
163 {
164   PetscFunctionBegin;
165   tj->transform        = transform;
166   tj->transformdestroy = destroy;
167   tj->transformctx     = tctx;
168   PetscFunctionReturn(0);
169 }
170 
171 
172 /*@
173   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
174 
175   Collective on MPI_Comm
176 
177   Input Parameter:
178 . comm - the communicator
179 
180   Output Parameter:
181 . tj   - the trajectory object
182 
183   Level: developer
184 
185   Notes:
186     Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
187 
188 .keywords: TS, trajectory, create
189 
190 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
191 @*/
192 PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
193 {
194   TSTrajectory   t;
195   PetscErrorCode ierr;
196 
197   PetscFunctionBegin;
198   PetscValidPointer(tj,2);
199   *tj = NULL;
200   ierr = TSInitializePackage();CHKERRQ(ierr);
201 
202   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
203   t->setupcalled = PETSC_FALSE;
204   t->keepfiles   = PETSC_TRUE;
205   *tj  = t;
206   ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr);
207   ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr);
208   PetscFunctionReturn(0);
209 }
210 
211 /*@C
212   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
213 
214   Collective on TS
215 
216   Input Parameters:
217 + tj   - the TSTrajectory context
218 . ts   - the TS context
219 - type - a known method
220 
221   Options Database Command:
222 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
223 
224    Level: developer
225 
226 .keywords: TS, trajectory, timestep, set, type
227 
228 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
229 
230 @*/
231 PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type)
232 {
233   PetscErrorCode (*r)(TSTrajectory,TS);
234   PetscBool      match;
235   PetscErrorCode ierr;
236 
237   PetscFunctionBegin;
238   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
239   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
240   if (match) PetscFunctionReturn(0);
241 
242   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
243   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
244   if (tj->ops->destroy) {
245     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
246 
247     tj->ops->destroy = NULL;
248   }
249   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
250 
251   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
252   ierr = (*r)(tj,ts);CHKERRQ(ierr);
253   PetscFunctionReturn(0);
254 }
255 
256 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
257 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
258 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
259 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
260 
261 /*@C
262   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
263 
264   Not Collective
265 
266   Level: developer
267 
268 .keywords: TS, trajectory, register, all
269 
270 .seealso: TSTrajectoryRegister()
271 @*/
272 PetscErrorCode  TSTrajectoryRegisterAll(void)
273 {
274   PetscErrorCode ierr;
275 
276   PetscFunctionBegin;
277   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
278   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
279 
280   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
281   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
282   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
283   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
284   PetscFunctionReturn(0);
285 }
286 
287 /*@
288    TSTrajectoryReset - Resets a trajectory context
289 
290    Collective on TSTrajectory
291 
292    Input Parameter:
293 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
294 
295    Level: developer
296 
297 .keywords: TS, trajectory, timestep, reset
298 
299 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
300 @*/
301 PetscErrorCode TSTrajectoryReset(TSTrajectory *tj)
302 {
303   PetscErrorCode ierr;
304 
305   PetscFunctionBegin;
306   if (!*tj) PetscFunctionReturn(0);
307   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
308   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
309   if ((*tj)->ops->reset) {ierr = (*(*tj)->ops->reset)((*tj));CHKERRQ(ierr);}
310   (*tj)->setupcalled = PETSC_FALSE;
311   PetscFunctionReturn(0);
312 }
313 
314 /*@
315    TSTrajectoryDestroy - Destroys a trajectory context
316 
317    Collective on TSTrajectory
318 
319    Input Parameter:
320 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
321 
322    Level: developer
323 
324 .keywords: TS, trajectory, timestep, destroy
325 
326 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
327 @*/
328 PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
329 {
330   PetscErrorCode ierr;
331 
332   PetscFunctionBegin;
333   if (!*tj) PetscFunctionReturn(0);
334   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
335   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
336 
337   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
338   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
339   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
340   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
341   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
342   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
343   ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr);
344   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
345   PetscFunctionReturn(0);
346 }
347 
348 /*
349   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
350 
351   Collective on TSTrajectory
352 
353   Input Parameter:
354 + tj - the TSTrajectory context
355 - ts - the TS context
356 
357   Options Database Keys:
358 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
359 
360   Level: developer
361 
362 .keywords: TS, trajectory, set, options, type
363 
364 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
365 */
366 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
367 {
368   PetscBool      opt;
369   const char     *defaultType;
370   char           typeName[256];
371   PetscBool      flg;
372   PetscErrorCode ierr;
373 
374   PetscFunctionBegin;
375   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
376   else defaultType = TSTRAJECTORYBASIC;
377 
378   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
379   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
380   if (opt) {
381     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
382     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
383   } else {
384     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
385   }
386   PetscFunctionReturn(0);
387 }
388 
389 /*@
390    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
391 
392    Collective on TSTrajectory
393 
394    Input Arguments:
395 +  tj - the TSTrajectory context
396 -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
397 
398    Options Database Keys:
399 .  -ts_trajectory_monitor - print TSTrajectory information
400 
401    Level: developer
402 
403 .keywords: TS, trajectory, set, monitor
404 
405 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
406 @*/
407 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
408 {
409   PetscErrorCode ierr;
410 
411   PetscFunctionBegin;
412   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
413   PetscValidLogicalCollectiveBool(tj,flg,2);
414   if (flg) {
415     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
416   } else {
417     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
418   }
419   PetscFunctionReturn(0);
420 }
421 
422 /*@
423    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
424 
425    Collective on TSTrajectory
426 
427    Input Arguments:
428 +  tj - the TSTrajectory context
429 -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
430 
431    Options Database Keys:
432 .  -ts_trajectory_keep_files - have it keep the files
433 
434    Notes:
435     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.
436 
437    Level: advanced
438 
439 .keywords: TS, trajectory, set, monitor
440 
441 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
442 @*/
443 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
444 {
445   PetscFunctionBegin;
446   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
447   PetscValidLogicalCollectiveBool(tj,flg,2);
448   tj->keepfiles = flg;
449   PetscFunctionReturn(0);
450 }
451 
452 /*@C
453    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
454 
455    Collective on TSTrajectory
456 
457    Input Arguments:
458 +  tj      - the TSTrajectory context
459 -  dirname - the directory name
460 
461    Options Database Keys:
462 .  -ts_trajectory_dirname - set the directory name
463 
464    Notes:
465     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
466 
467    Level: developer
468 
469 .keywords: TS, trajectory, set
470 
471 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
472 @*/
473 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
474 {
475   PetscErrorCode ierr;
476   PetscFunctionBegin;
477   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
478   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup");
479   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
480   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
481   PetscFunctionReturn(0);
482 }
483 
484 /*@C
485    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
486 
487    Collective on TSTrajectory
488 
489    Input Arguments:
490 +  tj      - the TSTrajectory context
491 -  filetemplate - the template
492 
493    Options Database Keys:
494 .  -ts_trajectory_file_template - set the file name template
495 
496    Notes:
497     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
498 
499    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
500    timestep counter
501 
502    Level: developer
503 
504 .keywords: TS, trajectory, set
505 
506 .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
507 @*/
508 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
509 {
510   PetscErrorCode ierr;
511   const char     *ptr,*ptr2;
512 
513   PetscFunctionBegin;
514   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
515   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
516 
517   if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
518   /* Do some cursory validation of the input. */
519   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
520   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
521   for (ptr++; ptr && *ptr; ptr++) {
522     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
523     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");
524     if (ptr2) break;
525   }
526   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
527   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
528   PetscFunctionReturn(0);
529 }
530 
531 /*@
532    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
533 
534    Collective on TSTrajectory
535 
536    Input Parameter:
537 +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
538 -  ts - the TS context
539 
540    Options Database Keys:
541 +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
542 .  -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
543 -  -ts_trajectory_monitor - print TSTrajectory information
544 
545    Level: developer
546 
547    Notes:
548     This is not normally called directly by users
549 
550 .keywords: TS, trajectory, timestep, set, options, database
551 
552 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
553 @*/
554 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
555 {
556   PetscBool      set,flg;
557   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
558   PetscErrorCode ierr;
559 
560   PetscFunctionBegin;
561   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
562   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
563   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
564   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
565   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
566   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
567 
568   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
569   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
570 
571   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
572   if (set) {
573     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
574   }
575 
576   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);
577   if (set) {
578     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
579   }
580 
581   /* Handle specific TSTrajectory options */
582   if (tj->ops->setfromoptions) {
583     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
584   }
585   ierr = PetscOptionsEnd();CHKERRQ(ierr);
586   PetscFunctionReturn(0);
587 }
588 
589 /*@
590    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
591    of a TS trajectory.
592 
593    Collective on TS
594 
595    Input Parameter:
596 +  ts - the TS context obtained from TSCreate()
597 -  tj - the TS trajectory context
598 
599    Level: developer
600 
601 .keywords: TS, trajectory, setup
602 
603 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
604 @*/
605 PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
606 {
607   PetscErrorCode ierr;
608   size_t         s1,s2;
609 
610   PetscFunctionBegin;
611   if (!tj) PetscFunctionReturn(0);
612   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
613   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
614   if (tj->setupcalled) PetscFunctionReturn(0);
615 
616   if (!((PetscObject)tj)->type_name) {
617     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
618   }
619   if (tj->ops->setup) {
620     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
621   }
622 
623   tj->setupcalled = PETSC_TRUE;
624 
625   /* Set the counters to zero */
626   tj->recomps    = 0;
627   tj->diskreads  = 0;
628   tj->diskwrites = 0;
629   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
630   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
631   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
632   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
633   PetscFunctionReturn(0);
634 }
635