Actual source code: tsreg.c
petsc-3.11.4 2019-09-28
1: #include <petsc/private/tsimpl.h>
3: PetscFunctionList TSList = NULL;
4: PetscBool TSRegisterAllCalled = PETSC_FALSE;
6: /*@C
7: TSSetType - Sets the method to be used as the timestepping solver.
9: Collective on TS
11: Input Parameters:
12: + ts - The TS context
13: - type - A known method
15: Options Database Command:
16: . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
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
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.
37: Level: intermediate
39: .keywords: TS, set, type
41: .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType
43: @*/
44: PetscErrorCode TSSetType(TS ts,TSType type)
45: {
46: PetscErrorCode (*r)(TS);
47: PetscBool match;
53: PetscObjectTypeCompare((PetscObject) ts, type, &match);
54: if (match) return(0);
56: PetscFunctionListFind(TSList,type,&r);
57: if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
58: if (ts->ops->destroy) {
59: (*(ts)->ops->destroy)(ts);
60: }
61: PetscMemzero(ts->ops,sizeof(*ts->ops));
62: ts->usessnes = PETSC_FALSE;
63: ts->default_adapt_type = TSADAPTNONE;
65: ts->setupcalled = PETSC_FALSE;
67: PetscObjectChangeTypeName((PetscObject)ts, type);
68: (*r)(ts);
69: return(0);
70: }
72: /*@C
73: TSGetType - Gets the TS method type (as a string).
75: Not Collective
77: Input Parameter:
78: . ts - The TS
80: Output Parameter:
81: . type - The name of TS method
83: Level: intermediate
85: .keywords: TS, timestepper, get, type, name
86: .seealso TSSetType()
87: @*/
88: PetscErrorCode TSGetType(TS ts, TSType *type)
89: {
93: *type = ((PetscObject)ts)->type_name;
94: return(0);
95: }
97: /*--------------------------------------------------------------------------------------------------------------------*/
99: /*@C
100: TSRegister - Adds a creation method to the TS package.
102: Not Collective
104: Input Parameters:
105: + name - The name of a new user-defined creation routine
106: - create_func - The creation routine itself
108: Notes:
109: TSRegister() may be called multiple times to add several user-defined tses.
111: Sample usage:
112: .vb
113: TSRegister("my_ts", MyTSCreate);
114: .ve
116: Then, your ts type can be chosen with the procedural interface via
117: .vb
118: TS ts;
119: TSCreate(MPI_Comm, &ts);
120: TSSetType(ts, "my_ts")
121: .ve
122: or at runtime via the option
123: .vb
124: -ts_type my_ts
125: .ve
127: Level: advanced
129: .keywords: TS, register
131: .seealso: TSRegisterAll(), TSRegisterDestroy()
132: @*/
133: PetscErrorCode TSRegister(const char sname[], PetscErrorCode (*function)(TS))
134: {
138: TSInitializePackage();
139: PetscFunctionListAdd(&TSList,sname,function);
140: return(0);
141: }