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