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