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: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Tempus_StepperBDF2_decl_hpp
11#define Tempus_StepperBDF2_decl_hpp
12
13#include "Tempus_config.hpp"
14#include "Tempus_StepperImplicit.hpp"
17
18namespace Tempus {
19
102template <class Scalar>
103class StepperBDF2 : virtual public Tempus::StepperImplicit<Scalar> {
104 public:
110 StepperBDF2();
111
113 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
114 const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
115 const Teuchos::RCP<Stepper<Scalar> >& startUpStepper, bool useFSAL,
116 std::string ICConsistency, bool ICConsistencyCheck, bool zeroInitialGuess,
117 const Teuchos::RCP<StepperBDF2AppAction<Scalar> >& stepperBDF2AppAction);
118
120
121 virtual void setModel(
122 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
123
124 virtual void setAppAction(
125 Teuchos::RCP<StepperBDF2AppAction<Scalar> > appAction);
126
127 virtual Teuchos::RCP<StepperBDF2AppAction<Scalar> > getAppAction() const
128 {
130 }
131
133 void setStartUpStepper(std::string startupStepperType);
134 void setStartUpStepper(Teuchos::RCP<Stepper<Scalar> > startupStepper);
135
137 virtual void initialize();
138
140 virtual void setInitialConditions(
141 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
142
144 virtual void takeStep(
145 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
146
148 virtual Teuchos::RCP<Tempus::StepperState<Scalar> > getDefaultStepperState();
149 virtual Scalar getOrder() const { return order_; }
150 virtual Scalar getOrderMin() const { return 1.0; }
151 virtual Scalar getOrderMax() const { return 2.0; }
152
153 virtual bool isExplicit() const { return false; }
154 virtual bool isImplicit() const { return true; }
155 virtual bool isExplicitImplicit() const
156 {
157 return isExplicit() && isImplicit();
158 }
159 virtual bool isOneStepMethod() const { return false; }
160 virtual bool isMultiStepMethod() const { return !isOneStepMethod(); }
161 virtual OrderODE getOrderODE() const { return FIRST_ORDER_ODE; }
163
165 virtual Scalar getAlpha(const Scalar dt) const { return getAlpha(dt, dt); }
166 virtual Scalar getAlpha(const Scalar dt, const Scalar dtOld) const
167 {
168 return (Scalar(2.0) * dt + dtOld) / (dt * (dt + dtOld));
169 }
171 virtual Scalar getBeta(const Scalar) const { return Scalar(1.0); }
172
174 virtual void computeStartUp(
175 const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
176
177 Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
178
180
181 virtual void describe(Teuchos::FancyOStream& out,
182 const Teuchos::EVerbosityLevel verbLevel) const;
184
185 virtual bool isValidSetup(Teuchos::FancyOStream& out) const;
186
187 private:
188 Teuchos::RCP<Stepper<Scalar> > startUpStepper_;
189 Teuchos::RCP<StepperBDF2AppAction<Scalar> > stepperBDF2AppAction_;
190 Scalar order_ = Scalar(2.0);
191};
192
208template <typename Scalar>
210 : virtual public Tempus::TimeDerivative<Scalar> {
211 public:
214 Scalar dt, Scalar dtOld,
215 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld,
216 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
217 {
218 initialize(dt, dtOld, xOld, xOldOld);
219 }
220
223
225 virtual void compute(
226 Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
227 Teuchos::RCP<Thyra::VectorBase<Scalar> > xDot,
228 Teuchos::RCP<Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
229 {
230 xDotDot = Teuchos::null;
231 // Calculate the BDF2 x dot vector
232 const Scalar a = ((Scalar(2.0) * dt_ + dtOld_) / (dt_ + dtOld_)) / dt_;
233 const Scalar b = (dt_ / (dt_ + dtOld_)) / dtOld_;
234 // xDot = a*(x_n - x_{n-1}) - b*(x_{n-1} - x_{n-2})
235 Thyra::V_StVpStV(xDot.ptr(), a, *x, -(a + b), *xOld_);
236 Thyra::Vp_StV(xDot.ptr(), b, *xOldOld_);
237 }
238
239 virtual void initialize(
240 Scalar dt, Scalar dtOld,
241 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld,
242 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
243 {
244 dt_ = dt;
245 dtOld_ = dtOld;
246 xOld_ = xOld;
247 xOldOld_ = xOldOld;
248 }
249
250 private:
251 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld_;
252 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld_;
253 Scalar dt_; // = t_n - t_{n-1}
254 Scalar dtOld_; // = t_{n-1} - t_{n-2}
255};
256
258// ------------------------------------------------------------------------
259template <class Scalar>
260Teuchos::RCP<StepperBDF2<Scalar> > createStepperBDF2(
261 const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
262 Teuchos::RCP<Teuchos::ParameterList> pl);
263
264} // namespace Tempus
265
266#endif // Tempus_StepperBDF2_decl_hpp
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Application Action for StepperBDF2.
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
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.
Thyra Base interface for time steppers.
Thyra Base interface for implicit 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.