xref: /petsc/src/ts/interface/tsreg.c (revision fd705b320d8d44969be9ca25a36dbdd35fbe8e12)
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,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   ierr = PetscFListFind( TSList,((PetscObject)ts)->comm, type, (void (**)(void)) &r);CHKERRQ(ierr);
58   if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown TS type: %s", type);
59   if (ts->ksp) {
60     ierr = KSPDestroy(ts->ksp);CHKERRQ(ierr);
61     ts->ksp = PETSC_NULL;
62   }
63   if (ts->snes) {
64     ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);
65     ts->snes = PETSC_NULL;
66   }
67   if (ts->ops->destroy) {
68     ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);
69   }
70   ierr = (*r)(ts);CHKERRQ(ierr);
71   ierr = PetscObjectChangeTypeName((PetscObject)ts, type);CHKERRQ(ierr);
72   PetscFunctionReturn(0);
73 }
74 
75 #undef __FUNCT__
76 #define __FUNCT__ "TSGetType"
77 /*@C
78   TSGetType - Gets the TS method type (as a string).
79 
80   Not Collective
81 
82   Input Parameter:
83 . ts - The TS
84 
85   Output Parameter:
86 . type - The name of TS method
87 
88   Level: intermediate
89 
90 .keywords: TS, timestepper, get, type, name
91 .seealso TSSetType()
92 @*/
93 PetscErrorCode PETSCTS_DLLEXPORT TSGetType(TS ts, TSType *type)
94 {
95   PetscErrorCode ierr;
96 
97   PetscFunctionBegin;
98   PetscValidHeaderSpecific(ts, TS_COOKIE,1);
99   PetscValidPointer(type,2);
100   if (!TSRegisterAllCalled) {
101     ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);
102   }
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 PETSCTS_DLLEXPORT 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 PETSCTS_DLLEXPORT 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