xref: /petsc/src/ts/trajectory/interface/traj.c (revision 20a6ff2bf3e68ed71e4fbaba49bff68b457f8022)
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 
8 #undef __FUNCT__
9 #define __FUNCT__ "TSTrajectoryRegister"
10 /*@C
11   TSTrajectoryRegister - Adds a way of storing trajectories to the TS package
12 
13   Not Collective
14 
15   Input Parameters:
16 + name        - The name of a new user-defined creation routine
17 - create_func - The creation routine itself
18 
19   Notes:
20   TSTrajectoryRegister() may be called multiple times to add several user-defined tses.
21 
22   Level: advanced
23 
24 .keywords: TS, register
25 
26 .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy()
27 @*/
28 PetscErrorCode  TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS))
29 {
30   PetscErrorCode ierr;
31 
32   PetscFunctionBegin;
33   ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr);
34   PetscFunctionReturn(0);
35 }
36 
37 #undef __FUNCT__
38 #define __FUNCT__ "TSTrajectorySet"
39 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X)
40 {
41   PetscErrorCode ierr;
42 
43   PetscFunctionBegin;
44   if (!tj) PetscFunctionReturn(0);
45   ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr);
46   PetscFunctionReturn(0);
47 }
48 
49 #undef __FUNCT__
50 #define __FUNCT__ "TSTrajectoryGet"
51 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time)
52 {
53   PetscErrorCode ierr;
54 
55   PetscFunctionBegin;
56   if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory");
57   ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr);
58   PetscFunctionReturn(0);
59 }
60 
61 #undef __FUNCT__
62 #define __FUNCT__ "TSTrajectoryView"
63 /*@C
64     TSTrajectoryView - Prints information about the trajectory object
65 
66     Collective on TSTrajectory
67 
68     Input Parameters:
69 +   tj - the TSTrajectory context obtained from TSTrajectoryCreate()
70 -   viewer - visualization context
71 
72     Options Database Key:
73 .   -ts_view - calls TSView() at end of TSStep()
74 
75     Notes:
76     The available visualization contexts include
77 +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
78 -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
79          output where only the first processor opens
80          the file.  All other processors send their
81          data to the first processor to print.
82 
83     The user can open an alternative visualization context with
84     PetscViewerASCIIOpen() - output to a specified file.
85 
86     Level: beginner
87 
88 .keywords: TS, timestep, view
89 
90 .seealso: PetscViewerASCIIOpen()
91 @*/
92 PetscErrorCode  TSTrajectoryView(TSTrajectory tj,PetscViewer viewer)
93 {
94   PetscErrorCode ierr;
95   PetscBool      iascii;
96 
97   PetscFunctionBegin;
98   PetscValidHeaderSpecific(tj,TS_CLASSID,1);
99   if (!viewer) {
100     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr);
101   }
102   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
103   PetscCheckSameComm(tj,1,viewer,2);
104 
105   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
106   if (iascii) {
107     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr);
108     if (tj->ops->view) {
109       ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr);
110     }
111   }
112   PetscFunctionReturn(0);
113 }
114 
115 #undef  __FUNCT__
116 #define __FUNCT__ "TSTrajectoryCreate"
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(). One can call
131    TSGetTrajectory() to access the created trajectory.
132 
133 .keywords: TS, create
134 .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory()
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   *tj = t;
148   PetscFunctionReturn(0);
149 }
150 
151 #undef __FUNCT__
152 #define __FUNCT__ "TSTrajectorySetType"
153 /*@C
154   TSTrajectorySetType - Sets the storage method to be used as in a trajectory
155 
156   Collective on TS
157 
158   Input Parameters:
159 + ts   - The TS context
160 - type - A known method
161 
162   Options Database Command:
163 . -tstrajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic)
164 
165    Level: intermediate
166 
167 .keywords: TS, set, type
168 
169 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
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 
201 #undef __FUNCT__
202 #define __FUNCT__ "TSTrajectoryRegisterAll"
203 /*@C
204   TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package.
205 
206   Not Collective
207 
208   Level: advanced
209 
210 .keywords: TS, timestepper, register, all
211 .seealso: TSCreate(), TSRegister(), TSRegisterDestroy()
212 @*/
213 PetscErrorCode  TSTrajectoryRegisterAll(void)
214 {
215   PetscErrorCode ierr;
216 
217   PetscFunctionBegin;
218   TSTrajectoryRegisterAllCalled = PETSC_TRUE;
219 
220   ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr);
221   ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr);
222   ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr);
223   PetscFunctionReturn(0);
224 }
225 
226 #undef __FUNCT__
227 #define __FUNCT__ "TSTrajectoryDestroy"
228 /*@
229    TSTrajectoryDestroy - Destroys a trajectory context
230 
231    Collective on TSTrajectory
232 
233    Input Parameter:
234 .  ts - the TSTrajectory context obtained from TSTrajectoryCreate()
235 
236    Level: advanced
237 
238 .keywords: TS, timestepper, destroy
239 
240 .seealso: TSCreate(), TSSetUp(), TSSolve()
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 = PetscHeaderDestroy(tj);CHKERRQ(ierr);
253   PetscFunctionReturn(0);
254 }
255 
256 #undef __FUNCT__
257 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private"
258 /*
259   TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options.
260 
261   Collective on TSTrajectory
262 
263   Input Parameter:
264 . tj - TSTrajectory
265 
266   Level: intermediate
267 
268 .keywords: TS, set, options, database, type
269 .seealso: TSSetFromOptions(), TSSetType()
270 */
271 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,TSTrajectory tj,TS ts)
272 {
273   PetscBool      opt;
274   const char     *defaultType;
275   char           typeName[256];
276   PetscBool      flg;
277   PetscErrorCode ierr;
278 
279   PetscFunctionBegin;
280   if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name;
281   else defaultType = TSTRAJECTORYBASIC;
282 
283   if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);}
284   ierr = PetscOptionsFList("-tstrajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr);
285   if (opt) {
286     ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);
287     if (flg) { /* ts_max_steps determines memory allocated */
288       ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,NULL);CHKERRQ(ierr);
289     }
290     ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr);
291   } else {
292     ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr);
293   }
294   PetscFunctionReturn(0);
295 }
296 
297 #undef __FUNCT__
298 #define __FUNCT__ "TSTrajectorySetFromOptions"
299 /*@
300    TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options.
301 
302    Collective on TSTrajectory
303 
304    Input Parameter:
305 .  tj - the TSTrajectory context obtained from TSTrajectoryCreate()
306 
307    Options Database Keys:
308 .  -tstrajectory_type <type> - TSTRAJECTORYBASIC
309 
310    Level: advanced
311 
312    Notes: This is not normally called directly by users, instead it is called by TSSetFromOptions() after a call to
313    TSSetSaveTrajectory()
314 
315 .keywords: TS, timestep, set, options, database
316 
317 .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory()
318 @*/
319 PetscErrorCode  TSTrajectorySetFromOptions(TSTrajectory tj,TS ts)
320 {
321   PetscErrorCode ierr;
322 
323   PetscFunctionBegin;
324   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1);
325   PetscValidHeaderSpecific(ts,TS_CLASSID,2);
326   ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr);
327   ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr);
328   ierr = PetscOptionsEnd();CHKERRQ(ierr);
329   PetscFunctionReturn(0);
330 }
331