9 #ifndef Tempus_StaggeredForwardSensitivityModelEvaluator_impl_hpp
10 #define Tempus_StaggeredForwardSensitivityModelEvaluator_impl_hpp
12 #include "Thyra_DefaultMultiVectorProductVector.hpp"
16 #include "Thyra_VectorStdOps.hpp"
17 #include "Thyra_MultiVectorStdOps.hpp"
21 template <
typename Scalar>
27 const bool is_pseudotransient,
33 sens_residual_model_(sens_residual_model),
34 sens_solve_model_(sens_solve_model),
35 dxdp_init_(dxdp_init),
36 dx_dotdp_init_(dx_dotdp_init),
37 dx_dotdotdp_init_(dx_dotdotdp_init),
41 xdot_tangent_index_(2),
42 xdotdot_tangent_index_(3),
43 use_dfdp_as_tangent_(false),
44 use_dgdp_as_tangent_(false),
48 is_pseudotransient_(is_pseudotransient),
49 mass_matrix_is_computed_(false),
50 jacobian_matrix_is_computed_(false),
51 acceleration_matrix_is_computed_(false),
52 residual_sensitivity_is_computed_(false),
53 t_interp_(Teuchos::ScalarTraits<Scalar>::rmax())
60 if (pList != Teuchos::null)
65 p_index_ = pl->
get<
int>(
"Sensitivity Parameter Index");
66 g_index_ = pl->
get<
int>(
"Response Function Index", -1);
82 Thyra::multiVectorProductVectorSpace(
model_->get_g_space(g_index_),
86 MEB::InArgs<Scalar> me_inArgs =
model_->createInArgs();
90 MEB::InArgsSetup<Scalar> inArgs;
91 inArgs.setModelEvalDescription(this->
description());
92 inArgs.setSupports(MEB::IN_ARG_x);
93 if (me_inArgs.supports(MEB::IN_ARG_x_dot))
94 inArgs.setSupports(MEB::IN_ARG_x_dot);
95 if (me_inArgs.supports(MEB::IN_ARG_t))
96 inArgs.setSupports(MEB::IN_ARG_t);
97 if (me_inArgs.supports(MEB::IN_ARG_alpha))
98 inArgs.setSupports(MEB::IN_ARG_alpha);
99 if (me_inArgs.supports(MEB::IN_ARG_beta))
100 inArgs.setSupports(MEB::IN_ARG_beta);
101 if (me_inArgs.supports(MEB::IN_ARG_W_x_dot_dot_coeff))
102 inArgs.setSupports(MEB::IN_ARG_W_x_dot_dot_coeff);
105 inArgs.set_Np(me_inArgs.Np());
108 MEB::OutArgs<Scalar> me_outArgs =
model_->createOutArgs();
111 MEB::OutArgsSetup<Scalar> outArgs;
112 outArgs.setModelEvalDescription(this->
description());
113 outArgs.set_Np_Ng(me_inArgs.Np(),me_outArgs.Ng()+
g_offset_);
114 outArgs.setSupports(MEB::OUT_ARG_f);
115 if (sens_mer_outArgs.supports(MEB::OUT_ARG_W_op) ||
116 sens_mes_outArgs.supports(MEB::OUT_ARG_W_op))
117 outArgs.setSupports(MEB::OUT_ARG_W_op);
121 for (
int j=0; j<me_outArgs.Ng(); ++j) {
122 outArgs.setSupports(MEB::OUT_ARG_DgDx_dot, j+
g_offset_,
123 me_outArgs.supports(MEB::OUT_ARG_DgDx_dot, j));
124 outArgs.setSupports(MEB::OUT_ARG_DgDx, j+
g_offset_,
125 me_outArgs.supports(MEB::OUT_ARG_DgDx, j));
126 for (
int l=0; l<me_outArgs.Np(); ++l) {
127 outArgs.setSupports(MEB::OUT_ARG_DgDp, j+
g_offset_, l,
128 me_outArgs.supports(MEB::OUT_ARG_DgDp, j, l));
138 if (me_inArgs.supports(MEB::IN_ARG_x_dot)) {
142 TEUCHOS_ASSERT(me_outArgs.supports(MEB::OUT_ARG_DfDp, p_index_).supports(MEB::DERIV_MV_JACOBIAN_FORM));
145 template <
typename Scalar>
155 template <
typename Scalar>
165 template <
typename Scalar>
171 return model_->get_p_space(p);
174 template <
typename Scalar>
180 return model_->get_p_names(p);
183 template <
typename Scalar>
191 template <
typename Scalar>
199 template <
typename Scalar>
208 return model_->get_g_space(g_index_);
210 return model_->get_g_space(j-g_offset_);
213 template <
typename Scalar>
221 for (
int i=0; i<names.
size(); ++i)
222 names[i] = names[i] +
"_reduced sensitivity";
226 return model_->get_g_names(g_index_);
228 return model_->get_g_names(j-g_offset_);
231 template <
typename Scalar>
237 if (lo_ != Teuchos::null)
240 op = sens_solve_model_->create_W_op();
241 return Thyra::nonconstMultiVectorLinearOp(op, num_param_);
244 template <
typename Scalar>
249 return model_->create_DgDx_dot_op(j-g_offset_);
252 template <
typename Scalar>
257 return model_->create_DgDx_op(j-g_offset_);
260 template <
typename Scalar>
265 return model_->create_DgDp_op(j-g_offset_,l);
268 template <
typename Scalar>
274 using Teuchos::rcp_dynamic_cast;
278 = sens_solve_model_->get_W_factory();
279 if (model_factory == Teuchos::null)
280 return Teuchos::null;
281 if (po_ != Teuchos::null) {
283 Thyra::reuseLinearOpWithSolveFactory<Scalar>(model_factory, po_);
286 factory = model_factory;
287 return Thyra::multiVectorLinearOpWithSolveFactory(factory,
292 template <
typename Scalar>
297 return prototypeInArgs_;
300 template <
typename Scalar>
308 using Teuchos::rcp_dynamic_cast;
310 MEB::InArgs<Scalar> me_nominal = model_->getNominalValues();
311 MEB::InArgs<Scalar> nominal = this->createInArgs();
316 RCP< Thyra::VectorBase<Scalar> > x = Thyra::createMember(*dxdp_space_);
317 RCP<DMVPV> dxdp = rcp_dynamic_cast<DMVPV>(x,
true);
318 if (dxdp_init_ == Teuchos::null)
319 Thyra::assign(dxdp->getNonconstMultiVector().ptr(), zero);
321 Thyra::assign(dxdp->getNonconstMultiVector().ptr(), *dxdp_init_);
325 if (me_nominal.supports(MEB::IN_ARG_x_dot)) {
326 RCP< Thyra::VectorBase<Scalar> > xdot = Thyra::createMember(*dxdp_space_);
327 RCP<DMVPV> dxdotdp = rcp_dynamic_cast<DMVPV>(xdot,
true);
328 if (dx_dotdp_init_ == Teuchos::null)
329 Thyra::assign(dxdotdp->getNonconstMultiVector().ptr(), zero);
331 Thyra::assign(dxdotdp->getNonconstMultiVector().ptr(), *dx_dotdp_init_);
332 nominal.set_x_dot(xdot);
336 if (me_nominal.supports(MEB::IN_ARG_x_dot_dot)) {
337 RCP< Thyra::VectorBase<Scalar> > xdotdot =
338 Thyra::createMember(*dxdp_space_);
339 RCP<DMVPV> dxdotdotdp = rcp_dynamic_cast<DMVPV>(xdotdot,
true);
340 if (dx_dotdotdp_init_ == Teuchos::null)
341 Thyra::assign(dxdotdotdp->getNonconstMultiVector().ptr(), zero);
343 Thyra::assign(dxdotdotdp->getNonconstMultiVector().ptr(),
345 nominal.set_x_dot_dot(xdotdot);
348 const int np = model_->Np();
349 for (
int i=0; i<np; ++i)
350 nominal.set_p(i, me_nominal.get_p(i));
354 template <
typename Scalar>
359 return prototypeOutArgs_;
362 template <
typename Scalar>
371 using Teuchos::rcp_dynamic_cast;
376 if (sh_ != Teuchos::null) {
377 forward_t = inArgs.
get_t();
378 if (t_interp_ != forward_t) {
379 if (nc_forward_state_ == Teuchos::null)
380 nc_forward_state_ = sh_->interpolateState(forward_t);
382 sh_->interpolateState(forward_t, nc_forward_state_.get());
383 forward_state_ = nc_forward_state_;
384 t_interp_ = forward_t;
389 forward_t = forward_state_->getTime();
392 const bool use_tangent = use_dfdp_as_tangent_ || use_dgdp_as_tangent_;
395 RCP< const Thyra::MultiVectorBase<Scalar> > dxdp, dxdotdp, dxdotdotdp;
396 MEB::InArgs<Scalar> me_inArgs = model_->getNominalValues();
397 dxdp = rcp_dynamic_cast<
const DMVPV>(inArgs.
get_x(),
true)->getMultiVector();
398 me_inArgs.set_x(forward_state_->getX());
399 if (use_dfdp_as_tangent_)
400 me_inArgs.set_p(x_tangent_index_, inArgs.
get_x());
401 if (me_inArgs.supports(MEB::IN_ARG_x_dot)) {
402 if (inArgs.
get_x_dot() != Teuchos::null) {
404 rcp_dynamic_cast<
const DMVPV>(inArgs.
get_x_dot(),
true)->getMultiVector();
405 me_inArgs.set_x_dot(forward_state_->getXDot());
406 if (use_dfdp_as_tangent_)
407 me_inArgs.set_p(xdot_tangent_index_, inArgs.
get_x_dot());
412 me_inArgs.set_x_dot(Teuchos::null);
415 if (me_inArgs.supports(MEB::IN_ARG_x_dot_dot)) {
418 rcp_dynamic_cast<
const DMVPV>(inArgs.
get_x_dot_dot(),
true)->getMultiVector();
419 me_inArgs.set_x_dot_dot(forward_state_->getXDotDot());
420 if (use_dfdp_as_tangent_)
421 me_inArgs.set_p(xdotdot_tangent_index_, inArgs.
get_x_dot_dot());
424 me_inArgs.set_x_dot_dot(Teuchos::null);
426 if (me_inArgs.supports(MEB::IN_ARG_t))
427 me_inArgs.set_t(forward_t);
428 if (me_inArgs.supports(MEB::IN_ARG_alpha))
430 if (me_inArgs.supports(MEB::IN_ARG_beta))
431 me_inArgs.set_beta(inArgs.
get_beta());
432 if (me_inArgs.supports(MEB::IN_ARG_W_x_dot_dot_coeff))
438 const int np = me_inArgs.Np();
439 for (
int i=0; i<np; ++i) {
440 if (inArgs.
get_p(i) != Teuchos::null)
442 (use_tangent && i != x_tangent_index_ &&
443 i != xdot_tangent_index_ &&
444 i != xdotdot_tangent_index_ ))
445 me_inArgs.set_p(i, inArgs.
get_p(i));
449 RCP< Thyra::MultiVectorBase<Scalar> > dfdp;
450 MEB::OutArgs<Scalar> me_outArgs = model_->createOutArgs();
451 if (outArgs.
get_f() != Teuchos::null) {
452 dfdp = rcp_dynamic_cast<DMVPV>(outArgs.
get_f(),
true)->getNonconstMultiVector();
453 if (!residual_sensitivity_is_computed_) {
454 if (!use_dfdp_as_tangent_ && is_pseudotransient_) {
455 if (my_dfdp_ == Teuchos::null)
456 my_dfdp_ = Thyra::createMembers(model_->get_f_space(),
457 model_->get_p_space(p_index_)->dim());
458 me_outArgs.set_DfDp(p_index_, my_dfdp_);
461 me_outArgs.set_DfDp(p_index_, dfdp);
464 if (outArgs.
supports(MEB::OUT_ARG_W_op) && lo_ == Teuchos::null &&
465 outArgs.
get_W_op() != Teuchos::null &&
466 model_.ptr() == sens_solve_model_.ptr()) {
467 RCP<Thyra::LinearOpBase<Scalar> > op = outArgs.
get_W_op();
468 RCP<Thyra::MultiVectorLinearOp<Scalar> > mv_op =
470 me_outArgs.set_W_op(mv_op->getNonconstLinearOp());
472 for (
int j=g_offset_; j<outArgs.
Ng(); ++j) {
473 me_outArgs.set_g(j-g_offset_, outArgs.
get_g(j));
474 if (!me_outArgs.supports(MEB::OUT_ARG_DgDx_dot,j-g_offset_).none())
475 me_outArgs.set_DgDx_dot(j-g_offset_, outArgs.
get_DgDx_dot(j));
476 if (!me_outArgs.supports(MEB::OUT_ARG_DgDx,j-g_offset_).none())
477 me_outArgs.set_DgDx(j-g_offset_, outArgs.
get_DgDx(j));
478 for (
int l=0; l<outArgs.
Np(); ++l)
479 if (!me_outArgs.supports(MEB::OUT_ARG_DgDp,j-g_offset_,l).none())
480 me_outArgs.set_DgDp(j-g_offset_, l, outArgs.
get_DgDp(j,l));
482 if (g_index_ >= 0 && outArgs.
get_g(1) != Teuchos::null)
483 me_outArgs.set_g(g_index_, outArgs.
get_g(1));
486 model_->evalModel(me_inArgs, me_outArgs);
489 if (outArgs.
supports(MEB::OUT_ARG_W_op) && lo_ == Teuchos::null &&
490 outArgs.
get_W_op() != Teuchos::null &&
491 model_.ptr() != sens_solve_model_.ptr()) {
492 MEB::OutArgs<Scalar> sens_me_outArgs = sens_solve_model_->createOutArgs();
493 RCP<Thyra::LinearOpBase<Scalar> > op = outArgs.
get_W_op();
494 RCP<Thyra::MultiVectorLinearOp<Scalar> > mv_op =
496 sens_me_outArgs.set_W_op(mv_op->getNonconstLinearOp());
497 sens_solve_model_->evalModel(me_inArgs, sens_me_outArgs);
505 if (!use_dfdp_as_tangent_) {
506 if (dfdp != Teuchos::null && is_pseudotransient_) {
507 residual_sensitivity_is_computed_ =
true;
508 Thyra::assign(dfdp.ptr(), *my_dfdp_);
510 if (dxdp != Teuchos::null && dfdp != Teuchos::null) {
511 if (my_dfdx_ == Teuchos::null)
512 my_dfdx_ = sens_residual_model_->create_W_op();
513 if (!jacobian_matrix_is_computed_) {
514 MEB::OutArgs<Scalar> meo = sens_residual_model_->createOutArgs();
515 meo.set_W_op(my_dfdx_);
516 if (me_inArgs.supports(MEB::IN_ARG_alpha))
517 me_inArgs.set_alpha(0.0);
518 if (me_inArgs.supports(MEB::IN_ARG_beta))
519 me_inArgs.set_beta(1.0);
520 if (me_inArgs.supports(MEB::IN_ARG_W_x_dot_dot_coeff))
521 me_inArgs.set_W_x_dot_dot_coeff(0.0);
522 sens_residual_model_->evalModel(me_inArgs, meo);
523 if (is_pseudotransient_)
524 jacobian_matrix_is_computed_ =
true;
526 my_dfdx_->apply(
Thyra::NOTRANS, *dxdp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));
528 if (dxdotdp != Teuchos::null && dfdp != Teuchos::null) {
529 if (my_dfdxdot_ == Teuchos::null)
530 my_dfdxdot_ = sens_residual_model_->create_W_op();
531 if (!mass_matrix_is_computed_) {
532 MEB::OutArgs<Scalar> meo = sens_residual_model_->createOutArgs();
533 meo.set_W_op(my_dfdxdot_);
534 if (me_inArgs.supports(MEB::IN_ARG_alpha))
535 me_inArgs.set_alpha(1.0);
536 if (me_inArgs.supports(MEB::IN_ARG_beta))
537 me_inArgs.set_beta(0.0);
538 if (me_inArgs.supports(MEB::IN_ARG_W_x_dot_dot_coeff))
539 me_inArgs.set_W_x_dot_dot_coeff(0.0);
540 sens_residual_model_->evalModel(me_inArgs, meo);
541 if (is_pseudotransient_)
542 mass_matrix_is_computed_ =
true;
544 my_dfdxdot_->apply(
Thyra::NOTRANS, *dxdotdp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));
546 if (dxdotdotdp != Teuchos::null && dfdp != Teuchos::null) {
547 if (my_dfdxdotdot_ == Teuchos::null)
548 my_dfdxdotdot_ = sens_residual_model_->create_W_op();
549 if (!acceleration_matrix_is_computed_) {
550 MEB::OutArgs<Scalar> meo = sens_residual_model_->createOutArgs();
551 meo.set_W_op(my_dfdxdotdot_);
552 if (me_inArgs.supports(MEB::IN_ARG_alpha))
553 me_inArgs.set_alpha(0.0);
554 if (me_inArgs.supports(MEB::IN_ARG_beta))
555 me_inArgs.set_beta(0.0);
556 if (me_inArgs.supports(MEB::IN_ARG_W_x_dot_dot_coeff))
557 me_inArgs.set_W_x_dot_dot_coeff(1.0);
558 sens_residual_model_->evalModel(me_inArgs, meo);
559 if (is_pseudotransient_)
560 acceleration_matrix_is_computed_ =
true;
562 my_dfdxdotdot_->apply(
Thyra::NOTRANS, *dxdotdotdp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));
566 if (g_index_ >= 0 && outArgs.
get_g(0) != Teuchos::null) {
567 MEB::OutArgs<Scalar> meo = model_->createOutArgs();
568 RCP<Thyra::MultiVectorBase<Scalar> > dgdp =
569 rcp_dynamic_cast<DMVPV>(outArgs.
get_g(0),
true)->getNonconstMultiVector();
570 RCP<Thyra::MultiVectorBase<Scalar> > dgdp_trans;
571 MEB::DerivativeSupport dgdp_support =
572 meo.supports(MEB::OUT_ARG_DgDp, g_index_, p_index_);
573 if (dgdp_support.supports(MEB::DERIV_MV_JACOBIAN_FORM))
574 meo.set_DgDp(g_index_, p_index_,
575 MEB::Derivative<Scalar>(dgdp, MEB::DERIV_MV_JACOBIAN_FORM));
576 else if (dgdp_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
577 dgdp_trans = createMembers(model_->get_p_space(p_index_),
579 meo.set_DgDp(g_index_, p_index_,
580 MEB::Derivative<Scalar>(dgdp_trans, MEB::DERIV_MV_GRADIENT_FORM));
584 true, std::logic_error,
585 "Operator form of dg/dp not supported for reduced sensitivity");
587 if (!use_dgdp_as_tangent_ || dxdp == Teuchos::null) {
588 MEB::DerivativeSupport dgdx_support =
589 meo.supports(MEB::OUT_ARG_DgDx, g_index_);
590 if (dgdx_support.supports(MEB::DERIV_LINEAR_OP)) {
591 if (my_dgdx_ == Teuchos::null)
592 my_dgdx_ = model_->create_DgDx_op(g_index_);
593 meo.set_DgDx(g_index_, my_dgdx_);
595 else if (dgdx_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
596 if (my_dgdx_mv_ == Teuchos::null)
597 my_dgdx_mv_ = createMembers(model_->get_g_space(g_index_), num_param_);
598 meo.set_DgDx(g_index_,
599 MEB::Derivative<Scalar>(my_dgdx_mv_,
600 MEB::DERIV_MV_GRADIENT_FORM));
604 true, std::logic_error,
605 "Jacobian form of dg/dx not supported for reduced sensitivity");
612 if (!use_dgdp_as_tangent_ && use_dfdp_as_tangent_ &&
613 dxdp != Teuchos::null)
614 me_inArgs.set_p(x_tangent_index_, Teuchos::null);
615 if (!use_dgdp_as_tangent_ && use_dfdp_as_tangent_ &&
616 dxdotdp != Teuchos::null)
617 me_inArgs.set_p(xdot_tangent_index_, Teuchos::null);
618 if (!use_dgdp_as_tangent_ && use_dfdp_as_tangent_ &&
619 dxdotdotdp != Teuchos::null)
620 me_inArgs.set_p(xdotdot_tangent_index_, Teuchos::null);
623 if (use_dgdp_as_tangent_ && !use_dfdp_as_tangent_ &&
624 dxdp != Teuchos::null)
625 me_inArgs.set_p(x_tangent_index_, inArgs.
get_x());
626 if (use_dgdp_as_tangent_ && !use_dfdp_as_tangent_ &&
627 dxdotdp != Teuchos::null)
628 me_inArgs.set_p(xdot_tangent_index_, inArgs.
get_x_dot());
629 if (use_dgdp_as_tangent_ && !use_dfdp_as_tangent_ &&
630 dxdotdotdp != Teuchos::null)
631 me_inArgs.set_p(xdotdot_tangent_index_, inArgs.
get_x_dot_dot());
633 model_->evalModel(me_inArgs, meo);
636 if (dgdp_trans != Teuchos::null) {
639 for (
int i=0; i<num_param_; ++i)
640 for (
int j=0; j<num_response_; ++j)
641 dgdp_view(j,i) = dgdp_trans_view(i,j);
646 if (!use_dgdp_as_tangent_ && dxdp != Teuchos::null) {
647 MEB::DerivativeSupport dgdx_support =
648 me_outArgs.supports(MEB::OUT_ARG_DgDx, g_index_);
649 if (dgdx_support.supports(MEB::DERIV_LINEAR_OP)) {
650 my_dgdx_->apply(
Thyra::NOTRANS, *dxdp, dgdp.ptr(), Scalar(1.0), Scalar(1.0));
652 else if (dgdx_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
653 my_dgdx_mv_->apply(
Thyra::TRANS, *dxdp, dgdp.ptr(), Scalar(1.0), Scalar(1.0));
657 true, std::logic_error,
658 "Jacobian form of dg/dx not supported for reduced sensitivity");
663 template<
class Scalar>
669 pl->
set<
bool>(
"Use DfDp as Tangent",
false);
670 pl->
set<
bool>(
"Use DgDp as Tangent",
false);
671 pl->
set<
int>(
"Sensitivity Parameter Index", 0);
672 pl->
set<
int>(
"Response Function Index", -1);
673 pl->
set<
int>(
"Sensitivity X Tangent Index", 1);
674 pl->
set<
int>(
"Sensitivity X-Dot Tangent Index", 2);
675 pl->
set<
int>(
"Sensitivity X-Dot-Dot Tangent Index", 3);
Thyra::ModelEvaluatorBase::InArgs< Scalar > createInArgs() const
bool use_dgdp_as_tangent_
Teuchos::RCP< const DMVPVS > dfdp_space_
RCP< const VectorBase< Scalar > > get_x_dot() const
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
void setForwardSolutionHistory(const Teuchos::RCP< const Tempus::SolutionHistory< Scalar > > &sh)
Set solution history from forward state evaluation (for interpolation)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual void setForwardSolutionState(const Teuchos::RCP< const Tempus::SolutionState< Scalar > > &s)
Set solution state from forward state evaluation (for frozen state)
Evaluation< VectorBase< Scalar > > get_g(int j) const
Teuchos::RCP< const Teuchos::Array< std::string > > get_p_names(int p) const
Evaluation< VectorBase< Scalar > > get_f() const
Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > sens_residual_model_
bool supports(EOutArgsMembers arg) const
static Teuchos::RCP< const Teuchos::ParameterList > getValidParameters()
static magnitudeType rmax()
Derivative< Scalar > get_DgDp(int j, int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_p_space(int p) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DgDx_dot_op(int j) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< const DMVPVS > dxdp_space_
int xdotdot_tangent_index_
virtual std::string description() const
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Scalar get_W_x_dot_dot_coeff() const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DgDp_op(int j, int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_x_space() const
Implicit concrete LinearOpBase subclass that takes a flattended out multi-vector and performs a multi...
Thyra::ModelEvaluatorBase::InArgs< Scalar > prototypeInArgs_
Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase< Scalar > > get_W_factory() const
Teuchos::ArrayView< const std::string > get_g_names(int j) const
bool use_dfdp_as_tangent_
Derivative< Scalar > get_DgDx_dot(int j) const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_W_op() const
Thyra::ModelEvaluatorBase::InArgs< Scalar > getNominalValues() const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > prototypeOutArgs_
RCP< const VectorBase< Scalar > > get_x_dot_dot() const
Teuchos::RCP< Thyra::LinearOpBase< Scalar > > create_DgDx_op(int j) const
#define TEUCHOS_ASSERT(assertion_test)
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_f_space() const
RCP< LinearOpBase< Scalar > > get_W_op() const
Teuchos::RCP< const DMVPVS > dgdp_space_
Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > sens_solve_model_
RCP< const VectorBase< Scalar > > get_x() const
StaggeredForwardSensitivityModelEvaluator(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &sens_residual_model, const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &sens_solve_model, const bool is_pseudotransient, const Teuchos::RCP< const Teuchos::ParameterList > &pList=Teuchos::null, const Teuchos::RCP< MultiVector > &dxdp_init=Teuchos::null, const Teuchos::RCP< MultiVector > &dx_dotdp_init=Teuchos::null, const Teuchos::RCP< MultiVector > &dx_dotdot_dp_init=Teuchos::null)
Constructor.
Solution state for integrators and steppers.
Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > model_
RCP< const VectorBase< Scalar > > get_p(int l) const
Teuchos::RCP< const Thyra::VectorSpaceBase< Scalar > > get_g_space(int j) const
void evalModelImpl(const Thyra::ModelEvaluatorBase::InArgs< Scalar > &inArgs, const Thyra::ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
Thyra::ModelEvaluatorBase::OutArgs< Scalar > createOutArgsImpl() const
Derivative< Scalar > get_DgDx(int j) const