Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_StepperBDF2_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_StepperBDF2_decl_hpp
10#define Tempus_StepperBDF2_decl_hpp
11
12#include "Tempus_config.hpp"
13#include "Tempus_StepperImplicit.hpp"
16
17namespace Tempus {
18
98template<class Scalar>
99class StepperBDF2 : virtual public Tempus::StepperImplicit<Scalar>
100{
101public:
102
108 StepperBDF2();
109
111 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
112 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
113 const Teuchos::RCP<Stepper<Scalar> >& startUpStepper,
114 bool useFSAL,
115 std::string ICConsistency,
116 bool ICConsistencyCheck,
117 bool zeroInitialGuess,
118 const Teuchos::RCP<StepperBDF2AppAction<Scalar> >& stepperBDF2AppAction);
119
121
122 virtual void setModel(
123 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
124
125 virtual void setAppAction(
126 Teuchos::RCP<StepperBDF2AppAction<Scalar> > appAction);
127
128 virtual Teuchos::RCP<StepperBDF2AppAction<Scalar> > getAppAction() const
129 { return stepperBDF2AppAction_; }
130
132 void setStartUpStepper(std::string startupStepperType);
133 void setStartUpStepper(Teuchos::RCP<Stepper<Scalar> > startupStepper);
134
136 virtual void initialize();
137
139 virtual void setInitialConditions (
140 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
141
143 virtual void takeStep(
144 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
145
147 virtual Teuchos::RCP<Tempus::StepperState<Scalar> > getDefaultStepperState();
148 virtual Scalar getOrder() const {return order_;}
149 virtual Scalar getOrderMin() const {return 1.0;}
150 virtual Scalar getOrderMax() const {return 2.0;}
151
152 virtual bool isExplicit() const {return false;}
153 virtual bool isImplicit() const {return true;}
154 virtual bool isExplicitImplicit() const
155 {return isExplicit() && isImplicit();}
156 virtual bool isOneStepMethod() const {return false;}
157 virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
158 virtual OrderODE getOrderODE() const {return FIRST_ORDER_ODE;}
160
162 virtual Scalar getAlpha(const Scalar dt) const {return getAlpha(dt,dt);}
163 virtual Scalar getAlpha(const Scalar dt, const Scalar dtOld) const
164 { return (Scalar(2.0)*dt + dtOld)/(dt*(dt + dtOld)); }
166 virtual Scalar getBeta (const Scalar ) const { return Scalar(1.0); }
167
169 virtual void computeStartUp(
170 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
171
172 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
173
175
176 virtual void describe(Teuchos::FancyOStream & out,
177 const Teuchos::EVerbosityLevel verbLevel) const;
179
180 virtual bool isValidSetup(Teuchos::FancyOStream & out) const;
181
182private:
183
184 Teuchos::RCP<Stepper<Scalar> > startUpStepper_;
185 Teuchos::RCP<StepperBDF2AppAction<Scalar> > stepperBDF2AppAction_;
186 Scalar order_ = Scalar(2.0);
187};
188
189
205template <typename Scalar>
207 : virtual public Tempus::TimeDerivative<Scalar>
208{
209public:
210
213 Scalar dt, Scalar dtOld, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld,
214 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
215 { initialize(dt, dtOld, xOld, xOldOld); }
216
219
221 virtual void compute(
222 Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
223 Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
224 Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
225 {
226 xDotDot = Teuchos::null;
227 // Calculate the BDF2 x dot vector
228 const Scalar a = ((Scalar(2.0)*dt_ + dtOld_)/(dt_ + dtOld_))/dt_;
229 const Scalar b = ( dt_/(dt_ + dtOld_))/dtOld_;
230 //xDot = a*(x_n - x_{n-1}) - b*(x_{n-1} - x_{n-2})
231 Thyra::V_StVpStV(xDot.ptr(), a, *x, -(a+b), *xOld_);
232 Thyra::Vp_StV(xDot.ptr(), b, *xOldOld_);
233 }
234
235 virtual void initialize(Scalar dt, Scalar dtOld,
236 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld,
237 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
238 { dt_ = dt; dtOld_ = dtOld; xOld_ = xOld; xOldOld_ = xOldOld;}
239
240private:
241
242 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld_;
243 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld_;
244 Scalar dt_; // = t_n - t_{n-1}
245 Scalar dtOld_; // = t_{n-1} - t_{n-2}
246};
247
248
250// ------------------------------------------------------------------------
251template<class Scalar>
252Teuchos::RCP<StepperBDF2<Scalar> >
254 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
255 Teuchos::RCP<Teuchos::ParameterList> pl);
256
257
258} // namespace Tempus
259
260#endif // Tempus_StepperBDF2_decl_hpp
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Application Action for StepperBDF2.
Time-derivative interface for BDF2.
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.
virtual void initialize(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld_
StepperBDF2TimeDerivative(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Constructor.
BDF2 (Backward-Difference-Formula-2) time stepper.
Teuchos::RCP< Stepper< Scalar > > startUpStepper_
virtual bool isExplicitImplicit() const
void setStartUpStepper(std::string startupStepperType)
Set the stepper to use in first step.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual bool isMultiStepMethod() const
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
virtual Scalar getOrderMax() const
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
virtual void setAppAction(Teuchos::RCP< StepperBDF2AppAction< Scalar > > appAction)
virtual Scalar getOrder() const
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
virtual bool isImplicit() const
virtual bool isOneStepMethod() const
virtual Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
virtual OrderODE getOrderODE() const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
virtual bool isExplicit() const
virtual Scalar getAlpha(const Scalar dt, const Scalar dtOld) const
StepperBDF2()
Default constructor.
Teuchos::RCP< StepperBDF2AppAction< Scalar > > stepperBDF2AppAction_
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
virtual void computeStartUp(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute the first time step given the supplied startup stepper.
virtual Scalar getAlpha(const Scalar dt) const
Return alpha = d(xDot)/dx.
virtual Teuchos::RCP< StepperBDF2AppAction< Scalar > > getAppAction() const
virtual void initialize()
Initialize during construction and after changing input parameters.
virtual Scalar getOrderMin() const
Thyra Base interface for implicit time steppers.
Thyra Base interface for time steppers.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
Teuchos::RCP< StepperBDF2< Scalar > > createStepperBDF2(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
@ FIRST_ORDER_ODE
Stepper integrates first-order ODEs.