xref: /petsc/src/ts/interface/tsreg.c (revision 0700a8246d308f50502909ba325e6169d3ee27eb)
1 #define PETSCTS_DLL
2 
3 #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 +  TSEULER - Euler
25 .  TSSUNDIALS - SUNDIALS interface
26 .  TSBEULER - Backward Euler
27 -  TSPSEUDO - 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_CLASSID,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, const TSType *type)
94 {
95   PetscFunctionBegin;
96   PetscValidHeaderSpecific(ts,TS_CLASSID,1);
97   PetscValidPointer(type,2);
98   *type = ((PetscObject)ts)->type_name;
99   PetscFunctionReturn(0);
100 }
101 
102 /*--------------------------------------------------------------------------------------------------------------------*/
103 
104 #undef __FUNCT__
105 #define __FUNCT__ "TSRegister"
106 /*@C
107   TSRegister - See TSRegisterDynamic()
108 
109   Level: advanced
110 @*/
111 PetscErrorCode PETSCTS_DLLEXPORT TSRegister(const char sname[], const char path[], const char name[], PetscErrorCode (*function)(TS))
112 {
113   char           fullname[PETSC_MAX_PATH_LEN];
114   PetscErrorCode ierr;
115 
116   PetscFunctionBegin;
117   ierr = PetscStrcpy(fullname, path);CHKERRQ(ierr);
118   ierr = PetscStrcat(fullname, ":");CHKERRQ(ierr);
119   ierr = PetscStrcat(fullname, name);CHKERRQ(ierr);
120   ierr = PetscFListAdd(&TSList, sname, fullname, (void (*)(void)) function);CHKERRQ(ierr);
121   PetscFunctionReturn(0);
122 }
123 
124 /*-------------------------------------------------------------------------------------------------------------------*/
125 #undef __FUNCT__
126 #define __FUNCT__ "TSRegisterDestroy"
127 /*@C
128    TSRegisterDestroy - Frees the list of timestepping routines that were registered by TSRegister()/TSRegisterDynamic().
129 
130    Not Collective
131 
132    Level: advanced
133 
134 .keywords: TS, timestepper, register, destroy
135 .seealso: TSRegister(), TSRegisterAll(), TSRegisterDynamic()
136 @*/
137 PetscErrorCode PETSCTS_DLLEXPORT TSRegisterDestroy(void)
138 {
139   PetscErrorCode ierr;
140 
141   PetscFunctionBegin;
142   ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr);
143   TSRegisterAllCalled = PETSC_FALSE;
144   PetscFunctionReturn(0);
145 }
146 
147