21 const bool is_pseudotransient,
22 const Teuchos::RCP<const Teuchos::ParameterList>& pList) :
29 using Thyra::multiVectorProductVectorSpace;
31 RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
32 if (pList != Teuchos::null)
37 pl->remove(
"Sensitivity Y Tangent Index");
45 const int sens_param_index = pl->get<
int>(
"Sensitivity Parameter Index");
46 const int num_sens_param =
48 RCP<const Thyra::VectorSpaceBase<Scalar> > explicit_y_space =
50 RCP<const Thyra::VectorSpaceBase<Scalar> > implicit_x_space =
53 multiVectorProductVectorSpace(explicit_y_space, num_sens_param);
55 multiVectorProductVectorSpace(implicit_x_space, num_sens_param);
68 using Teuchos::rcp_dynamic_cast;
75 RCP<const Thyra::VectorBase<Scalar> > z =
79 TEUCHOS_TEST_FOR_EXCEPTION( !(
getIMEXVector(z)->space()->isCompatible(
82 "Error - WrapperModelEvaluatorPairIMEX_StaggeredFSA::initialize()\n"
83 " Explicit and Implicit vector x spaces are incompatible!\n"
84 " Explicit vector x space = " << *(
getIMEXVector(z)->space()) <<
"\n"
85 " Implicit vector x space = " << *(this->
implicitModel_->get_x_space()) <<
89 const RCP<const DMVPV> z_dmvpv = rcp_dynamic_cast<const DMVPV>(z,
true);
90 const RCP<const Thyra::MultiVectorBase<Scalar> > z_mv =
91 z_dmvpv->getMultiVector();
92 RCP<const PMVB> zPVector = rcp_dynamic_cast<const PMVB>(z_mv);
93 TEUCHOS_TEST_FOR_EXCEPTION( zPVector == Teuchos::null, std::logic_error,
94 "Error - WrapperModelEvaluatorPairPartIMEX_StaggeredFSA::initialize()\n"
95 " was given a VectorBase that could not be cast to a\n"
96 " ProductVectorBase!\n");
98 int numBlocks = zPVector->productSpace()->numBlocks();
103 "Error - WrapperModelEvaluatorPairPartIMEX_StaggeredFSA::initialize()\n"
104 "Invalid number of explicit-only blocks = " <<
106 "Should be in the interval [0, numBlocks) = [0, " << numBlocks <<
")\n");
130 using Teuchos::rcp_dynamic_cast;
133 using Thyra::multiVectorProductVector;
140 if(full == Teuchos::null)
141 return Teuchos::null;
146 const RCP<DMVPV> full_dmvpv = rcp_dynamic_cast<DMVPV>(full,
true);
147 const RCP<MultiVectorBase<Scalar> > full_mv =
148 full_dmvpv->getNonconstMultiVector();
149 const RCP<PMVB> blk_full_mv = rcp_dynamic_cast<PMVB>(full_mv,
true);
152 const int numBlocks = blk_full_mv->productSpace()->numBlocks();
154 if (numBlocks == numExplicitBlocks+1) {
155 const RCP<MultiVectorBase<Scalar> > imex_mv =
156 blk_full_mv->getNonconstMultiVectorBlock(numExplicitBlocks);
161 TEUCHOS_ASSERT(
false);
162 return Teuchos::null;
171 using Teuchos::rcp_dynamic_cast;
174 using Thyra::multiVectorProductVector;
181 if(full == Teuchos::null)
182 return Teuchos::null;
187 const RCP<const DMVPV> full_dmvpv = rcp_dynamic_cast<const DMVPV>(full,
true);
188 const RCP<const MultiVectorBase<Scalar> > full_mv =
189 full_dmvpv->getMultiVector();
190 const RCP<const PMVB> blk_full_mv =
191 rcp_dynamic_cast<const PMVB>(full_mv,
true);
194 const int numBlocks = blk_full_mv->productSpace()->numBlocks();
196 if (numBlocks == numExplicitBlocks+1) {
197 const RCP<const MultiVectorBase<Scalar> > imex_mv =
198 blk_full_mv->getMultiVectorBlock(numExplicitBlocks);
203 TEUCHOS_ASSERT(
false);
204 return Teuchos::null;
214 using Teuchos::rcp_dynamic_cast;
217 using Thyra::multiVectorProductVectorSpace;
218 using Thyra::multiVectorProductVector;
225 if(full == Teuchos::null)
226 return Teuchos::null;
231 const RCP<DMVPV> full_dmvpv = rcp_dynamic_cast<DMVPV>(full,
true);
232 const RCP<MultiVectorBase<Scalar> > full_mv =
233 full_dmvpv->getNonconstMultiVector();
234 const RCP<PMVB> blk_full_mv = rcp_dynamic_cast<PMVB>(full_mv,
true);
238 if (numExplicitBlocks == 1) {
239 const RCP<MultiVectorBase<Scalar> > explicit_mv =
240 blk_full_mv->getNonconstMultiVectorBlock(0);
245 TEUCHOS_ASSERT(
false);
246 return Teuchos::null;
256 using Teuchos::rcp_dynamic_cast;
259 using Thyra::multiVectorProductVectorSpace;
260 using Thyra::multiVectorProductVector;
267 if(full == Teuchos::null)
268 return Teuchos::null;
273 const RCP<const DMVPV> full_dmvpv = rcp_dynamic_cast<const DMVPV>(full,
true);
274 const RCP<const MultiVectorBase<Scalar> > full_mv =
275 full_dmvpv->getMultiVector();
276 const RCP<const PMVB> blk_full_mv =
277 rcp_dynamic_cast<const PMVB>(full_mv,
true);
281 if (numExplicitBlocks == 1) {
282 const RCP<const MultiVectorBase<Scalar> > explicit_mv =
283 blk_full_mv->getMultiVectorBlock(0);
288 TEUCHOS_ASSERT(
false);
289 return Teuchos::null;
366evalModelImpl(
const Thyra::ModelEvaluatorBase::InArgs<Scalar> & inArgs,
367 const Thyra::ModelEvaluatorBase::OutArgs<Scalar> & outArgs)
const
369 typedef Thyra::ModelEvaluatorBase MEB;
371 using Teuchos::rcp_dynamic_cast;
372 using Teuchos::Range1D;
377 if (
sh_ != Teuchos::null) {
378 forward_t = inArgs.get_t();
400 RCP<const Thyra::VectorBase<Scalar> > x = inArgs.get_x();
401 RCP<Thyra::VectorBase<Scalar> > x_dot =
407 if (fsaImplicitInArgs.supports(MEB::IN_ARG_t))
408 fsaImplicitInArgs.set_t(inArgs.get_t());
409 fsaImplicitInArgs.set_x(x);
410 fsaImplicitInArgs.set_x_dot(x_dot);
413 if ((inArgs.get_p(i) != Teuchos::null) && (i != p_index))
414 fsaImplicitInArgs.set_p(i, inArgs.get_p(i));
422 RCP<const Thyra::VectorBase<Scalar> > y =
424 RCP<const Thyra::MultiVectorBase<Scalar> > dydp;
425 if (fsaImplicitInArgs.get_p(p_index) != Teuchos::null) {
426 RCP<const Thyra::VectorBase<Scalar> > p =
427 fsaImplicitInArgs.get_p(p_index);
428 dydp = rcp_dynamic_cast<const DMVPV>(p,
true)->getMultiVector();
429 fsaImplicitInArgs.set_p(p_index, y);
432 RCP< const Thyra::VectorBase<Scalar> > dydp_vec =
437 fsaImplicitOutArgs.set_f(outArgs.get_f());
438 fsaImplicitOutArgs.set_W_op(outArgs.get_W_op());
445 MEB::InArgs<Scalar> appImplicitInArgs =
448 RCP< const Thyra::VectorBase<Scalar> > app_x =
450 RCP< const Thyra::VectorBase<Scalar> > app_x_dot =
452 appImplicitInArgs.set_x(app_x);
453 appImplicitInArgs.set_x_dot(app_x_dot);
456 appImplicitInArgs.set_p(i, inArgs.get_p(i));
458 appImplicitInArgs.set_p(p_index, y);
459 if (appImplicitInArgs.supports(MEB::IN_ARG_t))
460 appImplicitInArgs.set_t(forward_t);
461 MEB::OutArgs<Scalar> appImplicitOutArgs =
463 MEB::DerivativeSupport dfdp_support =
464 appImplicitOutArgs.supports(MEB::OUT_ARG_DfDp, p_index);
465 Thyra::EOpTransp trans = Thyra::NOTRANS;
466 if (dfdp_support.supports(MEB::DERIV_LINEAR_OP)) {
469 appImplicitOutArgs.set_DfDp(p_index,
471 trans = Thyra::NOTRANS;
473 else if (dfdp_support.supports(MEB::DERIV_MV_JACOBIAN_FORM)) {
478 appImplicitOutArgs.set_DfDp(
480 MEB::DERIV_MV_JACOBIAN_FORM));
482 trans = Thyra::NOTRANS;
484 else if (dfdp_support.supports(MEB::DERIV_MV_GRADIENT_FORM)) {
489 appImplicitOutArgs.set_DfDp(
491 MEB::DERIV_MV_GRADIENT_FORM));
493 trans = Thyra::TRANS;
496 TEUCHOS_TEST_FOR_EXCEPTION(
497 true, std::logic_error,
"Invalid df/dp support");
502 RCP<Thyra::MultiVectorBase<Scalar> > dfdp =
503 rcp_dynamic_cast<DMVPV>(outArgs.get_f(),
true)->getNonconstMultiVector();
504 my_dfdp_op_->apply(trans, *dydp, dfdp.ptr(), Scalar(1.0), Scalar(1.0));
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...