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 @*/
TSSetType(TS ts,TSType type)42 PetscErrorCode  TSSetType(TS ts,TSType type)
43 {
44   PetscErrorCode (*r)(TS);
45   PetscBool      match;
46   PetscErrorCode ierr;
47 
48   PetscFunctionBegin;
49   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
50   PetscValidCharPointer(type,2);
51   ierr = PetscObjectTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
52   if (match) PetscFunctionReturn(0);
53 
54   ierr = PetscFunctionListFind(TSList,type,&r);CHKERRQ(ierr);
55   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
56   if (ts->ops->destroy) {
57     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
58   }
59   ierr = PetscMemzero(ts->ops,sizeof(*ts->ops));CHKERRQ(ierr);
60   ts->usessnes           = PETSC_FALSE;
61   ts->default_adapt_type = TSADAPTNONE;
62 
63   ts->setupcalled = PETSC_FALSE;
64 
65   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
66   ierr = (*r)(ts);CHKERRQ(ierr);
67   PetscFunctionReturn(0);
68 }
69 
70 /*@C
71   TSGetType - Gets the TS method type (as a string).
72 
73   Not Collective
74 
75   Input Parameter:
76 . ts - The TS
77 
78   Output Parameter:
79 . type - The name of TS method
80 
81   Level: intermediate
82 
83 .seealso TSSetType()
84 @*/
TSGetType(TS ts,TSType * type)85 PetscErrorCode  TSGetType(TS ts, TSType *type)
86 {
87   PetscFunctionBegin;
88   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
89   PetscValidPointer(type,2);
90   *type = ((PetscObject)ts)->type_name;
91   PetscFunctionReturn(0);
92 }
93 
94 /*--------------------------------------------------------------------------------------------------------------------*/
95 
96 /*@C
97   TSRegister - Adds a creation method to the TS package.
98 
99   Not Collective
100 
101   Input Parameters:
102 + name        - The name of a new user-defined creation routine
103 - create_func - The creation routine itself
104 
105   Notes:
106   TSRegister() may be called multiple times to add several user-defined tses.
107 
108   Sample usage:
109 .vb
110   TSRegister("my_ts",  MyTSCreate);
111 .ve
112 
113   Then, your ts type can be chosen with the procedural interface via
114 .vb
115     TS ts;
116     TSCreate(MPI_Comm, &ts);
117     TSSetType(ts, "my_ts")
118 .ve
119   or at runtime via the option
120 .vb
121     -ts_type my_ts
122 .ve
123 
124   Level: advanced
125 
126 .seealso: TSRegisterAll(), TSRegisterDestroy()
127 @*/
TSRegister(const char sname[],PetscErrorCode (* function)(TS))128 PetscErrorCode  TSRegister(const char sname[], PetscErrorCode (*function)(TS))
129 {
130   PetscErrorCode ierr;
131 
132   PetscFunctionBegin;
133   ierr = TSInitializePackage();CHKERRQ(ierr);
134   ierr = PetscFunctionListAdd(&TSList,sname,function);CHKERRQ(ierr);
135   PetscFunctionReturn(0);
136 }
137 
138