xref: /petsc/src/ts/interface/tsreg.c (revision 9b08a59868f6db739c6debaa370dc27c6bb27ca0)
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   if (ts->ksp) {
59     ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr);
60     ts->ksp = PETSC_NULL;
61   }
62   if (ts->snes) {
63     ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);
64     ts->snes = PETSC_NULL;
65   }
66   if (ts->ops->destroy) {
67     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
68   }
69   ts->setupcalled = PETSC_FALSE;
70   ierr = (*r)(ts);CHKERRQ(ierr);
71   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
72 #if defined(PETSC_HAVE_AMS)
73   if (PetscAMSPublishAll) {
74     ierr = PetscObjectAMSPublish((PetscObject)ts);CHKERRQ(ierr);
75   }
76 #endif
77   PetscFunctionReturn(0);
78 }
79 
80 #undef __FUNCT__
81 #define __FUNCT__ "TSGetType"
82 /*@C
83   TSGetType - Gets the TS method type (as a string).
84 
85   Not Collective
86 
87   Input Parameter:
88 . ts - The TS
89 
90   Output Parameter:
91 . type - The name of TS method
92 
93   Level: intermediate
94 
95 .keywords: TS, timestepper, get, type, name
96 .seealso TSSetType()
97 @*/
98 PetscErrorCode  TSGetType(TS ts, const TSType *type)
99 {
100   PetscFunctionBegin;
101   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
102   PetscValidPointer(type,2);
103   *type = ((PetscObject)ts)->type_name;
104   PetscFunctionReturn(0);
105 }
106 
107 /*--------------------------------------------------------------------------------------------------------------------*/
108 
109 #undef __FUNCT__
110 #define __FUNCT__ "TSRegister"
111 /*@C
112   TSRegister - See TSRegisterDynamic()
113 
114   Level: advanced
115 @*/
116 PetscErrorCode  TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS))
117 {
118   char           fullname[PETSC_MAX_PATH_LEN];
119   PetscErrorCode ierr;
120 
121   PetscFunctionBegin;
122   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
123   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
124   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
125   ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
126   PetscFunctionReturn(0);
127 }
128 
129 /*-------------------------------------------------------------------------------------------------------------------*/
130 #undef __FUNCT__
131 #define __FUNCT__ "TSRegisterDestroy"
132 /*@C
133    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
134 
135    Not Collective
136 
137    Level: advanced
138 
139 .keywords: TS, timestepper, register, destroy
140 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
141 @*/
142 PetscErrorCode  TSRegisterDestroy(void)
143 {
144   PetscErrorCode ierr;
145 
146   PetscFunctionBegin;
147   ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr);
148   TSRegisterAllCalled = PETSC_FALSE;
149   PetscFunctionReturn(0);
150 }
151 
152