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