Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_StepperIMEX_RK_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_StepperIMEX_RK_decl_hpp
10 #define Tempus_StepperIMEX_RK_decl_hpp
11 
12 #include "Tempus_config.hpp"
13 #include "Tempus_StepperRKBase.hpp"
14 #include "Tempus_StepperImplicit.hpp"
15 #include "Tempus_WrapperModelEvaluatorPairIMEX_Basic.hpp"
16 
17 namespace Tempus {
18 
282 template <class Scalar>
283 class StepperIMEX_RK : virtual public Tempus::StepperImplicit<Scalar>,
284  virtual public Tempus::StepperRKBase<Scalar> {
285  public:
291  StepperIMEX_RK(std::string stepperType = "IMEX RK SSP2");
292 
295  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
297  bool useFSAL, std::string ICConsistency, bool ICConsistencyCheck,
298  bool zeroInitialGuess,
299  const Teuchos::RCP<StepperRKAppAction<Scalar> >& stepperRKAppAction,
300  std::string stepperType,
301  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau,
302  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau,
303  Scalar order);
304 
306 
309  {
310  return getExplicitTableau();
311  }
312 
314  virtual void setTableaus(
315  std::string stepperType = "",
316  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau =
317  Teuchos::null,
318  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau =
319  Teuchos::null);
320 
321  virtual void setTableaus(Teuchos::RCP<Teuchos::ParameterList> stepperPL,
322  std::string stepperType);
323 
326  const
327  {
328  return explicitTableau_;
329  }
330 
332  virtual void setExplicitTableau(
333  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau);
334 
337  const
338  {
339  return implicitTableau_;
340  }
341 
343  virtual void setImplicitTableau(
344  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau);
345 
346  virtual void setModel(
347  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
348 
350  {
351  return this->wrapperModel_;
352  }
353 
354  virtual void setModelPair(
356 
357  virtual void setModelPair(
358  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& explicitModel,
359  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& implicitModel);
360 
362  virtual void initialize();
363 
365  virtual void setInitialConditions(
366  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
367 
369  virtual void takeStep(
370  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
371 
373  virtual Scalar getOrder() const { return order_; }
374  virtual Scalar getOrderMin() const { return order_; }
375  virtual Scalar getOrderMax() const { return order_; }
376 
377  virtual bool isExplicit() const { return true; }
378  virtual bool isImplicit() const { return true; }
379  virtual bool isExplicitImplicit() const
380  {
381  return isExplicit() && isImplicit();
382  }
383  virtual bool isOneStepMethod() const { return true; }
384  virtual bool isMultiStepMethod() const { return !isOneStepMethod(); }
385  virtual OrderODE getOrderODE() const { return FIRST_ORDER_ODE; }
387 
388  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageF()
389  {
390  return stageF_;
391  }
392  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageG()
393  {
394  return stageG_;
395  }
397 
399  virtual Scalar getAlpha(const Scalar dt) const
400  {
402  return Scalar(1.0) / (dt * A(0, 0)); // Getting the first diagonal coeff!
403  }
405  virtual Scalar getBeta(const Scalar) const { return Scalar(1.0); }
406 
408 
410 
411  virtual void describe(Teuchos::FancyOStream& out,
412  const Teuchos::EVerbosityLevel verbLevel) const;
414 
415  virtual bool isValidSetup(Teuchos::FancyOStream& out) const;
416 
418  const Teuchos::RCP<const Thyra::VectorBase<Scalar> >& X, Scalar time,
419  Scalar stepSize, Scalar stageNumber,
420  const Teuchos::RCP<Thyra::VectorBase<Scalar> >& G) const;
421 
422  void evalExplicitModel(
423  const Teuchos::RCP<const Thyra::VectorBase<Scalar> >& X, Scalar time,
424  Scalar stepSize, Scalar stageNumber,
425  const Teuchos::RCP<Thyra::VectorBase<Scalar> >& F) const;
426 
427  void setOrder(Scalar order) { order_ = order; }
428 
429  protected:
432 
433  Scalar order_;
434 
435  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageF_;
436  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageG_;
437 
439 };
440 
453 template <typename Scalar>
455  : virtual public Tempus::TimeDerivative<Scalar> {
456  public:
459  Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
460  {
461  initialize(s, xTilde);
462  }
463 
466 
468  virtual void compute(
471  Teuchos::RCP<Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
472  {
473  xDotDot = Teuchos::null;
474 
475  // ith stage
476  // s = 1/(dt*a_ii)
477  // xOld = solution at beginning of time step
478  // xTilde = xOld + dt*(Sum_{j=1}^{i-1} a_ij x_dot_j)
479  // xDotTilde = - (s*x_i - s*xTilde)
480  Thyra::V_StVpStV(xDot.ptr(), s_, *x, -s_, *xTilde_);
481  }
482 
483  virtual void initialize(Scalar s,
485  {
486  s_ = s;
487  xTilde_ = xTilde;
488  }
489 
490  private:
492  Scalar s_; // = 1/(dt*a_ii)
493 };
494 
496 // ------------------------------------------------------------------------
497 template <class Scalar>
499  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
500  std::string stepperType, Teuchos::RCP<Teuchos::ParameterList> pl);
501 
502 } // namespace Tempus
503 #endif // Tempus_StepperIMEX_RK_decl_hpp
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual void setImplicitTableau(Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau)
Set the implicit tableau from tableau.
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel() const
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getImplicitTableau() const
Return implicit tableau.
virtual Scalar getOrder() const
Teuchos::RCP< WrapperModelEvaluator< Scalar > > wrapperModel_
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
ModelEvaluator pair for implicit and explicit (IMEX) evaulations.
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > & getStageF()
Implicit-Explicit Runge-Kutta (IMEX-RK) time stepper.
virtual void setExplicitTableau(Teuchos::RCP< const RKButcherTableau< Scalar > > explicitTableau)
Set the explicit tableau from tableau.
Teuchos::RCP< Thyra::VectorBase< Scalar > > xTilde_
virtual bool isMultiStepMethod() const
virtual void initialize(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
StepperIMEX_RKTimeDerivative(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Constructor.
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.
Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau_
Teuchos::RCP< Thyra::VectorBase< Scalar > > & getXTilde()
StepperIMEX_RK(std::string stepperType="IMEX RK SSP2")
Default constructor.
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getExplicitTableau() const
Return explicit tableau.
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
virtual void setModelPair(const Teuchos::RCP< WrapperModelEvaluatorPairIMEX_Basic< Scalar > > &mePair)
Create WrapperModelPairIMEX from user-supplied ModelEvaluator pair.
Thyra Base interface for implicit time steppers.
Application Action for StepperRKBase.
Teuchos::RCP< const RKButcherTableau< Scalar > > explicitTableau_
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.
virtual Scalar getOrderMin() const
virtual bool isExplicitImplicit() const
void evalExplicitModel(const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &X, Scalar time, Scalar stepSize, Scalar stageNumber, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &F) const
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageF_
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > & getStageG()
virtual void setTableaus(std::string stepperType="", Teuchos::RCP< const RKButcherTableau< Scalar > > explicitTableau=Teuchos::null, Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau=Teuchos::null)
Set both the explicit and implicit tableau from ParameterList.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual OrderODE getOrderODE() const
virtual Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
Stepper integrates first-order ODEs.
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
void evalImplicitModelExplicitly(const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &X, Scalar time, Scalar stepSize, Scalar stageNumber, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &G) const
virtual Scalar getOrderMax() const
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
virtual bool isOneStepMethod() const
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getTableau() const
Returns the explicit tableau!
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageG_
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Provide a StepperState to the SolutionState. This Stepper does not have any special state data...
Time-derivative interface for IMEX RK.
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde_
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Set the model.
Teuchos::RCP< StepperIMEX_RK< Scalar > > createStepperIMEX_RK(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, std::string stepperType, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
virtual Scalar getAlpha(const Scalar dt) const
Return alpha = d(xDot)/dx.