Tempus  Version of the Day
Time Integration
Tempus_StepperDIRK_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_StepperDIRK_decl_hpp
10 #define Tempus_StepperDIRK_decl_hpp
11 
12 #include "Tempus_config.hpp"
14 #include "Tempus_StepperImplicit.hpp"
17 
18 
19 namespace Tempus {
20 
21 /** \brief Diagonally Implicit Runge-Kutta (DIRK) time stepper.
22  *
23  * For the implicit ODE system, \f$\mathcal{F}(\dot{x},x,t) = 0\f$,
24  * the general DIRK method for \f$s\f$-stages, can be written as
25  * \f[
26  * X_{i} = x_{n-1}
27  * + \Delta t\,\sum_{j=1}^{i-1} a_{ij}\,\bar{f}(X_{j},t_{n-1}+c_{j}\Delta t)
28  * + \Delta t\, a_{ii}\,\bar{f}(X_{i},t_{n-1}+c_{i}\Delta t)
29  * \f]
30  * \f[
31  * x_{n} = x_{n-1}
32  * + \Delta t\,\sum_{i=1}^{s}b_{i}\,\bar{f}(X_{i},t_{n-1}+c_{i}\Delta t)
33  * \f]
34  * where \f$\dot{x}=\bar{f}(x,t)\f$ is the explicit form of the
35  * ODE, \f$X_{i}\f$ are intermediate approximations to the solution
36  * at times, \f$t_{n-1}+c_{i}\Delta t\f$, (stage solutions) which may
37  * be correct to a lower order of accuracy than the solution, \f$x_{n}\f$.
38  * We should note that these lower-order approximations are combined
39  * through \f$b_{i}\f$ so that error terms cancel out and produce a
40  * more accurate solution. Note for DIRK methods that \f$a_{ii}=a\f$
41  * for all the diagonal components is referred to as
42  * Singly Diagonal Implicit Runge-Kutta (SDIRK) methods.
43  *
44  * Note that the stage time derivatives,
45  * \f[
46  * \dot{X}_{i} = \bar{f}(X_{i},t_{n-1}+c_{i}\Delta t),
47  * \f]
48  * can be found via
49  * \f{eqnarray*}{
50  * \dot{X}_{i} & = & \frac{1}{a_{ii} \Delta t} [ X_{i} - x_{n-1}
51  * - \Delta t\,\sum_{j=1}^{i-1} a_{ij}\,\dot{X}_{j} ] \\
52  * \dot{X}_{i} & = & \frac{X_{i} - \tilde{X}}{a_{ii} \Delta t}
53  * \f}
54  * where
55  * \f[
56  * \tilde{X} = x_{n-1} + \Delta t \sum_{j=1}^{i-1} a_{ij}\, \dot{X}_{j}
57  * \f]
58  * Recalling that the definition for a DIRK is that for \f$j>i\f$,
59  * \f$a_{ij} = 0\f$ and \f$a_{ii} \neq 0\f$ for at least one \f$i\f$.
60  * Thus for stages where \f$a_{ii} = 0\f$, we can use the explicit RK
61  * methods (see StepperExplicitRK for additional details).
62  *
63  * <b> Algorithm </b>
64  * The single-timestep algorithm for DIRK is,
65  * - for \f$i = 1 \ldots s\f$ do
66  * - if \f$a_{ii} = 0\f$
67  * - \f$X_i \leftarrow x_{n-1}
68  * + \Delta t\,\sum_{j=1}^{i-1} a_{ij}\,\dot{X}_j\f$
69  * - Evaluate \f$\bar{f}(X_{i},t_{n-1}+c_{i}\Delta t)\f$
70  * - \f$\dot{X}_i \leftarrow \bar{f}(X_i,t_{n-1}+c_i\Delta t)\f$
71  * - else
72  * - \f$\tilde{X} =
73  * x_{n-1} +\Delta t \sum_{j=1}^{i-1} a_{ij}\,\dot{X}_{j}\f$
74  * - Define \f$\dot{X}_i \leftarrow
75  * \frac{X_{i} - \tilde{X}}{a_{ii} \Delta t}\f$
76  * - Solve \f$f(\dot{x} =
77  * \dot{X}_i,X_i,t_{n-1}+c_{i}\Delta t)=0\f$ for \f$X_i\f$
78  * - \f$\dot{X}_i \leftarrow \frac{X_{i} - \tilde{X}}{a_{ii} \Delta t}\f$
79  * - end for
80  * - \f$x_n \leftarrow x_{n-1} + \Delta t\,\sum_{i=1}^{s}b_i\,\dot{X}_i\f$
81  * - Solve \f$f(\dot{x}_n,x_n,t_n)=0\f$ for \f$\dot{x}_n\f$ [Optional]
82  */
83 template<class Scalar>
84 class StepperDIRK : virtual public Tempus::StepperImplicit<Scalar>
85 {
86 public:
87  /// Constructor to use default Stepper parameters.
89  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
90  std::string stepperType = "SDIRK 2 Stage 2nd order");
91 
92  /// Constructor to specialize Stepper parameters.
94  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
95  Teuchos::RCP<Teuchos::ParameterList> pList);
96 
97  /// Constructor for StepperFactory.
99  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
100  std::string stepperType, Teuchos::RCP<Teuchos::ParameterList> pList);
101 
102  /// \name Basic stepper methods
103  //@{
104  virtual void setObserver(
105  Teuchos::RCP<StepperObserver<Scalar> > obs = Teuchos::null);
106 
107  virtual void setTableau(std::string stepperType);
108 
109  virtual void setTableau(
110  Teuchos::RCP<Teuchos::ParameterList> pList = Teuchos::null);
111 
112  /// Initialize during construction and after changing input parameters.
113  virtual void initialize();
114 
115  /// Take the specified timestep, dt, and return true if successful.
116  virtual void takeStep(
117  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
118 
119  /// Get a default (initial) StepperState
120  virtual Teuchos::RCP<Tempus::StepperState<Scalar> >getDefaultStepperState();
121  virtual Scalar getOrder() const{return DIRK_ButcherTableau_->order();}
122  virtual Scalar getOrderMin() const{return DIRK_ButcherTableau_->orderMin();}
123  virtual Scalar getOrderMax() const{return DIRK_ButcherTableau_->orderMax();}
124 
125  virtual bool isExplicit() const
126  {
127  const int numStages = DIRK_ButcherTableau_->numStages();
128  Teuchos::SerialDenseMatrix<int,Scalar> A = DIRK_ButcherTableau_->A();
129  bool isExplicit = false;
130  for (int i=0; i<numStages; ++i) if (A(i,i) == 0.0) isExplicit = true;
131  return isExplicit;
132  }
133  virtual bool isImplicit() const {return true;}
134  virtual bool isExplicitImplicit() const
135  {return isExplicit() and isImplicit();}
136  virtual bool isOneStepMethod() const {return true;}
137  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
138  //@}
139 
140  /// Pass initial guess to Newton solver
141  virtual void setInitialGuess(
142  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess)
143  {initial_guess_ = initial_guess;}
144 
145  /// \name ParameterList methods
146  //@{
147  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl);
148  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
149  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
150  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
151  Teuchos::RCP<Teuchos::ParameterList> getDefaultParameters() const;
152  //@}
153 
154  /// \name Overridden from Teuchos::Describable
155  //@{
156  virtual std::string description() const;
157  virtual void describe(Teuchos::FancyOStream & out,
158  const Teuchos::EVerbosityLevel verbLevel) const;
159  //@}
160 
161 private:
162 
163  /// Default Constructor -- not allowed
164  StepperDIRK();
165 
166 protected:
167 
168  std::string description_;
169 
170  Teuchos::RCP<const RKButcherTableau<Scalar> > DIRK_ButcherTableau_;
171 
172  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageXDot_;
173  Teuchos::RCP<Thyra::VectorBase<Scalar> > stageX_;
174  Teuchos::RCP<Thyra::VectorBase<Scalar> > xTilde_;
175 
176  Teuchos::RCP<StepperObserver<Scalar> > stepperObserver_;
177  Teuchos::RCP<StepperDIRKObserver<Scalar> > stepperDIRKObserver_;
178 
179  Teuchos::RCP<Thyra::VectorBase<Scalar> > ee_;
180 
181  // For Embedded RK
182  Teuchos::RCP<Thyra::VectorBase<Scalar> > abs_u0;
183  Teuchos::RCP<Thyra::VectorBase<Scalar> > abs_u;
184  Teuchos::RCP<Thyra::VectorBase<Scalar> > sc;
185 
186  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess_;
187 
188 };
189 
190 
191 /** \brief Time-derivative interface for DIRK.
192  *
193  * Given the stage state \f$X_i\f$ and
194  * \f[
195  * \tilde{X} = x_{n-1} +\Delta t \sum_{j=1}^{i-1} a_{ij}\,\dot{X}_{j},
196  * \f]
197  * compute the DIRK stage time-derivative,
198  * \f[
199  * \dot{X}_i = \frac{X_{i} - \tilde{X}}{a_{ii} \Delta t}
200  * \f]
201  * \f$\ddot{x}\f$ is not used and set to null.
202  */
203 template <typename Scalar>
205  : virtual public Tempus::TimeDerivative<Scalar>
206 {
207 public:
208 
209  /// Constructor
211  Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
212  { initialize(s, xTilde); }
213 
214  /// Destructor
216 
217  /// Compute the time derivative.
218  virtual void compute(
219  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
220  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
221  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
222  {
223  xDotDot = Teuchos::null;
224  Thyra::V_StVpStV(xDot.ptr(),s_,*x,-s_,*xTilde_);
225  }
226 
227  virtual void initialize(Scalar s,
228  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
229  { s_ = s; xTilde_ = xTilde; }
230 
231 private:
232 
233  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde_;
234  Scalar s_; // = 1/(dt*a_ii)
235 };
236 
237 
238 } // namespace Tempus
239 
240 #endif // Tempus_StepperDIRK_decl_hpp
Tempus::StepperDIRK::isExplicit
virtual bool isExplicit() const
Definition: Tempus_StepperDIRK_decl.hpp:125
Tempus::StepperDIRK::StepperDIRK
StepperDIRK()
Default Constructor – not allowed.
Tempus::StepperDIRK::abs_u
Teuchos::RCP< Thyra::VectorBase< Scalar > > abs_u
Definition: Tempus_StepperDIRK_decl.hpp:183
Tempus::StepperDIRK::xTilde_
Teuchos::RCP< Thyra::VectorBase< Scalar > > xTilde_
Definition: Tempus_StepperDIRK_decl.hpp:174
Tempus::StepperDIRK::DIRK_ButcherTableau_
Teuchos::RCP< const RKButcherTableau< Scalar > > DIRK_ButcherTableau_
Definition: Tempus_StepperDIRK_decl.hpp:170
Tempus::StepperDIRK::describe
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Definition: Tempus_StepperDIRK_impl.hpp:331
Tempus::StepperDIRK::unsetParameterList
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
Definition: Tempus_StepperDIRK_impl.hpp:395
Tempus::solutionHistory
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
Definition: Tempus_SolutionHistory_impl.hpp:504
Tempus::StepperDIRKTimeDerivative::~StepperDIRKTimeDerivative
virtual ~StepperDIRKTimeDerivative()
Destructor.
Definition: Tempus_StepperDIRK_decl.hpp:215
Tempus::StepperDIRK::takeStep
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
Definition: Tempus_StepperDIRK_impl.hpp:155
Tempus::StepperDIRK::isOneStepMethod
virtual bool isOneStepMethod() const
Definition: Tempus_StepperDIRK_decl.hpp:136
Tempus::StepperDIRKTimeDerivative::xTilde_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde_
Definition: Tempus_StepperDIRK_decl.hpp:233
Tempus_StepperDIRKObserver.hpp
Tempus::StepperDIRK::description_
std::string description_
Definition: Tempus_StepperDIRK_decl.hpp:168
Tempus::StepperDIRKTimeDerivative
Time-derivative interface for DIRK.
Definition: Tempus_StepperDIRK_decl.hpp:204
Tempus
Definition: Tempus_AdjointAuxSensitivityModelEvaluator_decl.hpp:20
Tempus::StepperDIRK::description
virtual std::string description() const
Definition: Tempus_StepperDIRK_impl.hpp:324
Tempus::StepperDIRK::getNonconstParameterList
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Definition: Tempus_StepperDIRK_impl.hpp:387
Tempus::StepperDIRK::initial_guess_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess_
Definition: Tempus_StepperDIRK_decl.hpp:186
Tempus_RKButcherTableau.hpp
Tempus::StepperDIRKTimeDerivative::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_StepperDIRK_decl.hpp:218
Tempus::StepperDIRK::stageXDot_
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageXDot_
Definition: Tempus_StepperDIRK_decl.hpp:172
Tempus::StepperObserver
StepperObserver class for Stepper class.
Definition: Tempus_StepperObserver.hpp:38
Tempus::StepperDIRK::getDefaultParameters
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
Definition: Tempus_StepperDIRK_impl.hpp:367
Tempus::StepperDIRK::getDefaultStepperState
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
Definition: Tempus_StepperDIRK_impl.hpp:315
Tempus::StepperDIRK::initialize
virtual void initialize()
Initialize during construction and after changing input parameters.
Definition: Tempus_StepperDIRK_impl.hpp:123
Tempus::StepperDIRK
Diagonally Implicit Runge-Kutta (DIRK) time stepper.
Definition: Tempus_StepperDIRK_decl.hpp:84
Tempus::StepperImplicit
Thyra Base interface for implicit time steppers.
Definition: Tempus_StepperImplicit_decl.hpp:24
Tempus::StepperDIRK::isExplicitImplicit
virtual bool isExplicitImplicit() const
Definition: Tempus_StepperDIRK_decl.hpp:134
Tempus::StepperDIRK::stepperObserver_
Teuchos::RCP< StepperObserver< Scalar > > stepperObserver_
Definition: Tempus_StepperDIRK_decl.hpp:176
Tempus::StepperDIRK::getOrderMin
virtual Scalar getOrderMin() const
Definition: Tempus_StepperDIRK_decl.hpp:122
Tempus::SolutionHistory
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Definition: Tempus_Integrator.hpp:25
Tempus::StepperDIRK::getOrder
virtual Scalar getOrder() const
Definition: Tempus_StepperDIRK_decl.hpp:121
Tempus::StepperDIRK::setInitialGuess
virtual void setInitialGuess(Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess)
Pass initial guess to Newton solver.
Definition: Tempus_StepperDIRK_decl.hpp:141
Tempus::StepperDIRK::stepperDIRKObserver_
Teuchos::RCP< StepperDIRKObserver< Scalar > > stepperDIRKObserver_
Definition: Tempus_StepperDIRK_decl.hpp:177
Tempus_WrapperModelEvaluator.hpp
Tempus::TimeDerivative
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
Definition: Tempus_TimeDerivative.hpp:32
Tempus::StepperDIRK::isMultiStepMethod
virtual bool isMultiStepMethod() const
Definition: Tempus_StepperDIRK_decl.hpp:137
Tempus::StepperDIRK::getValidParameters
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Definition: Tempus_StepperDIRK_impl.hpp:357
Tempus::StepperDIRK::getOrderMax
virtual Scalar getOrderMax() const
Definition: Tempus_StepperDIRK_decl.hpp:123
Tempus::StepperDIRK::sc
Teuchos::RCP< Thyra::VectorBase< Scalar > > sc
Definition: Tempus_StepperDIRK_decl.hpp:184
Tempus::StepperDIRK::stageX_
Teuchos::RCP< Thyra::VectorBase< Scalar > > stageX_
Definition: Tempus_StepperDIRK_decl.hpp:173
Tempus::StepperDIRK::setParameterList
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
Definition: Tempus_StepperDIRK_impl.hpp:341
Tempus::StepperDIRKTimeDerivative::StepperDIRKTimeDerivative
StepperDIRKTimeDerivative(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Constructor.
Definition: Tempus_StepperDIRK_decl.hpp:210
Tempus::StepperDIRK::setTableau
virtual void setTableau(std::string stepperType)
Definition: Tempus_StepperDIRK_impl.hpp:61
Tempus::StepperDIRKTimeDerivative::s_
Scalar s_
Definition: Tempus_StepperDIRK_decl.hpp:234
Tempus::StepperDIRK::setObserver
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > > obs=Teuchos::null)
Set Observer.
Definition: Tempus_StepperDIRK_impl.hpp:102
Tempus::StepperDIRK::ee_
Teuchos::RCP< Thyra::VectorBase< Scalar > > ee_
Definition: Tempus_StepperDIRK_decl.hpp:179
Tempus::StepperDIRKTimeDerivative::initialize
virtual void initialize(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Definition: Tempus_StepperDIRK_decl.hpp:227
Tempus::StepperDIRK::isImplicit
virtual bool isImplicit() const
Definition: Tempus_StepperDIRK_decl.hpp:133
Tempus::StepperDIRK::abs_u0
Teuchos::RCP< Thyra::VectorBase< Scalar > > abs_u0
Definition: Tempus_StepperDIRK_decl.hpp:182