265 using Teuchos::rcp_dynamic_cast;
267 using Thyra::createMember;
268 using Thyra::VectorSpaceBase;
269 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
274 RCP<const VectorSpaceBase<Scalar>> space =
sens_model_->get_x_space();
275 RCP<DMVPV> X = rcp_dynamic_cast<DMVPV>(createMember(space));
276 RCP<DMVPV> Xdot = rcp_dynamic_cast<DMVPV>(createMember(space));
277 RCP<DMVPV> Xdotdot = rcp_dynamic_cast<DMVPV>(createMember(space));
278 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
281 if (DxDp0 == Teuchos::null)
282 assign(X->getNonconstMultiVector().ptr(), zero);
284 assign(X->getNonconstMultiVector().ptr(), *DxDp0);
287 if (DxdotDp0 == Teuchos::null)
288 assign(Xdot->getNonconstMultiVector().ptr(), zero);
290 assign(Xdot->getNonconstMultiVector().ptr(), *DxdotDp0);
293 if (DxdotDp0 == Teuchos::null)
294 assign(Xdotdot->getNonconstMultiVector().ptr(), zero);
296 assign(Xdotdot->getNonconstMultiVector().ptr(), *DxdotdotDp0);
444 using Teuchos::ParameterList;
447 using Teuchos::rcp_dynamic_cast;
449 using Thyra::createMembers;
451 using Thyra::multiVectorProductVector;
453 using Thyra::VectorSpaceBase;
454 typedef Thyra::DefaultMultiVectorProductVector<Scalar> DMVPV;
460 RCP<ParameterList> shPL;
465 const int num_param = rcp_dynamic_cast<const DMVPV>(
sens_integrator_->getX())
469 RCP<const VectorSpaceBase<Scalar>> x_space =
model_->get_x_space();
470 RCP<const Thyra::DefaultMultiVectorProductVectorSpace<Scalar>> prod_space =
471 Thyra::multiVectorProductVectorSpace(x_space, num_param + 1);
472 const Teuchos::Range1D rng(1, num_param);
473 const Scalar zero = Teuchos::ScalarTraits<Scalar>::zero();
475 RCP<const SolutionHistory<Scalar>> state_solution_history =
477 int num_states = state_solution_history->getNumStates();
478 for (
int i = 0; i < num_states; ++i) {
479 RCP<const SolutionState<Scalar>> state = (*state_solution_history)[i];
482 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
483 assign(x_mv->col(0).ptr(), *(state->getX()));
484 assign(x_mv->subView(rng).ptr(), zero);
485 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
488 RCP<VectorBase<Scalar>> x_dot;
489 if (state->getXDot() != Teuchos::null) {
490 RCP<MultiVectorBase<Scalar>> x_dot_mv =
491 createMembers(x_space, num_param + 1);
492 assign(x_dot_mv->col(0).ptr(), *(state->getXDot()));
493 assign(x_dot_mv->subView(rng).ptr(), zero);
494 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
498 RCP<VectorBase<Scalar>> x_dot_dot;
499 if (state->getXDotDot() != Teuchos::null) {
500 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
501 createMembers(x_space, num_param + 1);
502 assign(x_dot_dot_mv->col(0).ptr(), *(state->getXDotDot()));
503 assign(x_dot_dot_mv->subView(rng).ptr(), zero);
504 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
507 RCP<SolutionState<Scalar>> prod_state = state->clone();
509 prod_state->setXDot(x_dot);
510 prod_state->setXDotDot(x_dot_dot);
514 RCP<const VectorBase<Scalar>> frozen_x =
515 state_solution_history->getCurrentState()->getX();
516 RCP<const VectorBase<Scalar>> frozen_x_dot =
517 state_solution_history->getCurrentState()->getXDot();
518 RCP<const VectorBase<Scalar>> frozen_x_dot_dot =
519 state_solution_history->getCurrentState()->getXDotDot();
520 RCP<const SolutionHistory<Scalar>> sens_solution_history =
522 num_states = sens_solution_history->getNumStates();
523 for (
int i = 0; i < num_states; ++i) {
524 RCP<const SolutionState<Scalar>> state = (*sens_solution_history)[i];
527 RCP<MultiVectorBase<Scalar>> x_mv = createMembers(x_space, num_param + 1);
528 RCP<const MultiVectorBase<Scalar>> dxdp =
529 rcp_dynamic_cast<const DMVPV>(state->getX())->getMultiVector();
530 assign(x_mv->col(0).ptr(), *(frozen_x));
531 assign(x_mv->subView(rng).ptr(), *dxdp);
532 RCP<VectorBase<Scalar>> x = multiVectorProductVector(prod_space, x_mv);
535 RCP<VectorBase<Scalar>> x_dot;
536 if (state->getXDot() != Teuchos::null) {
537 RCP<MultiVectorBase<Scalar>> x_dot_mv =
538 createMembers(x_space, num_param + 1);
539 RCP<const MultiVectorBase<Scalar>> dxdotdp =
540 rcp_dynamic_cast<const DMVPV>(state->getXDot())->getMultiVector();
541 assign(x_dot_mv->col(0).ptr(), *(frozen_x_dot));
542 assign(x_dot_mv->subView(rng).ptr(), *dxdotdp);
543 x_dot = multiVectorProductVector(prod_space, x_dot_mv);
547 RCP<VectorBase<Scalar>> x_dot_dot;
548 if (state->getXDotDot() != Teuchos::null) {
549 RCP<MultiVectorBase<Scalar>> x_dot_dot_mv =
550 createMembers(x_space, num_param + 1);
551 RCP<const MultiVectorBase<Scalar>> dxdotdotdp =
552 rcp_dynamic_cast<const DMVPV>(state->getXDotDot())->getMultiVector();
553 assign(x_dot_dot_mv->col(0).ptr(), *(frozen_x_dot_dot));
554 assign(x_dot_dot_mv->subView(rng).ptr(), *dxdotdotdp);
555 x_dot_dot = multiVectorProductVector(prod_space, x_dot_dot_mv);
558 RCP<SolutionState<Scalar>> prod_state = state->clone();
560 prod_state->setXDot(x_dot);
561 prod_state->setXDotDot(x_dot_dot);
570 Teuchos::RCP<Teuchos::ParameterList> pList,
576 Teuchos::RCP<SensitivityModelEvaluatorBase<Scalar>> sens_model;
577 Teuchos::RCP<IntegratorBasic<Scalar>> sens_integrator;
580 Teuchos::RCP<Teuchos::ParameterList> pl =
581 Teuchos::rcp(
new Teuchos::ParameterList);
582 Teuchos::RCP<const Teuchos::ParameterList> integrator_pl =
583 fwd_integrator->getValidParameters();
584 Teuchos::RCP<const Teuchos::ParameterList> sensitivity_pl =
586 pl->setParameters(*integrator_pl);
587 pl->sublist(
"Sensitivities").setParameters(*sensitivity_pl);
588 pl->sublist(
"Sensitivities").set(
"Reuse State Linear Solver",
false);
589 pl->sublist(
"Sensitivities").set(
"Force W Update",
false);
590 pl->sublist(
"Sensitivities").set(
"Cache Matrices",
false);
591 pList->setParametersNotAlreadySet(*pl);
595 pList->sublist(
"Sensitivities").get(
"Reuse State Linear Solver",
false);
596 bool force_W_update =
597 pList->sublist(
"Sensitivities").get(
"Force W Update",
false);
598 bool cache_matrices =
599 pList->sublist(
"Sensitivities").get(
"Cache Matrices",
false);
602 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
603 if (pList != Teuchos::null) {
604 *pl = pList->sublist(
"Sensitivities");
606 pl->remove(
"Reuse State Linear Solver");
607 pl->remove(
"Force W Update");
608 pl->remove(
"Cache Matrices");
610 model, sens_residual_model, sens_solve_model, cache_matrices, pl);
616 auto sensPList = Teuchos::rcp(
new Teuchos::ParameterList(*pList));
621 Teuchos::RCP<Tempus::IntegratorPseudoTransientForwardSensitivity<Scalar>>
622 integrator = Teuchos::rcp(
624 model, sens_model, fwd_integrator, sens_integrator, reuse_solver,