Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
17 namespace Tempus {
18 
101 template <class Scalar>
102 class StepperBDF2 : virtual public Tempus::StepperImplicit<Scalar> {
103  public:
109  StepperBDF2();
110 
111  StepperBDF2(
112  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
114  const Teuchos::RCP<Stepper<Scalar> >& startUpStepper, bool useFSAL,
115  std::string ICConsistency, bool ICConsistencyCheck, bool zeroInitialGuess,
116  const Teuchos::RCP<StepperBDF2AppAction<Scalar> >& stepperBDF2AppAction);
117 
119 
120  virtual void setModel(
121  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
122 
123  virtual void setAppAction(
125 
127  {
128  return stepperBDF2AppAction_;
129  }
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 
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  {
156  return isExplicit() && isImplicit();
157  }
158  virtual bool isOneStepMethod() const { return false; }
159  virtual bool isMultiStepMethod() const { return !isOneStepMethod(); }
160  virtual OrderODE getOrderODE() const { return FIRST_ORDER_ODE; }
162 
164  virtual Scalar getAlpha(const Scalar dt) const { return getAlpha(dt, dt); }
165  virtual Scalar getAlpha(const Scalar dt, const Scalar dtOld) const
166  {
167  return (Scalar(2.0) * dt + dtOld) / (dt * (dt + dtOld));
168  }
170  virtual Scalar getBeta(const Scalar) const { return Scalar(1.0); }
171 
173  virtual void computeStartUp(
174  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
175 
177 
179 
180  virtual void describe(Teuchos::FancyOStream& out,
181  const Teuchos::EVerbosityLevel verbLevel) const;
183 
184  virtual bool isValidSetup(Teuchos::FancyOStream& out) const;
185 
186  private:
189  Scalar order_ = Scalar(2.0);
190 };
191 
207 template <typename Scalar>
209  : virtual public Tempus::TimeDerivative<Scalar> {
210  public:
213  Scalar dt, Scalar dtOld,
215  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
216  {
217  initialize(dt, dtOld, xOld, xOldOld);
218  }
219 
222 
224  virtual void compute(
227  Teuchos::RCP<Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
228  {
229  xDotDot = Teuchos::null;
230  // Calculate the BDF2 x dot vector
231  const Scalar a = ((Scalar(2.0) * dt_ + dtOld_) / (dt_ + dtOld_)) / dt_;
232  const Scalar b = (dt_ / (dt_ + dtOld_)) / dtOld_;
233  // xDot = a*(x_n - x_{n-1}) - b*(x_{n-1} - x_{n-2})
234  Thyra::V_StVpStV(xDot.ptr(), a, *x, -(a + b), *xOld_);
235  Thyra::Vp_StV(xDot.ptr(), b, *xOldOld_);
236  }
237 
238  virtual void initialize(
239  Scalar dt, Scalar dtOld,
241  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
242  {
243  dt_ = dt;
244  dtOld_ = dtOld;
245  xOld_ = xOld;
246  xOldOld_ = xOldOld;
247  }
248 
249  private:
252  Scalar dt_; // = t_n - t_{n-1}
253  Scalar dtOld_; // = t_{n-1} - t_{n-2}
254 };
255 
257 // ------------------------------------------------------------------------
258 template <class Scalar>
260  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
262 
263 } // namespace Tempus
264 
265 #endif // Tempus_StepperBDF2_decl_hpp
BDF2 (Backward-Difference-Formula-2) time stepper.
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
Time-derivative interface for BDF2.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
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 bool isExplicit() const
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
virtual Teuchos::RCP< StepperBDF2AppAction< Scalar > > getAppAction() const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
Teuchos::RCP< StepperBDF2AppAction< Scalar > > stepperBDF2AppAction_
Teuchos::RCP< Stepper< Scalar > > startUpStepper_
virtual void computeStartUp(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute the first time step given the supplied startup stepper.
Thyra Base interface for time steppers.
Thyra Base interface for implicit time steppers.
virtual Scalar getAlpha(const Scalar dt) const
Return alpha = d(xDot)/dx.
virtual Scalar getOrderMin() const
virtual void setAppAction(Teuchos::RCP< StepperBDF2AppAction< Scalar > > appAction)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld_
virtual OrderODE getOrderODE() const
Stepper integrates first-order ODEs.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
virtual Scalar getOrder() const
StepperBDF2TimeDerivative(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Constructor.
virtual bool isOneStepMethod() const
Teuchos::RCP< StepperBDF2< Scalar > > createStepperBDF2(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
virtual bool isExplicitImplicit() const
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
virtual bool isMultiStepMethod() const
Application Action for StepperBDF2.
virtual void initialize(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
virtual Scalar getAlpha(const Scalar dt, const Scalar dtOld) const
virtual Scalar getOrderMax() const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld_
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
void setStartUpStepper(std::string startupStepperType)
Set the stepper to use in first step.
virtual void initialize()
Initialize during construction and after changing input parameters.
StepperBDF2()
Default constructor.
virtual bool isImplicit() const