13f3760d9SBarry Smith 2e090d566SSatish Balay #include "src/ts/tsimpl.h" /*I "petscts.h" I*/ 33f3760d9SBarry Smith 4bdad233fSMatthew Knepley PetscFList TSList = PETSC_NULL; 54c49b128SBarry Smith PetscTruth TSRegisterAllCalled = PETSC_FALSE; 63f3760d9SBarry Smith 74a2ae208SSatish Balay #undef __FUNCT__ 84a2ae208SSatish Balay #define __FUNCT__ "TSSetType" 982bf6240SBarry Smith /*@C 10ae12b187SLois Curfman McInnes TSSetType - Sets the method for the timestepping solver. 113f3760d9SBarry Smith 12fee21e36SBarry Smith Collective on TS 13fee21e36SBarry Smith 14bef22f13SLois Curfman McInnes Input Parameters: 15bdad233fSMatthew Knepley + ts - The TS context 16bdad233fSMatthew Knepley - type - A known method 17bef22f13SLois Curfman McInnes 18ae12b187SLois Curfman McInnes Options Database Command: 19bdad233fSMatthew Knepley . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler) 20ae12b187SLois Curfman McInnes 213f3760d9SBarry Smith Notes: 22e090d566SSatish Balay See "petsc/include/petscts.h" for available methods (for instance) 23d5d37b61SLois Curfman McInnes + TS_EULER - Euler 24bef22f13SLois Curfman McInnes . TS_PVODE - PVODE interface 25bef22f13SLois Curfman McInnes . TS_BEULER - Backward Euler 26d5d37b61SLois Curfman McInnes - TS_PSEUDO - Pseudo-timestepping 273f3760d9SBarry Smith 28ae12b187SLois Curfman McInnes Normally, it is best to use the TSSetFromOptions() command and 29ae12b187SLois Curfman McInnes then set the TS type from the options database rather than by using 30ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 31ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many different solvers. 32ae12b187SLois Curfman McInnes The TSSetType() routine is provided for those situations where it 33ae12b187SLois Curfman McInnes is necessary to set the timestepping solver independently of the 34ae12b187SLois Curfman McInnes command line or options database. This might be the case, for example, 35ae12b187SLois Curfman McInnes when the choice of solver changes during the execution of the 36ae12b187SLois Curfman McInnes program, and the user's application is taking responsibility for 37ae12b187SLois Curfman McInnes choosing the appropriate method. In other words, this routine is 38d5d37b61SLois Curfman McInnes not for beginners. 39d5d37b61SLois Curfman McInnes 40d5d37b61SLois Curfman McInnes Level: intermediate 413f3760d9SBarry Smith 42ae12b187SLois Curfman McInnes .keywords: TS, set, type 43437fc6d7SBarry Smith 443f3760d9SBarry Smith @*/ 450e33f6ddSBarry Smith int TSSetType(TS ts, const TSType type) 463f3760d9SBarry Smith { 47bdad233fSMatthew Knepley int (*r)(TS); 486831982aSBarry Smith PetscTruth match; 49df8cb225SBarry Smith int ierr; 50df8cb225SBarry Smith 513a40ed3dSBarry Smith PetscFunctionBegin; 524482741eSBarry Smith PetscValidHeaderSpecific(ts, TS_COOKIE,1); 53bdad233fSMatthew Knepley ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 54bdad233fSMatthew Knepley if (match == PETSC_TRUE) PetscFunctionReturn(0); 55bdad233fSMatthew Knepley 56bdad233fSMatthew Knepley /* Get the function pointers for the method requested */ 57bdad233fSMatthew Knepley if (TSRegisterAllCalled == PETSC_FALSE) { 58bdad233fSMatthew Knepley ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr); 593f3760d9SBarry Smith } 60bdad233fSMatthew Knepley ierr = PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);CHKERRQ(ierr); 61bdad233fSMatthew Knepley if (!r) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Unknown TS type: %s", type); 62bdad233fSMatthew Knepley 6394b7f48cSBarry Smith if (ts->ksp != PETSC_NULL) { 6494b7f48cSBarry Smith ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr); 6594b7f48cSBarry Smith ts->ksp = PETSC_NULL; 66bdad233fSMatthew Knepley } 67bdad233fSMatthew Knepley if (ts->snes != PETSC_NULL) { 68bdad233fSMatthew Knepley ierr = SNESDestroy(ts->snes);CHKERRQ(ierr); 69bdad233fSMatthew Knepley ts->snes = PETSC_NULL; 70bdad233fSMatthew Knepley } 71bdad233fSMatthew Knepley if (ts->ops->destroy != PETSC_NULL) { 72bdad233fSMatthew Knepley ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 73bdad233fSMatthew Knepley } 74bdad233fSMatthew Knepley ierr = (*r)(ts);CHKERRQ(ierr); 75bdad233fSMatthew Knepley 76bdad233fSMatthew Knepley ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 773a40ed3dSBarry Smith PetscFunctionReturn(0); 783f3760d9SBarry Smith } 793f3760d9SBarry Smith 804a2ae208SSatish Balay #undef __FUNCT__ 814a2ae208SSatish Balay #define __FUNCT__ "TSGetType" 823f3760d9SBarry Smith /*@C 83fee21e36SBarry Smith TSGetType - Gets the TS method type (as a string). 843f3760d9SBarry Smith 85bef22f13SLois Curfman McInnes Not Collective 86bef22f13SLois Curfman McInnes 873f3760d9SBarry Smith Input Parameter: 88bdad233fSMatthew Knepley . ts - The TS 893f3760d9SBarry Smith 903f3760d9SBarry Smith Output Parameter: 91bdad233fSMatthew Knepley . type - The name of TS method 923f3760d9SBarry Smith 93d5d37b61SLois Curfman McInnes Level: intermediate 94d5d37b61SLois Curfman McInnes 95df8cb225SBarry Smith .keywords: TS, timestepper, get, type, name 96bdad233fSMatthew Knepley .seealso TSSetType() 973f3760d9SBarry Smith @*/ 9882bf6240SBarry Smith int TSGetType(TS ts, TSType *type) 993f3760d9SBarry Smith { 1003f3760d9SBarry Smith int ierr; 1013a40ed3dSBarry Smith 1023a40ed3dSBarry Smith PetscFunctionBegin; 1034482741eSBarry Smith PetscValidHeaderSpecific(ts, TS_COOKIE,1); 1044482741eSBarry Smith PetscValidPointer(type,2); 105bdad233fSMatthew Knepley if (TSRegisterAllCalled == PETSC_FALSE) { 106bdad233fSMatthew Knepley ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr); 107bdad233fSMatthew Knepley } 10882bf6240SBarry Smith *type = ts->type_name; 1093a40ed3dSBarry Smith PetscFunctionReturn(0); 1103f3760d9SBarry Smith } 1113f3760d9SBarry Smith 112bdad233fSMatthew Knepley /*--------------------------------------------------------------------------------------------------------------------*/ 1133cea93caSBarry Smith 114bdad233fSMatthew Knepley #undef __FUNCT__ 115bdad233fSMatthew Knepley #define __FUNCT__ "TSRegister" 1163cea93caSBarry Smith /*@C 1173cea93caSBarry Smith TSRegister - See TSRegisterDynamic() 1183cea93caSBarry Smith 1197f6c08e0SMatthew Knepley Level: advanced 1203cea93caSBarry Smith @*/ 121bdad233fSMatthew Knepley int TSRegister(const char sname[], const char path[], const char name[], int (*function)(TS)) 122bdad233fSMatthew Knepley { 123*e2d1d2b7SBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 124bdad233fSMatthew Knepley int ierr; 125bdad233fSMatthew Knepley 126bdad233fSMatthew Knepley PetscFunctionBegin; 127bdad233fSMatthew Knepley ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); 128bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); 129bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); 130bdad233fSMatthew Knepley ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); 131bdad233fSMatthew Knepley PetscFunctionReturn(0); 132bdad233fSMatthew Knepley } 133bdad233fSMatthew Knepley 134bdad233fSMatthew Knepley /*-------------------------------------------------------------------------------------------------------------------*/ 135bdad233fSMatthew Knepley #undef __FUNCT__ 136bdad233fSMatthew Knepley #define __FUNCT__ "TSRegisterDestroy" 137bdad233fSMatthew Knepley /*@C 1383cea93caSBarry Smith TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 139bdad233fSMatthew Knepley 140bdad233fSMatthew Knepley Not Collective 141bdad233fSMatthew Knepley 142bdad233fSMatthew Knepley Level: advanced 143bdad233fSMatthew Knepley 144bdad233fSMatthew Knepley .keywords: TS, timestepper, register, destroy 145437fc6d7SBarry Smith .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic() 146bdad233fSMatthew Knepley @*/ 147bdad233fSMatthew Knepley int TSRegisterDestroy(void) 148bdad233fSMatthew Knepley { 149bdad233fSMatthew Knepley int ierr; 150bdad233fSMatthew Knepley 151bdad233fSMatthew Knepley PetscFunctionBegin; 152bdad233fSMatthew Knepley if (TSList != PETSC_NULL) { 153bdad233fSMatthew Knepley ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr); 154bdad233fSMatthew Knepley TSList = PETSC_NULL; 155bdad233fSMatthew Knepley } 156bdad233fSMatthew Knepley TSRegisterAllCalled = PETSC_FALSE; 157bdad233fSMatthew Knepley PetscFunctionReturn(0); 158bdad233fSMatthew Knepley } 159bdad233fSMatthew Knepley 160