xref: /petsc/src/ts/interface/tsreg.c (revision 4ee90b5ea4b1ea789a057ce2e6ee891e15dba83a)
1 /*$Id: tsreg.c,v 1.71 2001/08/06 21:18:08 bsmith Exp $*/
2 
3 #include "src/ts/tsimpl.h"      /*I "petscts.h"  I*/
4 
5 PetscFList      TSList              = 0;
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
21    of available methods (for instance, euler)
22 
23    Notes:
24    See "petsc/include/petscts.h" for available methods (for instance)
25 +  TS_EULER - Euler
26 .  TS_PVODE - PVODE interface
27 .  TS_BEULER - Backward Euler
28 -  TS_PSEUDO - Pseudo-timestepping
29 
30    Normally, it is best to use the TSSetFromOptions() command and
31    then set the TS type from the options database rather than by using
32    this routine.  Using the options database provides the user with
33    maximum flexibility in evaluating the many different solvers.
34    The TSSetType() routine is provided for those situations where it
35    is necessary to set the timestepping solver independently of the
36    command line or options database.  This might be the case, for example,
37    when the choice of solver changes during the execution of the
38    program, and the user's application is taking responsibility for
39    choosing the appropriate method.  In other words, this routine is
40    not for beginners.
41 
42    Level: intermediate
43 
44 .keywords: TS, set, type
45 @*/
46 int TSSetType(TS ts,TSType type)
47 {
48   int        ierr,(*r)(TS);
49   PetscTruth match;
50 
51   PetscFunctionBegin;
52   PetscValidHeaderSpecific(ts,TS_COOKIE);
53   PetscValidCharPointer(type);
54 
55   ierr = PetscTypeCompare((PetscObject)ts,type,&match);CHKERRQ(ierr);
56   if (match) PetscFunctionReturn(0);
57 
58   /* Get the function pointers for the method requested */
59   if (!TSRegisterAllCalled) {ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
60   ierr =  PetscFListFind(ts->comm,TSList,type,(void (**)(void)) &r);CHKERRQ(ierr);
61   if (!r) {SETERRQ1(PETSC_ERR_ARG_OUTOFRANGE,"Unknown type: %s",type);}
62 
63   if (ts->sles) {ierr = SLESDestroy(ts->sles);CHKERRQ(ierr);}
64   if (ts->snes) {ierr = SNESDestroy(ts->snes);CHKERRQ(ierr);}
65   if (ts->ops->destroy) {ierr = (*(ts)->ops->destroy)(ts);CHKERRQ(ierr);}
66   ts->sles = 0;
67   ts->snes = 0;
68 
69   ierr = (*r)(ts);CHKERRQ(ierr);
70 
71   ierr = PetscObjectChangeTypeName((PetscObject)ts,type);CHKERRQ(ierr);
72   PetscFunctionReturn(0);
73 }
74 
75 /* --------------------------------------------------------------------- */
76 #undef __FUNCT__
77 #define __FUNCT__ "TSRegisterDestroy"
78 /*@C
79    TSRegisterDestroy - Frees the list of timesteppers that were
80    registered by PetscFListAddDynamic().
81 
82    Not Collective
83 
84    Level: advanced
85 
86 .keywords: TS, timestepper, register, destroy
87 
88 .seealso: TSRegisterAll()
89 @*/
90 int TSRegisterDestroy(void)
91 {
92   int ierr;
93 
94   PetscFunctionBegin;
95   if (TSList) {
96     ierr = PetscFListDestroy(&TSList);CHKERRQ(ierr);
97     TSList = 0;
98   }
99   TSRegisterAllCalled = PETSC_FALSE;
100   PetscFunctionReturn(0);
101 }
102 
103 #undef __FUNCT__
104 #define __FUNCT__ "TSGetType"
105 /*@C
106    TSGetType - Gets the TS method type (as a string).
107 
108    Not Collective
109 
110    Input Parameter:
111 .  ts - timestepper solver context
112 
113    Output Parameter:
114 .  type - name of TS method
115 
116    Level: intermediate
117 
118 .keywords: TS, timestepper, get, type, name
119 @*/
120 int TSGetType(TS ts,TSType *type)
121 {
122   int ierr;
123 
124   PetscFunctionBegin;
125   if (!TSRegisterAllCalled) {ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
126   *type = ts->type_name;
127   PetscFunctionReturn(0);
128 }
129 
130 #undef __FUNCT__
131 #define __FUNCT__ "TSSetFromOptions"
132 /*@
133    TSSetFromOptions - Sets various TS parameters from user options.
134 
135    Collective on TS
136 
137    Input Parameter:
138 .  ts - the TS context obtained from TSCreate()
139 
140    Options Database Keys:
141 +  -ts_type <type> - TS_EULER, TS_BEULER, TS_PVODE, TS_PSEUDO, TS_CRANK_NICHOLSON
142 .  -ts_max_steps maxsteps - maximum number of time-steps to take
143 .  -ts_max_time time - maximum time to compute to
144 .  -ts_dt dt - initial time step
145 .  -ts_monitor - print information at each timestep
146 -  -ts_xmonitor - plot information at each timestep
147 
148    Level: beginner
149 
150 .keywords: TS, timestep, set, options, database
151 
152 .seealso: TSGetType
153 @*/
154 int TSSetFromOptions(TS ts)
155 {
156   int        ierr;
157   PetscTruth flg;
158   char       *deft,type[256];
159   PetscReal  dt;
160 
161   PetscFunctionBegin;
162   PetscValidHeaderSpecific(ts,TS_COOKIE);
163 
164   ierr = PetscOptionsBegin(ts->comm,ts->prefix,"Time step options","TS");CHKERRQ(ierr);
165     if (ts->type_name) {
166       deft = ts->type_name;
167     } else {
168       deft = TS_EULER;
169     }
170     if (!TSRegisterAllCalled) {ierr = TSRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
171     ierr = PetscOptionsList("-ts_type","Timestep method","TSSetType",TSList,deft,type,256,&flg);CHKERRQ(ierr);
172     if (flg) {
173       ierr = TSSetType(ts,type);CHKERRQ(ierr);
174     } else if (!ts->type_name) {
175       ierr = TSSetType(ts,deft);CHKERRQ(ierr);
176     }
177 
178     ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,PETSC_NULL);CHKERRQ(ierr);
179     ierr = PetscOptionsReal("-ts_max_time","Time to run to","TSSetDuration",ts->max_time,&ts->max_time,PETSC_NULL);CHKERRQ(ierr);
180     ierr = PetscOptionsReal("-ts_init_time","Initial time","TSSetInitialTime", ts->ptime, &ts->ptime, PETSC_NULL);CHKERRQ(ierr);
181     ierr = PetscOptionsReal("-ts_dt","Initial time step","TSSetInitialTimeStep",ts->initial_time_step,&dt,&flg);CHKERRQ(ierr);
182     if (flg) {
183       ts->initial_time_step = ts->time_step = dt;
184     }
185     ierr = PetscOptionsName("-ts_monitor","Monitor timestep size","TSDefaultMonitor",&flg);CHKERRQ(ierr);
186     if (flg) {
187       ierr = TSSetMonitor(ts,TSDefaultMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
188     }
189     ierr = PetscOptionsName("-ts_xmonitor","Monitor timestep size graphically","TSLGMonitor",&flg);CHKERRQ(ierr);
190     if (flg) {
191       ierr = TSSetMonitor(ts,TSLGMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
192     }
193     ierr = PetscOptionsName("-ts_vecmonitor","Monitor solution graphically","TSVecViewMonitor",&flg);CHKERRQ(ierr);
194     if (flg) {
195       ierr = TSSetMonitor(ts,TSVecViewMonitor,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
196     }
197     if (ts->ops->setfromoptions) {
198       ierr = (*ts->ops->setfromoptions)(ts);CHKERRQ(ierr);
199     }
200   ierr = PetscOptionsEnd();CHKERRQ(ierr);
201 
202   /* Handle subobject options */
203   switch(ts->problem_type) {
204   case TS_LINEAR:
205     ierr = SLESSetFromOptions(ts->sles);                                                                  CHKERRQ(ierr);
206     break;
207   case TS_NONLINEAR:
208     ierr = SNESSetFromOptions(ts->snes);                                                                 CHKERRQ(ierr);
209     break;
210   default:
211     SETERRQ1(PETSC_ERR_ARG_WRONG, "Invalid problem type: %d", ts->problem_type);
212   }
213   PetscFunctionReturn(0);
214 }
215 
216 
217 
218