xref: /petsc/src/ts/trajectory/interface/traj.c (revision feff33ee0b5b037fa8f9f294dede656a2f85cc47)
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: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
186 
187 .keywords: TS, trajectory, create
188 
189 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles()
190 @*/
191 PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
192 {
193   TSTrajectory   t;
194   PetscErrorCode ierr;
195 
196   PetscFunctionBegin;
197   PetscValidPointer(tj,2);
198   *tj = NULL;
199   ierr = TSInitializePackage();CHKERRQ(ierr);
200 
201   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
202   t->setupcalled = PETSC_FALSE;
203   t->keepfiles   = PETSC_TRUE;
204   *tj  = t;
205   ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr);
206   ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr);
207   PetscFunctionReturn(0);
208 }
209 
210 /*@C
211   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
212 
213   Collective on TS
214 
215   Input Parameters:
216 + tj   - the TSTrajectory context
217 . ts   - the TS context
218 - type - a known method
219 
220   Options Database Command:
221 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
222 
223    Level: developer
224 
225 .keywords: TS, trajectory, timestep, set, type
226 
227 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
228 
229 @*/
230 PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
231 {
232   PetscErrorCode (*r)(TSTrajectory,TS);
233   PetscBool      match;
234   PetscErrorCode ierr;
235 
236   PetscFunctionBegin;
237   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
238   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
239   if (match) PetscFunctionReturn(0);
240 
241   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
242   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
243   if (tj->ops->destroy) {
244     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
245 
246     tj->ops->destroy = NULL;
247   }
248   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
249 
250   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
251   ierr = (*r)(tj,ts);CHKERRQ(ierr);
252   PetscFunctionReturn(0);
253 }
254 
255 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
256 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
257 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
258 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
259 
260 /*@C
261   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
262 
263   Not Collective
264 
265   Level: developer
266 
267 .keywords: TS, trajectory, register, all
268 
269 .seealso: TSTrajectoryRegister()
270 @*/
271 PetscErrorCode  TSTrajectoryRegisterAll(void)
272 {
273   PetscErrorCode ierr;
274 
275   PetscFunctionBegin;
276   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
277   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
278 
279   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
280   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
281   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
282   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
283   PetscFunctionReturn(0);
284 }
285 
286 /*@
287    TSTrajectoryDestroy - Destroys a trajectory context
288 
289    Collective on TSTrajectory
290 
291    Input Parameter:
292 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
293 
294    Level: developer
295 
296 .keywords: TS, trajectory, timestep, destroy
297 
298 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
299 @*/
300 PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
301 {
302   PetscErrorCode ierr;
303 
304   PetscFunctionBegin;
305   if (!*tj) PetscFunctionReturn(0);
306   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
307   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
308 
309   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
310   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
311   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
312   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
313   ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr);
314   ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr);
315   ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr);
316   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
317   PetscFunctionReturn(0);
318 }
319 
320 /*
321   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
322 
323   Collective on TSTrajectory
324 
325   Input Parameter:
326 + tj - the TSTrajectory context
327 - ts - the TS context
328 
329   Options Database Keys:
330 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
331 
332   Level: developer
333 
334 .keywords: TS, trajectory, set, options, type
335 
336 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
337 */
338 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
339 {
340   PetscBool      opt;
341   const char     *defaultType;
342   char           typeName[256];
343   PetscBool      flg;
344   PetscErrorCode ierr;
345 
346   PetscFunctionBegin;
347   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
348   else defaultType = TSTRAJECTORYBASIC;
349 
350   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
351   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
352   if (opt) {
353     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
354     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
355   } else {
356     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
357   }
358   PetscFunctionReturn(0);
359 }
360 
361 /*@
362    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
363 
364    Collective on TSTrajectory
365 
366    Input Arguments:
367 +  tj - the TSTrajectory context
368 -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
369 
370    Options Database Keys:
371 .  -ts_trajectory_monitor - print TSTrajectory information
372 
373    Level: developer
374 
375 .keywords: TS, trajectory, set, monitor
376 
377 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
378 @*/
379 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
380 {
381   PetscErrorCode ierr;
382 
383   PetscFunctionBegin;
384   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
385   PetscValidLogicalCollectiveBool(tj,flg,2);
386   if (flg) {
387     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
388   } else {
389     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
390   }
391   PetscFunctionReturn(0);
392 }
393 
394 /*@
395    TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory
396 
397    Collective on TSTrajectory
398 
399    Input Arguments:
400 +  tj - the TSTrajectory context
401 -  flg - PETSC_TRUE to save, PETSC_FALSE to disable
402 
403    Options Database Keys:
404 .  -ts_trajectory_keep_files - have it keep the files
405 
406    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.
407 
408    Level: advanced
409 
410 .keywords: TS, trajectory, set, monitor
411 
412 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor()
413 @*/
414 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg)
415 {
416   PetscFunctionBegin;
417   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
418   PetscValidLogicalCollectiveBool(tj,flg,2);
419   tj->keepfiles = flg;
420   PetscFunctionReturn(0);
421 }
422 
423 /*@C
424    TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored.
425 
426    Collective on TSTrajectory
427 
428    Input Arguments:
429 +  tj      - the TSTrajectory context
430 -  dirname - the directory name
431 
432    Options Database Keys:
433 .  -ts_trajectory_dirname - set the directory name
434 
435    Notes: The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate()
436 
437    Level: developer
438 
439 .keywords: TS, trajectory, set
440 
441 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp()
442 @*/
443 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[])
444 {
445   PetscErrorCode ierr;
446   PetscFunctionBegin;
447   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
448   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup");
449   ierr = PetscFree(tj->dirname);CHKERRQ(ierr);
450   ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr);
451   PetscFunctionReturn(0);
452 }
453 
454 /*@C
455    TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints.
456 
457    Collective on TSTrajectory
458 
459    Input Arguments:
460 +  tj      - the TSTrajectory context
461 -  filetemplate - the template
462 
463    Options Database Keys:
464 .  -ts_trajectory_file_template - set the file name template
465 
466    Notes: The name template should be of the form, for example filename-%06D.bin It should not begin with a leading /
467 
468    The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the
469    timestep counter
470 
471    Level: developer
472 
473 .keywords: TS, trajectory, set
474 
475 .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp()
476 @*/
477 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[])
478 {
479   PetscErrorCode ierr;
480   const char     *ptr,*ptr2;
481 
482   PetscFunctionBegin;
483   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
484   if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup");
485 
486   if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
487   /* Do some cursory validation of the input. */
488   ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr);
489   if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin");
490   for (ptr++; ptr && *ptr; ptr++) {
491     ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr);
492     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");
493     if (ptr2) break;
494   }
495   ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr);
496   ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr);
497   PetscFunctionReturn(0);
498 }
499 
500 /*@
501    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
502 
503    Collective on TSTrajectory
504 
505    Input Parameter:
506 +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
507 -  ts - the TS context
508 
509    Options Database Keys:
510 +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
511 .  -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
512 -  -ts_trajectory_monitor - print TSTrajectory information
513 
514    Level: developer
515 
516    Notes: This is not normally called directly by users
517 
518 .keywords: TS, trajectory, timestep, set, options, database
519 
520 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
521 @*/
522 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
523 {
524   PetscBool      set,flg;
525   char           dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN];
526   PetscErrorCode ierr;
527 
528   PetscFunctionBegin;
529   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
530   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
531   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
532   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
533   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
534   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
535 
536   ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr);
537   if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);}
538 
539   ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr);
540   if (set) {
541     ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr);
542   }
543 
544   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);
545   if (set) {
546     ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr);
547   }
548 
549   /* Handle specific TSTrajectory options */
550   if (tj->ops->setfromoptions) {
551     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
552   }
553   ierr = PetscOptionsEnd();CHKERRQ(ierr);
554   PetscFunctionReturn(0);
555 }
556 
557 /*@
558    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
559    of a TS trajectory.
560 
561    Collective on TS
562 
563    Input Parameter:
564 +  ts - the TS context obtained from TSCreate()
565 -  tj - the TS trajectory context
566 
567    Level: developer
568 
569 .keywords: TS, trajectory, setup
570 
571 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
572 @*/
573 PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
574 {
575   PetscErrorCode ierr;
576   size_t         s1,s2;
577 
578   PetscFunctionBegin;
579   if (!tj) PetscFunctionReturn(0);
580   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
581   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
582   if (tj->setupcalled) PetscFunctionReturn(0);
583 
584   if (!((PetscObject)tj)->type_name) {
585     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
586   }
587   if (tj->ops->setup) {
588     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
589   }
590 
591   tj->setupcalled = PETSC_TRUE;
592 
593   /* Set the counters to zero */
594   tj->recomps    = 0;
595   tj->diskreads  = 0;
596   tj->diskwrites = 0;
597   ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr);
598   ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr);
599   ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr);
600   ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr);
601   PetscFunctionReturn(0);
602 }
603