1 #define PETSCTS_DLL 2 3 #include "private/tsimpl.h" /*I "petscts.h" I*/ 4 5 PetscFList TSList = PETSC_NULL; 6 PetscTruth TSRegisterAllCalled = PETSC_FALSE; 7 8 #undef __FUNCT__ 9 #define __FUNCT__ "TSSetType" 10 /*@C 11 TSSetType - Sets the method for the timestepping solver. 12 13 Collective on TS 14 15 Input Parameters: 16 + ts - The TS context 17 - type - A known method 18 19 Options Database Command: 20 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler) 21 22 Notes: 23 See "petsc/include/petscts.h" for available methods (for instance) 24 + TSEULER - Euler 25 . TSSUNDIALS - SUNDIALS interface 26 . TSBEULER - Backward Euler 27 - TSPSEUDO - Pseudo-timestepping 28 29 Normally, it is best to use the TSSetFromOptions() command and 30 then set the TS type from the options database rather than by using 31 this routine. Using the options database provides the user with 32 maximum flexibility in evaluating the many different solvers. 33 The TSSetType() routine is provided for those situations where it 34 is necessary to set the timestepping solver independently of the 35 command line or options database. This might be the case, for example, 36 when the choice of solver changes during the execution of the 37 program, and the user's application is taking responsibility for 38 choosing the appropriate method. In other words, this routine is 39 not for beginners. 40 41 Level: intermediate 42 43 .keywords: TS, set, type 44 45 @*/ 46 PetscErrorCode PETSCTS_DLLEXPORT TSSetType(TS ts,const TSType type) 47 { 48 PetscErrorCode (*r)(TS); 49 PetscTruth match; 50 PetscErrorCode ierr; 51 52 PetscFunctionBegin; 53 PetscValidHeaderSpecific(ts, TS_CLASSID,1); 54 ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 55 if (match) PetscFunctionReturn(0); 56 57 ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, type, (void (**)(void)) &r);CHKERRQ(ierr); 58 if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type); 59 if (ts->ksp) { 60 ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr); 61 ts->ksp = PETSC_NULL; 62 } 63 if (ts->snes) { 64 ierr = SNESDestroy(ts->snes);CHKERRQ(ierr); 65 ts->snes = PETSC_NULL; 66 } 67 if (ts->ops->destroy) { 68 ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 69 } 70 ierr = (*r)(ts);CHKERRQ(ierr); 71 ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 72 PetscFunctionReturn(0); 73 } 74 75 #undef __FUNCT__ 76 #define __FUNCT__ "TSGetType" 77 /*@C 78 TSGetType - Gets the TS method type (as a string). 79 80 Not Collective 81 82 Input Parameter: 83 . ts - The TS 84 85 Output Parameter: 86 . type - The name of TS method 87 88 Level: intermediate 89 90 .keywords: TS, timestepper, get, type, name 91 .seealso TSSetType() 92 @*/ 93 PetscErrorCode PETSCTS_DLLEXPORT TSGetType(TS ts, const TSType *type) 94 { 95 PetscFunctionBegin; 96 PetscValidHeaderSpecific(ts,TS_CLASSID,1); 97 PetscValidPointer(type,2); 98 *type = ((PetscObject)ts)->type_name; 99 PetscFunctionReturn(0); 100 } 101 102 /*--------------------------------------------------------------------------------------------------------------------*/ 103 104 #undef __FUNCT__ 105 #define __FUNCT__ "TSRegister" 106 /*@C 107 TSRegister - See TSRegisterDynamic() 108 109 Level: advanced 110 @*/ 111 PetscErrorCode PETSCTS_DLLEXPORT TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS)) 112 { 113 char fullname[PETSC_MAX_PATH_LEN]; 114 PetscErrorCode ierr; 115 116 PetscFunctionBegin; 117 ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); 118 ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); 119 ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); 120 ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); 121 PetscFunctionReturn(0); 122 } 123 124 /*-------------------------------------------------------------------------------------------------------------------*/ 125 #undef __FUNCT__ 126 #define __FUNCT__ "TSRegisterDestroy" 127 /*@C 128 TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 129 130 Not Collective 131 132 Level: advanced 133 134 .keywords: TS, timestepper, register, destroy 135 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic() 136 @*/ 137 PetscErrorCode PETSCTS_DLLEXPORT TSRegisterDestroy(void) 138 { 139 PetscErrorCode ierr; 140 141 PetscFunctionBegin; 142 ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr); 143 TSRegisterAllCalled = PETSC_FALSE; 144 PetscFunctionReturn(0); 145 } 146 147