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