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