xref: /petsc/src/ts/trajectory/interface/traj.c (revision 285336bf1201b8fff0c7fa624ffd2deb991d98e5)
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_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep()
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,TSTRAJECTORY_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     ierr = PetscViewerASCIIPrintf(viewer,"  total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr);
114     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr);
115     ierr = PetscViewerASCIIPrintf(viewer,"  disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr);
116     if (tj->ops->view) {
117       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
118       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
119       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
120     }
121   }
122   PetscFunctionReturn(0);
123 }
124 
125 #undef  __FUNCT__
126 #define __FUNCT__ "TSTrajectoryCreate"
127 /*@C
128   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
129 
130   Collective on MPI_Comm
131 
132   Input Parameter:
133 . comm - The communicator
134 
135   Output Parameter:
136 . tj   - The trajectory object
137 
138   Level: advanced
139 
140   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call
141    TSGetTrajectory() to access the created trajectory.
142 
143 .keywords: TS, create
144 .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory()
145 @*/
146 PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
147 {
148   TSTrajectory   t;
149   PetscErrorCode ierr;
150 
151   PetscFunctionBegin;
152   PetscValidPointer(tj,2);
153   *tj = NULL;
154   ierr = TSInitializePackage();CHKERRQ(ierr);
155 
156   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
157   t->setupcalled = PETSC_FALSE;
158   *tj = t;
159   PetscFunctionReturn(0);
160 }
161 
162 #undef __FUNCT__
163 #define __FUNCT__ "TSTrajectorySetType"
164 /*@C
165   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
166 
167   Collective on TS
168 
169   Input Parameters:
170 + ts   - The TS context
171 - type - A known method
172 
173   Options Database Command:
174 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
175 
176    Level: intermediate
177 
178 .keywords: TS, set, type
179 
180 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
181 
182 @*/
183 PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
184 {
185   PetscErrorCode (*r)(TSTrajectory,TS);
186   PetscBool      match;
187   PetscErrorCode ierr;
188 
189   PetscFunctionBegin;
190   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
191   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
192   if (match) PetscFunctionReturn(0);
193 
194   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
195   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
196   if (tj->ops->destroy) {
197     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
198 
199     tj->ops->destroy = NULL;
200   }
201   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
202 
203   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
204   ierr = (*r)(tj,ts);CHKERRQ(ierr);
205   PetscFunctionReturn(0);
206 }
207 
208 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
209 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
210 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
211 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
212 
213 #undef __FUNCT__
214 #define __FUNCT__ "TSTrajectoryRegisterAll"
215 /*@C
216   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
217 
218   Not Collective
219 
220   Level: advanced
221 
222 .keywords: TS, timestepper, register, all
223 .seealso: TSCreate(), TSRegister(), TSRegisterDestroy()
224 @*/
225 PetscErrorCode  TSTrajectoryRegisterAll(void)
226 {
227   PetscErrorCode ierr;
228 
229   PetscFunctionBegin;
230   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
231   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
232 
233   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
234   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
235   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
236   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
237   PetscFunctionReturn(0);
238 }
239 
240 #undef __FUNCT__
241 #define __FUNCT__ "TSTrajectoryDestroy"
242 /*@
243    TSTrajectoryDestroy - Destroys a trajectory context
244 
245    Collective on TSTrajectory
246 
247    Input Parameter:
248 .  ts - the TSTrajectory context obtained from TSTrajectoryCreate()
249 
250    Level: advanced
251 
252 .keywords: TS, timestepper, destroy
253 
254 .seealso: TSCreate(), TSSetUp(), TSSolve()
255 @*/
256 PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
257 {
258   PetscErrorCode ierr;
259 
260   PetscFunctionBegin;
261   if (!*tj) PetscFunctionReturn(0);
262   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
263   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
264 
265   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
266   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
267   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
268   PetscFunctionReturn(0);
269 }
270 
271 #undef __FUNCT__
272 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private"
273 /*
274   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
275 
276   Collective on TSTrajectory
277 
278   Input Parameter:
279 . tj - TSTrajectory
280 
281   Level: intermediate
282 
283 .keywords: TS, set, options, database, type
284 .seealso: TSSetFromOptions(), TSSetType()
285 */
286 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
287 {
288   PetscBool      opt;
289   const char     *defaultType;
290   char           typeName[256];
291   PetscBool      flg;
292   PetscErrorCode ierr;
293 
294   PetscFunctionBegin;
295   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
296   else defaultType = TSTRAJECTORYBASIC;
297 
298   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
299   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
300   if (opt) {
301     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
302     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
303   } else {
304     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
305   }
306   PetscFunctionReturn(0);
307 }
308 
309 #undef __FUNCT__
310 #define __FUNCT__ "TSTrajectorySetMonitor"
311 /*@
312    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
313 
314    Collective on TSTrajectory
315 
316    Input Arguments:
317 +  tj - the TSTrajectory context
318 -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
319 
320    Level: intermediate
321 
322 .seealso: TSTrajectorySetType()
323 @*/
324 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
325 {
326   PetscErrorCode ierr;
327 
328   PetscFunctionBegin;
329   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
330   PetscValidLogicalCollectiveBool(tj,flg,2);
331   if (flg) {
332     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
333   } else {
334     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
335   }
336   PetscFunctionReturn(0);
337 }
338 
339 #undef __FUNCT__
340 #define __FUNCT__ "TSTrajectorySetFromOptions"
341 /*@
342    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
343 
344    Collective on TSTrajectory
345 
346    Input Parameter:
347 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
348 
349    Options Database Keys:
350 .  -ts_trajectory_type <type> - TSTRAJECTORYBASIC
351 .  -ts_trajectory_max_cps <int>
352 
353    Level: advanced
354 
355    Notes: This is not normally called directly by users
356 
357 .keywords: TS, timestep, set, options, database, trajectory
358 
359 .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory()
360 @*/
361 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
362 {
363   PetscErrorCode ierr;
364   PetscBool      set,flg;
365 
366   PetscFunctionBegin;
367   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
368   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
369   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
370   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
371   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
372   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
373   /* Handle specific TS options */
374   if (tj->ops->setfromoptions) {
375     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
376   }
377   ierr = PetscOptionsEnd();CHKERRQ(ierr);
378   PetscFunctionReturn(0);
379 }
380 
381 #undef __FUNCT__
382 #define __FUNCT__ "TSTrajectorySetUp"
383 /*@
384    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
385    of a TS trajectory.
386 
387    Collective on TS
388 
389    Input Parameter:
390 .  ts - the TS context obtained from TSCreate()
391 .  tj - the TS trajectory context
392 
393    Level: advanced
394 
395 .keywords: TS, setup, checkpoint
396 
397 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
398 @*/
399 PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
400 {
401   PetscErrorCode ierr;
402 
403   PetscFunctionBegin;
404   if (!tj) PetscFunctionReturn(0);
405   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
406   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
407   if (tj->setupcalled) PetscFunctionReturn(0);
408 
409   if (!((PetscObject)tj)->type_name) {
410     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
411   }
412   if (tj->ops->setup) {
413     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
414   }
415 
416   tj->setupcalled = PETSC_TRUE;
417 
418   /* Set the counters to zero */
419   tj->recomps    = 0;
420   tj->diskreads  = 0;
421   tj->diskwrites = 0;
422   PetscFunctionReturn(0);
423 }
424