xref: /petsc/src/ts/interface/tsreg.c (revision 3050cee28ff83b093d983d7c5197e87b438ca09b)
1 #define PETSCTS_DLL
2 
3 #include "include/private/tsimpl.h"      /*I "petscts.h"  I*/
4 
5 PetscFList TSList                       = PETSC_NULL;
6 PetscTruth TSRegisterAllCalled          = PETSC_FALSE;
7 
8 #undef __FUNCT__
9 #define __FUNCT__ "TSSetType"
10 /*@C
11   TSSetType - Sets the method for the timestepping solver.
12 
13   Collective on TS
14 
15   Input Parameters:
16 + ts   - The TS context
17 - type - A known method
18 
19   Options Database Command:
20 . -ts_type <type> - Sets the method; use -help for a list of available methods (for instance, euler)
21 
22    Notes:
23    See "petsc/include/petscts.h" for available methods (for instance)
24 +  TS_EULER - Euler
25 .  TS_SUNDIALS - SUNDIALS interface
26 .  TS_BEULER - Backward Euler
27 -  TS_PSEUDO - Pseudo-timestepping
28 
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.
40 
41    Level: intermediate
42 
43 .keywords: TS, set, type
44 
45 @*/
46 PetscErrorCode PETSCTS_DLLEXPORT TSSetType(TS ts, const TSType type)
47 {
48   PetscErrorCode (*r)(TS);
49   PetscTruth     match;
50   PetscErrorCode ierr;
51 
52   PetscFunctionBegin;
53   PetscValidHeaderSpecific(ts, TS_COOKIE,1);
54   ierr = PetscTypeCompare((PetscObject) ts, type, &match);CHKERRQ(ierr);
55   if (match) PetscFunctionReturn(0);
56 
57   /* Get the function pointers for the method requested */
58   if (!TSRegisterAllCalled) {
59     ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);
60   }
61   ierr = PetscFListFind(ts->comm, TSList, type, (void (**)(void)) &r);CHKERRQ(ierr);
62   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
63   if (ts->ksp) {
64     ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr);
65     ts->ksp = PETSC_NULL;
66   }
67   if (ts->snes) {
68     ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);
69     ts->snes = PETSC_NULL;
70   }
71   if (ts->ops->destroy) {
72     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
73   }
74   ierr = (*r)(ts);CHKERRQ(ierr);
75   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
76   PetscFunctionReturn(0);
77 }
78 
79 #undef __FUNCT__
80 #define __FUNCT__ "TSGetType"
81 /*@C
82   TSGetType - Gets the TS method type (as a string).
83 
84   Not Collective
85 
86   Input Parameter:
87 . ts - The TS
88 
89   Output Parameter:
90 . type - The name of TS method
91 
92   Level: intermediate
93 
94 .keywords: TS, timestepper, get, type, name
95 .seealso TSSetType()
96 @*/
97 PetscErrorCode PETSCTS_DLLEXPORT TSGetType(TS ts, TSType *type)
98 {
99   PetscErrorCode ierr;
100 
101   PetscFunctionBegin;
102   PetscValidHeaderSpecific(ts, TS_COOKIE,1);
103   PetscValidPointer(type,2);
104   if (!TSRegisterAllCalled) {
105     ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);
106   }
107   *type = ts->type_name;
108   PetscFunctionReturn(0);
109 }
110 
111 /*--------------------------------------------------------------------------------------------------------------------*/
112 
113 #undef __FUNCT__
114 #define __FUNCT__ "TSRegister"
115 /*@C
116   TSRegister - See TSRegisterDynamic()
117 
118   Level: advanced
119 @*/
120 PetscErrorCode PETSCTS_DLLEXPORT TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS))
121 {
122   char           fullname[PETSC_MAX_PATH_LEN];
123   PetscErrorCode ierr;
124 
125   PetscFunctionBegin;
126   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
127   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
128   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
129   ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
130   PetscFunctionReturn(0);
131 }
132 
133 /*-------------------------------------------------------------------------------------------------------------------*/
134 #undef __FUNCT__
135 #define __FUNCT__ "TSRegisterDestroy"
136 /*@C
137    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
138 
139    Not Collective
140 
141    Level: advanced
142 
143 .keywords: TS, timestepper, register, destroy
144 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
145 @*/
146 PetscErrorCode PETSCTS_DLLEXPORT TSRegisterDestroy(void)
147 {
148   PetscErrorCode ierr;
149 
150   PetscFunctionBegin;
151   if (TSList) {
152     ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr);
153     TSList = PETSC_NULL;
154   }
155   TSRegisterAllCalled = PETSC_FALSE;
156   PetscFunctionReturn(0);
157 }
158 
159