Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Tempus_StepperStaggeredForwardSensitivity_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_StepperStaggeredForwardSensitivity_decl_hpp
10 #define Tempus_StepperStaggeredForwardSensitivity_decl_hpp
11 
12 #include "Tempus_Stepper.hpp"
14 
15 namespace Tempus {
16 
17 /** \brief A stepper implementing staggered forward sensitivity analysis.
18  */
19 /**
20  * It constructs two internal steppers, one for the state equations as usual
21  * and one for the sensitivity equations using
22  * Tempus::StaggeredForwardSensitivityModelEvaluator. It's implementation
23  * of takeStep() first takes a step using the state stepper, updates the
24  * sensitivity model evaluator with the compute state solution and time
25  * derivatives, and then takes a step using the sensitivity stepper. It
26  * optionally can reuse the state solver for the sensitivity equations as well.
27  */
28 template<class Scalar>
30  virtual public Tempus::Stepper<Scalar>,
31  virtual public Teuchos::ParameterListAcceptor
32 {
33 public:
34 
35  /** \brief Default constructor.
36  *
37  * - Requires subsequent setModel() and initialize() calls before calling
38  * takeStep().
39  */
41 
42  /// Constructor
43  /*!
44  * The first parameter list argument supplies supplies regular stepper
45  * options, while the second provides sensitivity specific options:
46  * <ul>
47  * <li> "Reuse State Linear Solver" (default: false) Whether to reuse the
48  * model's W matrix, solver, and preconditioner when solving the
49  * sensitivity equations. If they can be reused, substantial savings
50  * in compute time are possible.
51  * <li> "Force W Update" (default: false) When reusing the solver as above
52  * whether to force recomputation of W. This can be necessary when
53  * the solver overwrites it during the solve-phase (e.g., by a
54  * factorization).
55  * <li> "Use DfDp as Tangent" (default: false) Reinterpret the df/dp
56  * out-arg as the tangent vector (df/dx)(x,p) * dx/dp + df/dp(x,p)
57  * as described in the Tempus::CombinedForwardSensitivityModelEvaluator
58  * documentation.
59  * <li> "Sensitivity Parameter Index" (default: 0) Model evaluator
60  * parameter index for which sensitivities will be computed.
61  * <li> "Sensitivity X Tangent Index" (default: 1) If "Use DfDp as Tangent"
62  * is true, the model evaluator parameter index for passing dx/dp
63  * as a Thyra::DefaultMultiVectorProductVector.
64  * <li> "Sensitivity X-Dot Tangent Index" (default: 2) If
65  * "Use DfDp as Tangent" is true, the model evaluator parameter index
66  * for passing dx_dot/dp as a Thyra::DefaultMultiVectorProductVector.
67  * <li> "Sensitivity X-Dot-Dot Tangent Index" (default: 3) If
68  * "Use DfDp as Tangent" is true, the model evaluator parameter index
69  * for passing dx_dot_dot/dp as a
70  * Thyra::DefaultMultiVectorProductVector (if the model supports
71  * x_dot_dot).
72  * </ul>
73  */
75  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
76  const Teuchos::RCP<Teuchos::ParameterList>& pList = Teuchos::null,
77  const Teuchos::RCP<Teuchos::ParameterList>& sens_pList = Teuchos::null);
78 
79  /// \name Basic stepper methods
80  //@{
81  virtual void setModel(
82  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel);
83  virtual Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > getModel();
84 
85  virtual void setSolver(
86  Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver = Teuchos::null);
87  virtual Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > getSolver() const
88  { return stateStepper_->getSolver(); }
89 
90  /// Set Observer
91  virtual void setObserver(
92  Teuchos::RCP<StepperObserver<Scalar> > /* obs */ = Teuchos::null){}
93 
94  virtual Teuchos::RCP<StepperObserver<Scalar> > getObserver() const
95  { return Teuchos::null; }
96 
97  /// Set the initial conditions and make them consistent.
98  virtual void setInitialConditions (
99  const Teuchos::RCP<SolutionHistory<Scalar> >& /* solutionHistory */){}
100 
101  /// Take the specified timestep, dt, and return true if successful.
102  virtual void takeStep(
103  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
104 
105  /// Get a default (initial) StepperState
106  virtual Teuchos::RCP<Tempus::StepperState<Scalar> >
108  virtual Scalar getOrder() const {return stateStepper_->getOrder();}
109  virtual Scalar getOrderMin() const {return stateStepper_->getOrderMin();}
110  virtual Scalar getOrderMax() const {return stateStepper_->getOrderMax();}
111  virtual Scalar getInitTimeStep(
112  const Teuchos::RCP<SolutionHistory<Scalar> >& /* solutionHistory */) const
113  {return Scalar(1.0e+99);}
114 
115  virtual bool isExplicit() const
116  {return stateStepper_->isExplicit() or sensitivityStepper_->isExplicit();}
117  virtual bool isImplicit() const
118  {return stateStepper_->isImplicit() or sensitivityStepper_->isImplicit();}
119  virtual bool isExplicitImplicit() const
120  {return isExplicit() and isImplicit();}
121 
122  virtual bool isOneStepMethod() const
123  {return stateStepper_->isOneStepMethod() and
124  sensitivityStepper_->isOneStepMethod();}
125  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
126 
127  virtual OrderODE getOrderODE() const {return FIRST_ORDER_ODE;}
128 
129  virtual void setUseFSAL(bool a) {stepperPL_->set<bool>("Use FSAL", a);}
130  virtual bool getUseFSAL() const
131  {return stepperPL_->get<bool>("Use FSAL", false);}
132 
133  virtual void setICConsistency(std::string s)
134  {stepperPL_->set<std::string>("Initial Condition Consistency", s);}
135  virtual std::string getICConsistency() const
136  {return stepperPL_->get<std::string>("Initial Condition Consistency",
137  "None");}
138 
139  virtual void setICConsistencyCheck(bool c)
140  {stepperPL_->set<bool>("Initial Condition Consistency Check", c);}
141  virtual bool getICConsistencyCheck() const
142  {return stepperPL_->get<bool>("Initial Condition Consistency Check",
143  false);}
144  //@}
145 
146  /// Pass initial guess to Newton solver
147  virtual void setInitialGuess(
148  Teuchos::RCP<const Thyra::VectorBase<Scalar> > /* initial_guess */){}
149 
150  /// \name ParameterList methods
151  //@{
152  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl);
153  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
154  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
155  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
156  Teuchos::RCP<Teuchos::ParameterList> getDefaultParameters() const;
157  //@}
158 
159  /// \name Overridden from Teuchos::Describable
160  //@{
161  virtual std::string description() const
162  { return "StepperStaggeredForwardSensitivity"; }
163  virtual void describe(Teuchos::FancyOStream & out,
164  const Teuchos::EVerbosityLevel verbLevel) const;
165  //@}
166 
167  virtual bool isValidSetup(Teuchos::FancyOStream & out) const;
168 
169  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_x_space() const;
170 
171  virtual Teuchos::RCP<const Teuchos::ParameterList> getParameterList() const
172  { return stepperPL_; }
173 
174 private:
175 
176  void setParams(const Teuchos::RCP<Teuchos::ParameterList> & pl,
177  const Teuchos::RCP<Teuchos::ParameterList> & spl);
178 
179 protected:
180 
181  Teuchos::RCP<Teuchos::ParameterList> stepperPL_;
182  Teuchos::RCP<Teuchos::ParameterList> sensPL_;
183  Teuchos::RCP<Stepper<Scalar> > stateStepper_;
184  Teuchos::RCP<Stepper<Scalar> > sensitivityStepper_;
185  Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> > combined_fsa_model_;
186  Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> > fsa_model_;
187  Teuchos::RCP<SolutionHistory<Scalar> > stateSolutionHistory_;
188  Teuchos::RCP<SolutionHistory<Scalar> > sensSolutionHistory_;
191 
192 };
193 
194 } // namespace Tempus
195 
196 #endif // Tempus_StepperStaggeredForwardSensitivity_decl_hpp
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > >=Teuchos::null)
Set Observer.
virtual Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > getSolver() const
Get solver.
virtual Scalar getInitTimeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &) const
virtual Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > getModel()
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &)
Set the initial conditions and make them consistent.
A stepper implementing staggered forward sensitivity analysis.
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > combined_fsa_model_
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
Thyra Base interface for time steppers.
virtual void setModel(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &appModel)
Teuchos::RCP< Teuchos::ParameterList > getDefaultParameters() const
Teuchos::RCP< SensitivityModelEvaluatorBase< Scalar > > fsa_model_
virtual Teuchos::RCP< const Teuchos::ParameterList > getParameterList() const
StepperObserver class for Stepper class.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Stepper integrates first-order ODEs.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
virtual Teuchos::RCP< StepperObserver< Scalar > > getObserver() const
Get Observer.
void setParams(const Teuchos::RCP< Teuchos::ParameterList > &pl, const Teuchos::RCP< Teuchos::ParameterList > &spl)
virtual void setInitialGuess(Teuchos::RCP< const Thyra::VectorBase< Scalar > >)
Pass initial guess to Newton solver.
virtual void setSolver(Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > solver=Teuchos::null)
Set solver.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl)
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const