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; 72030b9a2SMatthew Knepley PetscFList TSSerializeList = PETSC_NULL; 82030b9a2SMatthew 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 /*--------------------------------------------------------------------------------------------------------------------*/ 2063cea93caSBarry Smith /*MC 2073cea93caSBarry Smith TSRegisterDynamic - Adds a creation method to the TS package. 208bdad233fSMatthew Knepley 209bdad233fSMatthew Knepley Synopsis: 210bdad233fSMatthew Knepley 2113cea93caSBarry Smith TSRegisterDynamic(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: 2223cea93caSBarry Smith TSRegisterDynamic() 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 2413cea93caSBarry Smith Notes: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 2423cea93caSBarry Smith If your function is not being put into a shared library then use TSRegister() instead 243bdad233fSMatthew Knepley 244bdad233fSMatthew Knepley Level: advanced 245bdad233fSMatthew Knepley 246bdad233fSMatthew Knepley .keywords: TS, register 247bdad233fSMatthew Knepley .seealso: TSRegisterAll(), TSRegisterDestroy() 2483cea93caSBarry Smith M*/ 2493cea93caSBarry Smith 250bdad233fSMatthew Knepley #undef __FUNCT__ 251bdad233fSMatthew Knepley #define __FUNCT__ "TSRegister" 2523cea93caSBarry Smith /*@C 2533cea93caSBarry Smith TSRegister - See TSRegisterDynamic() 2543cea93caSBarry Smith 255*7f6c08e0SMatthew Knepley Level: advanced 2563cea93caSBarry Smith @*/ 257bdad233fSMatthew Knepley int TSRegister(const char sname[], const char path[], const char name[], int (*function)(TS)) 258bdad233fSMatthew Knepley { 259bdad233fSMatthew Knepley char fullname[256]; 260bdad233fSMatthew Knepley int ierr; 261bdad233fSMatthew Knepley 262bdad233fSMatthew Knepley PetscFunctionBegin; 263bdad233fSMatthew Knepley ierr = PetscStrcpy(fullname, path); CHKERRQ(ierr); 264bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, ":"); CHKERRQ(ierr); 265bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, name); CHKERRQ(ierr); 266bdad233fSMatthew Knepley ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function); CHKERRQ(ierr); 267bdad233fSMatthew Knepley PetscFunctionReturn(0); 268bdad233fSMatthew Knepley } 269bdad233fSMatthew Knepley 270bdad233fSMatthew Knepley /*@C 271bdad233fSMatthew Knepley TSSerializeRegister - Adds a serialization method to the ts package. 272bdad233fSMatthew Knepley 273bdad233fSMatthew Knepley Synopsis: 274bdad233fSMatthew Knepley 275bdad233fSMatthew Knepley TSSerializeRegister(char *name, char *path, char *func_name, 276bdad233fSMatthew Knepley int (*serialize_func)(MPI_Comm, TS *, PetscViewer, PetscTruth)) 277bdad233fSMatthew Knepley 278bdad233fSMatthew Knepley Not Collective 279bdad233fSMatthew Knepley 280bdad233fSMatthew Knepley Input Parameters: 281bdad233fSMatthew Knepley + name - The name of a new user-defined serialization routine 282bdad233fSMatthew Knepley . path - The path (either absolute or relative) of the library containing this routine 283bdad233fSMatthew Knepley . func_name - The name of the serialization routine 284bdad233fSMatthew Knepley - serialize_func - The serialization routine itself 285bdad233fSMatthew Knepley 286bdad233fSMatthew Knepley Notes: 287bdad233fSMatthew Knepley TSSerializeRegister() may be called multiple times to add several user-defined serializers. 288bdad233fSMatthew Knepley 289bdad233fSMatthew Knepley If dynamic libraries are used, then the fourth input argument (serialize_func) is ignored. 290bdad233fSMatthew Knepley 291bdad233fSMatthew Knepley Sample usage: 292bdad233fSMatthew Knepley .vb 293bdad233fSMatthew Knepley TSSerializeRegisterDynamic("my_store", "/home/username/my_lib/lib/libO/solaris/libmy.a", "MyStoreFunc", MyStoreFunc); 294bdad233fSMatthew Knepley .ve 295bdad233fSMatthew Knepley 296bdad233fSMatthew Knepley Then, your serialization can be chosen with the procedural interface via 297bdad233fSMatthew Knepley .vb 298bdad233fSMatthew Knepley TSSetSerializeType(ts, "my_store") 299bdad233fSMatthew Knepley .ve 300bdad233fSMatthew Knepley or at runtime via the option 301bdad233fSMatthew Knepley .vb 302bdad233fSMatthew Knepley -ts_serialize_type my_store 303bdad233fSMatthew Knepley .ve 304bdad233fSMatthew Knepley 305bdad233fSMatthew Knepley Note: $PETSC_ARCH and $BOPT occuring in pathname will be replaced with appropriate values. 306bdad233fSMatthew Knepley 307bdad233fSMatthew Knepley Level: advanced 308bdad233fSMatthew Knepley 309bdad233fSMatthew Knepley .keywords: ts, register 310bdad233fSMatthew Knepley .seealso: TSSerializeRegisterAll(), TSSerializeRegisterDestroy() 311bdad233fSMatthew Knepley M*/ 312bdad233fSMatthew Knepley #undef __FUNCT__ 313bdad233fSMatthew Knepley #define __FUNCT__ "TSSerializeRegister" 314bdad233fSMatthew Knepley int TSSerializeRegister(const char sname[], const char path[], const char name[], 315bdad233fSMatthew Knepley int (*function)(MPI_Comm, TS *, PetscViewer, PetscTruth)) 316bdad233fSMatthew Knepley { 317bdad233fSMatthew Knepley char fullname[256]; 318bdad233fSMatthew Knepley int ierr; 319bdad233fSMatthew Knepley 320bdad233fSMatthew Knepley PetscFunctionBegin; 321bdad233fSMatthew Knepley ierr = PetscStrcpy(fullname, path); CHKERRQ(ierr); 322bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, ":"); CHKERRQ(ierr); 323bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, name); CHKERRQ(ierr); 324bdad233fSMatthew Knepley ierr = PetscFListAdd(&TSSerializeList, sname, fullname, (void (*)(void)) function); CHKERRQ(ierr); 325bdad233fSMatthew Knepley PetscFunctionReturn(0); 326bdad233fSMatthew Knepley } 327bdad233fSMatthew Knepley 328bdad233fSMatthew Knepley /*-------------------------------------------------------------------------------------------------------------------*/ 329bdad233fSMatthew Knepley #undef __FUNCT__ 330bdad233fSMatthew Knepley #define __FUNCT__ "TSRegisterDestroy" 331bdad233fSMatthew Knepley /*@C 3323cea93caSBarry Smith TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 333bdad233fSMatthew Knepley 334bdad233fSMatthew Knepley Not Collective 335bdad233fSMatthew Knepley 336bdad233fSMatthew Knepley Level: advanced 337bdad233fSMatthew Knepley 338bdad233fSMatthew Knepley .keywords: TS, timestepper, register, destroy 3393cea93caSBarry Smith .seealso: TSRegister(), TSRegisterAll(), TSSerializeRegisterDestroy(), TSRegisterDynamic() 340bdad233fSMatthew Knepley @*/ 341bdad233fSMatthew Knepley int TSRegisterDestroy(void) 342bdad233fSMatthew Knepley { 343bdad233fSMatthew Knepley int ierr; 344bdad233fSMatthew Knepley 345bdad233fSMatthew Knepley PetscFunctionBegin; 346bdad233fSMatthew Knepley if (TSList != PETSC_NULL) { 347bdad233fSMatthew Knepley ierr = PetscFListDestroy(&TSList); CHKERRQ(ierr); 348bdad233fSMatthew Knepley TSList = PETSC_NULL; 349bdad233fSMatthew Knepley } 350bdad233fSMatthew Knepley TSRegisterAllCalled = PETSC_FALSE; 351bdad233fSMatthew Knepley PetscFunctionReturn(0); 352bdad233fSMatthew Knepley } 353bdad233fSMatthew Knepley 354bdad233fSMatthew Knepley #undef __FUNCT__ 355bdad233fSMatthew Knepley #define __FUNCT__ "TSSerializeRegisterDestroy" 356bdad233fSMatthew Knepley /*@C 357bdad233fSMatthew Knepley TSSerializeRegisterDestroy - Frees the list of serialization routines for 358bdad233fSMatthew Knepley timesteppers that were registered by FListAdd(). 359bdad233fSMatthew Knepley 360bdad233fSMatthew Knepley Not collective 361bdad233fSMatthew Knepley 362bdad233fSMatthew Knepley Level: advanced 363bdad233fSMatthew Knepley 364bdad233fSMatthew Knepley .keywords: ts, serialization, register, destroy 365bdad233fSMatthew Knepley .seealso: TSSerializeRegisterAll(), TSRegisterDestroy() 366bdad233fSMatthew Knepley @*/ 367bdad233fSMatthew Knepley int TSSerializeRegisterDestroy() 368bdad233fSMatthew Knepley { 369bdad233fSMatthew Knepley int ierr; 370bdad233fSMatthew Knepley 371bdad233fSMatthew Knepley PetscFunctionBegin; 372bdad233fSMatthew Knepley if (TSSerializeList != PETSC_NULL) { 373bdad233fSMatthew Knepley ierr = PetscFListDestroy(&TSSerializeList); CHKERRQ(ierr); 374bdad233fSMatthew Knepley TSSerializeList = PETSC_NULL; 375bdad233fSMatthew Knepley } 376bdad233fSMatthew Knepley TSSerializeRegisterAllCalled = PETSC_FALSE; 377bdad233fSMatthew Knepley PetscFunctionReturn(0); 378bdad233fSMatthew Knepley } 379