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