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 
18 namespace Tempus {
19 
288 template<class Scalar>
289 class StepperIMEX_RK : virtual public Tempus::StepperImplicit<Scalar>,
290  virtual public Tempus::StepperRKBase<Scalar>
291 {
292 public:
293 
299  StepperIMEX_RK(std::string stepperType = "IMEX RK SSP2");
300 
303  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
305  bool useFSAL,
306  std::string ICConsistency,
307  bool ICConsistencyCheck,
308  bool zeroInitialGuess,
309  const Teuchos::RCP<StepperRKAppAction<Scalar> >& stepperRKAppAction,
310  std::string stepperType,
311  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau,
312  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau,
313  Scalar order);
314 
315 
317 
320  { return getExplicitTableau(); }
321 
323  virtual void setTableaus( std::string stepperType = "",
324  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau = Teuchos::null,
325  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau = Teuchos::null);
326 
327  virtual void setTableaus(
329  std::string stepperType);
330 
333  { return explicitTableau_; }
334 
336  virtual void setExplicitTableau(
337  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau);
338 
341  { return implicitTableau_; }
342 
344  virtual void setImplicitTableau(
345  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau);
346 
347  virtual void setModel(
348  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
349 
351  { return this->wrapperModel_; }
352 
353  virtual void setModelPair(
355 
356  virtual void setModelPair(
357  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& explicitModel,
358  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& implicitModel);
359 
361  virtual void initialize();
362 
364  virtual void setInitialConditions (
365  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
366 
368  virtual void takeStep(
369  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
370 
372  virtual Scalar getOrder()const { return order_; }
373  virtual Scalar getOrderMin()const { return order_; }
374  virtual Scalar getOrderMax()const { return order_; }
375 
376  virtual bool isExplicit() const {return true;}
377  virtual bool isImplicit() const {return true;}
378  virtual bool isExplicitImplicit() const
379  {return isExplicit() && isImplicit();}
380  virtual bool isOneStepMethod() const {return true;}
381  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
382  virtual OrderODE getOrderODE() const {return FIRST_ORDER_ODE;}
384 
385  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageF() {return stageF_;}
386  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageG() {return stageG_;}
388 
390  virtual Scalar getAlpha(const Scalar dt) const
391  {
393  return Scalar(1.0)/(dt*A(0,0)); // Getting the first diagonal coeff!
394  }
396  virtual Scalar getBeta (const Scalar ) const { return Scalar(1.0); }
397 
399 
401 
402  virtual void describe(Teuchos::FancyOStream & out,
403  const Teuchos::EVerbosityLevel verbLevel) const;
405 
406  virtual bool isValidSetup(Teuchos::FancyOStream & out) const;
407 
409  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & X,
410  Scalar time, Scalar stepSize, Scalar stageNumber,
411  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & G) const;
412 
413  void evalExplicitModel(
414  const Teuchos::RCP<const Thyra::VectorBase<Scalar> > & X,
415  Scalar time, Scalar stepSize, Scalar stageNumber,
416  const Teuchos::RCP<Thyra::VectorBase<Scalar> > & F) const;
417 
418  void setOrder(Scalar order) { order_ = order; }
419 
420 protected:
421 
424 
425  Scalar order_;
426 
427  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageF_;
428  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageG_;
429 
431 
432 };
433 
434 
447 template <typename Scalar>
449  : virtual public Tempus::TimeDerivative<Scalar>
450 {
451 public:
452 
455  Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
456  { initialize(s, xTilde); }
457 
460 
462  virtual void compute(
465  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
466  {
467  xDotDot = Teuchos::null;
468 
469  // ith stage
470  // s = 1/(dt*a_ii)
471  // xOld = solution at beginning of time step
472  // xTilde = xOld + dt*(Sum_{j=1}^{i-1} a_ij x_dot_j)
473  // xDotTilde = - (s*x_i - s*xTilde)
474  Thyra::V_StVpStV(xDot.ptr(),s_,*x,-s_,*xTilde_);
475  }
476 
477  virtual void initialize(Scalar s,
479  { s_ = s; xTilde_ = xTilde; }
480 
481 private:
482 
484  Scalar s_; // = 1/(dt*a_ii)
485 };
486 
487 
489 // ------------------------------------------------------------------------
490 template<class Scalar>
493  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
494  std::string stepperType,
496 
497 
498 } // namespace Tempus
499 #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 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.
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel()
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)
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.