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 void setNonConstModel(
84  const Teuchos::RCP<Thyra::ModelEvaluator<Scalar> >& appModel);
85  virtual Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> > getModel();
86 
87  virtual void setSolver(
88  Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > solver = Teuchos::null);
89  virtual Teuchos::RCP<Thyra::NonlinearSolverBase<Scalar> > getSolver() const
90  { return stateStepper_->getSolver(); }
91 
92  /// Set Observer
93  virtual void setObserver(
94  Teuchos::RCP<StepperObserver<Scalar> > /* obs */ = Teuchos::null){}
95 
96  virtual Teuchos::RCP<StepperObserver<Scalar> > getObserver() const
97  { return Teuchos::null; }
98 
99  /// Initialize during construction and after changing input parameters.
100  virtual void initialize();
101 
102  /// Set the initial conditions and make them consistent.
103  virtual void setInitialConditions (
104  const Teuchos::RCP<SolutionHistory<Scalar> >& /* solutionHistory */){}
105 
106  /// Take the specified timestep, dt, and return true if successful.
107  virtual void takeStep(
108  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory);
109 
110  /// Get a default (initial) StepperState
111  virtual Teuchos::RCP<Tempus::StepperState<Scalar> >
113  virtual Scalar getOrder() const {return stateStepper_->getOrder();}
114  virtual Scalar getOrderMin() const {return stateStepper_->getOrderMin();}
115  virtual Scalar getOrderMax() const {return stateStepper_->getOrderMax();}
116  virtual Scalar getInitTimeStep(
117  const Teuchos::RCP<SolutionHistory<Scalar> >& /* solutionHistory */) const
118  {return Scalar(1.0e+99);}
119 
120  virtual bool isExplicit() const
121  {return stateStepper_->isExplicit() or sensitivityStepper_->isExplicit();}
122  virtual bool isImplicit() const
123  {return stateStepper_->isImplicit() or sensitivityStepper_->isImplicit();}
124  virtual bool isExplicitImplicit() const
125  {return isExplicit() and isImplicit();}
126 
127  virtual bool isOneStepMethod() const
128  {return stateStepper_->isOneStepMethod() and
129  sensitivityStepper_->isOneStepMethod();}
130  virtual bool isMultiStepMethod() const {return !isOneStepMethod();}
131 
132  virtual OrderODE getOrderODE() const {return FIRST_ORDER_ODE;}
133 
134  virtual void setUseFSAL(bool a) {stepperPL_->set<bool>("Use FSAL", a);}
135  virtual bool getUseFSAL() const
136  {return stepperPL_->get<bool>("Use FSAL", false);}
137 
138  virtual void setICConsistency(std::string s)
139  {stepperPL_->set<std::string>("Initial Condition Consistency", s);}
140  virtual std::string getICConsistency() const
141  {return stepperPL_->get<std::string>("Initial Condition Consistency",
142  "None");}
143 
144  virtual void setICConsistencyCheck(bool c)
145  {stepperPL_->set<bool>("Initial Condition Consistency Check", c);}
146  virtual bool getICConsistencyCheck() const
147  {return stepperPL_->get<bool>("Initial Condition Consistency Check",
148  false);}
149  //@}
150 
151  /// Pass initial guess to Newton solver
152  virtual void setInitialGuess(
153  Teuchos::RCP<const Thyra::VectorBase<Scalar> > /* initial_guess */){}
154 
155  /// \name ParameterList methods
156  //@{
157  void setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & pl);
158  Teuchos::RCP<Teuchos::ParameterList> getNonconstParameterList();
159  Teuchos::RCP<Teuchos::ParameterList> unsetParameterList();
160  Teuchos::RCP<const Teuchos::ParameterList> getValidParameters() const;
161  Teuchos::RCP<Teuchos::ParameterList> getDefaultParameters() const;
162  //@}
163 
164  /// \name Overridden from Teuchos::Describable
165  //@{
166  virtual std::string description() const
167  { return "StepperStaggeredForwardSensitivity"; }
168  virtual void describe(Teuchos::FancyOStream & out,
169  const Teuchos::EVerbosityLevel verbLevel) const;
170  //@}
171 
172  Teuchos::RCP<const Thyra::VectorSpaceBase<Scalar> > get_x_space() const;
173 
174  virtual Teuchos::RCP<const Teuchos::ParameterList> getParameterList() const
175  { return stepperPL_; }
176 
177 private:
178 
179  void setParams(const Teuchos::RCP<Teuchos::ParameterList> & pl,
180  const Teuchos::RCP<Teuchos::ParameterList> & spl);
181 
182 protected:
183 
184  Teuchos::RCP<Teuchos::ParameterList> stepperPL_;
185  Teuchos::RCP<Teuchos::ParameterList> sensPL_;
186  Teuchos::RCP<Stepper<Scalar> > stateStepper_;
187  Teuchos::RCP<Stepper<Scalar> > sensitivityStepper_;
188  Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> > combined_fsa_model_;
189  Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar> > fsa_model_;
190  Teuchos::RCP<SolutionHistory<Scalar> > stateSolutionHistory_;
191  Teuchos::RCP<SolutionHistory<Scalar> > sensSolutionHistory_;
194 
195 };
196 
197 } // namespace Tempus
198 
199 #endif // Tempus_StepperStaggeredForwardSensitivity_decl_hpp
virtual void setObserver(Teuchos::RCP< StepperObserver< Scalar > >=Teuchos::null)
Set Observer.
virtual void initialize()
Initialize during construction and after changing input parameters.
virtual Teuchos::RCP< Thyra::NonlinearSolverBase< Scalar > > getSolver() const
Get solver.
virtual void setNonConstModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &appModel)
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.
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...
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