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
Tempus::StepperBDF2::describe
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Definition: Tempus_StepperBDF2_impl.hpp:298
Tempus::StepperBDF2::getOrder
virtual Scalar getOrder() const
Definition: Tempus_StepperBDF2_decl.hpp:71
Tempus::StepperBDF2::getXDotTemp
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getXDotTemp(Teuchos::RCP< Thyra::VectorBase< Scalar > > x)
Provide temporary xDot memory for Stepper if SolutionState doesn't.
Definition: Tempus_StepperBDF2_impl.hpp:248
Tempus::StepperBDF2::getNonconstParameterList
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Definition: Tempus_StepperBDF2_impl.hpp:373
Tempus::StepperBDF2::getOrderMin
virtual Scalar getOrderMin() const
Definition: Tempus_StepperBDF2_decl.hpp:72
Tempus::StepperBDF2::takeStep
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
Definition: Tempus_StepperBDF2_impl.hpp:159
Tempus::solutionHistory
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
Definition: Tempus_SolutionHistory_impl.hpp:504
Tempus::StepperBDF2::isOneStepMethod
virtual bool isOneStepMethod() const
Definition: Tempus_StepperBDF2_decl.hpp:79
Tempus::StepperBDF2::stepperBDF2Observer_
Teuchos::RCP< StepperBDF2Observer< Scalar > > stepperBDF2Observer_
Definition: Tempus_StepperBDF2_decl.hpp:122
Tempus::StepperBDF2TimeDerivative
Time-derivative interface for BDF2.
Definition: Tempus_StepperBDF2_decl.hpp:146
Tempus::StepperBDF2::setInitialGuess
virtual void setInitialGuess(Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess)
Pass initial guess to Newton solver.
Definition: Tempus_StepperBDF2_decl.hpp:88
Tempus::StepperBDF2::order_
Scalar order_
Definition: Tempus_StepperBDF2_decl.hpp:123
Tempus::StepperBDF2::getDefaultStepperState
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
Definition: Tempus_StepperBDF2_impl.hpp:281
Tempus::StepperBDF2TimeDerivative::~StepperBDF2TimeDerivative
virtual ~StepperBDF2TimeDerivative()
Destructor.
Definition: Tempus_StepperBDF2_decl.hpp:158
Tempus::StepperBDF2::setParameterList
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
Definition: Tempus_StepperBDF2_impl.hpp:308
Tempus
Definition: Tempus_AdjointAuxSensitivityModelEvaluator_decl.hpp:20
Tempus::StepperBDF2::initialize
virtual void initialize()
Initialize during construction and after changing input parameters.
Definition: Tempus_StepperBDF2_impl.hpp:143
Tempus::StepperBDF2::computeStartUp
virtual void computeStartUp(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute the first time step given the supplied startup stepper.
Definition: Tempus_StepperBDF2_impl.hpp:258
Tempus::StepperBDF2::getDefaultParameters
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
Definition: Tempus_StepperBDF2_impl.hpp:353
Tempus::StepperBDF2::setStartUpStepper
void setStartUpStepper(std::string startupStepperName)
Set the stepper to use in first step.
Definition: Tempus_StepperBDF2_impl.hpp:48
Tempus::StepperBDF2::getValidParameters
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Definition: Tempus_StepperBDF2_impl.hpp:338
Tempus::StepperBDF2::startUpStepper_
Teuchos::RCP< Stepper< Scalar > > startUpStepper_
Definition: Tempus_StepperBDF2_decl.hpp:119
Tempus::StepperObserver
StepperObserver class for Stepper class.
Definition: Tempus_StepperObserver.hpp:38
Tempus::StepperBDF2::isImplicit
virtual bool isImplicit() const
Definition: Tempus_StepperBDF2_decl.hpp:76
Tempus::StepperBDF2::unsetParameterList
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Definition: Tempus_StepperBDF2_impl.hpp:381
Tempus::StepperBDF2TimeDerivative::dt_
Scalar dt_
Definition: Tempus_StepperBDF2_decl.hpp:189
Tempus::StepperBDF2TimeDerivative::xOld_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld_
Definition: Tempus_StepperBDF2_decl.hpp:187
Tempus_StepperBDF2Observer.hpp
Tempus::StepperBDF2::getOrderMax
virtual Scalar getOrderMax() const
Definition: Tempus_StepperBDF2_decl.hpp:73
Tempus::StepperBDF2::initial_guess_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess_
Definition: Tempus_StepperBDF2_decl.hpp:126
Tempus::StepperBDF2::xDotTemp_
Teuchos::RCP< Thyra::VectorBase< Scalar > > xDotTemp_
Definition: Tempus_StepperBDF2_decl.hpp:125
Tempus::StepperImplicit
Thyra Base interface for implicit time steppers.
Definition: Tempus_StepperImplicit_decl.hpp:24
Tempus::StepperBDF2TimeDerivative::initialize
virtual void initialize(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Definition: Tempus_StepperBDF2_decl.hpp:180
Tempus::SolutionHistory
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Definition: Tempus_Integrator.hpp:25
Tempus::StepperBDF2TimeDerivative::dtOld_
Scalar dtOld_
Definition: Tempus_StepperBDF2_decl.hpp:190
Tempus::StepperBDF2TimeDerivative::StepperBDF2TimeDerivative
StepperBDF2TimeDerivative(Scalar dt, Scalar dtOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld)
Constructor.
Definition: Tempus_StepperBDF2_decl.hpp:152
Tempus_WrapperModelEvaluator.hpp
Tempus::TimeDerivative
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
Definition: Tempus_TimeDerivative.hpp:32
Tempus::StepperBDF2TimeDerivative::xOldOld_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOldOld_
Definition: Tempus_StepperBDF2_decl.hpp:188
Tempus::StepperBDF2::description
virtual std::string description() const
Definition: Tempus_StepperBDF2_impl.hpp:290
Tempus::StepperBDF2::isExplicit
virtual bool isExplicit() const
Definition: Tempus_StepperBDF2_decl.hpp:75
Tempus::StepperBDF2::setObserver
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > > obs=Teuchos::null)
Set Observer.
Definition: Tempus_StepperBDF2_impl.hpp:122
Tempus::StepperBDF2
BDF2 (Backward-Difference-Formula-2) time stepper.
Definition: Tempus_StepperBDF2_decl.hpp:44
Tempus::StepperBDF2::isMultiStepMethod
virtual bool isMultiStepMethod() const
Definition: Tempus_StepperBDF2_decl.hpp:80
Tempus::StepperBDF2::StepperBDF2
StepperBDF2()
Default Constructor – not allowed.
Tempus::StepperBDF2TimeDerivative::compute
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.
Definition: Tempus_StepperBDF2_decl.hpp:161
Tempus::StepperBDF2::stepperObserver_
Teuchos::RCP< StepperObserver< Scalar > > stepperObserver_
Definition: Tempus_StepperBDF2_decl.hpp:121
Tempus::StepperBDF2::isExplicitImplicit
virtual bool isExplicitImplicit() const
Definition: Tempus_StepperBDF2_decl.hpp:77