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"
19 template <
class Scalar>
25 adjoint_residual_model,
29 adjoint_residual_model_ = adjoint_residual_model;
30 adjoint_solve_model_ = adjoint_solve_model;
31 state_integrator_ = createIntegratorBasic<Scalar>(inputPL, model_);
32 sens_model_ = createSensitivityModel(model_, adjoint_residual_model_,
33 adjoint_solve_model_, inputPL);
34 sens_integrator_ = createIntegratorBasic<Scalar>(inputPL, sens_model_);
36 do_forward_integration_ =
true;
37 do_adjoint_integration_ =
true;
40 template <
class Scalar>
45 adjoint_residual_model,
47 std::string stepperType)
50 adjoint_residual_model_ = adjoint_residual_model;
51 adjoint_solve_model_ = adjoint_solve_model;
52 state_integrator_ = createIntegratorBasic<Scalar>(model_, stepperType);
53 sens_model_ = createSensitivityModel(model_, adjoint_residual_model_,
54 adjoint_solve_model_, Teuchos::null);
55 sens_integrator_ = createIntegratorBasic<Scalar>(sens_model_, stepperType);
57 do_forward_integration_ =
true;
58 do_adjoint_integration_ =
true;
61 template <
class Scalar>
67 : IntegratorPseudoTransientAdjointSensitivity(inputPL, model, adjoint_model,
72 template <
class Scalar>
77 std::string stepperType)
78 : IntegratorPseudoTransientAdjointSensitivity(model, adjoint_model,
79 adjoint_model, stepperType)
83 template <
class Scalar>
88 : IntegratorPseudoTransientAdjointSensitivity(
93 template <
class Scalar>
97 std::string stepperType)
98 : IntegratorPseudoTransientAdjointSensitivity(
103 template <
class Scalar>
104 IntegratorPseudoTransientAdjointSensitivity<
107 state_integrator_ = createIntegratorBasic<Scalar>();
108 sens_integrator_ = createIntegratorBasic<Scalar>();
112 template <
class Scalar>
115 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
116 return advanceTime(tfinal);
119 template <
class Scalar>
121 const Scalar timeFinal)
123 TEMPUS_FUNC_TIME_MONITOR_DIFF(
124 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime()",
131 bool state_status =
true;
132 if (do_forward_integration_) {
133 TEMPUS_FUNC_TIME_MONITOR_DIFF(
134 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
140 state_status = state_integrator_->advanceTime(timeFinal);
143 bool sens_status =
true;
144 if (do_adjoint_integration_) {
145 TEMPUS_FUNC_TIME_MONITOR_DIFF(
146 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
154 sens_model_->setFinalTime(state_integrator_->getTime());
157 sens_model_->setForwardSolutionHistory(
158 state_integrator_->getSolutionHistory());
162 sens_status = sens_integrator_->advanceTime(timeFinal);
166 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
167 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
168 inargs.set_t(sens_integrator_->getTime());
169 inargs.set_x(sens_integrator_->getX());
170 if (inargs.supports(MEB::IN_ARG_x_dot))
171 inargs.set_x_dot(sens_integrator_->getXDot());
172 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
173 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
174 RCP<VectorBase<Scalar>> G = dgdp_;
175 if (G == Teuchos::null) {
176 G = Thyra::createMember(sens_model_->get_g_space(0));
177 dgdp_ = Teuchos::rcp_dynamic_cast<
DMVPV>(G);
179 if (g_ == Teuchos::null)
180 g_ = Thyra::createMember(sens_model_->get_g_space(1));
182 outargs.set_g(1, g_);
183 sens_model_->evalModel(inargs, outargs);
185 buildSolutionHistory();
188 return state_status && sens_status;
191 template <
class Scalar>
194 return solutionHistory_->getCurrentTime();
197 template <
class Scalar>
200 return solutionHistory_->getCurrentIndex();
203 template <
class Scalar>
206 Status state_status = state_integrator_->getStatus();
207 Status sens_status = sens_integrator_->getStatus();
213 template <
class Scalar>
217 state_integrator_->setStatus(st);
218 sens_integrator_->setStatus(st);
221 template <
class Scalar>
225 return state_integrator_->getStepper();
228 template <
class Scalar>
232 return state_integrator_->getStepper();
235 template <
class Scalar>
239 return sens_integrator_->getStepper();
242 template <
class Scalar>
246 return solutionHistory_;
249 template <
class Scalar>
254 return state_integrator_->getSolutionHistory();
257 template <
class Scalar>
262 return sens_integrator_->getSolutionHistory();
265 template <
class Scalar>
268 Scalar>::getNonConstSolutionHistory()
270 return solutionHistory_;
273 template <
class Scalar>
277 return state_integrator_->getTimeStepControl();
280 template <
class Scalar>
283 Scalar>::getNonConstTimeStepControl()
288 template <
class Scalar>
291 Scalar>::getStateNonConstTimeStepControl()
296 template <
class Scalar>
299 Scalar>::getSensNonConstTimeStepControl()
304 template <
class Scalar>
308 return state_integrator_->getObserver();
311 template <
class Scalar>
315 state_integrator_->setObserver(obs);
316 sens_integrator_->setObserver(obs);
319 template <
class Scalar>
330 using Teuchos::rcp_dynamic_cast;
332 using Thyra::createMember;
338 RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
339 RCP<DMVPV> Y = rcp_dynamic_cast<
DMVPV>(createMember(space));
340 RCP<DMVPV> Ydot = rcp_dynamic_cast<
DMVPV>(createMember(space));
341 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<
DMVPV>(createMember(space));
345 if (y0 == Teuchos::null)
346 assign(Y->getNonconstMultiVector().ptr(), zero);
348 assign(Y->getNonconstMultiVector().ptr(), *y0);
351 if (ydot0 == Teuchos::null)
352 assign(Ydot->getNonconstMultiVector().ptr(), zero);
354 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
357 if (ydotdot0 == Teuchos::null)
358 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
360 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
362 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
363 sens_integrator_->initializeSolutionHistory(t0, Y, Ydot, Ydotdot);
366 template <
class Scalar>
370 return state_integrator_->getX();
373 template <
class Scalar>
377 return state_integrator_->getXDot();
380 template <
class Scalar>
384 return state_integrator_->getXDotDot();
387 template <
class Scalar>
392 using Teuchos::rcp_dynamic_cast;
393 RCP<const DMVPV> mvpv =
394 rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getX());
398 template <
class Scalar>
403 using Teuchos::rcp_dynamic_cast;
404 RCP<const DMVPV> mvpv =
405 rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getXDot());
409 template <
class Scalar>
414 using Teuchos::rcp_dynamic_cast;
415 RCP<const DMVPV> mvpv =
416 rcp_dynamic_cast<
const DMVPV>(sens_integrator_->getXDotDot());
420 template <
class Scalar>
427 template <
class Scalar>
431 return dgdp_->getMultiVector();
434 template <
class Scalar>
438 std::string name =
"Tempus::IntegratorPseudoTransientAdjointSensitivity";
442 template <
class Scalar>
446 auto l_out = Teuchos::fancyOStream(out.
getOStream());
448 l_out->setOutputToRootOnly(0);
450 *l_out << description() <<
"::describe" << std::endl;
451 state_integrator_->describe(*l_out, verbLevel);
452 sens_integrator_->describe(*l_out, verbLevel);
455 template <
class Scalar>
463 state_integrator_->getStepper()->getModel());
464 auto tmp_state_integrator = createIntegratorBasic<Scalar>(inputPL, model);
465 state_integrator_->copy(tmp_state_integrator);
468 sens_integrator_->getStepper()->getModel());
469 auto tmp_sens_integrator = createIntegratorBasic<Scalar>(inputPL, model);
470 sens_integrator_->copy(tmp_sens_integrator);
473 template <
class Scalar>
480 auto tmp_state_integrator = createIntegratorBasic<Scalar>();
481 auto model = state_integrator_->getStepper()->getModel();
482 tmp_state_integrator->setModel(model);
483 state_integrator_->copy(tmp_state_integrator);
485 auto tmp_sens_integrator = createIntegratorBasic<Scalar>();
486 model = sens_integrator_->getStepper()->getModel();
487 tmp_sens_integrator->setModel(model);
488 sens_integrator_->copy(tmp_sens_integrator);
491 sens_integrator_->getValidParameters());
495 template <
class Scalar>
502 state_integrator_->getValidParameters();
511 template <
class Scalar>
516 state_integrator_->getValidParameters());
520 template <
class Scalar>
527 template <
class Scalar>
538 if (inputPL != Teuchos::null) {
539 *pl = inputPL->
sublist(
"Sensitivities");
541 const Scalar tinit = state_integrator_->getTimeStepControl()->getInitTime();
542 const Scalar tfinal = state_integrator_->getTimeStepControl()->getFinalTime();
544 model, adjoint_residual_model, adjoint_solve_model_, tinit, tfinal,
true,
548 template <
class Scalar>
554 using Teuchos::rcp_dynamic_cast;
556 using Thyra::defaultProductVector;
565 state_integrator_->getSolutionHistory()->getValidParameters());
566 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
568 RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
569 RCP<const VectorSpaceBase<Scalar>> adjoint_space = sens_model_->get_x_space();
572 spaces[1] = adjoint_space;
573 RCP<const DPVS> prod_space = Thyra::productVectorSpace(spaces());
576 RCP<const SolutionHistory<Scalar>> state_solution_history =
577 state_integrator_->getSolutionHistory();
578 int num_states = state_solution_history->getNumStates();
579 for (
int i = 0; i < num_states; ++i) {
580 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
583 RCP<DPV> x = defaultProductVector(prod_space);
584 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
585 assign(x->getNonconstVectorBlock(1).ptr(), zero);
586 RCP<VectorBase<Scalar>> x_b = x;
589 RCP<VectorBase<Scalar>> x_dot_b;
590 if (state->getXDot() != Teuchos::null) {
591 RCP<DPV> x_dot = defaultProductVector(prod_space);
592 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
593 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
598 RCP<VectorBase<Scalar>> x_dot_dot_b;
599 if (state->getXDotDot() != Teuchos::null) {
600 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
601 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),
602 *(state->getXDotDot()));
603 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
604 x_dot_dot_b = x_dot_dot;
607 RCP<SolutionState<Scalar>> prod_state = state->clone();
608 prod_state->setX(x_b);
609 prod_state->setXDot(x_dot_b);
610 prod_state->setXDotDot(x_dot_dot_b);
611 solutionHistory_->addState(prod_state);
614 RCP<const VectorBase<Scalar>> frozen_x =
615 state_solution_history->getCurrentState()->getX();
616 RCP<const VectorBase<Scalar>> frozen_x_dot =
617 state_solution_history->getCurrentState()->getXDot();
618 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
619 state_solution_history->getCurrentState()->getXDotDot();
620 RCP<const SolutionHistory<Scalar>> sens_solution_history =
621 sens_integrator_->getSolutionHistory();
622 num_states = sens_solution_history->getNumStates();
623 for (
int i = 0; i < num_states; ++i) {
624 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
627 RCP<DPV> x = defaultProductVector(prod_space);
628 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
629 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
630 RCP<VectorBase<Scalar>> x_b = x;
633 RCP<VectorBase<Scalar>> x_dot_b;
634 if (state->getXDot() != Teuchos::null) {
635 RCP<DPV> x_dot = defaultProductVector(prod_space);
636 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
637 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
642 RCP<VectorBase<Scalar>> x_dot_dot_b;
643 if (state->getXDotDot() != Teuchos::null) {
644 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
645 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
646 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),
647 *(state->getXDotDot()));
648 x_dot_dot_b = x_dot_dot;
651 RCP<SolutionState<Scalar>> prod_state = state->clone();
652 prod_state->setX(x_b);
653 prod_state->setXDot(x_dot_b);
654 prod_state->setXDotDot(x_dot_dot_b);
655 solutionHistory_->addState(prod_state,
false);
660 template <
class Scalar>
673 template <
class Scalar>
677 std::string stepperType)
681 model, stepperType));
686 template <
class Scalar>
695 pList, model, adjoint_model));
700 template <
class Scalar>
705 std::string stepperType)
709 model, adjoint_model, stepperType));
714 template <
class Scalar>
724 pList, model, adjoint_residual_model, adjoint_solve_model));
729 template <
class Scalar>
735 std::string stepperType)
739 model, adjoint_residual_model, adjoint_solve_model, stepperType));
744 template <
class Scalar>
754 #endif // Tempus_IntegratorPseudoTransientAdjointSensitivity_impl_hpp
Teuchos::RCP< Stepper< Scalar > > getStateStepper() const
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &pl) override
virtual Scalar getTime() const override
Get current time.
Teuchos::RCP< const SolutionHistory< Scalar > > getStateSolutionHistory() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const override
virtual Teuchos::RCP< IntegratorObserver< Scalar > > getObserver()
Get the Observer.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getY() const
Get the current adjoint solution, y.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDot() const
Get the current time derivative of the solution, xdot.
Teuchos::RCP< Tempus::IntegratorPseudoTransientAdjointSensitivity< Scalar > > integratorPseudoTransientAdjointSensitivity(Teuchos::RCP< Teuchos::ParameterList > pList, const Teuchos::RCP< Thyra::ModelEvaluator< Scalar > > &model)
Nonmember constructor.
Teuchos::RCP< Teuchos::ParameterList > unsetParameterList() override
virtual void setObserver(Teuchos::RCP< IntegratorObserver< Scalar > > obs=Teuchos::null)
Set the Observer.
std::string description() const override
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const override
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getDgDp() const
Return adjoint sensitivity stored in gradient format.
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDot() const
Get the current time derivative of the adjoint solution, ydot.
Time integrator suitable for pseudotransient adjoint sensitivity analysis.
SensitivityStepMode getStepMode() const
What mode the current time integration step is in.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getG() const
Return response function g.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual Teuchos::RCP< TimeStepControl< Scalar > > getNonConstTimeStepControl() override
Status
Status for the Integrator, the Stepper and the SolutionState.
IntegratorObserver class for time integrators.
virtual Teuchos::RCP< const Thyra::VectorBase< Scalar > > getXDotDot() const
Get the current second time derivative of the solution, xdotdot.
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)
RCP< const MultiVectorBase< Scalar > > getMultiVector() const
virtual Teuchos::RCP< const Thyra::MultiVectorBase< Scalar > > getYDotDot() const
Get the current second time derivative of the adjoint solution, ydotdot.
IntegratorPseudoTransientAdjointSensitivity()
Destructor.
Teuchos::RCP< Teuchos::ParameterList > getNonconstParameterList() override
ParameterList & setParameters(const ParameterList &source)
RCP< ImplicitAdjointModelEvaluator< Scalar > > implicitAdjointModelEvaluator(const RCP< const ModelEvaluator< Scalar > > &model)
Teuchos::RCP< Stepper< Scalar > > getSensStepper() const
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
virtual void setStatus(const Status st) override
Set Status.
virtual int getIndex() const override
Get current index.
virtual Teuchos::RCP< Stepper< Scalar > > getStepper() const override
Get the Stepper.
virtual Teuchos::RCP< const SolutionHistory< Scalar > > getSolutionHistory() const override
Get the SolutionHistory.
virtual Teuchos::RCP< const TimeStepControl< Scalar > > getTimeStepControl() const override
Get the TimeStepControl.
ModelEvaluator for forming adjoint sensitivity equations.
Teuchos::RCP< const SolutionHistory< Scalar > > getSensSolutionHistory() const
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
virtual bool advanceTime()
Advance the solution to timeMax, and return true if successful.
void buildSolutionHistory()
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 > > getX() const
Get the current solution, x.
virtual Status getStatus() const override
Get Status.