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