10#ifndef Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
11#define Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
13#include "Thyra_DefaultMultiVectorProductVector.hpp"
14#include "Thyra_VectorStdOps.hpp"
15#include "Thyra_MultiVectorStdOps.hpp"
22template <
class Scalar>
25 Teuchos::RCP<Teuchos::ParameterList> inputPL,
28 adjoint_residual_model,
44template <
class Scalar>
49 adjoint_residual_model,
51 std::string stepperType)
65template <
class Scalar>
68 Teuchos::RCP<Teuchos::ParameterList> inputPL,
76template <
class Scalar>
81 std::string stepperType)
83 adjoint_model, stepperType)
87template <
class Scalar>
90 Teuchos::RCP<Teuchos::ParameterList> inputPL,
93 inputPL, model,
Thyra::implicitAdjointModelEvaluator(model))
97template <
class Scalar>
101 std::string stepperType)
103 model,
Thyra::implicitAdjointModelEvaluator(model), stepperType)
107template <
class Scalar>
116template <
class Scalar>
123template <
class Scalar>
125 const Scalar timeFinal)
127 TEMPUS_FUNC_TIME_MONITOR_DIFF(
128 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime()",
133 typedef Thyra::ModelEvaluatorBase MEB;
135 bool state_status =
true;
137 TEMPUS_FUNC_TIME_MONITOR_DIFF(
138 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
147 bool sens_status =
true;
149 TEMPUS_FUNC_TIME_MONITOR_DIFF(
150 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
170 MEB::InArgs<Scalar> inargs =
sens_model_->getNominalValues();
171 MEB::OutArgs<Scalar> outargs =
sens_model_->createOutArgs();
174 if (inargs.supports(MEB::IN_ARG_x_dot))
176 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
178 RCP<VectorBase<Scalar>> G =
dgdp_;
179 if (G == Teuchos::null) {
180 G = Thyra::createMember(
sens_model_->get_g_space(0));
181 dgdp_ = Teuchos::rcp_dynamic_cast<DMVPV>(G);
183 if (
g_ == Teuchos::null)
186 outargs.set_g(1,
g_);
192 return state_status && sens_status;
195template <
class Scalar>
201template <
class Scalar>
207template <
class Scalar>
217template <
class Scalar>
225template <
class Scalar>
226Teuchos::RCP<Stepper<Scalar>>
232template <
class Scalar>
233Teuchos::RCP<Stepper<Scalar>>
239template <
class Scalar>
240Teuchos::RCP<Stepper<Scalar>>
246template <
class Scalar>
247Teuchos::RCP<const SolutionHistory<Scalar>>
253template <
class Scalar>
254Teuchos::RCP<const SolutionHistory<Scalar>>
261template <
class Scalar>
262Teuchos::RCP<const SolutionHistory<Scalar>>
269template <
class Scalar>
270Teuchos::RCP<SolutionHistory<Scalar>>
277template <
class Scalar>
278Teuchos::RCP<const TimeStepControl<Scalar>>
284template <
class Scalar>
285Teuchos::RCP<TimeStepControl<Scalar>>
292template <
class Scalar>
293Teuchos::RCP<TimeStepControl<Scalar>>
300template <
class Scalar>
301Teuchos::RCP<TimeStepControl<Scalar>>
308template <
class Scalar>
309Teuchos::RCP<IntegratorObserver<Scalar>>
315template <
class Scalar>
323template <
class Scalar>
334 using Teuchos::rcp_dynamic_cast;
336 using Thyra::createMember;
337 using Thyra::VectorSpaceBase;
342 RCP<const VectorSpaceBase<Scalar>> space =
sens_model_->get_x_space();
343 RCP<DMVPV> Y = rcp_dynamic_cast<DMVPV>(createMember(space));
344 RCP<DMVPV> Ydot = rcp_dynamic_cast<DMVPV>(createMember(space));
345 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
346 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
349 if (y0 == Teuchos::null)
350 assign(Y->getNonconstMultiVector().ptr(), zero);
352 assign(Y->getNonconstMultiVector().ptr(), *y0);
355 if (ydot0 == Teuchos::null)
356 assign(Ydot->getNonconstMultiVector().ptr(), zero);
358 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
361 if (ydotdot0 == Teuchos::null)
362 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
364 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
370template <
class Scalar>
371Teuchos::RCP<const Thyra::VectorBase<Scalar>>
377template <
class Scalar>
378Teuchos::RCP<const Thyra::VectorBase<Scalar>>
384template <
class Scalar>
385Teuchos::RCP<const Thyra::VectorBase<Scalar>>
391template <
class Scalar>
392Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
396 using Teuchos::rcp_dynamic_cast;
397 RCP<const DMVPV> mvpv =
399 return mvpv->getMultiVector();
402template <
class Scalar>
403Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
407 using Teuchos::rcp_dynamic_cast;
408 RCP<const DMVPV> mvpv =
410 return mvpv->getMultiVector();
413template <
class Scalar>
414Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
418 using Teuchos::rcp_dynamic_cast;
419 RCP<const DMVPV> mvpv =
421 return mvpv->getMultiVector();
424template <
class Scalar>
425Teuchos::RCP<const Thyra::VectorBase<Scalar>>
431template <
class Scalar>
432Teuchos::RCP<const Thyra::MultiVectorBase<Scalar>>
435 return dgdp_->getMultiVector();
438template <
class Scalar>
442 std::string name =
"Tempus::IntegratorPseudoTransientAdjointSensitivity";
446template <
class Scalar>
448 Teuchos::FancyOStream& out,
const Teuchos::EVerbosityLevel verbLevel)
const
450 auto l_out = Teuchos::fancyOStream(out.getOStream());
451 Teuchos::OSTab ostab(*l_out, 2, this->
description());
452 l_out->setOutputToRootOnly(0);
454 *l_out <<
description() <<
"::describe" << std::endl;
459template <
class Scalar>
461 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
466 auto model = Teuchos::rcp_const_cast<Thyra::ModelEvaluator<Scalar>>(
471 model = Teuchos::rcp_const_cast<Thyra::ModelEvaluator<Scalar>>(
473 auto tmp_sens_integrator =
478template <
class Scalar>
479Teuchos::RCP<Teuchos::ParameterList>
481 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
487 if (inputPL == Teuchos::null)
return inputPL;
488 auto adjointPL = Teuchos::rcp(
new Teuchos::ParameterList(*inputPL));
493template <
class Scalar>
494Teuchos::RCP<Teuchos::ParameterList>
502 tmp_state_integrator->setModel(model);
507 tmp_sens_integrator->setModel(model);
510 auto pl = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
515template <
class Scalar>
516Teuchos::RCP<const Teuchos::ParameterList>
519 Teuchos::RCP<Teuchos::ParameterList> pl =
520 Teuchos::rcp(
new Teuchos::ParameterList);
521 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
523 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
525 pl->setParameters(*integrator_pl);
526 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
531template <
class Scalar>
532Teuchos::RCP<Teuchos::ParameterList>
535 auto pl = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
540template <
class Scalar>
547template <
class Scalar>
548Teuchos::RCP<AdjointSensitivityModelEvaluator<Scalar>>
553 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
557 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
558 if (inputPL != Teuchos::null) {
559 *pl = inputPL->sublist(
"Sensitivities");
568template <
class Scalar>
571 using Teuchos::ParameterList;
574 using Teuchos::rcp_dynamic_cast;
576 using Thyra::defaultProductVector;
578 using Thyra::VectorSpaceBase;
579 typedef Thyra::DefaultProductVector<Scalar> DPV;
580 typedef Thyra::DefaultProductVectorSpace<Scalar> DPVS;
584 auto shPL = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
588 RCP<const VectorSpaceBase<Scalar>> x_space =
model_->get_x_space();
589 RCP<const VectorSpaceBase<Scalar>> adjoint_space =
sens_model_->get_x_space();
590 Teuchos::Array<RCP<const VectorSpaceBase<Scalar>>> spaces(2);
592 spaces[1] = adjoint_space;
593 RCP<const DPVS> prod_space = Thyra::productVectorSpace(spaces());
594 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
596 RCP<const SolutionHistory<Scalar>> state_solution_history =
598 int num_states = state_solution_history->getNumStates();
599 for (
int i = 0; i < num_states; ++i) {
600 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
603 RCP<DPV> x = defaultProductVector(prod_space);
604 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
605 assign(x->getNonconstVectorBlock(1).ptr(), zero);
606 RCP<VectorBase<Scalar>> x_b = x;
609 RCP<VectorBase<Scalar>> x_dot_b;
610 if (state->getXDot() != Teuchos::null) {
611 RCP<DPV> x_dot = defaultProductVector(prod_space);
612 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
613 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
618 RCP<VectorBase<Scalar>> x_dot_dot_b;
619 if (state->getXDotDot() != Teuchos::null) {
620 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
621 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),
622 *(state->getXDotDot()));
623 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
624 x_dot_dot_b = x_dot_dot;
627 RCP<SolutionState<Scalar>> prod_state = state->clone();
628 prod_state->setX(x_b);
629 prod_state->setXDot(x_dot_b);
630 prod_state->setXDotDot(x_dot_dot_b);
634 RCP<const VectorBase<Scalar>> frozen_x =
635 state_solution_history->getCurrentState()->getX();
636 RCP<const VectorBase<Scalar>> frozen_x_dot =
637 state_solution_history->getCurrentState()->getXDot();
638 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
639 state_solution_history->getCurrentState()->getXDotDot();
640 RCP<const SolutionHistory<Scalar>> sens_solution_history =
642 num_states = sens_solution_history->getNumStates();
643 for (
int i = 0; i < num_states; ++i) {
644 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
647 RCP<DPV> x = defaultProductVector(prod_space);
648 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
649 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
650 RCP<VectorBase<Scalar>> x_b = x;
653 RCP<VectorBase<Scalar>> x_dot_b;
654 if (state->getXDot() != Teuchos::null) {
655 RCP<DPV> x_dot = defaultProductVector(prod_space);
656 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
657 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
662 RCP<VectorBase<Scalar>> x_dot_dot_b;
663 if (state->getXDotDot() != Teuchos::null) {
664 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
665 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
666 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),
667 *(state->getXDotDot()));
668 x_dot_dot_b = x_dot_dot;
671 RCP<SolutionState<Scalar>> prod_state = state->clone();
672 prod_state->setX(x_b);
673 prod_state->setXDot(x_dot_b);
674 prod_state->setXDotDot(x_dot_dot_b);
680template <
class Scalar>
681Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
683 Teuchos::RCP<Teuchos::ParameterList> pList,
686 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
693template <
class Scalar>
694Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
697 std::string stepperType)
699 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
701 model, stepperType));
706template <
class Scalar>
707Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
709 Teuchos::RCP<Teuchos::ParameterList> pList,
713 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
715 pList, model, adjoint_model));
720template <
class Scalar>
721Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
725 std::string stepperType)
727 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
729 model, adjoint_model, stepperType));
734template <
class Scalar>
735Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
737 Teuchos::RCP<Teuchos::ParameterList> pList,
742 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
744 pList, model, adjoint_residual_model, adjoint_solve_model));
749template <
class Scalar>
750Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
755 std::string stepperType)
757 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
759 model, adjoint_residual_model, adjoint_solve_model, stepperType));
764template <
class Scalar>
765Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>>
768 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar>> integrator =
ModelEvaluator for forming adjoint sensitivity equations.
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
IntegratorObserver class for time integrators.
Time integrator suitable for pseudotransient adjoint sensitivity analysis.
virtual Teuchos::RCP< SolutionHistory< Scalar > > getNonConstSolutionHistory() override
Get the SolutionHistory.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getY() const
Get the current adjoint solution, y.
Teuchos::RCP< Stepper< Scalar > > getSensStepper() const
virtual Scalar getTime() const override
Get current time.
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
IntegratorPseudoTransientAdjointSensitivity()
Destructor.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDot() const
Get the current time derivative of the adjoint solution, ydot.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList() override
SensitivityStepMode stepMode_
Teuchos::RCP< AdjointSensitivityModelEvaluator< Scalar > > createSensitivityModel(const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_residual_model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_solve_model, const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get the current second time derivative of the solution, xdotdot.
Teuchos::RCP< const SolutionHistory< Scalar > > getSensSolutionHistory() const
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
Teuchos::RCP< IntegratorBasic< Scalar > > state_integrator_
Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > adjoint_residual_model_
Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > model_
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
bool do_adjoint_integration_
Teuchos::RCP< IntegratorBasic< Scalar > > sens_integrator_
Teuchos::RCP< Thyra::VectorBase< Scalar > > g_
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList() override
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
Teuchos::RCP< Stepper< Scalar > > getStateStepper() const
IntegratorPseudoTransientAdjointSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_residual_model, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &adjoint_solve_model)
Constructor with ParameterList and model, and will be fully initialized.
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 > > y0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > ydot0=Teuchos::null, Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > ydotdot0=Teuchos::null)
Set the initial state from Thyra::VectorBase(s).
Teuchos::RCP< DMVPV > dgdp_
Teuchos::RCP< TimeStepControl< Scalar > > getSensNonConstTimeStepControl()
bool do_forward_integration_
Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > adjoint_solve_model_
Teuchos::RCP< TimeStepControl< Scalar > > getStateNonConstTimeStepControl()
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get the current time derivative of the solution, xdot.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl) override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return adjoint sensitivity stored in gradient format.
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getX() const
Get the current solution, x.
Teuchos::RCP< AdjointSensitivityModelEvaluator< Scalar > > sens_model_
void buildSolutionHistory()
virtual Status getStatus() const override
Get Status.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDotDot() const
Get the current second time derivative of the adjoint solution, ydotdot.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
Teuchos::RCP< SolutionHistory< Scalar > > solutionHistory_
static Teuchos::RCP< Teuchos::ParameterList > adjointParameters(const Teuchos::RCP< Teuchos::ParameterList > &inputPL)
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
virtual void setStatus(const Status st) override
Set Status.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
Teuchos::RCP< const SolutionHistory< Scalar > > getStateSolutionHistory() const
virtual int getIndex() const override
Get current index.
std::string description() const override
Status
Status for the Integrator, the Stepper and the SolutionState.
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryPL(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember constructor from a ParameterList.
Teuchos::RCP< IntegratorBasic< Scalar > > createIntegratorBasic()
Nonmember constructor.
void removeIntegratorSolverObjects(Teuchos::ParameterList &tempusPL)
Same as removeStepperSolverObjects, for the stepper of the integrator selected by Tempus parameters (...
Teuchos::RCP< Tempus::IntegratorPseudoTransientAdjointSensitivity< Scalar > > integratorPseudoTransientAdjointSensitivity()
Nonmember constructor.