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