69 using Teuchos::rcp_dynamic_cast;
76 RCP<const Thyra::VectorBase<Scalar> > z =
80 TEUCHOS_TEST_FOR_EXCEPTION( !(
getIMEXVector(z)->space()->isCompatible(
83 "Error - WrapperModelEvaluatorPairIMEX_CombinedFSA::initialize()\n"
84 " Explicit and Implicit vector x spaces are incompatible!\n"
85 " Explicit vector x space = " << *(
getIMEXVector(z)->space()) <<
"\n"
86 " Implicit vector x space = " << *(this->
implicitModel_->get_x_space()) <<
90 const RCP<const DMVPV> z_dmvpv = rcp_dynamic_cast<const DMVPV>(z,
true);
91 const RCP<const Thyra::MultiVectorBase<Scalar> > z_mv =
92 z_dmvpv->getMultiVector();
93 RCP<const PMVB> zPVector = rcp_dynamic_cast<const PMVB>(z_mv);
94 TEUCHOS_TEST_FOR_EXCEPTION( zPVector == Teuchos::null, std::logic_error,
95 "Error - WrapperModelEvaluatorPairPartIMEX_CombinedFSA::initialize()\n"
96 " was given a VectorBase that could not be cast to a\n"
97 " ProductVectorBase!\n");
99 int numBlocks = zPVector->productSpace()->numBlocks();
104 "Error - WrapperModelEvaluatorPairPartIMEX_CombinedFSA::initialize()\n"
105 "Invalid number of explicit-only blocks = " <<
107 "Should be in the interval [0, numBlocks) = [0, " << numBlocks <<
")\n");
131 using Teuchos::rcp_dynamic_cast;
134 using Thyra::multiVectorProductVector;
141 if(full == Teuchos::null)
142 return Teuchos::null;
147 const RCP<DMVPV> full_dmvpv = rcp_dynamic_cast<DMVPV>(full,
true);
148 const RCP<MultiVectorBase<Scalar> > full_mv =
149 full_dmvpv->getNonconstMultiVector();
150 const RCP<PMVB> blk_full_mv = rcp_dynamic_cast<PMVB>(full_mv,
true);
153 const int numBlocks = blk_full_mv->productSpace()->numBlocks();
155 if (numBlocks == numExplicitBlocks+1) {
156 const RCP<MultiVectorBase<Scalar> > imex_mv =
157 blk_full_mv->getNonconstMultiVectorBlock(numExplicitBlocks);
162 TEUCHOS_ASSERT(
false);
163 return Teuchos::null;
172 using Teuchos::rcp_dynamic_cast;
175 using Thyra::multiVectorProductVector;
182 if(full == Teuchos::null)
183 return Teuchos::null;
188 const RCP<const DMVPV> full_dmvpv = rcp_dynamic_cast<const DMVPV>(full,
true);
189 const RCP<const MultiVectorBase<Scalar> > full_mv =
190 full_dmvpv->getMultiVector();
191 const RCP<const PMVB> blk_full_mv =
192 rcp_dynamic_cast<const PMVB>(full_mv,
true);
195 const int numBlocks = blk_full_mv->productSpace()->numBlocks();
197 if (numBlocks == numExplicitBlocks+1) {
198 const RCP<const MultiVectorBase<Scalar> > imex_mv =
199 blk_full_mv->getMultiVectorBlock(numExplicitBlocks);
204 TEUCHOS_ASSERT(
false);
205 return Teuchos::null;
215 using Teuchos::rcp_dynamic_cast;
218 using Thyra::multiVectorProductVectorSpace;
219 using Thyra::multiVectorProductVector;
226 if(full == Teuchos::null)
227 return Teuchos::null;
232 const RCP<DMVPV> full_dmvpv = rcp_dynamic_cast<DMVPV>(full,
true);
233 const RCP<MultiVectorBase<Scalar> > full_mv =
234 full_dmvpv->getNonconstMultiVector();
235 const RCP<PMVB> blk_full_mv = rcp_dynamic_cast<PMVB>(full_mv,
true);
239 if (numExplicitBlocks == 1) {
240 const RCP<MultiVectorBase<Scalar> > explicit_mv =
241 blk_full_mv->getNonconstMultiVectorBlock(0);
246 TEUCHOS_ASSERT(
false);
247 return Teuchos::null;
257 using Teuchos::rcp_dynamic_cast;
260 using Thyra::multiVectorProductVectorSpace;
261 using Thyra::multiVectorProductVector;
268 if(full == Teuchos::null)
269 return Teuchos::null;
274 const RCP<const DMVPV> full_dmvpv = rcp_dynamic_cast<const DMVPV>(full,
true);
275 const RCP<const MultiVectorBase<Scalar> > full_mv =
276 full_dmvpv->getMultiVector();
277 const RCP<const PMVB> blk_full_mv =
278 rcp_dynamic_cast<const PMVB>(full_mv,
true);
282 if (numExplicitBlocks == 1) {
283 const RCP<const MultiVectorBase<Scalar> > explicit_mv =
284 blk_full_mv->getMultiVectorBlock(0);
289 TEUCHOS_ASSERT(
false);
290 return Teuchos::null;
330evalModelImpl(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
331 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> & outArgs)
const
333 typedef Thyra::ModelEvaluatorBase MEB;
335 using Teuchos::rcp_dynamic_cast;
336 using Teuchos::Range1D;
343 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
344 RCP<Thyra::VectorBase<Scalar> > x_dot =
350 fsaImplicitInArgs.set_x(x);
351 fsaImplicitInArgs.set_x_dot(x_dot);
354 if ((inArgs.get_p(i) != Teuchos::null) && (i != p_index))
355 fsaImplicitInArgs.set_p(i, inArgs.get_p(i));
362 RCP<const Thyra::VectorBase<Scalar> > y;
363 RCP<const Thyra::MultiVectorBase<Scalar> > dydp;
364 if (fsaImplicitInArgs.get_p(p_index) != Teuchos::null) {
365 RCP<const Thyra::VectorBase<Scalar> > p =
366 fsaImplicitInArgs.get_p(p_index);
367 RCP<const Thyra::MultiVectorBase<Scalar> > p_mv =
368 rcp_dynamic_cast<const DMVPV>(p,
true)->getMultiVector();
369 const int num_param = p_mv->domain()->dim()-1;
371 dydp = p_mv->subView(Range1D(1,num_param));
372 fsaImplicitInArgs.set_p(p_index, y);
375 RCP< const Thyra::VectorBase<Scalar> > dydp_vec =
380 fsaImplicitOutArgs.set_f(outArgs.get_f());
381 fsaImplicitOutArgs.set_W_op(outArgs.get_W_op());
388 MEB::InArgs<Scalar> appImplicitInArgs =
390 RCP< const Thyra::VectorBase<Scalar> > app_x =
391 rcp_dynamic_cast<const DMVPV>(x,
true)->getMultiVector()->col(0);
392 RCP< const Thyra::VectorBase<Scalar> > app_x_dot =
393 rcp_dynamic_cast<const DMVPV>(x_dot,
true)->getMultiVector()->col(0);
394 appImplicitInArgs.set_x(app_x);
395 appImplicitInArgs.set_x_dot(app_x_dot);
398 appImplicitInArgs.set_p(i, inArgs.get_p(i));
400 appImplicitInArgs.set_p(p_index, y);
401 if (appImplicitInArgs.supports(MEB::IN_ARG_t))
402 appImplicitInArgs.set_t(inArgs.get_t());
403 MEB::OutArgs<Scalar> appImplicitOutArgs =
405 MEB::DerivativeSupport dfdp_support =
406 appImplicitOutArgs.supports(MEB::OUT_ARG_DfDp, p_index);
407 Thyra::EOpTransp trans = Thyra::NOTRANS;
408 if (dfdp_support.supports(MEB::DERIV_LINEAR_OP)) {
411 appImplicitOutArgs.set_DfDp(p_index,
413 trans = Thyra::NOTRANS;
415 else if (dfdp_support.supports(MEB::DERIV_MV_JACOBIAN_FORM)) {
420 appImplicitOutArgs.set_DfDp(
422 MEB::DERIV_MV_JACOBIAN_FORM));
424 trans = Thyra::NOTRANS;
426 else if (dfdp_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
431 appImplicitOutArgs.set_DfDp(
433 MEB::DERIV_MV_GRADIENT_FORM));
435 trans = Thyra::TRANS;
438 TEUCHOS_TEST_FOR_EXCEPTION(
439 true, std::logic_error,
"Invalid df/dp support");
444 RCP<DMVPV> f_dfdp = rcp_dynamic_cast<DMVPV>(outArgs.get_f(),
true);
445 const int num_param = f_dfdp->getNonconstMultiVector()->domain()->dim()-1;
446 RCP<Thyra::MultiVectorBase<Scalar> > dfdp =
447 f_dfdp->getNonconstMultiVector()->subView(Range1D(1,num_param));
448 my_dfdp_op_->apply(trans, *dydp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));