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 to be used as 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 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType 44 45 @*/ 46 PetscErrorCode TSSetType(TS ts,TSType type) 47 { 48 PetscErrorCode (*r)(TS); 49 PetscBool match; 50 PetscErrorCode ierr; 51 52 PetscFunctionBegin; 53 PetscValidHeaderSpecific(ts, TS_CLASSID,1); 54 ierr = PetscObjectTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 55 if (match) PetscFunctionReturn(0); 56 57 ierr = PetscFunctionListFind(TSList,type,&r);CHKERRQ(ierr); 58 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type); 59 if (ts->ops->destroy) { 60 ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 61 62 ts->ops->destroy = NULL; 63 } 64 ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr); 65 66 ts->setupcalled = PETSC_FALSE; 67 68 ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 69 ierr = (*r)(ts);CHKERRQ(ierr); 70 PetscFunctionReturn(0); 71 } 72 73 #undef __FUNCT__ 74 #define __FUNCT__ "TSGetType" 75 /*@C 76 TSGetType - Gets the TS method type (as a string). 77 78 Not Collective 79 80 Input Parameter: 81 . ts - The TS 82 83 Output Parameter: 84 . type - The name of TS method 85 86 Level: intermediate 87 88 .keywords: TS, timestepper, get, type, name 89 .seealso TSSetType() 90 @*/ 91 PetscErrorCode TSGetType(TS ts, TSType *type) 92 { 93 PetscFunctionBegin; 94 PetscValidHeaderSpecific(ts,TS_CLASSID,1); 95 PetscValidPointer(type,2); 96 *type = ((PetscObject)ts)->type_name; 97 PetscFunctionReturn(0); 98 } 99 100 /*--------------------------------------------------------------------------------------------------------------------*/ 101 102 #undef __FUNCT__ 103 #define __FUNCT__ "TSRegister" 104 /*@C 105 TSRegister - Adds a creation method to the TS package. 106 107 Not Collective 108 109 Input Parameters: 110 + name - The name of a new user-defined creation routine 111 - create_func - The creation routine itself 112 113 Notes: 114 TSRegister() may be called multiple times to add several user-defined tses. 115 116 Sample usage: 117 .vb 118 TSRegister("my_ts", MyTSCreate); 119 .ve 120 121 Then, your ts type can be chosen with the procedural interface via 122 .vb 123 TS ts; 124 TSCreate(MPI_Comm, &ts); 125 TSSetType(ts, "my_ts") 126 .ve 127 or at runtime via the option 128 .vb 129 -ts_type my_ts 130 .ve 131 132 Level: advanced 133 134 .keywords: TS, register 135 136 .seealso: TSRegisterAll(), TSRegisterDestroy() 137 @*/ 138 PetscErrorCode TSRegister(const char sname[], PetscErrorCode (*function)(TS)) 139 { 140 PetscErrorCode ierr; 141 142 PetscFunctionBegin; 143 ierr = PetscFunctionListAdd(&TSList,sname,function);CHKERRQ(ierr); 144 PetscFunctionReturn(0); 145 } 146 147