xref: /petsc/src/ts/interface/tsreg.c (revision a32ab379bc196903d81f117b153e855bfa447008)
1 
2 #include <private/tsimpl.h>      /*I "petscts.h"  I*/
3 
4 PetscFList TSList                       = PETSC_NULL;
5 PetscBool  TSRegisterAllCalled          = PETSC_FALSE;
6 
7 #undef __FUNCT__
8 #define __FUNCT__ "TSSetType"
9 /*@C
10   TSSetType - Sets the method for the timestepping solver.
11 
12   Collective on TS
13 
14   Input Parameters:
15 + ts   - The TS context
16 - type - A known method
17 
18   Options Database Command:
19 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
20 
21    Notes:
22    See "petsc/include/petscts.h" for available methods (for instance)
23 +  TSEULER - Euler
24 .  TSSUNDIALS - SUNDIALS interface
25 .  TSBEULER - Backward Euler
26 -  TSPSEUDO - Pseudo-timestepping
27 
28    Normally, it is best to use the TSSetFromOptions() command and
29    then set the TS type from the options database rather than by using
30    this routine.  Using the options database provides the user with
31    maximum flexibility in evaluating the many different solvers.
32    The TSSetType() routine is provided for those situations where it
33    is necessary to set the timestepping solver independently of the
34    command line or options database.  This might be the case, for example,
35    when the choice of solver changes during the execution of the
36    program, and the user's application is taking responsibility for
37    choosing the appropriate method.  In other words, this routine is
38    not for beginners.
39 
40    Level: intermediate
41 
42 .keywords: TS, set, type
43 
44 @*/
45 PetscErrorCode  TSSetType(TS ts,const TSType type)
46 {
47   PetscErrorCode (*r)(TS);
48   PetscBool      match;
49   PetscErrorCode ierr;
50 
51   PetscFunctionBegin;
52   PetscValidHeaderSpecific(ts, TS_CLASSID,1);
53   ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
54   if (match) PetscFunctionReturn(0);
55 
56   ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, type,PETSC_TRUE, (void (**)(void)) &r);CHKERRQ(ierr);
57   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
58   ierr = KSPDestroy(&ts->ksp);CHKERRQ(ierr);
59   ierr = SNESDestroy(&ts->snes);CHKERRQ(ierr);
60   if (ts->ops->destroy) {
61     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
62   }
63   ts->setupcalled = PETSC_FALSE;
64   ierr = (*r)(ts);CHKERRQ(ierr);
65   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
66 #if defined(PETSC_HAVE_AMS)
67   if (PetscAMSPublishAll) {
68     ierr = PetscObjectAMSPublish((PetscObject)ts);CHKERRQ(ierr);
69   }
70 #endif
71   PetscFunctionReturn(0);
72 }
73 
74 #undef __FUNCT__
75 #define __FUNCT__ "TSGetType"
76 /*@C
77   TSGetType - Gets the TS method type (as a string).
78 
79   Not Collective
80 
81   Input Parameter:
82 . ts - The TS
83 
84   Output Parameter:
85 . type - The name of TS method
86 
87   Level: intermediate
88 
89 .keywords: TS, timestepper, get, type, name
90 .seealso TSSetType()
91 @*/
92 PetscErrorCode  TSGetType(TS ts, const TSType *type)
93 {
94   PetscFunctionBegin;
95   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
96   PetscValidPointer(type,2);
97   *type = ((PetscObject)ts)->type_name;
98   PetscFunctionReturn(0);
99 }
100 
101 /*--------------------------------------------------------------------------------------------------------------------*/
102 
103 #undef __FUNCT__
104 #define __FUNCT__ "TSRegister"
105 /*@C
106   TSRegister - See TSRegisterDynamic()
107 
108   Level: advanced
109 @*/
110 PetscErrorCode  TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS))
111 {
112   char           fullname[PETSC_MAX_PATH_LEN];
113   PetscErrorCode ierr;
114 
115   PetscFunctionBegin;
116   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
117   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
118   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
119   ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
120   PetscFunctionReturn(0);
121 }
122 
123 /*-------------------------------------------------------------------------------------------------------------------*/
124 #undef __FUNCT__
125 #define __FUNCT__ "TSRegisterDestroy"
126 /*@C
127    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
128 
129    Not Collective
130 
131    Level: advanced
132 
133 .keywords: TS, timestepper, register, destroy
134 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
135 @*/
136 PetscErrorCode  TSRegisterDestroy(void)
137 {
138   PetscErrorCode ierr;
139 
140   PetscFunctionBegin;
141   ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr);
142   TSRegisterAllCalled = PETSC_FALSE;
143   PetscFunctionReturn(0);
144 }
145 
146