Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_StepperDIRK_decl.hpp
Go to the documentation of this file.
1// @HEADER
2// ****************************************************************************
3// Tempus: Copyright (2017) Sandia Corporation
4//
5// Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6// ****************************************************************************
7// @HEADER
8
9#ifndef Tempus_StepperDIRK_decl_hpp
10#define Tempus_StepperDIRK_decl_hpp
11
12#include "Tempus_config.hpp"
14#include "Tempus_StepperImplicit.hpp"
16
17
18namespace Tempus {
19
155template<class Scalar>
156class StepperDIRK : virtual public Tempus::StepperImplicit<Scalar>,
157 virtual public Tempus::StepperRKBase<Scalar>
158{
159public:
160
162
163
164 virtual void initialize() override;
165
167 virtual void setModel(
168 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel) override;
169
171 virtual void setInitialConditions (
172 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory) override;
173
175 virtual void setResetInitialGuess(bool reset_guess)
176 { resetGuess_ = reset_guess; }
177 virtual bool getResetInitialGuess() const
178 { return resetGuess_; }
179
181 virtual void takeStep(
182 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory) override;
183
185 virtual Teuchos::RCP<Tempus::StepperState<Scalar> >getDefaultStepperState() override;
186
187 virtual bool isExplicit() const override
188 {
189 const int numStages = this->tableau_->numStages();
190 Teuchos::SerialDenseMatrix<int,Scalar> A = this->tableau_->A();
191 bool isExplicit = false;
192 for (int i=0; i<numStages; ++i) if (A(i,i) == 0.0) isExplicit = true;
193 return isExplicit && this->tableau_->isDIRK();
194 }
195 virtual bool isImplicit() const override {return true;}
196 virtual bool isExplicitImplicit() const override
197 {return isExplicit() && isImplicit();}
198 virtual bool isOneStepMethod() const override {return true;}
199 virtual bool isMultiStepMethod() const override {return !isOneStepMethod();}
200
201 virtual OrderODE getOrderODE() const override {return FIRST_ORDER_ODE;}
202
203 virtual std::string getDescription() const = 0;
205
206 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageXDot() {return stageXDot_;}
207 Teuchos::RCP<Thyra::VectorBase<Scalar> >& getXTilde() {return xTilde_;}
208
210 virtual Scalar getAlpha(const Scalar dt) const override
211 {
212 const int numStages = this->tableau_->numStages();
213 const Teuchos::SerialDenseMatrix<int,Scalar> & A=this->tableau_->A();
214 Scalar aii = A(0,0);
215 for (int i=0; i<numStages; ++i) {
216 if (A(i,i) != 0.0) aii = A(i,i);
217 break;
218 }
219 return (aii == 0.0) ? std::numeric_limits<Scalar>::infinity() : Scalar(1.0)/(dt*aii);
220 }
222 virtual Scalar getBeta (const Scalar ) const override { return Scalar(1.0); }
223
225 virtual Scalar getAlpha(const Scalar dt, int i) const
226 {
227 const Teuchos::SerialDenseMatrix<int,Scalar> & A=this->tableau_->A();
228 return (A(i,i) == 0.0) ? std::numeric_limits<Scalar>::infinity() : Scalar(1.0)/(dt*A(i,i));
229 }
230
231 virtual Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const override;
232
233 Teuchos::RCP<Teuchos::ParameterList> getValidParametersBasicDIRK() const;
234
236
237 virtual void describe(Teuchos::FancyOStream & out,
238 const Teuchos::EVerbosityLevel verbLevel) const override;
240
241 virtual bool isValidSetup(Teuchos::FancyOStream & out) const override;
242
244 virtual void setStepperDIRKValues(Teuchos::RCP<Teuchos::ParameterList> pl)
245 {
246 if (pl != Teuchos::null) {
247 // Can not validate because of optional Parameters, e.g., 'Solver Name'.
248 //pl->validateParametersAndSetDefaults(*this->getValidParameters());
249 this->setStepperValues(pl);
250 if ( pl->isParameter("Use Embedded") )
251 this->setUseEmbedded(pl->get<bool>("Use Embedded"));
252 if ( pl->isParameter("Zero Initial Guess") )
253 this->setZeroInitialGuess(pl->get<bool>("Zero Initial Guess"));
254 if (pl->isParameter("Solver Name") )
255 this->setStepperSolverValues(pl);
256 }
257 }
258
259
260protected:
261
263 virtual void setupDefault();
264
266 virtual void setup(
267 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& wrapperModel,
268 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
269 bool useFSAL,
270 std::string ICConsistency,
271 bool ICConsistencyCheck,
272 bool useEmbedded,
273 bool zeroInitialGuess,
274 const Teuchos::RCP<StepperRKAppAction<Scalar> >& stepperRKAppAction);
275
276 virtual void setupTableau() = 0;
277
278 virtual void setEmbeddedMemory() override;
279
280
281 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageXDot_;
282 Teuchos::RCP<Thyra::VectorBase<Scalar> > xTilde_;
283
284 bool resetGuess_ = true;
285};
286
287
300template <typename Scalar>
302 : virtual public Tempus::TimeDerivative<Scalar>
303{
304public:
305
308 Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
309 { initialize(s, xTilde); }
310
313
315 virtual void compute(
316 Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
317 Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
318 Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
319 {
320 xDotDot = Teuchos::null;
321 Thyra::V_StVpStV(xDot.ptr(),s_,*x,-s_,*xTilde_);
322 }
323
324 virtual void initialize(Scalar s,
325 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
326 { s_ = s; xTilde_ = xTilde; }
327
328private:
329
330 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde_;
331 Scalar s_; // = 1/(dt*a_ii)
332};
333
334
335} // namespace Tempus
336
337#endif // Tempus_StepperDIRK_decl_hpp
Time-derivative interface for DIRK.
StepperDIRKTimeDerivative(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Constructor.
virtual void initialize(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
virtual void compute(Teuchos::RCP< const Thyra::VectorBase< Scalar > > x, Teuchos::RCP< Thyra::VectorBase< Scalar > > xDot, Teuchos::RCP< Thyra::VectorBase< Scalar > > xDotDot=Teuchos::null)
Compute the time derivative.
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde_
Diagonally Implicit Runge-Kutta (DIRK) time stepper.
virtual void setStepperDIRKValues(Teuchos::RCP< Teuchos::ParameterList > pl)
Set StepperDIRK member data from the ParameterList.
virtual void initialize() override
Initialize after construction and changing input parameters.
Teuchos::RCP< Thyra::VectorBase< Scalar > > xTilde_
virtual void setupDefault()
Default setup for constructor.
virtual bool isOneStepMethod() const override
virtual Scalar getAlpha(const Scalar dt) const override
Return alpha = d(xDot)/dx.
Teuchos::RCP< Thyra::VectorBase< Scalar > > & getXTilde()
virtual bool isExplicitImplicit() const override
virtual Scalar getAlpha(const Scalar dt, int i) const
Return alpha = d(xDot)/dx for stage i.
virtual bool isMultiStepMethod() const override
virtual bool isValidSetup(Teuchos::FancyOStream &out) const override
virtual bool getResetInitialGuess() const
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Take the specified timestep, dt, and return true if successful.
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > & getStageXDot()
virtual std::string getDescription() const =0
Teuchos::RCP< Teuchos::ParameterList > getValidParametersBasicDIRK() const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Set the initial conditions and make them consistent.
virtual void setResetInitialGuess(bool reset_guess)
Set parameter so that the initial guess is reset at the beginning of each timestep.
virtual OrderODE getOrderODE() const override
virtual Scalar getBeta(const Scalar) const override
Return beta = d(x)/dx.
virtual void setupTableau()=0
virtual bool isImplicit() const override
virtual Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
virtual bool isExplicit() const override
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel) override
Set the model.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState() override
Get a default (initial) StepperState.
virtual void setup(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &wrapperModel, const Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > &solver, bool useFSAL, std::string ICConsistency, bool ICConsistencyCheck, bool useEmbedded, bool zeroInitialGuess, const Teuchos::RCP< StepperRKAppAction< Scalar > > &stepperRKAppAction)
Setup for constructor.
virtual void setEmbeddedMemory() override
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageXDot_
Thyra Base interface for implicit time steppers.
void setStepperSolverValues(Teuchos::RCP< Teuchos::ParameterList > pl)
Set solver from ParameterList.
virtual void setZeroInitialGuess(bool zIG)
Set parameter so that the initial guess is set to zero (=True) or use last timestep (=False).
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
virtual void setUseEmbedded(bool a)
Teuchos::RCP< RKButcherTableau< Scalar > > tableau_
void setStepperValues(const Teuchos::RCP< Teuchos::ParameterList > pl)
Set Stepper member data from ParameterList.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
@ FIRST_ORDER_ODE
Stepper integrates first-order ODEs.