Tempus  Version of the Day
Time Integration
Tempus_IntegratorPseudoTransientForwardSensitivity_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_IntegratorPseudoTransientForwardSensitivity_decl_hpp
10 #define Tempus_IntegratorPseudoTransientForwardSensitivity_decl_hpp
11 
12 // Tempus
13 #include "Tempus_IntegratorBasic.hpp"
15 
16 namespace Tempus {
17 
18 
19 /** \brief Time integrator suitable for pseudotransient forward sensitivity
20  * analysis */
21 /**
22  * For some problems, time integrators are used to compute steady-state
23  * solutions (also known as pseudo-transient solvers). When computing
24  * sensitivities, it is not necessary in these cases to propagate sensitivities
25  * all the way through the forward time integration. Instead the steady-state
26  * is first computed as usual, and then the sensitivities are computed using
27  * a similar pseudo-transient time integration applied to the sensitivity
28  * equations with the state frozen to the computed steady-state. This
29  * integrator specializes the transient sensitivity methods implemented by
30  * Tempus::IntegratorForwardSensitivity to this case.
31  *
32  * Consider an implicit ODE f(x_dot,x,p) = 0 with a stable steady-state solution
33  * x = x^s, x_dot = 0 where f(0,x^s,p) = 0 and all of the eigenvalues of
34  * df/dx(0,x^s,p) are in the right half-plane (for an explicit ODE, the
35  * eigenvalues must be in the left half-plane). In the pseudo-transient method
36  * a time-integrator is applied to f(x_dot,x,p) = 0 until x_dot is sufficiently
37  * small. Now consider the forward sensitivity equations:
38  * df/dx_dot*z_dot + df/dx*z + df/dp = 0
39  * where z = dx/dp. For pseudo-transient forward sensitivities, the above is
40  * integrated from z(0) = 0 until z_dot is sufficiently small, in which case
41  * z^s = -(df/dx)^{-1}*(df/dp).
42  * Then the final sensitivity of g is
43  * dg/dp + dg/dx*z^s.
44  * One can see that z^s is the only steady-state solution of the sensitivity
45  * equations, since df/dx and df/dp are constant, and must be linearly stable
46  * since it has the same Jacobian matrix as the forward equations.
47  */
48 template<class Scalar>
50  virtual public Tempus::Integrator<Scalar>
51 {
52 public:
53 
54  /** \brief Constructor with ParameterList and model, and will be fully
55  * initialized. */
56  /*!
57  * In addition to all of the regular integrator options, the supplied
58  * parameter list supports the following options contained within a sublist
59  * "Sensitivities" from the top-level parameter list:
60  * <ul>
61  * <li> "Reuse State Linear Solver" (default: false) Whether to reuse the
62  * model's W matrix, solver, and preconditioner when solving the
63  * sensitivity equations. If they can be reused, substantial savings
64  * in compute time are possible.
65  * <li> "Force W Update" (default: false) When reusing the solver as above
66  * whether to force recomputation of W. This can be necessary when
67  * the solver overwrites it during the solve-phase (e.g., by a
68  * factorization).
69  * <li> "Use DfDp as Tangent" (default: false) Reinterpret the df/dp
70  * out-arg as the tangent vector (df/dx)(x,p) * dx/dp + df/dp(x,p)
71  * as described in the Tempus::CombinedForwardSensitivityModelEvaluator
72  * documentation.
73  * <li> "Sensitivity Parameter Index" (default: 0) Model evaluator
74  * parameter index for which sensitivities will be computed.
75  * <li> "Sensitivity X Tangent Index" (default: 1) If "Use DfDp as Tangent"
76  * is true, the model evaluator parameter index for passing dx/dp
77  * as a Thyra::DefaultMultiVectorProductVector.
78  * <li> "Sensitivity X-Dot Tangent Index" (default: 2) If
79  * "Use DfDp as Tangent" is true, the model evaluator parameter index
80  * for passing dx_dot/dp as a Thyra::DefaultMultiVectorProductVector.
81  * <li> "Sensitivity X-Dot-Dot Tangent Index" (default: 3) If
82  * "Use DfDp as Tangent" is true, the model evaluator parameter index
83  * for passing dx_dot_dot/dp as a
84  * Thyra::DefaultMultiVectorProductVector (if the model supports
85  * x_dot_dot).
86  * </ul>
87  */
89  Teuchos::RCP<Teuchos::ParameterList> pList,
90  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model);
91 
92  /** \brief Constructor with model and "Stepper Type" and is fully initialized with default settings. */
94  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
95  std::string stepperType);
96 
97  /// Destructor
98  /** \brief Constructor that requires a subsequent setParameterList, setStepper, and initialize calls. */
100 
101  /// Destructor
103 
104  /// \name Basic integrator methods
105  //@{
106 
107  /// Advance the solution to timeMax, and return true if successful.
108  virtual bool advanceTime();
109  /// Advance the solution to timeFinal, and return true if successful.
110  virtual bool advanceTime(const Scalar timeFinal) override;
111  /// Get current time
112  virtual Scalar getTime() const override;
113  /// Get current index
114  virtual int getIndex() const override;
115  /// Get Status
116  virtual Status getStatus() const override;
117  /// Get the Stepper
118  virtual Teuchos::RCP<Stepper<Scalar> > getStepper() const override;
119  /// Return a copy of the Tempus ParameterList
120  virtual Teuchos::RCP<Teuchos::ParameterList> getTempusParameterList() override;
121  virtual void setTempusParameterList(Teuchos::RCP<Teuchos::ParameterList> pl) override;
122  /// Get the SolutionHistory
123  virtual Teuchos::RCP<const SolutionHistory<Scalar> > getSolutionHistory() const override;
124  /// Get the TimeStepControl
125  virtual Teuchos::RCP<const TimeStepControl<Scalar> > getTimeStepControl() const override;
126  virtual Teuchos::RCP<TimeStepControl<Scalar> > getNonConstTimeStepControl() override;
127  virtual Teuchos::RCP<Teuchos::Time> getIntegratorTimer() const override
128  {return state_integrator_->getIntegratorTimer();}
129  virtual Teuchos::RCP<Teuchos::Time> getStepperTimer() const override
130  {return state_integrator_->getStepperTimer();}
131 
132  //@}
133 
134  /// Set the initial state from Thyra::VectorBase(s)
135  virtual void initializeSolutionHistory(
136  Scalar t0,
137  Teuchos::RCP<const Thyra::VectorBase<Scalar> > x0,
138  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xdot0 = Teuchos::null,
139  Teuchos::RCP<const Thyra::VectorBase<Scalar> > xdotdot0 = Teuchos::null,
140  Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > DxDp0 = Teuchos::null,
141  Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > DxdotDp0 = Teuchos::null,
142  Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > DxdotdotDp0 = Teuchos::null);
143 
144  /// Get current the solution, x
145  virtual Teuchos::RCP<const Thyra::VectorBase<Scalar> > getX() const;
146  virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > getDxDp() const;
147  /// Get current the time derivative of the solution, xdot
148  virtual Teuchos::RCP<const Thyra::VectorBase<Scalar> > getXdot() const;
149  virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > getDxdotDp() const;
150  /// Get current the second time derivative of the solution, xdotdot
151  virtual Teuchos::RCP<const Thyra::VectorBase<Scalar> > getXdotdot() const;
152  virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> > getDxdotdotDp() const;
153 
154  /// \name Overridden from Teuchos::ParameterListAcceptor
155  //@{
156  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl)
157  override;
158  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList() override;
159  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList() override;
160 
161  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters()
162  const override;
163  //@}
164 
165  /// \name Overridden from Teuchos::Describable
166  //@{
167  std::string description() const override;
168  void describe(Teuchos::FancyOStream & out,
169  const Teuchos::EVerbosityLevel verbLevel) const override;
170  //@}
171 
172 protected:
173 
174  // Create sensitivity model evaluator from application model
175  Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> >
177  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
178  const Teuchos::RCP<Teuchos::ParameterList>& inputPL);
179 
180  void buildSolutionHistory();
181 
182  Teuchos::RCP<Thyra::ModelEvaluator<Scalar> > model_;
183  Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> > sens_model_;
184  Teuchos::RCP<IntegratorBasic<Scalar> > state_integrator_;
185  Teuchos::RCP<IntegratorBasic<Scalar> > sens_integrator_;
186  Teuchos::RCP<SolutionHistory<Scalar> > solutionHistory_;
189 };
190 
191 /// Non-member constructor
192 template<class Scalar>
193 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar> >
195  Teuchos::RCP<Teuchos::ParameterList> pList,
196  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model);
197 
198 /// Non-member constructor
199 template<class Scalar>
200 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar> >
202  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& model,
203  std::string stepperType);
204 
205 /// Non-member constructor
206 template<class Scalar>
207 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar> >
209 
210 } // namespace Tempus
211 
212 #endif // Tempus_IntegratorPseudoTransientForwardSensitivity_decl_hpp
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get current the solution, x.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXdotdot() const
Get current the second time derivative of the solution, xdotdot.
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxdotDp() const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl) override
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
Teuchos::RCP< Tempus::IntegratorPseudoTransientForwardSensitivity< Scalar > > integratorPseudoTransientForwardSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model)
Non-member constructor.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXdot() const
Get current the time derivative of the solution, xdot.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxDp() const
virtual void initializeSolutionHistory(Scalar t0, Teuchos::RCP< const Thyra::VectorBase< Scalar > > x0, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xdot0=Teuchos::null, Teuchos::RCP< const Thyra::VectorBase< Scalar > > xdotdot0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > DxDp0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > DxdotDp0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > DxdotdotDp0=Teuchos::null)
Set the initial state from Thyra::VectorBase(s)
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
Status
Status for the Integrator, the Stepper and the SolutionState.
virtual Teuchos::RCP< Teuchos::Time > getIntegratorTimer() const override
Returns the IntegratorTimer_ for this Integrator.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual Teuchos::RCP< Teuchos::ParameterList > getTempusParameterList() override
Return a copy of the Tempus ParameterList.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDxdotdotDp() const
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > createSensitivityModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
Time integrator suitable for pseudotransient forward sensitivity analysis.
Thyra Base interface for time integrators. Time integrators are designed to advance the solution from...
virtual void setTempusParameterList(Teuchos::RCP< Teuchos::ParameterList > pl) override
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.