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