122 const Scalar timeFinal)
124 TEMPUS_FUNC_TIME_MONITOR_DIFF(
125 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime()",
130 typedef Thyra::ModelEvaluatorBase MEB;
132 bool state_status =
true;
133 if (do_forward_integration_) {
134 TEMPUS_FUNC_TIME_MONITOR_DIFF(
135 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
141 state_status = state_integrator_->advanceTime(timeFinal);
144 bool sens_status =
true;
145 if (do_adjoint_integration_) {
146 TEMPUS_FUNC_TIME_MONITOR_DIFF(
147 "Tempus::IntegratorPseudoTransientAdjointSensitivity::advanceTime::"
155 sens_model_->setFinalTime(state_integrator_->getTime());
158 sens_model_->setForwardSolutionHistory(
159 state_integrator_->getSolutionHistory());
163 sens_status = sens_integrator_->advanceTime(timeFinal);
167 MEB::InArgs<Scalar> inargs = sens_model_->getNominalValues();
168 MEB::OutArgs<Scalar> outargs = sens_model_->createOutArgs();
169 inargs.set_t(sens_integrator_->getTime());
170 inargs.set_x(sens_integrator_->getX());
171 if (inargs.supports(MEB::IN_ARG_x_dot))
172 inargs.set_x_dot(sens_integrator_->getXDot());
173 if (inargs.supports(MEB::IN_ARG_x_dot_dot))
174 inargs.set_x_dot_dot(sens_integrator_->getXDotDot());
175 RCP<VectorBase<Scalar>> G = dgdp_;
176 if (G == Teuchos::null) {
177 G = Thyra::createMember(sens_model_->get_g_space(0));
178 dgdp_ = Teuchos::rcp_dynamic_cast<DMVPV>(G);
180 if (g_ == Teuchos::null)
181 g_ = Thyra::createMember(sens_model_->get_g_space(1));
183 outargs.set_g(1, g_);
184 sens_model_->evalModel(inargs, outargs);
186 buildSolutionHistory();
189 return state_status && sens_status;
331 using Teuchos::rcp_dynamic_cast;
333 using Thyra::createMember;
334 using Thyra::VectorSpaceBase;
339 RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
340 RCP<DMVPV> Y = rcp_dynamic_cast<DMVPV>(createMember(space));
341 RCP<DMVPV> Ydot = rcp_dynamic_cast<DMVPV>(createMember(space));
342 RCP<DMVPV> Ydotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
343 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
346 if (y0 == Teuchos::null)
347 assign(Y->getNonconstMultiVector().ptr(), zero);
349 assign(Y->getNonconstMultiVector().ptr(), *y0);
352 if (ydot0 == Teuchos::null)
353 assign(Ydot->getNonconstMultiVector().ptr(), zero);
355 assign(Ydot->getNonconstMultiVector().ptr(), *ydot0);
358 if (ydotdot0 == Teuchos::null)
359 assign(Ydotdot->getNonconstMultiVector().ptr(), zero);
361 assign(Ydotdot->getNonconstMultiVector().ptr(), *ydotdot0);
363 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
364 sens_integrator_->initializeSolutionHistory(t0, Y, Ydot, Ydotdot);
552 using Teuchos::ParameterList;
555 using Teuchos::rcp_dynamic_cast;
557 using Thyra::defaultProductVector;
559 using Thyra::VectorSpaceBase;
560 typedef Thyra::DefaultProductVector<Scalar> DPV;
561 typedef Thyra::DefaultProductVectorSpace<Scalar> DPVS;
565 auto shPL = Teuchos::rcp_const_cast<Teuchos::ParameterList>(
566 state_integrator_->getSolutionHistory()->getValidParameters());
567 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
569 RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
570 RCP<const VectorSpaceBase<Scalar>> adjoint_space = sens_model_->get_x_space();
571 Teuchos::Array<RCP<const VectorSpaceBase<Scalar>>> spaces(2);
573 spaces[1] = adjoint_space;
574 RCP<const DPVS> prod_space = Thyra::productVectorSpace(spaces());
575 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
577 RCP<const SolutionHistory<Scalar>> state_solution_history =
578 state_integrator_->getSolutionHistory();
579 int num_states = state_solution_history->getNumStates();
580 for (
int i = 0; i < num_states; ++i) {
581 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
584 RCP<DPV> x = defaultProductVector(prod_space);
585 assign(x->getNonconstVectorBlock(0).ptr(), *(state->getX()));
586 assign(x->getNonconstVectorBlock(1).ptr(), zero);
587 RCP<VectorBase<Scalar>> x_b = x;
590 RCP<VectorBase<Scalar>> x_dot_b;
591 if (state->getXDot() != Teuchos::null) {
592 RCP<DPV> x_dot = defaultProductVector(prod_space);
593 assign(x_dot->getNonconstVectorBlock(0).ptr(), *(state->getXDot()));
594 assign(x_dot->getNonconstVectorBlock(1).ptr(), zero);
599 RCP<VectorBase<Scalar>> x_dot_dot_b;
600 if (state->getXDotDot() != Teuchos::null) {
601 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
602 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(),
603 *(state->getXDotDot()));
604 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(), zero);
605 x_dot_dot_b = x_dot_dot;
608 RCP<SolutionState<Scalar>> prod_state = state->clone();
609 prod_state->setX(x_b);
610 prod_state->setXDot(x_dot_b);
611 prod_state->setXDotDot(x_dot_dot_b);
612 solutionHistory_->addState(prod_state);
615 RCP<const VectorBase<Scalar>> frozen_x =
616 state_solution_history->getCurrentState()->getX();
617 RCP<const VectorBase<Scalar>> frozen_x_dot =
618 state_solution_history->getCurrentState()->getXDot();
619 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
620 state_solution_history->getCurrentState()->getXDotDot();
621 RCP<const SolutionHistory<Scalar>> sens_solution_history =
622 sens_integrator_->getSolutionHistory();
623 num_states = sens_solution_history->getNumStates();
624 for (
int i = 0; i < num_states; ++i) {
625 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
628 RCP<DPV> x = defaultProductVector(prod_space);
629 assign(x->getNonconstVectorBlock(0).ptr(), *frozen_x);
630 assign(x->getNonconstVectorBlock(1).ptr(), *(state->getX()));
631 RCP<VectorBase<Scalar>> x_b = x;
634 RCP<VectorBase<Scalar>> x_dot_b;
635 if (state->getXDot() != Teuchos::null) {
636 RCP<DPV> x_dot = defaultProductVector(prod_space);
637 assign(x_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot);
638 assign(x_dot->getNonconstVectorBlock(1).ptr(), *(state->getXDot()));
643 RCP<VectorBase<Scalar>> x_dot_dot_b;
644 if (state->getXDotDot() != Teuchos::null) {
645 RCP<DPV> x_dot_dot = defaultProductVector(prod_space);
646 assign(x_dot_dot->getNonconstVectorBlock(0).ptr(), *frozen_x_dot_dot);
647 assign(x_dot_dot->getNonconstVectorBlock(1).ptr(),
648 *(state->getXDotDot()));
649 x_dot_dot_b = x_dot_dot;
652 RCP<SolutionState<Scalar>> prod_state = state->clone();
653 prod_state->setX(x_b);
654 prod_state->setXDot(x_dot_b);
655 prod_state->setXDotDot(x_dot_dot_b);
656 solutionHistory_->addState(prod_state,
false);