xref: /petsc/src/ts/interface/tsreg.c (revision fe998a80077c9ee0917a39496df43fc256e1b478)
1 #include <petsc-private/tsimpl.h>      /*I "petscts.h"  I*/
2 
3 PetscFunctionList TSList              = NULL;
4 PetscBool         TSRegisterAllCalled = PETSC_FALSE;
5 
6 #undef __FUNCT__
7 #define __FUNCT__ "TSSetType"
8 /*@C
9   TSSetType - Sets the method to be used as the timestepping solver.
10 
11   Collective on TS
12 
13   Input Parameters:
14 + ts   - The TS context
15 - type - A known method
16 
17   Options Database Command:
18 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
19 
20    Notes:
21    See "petsc/include/petscts.h" for available methods (for instance)
22 +  TSEULER - Euler
23 .  TSSUNDIALS - SUNDIALS interface
24 .  TSBEULER - Backward Euler
25 -  TSPSEUDO - Pseudo-timestepping
26 
27    Normally, it is best to use the TSSetFromOptions() command and
28    then set the TS type from the options database rather than by using
29    this routine.  Using the options database provides the user with
30    maximum flexibility in evaluating the many different solvers.
31    The TSSetType() routine is provided for those situations where it
32    is necessary to set the timestepping solver independently of the
33    command line or options database.  This might be the case, for example,
34    when the choice of solver changes during the execution of the
35    program, and the user's application is taking responsibility for
36    choosing the appropriate method.  In other words, this routine is
37    not for beginners.
38 
39    Level: intermediate
40 
41 .keywords: TS, set, type
42 
43 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
44 
45 @*/
46 PetscErrorCode  TSSetType(TS ts,TSType type)
47 {
48   PetscErrorCode (*r)(TS);
49   PetscBool      match;
50   PetscErrorCode ierr;
51 
52   PetscFunctionBegin;
53   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
54   ierr = PetscObjectTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
55   if (match) PetscFunctionReturn(0);
56 
57   ierr = PetscFunctionListFind(TSList,type,&r);CHKERRQ(ierr);
58   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
59   if (ts->ops->destroy) {
60     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
61 
62     ts->ops->destroy = NULL;
63   }
64   ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr);
65 
66   ts->setupcalled = PETSC_FALSE;
67 
68   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
69   ierr = (*r)(ts);CHKERRQ(ierr);
70   PetscFunctionReturn(0);
71 }
72 
73 #undef __FUNCT__
74 #define __FUNCT__ "TSGetType"
75 /*@C
76   TSGetType - Gets the TS method type (as a string).
77 
78   Not Collective
79 
80   Input Parameter:
81 . ts - The TS
82 
83   Output Parameter:
84 . type - The name of TS method
85 
86   Level: intermediate
87 
88 .keywords: TS, timestepper, get, type, name
89 .seealso TSSetType()
90 @*/
91 PetscErrorCode  TSGetType(TS ts, TSType *type)
92 {
93   PetscFunctionBegin;
94   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
95   PetscValidPointer(type,2);
96   *type = ((PetscObject)ts)->type_name;
97   PetscFunctionReturn(0);
98 }
99 
100 /*--------------------------------------------------------------------------------------------------------------------*/
101 
102 #undef __FUNCT__
103 #define __FUNCT__ "TSRegister"
104 /*@C
105   TSRegister - Adds a creation method to the TS package.
106 
107   Not Collective
108 
109   Input Parameters:
110 + name        - The name of a new user-defined creation routine
111 - create_func - The creation routine itself
112 
113   Notes:
114   TSRegister() may be called multiple times to add several user-defined tses.
115 
116   Sample usage:
117 .vb
118   TSRegister("my_ts",  MyTSCreate);
119 .ve
120 
121   Then, your ts type can be chosen with the procedural interface via
122 .vb
123     TS ts;
124     TSCreate(MPI_Comm, &ts);
125     TSSetType(ts, "my_ts")
126 .ve
127   or at runtime via the option
128 .vb
129     -ts_type my_ts
130 .ve
131 
132   Level: advanced
133 
134 .keywords: TS, register
135 
136 .seealso: TSRegisterAll(), TSRegisterDestroy()
137 @*/
138 PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
139 {
140   PetscErrorCode ierr;
141 
142   PetscFunctionBegin;
143   ierr = PetscFunctionListAdd(&TSList,sname,function);CHKERRQ(ierr);
144   PetscFunctionReturn(0);
145 }
146 
147