1 #define PETSCTS_DLL 2 3 #include "src/ts/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 + TS_EULER - Euler 25 . TS_SUNDIALS - SUNDIALS interface 26 . TS_BEULER - Backward Euler 27 - TS_PSEUDO - 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_COOKIE,1); 54 ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 55 if (match) PetscFunctionReturn(0); 56 57 /* Get the function pointers for the method requested */ 58 if (!TSRegisterAllCalled) { 59 ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr); 60 } 61 ierr = PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);CHKERRQ(ierr); 62 if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type); 63 if (ts->ksp) { 64 ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr); 65 ts->ksp = PETSC_NULL; 66 } 67 if (ts->snes) { 68 ierr = SNESDestroy(ts->snes);CHKERRQ(ierr); 69 ts->snes = PETSC_NULL; 70 } 71 if (ts->ops->destroy) { 72 ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 73 } 74 ierr = (*r)(ts);CHKERRQ(ierr); 75 ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 76 PetscFunctionReturn(0); 77 } 78 79 #undef __FUNCT__ 80 #define __FUNCT__ "TSGetType" 81 /*@C 82 TSGetType - Gets the TS method type (as a string). 83 84 Not Collective 85 86 Input Parameter: 87 . ts - The TS 88 89 Output Parameter: 90 . type - The name of TS method 91 92 Level: intermediate 93 94 .keywords: TS, timestepper, get, type, name 95 .seealso TSSetType() 96 @*/ 97 PetscErrorCode PETSCTS_DLLEXPORT TSGetType(TS ts, TSType *type) 98 { 99 PetscErrorCode ierr; 100 101 PetscFunctionBegin; 102 PetscValidHeaderSpecific(ts, TS_COOKIE,1); 103 PetscValidPointer(type,2); 104 if (!TSRegisterAllCalled) { 105 ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr); 106 } 107 *type = ts->type_name; 108 PetscFunctionReturn(0); 109 } 110 111 /*--------------------------------------------------------------------------------------------------------------------*/ 112 113 #undef __FUNCT__ 114 #define __FUNCT__ "TSRegister" 115 /*@C 116 TSRegister - See TSRegisterDynamic() 117 118 Level: advanced 119 @*/ 120 PetscErrorCode PETSCTS_DLLEXPORT TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS)) 121 { 122 char fullname[PETSC_MAX_PATH_LEN]; 123 PetscErrorCode ierr; 124 125 PetscFunctionBegin; 126 ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); 127 ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); 128 ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); 129 ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); 130 PetscFunctionReturn(0); 131 } 132 133 /*-------------------------------------------------------------------------------------------------------------------*/ 134 #undef __FUNCT__ 135 #define __FUNCT__ "TSRegisterDestroy" 136 /*@C 137 TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 138 139 Not Collective 140 141 Level: advanced 142 143 .keywords: TS, timestepper, register, destroy 144 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic() 145 @*/ 146 PetscErrorCode PETSCTS_DLLEXPORT TSRegisterDestroy(void) 147 { 148 PetscErrorCode ierr; 149 150 PetscFunctionBegin; 151 if (TSList) { 152 ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr); 153 TSList = PETSC_NULL; 154 } 155 TSRegisterAllCalled = PETSC_FALSE; 156 PetscFunctionReturn(0); 157 } 158 159