xref: /petsc/src/ts/trajectory/interface/traj.c (revision c688d0420b4e513ff34944d1e1ad7d4e50aafa8d)
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, trajectory, timestep, register
26 
27 .seealso: TSTrajectoryRegisterAll()
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, trajectory, 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().
141 
142 .keywords: TS, trajectory, create
143 
144 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType()
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 + tj   - the TSTrajectory context
171 . ts   - the TS context
172 - type - a known method
173 
174   Options Database Command:
175 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
176 
177    Level: intermediate
178 
179 .keywords: TS, trajectory, timestep, set, type
180 
181 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
182 
183 @*/
184 PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
185 {
186   PetscErrorCode (*r)(TSTrajectory,TS);
187   PetscBool      match;
188   PetscErrorCode ierr;
189 
190   PetscFunctionBegin;
191   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
192   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
193   if (match) PetscFunctionReturn(0);
194 
195   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
196   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
197   if (tj->ops->destroy) {
198     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
199 
200     tj->ops->destroy = NULL;
201   }
202   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
203 
204   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
205   ierr = (*r)(tj,ts);CHKERRQ(ierr);
206   PetscFunctionReturn(0);
207 }
208 
209 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
210 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
211 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
212 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
213 
214 #undef __FUNCT__
215 #define __FUNCT__ "TSTrajectoryRegisterAll"
216 /*@C
217   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
218 
219   Not Collective
220 
221   Level: advanced
222 
223 .keywords: TS, trajectory, register, all
224 
225 .seealso: TSTrajectoryRegister()
226 @*/
227 PetscErrorCode  TSTrajectoryRegisterAll(void)
228 {
229   PetscErrorCode ierr;
230 
231   PetscFunctionBegin;
232   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
233   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
234 
235   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
236   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
237   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
238   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
239   PetscFunctionReturn(0);
240 }
241 
242 #undef __FUNCT__
243 #define __FUNCT__ "TSTrajectoryDestroy"
244 /*@
245    TSTrajectoryDestroy - Destroys a trajectory context
246 
247    Collective on TSTrajectory
248 
249    Input Parameter:
250 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
251 
252    Level: advanced
253 
254 .keywords: TS, trajectory, timestep, destroy
255 
256 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
257 @*/
258 PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
259 {
260   PetscErrorCode ierr;
261 
262   PetscFunctionBegin;
263   if (!*tj) PetscFunctionReturn(0);
264   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
265   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
266 
267   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
268   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
269   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
270   PetscFunctionReturn(0);
271 }
272 
273 #undef __FUNCT__
274 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private"
275 /*
276   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
277 
278   Collective on TSTrajectory
279 
280   Input Parameter:
281 + tj - the TSTrajectory context
282 - ts - the TS context
283 
284   Options Database Keys:
285 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
286 
287   Level: intermediate
288 
289 .keywords: TS, trajectory, set, options, type
290 
291 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
292 */
293 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
294 {
295   PetscBool      opt;
296   const char     *defaultType;
297   char           typeName[256];
298   PetscBool      flg;
299   PetscErrorCode ierr;
300 
301   PetscFunctionBegin;
302   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
303   else defaultType = TSTRAJECTORYBASIC;
304 
305   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
306   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
307   if (opt) {
308     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
309     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
310   } else {
311     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
312   }
313   PetscFunctionReturn(0);
314 }
315 
316 #undef __FUNCT__
317 #define __FUNCT__ "TSTrajectorySetMonitor"
318 /*@
319    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
320 
321    Collective on TSTrajectory
322 
323    Input Arguments:
324 +  tj - the TSTrajectory context
325 -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
326 
327    Options Database Keys:
328 .  -ts_trajectory_monitor - print TSTrajectory information
329 
330    Level: intermediate
331 
332 .keywords: TS, trajectory, set, monitor
333 
334 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
335 @*/
336 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
337 {
338   PetscErrorCode ierr;
339 
340   PetscFunctionBegin;
341   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
342   PetscValidLogicalCollectiveBool(tj,flg,2);
343   if (flg) {
344     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
345   } else {
346     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
347   }
348   PetscFunctionReturn(0);
349 }
350 
351 #undef __FUNCT__
352 #define __FUNCT__ "TSTrajectorySetFromOptions"
353 /*@
354    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
355 
356    Collective on TSTrajectory
357 
358    Input Parameter:
359 +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
360 -  ts - the TS context
361 
362    Options Database Keys:
363 +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
364 -  -ts_trajectory_monitor - print TSTrajectory information
365 
366    Level: advanced
367 
368    Notes: This is not normally called directly by users
369 
370 .keywords: TS, trajectory, timestep, set, options, database
371 
372 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
373 @*/
374 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
375 {
376   PetscErrorCode ierr;
377   PetscBool      set,flg;
378 
379   PetscFunctionBegin;
380   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
381   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
382   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
383   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
384   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
385   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
386   /* Handle specific TS options */
387   if (tj->ops->setfromoptions) {
388     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
389   }
390   ierr = PetscOptionsEnd();CHKERRQ(ierr);
391   PetscFunctionReturn(0);
392 }
393 
394 #undef __FUNCT__
395 #define __FUNCT__ "TSTrajectorySetUp"
396 /*@
397    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
398    of a TS trajectory.
399 
400    Collective on TS
401 
402    Input Parameter:
403 +  ts - the TS context obtained from TSCreate()
404 -  tj - the TS trajectory context
405 
406    Level: advanced
407 
408 .keywords: TS, trajectory, setup
409 
410 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
411 @*/
412 PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
413 {
414   PetscErrorCode ierr;
415 
416   PetscFunctionBegin;
417   if (!tj) PetscFunctionReturn(0);
418   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
419   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
420   if (tj->setupcalled) PetscFunctionReturn(0);
421 
422   if (!((PetscObject)tj)->type_name) {
423     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
424   }
425   if (tj->ops->setup) {
426     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
427   }
428 
429   tj->setupcalled = PETSC_TRUE;
430 
431   /* Set the counters to zero */
432   tj->recomps    = 0;
433   tj->diskreads  = 0;
434   tj->diskwrites = 0;
435   PetscFunctionReturn(0);
436 }
437