xref: /petsc/src/ts/interface/tsreg.c (revision 607a6623fc3ebf1ec03868e90ff90ff3b0120740)
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 for 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 @*/
44 PetscErrorCode  TSSetType(TS ts,TSType type)
45 {
46   PetscErrorCode (*r)(TS);
47   PetscBool      match;
48   PetscErrorCode ierr;
49 
50   PetscFunctionBegin;
51   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
52   ierr = PetscObjectTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
53   if (match) PetscFunctionReturn(0);
54 
55   ierr = PetscFunctionListFind(PetscObjectComm((PetscObject)ts),TSList, type,PETSC_TRUE, (void (**)(void)) &r);CHKERRQ(ierr);
56   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
57   if (ts->ops->destroy) {
58     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
59 
60     ts->ops->destroy = NULL;
61   }
62   ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr);
63 
64   ts->setupcalled = PETSC_FALSE;
65 
66   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
67   ierr = (*r)(ts);CHKERRQ(ierr);
68   PetscFunctionReturn(0);
69 }
70 
71 #undef __FUNCT__
72 #define __FUNCT__ "TSGetType"
73 /*@C
74   TSGetType - Gets the TS method type (as a string).
75 
76   Not Collective
77 
78   Input Parameter:
79 . ts - The TS
80 
81   Output Parameter:
82 . type - The name of TS method
83 
84   Level: intermediate
85 
86 .keywords: TS, timestepper, get, type, name
87 .seealso TSSetType()
88 @*/
89 PetscErrorCode  TSGetType(TS ts, TSType *type)
90 {
91   PetscFunctionBegin;
92   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
93   PetscValidPointer(type,2);
94   *type = ((PetscObject)ts)->type_name;
95   PetscFunctionReturn(0);
96 }
97 
98 /*--------------------------------------------------------------------------------------------------------------------*/
99 
100 #undef __FUNCT__
101 #define __FUNCT__ "TSRegister"
102 /*@C
103   TSRegister - Adds a creation method to the TS package.
104 
105   Not Collective
106 
107   Input Parameters:
108 + name        - The name of a new user-defined creation routine
109 . func_name   - The name of the creation routine
110 - create_func - The creation routine itself
111 
112   Notes:
113   TSRegister() may be called multiple times to add several user-defined tses.
114 
115   Sample usage:
116 .vb
117   TSRegister("my_ts", "MyTSCreate", MyTSCreate);
118 .ve
119 
120   Then, your ts type can be chosen with the procedural interface via
121 .vb
122     TS ts;
123     TSCreate(MPI_Comm, &ts);
124     TSSetType(ts, "my_ts")
125 .ve
126   or at runtime via the option
127 .vb
128     -ts_type my_ts
129 .ve
130 
131   Level: advanced
132 
133 .keywords: TS, register
134 
135 .seealso: TSRegisterAll(), TSRegisterDestroy()
136 @*/
137 PetscErrorCode  TSRegister(const char sname[], const char name[], PetscErrorCode (*function)(TS))
138 {
139   PetscErrorCode ierr;
140 
141   PetscFunctionBegin;
142   ierr = PetscFunctionListAdd(PETSC_COMM_WORLD,&TSList, sname, name, (void (*)(void))function);CHKERRQ(ierr);
143   PetscFunctionReturn(0);
144 }
145 
146 /*-------------------------------------------------------------------------------------------------------------------*/
147 #undef __FUNCT__
148 #define __FUNCT__ "TSRegisterDestroy"
149 /*@C
150    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()
151 
152    Not Collective
153 
154    Level: advanced
155 
156 .keywords: TS, timestepper, register, destroy
157 .seealso: TSRegister(), TSRegisterAll()
158 @*/
159 PetscErrorCode  TSRegisterDestroy(void)
160 {
161   PetscErrorCode ierr;
162 
163   PetscFunctionBegin;
164   ierr = PetscFunctionListDestroy(&TSList);CHKERRQ(ierr);
165   TSRegisterAllCalled = PETSC_FALSE;
166   PetscFunctionReturn(0);
167 }
168