xref: /petsc/src/ts/interface/tsreg.c (revision 2f6eced2a19e978d64f27de66fbc6c26cc5c7934)
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 .keywords: TS, set, type
40 
41 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
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(TSList,type,&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 /*@C
72   TSGetType - Gets the TS method type (as a string).
73 
74   Not Collective
75 
76   Input Parameter:
77 . ts - The TS
78 
79   Output Parameter:
80 . type - The name of TS method
81 
82   Level: intermediate
83 
84 .keywords: TS, timestepper, get, type, name
85 .seealso TSSetType()
86 @*/
87 PetscErrorCode  TSGetType(TS ts, TSType *type)
88 {
89   PetscFunctionBegin;
90   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
91   PetscValidPointer(type,2);
92   *type = ((PetscObject)ts)->type_name;
93   PetscFunctionReturn(0);
94 }
95 
96 /*--------------------------------------------------------------------------------------------------------------------*/
97 
98 /*@C
99   TSRegister - Adds a creation method to the TS package.
100 
101   Not Collective
102 
103   Input Parameters:
104 + name        - The name of a new user-defined creation routine
105 - create_func - The creation routine itself
106 
107   Notes:
108   TSRegister() may be called multiple times to add several user-defined tses.
109 
110   Sample usage:
111 .vb
112   TSRegister("my_ts",  MyTSCreate);
113 .ve
114 
115   Then, your ts type can be chosen with the procedural interface via
116 .vb
117     TS ts;
118     TSCreate(MPI_Comm, &ts);
119     TSSetType(ts, "my_ts")
120 .ve
121   or at runtime via the option
122 .vb
123     -ts_type my_ts
124 .ve
125 
126   Level: advanced
127 
128 .keywords: TS, register
129 
130 .seealso: TSRegisterAll(), TSRegisterDestroy()
131 @*/
132 PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
133 {
134   PetscErrorCode ierr;
135 
136   PetscFunctionBegin;
137   ierr = PetscFunctionListAdd(&TSList,sname,function);CHKERRQ(ierr);
138   PetscFunctionReturn(0);
139 }
140 
141