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