xref: /petsc/src/ts/trajectory/interface/traj.c (revision 487a658c8b32ba712a1dc8280daad2fd70c1dcd9)
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 
309   if (tj->ops->reset) {
310     ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr);
311   }
312   tj->setupcalled = PETSC_FALSE;
313   ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr);
314   PetscFunctionReturn(0);
315 }
316 
317 /*@
318    TSTrajectoryDestroy - Destroys a trajectory context
319 
320    Collective on TSTrajectory
321 
322    Input Parameter:
323 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
324 
325    Level: developer
326 
327 .keywords: TS, trajectory, timestep, destroy
328 
329 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
330 @*/
331 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj)
332 {
333   PetscErrorCode ierr;
334 
335   PetscFunctionBegin;
336   if (!*tj) PetscFunctionReturn(0);
337   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
338   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
339 
340   ierr = TSTrajectoryReset((*tj));CHKERRQ(ierr);
341 
342   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
343   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
344   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
345   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
346   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
347   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
348   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
349   PetscFunctionReturn(0);
350 }
351 
352 /*
353   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
354 
355   Collective on TSTrajectory
356 
357   Input Parameter:
358 + tj - the TSTrajectory context
359 - ts - the TS context
360 
361   Options Database Keys:
362 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
363 
364   Level: developer
365 
366 .keywords: TS, trajectory, set, options, type
367 
368 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
369 */
370 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
371 {
372   PetscBool      opt;
373   const char     *defaultType;
374   char           typeName[256];
375   PetscBool      flg;
376   PetscErrorCode ierr;
377 
378   PetscFunctionBegin;
379   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
380   else defaultType = TSTRAJECTORYBASIC;
381 
382   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
383   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
384   if (opt) {
385     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
386     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
387   } else {
388     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
389   }
390   PetscFunctionReturn(0);
391 }
392 
393 /*@
394    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
395 
396    Collective on TSTrajectory
397 
398    Input Arguments:
399 +  tj - the TSTrajectory context
400 -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
401 
402    Options Database Keys:
403 .  -ts_trajectory_monitor - print TSTrajectory information
404 
405    Level: developer
406 
407 .keywords: TS, trajectory, set, monitor
408 
409 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
410 @*/
411 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
412 {
413   PetscErrorCode ierr;
414 
415   PetscFunctionBegin;
416   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
417   PetscValidLogicalCollectiveBool(tj,flg,2);
418   if (flg) {
419     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
420   } else {
421     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
422   }
423   PetscFunctionReturn(0);
424 }
425 
426 /*@
427    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
428 
429    Collective on TSTrajectory
430 
431    Input Arguments:
432 +  tj - the TSTrajectory context
433 -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
434 
435    Options Database Keys:
436 .  -ts_trajectory_keep_files - have it keep the files
437 
438    Notes:
439     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.
440 
441    Level: advanced
442 
443 .keywords: TS, trajectory, set, monitor
444 
445 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
446 @*/
447 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
448 {
449   PetscFunctionBegin;
450   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
451   PetscValidLogicalCollectiveBool(tj,flg,2);
452   tj->keepfiles = flg;
453   PetscFunctionReturn(0);
454 }
455 
456 /*@C
457    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
458 
459    Collective on TSTrajectory
460 
461    Input Arguments:
462 +  tj      - the TSTrajectory context
463 -  dirname - the directory name
464 
465    Options Database Keys:
466 .  -ts_trajectory_dirname - set the directory name
467 
468    Notes:
469     The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
470 
471    Level: developer
472 
473 .keywords: TS, trajectory, set
474 
475 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
476 @*/
477 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
478 {
479   PetscErrorCode ierr;
480   PetscFunctionBegin;
481   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
482   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup");
483   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
484   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
485   PetscFunctionReturn(0);
486 }
487 
488 /*@C
489    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
490 
491    Collective on TSTrajectory
492 
493    Input Arguments:
494 +  tj      - the TSTrajectory context
495 -  filetemplate - the template
496 
497    Options Database Keys:
498 .  -ts_trajectory_file_template - set the file name template
499 
500    Notes:
501     The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
502 
503    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
504    timestep counter
505 
506    Level: developer
507 
508 .keywords: TS, trajectory, set
509 
510 .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
511 @*/
512 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
513 {
514   PetscErrorCode ierr;
515   const char     *ptr,*ptr2;
516 
517   PetscFunctionBegin;
518   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
519   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
520 
521   if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
522   /* Do some cursory validation of the input. */
523   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
524   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
525   for (ptr++; ptr && *ptr; ptr++) {
526     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
527     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");
528     if (ptr2) break;
529   }
530   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
531   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
532   PetscFunctionReturn(0);
533 }
534 
535 /*@
536    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
537 
538    Collective on TSTrajectory
539 
540    Input Parameter:
541 +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
542 -  ts - the TS context
543 
544    Options Database Keys:
545 +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
546 .  -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
547 -  -ts_trajectory_monitor - print TSTrajectory information
548 
549    Level: developer
550 
551    Notes:
552     This is not normally called directly by users
553 
554 .keywords: TS, trajectory, timestep, set, options, database
555 
556 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
557 @*/
558 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
559 {
560   PetscBool      set,flg;
561   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
562   PetscErrorCode ierr;
563 
564   PetscFunctionBegin;
565   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
566   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
567   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
568   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
569   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
570   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
571 
572   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
573   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
574 
575   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
576   if (set) {
577     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
578   }
579 
580   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);
581   if (set) {
582     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
583   }
584 
585   /* Handle specific TSTrajectory options */
586   if (tj->ops->setfromoptions) {
587     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
588   }
589   ierr = PetscOptionsEnd();CHKERRQ(ierr);
590   PetscFunctionReturn(0);
591 }
592 
593 /*@
594    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
595    of a TS trajectory.
596 
597    Collective on TS
598 
599    Input Parameter:
600 +  ts - the TS context obtained from TSCreate()
601 -  tj - the TS trajectory context
602 
603    Level: developer
604 
605 .keywords: TS, trajectory, setup
606 
607 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
608 @*/
609 PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
610 {
611   PetscErrorCode ierr;
612   size_t         s1,s2;
613 
614   PetscFunctionBegin;
615   if (!tj) PetscFunctionReturn(0);
616   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
617   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
618   if (tj->setupcalled) PetscFunctionReturn(0);
619 
620   if (!((PetscObject)tj)->type_name) {
621     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
622   }
623   if (tj->ops->setup) {
624     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
625   }
626 
627   tj->setupcalled = PETSC_TRUE;
628 
629   /* Set the counters to zero */
630   tj->recomps    = 0;
631   tj->diskreads  = 0;
632   tj->diskwrites = 0;
633   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
634   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
635   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
636   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
637   PetscFunctionReturn(0);
638 }
639