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