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