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"
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 
185  virtual Teuchos::RCP<Tempus::StepperState<Scalar> >getDefaultStepperState() override;
186 
187  virtual bool isExplicit() const override
188  {
189  const int numStages = this->tableau_->numStages();
190  Teuchos::SerialDenseMatrix<int,Scalar> A = this->tableau_->A();
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_;}
207  Teuchos::RCP<Thyra::VectorBase<Scalar> >& getXTilde() {return xTilde_;}
208 
210  virtual Scalar getAlpha(const Scalar dt) const override
211  {
212  const int numStages = this->tableau_->numStages();
213  const Teuchos::SerialDenseMatrix<int,Scalar> & A=this->tableau_->A();
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  {
227  const Teuchos::SerialDenseMatrix<int,Scalar> & A=this->tableau_->A();
228  return (A(i,i) == 0.0) ? std::numeric_limits<Scalar>::infinity() : Scalar(1.0)/(dt*A(i,i));
229  }
230 
231  virtual Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const override;
232 
233  Teuchos::RCP<Teuchos::ParameterList> getValidParametersBasicDIRK() const;
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 
244  virtual void setStepperDIRKValues(Teuchos::RCP<Teuchos::ParameterList> pl)
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,
268  const Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> >& solver,
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_;
282  Teuchos::RCP<Thyra::VectorBase<Scalar> > xTilde_;
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(
316  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
317  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
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,
325  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde)
326  { s_ = s; xTilde_ = xTilde; }
327 
328 private:
329 
330  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xTilde_;
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.
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_
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
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 Scalar getAlpha(const Scalar dt, int i) const
Return alpha = d(xDot)/dx for stage i.
virtual void setStepperDIRKValues(Teuchos::RCP< Teuchos::ParameterList > pl)
Set StepperDIRK member data from the ParameterList.
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
Teuchos::RCP< Teuchos::ParameterList > getValidParametersBasicDIRK() const
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 bool getResetInitialGuess() const
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 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.