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_StepperImplicit.hpp"
15 
16 
17 namespace Tempus {
18 
19 /** \brief BDF2 (Backward-Difference-Formula-2) time stepper.
20  *
21  * For the implicit ODE system, \f$f(\dot{x},x,t) = 0\f$,
22  * the solution, \f$\dot{x}\f$ and \f$x\f$, is determined using a
23  * solver (e.g., a non-linear solver, like NOX). This stepper allows
24  * for a variable time-step \f$dt\f$. It is a 3-step method.
25  *
26  * <b> Algorithm </b>
27  * - Select initial guess \f$x_n\f$ for \f$n\f$.
28  * - Compute \f$x_n\f$ for n=1 using some time-integration scheme,
29  * e.g., Backward Euler or RK4.
30  * - Solve
31  * \f[
32  * f\left(\dot{x} = \frac{x_{n-1}-x_{n-2}}{\tau_{n-1}}
33  * + \left(\frac{1}{\tau_{n-1}-\tau_n} \right)
34  * \left(\frac{x_n-x_{n-1}}{\tau_{n-1} + \tau_n}
35  * - \frac{x_{n-1}-x_{n-2}}{\tau_{n-1}}\right)
36  * (2\tau_n + \tau_{n-1}), x_n, t_n\right) = 0
37  * \f]
38  * for \f$x_n\f$ (n > 1) where
39  * \f[
40  * \tau_n = t_n - t_{n-1}.
41  * \f]
42  */
43 template<class Scalar>
44 class StepperBDF2 : virtual public Tempus::StepperImplicit<Scalar>
45 {
46 public:
47 
48  /// Constructor
50  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
51  Teuchos::RCP<Teuchos::ParameterList> pList = Teuchos::null);
52 
53  /// \name Basic stepper methods
54  //@{
55  virtual void setObserver(
56  Teuchos::RCP<StepperObserver<Scalar> > obs = Teuchos::null);
57 
58  /// Set the stepper to use in first step
59  void setStartUpStepper(std::string startupStepperName);
60  void setStartUpStepper(Teuchos::RCP<Teuchos::ParameterList>startUpStepperPL=Teuchos::null);
61 
62  /// Initialize during construction and after changing input parameters.
63  virtual void initialize();
64 
65  /// Take the specified timestep, dt, and return true if successful.
66  virtual void takeStep(
67  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
68 
69  /// Get a default (initial) StepperState
70  virtual Teuchos::RCP<Tempus::StepperState<Scalar> > getDefaultStepperState();
71  virtual Scalar getOrder() const {return order_;}
72  virtual Scalar getOrderMin() const {return 1.0;}
73  virtual Scalar getOrderMax() const {return 2.0;}
74 
75  virtual bool isExplicit() const {return false;}
76  virtual bool isImplicit() const {return true;}
77  virtual bool isExplicitImplicit() const
78  {return isExplicit() and isImplicit();}
79  virtual bool isOneStepMethod() const {return false;}
80  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
81  //@}
82 
83  /// Compute the first time step given the supplied startup stepper
84  virtual void computeStartUp(
85  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
86 
87  /// Pass initial guess to Newton solver
88  virtual void setInitialGuess(Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess)
89  {initial_guess_ = initial_guess;}
90 
91 
92  /// Provide temporary xDot memory for Stepper if SolutionState doesn't.
93  virtual Teuchos::RCP<Thyra::VectorBase<Scalar> > getXDotTemp(
94  Teuchos::RCP<Thyra::VectorBase<Scalar> > x);
95 
96  /// \name ParameterList methods
97  //@{
98  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl);
99  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
100  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
101  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
102  Teuchos::RCP<Teuchos::ParameterList> getDefaultParameters() const;
103  //@}
104 
105  /// \name Overridden from Teuchos::Describable
106  //@{
107  virtual std::string description() const;
108  virtual void describe(Teuchos::FancyOStream & out,
109  const Teuchos::EVerbosityLevel verbLevel) const;
110  //@}
111 
112 private:
113 
114  /// Default Constructor -- not allowed
115  StepperBDF2();
116 
117 private:
118 
119  Teuchos::RCP<Stepper<Scalar> > startUpStepper_;
120 
121  Teuchos::RCP<StepperObserver<Scalar> > stepperObserver_;
122  Teuchos::RCP<StepperBDF2Observer<Scalar> > stepperBDF2Observer_;
123  Scalar order_;
124 
125  Teuchos::RCP<Thyra::VectorBase<Scalar> > xDotTemp_;
126  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess_;
127 };
128 
129 /** \brief Time-derivative interface for BDF2.
130  *
131  * Given the state \f$x\f$, compute the BDF2 time-derivative,
132  * \f[
133  * \dot{x}_{n} = \frac{x_{n-1}-x_{n-2}}{\tau_{n-1}}
134  * + \left(\frac{1}{\tau_{n-1}-\tau_n} \right)
135  * \left(\frac{x_n-x_{n-1}}{\tau_{n-1} + \tau_n}
136  * - \frac{x_{n-1}-x_{n-2}}{\tau_{n-1}}\right)
137  * (2\tau_n + \tau_{n-1})
138  * \f]
139  * where
140  * \f[
141  * \tau_n = t_n - t_{n-1}.
142  * \f]
143  * \f$\ddot{x}\f$ is not used and set to null.
144  */
145 template <typename Scalar>
147  : virtual public Tempus::TimeDerivative<Scalar>
148 {
149 public:
150 
151  /// Constructor
153  Scalar dt, Scalar dtOld, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld,
154  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
155  { initialize(dt, dtOld, xOld, xOldOld); }
156 
157  /// Destructor
159 
160  /// Compute the time derivative.
161  virtual void compute(
162  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
163  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
164  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
165  {
166  xDotDot = Teuchos::null;
167  // Calculate the BDF2 x dot vector
168  const Scalar a = (1.0/(dt_ + dtOld_))*(2.0*dt_ + dtOld_)/dt_;
169  const Scalar b = (1.0/(dt_ + dtOld_))*(dt_/dtOld_);
170  //xDot = a*(x_n-x_{n-1})
171  Thyra::V_StVpStV(xDot.ptr(),a,*x,-a,*xOld_);
172  Teuchos::RCP<Thyra::VectorBase<Scalar> > tmp =
173  Thyra::createMember<Scalar>(x->space());
174  //tmp = b*(x_{n-1} - x_{n-2})
175  Thyra::V_StVpStV(tmp.ptr(),b,*xOld_,-b,*xOldOld_);
176  //xDot = xDot - tmp;
177  Thyra::Vp_StV(xDot.ptr(), -1.0, *tmp);
178  }
179 
180  virtual void initialize(Scalar dt, Scalar dtOld,
181  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld,
182  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld)
183  { dt_ = dt; dtOld_ = dtOld; xOld_ = xOld; xOldOld_ = xOldOld;}
184 
185 private:
186 
187  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld_;
188  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOldOld_;
189  Scalar dt_; // = t_n - t_{n-1}
190  Scalar dtOld_; // = t_{n-1} - t_{n-2}
191 };
192 
193 
194 } // namespace Tempus
195 
196 #endif // Tempus_StepperBDF2_decl_hpp
virtual Scalar getOrderMin() const
BDF2 (Backward-Difference-Formula-2) time stepper.
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
Teuchos::RCP< StepperObserver< Scalar > > stepperObserver_
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 void setObserver(Teuchos::RCP< StepperObserver< Scalar > > obs=Teuchos::null)
Set Observer.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
virtual Scalar getOrder() const
virtual bool isImplicit() const
Teuchos::RCP< Stepper< Scalar > > startUpStepper_
virtual bool isExplicitImplicit() const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getXDotTemp(Teuchos::RCP< Thyra::VectorBase< Scalar > > x)
Provide temporary xDot memory for Stepper if SolutionState doesn&#39;t.
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
virtual void setInitialGuess(Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess)
Pass initial guess to Newton solver.
Thyra Base interface for implicit time steppers.
Teuchos::RCP< StepperBDF2Observer< Scalar > > stepperBDF2Observer_
virtual bool isExplicit() const
StepperObserver class for Stepper class.
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
virtual bool isMultiStepMethod() const
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld_
Teuchos::RCP< Thyra::VectorBase< Scalar > > xDotTemp_
StepperBDF2TimeDerivative(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Constructor.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
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 > > initial_guess_
virtual Scalar getOrderMax() const
void setStartUpStepper(std::string startupStepperName)
Set the stepper to use in first step.
virtual std::string description() 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.
virtual void initialize()
Initialize during construction and after changing input parameters.
StepperBDF2()
Default Constructor – not allowed.