Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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"
13 #include "Tempus_StepperRKBase.hpp"
14 #include "Tempus_StepperImplicit.hpp"
16 
17 
18 namespace Tempus {
19 
155 template<class Scalar>
156 class StepperDIRK : virtual public Tempus::StepperImplicit<Scalar>,
157  virtual public Tempus::StepperRKBase<Scalar>
158 {
159 public:
160 
162 
163  virtual void initialize() override;
165 
167  virtual void setModel(
168  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel) override;
169 
171  virtual void setInitialConditions (
172  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory) override;
173 
175  virtual void setResetInitialGuess(bool reset_guess)
176  { resetGuess_ = reset_guess; }
177  virtual bool getResetInitialGuess() const
178  { return resetGuess_; }
179 
181  virtual void takeStep(
182  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory) override;
183 
186 
187  virtual bool isExplicit() const override
188  {
189  const int numStages = this->tableau_->numStages();
191  bool isExplicit = false;
192  for (int i=0; i<numStages; ++i) if (A(i,i) == 0.0) isExplicit = true;
193  return isExplicit && this->tableau_->isDIRK();
194  }
195  virtual bool isImplicit() const override {return true;}
196  virtual bool isExplicitImplicit() const override
197  {return isExplicit() && isImplicit();}
198  virtual bool isOneStepMethod() const override {return true;}
199  virtual bool isMultiStepMethod() const override {return !isOneStepMethod();}
200 
201  virtual OrderODE getOrderODE() const override {return FIRST_ORDER_ODE;}
202 
203  virtual std::string getDescription() const = 0;
205 
206  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > >& getStageXDot() {return stageXDot_;}
208 
210  virtual Scalar getAlpha(const Scalar dt) const override
211  {
212  const int numStages = this->tableau_->numStages();
214  Scalar aii = A(0,0);
215  for (int i=0; i<numStages; ++i) {
216  if (A(i,i) != 0.0) aii = A(i,i);
217  break;
218  }
219  return (aii == 0.0) ? std::numeric_limits<Scalar>::infinity() : Scalar(1.0)/(dt*aii);
220  }
222  virtual Scalar getBeta (const Scalar ) const override { return Scalar(1.0); }
223 
225  virtual Scalar getAlpha(const Scalar dt, int i) const
226  {
228  return (A(i,i) == 0.0) ? std::numeric_limits<Scalar>::infinity() : Scalar(1.0)/(dt*A(i,i));
229  }
230 
232 
234 
236 
237  virtual void describe(Teuchos::FancyOStream & out,
238  const Teuchos::EVerbosityLevel verbLevel) const override;
240 
241  virtual bool isValidSetup(Teuchos::FancyOStream & out) const override;
242 
245  {
246  if (pl != Teuchos::null) {
247  // Can not validate because of optional Parameters, e.g., 'Solver Name'.
248  //pl->validateParametersAndSetDefaults(*this->getValidParameters());
249  this->setStepperValues(pl);
250  if ( pl->isParameter("Use Embedded") )
251  this->setUseEmbedded(pl->get<bool>("Use Embedded"));
252  if ( pl->isParameter("Zero Initial Guess") )
253  this->setZeroInitialGuess(pl->get<bool>("Zero Initial Guess"));
254  if (pl->isParameter("Solver Name") )
255  this->setStepperSolverValues(pl);
256  }
257  }
258 
259 
260 protected:
261 
263  virtual void setupDefault();
264 
266  virtual void setup(
267  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& wrapperModel,
269  bool useFSAL,
270  std::string ICConsistency,
271  bool ICConsistencyCheck,
272  bool useEmbedded,
273  bool zeroInitialGuess,
274  const Teuchos::RCP<StepperRKAppAction<Scalar> >& stepperRKAppAction);
275 
276  virtual void setupTableau() = 0;
277 
278  virtual void setEmbeddedMemory() override;
279 
280 
281  std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar> > > stageXDot_;
283 
284  bool resetGuess_ = true;
285 };
286 
287 
300 template <typename Scalar>
302  : virtual public Tempus::TimeDerivative<Scalar>
303 {
304 public:
305 
308  Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
309  { initialize(s, xTilde); }
310 
313 
315  virtual void compute(
318  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
319  {
320  xDotDot = Teuchos::null;
321  Thyra::V_StVpStV(xDot.ptr(),s_,*x,-s_,*xTilde_);
322  }
323 
324  virtual void initialize(Scalar s,
326  { s_ = s; xTilde_ = xTilde; }
327 
328 private:
329 
331  Scalar s_; // = 1/(dt*a_ii)
332 };
333 
334 
335 } // namespace Tempus
336 
337 #endif // Tempus_StepperDIRK_decl_hpp
Teuchos::RCP< Thyra::VectorBase< Scalar > > xTilde_
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde_
virtual bool isMultiStepMethod() const override
virtual Scalar getBeta(const Scalar) const override
Return beta = d(x)/dx.
Teuchos::RCP< Teuchos::ParameterList > getValidParametersBasicDIRK() const
virtual bool isImplicit() const override
virtual bool isExplicitImplicit() const override
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel) override
Set the model.
Teuchos::RCP< RKButcherTableau< Scalar > > tableau_
T & get(const std::string &name, T def_value)
virtual Scalar getAlpha(const Scalar dt) const override
Return alpha = d(xDot)/dx.
virtual void setUseEmbedded(bool a)
virtual void setupTableau()=0
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual bool isExplicit() const override
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.
virtual void setResetInitialGuess(bool reset_guess)
Set parameter so that the initial guess is reset at the beginning of each timestep.
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
virtual OrderODE getOrderODE() const override
bool isParameter(const std::string &name) const
Diagonally Implicit Runge-Kutta (DIRK) time stepper.
Thyra Base interface for implicit time steppers.
Application Action for StepperRKBase.
virtual bool isOneStepMethod() const override
Time-derivative interface for DIRK.
virtual void setupDefault()
Default setup for constructor.
virtual void setStepperDIRKValues(Teuchos::RCP< Teuchos::ParameterList > pl)
Set StepperDIRK member data from the ParameterList.
virtual Scalar getAlpha(const Scalar dt, int i) const
Return alpha = d(xDot)/dx for stage i.
virtual Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
void setStepperSolverValues(Teuchos::RCP< Teuchos::ParameterList > pl)
Set solver from ParameterList.
virtual void setZeroInitialGuess(bool zIG)
Set parameter so that the initial guess is set to zero (=True) or use last timestep (=False)...
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual bool isValidSetup(Teuchos::FancyOStream &out) const override
void setStepperValues(const Teuchos::RCP< Teuchos::ParameterList > pl)
Set Stepper member data from ParameterList.
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > & getStageXDot()
Stepper integrates first-order ODEs.
virtual void initialize() override
Initialize after construction and changing input parameters.
virtual std::string getDescription() const =0
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Set the initial conditions and make them consistent.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
virtual void setEmbeddedMemory() override
virtual void setup(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &wrapperModel, const Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > &solver, bool useFSAL, std::string ICConsistency, bool ICConsistencyCheck, bool useEmbedded, bool zeroInitialGuess, const Teuchos::RCP< StepperRKAppAction< Scalar > > &stepperRKAppAction)
Setup for constructor.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState() override
Get a default (initial) StepperState.
std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > stageXDot_
virtual void initialize(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
virtual bool getResetInitialGuess() const
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory) override
Take the specified timestep, dt, and return true if successful.
Teuchos::RCP< Thyra::VectorBase< Scalar > > & getXTilde()
StepperDIRKTimeDerivative(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xTilde)
Constructor.