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