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