xref: /petsc/src/ts/trajectory/interface/traj.c (revision 68bece0bd50004586d88ca9f2cea00cb61f23ba9)
1bc952696SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/tsimpl.h>        /*I "petscts.h"  I*/
3bc952696SBarry Smith 
4bc952696SBarry Smith PetscFunctionList TSTrajectoryList              = NULL;
5bc952696SBarry Smith PetscBool         TSTrajectoryRegisterAllCalled = PETSC_FALSE;
6bc952696SBarry Smith PetscClassId      TSTRAJECTORY_CLASSID;
7bc952696SBarry Smith 
8bc952696SBarry Smith #undef __FUNCT__
9bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegister"
10bc952696SBarry Smith /*@C
11bc952696SBarry Smith   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
12bc952696SBarry Smith 
13bc952696SBarry Smith   Not Collective
14bc952696SBarry Smith 
15bc952696SBarry Smith   Input Parameters:
16bc952696SBarry Smith + name        - The name of a new user-defined creation routine
17bc952696SBarry Smith - create_func - The creation routine itself
18bc952696SBarry Smith 
19bc952696SBarry Smith   Notes:
20bc952696SBarry Smith   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
21bc952696SBarry Smith 
22bc952696SBarry Smith   Level: advanced
23bc952696SBarry Smith 
24bc952696SBarry Smith .keywords: TS, register
25bc952696SBarry Smith 
26bc952696SBarry Smith .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy()
27bc952696SBarry Smith @*/
28972caf09SHong Zhang PetscErrorCode  TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
29bc952696SBarry Smith {
30bc952696SBarry Smith   PetscErrorCode ierr;
31bc952696SBarry Smith 
32bc952696SBarry Smith   PetscFunctionBegin;
33bc952696SBarry Smith   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
34bc952696SBarry Smith   PetscFunctionReturn(0);
35bc952696SBarry Smith }
36bc952696SBarry Smith 
37bc952696SBarry Smith #undef __FUNCT__
38bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySet"
39bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
40bc952696SBarry Smith {
41bc952696SBarry Smith   PetscErrorCode ierr;
42bc952696SBarry Smith 
43bc952696SBarry Smith   PetscFunctionBegin;
44bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
45bc952696SBarry Smith   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
46bc952696SBarry Smith   PetscFunctionReturn(0);
47bc952696SBarry Smith }
48bc952696SBarry Smith 
49bc952696SBarry Smith #undef __FUNCT__
50bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryGet"
51c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
52bc952696SBarry Smith {
53bc952696SBarry Smith   PetscErrorCode ierr;
54bc952696SBarry Smith 
55bc952696SBarry Smith   PetscFunctionBegin;
56bc952696SBarry Smith   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
57bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
58bc952696SBarry Smith   PetscFunctionReturn(0);
59bc952696SBarry Smith }
60bc952696SBarry Smith 
61bc952696SBarry Smith #undef __FUNCT__
62bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryView"
63bc952696SBarry Smith /*@C
64bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
65bc952696SBarry Smith 
66bc952696SBarry Smith     Collective on TSTrajectory
67bc952696SBarry Smith 
68bc952696SBarry Smith     Input Parameters:
69b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
70bc952696SBarry Smith -   viewer - visualization context
71bc952696SBarry Smith 
72bc952696SBarry Smith     Options Database Key:
73bc952696SBarry Smith .   -ts_view - calls TSView() at end of TSStep()
74bc952696SBarry Smith 
75bc952696SBarry Smith     Notes:
76bc952696SBarry Smith     The available visualization contexts include
77bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
78bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
79bc952696SBarry Smith          output where only the first processor opens
80bc952696SBarry Smith          the file.  All other processors send their
81bc952696SBarry Smith          data to the first processor to print.
82bc952696SBarry Smith 
83bc952696SBarry Smith     The user can open an alternative visualization context with
84bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
85bc952696SBarry Smith 
86bc952696SBarry Smith     Level: beginner
87bc952696SBarry Smith 
88bc952696SBarry Smith .keywords: TS, timestep, view
89bc952696SBarry Smith 
90bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
91bc952696SBarry Smith @*/
92b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
93bc952696SBarry Smith {
94bc952696SBarry Smith   PetscErrorCode ierr;
95bc952696SBarry Smith   PetscBool      iascii;
96bc952696SBarry Smith 
97bc952696SBarry Smith   PetscFunctionBegin;
98b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TS_CLASSID,1);
99bc952696SBarry Smith   if (!viewer) {
100b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
101bc952696SBarry Smith   }
102bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
103b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
104bc952696SBarry Smith 
105bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
106bc952696SBarry Smith   if (iascii) {
107b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
108b1d74d50SHong Zhang     if (tj->ops->view) {
109b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
110bc952696SBarry Smith     }
111bc952696SBarry Smith   }
112bc952696SBarry Smith   PetscFunctionReturn(0);
113bc952696SBarry Smith }
114bc952696SBarry Smith 
115bc952696SBarry Smith #undef  __FUNCT__
116bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryCreate"
117bc952696SBarry Smith /*@C
118bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
119bc952696SBarry Smith 
120bc952696SBarry Smith   Collective on MPI_Comm
121bc952696SBarry Smith 
122bc952696SBarry Smith   Input Parameter:
123bc952696SBarry Smith . comm - The communicator
124bc952696SBarry Smith 
125bc952696SBarry Smith   Output Parameter:
126b1d74d50SHong Zhang . tj   - The trajectory object
127bc952696SBarry Smith 
128bc952696SBarry Smith   Level: advanced
129bc952696SBarry Smith 
130bc952696SBarry Smith   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call
131bc952696SBarry Smith    TSGetTrajectory() to access the created trajectory.
132bc952696SBarry Smith 
133bc952696SBarry Smith .keywords: TS, create
134bc952696SBarry Smith .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory()
135bc952696SBarry Smith @*/
136b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
137bc952696SBarry Smith {
138bc952696SBarry Smith   TSTrajectory   t;
139bc952696SBarry Smith   PetscErrorCode ierr;
140bc952696SBarry Smith 
141bc952696SBarry Smith   PetscFunctionBegin;
142b1d74d50SHong Zhang   PetscValidPointer(tj,2);
143b1d74d50SHong Zhang   *tj = NULL;
144bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
145bc952696SBarry Smith 
14673107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
147*68bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
148b1d74d50SHong Zhang   *tj = t;
149bc952696SBarry Smith   PetscFunctionReturn(0);
150bc952696SBarry Smith }
151bc952696SBarry Smith 
152bc952696SBarry Smith #undef __FUNCT__
153bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetType"
154bc952696SBarry Smith /*@C
155bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
156bc952696SBarry Smith 
157bc952696SBarry Smith   Collective on TS
158bc952696SBarry Smith 
159bc952696SBarry Smith   Input Parameters:
160bc952696SBarry Smith + ts   - The TS context
161bc952696SBarry Smith - type - A known method
162bc952696SBarry Smith 
163bc952696SBarry Smith   Options Database Command:
164bc952696SBarry Smith . -tstrajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
165bc952696SBarry Smith 
166bc952696SBarry Smith    Level: intermediate
167bc952696SBarry Smith 
168bc952696SBarry Smith .keywords: TS, set, type
169bc952696SBarry Smith 
170bc952696SBarry Smith .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
171bc952696SBarry Smith 
172bc952696SBarry Smith @*/
173972caf09SHong Zhang PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
174bc952696SBarry Smith {
175972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
176bc952696SBarry Smith   PetscBool      match;
177bc952696SBarry Smith   PetscErrorCode ierr;
178bc952696SBarry Smith 
179bc952696SBarry Smith   PetscFunctionBegin;
180972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
181972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
182bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
183bc952696SBarry Smith 
184bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
185bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
186972caf09SHong Zhang   if (tj->ops->destroy) {
187972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
188bc952696SBarry Smith 
189972caf09SHong Zhang     tj->ops->destroy = NULL;
190bc952696SBarry Smith   }
191972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
192bc952696SBarry Smith 
193972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
194972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
195bc952696SBarry Smith   PetscFunctionReturn(0);
196bc952696SBarry Smith }
197bc952696SBarry Smith 
198972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
199972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2009a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
201bc952696SBarry Smith 
202bc952696SBarry Smith #undef __FUNCT__
203bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegisterAll"
204bc952696SBarry Smith /*@C
205bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
206bc952696SBarry Smith 
207bc952696SBarry Smith   Not Collective
208bc952696SBarry Smith 
209bc952696SBarry Smith   Level: advanced
210bc952696SBarry Smith 
211bc952696SBarry Smith .keywords: TS, timestepper, register, all
212bc952696SBarry Smith .seealso: TSCreate(), TSRegister(), TSRegisterDestroy()
213bc952696SBarry Smith @*/
214bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
215bc952696SBarry Smith {
216bc952696SBarry Smith   PetscErrorCode ierr;
217bc952696SBarry Smith 
218bc952696SBarry Smith   PetscFunctionBegin;
219bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
220bc952696SBarry Smith 
221bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2221c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2239a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
224bc952696SBarry Smith   PetscFunctionReturn(0);
225bc952696SBarry Smith }
226bc952696SBarry Smith 
227bc952696SBarry Smith #undef __FUNCT__
228bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryDestroy"
229bc952696SBarry Smith /*@
230bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
231bc952696SBarry Smith 
232bc952696SBarry Smith    Collective on TSTrajectory
233bc952696SBarry Smith 
234bc952696SBarry Smith    Input Parameter:
235bc952696SBarry Smith .  ts - the TSTrajectory context obtained from TSTrajectoryCreate()
236bc952696SBarry Smith 
237bc952696SBarry Smith    Level: advanced
238bc952696SBarry Smith 
239bc952696SBarry Smith .keywords: TS, timestepper, destroy
240bc952696SBarry Smith 
241bc952696SBarry Smith .seealso: TSCreate(), TSSetUp(), TSSolve()
242bc952696SBarry Smith @*/
243972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
244bc952696SBarry Smith {
245bc952696SBarry Smith   PetscErrorCode ierr;
246bc952696SBarry Smith 
247bc952696SBarry Smith   PetscFunctionBegin;
248972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
249972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
250972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
251bc952696SBarry Smith 
252972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
253972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
254bc952696SBarry Smith   PetscFunctionReturn(0);
255bc952696SBarry Smith }
256bc952696SBarry Smith 
257bc952696SBarry Smith #undef __FUNCT__
258772b2523SBarry Smith #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private"
259bc952696SBarry Smith /*
260772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
261bc952696SBarry Smith 
262bc952696SBarry Smith   Collective on TSTrajectory
263bc952696SBarry Smith 
264bc952696SBarry Smith   Input Parameter:
265972caf09SHong Zhang . tj - TSTrajectory
266bc952696SBarry Smith 
267bc952696SBarry Smith   Level: intermediate
268bc952696SBarry Smith 
269bc952696SBarry Smith .keywords: TS, set, options, database, type
270bc952696SBarry Smith .seealso: TSSetFromOptions(), TSSetType()
271bc952696SBarry Smith */
272972caf09SHong Zhang static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,TSTrajectory tj,TS ts)
273bc952696SBarry Smith {
274bc952696SBarry Smith   PetscBool      opt;
275bc952696SBarry Smith   const char     *defaultType;
276bc952696SBarry Smith   char           typeName[256];
2779a53571cSHong Zhang   PetscBool      flg;
278bc952696SBarry Smith   PetscErrorCode ierr;
279bc952696SBarry Smith 
280bc952696SBarry Smith   PetscFunctionBegin;
281b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
282bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
283bc952696SBarry Smith 
284bc952696SBarry Smith   if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);}
285bc952696SBarry Smith   ierr = PetscOptionsFList("-tstrajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
286bc952696SBarry Smith   if (opt) {
2879a53571cSHong Zhang     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);
288*68bece0bSHong Zhang     //if (flg) { /* ts_max_steps determines memory allocated */
289*68bece0bSHong Zhang     //  ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,NULL);CHKERRQ(ierr);
290*68bece0bSHong Zhang     //}
291972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
292bc952696SBarry Smith   } else {
293972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
294bc952696SBarry Smith   }
295bc952696SBarry Smith   PetscFunctionReturn(0);
296bc952696SBarry Smith }
297bc952696SBarry Smith 
298bc952696SBarry Smith #undef __FUNCT__
299bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetFromOptions"
300bc952696SBarry Smith /*@
301bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
302bc952696SBarry Smith 
303bc952696SBarry Smith    Collective on TSTrajectory
304bc952696SBarry Smith 
305bc952696SBarry Smith    Input Parameter:
306b1d74d50SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
307bc952696SBarry Smith 
308bc952696SBarry Smith    Options Database Keys:
309bc952696SBarry Smith .  -tstrajectory_type <type> - TSTRAJECTORYBASIC
310*68bece0bSHong Zhang .  -tstrajectory_max_cps <int>
311bc952696SBarry Smith 
312bc952696SBarry Smith    Level: advanced
313bc952696SBarry Smith 
31462b521acSHong Zhang    Notes: This is not normally called directly by users
315bc952696SBarry Smith 
31662b521acSHong Zhang .keywords: TS, timestep, set, options, database, trajectory
317bc952696SBarry Smith 
318bc952696SBarry Smith .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory()
319bc952696SBarry Smith @*/
320972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
321bc952696SBarry Smith {
322bc952696SBarry Smith   PetscErrorCode ierr;
323bc952696SBarry Smith 
324bc952696SBarry Smith   PetscFunctionBegin;
325b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
326972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
327b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
328972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
32962b521acSHong Zhang     /* Handle specific TS options */
33062b521acSHong Zhang   if (tj->ops->setfromoptions) {
33162b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
33262b521acSHong Zhang   }
333bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
334bc952696SBarry Smith   PetscFunctionReturn(0);
335bc952696SBarry Smith }
336*68bece0bSHong Zhang 
337*68bece0bSHong Zhang #undef __FUNCT__
338*68bece0bSHong Zhang #define __FUNCT__ "TSTrajectorySetUp"
339*68bece0bSHong Zhang /*@
340*68bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
341*68bece0bSHong Zhang    of a TS trajectory.
342*68bece0bSHong Zhang 
343*68bece0bSHong Zhang    Collective on TS
344*68bece0bSHong Zhang 
345*68bece0bSHong Zhang    Input Parameter:
346*68bece0bSHong Zhang .  ts - the TS context obtained from TSCreate()
347*68bece0bSHong Zhang .  tj - the TS trajectory context
348*68bece0bSHong Zhang 
349*68bece0bSHong Zhang    Level: advanced
350*68bece0bSHong Zhang 
351*68bece0bSHong Zhang .keywords: TS, setup, checkpoint
352*68bece0bSHong Zhang 
353*68bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
354*68bece0bSHong Zhang @*/
355*68bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
356*68bece0bSHong Zhang {
357*68bece0bSHong Zhang   PetscErrorCode ierr;
358*68bece0bSHong Zhang 
359*68bece0bSHong Zhang   PetscFunctionBegin;
360*68bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
361*68bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
362*68bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
363*68bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
364*68bece0bSHong Zhang 
365*68bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
366*68bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
367*68bece0bSHong Zhang   }
368*68bece0bSHong Zhang   if (tj->ops->setup) {
369*68bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
370*68bece0bSHong Zhang   }
371*68bece0bSHong Zhang 
372*68bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
373*68bece0bSHong Zhang   PetscFunctionReturn(0);
374*68bece0bSHong Zhang }
375