163dd3a1aSKris Buschelman #define PETSCTS_DLL 23f3760d9SBarry Smith 37c4f633dSBarry Smith #include "private/tsimpl.h" /*I "petscts.h" I*/ 43f3760d9SBarry Smith 5bdad233fSMatthew Knepley PetscFList TSList = PETSC_NULL; 64c49b128SBarry Smith PetscTruth TSRegisterAllCalled = PETSC_FALSE; 73f3760d9SBarry Smith 84a2ae208SSatish Balay #undef __FUNCT__ 94a2ae208SSatish Balay #define __FUNCT__ "TSSetType" 1082bf6240SBarry Smith /*@C 11ae12b187SLois Curfman McInnes TSSetType - Sets the method for the timestepping solver. 123f3760d9SBarry Smith 13fee21e36SBarry Smith Collective on TS 14fee21e36SBarry Smith 15bef22f13SLois Curfman McInnes Input Parameters: 16bdad233fSMatthew Knepley + ts - The TS context 17bdad233fSMatthew Knepley - type - A known method 18bef22f13SLois Curfman McInnes 19ae12b187SLois Curfman McInnes Options Database Command: 20bdad233fSMatthew Knepley . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler) 21ae12b187SLois Curfman McInnes 223f3760d9SBarry Smith Notes: 23e090d566SSatish Balay See "petsc/include/petscts.h" for available methods (for instance) 249596e0b4SJed Brown + TSEULER - Euler 259596e0b4SJed Brown . TSSUNDIALS - SUNDIALS interface 269596e0b4SJed Brown . TSBEULER - Backward Euler 279596e0b4SJed Brown - TSPSEUDO - Pseudo-timestepping 283f3760d9SBarry Smith 29ae12b187SLois Curfman McInnes Normally, it is best to use the TSSetFromOptions() command and 30ae12b187SLois Curfman McInnes then set the TS type from the options database rather than by using 31ae12b187SLois Curfman McInnes this routine. Using the options database provides the user with 32ae12b187SLois Curfman McInnes maximum flexibility in evaluating the many different solvers. 33ae12b187SLois Curfman McInnes The TSSetType() routine is provided for those situations where it 34ae12b187SLois Curfman McInnes is necessary to set the timestepping solver independently of the 35ae12b187SLois Curfman McInnes command line or options database. This might be the case, for example, 36ae12b187SLois Curfman McInnes when the choice of solver changes during the execution of the 37ae12b187SLois Curfman McInnes program, and the user's application is taking responsibility for 38ae12b187SLois Curfman McInnes choosing the appropriate method. In other words, this routine is 39d5d37b61SLois Curfman McInnes not for beginners. 40d5d37b61SLois Curfman McInnes 41d5d37b61SLois Curfman McInnes Level: intermediate 423f3760d9SBarry Smith 43ae12b187SLois Curfman McInnes .keywords: TS, set, type 44437fc6d7SBarry Smith 453f3760d9SBarry Smith @*/ 46a313700dSBarry Smith PetscErrorCode PETSCTS_DLLEXPORT TSSetType(TS ts,const TSType type) 473f3760d9SBarry Smith { 486849ba73SBarry Smith PetscErrorCode (*r)(TS); 496831982aSBarry Smith PetscTruth match; 50dfbe8321SBarry Smith PetscErrorCode ierr; 51df8cb225SBarry Smith 523a40ed3dSBarry Smith PetscFunctionBegin; 53*0700a824SBarry Smith PetscValidHeaderSpecific(ts, TS_CLASSID,1); 54bdad233fSMatthew Knepley ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 55958c9bccSBarry Smith if (match) PetscFunctionReturn(0); 56bdad233fSMatthew Knepley 577adad957SLisandro Dalcin ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, type, (void (**)(void)) &r);CHKERRQ(ierr); 58958c9bccSBarry Smith if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type); 59958c9bccSBarry Smith if (ts->ksp) { 6094b7f48cSBarry Smith ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr); 6194b7f48cSBarry Smith ts->ksp = PETSC_NULL; 62bdad233fSMatthew Knepley } 63958c9bccSBarry Smith if (ts->snes) { 64bdad233fSMatthew Knepley ierr = SNESDestroy(ts->snes);CHKERRQ(ierr); 65bdad233fSMatthew Knepley ts->snes = PETSC_NULL; 66bdad233fSMatthew Knepley } 67958c9bccSBarry Smith if (ts->ops->destroy) { 68bdad233fSMatthew Knepley ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 69bdad233fSMatthew Knepley } 70bdad233fSMatthew Knepley ierr = (*r)(ts);CHKERRQ(ierr); 71bdad233fSMatthew Knepley ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 723a40ed3dSBarry Smith PetscFunctionReturn(0); 733f3760d9SBarry Smith } 743f3760d9SBarry Smith 754a2ae208SSatish Balay #undef __FUNCT__ 764a2ae208SSatish Balay #define __FUNCT__ "TSGetType" 773f3760d9SBarry Smith /*@C 78fee21e36SBarry Smith TSGetType - Gets the TS method type (as a string). 793f3760d9SBarry Smith 80bef22f13SLois Curfman McInnes Not Collective 81bef22f13SLois Curfman McInnes 823f3760d9SBarry Smith Input Parameter: 83bdad233fSMatthew Knepley . ts - The TS 843f3760d9SBarry Smith 853f3760d9SBarry Smith Output Parameter: 86bdad233fSMatthew Knepley . type - The name of TS method 873f3760d9SBarry Smith 88d5d37b61SLois Curfman McInnes Level: intermediate 89d5d37b61SLois Curfman McInnes 90df8cb225SBarry Smith .keywords: TS, timestepper, get, type, name 91bdad233fSMatthew Knepley .seealso TSSetType() 923f3760d9SBarry Smith @*/ 93a313700dSBarry Smith PetscErrorCode PETSCTS_DLLEXPORT TSGetType(TS ts, const TSType *type) 943f3760d9SBarry Smith { 953a40ed3dSBarry Smith PetscFunctionBegin; 96*0700a824SBarry Smith PetscValidHeaderSpecific(ts,TS_CLASSID,1); 974482741eSBarry Smith PetscValidPointer(type,2); 987adad957SLisandro Dalcin *type = ((PetscObject)ts)->type_name; 993a40ed3dSBarry Smith PetscFunctionReturn(0); 1003f3760d9SBarry Smith } 1013f3760d9SBarry Smith 102bdad233fSMatthew Knepley /*--------------------------------------------------------------------------------------------------------------------*/ 1033cea93caSBarry Smith 104bdad233fSMatthew Knepley #undef __FUNCT__ 105bdad233fSMatthew Knepley #define __FUNCT__ "TSRegister" 1063cea93caSBarry Smith /*@C 1073cea93caSBarry Smith TSRegister - See TSRegisterDynamic() 1083cea93caSBarry Smith 1097f6c08e0SMatthew Knepley Level: advanced 1103cea93caSBarry Smith @*/ 11163dd3a1aSKris Buschelman PetscErrorCode PETSCTS_DLLEXPORT TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS)) 112bdad233fSMatthew Knepley { 113e2d1d2b7SBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 114dfbe8321SBarry Smith PetscErrorCode ierr; 115bdad233fSMatthew Knepley 116bdad233fSMatthew Knepley PetscFunctionBegin; 117bdad233fSMatthew Knepley ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); 118bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); 119bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); 120bdad233fSMatthew Knepley ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); 121bdad233fSMatthew Knepley PetscFunctionReturn(0); 122bdad233fSMatthew Knepley } 123bdad233fSMatthew Knepley 124bdad233fSMatthew Knepley /*-------------------------------------------------------------------------------------------------------------------*/ 125bdad233fSMatthew Knepley #undef __FUNCT__ 126bdad233fSMatthew Knepley #define __FUNCT__ "TSRegisterDestroy" 127bdad233fSMatthew Knepley /*@C 1283cea93caSBarry Smith TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 129bdad233fSMatthew Knepley 130bdad233fSMatthew Knepley Not Collective 131bdad233fSMatthew Knepley 132bdad233fSMatthew Knepley Level: advanced 133bdad233fSMatthew Knepley 134bdad233fSMatthew Knepley .keywords: TS, timestepper, register, destroy 135437fc6d7SBarry Smith .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic() 136bdad233fSMatthew Knepley @*/ 13763dd3a1aSKris Buschelman PetscErrorCode PETSCTS_DLLEXPORT TSRegisterDestroy(void) 138bdad233fSMatthew Knepley { 139dfbe8321SBarry Smith PetscErrorCode ierr; 140bdad233fSMatthew Knepley 141bdad233fSMatthew Knepley PetscFunctionBegin; 1421441b1d3SBarry Smith ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr); 143bdad233fSMatthew Knepley TSRegisterAllCalled = PETSC_FALSE; 144bdad233fSMatthew Knepley PetscFunctionReturn(0); 145bdad233fSMatthew Knepley } 146bdad233fSMatthew Knepley 147