xref: /petsc/src/ts/interface/tsreg.c (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
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 Key:
16 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
17 
18    Level: intermediate
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 .seealso: [](chapter_ts), `TS`, `TSSolve()`, `TSCreate()`, `TSSetFromOptions()`, `TSDestroy()`, `TSType`
40 @*/
41 PetscErrorCode TSSetType(TS ts, TSType type)
42 {
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: [](chapter_ts), `TS`, `TSType`, `TSSetType()`
80 @*/
81 PetscErrorCode TSGetType(TS ts, TSType *type)
82 {
83   PetscFunctionBegin;
84   PetscValidHeaderSpecific(ts, TS_CLASSID, 1);
85   PetscValidPointer(type, 2);
86   *type = ((PetscObject)ts)->type_name;
87   PetscFunctionReturn(0);
88 }
89 
90 /*--------------------------------------------------------------------------------------------------------------------*/
91 
92 /*@C
93   TSRegister - Adds a creation method to the `TS` package.
94 
95   Not Collective
96 
97   Input Parameters:
98 + name        - The name of a new user-defined creation routine
99 - create_func - The creation routine itself
100 
101   Level: advanced
102 
103   Notes:
104   `TSRegister()` may be called multiple times to add several user-defined tses.
105 
106   Sample usage:
107 .vb
108   TSRegister("my_ts",  MyTSCreate);
109 .ve
110 
111   Then, your ts type can be chosen with the procedural interface via
112 .vb
113     TS ts;
114     TSCreate(MPI_Comm, &ts);
115     TSSetType(ts, "my_ts")
116 .ve
117   or at runtime via the option
118 .vb
119     -ts_type my_ts
120 .ve
121 
122 .seealso: [](chapter_ts), `TSSetType()`, `TSType`, `TSRegisterAll()`, `TSRegisterDestroy()`
123 @*/
124 PetscErrorCode TSRegister(const char sname[], PetscErrorCode (*function)(TS))
125 {
126   PetscFunctionBegin;
127   PetscCall(TSInitializePackage());
128   PetscCall(PetscFunctionListAdd(&TSList, sname, function));
129   PetscFunctionReturn(0);
130 }
131