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 
98 template<class Scalar>
99 class StepperBDF2 : virtual public Tempus::StepperImplicit<Scalar>
100 {
101 public:
102 
108  StepperBDF2();
109 
110  StepperBDF2(
111  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
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(
127 
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 
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 
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 
182 private:
183 
186  Scalar order_ = Scalar(2.0);
187 };
188 
189 
205 template <typename Scalar>
207  : virtual public Tempus::TimeDerivative<Scalar>
208 {
209 public:
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(
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,
237  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
238  { dt_ = dt; dtOld_ = dtOld; xOld_ = xOld; xOldOld_ = xOldOld;}
239 
240 private:
241 
244  Scalar dt_; // = t_n - t_{n-1}
245  Scalar dtOld_; // = t_{n-1} - t_{n-2}
246 };
247 
248 
250 // ------------------------------------------------------------------------
251 template<class Scalar>
254  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
256 
257 
258 } // namespace Tempus
259 
260 #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)
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