Actual source code: tsreg.c
1: /*$Id: tsreg.c,v 1.71 2001/08/06 21:18:08 bsmith Exp $*/
3: #include src/ts/tsimpl.h
5: PetscFList TSList = PETSC_NULL;
6: PetscTruth TSRegisterAllCalled = PETSC_FALSE;
10: /*@C
11: TSSetType - Sets the method for the timestepping solver.
13: Collective on TS
15: Input Parameters:
16: + ts - The TS context
17: - type - A known method
19: Options Database Command:
20: . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
22: Notes:
23: See "petsc/include/petscts.h" for available methods (for instance)
24: + TS_EULER - Euler
25: . TS_PVODE - PVODE interface
26: . TS_BEULER - Backward Euler
27: - TS_PSEUDO - Pseudo-timestepping
29: Normally, it is best to use the TSSetFromOptions() command and
30: then set the TS type from the options database rather than by using
31: this routine. Using the options database provides the user with
32: maximum flexibility in evaluating the many different solvers.
33: The TSSetType() routine is provided for those situations where it
34: is necessary to set the timestepping solver independently of the
35: command line or options database. This might be the case, for example,
36: when the choice of solver changes during the execution of the
37: program, and the user's application is taking responsibility for
38: choosing the appropriate method. In other words, this routine is
39: not for beginners.
41: Level: intermediate
43: .keywords: TS, set, type
45: @*/
46: int TSSetType(TS ts, const TSType type)
47: {
48: int (*r)(TS);
49: PetscTruth match;
50: int ierr;
54: PetscTypeCompare((PetscObject) ts, type, &match);
55: if (match == PETSC_TRUE) return(0);
57: /* Get the function pointers for the method requested */
58: if (TSRegisterAllCalled == PETSC_FALSE) {
59: TSRegisterAll(PETSC_NULL);
60: }
61: PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);
62: if (!r) SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE, "Unknown TS type: %s", type);
64: if (ts->ksp != PETSC_NULL) {
65: KSPDestroy(ts->ksp);
66: ts->ksp = PETSC_NULL;
67: }
68: if (ts->snes != PETSC_NULL) {
69: SNESDestroy(ts->snes);
70: ts->snes = PETSC_NULL;
71: }
72: if (ts->ops->destroy != PETSC_NULL) {
73: (*(ts)->ops->destroy)(ts);
74: }
75: (*r)(ts);
77: PetscObjectChangeTypeName((PetscObject)ts, type);
78: return(0);
79: }
83: /*@C
84: TSGetType - Gets the TS method type (as a string).
86: Not Collective
88: Input Parameter:
89: . ts - The TS
91: Output Parameter:
92: . type - The name of TS method
94: Level: intermediate
96: .keywords: TS, timestepper, get, type, name
97: .seealso TSSetType()
98: @*/
99: int TSGetType(TS ts, TSType *type)
100: {
106: if (TSRegisterAllCalled == PETSC_FALSE) {
107: TSRegisterAll(PETSC_NULL);
108: }
109: *type = ts->type_name;
110: return(0);
111: }
113: /*--------------------------------------------------------------------------------------------------------------------*/
117: /*@C
118: TSRegister - See TSRegisterDynamic()
120: Level: advanced
121: @*/
122: int TSRegister(const char sname[], const char path[], const char name[], int (*function)(TS))
123: {
124: char fullname[256];
125: int ierr;
128: PetscStrcpy(fullname, path);
129: PetscStrcat(fullname, ":");
130: PetscStrcat(fullname, name);
131: PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);
132: return(0);
133: }
135: /*-------------------------------------------------------------------------------------------------------------------*/
138: /*@C
139: TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
141: Not Collective
143: Level: advanced
145: .keywords: TS, timestepper, register, destroy
146: .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
147: @*/
148: int TSRegisterDestroy(void)
149: {
153: if (TSList != PETSC_NULL) {
154: PetscFListDestroy(&TSList);
155: TSList = PETSC_NULL;
156: }
157: TSRegisterAllCalled = PETSC_FALSE;
158: return(0);
159: }