69 using Teuchos::rcp_dynamic_cast;
71 this->useImplicitModel_ =
true;
72 this->wrapperImplicitInArgs_ = this->createInArgs();
73 this->wrapperImplicitOutArgs_ = this->createOutArgs();
74 this->useImplicitModel_ =
false;
76 RCP<const Thyra::VectorBase<Scalar> > z =
77 this->explicitModel_->getNominalValues().get_x();
80 TEUCHOS_TEST_FOR_EXCEPTION(
81 !(getIMEXVector(z)->space()->isCompatible(
82 *(this->implicitModel_->get_x_space()))),
84 "Error - WrapperModelEvaluatorPairIMEX_CombinedFSA::initialize()\n"
85 <<
" Explicit and Implicit vector x spaces are incompatible!\n"
86 <<
" Explicit vector x space = "
87 << *(getIMEXVector(z)->space())
88 <<
"\n Implicit vector x space = "
89 << *(this->implicitModel_->get_x_space()) <<
"\n");
92 const RCP<const DMVPV> z_dmvpv = rcp_dynamic_cast<const DMVPV>(z,
true);
93 const RCP<const Thyra::MultiVectorBase<Scalar> > z_mv =
94 z_dmvpv->getMultiVector();
95 RCP<const PMVB> zPVector = rcp_dynamic_cast<const PMVB>(z_mv);
96 TEUCHOS_TEST_FOR_EXCEPTION(
97 zPVector == Teuchos::null, std::logic_error,
98 "Error - WrapperModelEvaluatorPairPartIMEX_CombinedFSA::initialize()\n"
99 " was given a VectorBase that could not be cast to a\n"
100 " ProductVectorBase!\n");
102 int numBlocks = zPVector->productSpace()->numBlocks();
104 TEUCHOS_TEST_FOR_EXCEPTION(
105 !(0 <= this->numExplicitOnlyBlocks_ &&
106 this->numExplicitOnlyBlocks_ < numBlocks),
108 "Error - WrapperModelEvaluatorPairPartIMEX_CombinedFSA::initialize()\n"
109 "Invalid number of explicit-only blocks = "
110 << this->numExplicitOnlyBlocks_
111 <<
"\nShould be in the interval [0, numBlocks) = [0, "
112 << numBlocks <<
")\n");
321 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& inArgs,
322 const Thyra::ModelEvaluatorBase::OutArgs<Scalar>& outArgs)
const
324 typedef Thyra::ModelEvaluatorBase MEB;
325 using Teuchos::Range1D;
327 using Teuchos::rcp_dynamic_cast;
329 const int p_index = this->parameterIndex_;
334 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
335 RCP<Thyra::VectorBase<Scalar> > x_dot =
336 Thyra::createMember(fsaImplicitModel_->get_x_space());
337 this->timeDer_->compute(x, x_dot);
339 MEB::InArgs<Scalar> fsaImplicitInArgs(this->wrapperImplicitInArgs_);
340 MEB::OutArgs<Scalar> fsaImplicitOutArgs(this->wrapperImplicitOutArgs_);
341 fsaImplicitInArgs.set_x(x);
342 fsaImplicitInArgs.set_x_dot(x_dot);
343 for (
int i = 0; i < fsaImplicitModel_->Np(); ++i) {
345 if ((inArgs.get_p(i) != Teuchos::null) && (i != p_index))
346 fsaImplicitInArgs.set_p(i, inArgs.get_p(i));
353 RCP<const Thyra::VectorBase<Scalar> > y;
354 RCP<const Thyra::MultiVectorBase<Scalar> > dydp;
355 if (fsaImplicitInArgs.get_p(p_index) != Teuchos::null) {
356 RCP<const Thyra::VectorBase<Scalar> > p = fsaImplicitInArgs.get_p(p_index);
357 RCP<const Thyra::MultiVectorBase<Scalar> > p_mv =
358 rcp_dynamic_cast<const DMVPV>(p,
true)->getMultiVector();
359 const int num_param = p_mv->domain()->dim() - 1;
361 dydp = p_mv->subView(Range1D(1, num_param));
362 fsaImplicitInArgs.set_p(p_index, y);
364 if (use_dfdp_as_tangent_) {
365 RCP<const Thyra::VectorBase<Scalar> > dydp_vec =
366 Thyra::multiVectorProductVector(explicit_dydp_prod_space_, dydp);
367 fsaImplicitInArgs.set_p(y_tangent_index_, dydp_vec);
370 fsaImplicitOutArgs.set_f(outArgs.get_f());
371 fsaImplicitOutArgs.set_W_op(outArgs.get_W_op());
373 fsaImplicitModel_->evalModel(fsaImplicitInArgs, fsaImplicitOutArgs);
377 if (!use_dfdp_as_tangent_ && outArgs.get_f() != Teuchos::null) {
378 MEB::InArgs<Scalar> appImplicitInArgs =
379 appImplicitModel_->getNominalValues();
380 RCP<const Thyra::VectorBase<Scalar> > app_x =
381 rcp_dynamic_cast<const DMVPV>(x,
true)->getMultiVector()->col(0);
382 RCP<const Thyra::VectorBase<Scalar> > app_x_dot =
383 rcp_dynamic_cast<const DMVPV>(x_dot,
true)->getMultiVector()->col(0);
384 appImplicitInArgs.set_x(app_x);
385 appImplicitInArgs.set_x_dot(app_x_dot);
386 for (
int i = 0; i < appImplicitModel_->Np(); ++i) {
387 if (i != p_index) appImplicitInArgs.set_p(i, inArgs.get_p(i));
389 appImplicitInArgs.set_p(p_index, y);
390 if (appImplicitInArgs.supports(MEB::IN_ARG_t))
391 appImplicitInArgs.set_t(inArgs.get_t());
392 MEB::OutArgs<Scalar> appImplicitOutArgs =
393 appImplicitModel_->createOutArgs();
394 MEB::DerivativeSupport dfdp_support =
395 appImplicitOutArgs.supports(MEB::OUT_ARG_DfDp, p_index);
396 Thyra::EOpTransp trans = Thyra::NOTRANS;
397 if (dfdp_support.supports(MEB::DERIV_LINEAR_OP)) {
398 if (my_dfdp_op_ == Teuchos::null)
399 my_dfdp_op_ = appImplicitModel_->create_DfDp_op(p_index);
400 appImplicitOutArgs.set_DfDp(p_index,
401 MEB::Derivative<Scalar>(my_dfdp_op_));
402 trans = Thyra::NOTRANS;
404 else if (dfdp_support.supports(MEB::DERIV_MV_JACOBIAN_FORM)) {
405 if (my_dfdp_mv_ == Teuchos::null)
406 my_dfdp_mv_ = Thyra::createMembers(
407 appImplicitModel_->get_f_space(),
408 appImplicitModel_->get_p_space(p_index)->dim());
409 appImplicitOutArgs.set_DfDp(
411 MEB::Derivative<Scalar>(my_dfdp_mv_, MEB::DERIV_MV_JACOBIAN_FORM));
412 my_dfdp_op_ = my_dfdp_mv_;
413 trans = Thyra::NOTRANS;
415 else if (dfdp_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
416 if (my_dfdp_mv_ == Teuchos::null)
418 Thyra::createMembers(appImplicitModel_->get_p_space(p_index),
419 appImplicitModel_->get_f_space()->dim());
420 appImplicitOutArgs.set_DfDp(
422 MEB::Derivative<Scalar>(my_dfdp_mv_, MEB::DERIV_MV_GRADIENT_FORM));
423 my_dfdp_op_ = my_dfdp_mv_;
424 trans = Thyra::TRANS;
427 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
428 "Invalid df/dp support");
430 appImplicitModel_->evalModel(appImplicitInArgs, appImplicitOutArgs);
433 RCP<DMVPV> f_dfdp = rcp_dynamic_cast<DMVPV>(outArgs.get_f(),
true);
434 const int num_param = f_dfdp->getNonconstMultiVector()->domain()->dim() - 1;
435 RCP<Thyra::MultiVectorBase<Scalar> > dfdp =
436 f_dfdp->getNonconstMultiVector()->subView(Range1D(1, num_param));
437 my_dfdp_op_->apply(trans, *dydp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));