29 const Scalar& t_init,
const Scalar& t_final,
30 const Teuchos::RCP<const Teuchos::ParameterList>& pList)
41 using Thyra::VectorSpaceBase;
42 typedef Thyra::ModelEvaluatorBase MEB;
45 Teuchos::RCP<Teuchos::ParameterList> pl =
46 Teuchos::rcp(
new Teuchos::ParameterList);
47 if (pList != Teuchos::null) *pl = *pList;
51 p_index_ = pl->get<
int>(
"Sensitivity Parameter Index", 0);
52 g_index_ = pl->get<
int>(
"Response Function Index", 0);
55 pl->get<std::string>(
"Response Type"));
60 TEUCHOS_TEST_FOR_EXCEPTION(
62 "AdjointAuxSensitivityModelEvaluator currently does not support "
63 <<
"non-constant mass matrix df/dx_dot!");
71 Array<RCP<const VectorSpaceBase<Scalar> > > x_spaces(2);
72 Array<RCP<const VectorSpaceBase<Scalar> > > f_spaces(2);
81 MEB::InArgs<Scalar> me_inArgs =
model_->createInArgs();
84 MEB::InArgsSetup<Scalar> inArgs;
85 inArgs.setModelEvalDescription(this->description());
86 inArgs.setSupports(MEB::IN_ARG_x);
87 inArgs.setSupports(MEB::IN_ARG_t);
88 if (me_inArgs.supports(MEB::IN_ARG_x_dot))
89 inArgs.setSupports(MEB::IN_ARG_x_dot);
90 inArgs.setSupports(MEB::IN_ARG_alpha);
91 inArgs.setSupports(MEB::IN_ARG_beta);
94 inArgs.set_Np(me_inArgs.Np());
97 MEB::OutArgs<Scalar> me_outArgs =
model_->createOutArgs();
98 MEB::OutArgs<Scalar> adj_me_outArgs =
adjoint_model_->createOutArgs();
99 MEB::OutArgsSetup<Scalar> outArgs;
100 outArgs.setModelEvalDescription(this->description());
101 outArgs.set_Np_Ng(me_inArgs.Np(), 0);
102 outArgs.setSupports(MEB::OUT_ARG_f);
103 outArgs.setSupports(MEB::OUT_ARG_W_op);
108 TEUCHOS_ASSERT(me_inArgs.supports(MEB::IN_ARG_x));
109 TEUCHOS_ASSERT(adj_me_outArgs.supports(MEB::OUT_ARG_W_op));
110 if (me_inArgs.supports(MEB::IN_ARG_x_dot)) {
111 TEUCHOS_ASSERT(me_inArgs.supports(MEB::IN_ARG_alpha));
112 TEUCHOS_ASSERT(me_inArgs.supports(MEB::IN_ARG_beta));
250 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
251 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs)
const
253 typedef Thyra::ModelEvaluatorBase MEB;
255 using Teuchos::rcp_dynamic_cast;
264 TEUCHOS_ASSERT(
sh_ != Teuchos::null);
265 const Scalar t = inArgs.get_t();
276 MEB::InArgs<Scalar> me_inArgs =
model_->getNominalValues();
278 if (me_inArgs.supports(MEB::IN_ARG_x_dot) &&
279 inArgs.get_x_dot() != Teuchos::null)
281 if (me_inArgs.supports(MEB::IN_ARG_t)) me_inArgs.set_t(forward_t);
282 const int np = me_inArgs.Np();
283 for (
int i = 0; i < np; ++i) me_inArgs.set_p(i, inArgs.get_p(i));
286 RCP<Thyra::LinearOpBase<Scalar> > op = outArgs.get_W_op();
287 if (op != Teuchos::null) {
288 if (me_inArgs.supports(MEB::IN_ARG_alpha))
289 me_inArgs.set_alpha(inArgs.get_alpha());
290 if (me_inArgs.supports(MEB::IN_ARG_beta))
291 me_inArgs.set_beta(inArgs.get_beta());
294 RCP<Thyra::DefaultBlockedLinearOp<Scalar> > block_op =
295 rcp_dynamic_cast<Thyra::DefaultBlockedLinearOp<Scalar> >(op,
true);
296 RCP<Thyra::MultiVectorLinearOp<Scalar> > mv_adjoint_op =
297 rcp_dynamic_cast<Thyra::MultiVectorLinearOp<Scalar> >(
298 block_op->getNonconstBlock(0, 0),
true);
299 RCP<Thyra::LinearOpBase<Scalar> > adjoint_op =
300 mv_adjoint_op->getNonconstLinearOp();
301 MEB::OutArgs<Scalar> adj_me_outArgs =
adjoint_model_->createOutArgs();
302 adj_me_outArgs.set_W_op(adjoint_op);
306 RCP<Thyra::ScaledIdentityLinearOpWithSolve<Scalar> > si_op =
307 rcp_dynamic_cast<Thyra::ScaledIdentityLinearOpWithSolve<Scalar> >(
308 block_op->getNonconstBlock(1, 1),
true);
309 si_op->setScale(inArgs.get_alpha());
317 RCP<Thyra::VectorBase<Scalar> > f = outArgs.get_f();
318 if (f != Teuchos::null) {
319 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x().assert_not_null();
320 RCP<const DPV> prod_x = rcp_dynamic_cast<const DPV>(x,
true);
321 RCP<const Thyra::VectorBase<Scalar> > adjoint_x = prod_x->getVectorBlock(0);
322 RCP<const Thyra::MultiVectorBase<Scalar> > adjoint_x_mv =
323 rcp_dynamic_cast<const DMVPV>(adjoint_x,
true)->getMultiVector();
325 RCP<DPV> prod_f = rcp_dynamic_cast<DPV>(f,
true);
326 RCP<Thyra::VectorBase<Scalar> > adjoint_f =
327 prod_f->getNonconstVectorBlock(0);
328 RCP<Thyra::MultiVectorBase<Scalar> > adjoint_f_mv =
329 rcp_dynamic_cast<DMVPV>(adjoint_f,
true)->getNonconstMultiVector();
331 MEB::OutArgs<Scalar> adj_me_outArgs =
adjoint_model_->createOutArgs();
335 if (me_inArgs.supports(MEB::IN_ARG_alpha)) me_inArgs.set_alpha(0.0);
336 if (me_inArgs.supports(MEB::IN_ARG_beta)) me_inArgs.set_beta(1.0);
340 my_dfdx_->apply(Thyra::NOTRANS, *adjoint_x_mv, adjoint_f_mv.ptr(),
341 Scalar(-1.0), Scalar(0.0));
351 "Tempus::AdjointAuxSensitivityModelEvaluator::evalModel");
353 Thyra::update(Scalar(1.0), *
my_dgdx_mv_, adjoint_f_mv.ptr());
358 RCP<const DPV> prod_x_dot;
359 if (me_inArgs.supports(MEB::IN_ARG_x_dot)) {
360 RCP<const Thyra::VectorBase<Scalar> > x_dot = inArgs.get_x_dot();
361 if (x_dot != Teuchos::null) {
362 prod_x_dot = rcp_dynamic_cast<const DPV>(x_dot,
true);
363 RCP<const Thyra::VectorBase<Scalar> > adjoint_x_dot =
364 prod_x_dot->getVectorBlock(0);
365 RCP<const Thyra::MultiVectorBase<Scalar> > adjoint_x_dot_mv =
366 rcp_dynamic_cast<const DMVPV>(adjoint_x_dot,
true)
370 Thyra::V_StVpV(adjoint_f_mv.ptr(), Scalar(-1.0), *adjoint_f_mv,
378 me_inArgs.set_alpha(1.0);
379 me_inArgs.set_beta(0.0);
384 my_dfdxdot_->apply(Thyra::NOTRANS, *adjoint_x_dot_mv,
385 adjoint_f_mv.ptr(), Scalar(1.0), Scalar(-1.0));
393 RCP<Thyra::VectorBase<Scalar> > adjoint_g =
394 prod_f->getNonconstVectorBlock(1);
395 RCP<Thyra::MultiVectorBase<Scalar> > adjoint_g_mv =
396 rcp_dynamic_cast<DMVPV>(adjoint_g,
true)->getNonconstMultiVector();
404 Thyra::assign(adjoint_g_mv.ptr(), Scalar(0.0));
412 Thyra::update(Scalar(-1.0), *
my_dgdp_mv_, adjoint_g_mv.ptr());
415 if (prod_x_dot != Teuchos::null) {
416 RCP<const Thyra::VectorBase<Scalar> > z_dot =
417 prod_x_dot->getVectorBlock(1);
418 RCP<const Thyra::MultiVectorBase<Scalar> > z_dot_mv =
419 rcp_dynamic_cast<const DMVPV>(z_dot,
true)->getMultiVector();
420 Thyra::V_VmV(adjoint_g_mv.ptr(), *z_dot_mv, *adjoint_g_mv);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...