1 #include <petsc-private/tsimpl.h> /*I "petscts.h" I*/ 2 3 PetscFunctionList TSList = NULL; 4 PetscBool TSRegisterAllCalled = PETSC_FALSE; 5 6 #undef __FUNCT__ 7 #define __FUNCT__ "TSSetType" 8 /*@C 9 TSSetType - Sets the method for the timestepping solver. 10 11 Collective on TS 12 13 Input Parameters: 14 + ts - The TS context 15 - type - A known method 16 17 Options Database Command: 18 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler) 19 20 Notes: 21 See "petsc/include/petscts.h" for available methods (for instance) 22 + TSEULER - Euler 23 . TSSUNDIALS - SUNDIALS interface 24 . TSBEULER - Backward Euler 25 - TSPSEUDO - Pseudo-timestepping 26 27 Normally, it is best to use the TSSetFromOptions() command and 28 then set the TS type from the options database rather than by using 29 this routine. Using the options database provides the user with 30 maximum flexibility in evaluating the many different solvers. 31 The TSSetType() routine is provided for those situations where it 32 is necessary to set the timestepping solver independently of the 33 command line or options database. This might be the case, for example, 34 when the choice of solver changes during the execution of the 35 program, and the user's application is taking responsibility for 36 choosing the appropriate method. In other words, this routine is 37 not for beginners. 38 39 Level: intermediate 40 41 .keywords: TS, set, type 42 43 @*/ 44 PetscErrorCode TSSetType(TS ts,TSType type) 45 { 46 PetscErrorCode (*r)(TS); 47 PetscBool match; 48 PetscErrorCode ierr; 49 50 PetscFunctionBegin; 51 PetscValidHeaderSpecific(ts, TS_CLASSID,1); 52 ierr = PetscObjectTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 53 if (match) PetscFunctionReturn(0); 54 55 ierr = PetscFunctionListFind(PetscObjectComm((PetscObject)ts),TSList, type,PETSC_TRUE, (void (**)(void)) &r);CHKERRQ(ierr); 56 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type); 57 if (ts->ops->destroy) { 58 ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 59 60 ts->ops->destroy = NULL; 61 } 62 ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr); 63 64 ts->setupcalled = PETSC_FALSE; 65 66 ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 67 ierr = (*r)(ts);CHKERRQ(ierr); 68 PetscFunctionReturn(0); 69 } 70 71 #undef __FUNCT__ 72 #define __FUNCT__ "TSGetType" 73 /*@C 74 TSGetType - Gets the TS method type (as a string). 75 76 Not Collective 77 78 Input Parameter: 79 . ts - The TS 80 81 Output Parameter: 82 . type - The name of TS method 83 84 Level: intermediate 85 86 .keywords: TS, timestepper, get, type, name 87 .seealso TSSetType() 88 @*/ 89 PetscErrorCode TSGetType(TS ts, TSType *type) 90 { 91 PetscFunctionBegin; 92 PetscValidHeaderSpecific(ts,TS_CLASSID,1); 93 PetscValidPointer(type,2); 94 *type = ((PetscObject)ts)->type_name; 95 PetscFunctionReturn(0); 96 } 97 98 /*--------------------------------------------------------------------------------------------------------------------*/ 99 100 #undef __FUNCT__ 101 #define __FUNCT__ "TSRegister" 102 /*@C 103 TSRegister - Adds a creation method to the TS package. 104 105 Not Collective 106 107 Input Parameters: 108 + name - The name of a new user-defined creation routine 109 . func_name - The name of the creation routine 110 - create_func - The creation routine itself 111 112 Notes: 113 TSRegister() may be called multiple times to add several user-defined tses. 114 115 Sample usage: 116 .vb 117 TSRegister("my_ts", "MyTSCreate", MyTSCreate); 118 .ve 119 120 Then, your ts type can be chosen with the procedural interface via 121 .vb 122 TS ts; 123 TSCreate(MPI_Comm, &ts); 124 TSSetType(ts, "my_ts") 125 .ve 126 or at runtime via the option 127 .vb 128 -ts_type my_ts 129 .ve 130 131 Level: advanced 132 133 .keywords: TS, register 134 135 .seealso: TSRegisterAll(), TSRegisterDestroy() 136 @*/ 137 PetscErrorCode TSRegister(const char sname[], const char name[], PetscErrorCode (*function)(TS)) 138 { 139 PetscErrorCode ierr; 140 141 PetscFunctionBegin; 142 ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&TSList, sname, name, (void (*)(void))function);CHKERRQ(ierr); 143 PetscFunctionReturn(0); 144 } 145 146 /*-------------------------------------------------------------------------------------------------------------------*/ 147 #undef __FUNCT__ 148 #define __FUNCT__ "TSRegisterDestroy" 149 /*@C 150 TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister() 151 152 Not Collective 153 154 Level: advanced 155 156 .keywords: TS, timestepper, register, destroy 157 .seealso: TSRegister(), TSRegisterAll() 158 @*/ 159 PetscErrorCode TSRegisterDestroy(void) 160 { 161 PetscErrorCode ierr; 162 163 PetscFunctionBegin; 164 ierr = PetscFunctionListDestroy(&TSList);CHKERRQ(ierr); 165 TSRegisterAllCalled = PETSC_FALSE; 166 PetscFunctionReturn(0); 167 } 168