9#ifndef Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
10#define Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
12#include "Thyra_DefaultMultiVectorProductVector.hpp"
13#include "Thyra_VectorStdOps.hpp"
14#include "Thyra_MultiVectorStdOps.hpp"
23 Teuchos::RCP<Teuchos::ParameterList> inputPL,
46 std::string stepperType)
63 Teuchos::RCP<Teuchos::ParameterList> inputPL,
67 inputPL, model, adjoint_model, adjoint_model)
76 std::string stepperType) :
78 model, adjoint_model, adjoint_model, stepperType)
85 Teuchos::RCP<Teuchos::ParameterList> inputPL,
88 inputPL, model,
Thyra::implicitAdjointModelEvaluator(model))
96 std::string stepperType) :
98 model,
Thyra::implicitAdjointModelEvaluator(model), stepperType)
102template<
class Scalar>
111template<
class Scalar>
116 const Scalar tfinal =
121template<
class Scalar>
126 TEMPUS_FUNC_TIME_MONITOR_DIFF(
"Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime()", TEMPUS_PTAS_AT);
130 typedef Thyra::ModelEvaluatorBase MEB;
132 bool state_status =
true;
134 TEMPUS_FUNC_TIME_MONITOR_DIFF(
"Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::state", TEMPUS_PTAS_AT_FWD);
141 bool sens_status =
true;
143 TEMPUS_FUNC_TIME_MONITOR_DIFF(
"Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::adjoint", TEMPUS_PTAS_AT_ADJ);
161 MEB::InArgs<Scalar> inargs =
sens_model_->getNominalValues();
162 MEB::OutArgs<Scalar> outargs =
sens_model_->createOutArgs();
165 if (inargs.supports(MEB::IN_ARG_x_dot))
167 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
169 RCP<VectorBase<Scalar> > G =
dgdp_;
170 if (G == Teuchos::null) {
171 G = Thyra::createMember(
sens_model_->get_g_space(0));
172 dgdp_ = Teuchos::rcp_dynamic_cast<DMVPV>(G);
174 if (
g_ == Teuchos::null)
177 outargs.set_g(1,
g_);
183 return state_status && sens_status;
186template<
class Scalar>
194template<
class Scalar>
202template<
class Scalar>
216template <
class Scalar>
223template<
class Scalar>
224Teuchos::RCP<Stepper<Scalar> >
231template<
class Scalar>
232Teuchos::RCP<Stepper<Scalar> >
239template<
class Scalar>
240Teuchos::RCP<Stepper<Scalar> >
247template<
class Scalar>
248Teuchos::RCP<const SolutionHistory<Scalar> >
255template<
class Scalar>
256Teuchos::RCP<const SolutionHistory<Scalar> >
263template<
class Scalar>
264Teuchos::RCP<const SolutionHistory<Scalar> >
271template<
class Scalar>
272Teuchos::RCP<SolutionHistory<Scalar> >
279template<
class Scalar>
280Teuchos::RCP<const TimeStepControl<Scalar> >
287template<
class Scalar>
288Teuchos::RCP<TimeStepControl<Scalar> >
295template<
class Scalar>
296Teuchos::RCP<TimeStepControl<Scalar> >
303template<
class Scalar>
304Teuchos::RCP<TimeStepControl<Scalar> >
311template<
class Scalar>
312Teuchos::RCP<IntegratorObserver<Scalar> >
319template<
class Scalar>
328template<
class Scalar>
339 using Teuchos::rcp_dynamic_cast;
340 using Thyra::VectorSpaceBase;
342 using Thyra::createMember;
347 RCP< const VectorSpaceBase<Scalar> > space =
sens_model_->get_x_space();
348 RCP<DMVPV> Y = rcp_dynamic_cast<DMVPV>(createMember(space));
349 RCP<DMVPV> Ydot = rcp_dynamic_cast<DMVPV>(createMember(space));
350 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
351 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
354 if (y0 == Teuchos::null)
355 assign(Y->getNonconstMultiVector().ptr(), zero);
357 assign(Y->getNonconstMultiVector().ptr(), *y0);
360 if (ydot0 == Teuchos::null)
361 assign(Ydot->getNonconstMultiVector().ptr(), zero);
363 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
366 if (ydotdot0 == Teuchos::null)
367 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
369 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
375template<
class Scalar>
376Teuchos::RCP<const Thyra::VectorBase<Scalar> >
383template<
class Scalar>
384Teuchos::RCP<const Thyra::VectorBase<Scalar> >
391template<
class Scalar>
392Teuchos::RCP<const Thyra::VectorBase<Scalar> >
399template<
class Scalar>
400Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
405 using Teuchos::rcp_dynamic_cast;
406 RCP<const DMVPV> mvpv =
408 return mvpv->getMultiVector();
411template<
class Scalar>
412Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
417 using Teuchos::rcp_dynamic_cast;
418 RCP<const DMVPV> mvpv =
420 return mvpv->getMultiVector();
423template<
class Scalar>
424Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
429 using Teuchos::rcp_dynamic_cast;
430 RCP<const DMVPV> mvpv =
432 return mvpv->getMultiVector();
435template<
class Scalar>
436Teuchos::RCP<const Thyra::VectorBase<Scalar> >
443template<
class Scalar>
444Teuchos::RCP<const Thyra::MultiVectorBase<Scalar> >
448 return dgdp_->getMultiVector();
451template<
class Scalar>
456 std::string name =
"Tempus::IntegratorPseudoTransientAdjointSensitivity";
460template<
class Scalar>
464 Teuchos::FancyOStream &out,
465 const Teuchos::EVerbosityLevel verbLevel)
const
467 auto l_out = Teuchos::fancyOStream( out.getOStream() );
468 Teuchos::OSTab ostab(*l_out, 2, this->
description());
469 l_out->setOutputToRootOnly(0);
471 *l_out <<
description() <<
"::describe" << std::endl;
476template<
class Scalar>
484 auto model = Teuchos::rcp_const_cast<Thyra::ModelEvaluator<Scalar>> (
489 model = Teuchos::rcp_const_cast<Thyra::ModelEvaluator<Scalar>> (
495template<
class Scalar>
496Teuchos::RCP<Teuchos::ParameterList>
505 tmp_state_integrator->setModel(model);
510 tmp_sens_integrator->setModel(model);
513 auto pl = Teuchos::rcp_const_cast<Teuchos::ParameterList> (
518template<
class Scalar>
519Teuchos::RCP<const Teuchos::ParameterList>
523 Teuchos::RCP<Teuchos::ParameterList> pl =
524 Teuchos::rcp(
new Teuchos::ParameterList);
525 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
527 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
529 pl->setParameters(*integrator_pl);
530 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
535template<
class Scalar>
536Teuchos::RCP<Teuchos::ParameterList>
540 auto pl = Teuchos::rcp_const_cast<Teuchos::ParameterList> (
545template<
class Scalar>
553template <
class Scalar>
554Teuchos::RCP<AdjointSensitivityModelEvaluator<Scalar> >
560 const Teuchos::RCP<Teuchos::ParameterList>& inputPL)
564 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
565 if (inputPL != Teuchos::null) {
566 *pl = inputPL->sublist(
"Sensitivities");
572 tinit, tfinal,
true, pl));
575template<
class Scalar>
582 using Teuchos::rcp_dynamic_cast;
583 using Teuchos::ParameterList;
585 using Thyra::VectorSpaceBase;
587 using Thyra::defaultProductVector;
588 typedef Thyra::DefaultProductVector<Scalar> DPV;
589 typedef Thyra::DefaultProductVectorSpace<Scalar> DPVS;
593 auto shPL = Teuchos::rcp_const_cast<Teuchos::ParameterList> (
597 RCP<const VectorSpaceBase<Scalar> > x_space =
599 RCP<const VectorSpaceBase<Scalar> > adjoint_space =
601 Teuchos::Array< RCP<const VectorSpaceBase<Scalar> > > spaces(2);
603 spaces[1] = adjoint_space;
604 RCP<const DPVS > prod_space = Thyra::productVectorSpace(spaces());
605 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
607 RCP<const SolutionHistory<Scalar> > state_solution_history =
609 int num_states = state_solution_history->getNumStates();
610 for (
int i=0; i<num_states; ++i) {
611 RCP<const SolutionState<Scalar> > state = (*state_solution_history)[i];
614 RCP<DPV> x = defaultProductVector(prod_space);
615 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
616 assign(x->getNonconstVectorBlock(1).ptr(), zero);
617 RCP<VectorBase<Scalar> > x_b = x;
620 RCP<VectorBase<Scalar> > x_dot_b;
621 if (state->getXDot() != Teuchos::null) {
622 RCP<DPV> x_dot = defaultProductVector(prod_space);
623 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
624 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
629 RCP<VectorBase<Scalar> > x_dot_dot_b;
630 if (state->getXDotDot() != Teuchos::null) {
631 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
632 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),*(state->getXDotDot()));
633 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
634 x_dot_dot_b = x_dot_dot;
637 RCP<SolutionState<Scalar> > prod_state = state->clone();
638 prod_state->setX(x_b);
639 prod_state->setXDot(x_dot_b);
640 prod_state->setXDotDot(x_dot_dot_b);
644 RCP<const VectorBase<Scalar> > frozen_x =
645 state_solution_history->getCurrentState()->getX();
646 RCP<const VectorBase<Scalar> > frozen_x_dot =
647 state_solution_history->getCurrentState()->getXDot();
648 RCP<const VectorBase<Scalar> > frozen_x_dot_dot =
649 state_solution_history->getCurrentState()->getXDotDot();
650 RCP<const SolutionHistory<Scalar> > sens_solution_history =
652 num_states = sens_solution_history->getNumStates();
653 for (
int i=0; i<num_states; ++i) {
654 RCP<const SolutionState<Scalar> > state = (*sens_solution_history)[i];
657 RCP<DPV> x = defaultProductVector(prod_space);
658 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
659 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
660 RCP<VectorBase<Scalar> > x_b = x;
663 RCP<VectorBase<Scalar> > x_dot_b;
664 if (state->getXDot() != Teuchos::null) {
665 RCP<DPV> x_dot = defaultProductVector(prod_space);
666 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
667 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
672 RCP<VectorBase<Scalar> > x_dot_dot_b;
673 if (state->getXDotDot() != Teuchos::null) {
674 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
675 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
676 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),*(state->getXDotDot()));
677 x_dot_dot_b = x_dot_dot;
680 RCP<SolutionState<Scalar> > prod_state = state->clone();
681 prod_state->setX(x_b);
682 prod_state->setXDot(x_dot_b);
683 prod_state->setXDotDot(x_dot_dot_b);
689template<
class Scalar>
690Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
692 Teuchos::RCP<Teuchos::ParameterList> pList,
695 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
701template<
class Scalar>
702Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
705 std::string stepperType)
707 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
713template<
class Scalar>
714Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
716 Teuchos::RCP<Teuchos::ParameterList> pList,
720 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
726template<
class Scalar>
727Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
731 std::string stepperType)
733 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
739template<
class Scalar>
740Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
742 Teuchos::RCP<Teuchos::ParameterList> pList,
747 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
753template<
class Scalar>
754Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
759 std::string stepperType)
761 Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> > integrator =
767template<
class Scalar>
768Teuchos::RCP<IntegratorPseudoTransientAdjointSensitivity<Scalar> >
771 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_
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.
Teuchos::RCP< Tempus::IntegratorPseudoTransientAdjointSensitivity< Scalar > > integratorPseudoTransientAdjointSensitivity()
Nonmember constructor.