1 #include <private/tsimpl.h> /*I "petscts.h" I*/ 2 3 PetscFList TSList = PETSC_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,const TSType type) 45 { 46 PetscErrorCode (*r)(TS); 47 PetscBool match; 48 PetscErrorCode ierr; 49 50 PetscFunctionBegin; 51 PetscValidHeaderSpecific(ts, TS_CLASSID,1); 52 ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 53 if (match) PetscFunctionReturn(0); 54 55 ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, 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 ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr); 61 ts->setupcalled = PETSC_FALSE; 62 ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 63 ierr = (*r)(ts);CHKERRQ(ierr); 64 #if defined(PETSC_HAVE_AMS) 65 if (PetscAMSPublishAll) { 66 ierr = PetscObjectAMSPublish((PetscObject)ts);CHKERRQ(ierr); 67 } 68 #endif 69 PetscFunctionReturn(0); 70 } 71 72 #undef __FUNCT__ 73 #define __FUNCT__ "TSGetType" 74 /*@C 75 TSGetType - Gets the TS method type (as a string). 76 77 Not Collective 78 79 Input Parameter: 80 . ts - The TS 81 82 Output Parameter: 83 . type - The name of TS method 84 85 Level: intermediate 86 87 .keywords: TS, timestepper, get, type, name 88 .seealso TSSetType() 89 @*/ 90 PetscErrorCode TSGetType(TS ts, const TSType *type) 91 { 92 PetscFunctionBegin; 93 PetscValidHeaderSpecific(ts,TS_CLASSID,1); 94 PetscValidPointer(type,2); 95 *type = ((PetscObject)ts)->type_name; 96 PetscFunctionReturn(0); 97 } 98 99 /*--------------------------------------------------------------------------------------------------------------------*/ 100 101 #undef __FUNCT__ 102 #define __FUNCT__ "TSRegister" 103 /*@C 104 TSRegister - See TSRegisterDynamic() 105 106 Level: advanced 107 @*/ 108 PetscErrorCode TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS)) 109 { 110 char fullname[PETSC_MAX_PATH_LEN]; 111 PetscErrorCode ierr; 112 113 PetscFunctionBegin; 114 ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); 115 ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); 116 ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); 117 ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); 118 PetscFunctionReturn(0); 119 } 120 121 /*-------------------------------------------------------------------------------------------------------------------*/ 122 #undef __FUNCT__ 123 #define __FUNCT__ "TSRegisterDestroy" 124 /*@C 125 TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 126 127 Not Collective 128 129 Level: advanced 130 131 .keywords: TS, timestepper, register, destroy 132 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic() 133 @*/ 134 PetscErrorCode TSRegisterDestroy(void) 135 { 136 PetscErrorCode ierr; 137 138 PetscFunctionBegin; 139 ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr); 140 TSRegisterAllCalled = PETSC_FALSE; 141 PetscFunctionReturn(0); 142 } 143