264 using Teuchos::rcp_dynamic_cast;
266 using Thyra::createMember;
267 using Thyra::VectorSpaceBase;
268 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
273 RCP<const VectorSpaceBase<Scalar>> space = sens_model_->get_x_space();
274 RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
275 RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
276 RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
277 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
280 if (DxDp0 == Teuchos::null)
281 assign(X->getNonconstMultiVector().ptr(), zero);
283 assign(X->getNonconstMultiVector().ptr(), *DxDp0);
286 if (DxdotDp0 == Teuchos::null)
287 assign(Xdot->getNonconstMultiVector().ptr(), zero);
289 assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
292 if (DxdotDp0 == Teuchos::null)
293 assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
295 assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
297 state_integrator_->initializeSolutionHistory(t0, x0, xdot0, xdotdot0);
298 sens_integrator_->initializeSolutionHistory(t0, X, Xdot, Xdotdot);
443 using Teuchos::ParameterList;
446 using Teuchos::rcp_dynamic_cast;
448 using Thyra::createMembers;
450 using Thyra::multiVectorProductVector;
452 using Thyra::VectorSpaceBase;
453 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
459 RCP<ParameterList> shPL;
462 solutionHistory_ = createSolutionHistoryPL<Scalar>(shPL);
464 const int num_param = rcp_dynamic_cast<const DMVPV>(sens_integrator_->getX())
468 RCP<const VectorSpaceBase<Scalar>> x_space = model_->get_x_space();
469 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar>> prod_space =
470 Thyra::multiVectorProductVectorSpace(x_space, num_param + 1);
471 const Teuchos::Range1D rng(1, num_param);
472 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
474 RCP<const SolutionHistory<Scalar>> state_solution_history =
475 state_integrator_->getSolutionHistory();
476 int num_states = state_solution_history->getNumStates();
477 for (
int i = 0; i < num_states; ++i) {
478 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
481 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
482 assign(x_mv->col(0).ptr(), *(state->getX()));
483 assign(x_mv->subView(rng).ptr(), zero);
484 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
487 RCP<VectorBase<Scalar>> x_dot;
488 if (state->getXDot() != Teuchos::null) {
489 RCP<MultiVectorBase<Scalar>> x_dot_mv =
490 createMembers(x_space, num_param + 1);
491 assign(x_dot_mv->col(0).ptr(), *(state->getXDot()));
492 assign(x_dot_mv->subView(rng).ptr(), zero);
493 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
497 RCP<VectorBase<Scalar>> x_dot_dot;
498 if (state->getXDotDot() != Teuchos::null) {
499 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
500 createMembers(x_space, num_param + 1);
501 assign(x_dot_dot_mv->col(0).ptr(), *(state->getXDotDot()));
502 assign(x_dot_dot_mv->subView(rng).ptr(), zero);
503 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
506 RCP<SolutionState<Scalar>> prod_state = state->clone();
508 prod_state->setXDot(x_dot);
509 prod_state->setXDotDot(x_dot_dot);
510 solutionHistory_->addState(prod_state);
513 RCP<const VectorBase<Scalar>> frozen_x =
514 state_solution_history->getCurrentState()->getX();
515 RCP<const VectorBase<Scalar>> frozen_x_dot =
516 state_solution_history->getCurrentState()->getXDot();
517 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
518 state_solution_history->getCurrentState()->getXDotDot();
519 RCP<const SolutionHistory<Scalar>> sens_solution_history =
520 sens_integrator_->getSolutionHistory();
521 num_states = sens_solution_history->getNumStates();
522 for (
int i = 0; i < num_states; ++i) {
523 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
526 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
527 RCP<const MultiVectorBase<Scalar>> dxdp =
528 rcp_dynamic_cast<const DMVPV>(state->getX())->getMultiVector();
529 assign(x_mv->col(0).ptr(), *(frozen_x));
530 assign(x_mv->subView(rng).ptr(), *dxdp);
531 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
534 RCP<VectorBase<Scalar>> x_dot;
535 if (state->getXDot() != Teuchos::null) {
536 RCP<MultiVectorBase<Scalar>> x_dot_mv =
537 createMembers(x_space, num_param + 1);
538 RCP<const MultiVectorBase<Scalar>> dxdotdp =
539 rcp_dynamic_cast<const DMVPV>(state->getXDot())->getMultiVector();
540 assign(x_dot_mv->col(0).ptr(), *(frozen_x_dot));
541 assign(x_dot_mv->subView(rng).ptr(), *dxdotdp);
542 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
546 RCP<VectorBase<Scalar>> x_dot_dot;
547 if (state->getXDotDot() != Teuchos::null) {
548 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
549 createMembers(x_space, num_param + 1);
550 RCP<const MultiVectorBase<Scalar>> dxdotdotdp =
551 rcp_dynamic_cast<const DMVPV>(state->getXDotDot())->getMultiVector();
552 assign(x_dot_dot_mv->col(0).ptr(), *(frozen_x_dot_dot));
553 assign(x_dot_dot_mv->subView(rng).ptr(), *dxdotdotdp);
554 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
557 RCP<SolutionState<Scalar>> prod_state = state->clone();
559 prod_state->setXDot(x_dot);
560 prod_state->setXDotDot(x_dot_dot);
561 solutionHistory_->addState(prod_state,
false);
569 Teuchos::RCP<Teuchos::ParameterList> pList,
574 auto fwd_integrator = createIntegratorBasic<Scalar>(pList, model);
575 Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> sens_model;
576 Teuchos::RCP<IntegratorBasic<Scalar>> sens_integrator;
579 Teuchos::RCP<Teuchos::ParameterList> pl =
580 Teuchos::rcp(
new Teuchos::ParameterList);
581 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
582 fwd_integrator->getValidParameters();
583 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
585 pl->setParameters(*integrator_pl);
586 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
587 pl->sublist(
"Sensitivities").set(
"Reuse State Linear Solver",
false);
588 pl->sublist(
"Sensitivities").set(
"Force W Update",
false);
589 pl->sublist(
"Sensitivities").set(
"Cache Matrices",
false);
590 pList->setParametersNotAlreadySet(*pl);
594 pList->sublist(
"Sensitivities").get(
"Reuse State Linear Solver",
false);
595 bool force_W_update =
596 pList->sublist(
"Sensitivities").get(
"Force W Update",
false);
597 bool cache_matrices =
598 pList->sublist(
"Sensitivities").get(
"Cache Matrices",
false);
601 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
602 if (pList != Teuchos::null) {
603 *pl = pList->sublist(
"Sensitivities");
605 pl->remove(
"Reuse State Linear Solver");
606 pl->remove(
"Force W Update");
607 pl->remove(
"Cache Matrices");
609 model, sens_residual_model, sens_solve_model, cache_matrices, pl);
610 sens_integrator = createIntegratorBasic<Scalar>(pList, sens_model);
613 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
614 integrator = Teuchos::rcp(
616 model, sens_model, fwd_integrator, sens_integrator, reuse_solver,