Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_IntegratorAdjointSensitivity_decl.hpp
Go to the documentation of this file.
1//@HEADER
2// *****************************************************************************
3// Tempus: Time Integration and Sensitivity Analysis Package
4//
5// Copyright 2017 NTESS and the Tempus contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8//@HEADER
9
10#ifndef Tempus_IntegratorAdjointSensitivity_decl_hpp
11#define Tempus_IntegratorAdjointSensitivity_decl_hpp
12
13#include <vector>
14
15// Tempus
16#include "Tempus_config.hpp"
17#include "Tempus_IntegratorBasic.hpp"
18#include "Tempus_AdjointAuxSensitivityModelEvaluator.hpp"
22
23#include "Tempus_StepperStaggeredForwardSensitivity.hpp" // For SensitivityStepMode
24
25namespace Tempus {
26
106template <class Scalar>
107class IntegratorAdjointSensitivity : virtual public Tempus::Integrator<Scalar> {
108 public:
172
180 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
181 const Teuchos::RCP<IntegratorBasic<Scalar>> &state_integrator,
182 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &adjoint_model,
184 &adjoint_aux_model,
185 const Teuchos::RCP<IntegratorBasic<Scalar>> &adjoint_integrator,
186 const Teuchos::RCP<SolutionHistory<Scalar>> &solution_history,
187 const int p_index, const int g_index, const bool g_depends_on_p,
188 const bool f_depends_on_p, const bool ic_depends_on_p,
189 const bool mass_matrix_is_identity,
191 const std::vector<Scalar> &response_times = std::vector<Scalar>(),
192 const Teuchos::RCP<const DAEStructure<Scalar>> &dae_structure =
193 Teuchos::null,
194 const Teuchos::RCP<const Teuchos::ParameterList> &dae_jump_solver_pl =
195 Teuchos::null);
196
200
203
205
206
208 virtual bool advanceTime();
210 virtual bool advanceTime(const Scalar timeFinal) override;
212 virtual Scalar getTime() const override;
214 virtual int getIndex() const override;
216 virtual Status getStatus() const override;
218 virtual void setStatus(const Status st) override;
220 virtual Teuchos::RCP<Stepper<Scalar>> getStepper() const override;
222 virtual Teuchos::RCP<const SolutionHistory<Scalar>> getSolutionHistory()
223 const override;
224 Teuchos::RCP<const SolutionHistory<Scalar>> getStateSolutionHistory() const;
225 Teuchos::RCP<const SolutionHistory<Scalar>> getSensSolutionHistory() const;
227 virtual Teuchos::RCP<SolutionHistory<Scalar>> getNonConstSolutionHistory()
228 override;
230 virtual Teuchos::RCP<const TimeStepControl<Scalar>> getTimeStepControl()
231 const override;
232 virtual Teuchos::RCP<TimeStepControl<Scalar>> getNonConstTimeStepControl()
233 override;
234 Teuchos::RCP<TimeStepControl<Scalar>> getStateNonConstTimeStepControl();
235 Teuchos::RCP<TimeStepControl<Scalar>> getSensNonConstTimeStepControl();
237 virtual Teuchos::RCP<Teuchos::Time> getIntegratorTimer() const override
238 {
239 return state_integrator_->getIntegratorTimer();
240 }
241 virtual Teuchos::RCP<Teuchos::Time> getStepperTimer() const override
242 {
243 return state_integrator_->getStepperTimer();
244 }
245
247
249 virtual void initializeSolutionHistory(
250 Scalar t0, Teuchos::RCP<const Thyra::VectorBase<Scalar>> x0,
251 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdot0 = Teuchos::null,
252 Teuchos::RCP<const Thyra::VectorBase<Scalar>> xdotdot0 = Teuchos::null,
253 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxDp0 = Teuchos::null,
254 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotDp0 =
255 Teuchos::null,
256 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> DxdotdotDp0 =
257 Teuchos::null);
258
260 virtual Teuchos::RCP<IntegratorObserver<Scalar>> getObserver();
262 virtual void setObserver(
263 Teuchos::RCP<IntegratorObserver<Scalar>> obs = Teuchos::null);
265 virtual void initialize();
266
268 virtual Teuchos::RCP<const Thyra::VectorBase<Scalar>> getX() const;
270 virtual Teuchos::RCP<const Thyra::VectorBase<Scalar>> getXDot() const;
272 virtual Teuchos::RCP<const Thyra::VectorBase<Scalar>> getXDotDot() const;
273
275 virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> getY() const;
277 virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> getYDot() const;
279 virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> getYDotDot() const;
280
282 virtual Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> getDgDp() const;
283
284 Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> getAdjointModel() const
285 {
286 return adjoint_model_;
287 };
288
290 Teuchos::RCP<const DAEStructure<Scalar>> getDAEStructure() const
291 {
292 return dae_structure_;
293 }
294
296
297 std::string description() const override;
298 void describe(Teuchos::FancyOStream &out,
299 const Teuchos::EVerbosityLevel verbLevel) const override;
301
304
305 protected:
306 // Create sensitivity model evaluator from application model
307 Teuchos::RCP<AdjointAuxSensitivityModelEvaluator<Scalar>> createAdjointModel(
308 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
309 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &adjoint_model,
310 const Teuchos::RCP<Teuchos::ParameterList> &inputPL);
311
313 const Teuchos::RCP<const SolutionHistory<Scalar>> &state_solution_history,
314 const Teuchos::RCP<const SolutionHistory<Scalar>>
315 &adjoint_solution_history);
316
318 Teuchos::RCP<Thyra::LinearOpWithSolveBase<Scalar>>
320 const Thyra::ModelEvaluatorBase::InArgs<Scalar> &inArgs) const;
321
323 Teuchos::RCP<const SolutionState<Scalar>> findForwardState(
324 const SolutionHistory<Scalar> &state_solution_history, const Scalar t,
325 const Scalar tol) const;
326
332 bool integrateAdjoint(const Scalar tau_begin, const Scalar tau_end,
333 Thyra::VectorBase<Scalar> &adjoint_state, int &index);
334
337 void appendAdjointSolutionHistory(const Scalar tol);
338
339 Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> model_;
340 Teuchos::RCP<IntegratorBasic<Scalar>> state_integrator_;
341 Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> adjoint_model_;
342 Teuchos::RCP<AdjointAuxSensitivityModelEvaluator<Scalar>> adjoint_aux_model_;
343 Teuchos::RCP<IntegratorBasic<Scalar>> adjoint_integrator_;
344 Teuchos::RCP<SolutionHistory<Scalar>> solutionHistory_;
352 std::vector<Scalar> response_times_;
355 Teuchos::RCP<SolutionHistory<Scalar>> adjoint_solution_history_;
356 Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>> dxdp_init_;
357 Teuchos::RCP<Thyra::MultiVectorBase<Scalar>> dgdp_;
360 Teuchos::RCP<const DAEStructure<Scalar>> dae_structure_;
362 Teuchos::RCP<const AdjointDAEJumpSolver<Scalar>> dae_jump_solver_;
364 Teuchos::RCP<Thyra::LinearOpBase<Scalar>> dfdp_op_;
365 Teuchos::RCP<Thyra::MultiVectorBase<Scalar>> dfdp_mv_;
366};
367
369
385template <class Scalar>
386Teuchos::RCP<IntegratorAdjointSensitivity<Scalar>>
388 Teuchos::RCP<Teuchos::ParameterList> pList,
389 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &model,
390 const Teuchos::RCP<Thyra::ModelEvaluator<Scalar>> &adjoint_model =
391 Teuchos::null);
392
394template <class Scalar>
395Teuchos::RCP<IntegratorAdjointSensitivity<Scalar>>
397
398} // namespace Tempus
399
400#endif // Tempus_IntegratorAdjointSensitivity_decl_hpp
ModelEvaluator for forming adjoint sensitivity equations.
Structure of an index-1 differential-algebraic system.
Teuchos::RCP< const SolutionHistory< Scalar > > getSensSolutionHistory() const
virtual Teuchos::RCP< SolutionHistory< Scalar > > getNonConstSolutionHistory() override
Get the SolutionHistory.
virtual Teuchos::RCP< Teuchos::Time > getStepperTimer() const override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDot() const
Get the current time derivative of the adjoint solution, ydot.
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get the current second time derivative of the solution, xdotdot.
virtual Scalar getTime() const override
Get current time.
virtual int getIndex() const override
Get current index.
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
void buildSolutionHistory(const Teuchos::RCP< const SolutionHistory< Scalar > > &state_solution_history, const Teuchos::RCP< const SolutionHistory< Scalar > > &adjoint_solution_history)
Teuchos::RCP< TimeStepControl< Scalar > > getSensNonConstTimeStepControl()
virtual void initialize()
Initializes the Integrator after set* function calls.
IntegratorAdjointSensitivity()
Constructor that requires a subsequent setParameterList, setStepper, and initialize calls.
Teuchos::RCP< Thyra::LinearOpWithSolveBase< Scalar > > createAdjointMassMatrixSolver(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs) const
Solver for df/dx_dot^T, computed with the adjoint model at inArgs.
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > dfdp_op_
df/dp work objects for the algebraic contributions of the jumps
virtual Teuchos::RCP< Teuchos::Time > getIntegratorTimer() const override
Returns the IntegratorTimer_ for this Integrator.
Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > model_
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get the current solution, x.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDotDot() const
Get the current second time derivative of the adjoint solution, ydotdot.
Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > dxdp_init_
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > adjoint_model_
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get the current time derivative of the solution, xdot.
Teuchos::RCP< const AdjointDAEJumpSolver< Scalar > > dae_jump_solver_
Solver of the adjoint jumps of the index-1 DAE (null for an ODE).
virtual void setStatus(const Status st) override
Set Status.
Teuchos::RCP< const SolutionState< Scalar > > findForwardState(const SolutionHistory< Scalar > &state_solution_history, const Scalar t, const Scalar tol) const
Forward state at time t, which must be the time of a stored time step.
Teuchos::RCP< const DAEStructure< Scalar > > getDAEStructure() const
Structure of the index-1 DAE (null for an ODE).
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
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).
bool integrateAdjoint(const Scalar tau_begin, const Scalar tau_end, Thyra::VectorBase< Scalar > &adjoint_state, int &index)
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
IntegratorAdjointSensitivity(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< IntegratorBasic< Scalar > > &state_integrator, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_model, const Teuchos::RCP< AdjointAuxSensitivityModelEvaluator< Scalar > > &adjoint_aux_model, const Teuchos::RCP< IntegratorBasic< Scalar > > &adjoint_integrator, const Teuchos::RCP< SolutionHistory< Scalar > > &solution_history, const int p_index, const int g_index, const bool g_depends_on_p, const bool f_depends_on_p, const bool ic_depends_on_p, const bool mass_matrix_is_identity, const AdjointResponseType response_type=AdjointResponseType::FinalTime, const std::vector< Scalar > &response_times=std::vector< Scalar >(), const Teuchos::RCP< const DAEStructure< Scalar > > &dae_structure=Teuchos::null, const Teuchos::RCP< const Teuchos::ParameterList > &dae_jump_solver_pl=Teuchos::null)
Full Constructor with model, and will be fully initialized.
Teuchos::RCP< Thyra::MultiVectorBase< Scalar > > dgdp_
Teuchos::RCP< const SolutionHistory< Scalar > > getStateSolutionHistory() const
Teuchos::RCP< IntegratorBasic< Scalar > > adjoint_integrator_
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return adjoint sensitivity stored in gradient format.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getY() const
Get the current adjoint solution, y.
Teuchos::RCP< SolutionHistory< Scalar > > adjoint_solution_history_
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > getAdjointModel() const
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory_
Teuchos::RCP< IntegratorBasic< Scalar > > state_integrator_
Teuchos::RCP< TimeStepControl< Scalar > > getStateNonConstTimeStepControl()
Teuchos::RCP< AdjointAuxSensitivityModelEvaluator< Scalar > > createAdjointModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_model, const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
Teuchos::RCP< const DAEStructure< Scalar > > dae_structure_
Structure of the index-1 DAE (null for an ODE).
Teuchos::RCP< AdjointAuxSensitivityModelEvaluator< Scalar > > adjoint_aux_model_
Teuchos::RCP< Thyra::MultiVectorBase< Scalar > > dfdp_mv_
Thyra Base interface for time integrators. Time integrators are designed to advance the solution from...
IntegratorObserver class for time integrators.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Status
Status for the Integrator, the Stepper and the SolutionState.
AdjointResponseType
Type of response for transient adjoint sensitivities.
Teuchos::RCP< IntegratorAdjointSensitivity< Scalar > > createIntegratorAdjointSensitivity()
Nonmember constructor.