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