xref: /petsc/src/ts/trajectory/interface/traj.c (revision d0d044f327f047c6ae8a362c45f8317e8143993f)
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;
7*d0d044f3SHong Zhang PetscLogEvent     TSTrajectory_Set, TSTrajectory_Get;
8bc952696SBarry Smith 
9bc952696SBarry Smith #undef __FUNCT__
10bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegister"
11bc952696SBarry Smith /*@C
12bc952696SBarry Smith   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
13bc952696SBarry Smith 
14bc952696SBarry Smith   Not Collective
15bc952696SBarry Smith 
16bc952696SBarry Smith   Input Parameters:
17bc952696SBarry Smith + name        - The name of a new user-defined creation routine
18bc952696SBarry Smith - create_func - The creation routine itself
19bc952696SBarry Smith 
20bc952696SBarry Smith   Notes:
21bc952696SBarry Smith   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
22bc952696SBarry Smith 
23bc952696SBarry Smith   Level: advanced
24bc952696SBarry Smith 
25bc952696SBarry Smith .keywords: TS, register
26bc952696SBarry Smith 
27bc952696SBarry Smith .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy()
28bc952696SBarry Smith @*/
29972caf09SHong Zhang PetscErrorCode  TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
30bc952696SBarry Smith {
31bc952696SBarry Smith   PetscErrorCode ierr;
32bc952696SBarry Smith 
33bc952696SBarry Smith   PetscFunctionBegin;
34bc952696SBarry Smith   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
35bc952696SBarry Smith   PetscFunctionReturn(0);
36bc952696SBarry Smith }
37bc952696SBarry Smith 
38bc952696SBarry Smith #undef __FUNCT__
39bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySet"
40bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
41bc952696SBarry Smith {
42bc952696SBarry Smith   PetscErrorCode ierr;
43bc952696SBarry Smith 
44bc952696SBarry Smith   PetscFunctionBegin;
45bc952696SBarry Smith   if (!tj) PetscFunctionReturn(0);
46*d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
47bc952696SBarry Smith   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
48*d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr);
49bc952696SBarry Smith   PetscFunctionReturn(0);
50bc952696SBarry Smith }
51bc952696SBarry Smith 
52bc952696SBarry Smith #undef __FUNCT__
53bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryGet"
54c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
55bc952696SBarry Smith {
56bc952696SBarry Smith   PetscErrorCode ierr;
57bc952696SBarry Smith 
58bc952696SBarry Smith   PetscFunctionBegin;
59bc952696SBarry Smith   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
60*d0d044f3SHong Zhang   ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
61bc952696SBarry Smith   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
62*d0d044f3SHong Zhang   ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr);
63bc952696SBarry Smith   PetscFunctionReturn(0);
64bc952696SBarry Smith }
65bc952696SBarry Smith 
66bc952696SBarry Smith #undef __FUNCT__
67bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryView"
68bc952696SBarry Smith /*@C
69bc952696SBarry Smith     TSTrajectoryView - Prints information about the trajectory object
70bc952696SBarry Smith 
71bc952696SBarry Smith     Collective on TSTrajectory
72bc952696SBarry Smith 
73bc952696SBarry Smith     Input Parameters:
74b1d74d50SHong Zhang +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
75bc952696SBarry Smith -   viewer - visualization context
76bc952696SBarry Smith 
77bc952696SBarry Smith     Options Database Key:
78bc952696SBarry Smith .   -ts_view - calls TSView() at end of TSStep()
79bc952696SBarry Smith 
80bc952696SBarry Smith     Notes:
81bc952696SBarry Smith     The available visualization contexts include
82bc952696SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
83bc952696SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
84bc952696SBarry Smith          output where only the first processor opens
85bc952696SBarry Smith          the file.  All other processors send their
86bc952696SBarry Smith          data to the first processor to print.
87bc952696SBarry Smith 
88bc952696SBarry Smith     The user can open an alternative visualization context with
89bc952696SBarry Smith     PetscViewerASCIIOpen() - output to a specified file.
90bc952696SBarry Smith 
91bc952696SBarry Smith     Level: beginner
92bc952696SBarry Smith 
93bc952696SBarry Smith .keywords: TS, timestep, view
94bc952696SBarry Smith 
95bc952696SBarry Smith .seealso: PetscViewerASCIIOpen()
96bc952696SBarry Smith @*/
97b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
98bc952696SBarry Smith {
99bc952696SBarry Smith   PetscErrorCode ierr;
100bc952696SBarry Smith   PetscBool      iascii;
101bc952696SBarry Smith 
102bc952696SBarry Smith   PetscFunctionBegin;
103b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TS_CLASSID,1);
104bc952696SBarry Smith   if (!viewer) {
105b1d74d50SHong Zhang     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
106bc952696SBarry Smith   }
107bc952696SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
108b1d74d50SHong Zhang   PetscCheckSameComm(tj,1,viewer,2);
109bc952696SBarry Smith 
110bc952696SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
111bc952696SBarry Smith   if (iascii) {
112b1d74d50SHong Zhang     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
113b1d74d50SHong Zhang     if (tj->ops->view) {
114b1d74d50SHong Zhang       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
115bc952696SBarry Smith     }
116bc952696SBarry Smith   }
117bc952696SBarry Smith   PetscFunctionReturn(0);
118bc952696SBarry Smith }
119bc952696SBarry Smith 
120bc952696SBarry Smith #undef  __FUNCT__
121bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryCreate"
122bc952696SBarry Smith /*@C
123bc952696SBarry Smith   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
124bc952696SBarry Smith 
125bc952696SBarry Smith   Collective on MPI_Comm
126bc952696SBarry Smith 
127bc952696SBarry Smith   Input Parameter:
128bc952696SBarry Smith . comm - The communicator
129bc952696SBarry Smith 
130bc952696SBarry Smith   Output Parameter:
131b1d74d50SHong Zhang . tj   - The trajectory object
132bc952696SBarry Smith 
133bc952696SBarry Smith   Level: advanced
134bc952696SBarry Smith 
135bc952696SBarry Smith   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call
136bc952696SBarry Smith    TSGetTrajectory() to access the created trajectory.
137bc952696SBarry Smith 
138bc952696SBarry Smith .keywords: TS, create
139bc952696SBarry Smith .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory()
140bc952696SBarry Smith @*/
141b1d74d50SHong Zhang PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
142bc952696SBarry Smith {
143bc952696SBarry Smith   TSTrajectory   t;
144bc952696SBarry Smith   PetscErrorCode ierr;
145bc952696SBarry Smith 
146bc952696SBarry Smith   PetscFunctionBegin;
147b1d74d50SHong Zhang   PetscValidPointer(tj,2);
148b1d74d50SHong Zhang   *tj = NULL;
149bc952696SBarry Smith   ierr = TSInitializePackage();CHKERRQ(ierr);
150bc952696SBarry Smith 
15173107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
15268bece0bSHong Zhang   t->setupcalled = PETSC_FALSE;
153b1d74d50SHong Zhang   *tj = t;
154bc952696SBarry Smith   PetscFunctionReturn(0);
155bc952696SBarry Smith }
156bc952696SBarry Smith 
157bc952696SBarry Smith #undef __FUNCT__
158bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetType"
159bc952696SBarry Smith /*@C
160bc952696SBarry Smith   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
161bc952696SBarry Smith 
162bc952696SBarry Smith   Collective on TS
163bc952696SBarry Smith 
164bc952696SBarry Smith   Input Parameters:
165bc952696SBarry Smith + ts   - The TS context
166bc952696SBarry Smith - type - A known method
167bc952696SBarry Smith 
168bc952696SBarry Smith   Options Database Command:
169bc952696SBarry Smith . -tstrajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
170bc952696SBarry Smith 
171bc952696SBarry Smith    Level: intermediate
172bc952696SBarry Smith 
173bc952696SBarry Smith .keywords: TS, set, type
174bc952696SBarry Smith 
175bc952696SBarry Smith .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
176bc952696SBarry Smith 
177bc952696SBarry Smith @*/
178972caf09SHong Zhang PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
179bc952696SBarry Smith {
180972caf09SHong Zhang   PetscErrorCode (*r)(TSTrajectory,TS);
181bc952696SBarry Smith   PetscBool      match;
182bc952696SBarry Smith   PetscErrorCode ierr;
183bc952696SBarry Smith 
184bc952696SBarry Smith   PetscFunctionBegin;
185972caf09SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
186972caf09SHong Zhang   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
187bc952696SBarry Smith   if (match) PetscFunctionReturn(0);
188bc952696SBarry Smith 
189bc952696SBarry Smith   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
190bc952696SBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
191972caf09SHong Zhang   if (tj->ops->destroy) {
192972caf09SHong Zhang     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
193bc952696SBarry Smith 
194972caf09SHong Zhang     tj->ops->destroy = NULL;
195bc952696SBarry Smith   }
196972caf09SHong Zhang   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
197bc952696SBarry Smith 
198972caf09SHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
199972caf09SHong Zhang   ierr = (*r)(tj,ts);CHKERRQ(ierr);
200bc952696SBarry Smith   PetscFunctionReturn(0);
201bc952696SBarry Smith }
202bc952696SBarry Smith 
203972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
204972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
2059a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
206bc952696SBarry Smith 
207bc952696SBarry Smith #undef __FUNCT__
208bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegisterAll"
209bc952696SBarry Smith /*@C
210bc952696SBarry Smith   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
211bc952696SBarry Smith 
212bc952696SBarry Smith   Not Collective
213bc952696SBarry Smith 
214bc952696SBarry Smith   Level: advanced
215bc952696SBarry Smith 
216bc952696SBarry Smith .keywords: TS, timestepper, register, all
217bc952696SBarry Smith .seealso: TSCreate(), TSRegister(), TSRegisterDestroy()
218bc952696SBarry Smith @*/
219bc952696SBarry Smith PetscErrorCode  TSTrajectoryRegisterAll(void)
220bc952696SBarry Smith {
221bc952696SBarry Smith   PetscErrorCode ierr;
222bc952696SBarry Smith 
223bc952696SBarry Smith   PetscFunctionBegin;
224bc952696SBarry Smith   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
225bc952696SBarry Smith 
226bc952696SBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
2271c8c567eSBarry Smith   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
2289a53571cSHong Zhang   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
229bc952696SBarry Smith   PetscFunctionReturn(0);
230bc952696SBarry Smith }
231bc952696SBarry Smith 
232bc952696SBarry Smith #undef __FUNCT__
233bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryDestroy"
234bc952696SBarry Smith /*@
235bc952696SBarry Smith    TSTrajectoryDestroy - Destroys a trajectory context
236bc952696SBarry Smith 
237bc952696SBarry Smith    Collective on TSTrajectory
238bc952696SBarry Smith 
239bc952696SBarry Smith    Input Parameter:
240bc952696SBarry Smith .  ts - the TSTrajectory context obtained from TSTrajectoryCreate()
241bc952696SBarry Smith 
242bc952696SBarry Smith    Level: advanced
243bc952696SBarry Smith 
244bc952696SBarry Smith .keywords: TS, timestepper, destroy
245bc952696SBarry Smith 
246bc952696SBarry Smith .seealso: TSCreate(), TSSetUp(), TSSolve()
247bc952696SBarry Smith @*/
248972caf09SHong Zhang PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
249bc952696SBarry Smith {
250bc952696SBarry Smith   PetscErrorCode ierr;
251bc952696SBarry Smith 
252bc952696SBarry Smith   PetscFunctionBegin;
253972caf09SHong Zhang   if (!*tj) PetscFunctionReturn(0);
254972caf09SHong Zhang   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
255972caf09SHong Zhang   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
256bc952696SBarry Smith 
257972caf09SHong Zhang   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
258972caf09SHong Zhang   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
259bc952696SBarry Smith   PetscFunctionReturn(0);
260bc952696SBarry Smith }
261bc952696SBarry Smith 
262bc952696SBarry Smith #undef __FUNCT__
263772b2523SBarry Smith #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private"
264bc952696SBarry Smith /*
265772b2523SBarry Smith   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
266bc952696SBarry Smith 
267bc952696SBarry Smith   Collective on TSTrajectory
268bc952696SBarry Smith 
269bc952696SBarry Smith   Input Parameter:
270972caf09SHong Zhang . tj - TSTrajectory
271bc952696SBarry Smith 
272bc952696SBarry Smith   Level: intermediate
273bc952696SBarry Smith 
274bc952696SBarry Smith .keywords: TS, set, options, database, type
275bc952696SBarry Smith .seealso: TSSetFromOptions(), TSSetType()
276bc952696SBarry Smith */
277972caf09SHong Zhang static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,TSTrajectory tj,TS ts)
278bc952696SBarry Smith {
279bc952696SBarry Smith   PetscBool      opt;
280bc952696SBarry Smith   const char     *defaultType;
281bc952696SBarry Smith   char           typeName[256];
2829a53571cSHong Zhang   PetscBool      flg;
283bc952696SBarry Smith   PetscErrorCode ierr;
284bc952696SBarry Smith 
285bc952696SBarry Smith   PetscFunctionBegin;
286b1d74d50SHong Zhang   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
287bc952696SBarry Smith   else defaultType = TSTRAJECTORYBASIC;
288bc952696SBarry Smith 
289bc952696SBarry Smith   if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);}
290bc952696SBarry Smith   ierr = PetscOptionsFList("-tstrajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
291bc952696SBarry Smith   if (opt) {
2929a53571cSHong Zhang     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);
29368bece0bSHong Zhang     //if (flg) { /* ts_max_steps determines memory allocated */
29468bece0bSHong Zhang     //  ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,NULL);CHKERRQ(ierr);
29568bece0bSHong Zhang     //}
296972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
297bc952696SBarry Smith   } else {
298972caf09SHong Zhang     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
299bc952696SBarry Smith   }
300bc952696SBarry Smith   PetscFunctionReturn(0);
301bc952696SBarry Smith }
302bc952696SBarry Smith 
303bc952696SBarry Smith #undef __FUNCT__
304bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetFromOptions"
305bc952696SBarry Smith /*@
306bc952696SBarry Smith    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
307bc952696SBarry Smith 
308bc952696SBarry Smith    Collective on TSTrajectory
309bc952696SBarry Smith 
310bc952696SBarry Smith    Input Parameter:
311b1d74d50SHong Zhang .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
312bc952696SBarry Smith 
313bc952696SBarry Smith    Options Database Keys:
314bc952696SBarry Smith .  -tstrajectory_type <type> - TSTRAJECTORYBASIC
31568bece0bSHong Zhang .  -tstrajectory_max_cps <int>
316bc952696SBarry Smith 
317bc952696SBarry Smith    Level: advanced
318bc952696SBarry Smith 
31962b521acSHong Zhang    Notes: This is not normally called directly by users
320bc952696SBarry Smith 
32162b521acSHong Zhang .keywords: TS, timestep, set, options, database, trajectory
322bc952696SBarry Smith 
323bc952696SBarry Smith .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory()
324bc952696SBarry Smith @*/
325972caf09SHong Zhang PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
326bc952696SBarry Smith {
327bc952696SBarry Smith   PetscErrorCode ierr;
328bc952696SBarry Smith 
329bc952696SBarry Smith   PetscFunctionBegin;
330b1d74d50SHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
331972caf09SHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
332b1d74d50SHong Zhang   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
333972caf09SHong Zhang   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
33462b521acSHong Zhang     /* Handle specific TS options */
33562b521acSHong Zhang   if (tj->ops->setfromoptions) {
33662b521acSHong Zhang     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
33762b521acSHong Zhang   }
338bc952696SBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
339bc952696SBarry Smith   PetscFunctionReturn(0);
340bc952696SBarry Smith }
34168bece0bSHong Zhang 
34268bece0bSHong Zhang #undef __FUNCT__
34368bece0bSHong Zhang #define __FUNCT__ "TSTrajectorySetUp"
34468bece0bSHong Zhang /*@
34568bece0bSHong Zhang    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
34668bece0bSHong Zhang    of a TS trajectory.
34768bece0bSHong Zhang 
34868bece0bSHong Zhang    Collective on TS
34968bece0bSHong Zhang 
35068bece0bSHong Zhang    Input Parameter:
35168bece0bSHong Zhang .  ts - the TS context obtained from TSCreate()
35268bece0bSHong Zhang .  tj - the TS trajectory context
35368bece0bSHong Zhang 
35468bece0bSHong Zhang    Level: advanced
35568bece0bSHong Zhang 
35668bece0bSHong Zhang .keywords: TS, setup, checkpoint
35768bece0bSHong Zhang 
35868bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
35968bece0bSHong Zhang @*/
36068bece0bSHong Zhang PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
36168bece0bSHong Zhang {
36268bece0bSHong Zhang   PetscErrorCode ierr;
36368bece0bSHong Zhang 
36468bece0bSHong Zhang   PetscFunctionBegin;
36568bece0bSHong Zhang   if (!tj) PetscFunctionReturn(0);
36668bece0bSHong Zhang   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
36768bece0bSHong Zhang   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
36868bece0bSHong Zhang   if (tj->setupcalled) PetscFunctionReturn(0);
36968bece0bSHong Zhang 
37068bece0bSHong Zhang   if (!((PetscObject)tj)->type_name) {
37168bece0bSHong Zhang     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
37268bece0bSHong Zhang   }
37368bece0bSHong Zhang   if (tj->ops->setup) {
37468bece0bSHong Zhang     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
37568bece0bSHong Zhang   }
37668bece0bSHong Zhang 
37768bece0bSHong Zhang   tj->setupcalled = PETSC_TRUE;
37868bece0bSHong Zhang   PetscFunctionReturn(0);
37968bece0bSHong Zhang }
380