xref: /petsc/src/ts/interface/tsreg.c (revision 825ab93598c312e6a7e3a5e7ff7362a01a887e4f)
1af0996ceSBarry Smith #include <petsc/private/tsimpl.h>      /*I "petscts.h"  I*/
23f3760d9SBarry Smith 
30298fd71SBarry Smith PetscFunctionList TSList              = NULL;
4ace3abfcSBarry Smith PetscBool         TSRegisterAllCalled = PETSC_FALSE;
53f3760d9SBarry Smith 
682bf6240SBarry Smith /*@C
78f6c3df8SBarry Smith   TSSetType - Sets the method to be used as the timestepping solver.
83f3760d9SBarry Smith 
9fee21e36SBarry Smith   Collective on TS
10fee21e36SBarry Smith 
11bef22f13SLois Curfman McInnes   Input Parameters:
12bdad233fSMatthew Knepley + ts   - The TS context
13bdad233fSMatthew Knepley - type - A known method
14bef22f13SLois Curfman McInnes 
15ae12b187SLois Curfman McInnes   Options Database Command:
16bdad233fSMatthew Knepley . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
17ae12b187SLois Curfman McInnes 
183f3760d9SBarry Smith    Notes:
19e090d566SSatish Balay    See "petsc/include/petscts.h" for available methods (for instance)
209596e0b4SJed Brown +  TSEULER - Euler
219596e0b4SJed Brown .  TSSUNDIALS - SUNDIALS interface
229596e0b4SJed Brown .  TSBEULER - Backward Euler
239596e0b4SJed Brown -  TSPSEUDO - Pseudo-timestepping
243f3760d9SBarry Smith 
25ae12b187SLois Curfman McInnes    Normally, it is best to use the TSSetFromOptions() command and
26ae12b187SLois Curfman McInnes    then set the TS type from the options database rather than by using
27ae12b187SLois Curfman McInnes    this routine.  Using the options database provides the user with
28ae12b187SLois Curfman McInnes    maximum flexibility in evaluating the many different solvers.
29ae12b187SLois Curfman McInnes    The TSSetType() routine is provided for those situations where it
30ae12b187SLois Curfman McInnes    is necessary to set the timestepping solver independently of the
31ae12b187SLois Curfman McInnes    command line or options database.  This might be the case, for example,
32ae12b187SLois Curfman McInnes    when the choice of solver changes during the execution of the
33ae12b187SLois Curfman McInnes    program, and the user's application is taking responsibility for
34ae12b187SLois Curfman McInnes    choosing the appropriate method.  In other words, this routine is
35d5d37b61SLois Curfman McInnes    not for beginners.
36d5d37b61SLois Curfman McInnes 
37d5d37b61SLois Curfman McInnes    Level: intermediate
383f3760d9SBarry Smith 
39ae12b187SLois Curfman McInnes .keywords: TS, set, type
40437fc6d7SBarry Smith 
418f6c3df8SBarry Smith .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
428f6c3df8SBarry Smith 
433f3760d9SBarry Smith @*/
4419fd82e9SBarry Smith PetscErrorCode  TSSetType(TS ts,TSType type)
453f3760d9SBarry Smith {
466849ba73SBarry Smith   PetscErrorCode (*r)(TS);
47ace3abfcSBarry Smith   PetscBool      match;
48dfbe8321SBarry Smith   PetscErrorCode ierr;
49df8cb225SBarry Smith 
503a40ed3dSBarry Smith   PetscFunctionBegin;
510700a824SBarry Smith   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
52b92453a8SLisandro Dalcin   PetscValidCharPointer(type,2);
53251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
54958c9bccSBarry Smith   if (match) PetscFunctionReturn(0);
55bdad233fSMatthew Knepley 
561c9cd337SJed Brown   ierr = PetscFunctionListFind(TSList,type,&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->ops->destroy) {
59bdad233fSMatthew Knepley     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
60bdad233fSMatthew Knepley   }
6179531b15SSean Farley   ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr);
62*825ab935SBarry Smith   ts->usessnes           = PETSC_FALSE;
63b92453a8SLisandro Dalcin   ts->default_adapt_type = TSADAPTNONE;
64bbd56ea5SKarl Rupp 
65277b19d0SLisandro Dalcin   ts->setupcalled = PETSC_FALSE;
66bbd56ea5SKarl Rupp 
67bdad233fSMatthew Knepley   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
68d372ba47SLisandro Dalcin   ierr = (*r)(ts);CHKERRQ(ierr);
693a40ed3dSBarry Smith   PetscFunctionReturn(0);
703f3760d9SBarry Smith }
713f3760d9SBarry Smith 
723f3760d9SBarry Smith /*@C
73fee21e36SBarry Smith   TSGetType - Gets the TS method type (as a string).
743f3760d9SBarry Smith 
75bef22f13SLois Curfman McInnes   Not Collective
76bef22f13SLois Curfman McInnes 
773f3760d9SBarry Smith   Input Parameter:
78bdad233fSMatthew Knepley . ts - The TS
793f3760d9SBarry Smith 
803f3760d9SBarry Smith   Output Parameter:
81bdad233fSMatthew Knepley . type - The name of TS method
823f3760d9SBarry Smith 
83d5d37b61SLois Curfman McInnes   Level: intermediate
84d5d37b61SLois Curfman McInnes 
85df8cb225SBarry Smith .keywords: TS, timestepper, get, type, name
86bdad233fSMatthew Knepley .seealso TSSetType()
873f3760d9SBarry Smith @*/
8819fd82e9SBarry Smith PetscErrorCode  TSGetType(TS ts, TSType *type)
893f3760d9SBarry Smith {
903a40ed3dSBarry Smith   PetscFunctionBegin;
910700a824SBarry Smith   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
924482741eSBarry Smith   PetscValidPointer(type,2);
937adad957SLisandro Dalcin   *type = ((PetscObject)ts)->type_name;
943a40ed3dSBarry Smith   PetscFunctionReturn(0);
953f3760d9SBarry Smith }
963f3760d9SBarry Smith 
97bdad233fSMatthew Knepley /*--------------------------------------------------------------------------------------------------------------------*/
983cea93caSBarry Smith 
993cea93caSBarry Smith /*@C
1001c84c290SBarry Smith   TSRegister - Adds a creation method to the TS package.
1011c84c290SBarry Smith 
1021c84c290SBarry Smith   Not Collective
1031c84c290SBarry Smith 
1041c84c290SBarry Smith   Input Parameters:
1051c84c290SBarry Smith + name        - The name of a new user-defined creation routine
1061c84c290SBarry Smith - create_func - The creation routine itself
1071c84c290SBarry Smith 
1081c84c290SBarry Smith   Notes:
1091c84c290SBarry Smith   TSRegister() may be called multiple times to add several user-defined tses.
1101c84c290SBarry Smith 
1111c84c290SBarry Smith   Sample usage:
1121c84c290SBarry Smith .vb
113bdf89e91SBarry Smith   TSRegister("my_ts",  MyTSCreate);
1141c84c290SBarry Smith .ve
1151c84c290SBarry Smith 
1161c84c290SBarry Smith   Then, your ts type can be chosen with the procedural interface via
1171c84c290SBarry Smith .vb
1181c84c290SBarry Smith     TS ts;
1191c84c290SBarry Smith     TSCreate(MPI_Comm, &ts);
1201c84c290SBarry Smith     TSSetType(ts, "my_ts")
1211c84c290SBarry Smith .ve
1221c84c290SBarry Smith   or at runtime via the option
1231c84c290SBarry Smith .vb
1241c84c290SBarry Smith     -ts_type my_ts
1251c84c290SBarry Smith .ve
1263cea93caSBarry Smith 
1277f6c08e0SMatthew Knepley   Level: advanced
1281c84c290SBarry Smith 
1291c84c290SBarry Smith .keywords: TS, register
1301c84c290SBarry Smith 
1311c84c290SBarry Smith .seealso: TSRegisterAll(), TSRegisterDestroy()
1323cea93caSBarry Smith @*/
133bdf89e91SBarry Smith PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
134bdad233fSMatthew Knepley {
135dfbe8321SBarry Smith   PetscErrorCode ierr;
136bdad233fSMatthew Knepley 
137bdad233fSMatthew Knepley   PetscFunctionBegin;
138a240a19fSJed Brown   ierr = PetscFunctionListAdd(&TSList,sname,function);CHKERRQ(ierr);
139bdad233fSMatthew Knepley   PetscFunctionReturn(0);
140bdad233fSMatthew Knepley }
141bdad233fSMatthew Knepley 
142