13f3760d9SBarry Smith 2c6db04a5SJed Brown #include <private/tsimpl.h> /*I "petscts.h" I*/ 33f3760d9SBarry Smith 4bdad233fSMatthew Knepley PetscFList TSList = PETSC_NULL; 5ace3abfcSBarry Smith PetscBool 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) 239596e0b4SJed Brown + TSEULER - Euler 249596e0b4SJed Brown . TSSUNDIALS - SUNDIALS interface 259596e0b4SJed Brown . TSBEULER - Backward Euler 269596e0b4SJed Brown - TSPSEUDO - 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 @*/ 457087cfbeSBarry Smith PetscErrorCode TSSetType(TS ts,const TSType type) 463f3760d9SBarry Smith { 476849ba73SBarry Smith PetscErrorCode (*r)(TS); 48ace3abfcSBarry Smith PetscBool match; 49dfbe8321SBarry Smith PetscErrorCode ierr; 50df8cb225SBarry Smith 513a40ed3dSBarry Smith PetscFunctionBegin; 520700a824SBarry Smith PetscValidHeaderSpecific(ts, TS_CLASSID,1); 53bdad233fSMatthew Knepley ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr); 54958c9bccSBarry Smith if (match) PetscFunctionReturn(0); 55bdad233fSMatthew Knepley 56*4b91b6eaSBarry Smith ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, type,PETSC_TRUE, (void (**)(void)) &r);CHKERRQ(ierr); 57e32f2f54SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type); 58958c9bccSBarry Smith if (ts->ksp) { 5994b7f48cSBarry Smith ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr); 6094b7f48cSBarry Smith ts->ksp = PETSC_NULL; 61bdad233fSMatthew Knepley } 62958c9bccSBarry Smith if (ts->snes) { 63bdad233fSMatthew Knepley ierr = SNESDestroy(ts->snes);CHKERRQ(ierr); 64bdad233fSMatthew Knepley ts->snes = PETSC_NULL; 65bdad233fSMatthew Knepley } 66958c9bccSBarry Smith if (ts->ops->destroy) { 67bdad233fSMatthew Knepley ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr); 68bdad233fSMatthew Knepley } 69bdad233fSMatthew Knepley ierr = (*r)(ts);CHKERRQ(ierr); 70bdad233fSMatthew Knepley ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr); 719fb22e1aSBarry Smith #if defined(PETSC_HAVE_AMS) 729fb22e1aSBarry Smith if (PetscAMSPublishAll) { 739fb22e1aSBarry Smith ierr = PetscObjectAMSPublish((PetscObject)ts);CHKERRQ(ierr); 749fb22e1aSBarry Smith } 759fb22e1aSBarry Smith #endif 763a40ed3dSBarry Smith PetscFunctionReturn(0); 773f3760d9SBarry Smith } 783f3760d9SBarry Smith 794a2ae208SSatish Balay #undef __FUNCT__ 804a2ae208SSatish Balay #define __FUNCT__ "TSGetType" 813f3760d9SBarry Smith /*@C 82fee21e36SBarry Smith TSGetType - Gets the TS method type (as a string). 833f3760d9SBarry Smith 84bef22f13SLois Curfman McInnes Not Collective 85bef22f13SLois Curfman McInnes 863f3760d9SBarry Smith Input Parameter: 87bdad233fSMatthew Knepley . ts - The TS 883f3760d9SBarry Smith 893f3760d9SBarry Smith Output Parameter: 90bdad233fSMatthew Knepley . type - The name of TS method 913f3760d9SBarry Smith 92d5d37b61SLois Curfman McInnes Level: intermediate 93d5d37b61SLois Curfman McInnes 94df8cb225SBarry Smith .keywords: TS, timestepper, get, type, name 95bdad233fSMatthew Knepley .seealso TSSetType() 963f3760d9SBarry Smith @*/ 977087cfbeSBarry Smith PetscErrorCode TSGetType(TS ts, const TSType *type) 983f3760d9SBarry Smith { 993a40ed3dSBarry Smith PetscFunctionBegin; 1000700a824SBarry Smith PetscValidHeaderSpecific(ts,TS_CLASSID,1); 1014482741eSBarry Smith PetscValidPointer(type,2); 1027adad957SLisandro Dalcin *type = ((PetscObject)ts)->type_name; 1033a40ed3dSBarry Smith PetscFunctionReturn(0); 1043f3760d9SBarry Smith } 1053f3760d9SBarry Smith 106bdad233fSMatthew Knepley /*--------------------------------------------------------------------------------------------------------------------*/ 1073cea93caSBarry Smith 108bdad233fSMatthew Knepley #undef __FUNCT__ 109bdad233fSMatthew Knepley #define __FUNCT__ "TSRegister" 1103cea93caSBarry Smith /*@C 1113cea93caSBarry Smith TSRegister - See TSRegisterDynamic() 1123cea93caSBarry Smith 1137f6c08e0SMatthew Knepley Level: advanced 1143cea93caSBarry Smith @*/ 1157087cfbeSBarry Smith PetscErrorCode TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS)) 116bdad233fSMatthew Knepley { 117e2d1d2b7SBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 118dfbe8321SBarry Smith PetscErrorCode ierr; 119bdad233fSMatthew Knepley 120bdad233fSMatthew Knepley PetscFunctionBegin; 121bdad233fSMatthew Knepley ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr); 122bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr); 123bdad233fSMatthew Knepley ierr = PetscStrcat(fullname, name);CHKERRQ(ierr); 124bdad233fSMatthew Knepley ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr); 125bdad233fSMatthew Knepley PetscFunctionReturn(0); 126bdad233fSMatthew Knepley } 127bdad233fSMatthew Knepley 128bdad233fSMatthew Knepley /*-------------------------------------------------------------------------------------------------------------------*/ 129bdad233fSMatthew Knepley #undef __FUNCT__ 130bdad233fSMatthew Knepley #define __FUNCT__ "TSRegisterDestroy" 131bdad233fSMatthew Knepley /*@C 1323cea93caSBarry Smith TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic(). 133bdad233fSMatthew Knepley 134bdad233fSMatthew Knepley Not Collective 135bdad233fSMatthew Knepley 136bdad233fSMatthew Knepley Level: advanced 137bdad233fSMatthew Knepley 138bdad233fSMatthew Knepley .keywords: TS, timestepper, register, destroy 139437fc6d7SBarry Smith .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic() 140bdad233fSMatthew Knepley @*/ 1417087cfbeSBarry Smith PetscErrorCode TSRegisterDestroy(void) 142bdad233fSMatthew Knepley { 143dfbe8321SBarry Smith PetscErrorCode ierr; 144bdad233fSMatthew Knepley 145bdad233fSMatthew Knepley PetscFunctionBegin; 1461441b1d3SBarry Smith ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr); 147bdad233fSMatthew Knepley TSRegisterAllCalled = PETSC_FALSE; 148bdad233fSMatthew Knepley PetscFunctionReturn(0); 149bdad233fSMatthew Knepley } 150bdad233fSMatthew Knepley 151