Tempus  Version of the Day
Time Integration
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,
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 
182 private:
183 
184  Teuchos::RCP<Stepper<Scalar> > startUpStepper_;
185  Teuchos::RCP<StepperBDF2AppAction<Scalar> > stepperBDF2AppAction_;
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(
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 
240 private:
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 // ------------------------------------------------------------------------
251 template<class Scalar>
252 Teuchos::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
virtual Scalar getOrderMin() const
BDF2 (Backward-Difference-Formula-2) time stepper.
virtual Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
virtual bool isOneStepMethod() const
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 OrderODE getOrderODE() const
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
virtual Scalar getOrder() const
virtual bool isImplicit() const
Teuchos::RCP< StepperBDF2AppAction< Scalar > > stepperBDF2AppAction_
Teuchos::RCP< Stepper< Scalar > > startUpStepper_
virtual bool isExplicitImplicit() const
virtual Scalar getAlpha(const Scalar dt, const Scalar dtOld) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual void computeStartUp(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute the first time step given the supplied startup stepper.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Thyra Base interface for time steppers.
Thyra Base interface for implicit time steppers.
virtual bool isExplicit() const
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
virtual void setAppAction(Teuchos::RCP< StepperBDF2AppAction< Scalar > > appAction)
virtual bool isMultiStepMethod() const
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual Teuchos::RCP< StepperBDF2AppAction< Scalar > > getAppAction() const
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld_
Stepper integrates first-order ODEs.
StepperBDF2TimeDerivative(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Constructor.
Teuchos::RCP< StepperBDF2< Scalar > > createStepperBDF2(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
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
Return alpha = d(xDot)/dx.
virtual Scalar getOrderMax() 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.