Tempus  Version of the Day
Time Integration
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,
304  const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
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 
318  virtual Teuchos::RCP<const RKButcherTableau<Scalar> > getTableau() const
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(
328  Teuchos::RCP<Teuchos::ParameterList> stepperPL,
329  std::string stepperType);
330 
332  virtual Teuchos::RCP<const RKButcherTableau<Scalar> > getExplicitTableau() const
333  { return explicitTableau_; }
334 
336  virtual void setExplicitTableau(
337  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau);
338 
340  virtual Teuchos::RCP<const RKButcherTableau<Scalar> > getImplicitTableau() const
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 
350  virtual Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > getModel() const
351  { return this->wrapperModel_; }
352 
353  virtual void setModelPair(
354  const Teuchos::RCP<WrapperModelEvaluatorPairIMEX_Basic<Scalar> >& mePair);
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 
371  virtual Teuchos::RCP<Tempus::StepperState<Scalar> >getDefaultStepperState();
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_;}
387  Teuchos::RCP<Thyra::VectorBase<Scalar> >& getXTilde() {return xTilde_;}
388 
390  virtual Scalar getAlpha(const Scalar dt) const
391  {
392  const Teuchos::SerialDenseMatrix<int,Scalar> & A = implicitTableau_->A();
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 
398  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
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 
422  Teuchos::RCP<const RKButcherTableau<Scalar> > explicitTableau_;
423  Teuchos::RCP<const RKButcherTableau<Scalar> > implicitTableau_;
424 
425  Scalar order_;
426 
427  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageF_;
428  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageG_;
429 
430  Teuchos::RCP<Thyra::VectorBase<Scalar> > xTilde_;
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(
463  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
464  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
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,
478  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
479  { s_ = s; xTilde_ = xTilde; }
480 
481 private:
482 
483  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde_;
484  Scalar s_; // = 1/(dt*a_ii)
485 };
486 
487 
489 // ------------------------------------------------------------------------
490 template<class Scalar>
491 Teuchos::RCP<StepperIMEX_RK<Scalar> >
493  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
494  std::string stepperType,
495  Teuchos::RCP<Teuchos::ParameterList> pl);
496 
497 
498 } // namespace Tempus
499 #endif // Tempus_StepperIMEX_RK_decl_hpp
virtual Scalar getOrderMin() const
virtual void setImplicitTableau(Teuchos::RCP< const RKButcherTableau< Scalar > > implicitTableau)
Set the implicit tableau from tableau.
Teuchos::RCP< WrapperModelEvaluator< Scalar > > wrapperModel_
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 Scalar getOrderMax() 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.
void evalExplicitModel(const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &X, Scalar time, Scalar stepSize, Scalar stageNumber, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &F) const
virtual Scalar getAlpha(const Scalar dt) const
Return alpha = d(xDot)/dx.
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.
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.
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel() const
Application Action for StepperRKBase.
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getImplicitTableau() const
Return implicit tableau.
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 Scalar getBeta(const Scalar) const
Return beta = d(x)/dx.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getExplicitTableau() const
Return explicit tableau.
virtual void initialize()
Initialize during construction and after changing input parameters.
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageF_
void evalImplicitModelExplicitly(const Teuchos::RCP< const Thyra::VectorBase< Scalar > > &X, Scalar time, Scalar stepSize, Scalar stageNumber, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &G) const
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 bool isMultiStepMethod() const
Stepper integrates first-order ODEs.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
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 bool isValidSetup(Teuchos::FancyOStream &out) const
virtual Teuchos::RCP< const RKButcherTableau< Scalar > > getTableau() const
Returns the explicit tableau!
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
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 OrderODE getOrderODE() const
virtual bool isExplicitImplicit() const