xref: /petsc/src/ts/trajectory/interface/traj.c (revision 0ecfd9fc350141c372c751a4adf2797bf0a87e35)
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: developer
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: developer
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    TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk
144 
145    Collective on TSLGCtx
146 
147    Input Parameters:
148 +  tj - the TSTrajectory context
149 .  transform - the transform function
150 .  destroy - function to destroy the optional context
151 -  ctx - optional context used by transform function
152 
153    Level: intermediate
154 
155 .keywords: TSTrajectory,  vector, monitor, view
156 
157 .seealso:  TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform()
158 @*/
159 PetscErrorCode  TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx)
160 {
161   PetscFunctionBegin;
162   tj->transform        = transform;
163   tj->transformdestroy = destroy;
164   tj->transformctx     = tctx;
165   PetscFunctionReturn(0);
166 }
167 
168 
169 /*@C
170   TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE
171 
172   Collective on MPI_Comm
173 
174   Input Parameter:
175 . comm - the communicator
176 
177   Output Parameter:
178 . tj   - the trajectory object
179 
180   Level: developer
181 
182   Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory().
183 
184 .keywords: TS, trajectory, create
185 
186 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory()
187 @*/
188 PetscErrorCode  TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj)
189 {
190   TSTrajectory   t;
191   PetscErrorCode ierr;
192 
193   PetscFunctionBegin;
194   PetscValidPointer(tj,2);
195   *tj = NULL;
196   ierr = TSInitializePackage();CHKERRQ(ierr);
197 
198   ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr);
199   t->setupcalled = PETSC_FALSE;
200   *tj = t;
201   PetscFunctionReturn(0);
202 }
203 
204 /*@C
205   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
206 
207   Collective on TS
208 
209   Input Parameters:
210 + tj   - the TSTrajectory context
211 . ts   - the TS context
212 - type - a known method
213 
214   Options Database Command:
215 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
216 
217    Level: developer
218 
219 .keywords: TS, trajectory, timestep, set, type
220 
221 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy()
222 
223 @*/
224 PetscErrorCode  TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type)
225 {
226   PetscErrorCode (*r)(TSTrajectory,TS);
227   PetscBool      match;
228   PetscErrorCode ierr;
229 
230   PetscFunctionBegin;
231   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
232   ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr);
233   if (match) PetscFunctionReturn(0);
234 
235   ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr);
236   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type);
237   if (tj->ops->destroy) {
238     ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr);
239 
240     tj->ops->destroy = NULL;
241   }
242   ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr);
243 
244   ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr);
245   ierr = (*r)(tj,ts);CHKERRQ(ierr);
246   PetscFunctionReturn(0);
247 }
248 
249 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS);
250 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS);
251 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS);
252 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS);
253 
254 /*@C
255   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
256 
257   Not Collective
258 
259   Level: developer
260 
261 .keywords: TS, trajectory, register, all
262 
263 .seealso: TSTrajectoryRegister()
264 @*/
265 PetscErrorCode  TSTrajectoryRegisterAll(void)
266 {
267   PetscErrorCode ierr;
268 
269   PetscFunctionBegin;
270   if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0);
271   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
272 
273   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
274   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
275   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
276   ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr);
277   PetscFunctionReturn(0);
278 }
279 
280 /*@
281    TSTrajectoryDestroy - Destroys a trajectory context
282 
283    Collective on TSTrajectory
284 
285    Input Parameter:
286 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
287 
288    Level: developer
289 
290 .keywords: TS, trajectory, timestep, destroy
291 
292 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp()
293 @*/
294 PetscErrorCode  TSTrajectoryDestroy(TSTrajectory *tj)
295 {
296   PetscErrorCode ierr;
297 
298   PetscFunctionBegin;
299   if (!*tj) PetscFunctionReturn(0);
300   PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1);
301   if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);}
302 
303   if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);}
304   if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);}
305   ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr);
306   ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr);
307   ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr);
308   PetscFunctionReturn(0);
309 }
310 
311 /*
312   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
313 
314   Collective on TSTrajectory
315 
316   Input Parameter:
317 + tj - the TSTrajectory context
318 - ts - the TS context
319 
320   Options Database Keys:
321 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
322 
323   Level: developer
324 
325 .keywords: TS, trajectory, set, options, type
326 
327 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType()
328 */
329 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts)
330 {
331   PetscBool      opt;
332   const char     *defaultType;
333   char           typeName[256];
334   PetscBool      flg;
335   PetscErrorCode ierr;
336 
337   PetscFunctionBegin;
338   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
339   else defaultType = TSTRAJECTORYBASIC;
340 
341   ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);
342   ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
343   if (opt) {
344     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr);
345     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
346   } else {
347     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
348   }
349   PetscFunctionReturn(0);
350 }
351 
352 /*@
353    TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller
354 
355    Collective on TSTrajectory
356 
357    Input Arguments:
358 +  tj - the TSTrajectory context
359 -  flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable
360 
361    Options Database Keys:
362 .  -ts_trajectory_monitor - print TSTrajectory information
363 
364    Level: developer
365 
366 .keywords: TS, trajectory, set, monitor
367 
368 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp()
369 @*/
370 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg)
371 {
372   PetscErrorCode ierr;
373 
374   PetscFunctionBegin;
375   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
376   PetscValidLogicalCollectiveBool(tj,flg,2);
377   if (flg) {
378     if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);}
379   } else {
380     ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr);
381   }
382   PetscFunctionReturn(0);
383 }
384 
385 /*@
386    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
387 
388    Collective on TSTrajectory
389 
390    Input Parameter:
391 +  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
392 -  ts - the TS context
393 
394    Options Database Keys:
395 +  -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION
396 -  -ts_trajectory_monitor - print TSTrajectory information
397 
398    Level: developer
399 
400    Notes: This is not normally called directly by users
401 
402 .keywords: TS, trajectory, timestep, set, options, database
403 
404 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp()
405 @*/
406 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
407 {
408   PetscErrorCode ierr;
409   PetscBool      set,flg;
410 
411   PetscFunctionBegin;
412   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
413   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
414   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
415   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
416   ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr);
417   if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);}
418   /* Handle specific TS options */
419   if (tj->ops->setfromoptions) {
420     ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr);
421   }
422   ierr = PetscOptionsEnd();CHKERRQ(ierr);
423   PetscFunctionReturn(0);
424 }
425 
426 /*@
427    TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use
428    of a TS trajectory.
429 
430    Collective on TS
431 
432    Input Parameter:
433 +  ts - the TS context obtained from TSCreate()
434 -  tj - the TS trajectory context
435 
436    Level: developer
437 
438 .keywords: TS, trajectory, setup
439 
440 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy()
441 @*/
442 PetscErrorCode  TSTrajectorySetUp(TSTrajectory tj,TS ts)
443 {
444   PetscErrorCode ierr;
445 
446   PetscFunctionBegin;
447   if (!tj) PetscFunctionReturn(0);
448   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
449   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
450   if (tj->setupcalled) PetscFunctionReturn(0);
451 
452   if (!((PetscObject)tj)->type_name) {
453     ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr);
454   }
455   if (tj->ops->setup) {
456     ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr);
457   }
458 
459   tj->setupcalled = PETSC_TRUE;
460 
461   /* Set the counters to zero */
462   tj->recomps    = 0;
463   tj->diskreads  = 0;
464   tj->diskwrites = 0;
465   PetscFunctionReturn(0);
466 }
467