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