xref: /petsc/src/ts/interface/tsreg.c (revision 4db511f1d1b98f37717f3ecaf35cce8ecdb684f9)
1 /*$Id: tsreg.c,v 1.71 2001/08/06 21:18:08 bsmith Exp $*/
2 
3 #include "src/ts/tsimpl.h"      /*I "petscts.h"  I*/
4 
5 PetscFList TSList                       = PETSC_NULL;
6 PetscTruth TSRegisterAllCalled          = PETSC_FALSE;
7 PetscFList TSSerializeList              = PETSC_NULL;
8 PetscTruth TSSerializeRegisterAllCalled = PETSC_FALSE;
9 
10 #undef __FUNCT__
11 #define __FUNCT__ "TSSetType"
12 /*@C
13   TSSetType - Sets the method for the timestepping solver.
14 
15   Collective on TS
16 
17   Input Parameters:
18 + ts   - The TS context
19 - type - A known method
20 
21   Options Database Command:
22 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
23 
24    Notes:
25    See "petsc/include/petscts.h" for available methods (for instance)
26 +  TS_EULER - Euler
27 .  TS_PVODE - PVODE interface
28 .  TS_BEULER - Backward Euler
29 -  TS_PSEUDO - Pseudo-timestepping
30 
31    Normally, it is best to use the TSSetFromOptions() command and
32    then set the TS type from the options database rather than by using
33    this routine.  Using the options database provides the user with
34    maximum flexibility in evaluating the many different solvers.
35    The TSSetType() routine is provided for those situations where it
36    is necessary to set the timestepping solver independently of the
37    command line or options database.  This might be the case, for example,
38    when the choice of solver changes during the execution of the
39    program, and the user's application is taking responsibility for
40    choosing the appropriate method.  In other words, this routine is
41    not for beginners.
42 
43    Level: intermediate
44 
45 .keywords: TS, set, type
46 .seealso TSSetSerializeType()
47 @*/
48 int TSSetType(TS ts, TSType type)
49 {
50   int      (*r)(TS);
51   PetscTruth match;
52   int        ierr;
53 
54   PetscFunctionBegin;
55   PetscValidHeaderSpecific(ts, TS_COOKIE);
56   ierr = PetscTypeCompare((PetscObject) ts, type, &match);                                                CHKERRQ(ierr);
57   if (match == PETSC_TRUE) PetscFunctionReturn(0);
58 
59   /* Get the function pointers for the method requested */
60   if (TSRegisterAllCalled == PETSC_FALSE) {
61     ierr = TSRegisterAll(PETSC_NULL);                                                                     CHKERRQ(ierr);
62   }
63   ierr = PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);                                    CHKERRQ(ierr);
64   if (!r) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Unknown TS type: %s", type);
65 
66   if (ts->sles != PETSC_NULL) {
67     ierr = SLESDestroy(ts->sles);                                                                         CHKERRQ(ierr);
68     ts->sles = PETSC_NULL;
69   }
70   if (ts->snes != PETSC_NULL) {
71     ierr = SNESDestroy(ts->snes);                                                                         CHKERRQ(ierr);
72     ts->snes = PETSC_NULL;
73   }
74   if (ts->ops->destroy != PETSC_NULL) {
75     ierr = (*(ts)->ops->destroy)(ts);                                                                     CHKERRQ(ierr);
76   }
77   ierr = (*r)(ts);                                                                                        CHKERRQ(ierr);
78 
79   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);                                                CHKERRQ(ierr);
80   PetscFunctionReturn(0);
81 }
82 
83 #undef __FUNCT__
84 #define __FUNCT__ "TSGetType"
85 /*@C
86   TSGetType - Gets the TS method type (as a string).
87 
88   Not Collective
89 
90   Input Parameter:
91 . ts - The TS
92 
93   Output Parameter:
94 . type - The name of TS method
95 
96   Level: intermediate
97 
98 .keywords: TS, timestepper, get, type, name
99 .seealso TSSetType()
100 @*/
101 int TSGetType(TS ts, TSType *type)
102 {
103   int ierr;
104 
105   PetscFunctionBegin;
106   PetscValidHeaderSpecific(ts, TS_COOKIE);
107   PetscValidPointer(type);
108   if (TSRegisterAllCalled == PETSC_FALSE) {
109     ierr = TSRegisterAll(PETSC_NULL);                                                                     CHKERRQ(ierr);
110   }
111   *type = ts->type_name;
112   PetscFunctionReturn(0);
113 }
114 
115 #undef __FUNCT__
116 #define __FUNCT__ "TSSetSerializeType"
117 /*@C
118   TSSetSerializeType - Sets the serialization method for the ts.
119 
120   Collective on TS
121 
122   Input Parameters:
123 + ts     - The TS context
124 - method - A known method
125 
126   Options Database Command:
127 . -ts_serialize_type <method> - Sets the method; use -help for a list
128                                 of available methods (for instance, gbeuler_binary)
129 
130   Notes:
131   See "petsc/include/ts.h" for available methods (for instance)
132 . GTS_SER_BEULER_BINARY - Grid Backwards Euler TS to binary file
133 
134   Normally, it is best to use the TSSetFromOptions() command and
135   then set the TS type from the options database rather than by using
136   this routine.  Using the options database provides the user with
137   maximum flexibility in evaluating the many different solvers.
138   The TSSetSerializeType() routine is provided for those situations
139   where it is necessary to set the application ordering independently of the
140   command line or options database.  This might be the case, for example,
141   when the choice of solver changes during the execution of the
142   program, and the user's application is taking responsibility for
143   choosing the appropriate method.  In other words, this routine is
144   not for beginners.
145 
146   Level: intermediate
147 
148 .keywords: TS, set, type, serialization
149 .seealso TSSetType()
150 @*/
151 int TSSetSerializeType(TS ts, TSSerializeType method)
152 {
153   int      (*r)(MPI_Comm, TS *, PetscViewer, PetscTruth);
154   PetscTruth match;
155   int        ierr;
156 
157   PetscFunctionBegin;
158   PetscValidHeaderSpecific(ts, TS_COOKIE);
159   ierr = PetscSerializeCompare((PetscObject) ts, method, &match);                                         CHKERRQ(ierr);
160   if (match == PETSC_TRUE) PetscFunctionReturn(0);
161 
162   /* Get the function pointers for the method requested but do not call */
163   if (TSSerializeRegisterAllCalled == PETSC_FALSE) {
164     ierr = TSSerializeRegisterAll(PETSC_NULL);                                                            CHKERRQ(ierr);
165   }
166   ierr = PetscFListFind(ts->comm, TSSerializeList, method, (void (**)(void)) &r);                         CHKERRQ(ierr);
167   if (!r) SETERRQ1(PETSC_ERR_ARG_WRONG, "Unknown ts serialization type: %s", method);
168 
169   ierr = PetscObjectChangeSerializeName((PetscObject) ts, method);                                        CHKERRQ(ierr);
170   PetscFunctionReturn(0);
171 }
172 
173 #undef __FUNCT__
174 #define __FUNCT__ "TSGetSerializeType"
175 /*@C
176   TSGetSerializeType - Gets the TS serialization method (as a string).
177 
178   Not collective
179 
180   Input Parameter:
181 . ts   - The ts
182 
183   Output Parameter:
184 . type - The name of TS serialization method
185 
186   Level: intermediate
187 
188 .keywords: TS, get, serialize, type, name
189 .seealso TSSetType()
190 @*/
191 int TSGetSerializeType(TS ts, TSSerializeType *type)
192 {
193   int ierr;
194 
195   PetscFunctionBegin;
196   PetscValidHeaderSpecific(ts, TS_COOKIE);
197   PetscValidPointer(type);
198   if (TSSerializeRegisterAllCalled == PETSC_FALSE) {
199     ierr = TSSerializeRegisterAll(PETSC_NULL);                                                            CHKERRQ(ierr);
200   }
201   *type = ts->serialize_name;
202   PetscFunctionReturn(0);
203 }
204 
205 /*--------------------------------------------------------------------------------------------------------------------*/
206 
207 #undef __FUNCT__
208 #define __FUNCT__ "TSRegister"
209 /*@C
210   TSRegister - See TSRegisterDynamic()
211 
212   Level: advanced
213 @*/
214 int TSRegister(const char sname[], const char path[], const char name[], int (*function)(TS))
215 {
216   char fullname[256];
217   int  ierr;
218 
219   PetscFunctionBegin;
220   ierr = PetscStrcpy(fullname, path);                                                                     CHKERRQ(ierr);
221   ierr = PetscStrcat(fullname, ":");                                                                      CHKERRQ(ierr);
222   ierr = PetscStrcat(fullname, name);                                                                     CHKERRQ(ierr);
223   ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);                              CHKERRQ(ierr);
224   PetscFunctionReturn(0);
225 }
226 
227 /*@C
228   TSSerializeRegister - Adds a serialization method to the ts package.
229 
230   Synopsis:
231 
232   TSSerializeRegister(char *name, char *path, char *func_name,
233                         int (*serialize_func)(MPI_Comm, TS *, PetscViewer, PetscTruth))
234 
235   Not Collective
236 
237   Input Parameters:
238 + name           - The name of a new user-defined serialization routine
239 . path           - The path (either absolute or relative) of the library containing this routine
240 . func_name      - The name of the serialization routine
241 - serialize_func - The serialization routine itself
242 
243   Notes:
244   TSSerializeRegister() may be called multiple times to add several user-defined serializers.
245 
246   If dynamic libraries are used, then the fourth input argument (serialize_func) is ignored.
247 
248   Sample usage:
249 .vb
250   TSSerializeRegisterDynamic("my_store", "/home/username/my_lib/lib/libO/solaris/libmy.a", "MyStoreFunc", MyStoreFunc);
251 .ve
252 
253   Then, your serialization can be chosen with the procedural interface via
254 .vb
255     TSSetSerializeType(ts, "my_store")
256 .ve
257   or at runtime via the option
258 .vb
259     -ts_serialize_type my_store
260 .ve
261 
262   Note: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values.
263 
264   Level: advanced
265 
266 .keywords: ts, register
267 .seealso: TSSerializeRegisterAll(), TSSerializeRegisterDestroy()
268 M*/
269 #undef __FUNCT__
270 #define __FUNCT__ "TSSerializeRegister"
271 int TSSerializeRegister(const char sname[], const char path[], const char name[],
272                           int (*function)(MPI_Comm, TS *, PetscViewer, PetscTruth))
273 {
274   char fullname[256];
275   int  ierr;
276 
277   PetscFunctionBegin;
278   ierr = PetscStrcpy(fullname, path);                                                                     CHKERRQ(ierr);
279   ierr = PetscStrcat(fullname, ":");                                                                      CHKERRQ(ierr);
280   ierr = PetscStrcat(fullname, name);                                                                     CHKERRQ(ierr);
281   ierr = PetscFListAdd(&TSSerializeList, sname, fullname, (void (*)(void)) function);                     CHKERRQ(ierr);
282   PetscFunctionReturn(0);
283 }
284 
285 /*-------------------------------------------------------------------------------------------------------------------*/
286 #undef __FUNCT__
287 #define __FUNCT__ "TSRegisterDestroy"
288 /*@C
289    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
290 
291    Not Collective
292 
293    Level: advanced
294 
295 .keywords: TS, timestepper, register, destroy
296 .seealso: TSRegister(), TSRegisterAll(), TSSerializeRegisterDestroy(), TSRegisterDynamic()
297 @*/
298 int TSRegisterDestroy(void)
299 {
300   int ierr;
301 
302   PetscFunctionBegin;
303   if (TSList != PETSC_NULL) {
304     ierr = PetscFListDestroy(&TSList);                                                                    CHKERRQ(ierr);
305     TSList = PETSC_NULL;
306   }
307   TSRegisterAllCalled = PETSC_FALSE;
308   PetscFunctionReturn(0);
309 }
310 
311 #undef __FUNCT__
312 #define __FUNCT__ "TSSerializeRegisterDestroy"
313 /*@C
314   TSSerializeRegisterDestroy - Frees the list of serialization routines for
315   timesteppers that were registered by FListAdd().
316 
317   Not collective
318 
319   Level: advanced
320 
321 .keywords: ts, serialization, register, destroy
322 .seealso: TSSerializeRegisterAll(), TSRegisterDestroy()
323 @*/
324 int TSSerializeRegisterDestroy()
325 {
326   int ierr;
327 
328   PetscFunctionBegin;
329   if (TSSerializeList != PETSC_NULL) {
330     ierr = PetscFListDestroy(&TSSerializeList);                                                           CHKERRQ(ierr);
331     TSSerializeList = PETSC_NULL;
332   }
333   TSSerializeRegisterAllCalled = PETSC_FALSE;
334   PetscFunctionReturn(0);
335 }
336