Tempus  Version of the Day
Time Integration
Tempus_StepperBackwardEuler_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_StepperBackwardEuler_decl_hpp
10 #define Tempus_StepperBackwardEuler_decl_hpp
11 
12 #include "Tempus_StepperImplicit.hpp"
16 
17 
18 namespace Tempus {
19 
20 /** \brief Backward Euler time stepper.
21  *
22  * For the implicit ODE system, \f$\mathcal{F}(\dot{x},x,t) = 0\f$,
23  * the solution, \f$\dot{x}\f$ and \f$x\f$, is determined using a
24  * solver (e.g., a non-linear solver, like NOX).
25  *
26  * <b> Algorithm </b>
27  * The single-timestep algorithm for Backward Euler is simply,
28  * - Solve \f$f(\dot{x}=(x_n-x_{n-1})/\Delta t_n, x_n, t_n)=0\f$ for \f$x_n\f$
29  * - \f$\dot{x}_n \leftarrow (x_n-x_{n-1})/\Delta t_n\f$ [Optional]
30  * - Solve \f$f(\dot{x}_n,x_n,t_n)=0\f$ for \f$\dot{x}_n\f$ [Optional]
31  */
32 template<class Scalar>
34  virtual public Tempus::StepperImplicit<Scalar>,
35  virtual public Tempus::StepperOptimizationInterface<Scalar>
36 {
37 public:
38 
39  /// Constructor
41  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
42  Teuchos::RCP<Teuchos::ParameterList> pList = Teuchos::null);
43 
44  /// \name Basic stepper methods
45  //@{
46  virtual void setObserver(
47  Teuchos::RCP<StepperObserver<Scalar> > obs = Teuchos::null);
48 
49  /// Set the predictor
50  void setPredictor(std::string predictorName);
51  void setPredictor(Teuchos::RCP<Teuchos::ParameterList>predPL=Teuchos::null);
52 
53  /// Initialize during construction and after changing input parameters.
54  virtual void initialize();
55 
56  /// Take the specified timestep, dt, and return true if successful.
57  virtual void takeStep(
58  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
59 
60  /// Pass initial guess to Newton solver
61  virtual void setInitialGuess(Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess)
62  {initial_guess_ = initial_guess;}
63 
64  /// Get a default (initial) StepperState
65  virtual Teuchos::RCP<Tempus::StepperState<Scalar> > getDefaultStepperState();
66  virtual Scalar getOrder() const {return 1.0;}
67  virtual Scalar getOrderMin() const {return 1.0;}
68  virtual Scalar getOrderMax() const {return 1.0;}
69 
70  virtual bool isExplicit() const {return false;}
71  virtual bool isImplicit() const {return true;}
72  virtual bool isExplicitImplicit() const
73  {return isExplicit() and isImplicit();}
74  virtual bool isOneStepMethod() const {return true;}
75  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
76  //@}
77 
78  /// Compute predictor given the supplied stepper
79  virtual void computePredictor(
80  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
81 
82  /// Provide temporary xDot memory for Stepper if SolutionState doesn't.
83  virtual Teuchos::RCP<Thyra::VectorBase<Scalar> > getXDotTemp(
84  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x) const;
85 
86  /// \name ParameterList methods
87  //@{
88  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl);
89  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
90  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
91  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
92  Teuchos::RCP<Teuchos::ParameterList> getDefaultParameters() const;
93  //@}
94 
95  /// \name Overridden from Teuchos::Describable
96  //@{
97  virtual std::string description() const;
98  virtual void describe(Teuchos::FancyOStream & out,
99  const Teuchos::EVerbosityLevel verbLevel) const;
100  //@}
101 
102  /// \name Implementation of StepperOptimizationInterface
103  //@{
104  virtual int stencilLength() const;
105  virtual void computeStepResidual(
106  Thyra::VectorBase<Scalar>& residual,
107  const Teuchos::Array< Teuchos::RCP<const Thyra::VectorBase<Scalar> > >& x,
108  const Teuchos::Array<Scalar>& t,
109  const Thyra::VectorBase<Scalar>& p,
110  const int param_index) const;
111  virtual void computeStepJacobian(
112  Thyra::LinearOpBase<Scalar>& jacobian,
113  const Teuchos::Array< Teuchos::RCP<const Thyra::VectorBase<Scalar> > >& x,
114  const Teuchos::Array<Scalar>& t,
115  const Thyra::VectorBase<Scalar>& p,
116  const int param_index,
117  const int deriv_index) const;
118  virtual void computeStepParamDeriv(
119  Thyra::LinearOpBase<Scalar>& deriv,
120  const Teuchos::Array< Teuchos::RCP<const Thyra::VectorBase<Scalar> > >& x,
121  const Teuchos::Array<Scalar>& t,
122  const Thyra::VectorBase<Scalar>& p,
123  const int param_index) const;
124  virtual void computeStepSolver(
125  Thyra::LinearOpWithSolveBase<Scalar>& jacobian_solver,
126  const Teuchos::Array< Teuchos::RCP<const Thyra::VectorBase<Scalar> > >& x,
127  const Teuchos::Array<Scalar>& t,
128  const Thyra::VectorBase<Scalar>& p,
129  const int param_index) const;
130  //@}
131 
132 private:
133 
134  /// Default Constructor -- not allowed
136 
137  /// Implementation of computeStep*() methods
139  const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs,
140  const Teuchos::Array< Teuchos::RCP<const Thyra::VectorBase<Scalar> > >& x,
141  const Teuchos::Array<Scalar>& t,
142  const Thyra::VectorBase<Scalar>& p,
143  const int param_index,
144  const int deriv_index = 0) const;
145 
146 private:
147 
148  Teuchos::RCP<Stepper<Scalar> > predictorStepper_;
149  Teuchos::RCP<StepperObserver<Scalar> > stepperObserver_;
150  Teuchos::RCP<StepperBackwardEulerObserver<Scalar> > stepperBEObserver_;
151 
152  mutable Teuchos::RCP<Thyra::VectorBase<Scalar> > xDotTemp_;
153  Teuchos::RCP<const Thyra::VectorBase<Scalar> > initial_guess_;
154 };
155 
156 /** \brief Time-derivative interface for Backward Euler.
157  *
158  * Given the state \f$x\f$, compute the Backward Euler time-derivative,
159  * \f[
160  * \dot{x}_{n} = \frac{(x_{n} - x_{n-1})}{\Delta t_{n}}.
161  * \f]
162  * \f$\ddot{x}\f$ is not used and set to null.
163  */
164 template <typename Scalar>
166  : virtual public Tempus::TimeDerivative<Scalar>
167 {
168 public:
169 
170  /// Constructor
172  Scalar s, Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld)
173  { initialize(s, xOld); }
174 
175  /// Destructor
177 
178  /// Compute the time derivative.
179  virtual void compute(
180  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x,
181  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDot,
182  Teuchos::RCP< Thyra::VectorBase<Scalar> > xDotDot = Teuchos::null)
183  {
184  xDotDot = Teuchos::null;
185  // Calculate the Backward Euler x dot vector
186  Thyra::V_StVpStV(xDot.ptr(),s_,*x,-s_,*xOld_);
187  }
188 
189  virtual void initialize(Scalar s,
190  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld)
191  { s_ = s; xOld_ = xOld; }
192 
193 private:
194 
195  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xOld_;
196  Scalar s_; // = 1.0/dt
197 };
198 
199 
200 } // namespace Tempus
201 
202 #endif // Tempus_StepperBackwardEuler_decl_hpp
Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld_
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
StepperBackwardEuler()
Default Constructor – not allowed.
Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess_
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 takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
virtual void setInitialGuess(Teuchos::RCP< const Thyra::VectorBase< Scalar > > initial_guess)
Pass initial guess to Newton solver.
virtual void computePredictor(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Compute predictor given the supplied stepper.
virtual Teuchos::RCP< Thyra::VectorBase< Scalar > > getXDotTemp(Teuchos::RCP< const Thyra::VectorBase< Scalar > > x) const
Provide temporary xDot memory for Stepper if SolutionState doesn&#39;t.
virtual void computeStepSolver(Thyra::LinearOpWithSolveBase< Scalar > &jacobian_solver, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index) const
Compute time step Jacobian solver.
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
void setPredictor(std::string predictorName)
Set the predictor.
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > > obs=Teuchos::null)
Set Observer.
virtual void computeStepJacobian(Thyra::LinearOpBase< Scalar > &jacobian, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index, const int deriv_index) const
Compute time step Jacobian.
virtual int stencilLength() const
Return the number of solution vectors in the time step stencil.
Thyra Base interface for implicit time steppers.
virtual void computeStepResidual(Thyra::VectorBase< Scalar > &residual, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index) const
Compute time step residual.
Teuchos::RCP< StepperObserver< Scalar > > stepperObserver_
StepperObserver class for Stepper class.
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory(Teuchos::RCP< Teuchos::ParameterList > pList=Teuchos::null)
Nonmember constructor.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Teuchos::RCP< Stepper< Scalar > > predictorStepper_
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList()
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
StepperBackwardEulerTimeDerivative(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld)
Constructor.
This interface defines the time derivative connection between an implicit Stepper and WrapperModelEva...
Teuchos::RCP< StepperBackwardEulerObserver< Scalar > > stepperBEObserver_
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList()
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
virtual void initialize(Scalar s, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xOld)
Stepper interface to support full-space optimization.
Time-derivative interface for Backward Euler.
virtual void computeStepParamDeriv(Thyra::LinearOpBase< Scalar > &deriv, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index) const
Compute time step derivative w.r.t. model parameters.
virtual void initialize()
Initialize during construction and after changing input parameters.
Teuchos::RCP< Thyra::VectorBase< Scalar > > xDotTemp_
void computeStepResidDerivImpl(const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs, const Teuchos::Array< Teuchos::RCP< const Thyra::VectorBase< Scalar > > > &x, const Teuchos::Array< Scalar > &t, const Thyra::VectorBase< Scalar > &p, const int param_index, const int deriv_index=0) const
Implementation of computeStep*() methods.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const