xref: /petsc/src/ts/interface/tsreg.c (revision e2d1d2b73d857c2061120f42f5153ba627fcaad7)
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