42 #ifndef THYRA_MODEL_EVALUATOR_HELPERS_HPP 43 #define THYRA_MODEL_EVALUATOR_HELPERS_HPP 46 #include "Thyra_ModelEvaluator.hpp" 59 template<
class Scalar>
60 RCP<ModelEvaluatorBase::InArgs<Scalar> >
61 clone(
const ModelEvaluatorBase::InArgs<Scalar> &inArgs );
65 template<
class Scalar>
66 ModelEvaluatorBase::Derivative<Scalar>
68 const RCP<MultiVectorBase<Scalar> > &grad
73 template<
class Scalar>
74 ModelEvaluatorBase::DerivativeMultiVector<Scalar>
76 const ModelEvaluator<Scalar>& model,
83 template<
class Scalar>
84 ModelEvaluatorBase::DerivativeMultiVector<Scalar>
86 const ModelEvaluator<Scalar>& model,
93 template<
class Scalar>
94 ModelEvaluatorBase::DerivativeMultiVector<Scalar>
96 const ModelEvaluator<Scalar>& model,
103 template<
class Scalar>
104 ModelEvaluatorBase::DerivativeMultiVector<Scalar>
106 const ModelEvaluator<Scalar>& model,
114 template<
class Scalar>
115 ModelEvaluatorBase::DerivativeMultiVector<Scalar>
117 const ModelEvaluatorBase::Derivative<Scalar> &deriv
118 ,
const std::string &derivName
123 template<
class Scalar>
124 RCP<MultiVectorBase<Scalar> >
126 const ModelEvaluatorBase::Derivative<Scalar> &deriv
127 ,
const std::string &derivName
137 template<
class Scalar>
138 void assertDerivSpaces(
139 const std::string &modelEvalDescription,
140 const ModelEvaluatorBase::Derivative<Scalar> &deriv,
141 const std::string &deriv_name,
142 const VectorSpaceBase<Scalar> &fnc_space,
143 const std::string &fnc_space_name,
144 const VectorSpaceBase<Scalar> &var_space,
145 const std::string &var_space_name
153 template<
class Scalar>
154 void assertInArgsOutArgsSetup(
155 const std::string &modelEvalDescription,
156 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
157 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs
165 template<
class Scalar>
166 void assertInArgsEvalObjects(
167 const ModelEvaluator<Scalar> &model,
168 const ModelEvaluatorBase::InArgs<Scalar> &inArgs
176 template<
class Scalar>
177 void assertOutArgsEvalObjects(
178 const ModelEvaluator<Scalar> &model,
179 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs,
180 const ModelEvaluatorBase::InArgs<Scalar> *inArgs = 0
185 template<
class Scalar>
187 const ModelEvaluator<Scalar> &model
188 ,
const VectorBase<Scalar> &x
189 ,VectorBase<Scalar> *f
194 template<
class Scalar>
196 const ModelEvaluator<Scalar> &model
197 ,
const VectorBase<Scalar> &x
198 ,VectorBase<Scalar> *f
199 ,LinearOpWithSolveBase<Scalar> *W
204 template<
class Scalar>
206 const ModelEvaluator<Scalar> &model
207 ,
const VectorBase<Scalar> &x
209 ,VectorBase<Scalar> *f
214 template<
class Scalar>
216 const ModelEvaluator<Scalar> &model,
218 const VectorBase<Scalar> &p_l,
220 const Ptr<VectorBase<Scalar> > &g_j
225 template<
class Scalar>
227 const ModelEvaluator<Scalar> &model,
229 const VectorBase<Scalar> &p_l,
232 VectorBase<Scalar> *g_j
237 template<
class Scalar>
239 const ModelEvaluator<Scalar> &model,
241 const VectorBase<Scalar> &p_l,
243 const Ptr<VectorBase<Scalar> > &g_j,
244 const ModelEvaluatorBase::Derivative<Scalar> &DgDp_j_l
249 template<
class Scalar>
251 const ModelEvaluator<Scalar> &model
252 ,
const VectorBase<Scalar> &x_dot
253 ,
const VectorBase<Scalar> &x
255 ,VectorBase<Scalar> *f
261 template<
class Scalar>
263 const ModelEvaluator<Scalar> &model
264 ,
const VectorBase<Scalar> &x_dot
265 ,
const VectorBase<Scalar> &x
269 ,VectorBase<Scalar> *f
270 ,LinearOpWithSolveBase<Scalar> *W
274 #ifdef HAVE_THYRA_ME_POLYNOMIAL 278 template<
class Scalar>
280 const ModelEvaluator<Scalar> &model
281 ,
const Teuchos::Polynomial< VectorBase<Scalar> > &x_poly
283 ,Teuchos::Polynomial< VectorBase<Scalar> > *f_poly
288 template<
class Scalar>
290 const ModelEvaluator<Scalar> &model
291 ,
const Teuchos::Polynomial< VectorBase<Scalar> > &x_dot_poly
292 ,
const VectorBase<Scalar> &x_poly
294 ,Teuchos::Polynomial< VectorBase<Scalar> > *f_poly
298 #endif // HAVE_THYRA_ME_POLYNOMIAL 309 #include "Thyra_AssertOp.hpp" 310 #include "Teuchos_Utils.hpp" 313 template<
class Scalar>
314 Teuchos::RCP<Thyra::ModelEvaluatorBase::InArgs<Scalar> >
315 Thyra::clone(
const ModelEvaluatorBase::InArgs<Scalar> &inArgs )
317 RCP<ModelEvaluatorBase::InArgs<Scalar> >
318 newInArgs = Teuchos::rcp(
new ModelEvaluatorBase::InArgs<Scalar>);
324 template<
class Scalar>
326 Thyra::derivativeGradient(
327 const RCP<MultiVectorBase<Scalar> > &grad
330 return ModelEvaluatorBase::Derivative<Scalar>(
332 ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM
337 template<
class Scalar>
339 Thyra::create_DfDp_mv(
340 const ModelEvaluator<Scalar>& model,
342 ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
345 TEUCHOS_TEST_FOR_EXCEPT(!(orientation==ModelEvaluatorBase::DERIV_MV_BY_COL));
346 return createMembers( model.get_f_space(), model.get_p_space(l)->dim() );
350 template<
class Scalar>
352 Thyra::create_DgDx_dot_mv(
353 const ModelEvaluator<Scalar>& model,
355 ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
358 typedef ModelEvaluatorBase MEB;
359 switch(orientation) {
360 case MEB::DERIV_MV_BY_COL:
362 MEB::DerivativeMultiVector<Scalar>(
363 createMembers( model.get_g_space(j), model.get_x_space()->dim() )
364 ,MEB::DERIV_MV_BY_COL
366 case MEB::DERIV_TRANS_MV_BY_ROW:
368 MEB::DerivativeMultiVector<Scalar>(
369 createMembers( model.get_x_space(), model.get_g_space(j)->dim() )
370 ,MEB::DERIV_TRANS_MV_BY_ROW
373 TEUCHOS_TEST_FOR_EXCEPT(
true);
375 return MEB::DerivativeMultiVector<Scalar>();
379 template<
class Scalar>
381 Thyra::create_DgDx_mv(
382 const ModelEvaluator<Scalar>& model,
384 ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
391 template<
class Scalar>
393 Thyra::create_DgDp_mv(
394 const ModelEvaluator<Scalar>& model,
397 ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
400 typedef ModelEvaluatorBase MEB;
401 switch(orientation) {
402 case MEB::DERIV_MV_BY_COL:
404 MEB::DerivativeMultiVector<Scalar>(
405 createMembers( model.get_g_space(j), model.get_p_space(l)->dim() )
406 ,MEB::DERIV_MV_BY_COL
408 case MEB::DERIV_TRANS_MV_BY_ROW:
410 MEB::DerivativeMultiVector<Scalar>(
411 createMembers( model.get_p_space(l), model.get_g_space(j)->dim() )
412 ,MEB::DERIV_TRANS_MV_BY_ROW
415 TEUCHOS_TEST_FOR_EXCEPT(
true);
417 return MEB::DerivativeMultiVector<Scalar>();
421 template<
class Scalar>
424 const ModelEvaluatorBase::Derivative<Scalar> &deriv
425 ,
const std::string &derivName
428 TEUCHOS_TEST_FOR_EXCEPTION(
429 deriv.getLinearOp().get()!=NULL, std::logic_error
430 ,
"Error, LinearOpBase type not expected for " << derivName <<
"!" 432 return deriv.getDerivativeMultiVector();
436 template<
class Scalar>
437 Teuchos::RCP<Thyra::MultiVectorBase<Scalar> >
439 const ModelEvaluatorBase::Derivative<Scalar> &deriv
440 ,
const std::string &derivName
441 ,ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
444 typedef ModelEvaluatorBase MEB;
445 TEUCHOS_TEST_FOR_EXCEPTION(
446 deriv.getLinearOp().get()!=NULL, std::logic_error
447 ,
"Error, LinearOpBase type not expected for " << derivName <<
"!" 449 MEB::DerivativeMultiVector<Scalar>
450 dmv = deriv.getDerivativeMultiVector();
451 RCP<MultiVectorBase<Scalar> >
454 TEUCHOS_TEST_FOR_EXCEPTION(
455 dmv.getOrientation() != orientation, std::logic_error
456 ,
"Error, the orientation " <<
toString(dmv.getOrientation()) <<
" is not the" 457 " expected orientation of " <<
toString(orientation)
458 <<
" for " << derivName <<
"!" 465 template<
class Scalar>
466 void Thyra::assertDerivSpaces(
467 const std::string &modelEvalDescription,
468 const ModelEvaluatorBase::Derivative<Scalar> &deriv,
469 const std::string &deriv_name,
470 const VectorSpaceBase<Scalar> &fnc_space,
471 const std::string &fnc_space_name,
472 const VectorSpaceBase<Scalar> &var_space,
473 const std::string &var_space_name
476 typedef ModelEvaluatorBase MEB;
477 if (!is_null(deriv.getLinearOp())) {
478 const RCP<const LinearOpBase<Scalar> > lo = deriv.getLinearOp();
479 if (!is_null(lo->range())) {
481 modelEvalDescription,
482 *lo->range(), deriv_name +
".range()",
483 fnc_space, fnc_space_name
486 modelEvalDescription,
487 *lo->domain(), deriv_name +
".domain()",
488 var_space, var_space_name
492 else if(!is_null(deriv.getMultiVector())) {
493 const RCP<const LinearOpBase<Scalar> > mv = deriv.getMultiVector();
494 switch(deriv.getMultiVectorOrientation()) {
495 case MEB::DERIV_MV_BY_COL: {
497 modelEvalDescription,
498 *mv->range(), deriv_name +
".range()",
499 fnc_space, fnc_space_name
502 modelEvalDescription,
503 *mv->domain(), deriv_name +
".domain()",
504 var_space, var_space_name
508 case MEB::DERIV_TRANS_MV_BY_ROW: {
510 modelEvalDescription,
511 *mv->range(), deriv_name +
"^T.range()",
512 var_space, var_space_name
515 modelEvalDescription,
516 *mv->domain(), deriv_name +
"^T.domain()",
517 fnc_space, fnc_space_name
523 TEUCHOS_TEST_FOR_EXCEPT(
true);
530 template<
class Scalar>
531 void Thyra::assertInArgsOutArgsSetup(
532 const std::string &modelEvalDescription,
533 const ModelEvaluatorBase::InArgs<Scalar> &inArgs,
534 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs
538 typedef ModelEvaluatorBase MEB;
540 const int Ng = outArgs.Ng();
541 const int Np = outArgs.Np();
544 TEUCHOS_ASSERT_EQUALITY(inArgs.modelEvalDescription(), modelEvalDescription);
545 TEUCHOS_ASSERT_EQUALITY(outArgs.modelEvalDescription(), modelEvalDescription);
548 TEUCHOS_TEST_FOR_EXCEPTION(
549 inArgs.Np() != outArgs.Np(), std::logic_error,
550 "Error: The underlying model " << modelEvalDescription <<
" incorrectly\n" 551 "set inArgs.Np() = "<<inArgs.Np()<<
" != outArgs.Np() = " 556 TEUCHOS_TEST_FOR_EXCEPTION(
557 inArgs.supports(MEB::IN_ARG_x_dot) && !inArgs.supports(MEB::IN_ARG_x),
559 "Error: The underlying model " << modelEvalDescription <<
" supports\n" 560 "x_dot but does not support x!" 564 TEUCHOS_TEST_FOR_EXCEPTION(
565 inArgs.supports(MEB::IN_ARG_x_dot) && !inArgs.supports(MEB::IN_ARG_t),
567 "Error: The underlying model " << modelEvalDescription <<
" supports\n" 568 "x_dot but does not support t!" 572 TEUCHOS_TEST_FOR_EXCEPTION(
574 ( outArgs.supports(MEB::OUT_ARG_W) || outArgs.supports(MEB::OUT_ARG_W_op) )
576 !inArgs.supports(MEB::IN_ARG_x)
579 "Error: The underlying model " << modelEvalDescription <<
" says that\n" 580 "it supports W and/or W_op but it does not support x!" 582 TEUCHOS_TEST_FOR_EXCEPTION(
584 ( outArgs.supports(MEB::OUT_ARG_W) || outArgs.supports(MEB::OUT_ARG_W_op) )
586 inArgs.supports(MEB::IN_ARG_x_dot)
588 !( inArgs.supports(MEB::IN_ARG_alpha) && inArgs.supports(MEB::IN_ARG_beta) )
591 "Error: The underlying model " << modelEvalDescription <<
" supports W and/or W_op\n" 592 "and x_dot but it does not support alpha and beta as InArgs!" 595 for (
int l = 0; l < Np; ++l ) {
599 for (
int j = 0; j < Ng; ++j ) {
602 TEUCHOS_TEST_FOR_EXCEPTION(
603 ( !outArgs.supports(MEB::OUT_ARG_DgDx_dot,j).none()
604 && !inArgs.supports(MEB::IN_ARG_x_dot) ),
606 "Error: The underlying model " << modelEvalDescription <<
" says that\n" 607 "it supports DgDx_dot("<<j<<
") but it does not support x_dot!" 611 TEUCHOS_TEST_FOR_EXCEPTION(
612 ( !outArgs.supports(MEB::OUT_ARG_DgDx,j).none()
613 && !inArgs.supports(MEB::IN_ARG_x) ),
615 "Error: The underlying model " << modelEvalDescription <<
" says that\n" 616 "it supports DgDx("<<j<<
") but it does not support x!" 628 template<
class Scalar>
629 void Thyra::assertInArgsEvalObjects(
630 const ModelEvaluator<Scalar> &model,
631 const ModelEvaluatorBase::InArgs<Scalar> &inArgs
635 typedef ModelEvaluatorBase MEB;
637 const std::string description = model.description();
638 const int Np = inArgs.Np();
640 model.createInArgs().assertSameSupport(inArgs);
643 if ( inArgs.supports(MEB::IN_ARG_x_dot) && !is_null(inArgs.get_x_dot()) ) {
645 description, *inArgs.get_x_dot()->space(), *model.get_x_space() );
649 if ( inArgs.supports(MEB::IN_ARG_x) && !is_null(inArgs.get_x()) ) {
651 description, *inArgs.get_x()->space(), *model.get_x_space() );
655 for (
int l = 0; l < Np; ++l ) {
656 if (!is_null(inArgs.get_p(l))) {
658 description, *inArgs.get_p(l)->space(), *model.get_p_space(l) );
665 template<
class Scalar>
666 void Thyra::assertOutArgsEvalObjects(
667 const ModelEvaluator<Scalar> &model,
668 const ModelEvaluatorBase::OutArgs<Scalar> &outArgs,
669 const ModelEvaluatorBase::InArgs<Scalar> *inArgs
673 typedef ScalarTraits<Scalar> ST;
674 typedef Teuchos::Utils TU;
675 typedef ModelEvaluatorBase MEB;
677 const std::string description = model.description();
678 const int Ng = outArgs.Ng();
679 const int Np = outArgs.Np();
682 TEUCHOS_ASSERT_EQUALITY(outArgs.Np(), inArgs->Np());
685 model.createOutArgs().assertSameSupport(outArgs);
688 if ( outArgs.supports(MEB::OUT_ARG_f) && !is_null(outArgs.get_f()) ) {
690 description, *outArgs.get_f()->space(), *model.get_f_space() );
694 if ( outArgs.supports(MEB::OUT_ARG_W) && !is_null(outArgs.get_W()) ) {
695 if (!is_null(outArgs.get_W()->range())) {
697 description, *outArgs.get_W()->range(), *model.get_f_space() );
699 description, *outArgs.get_W()->domain(), *model.get_x_space() );
704 if ( outArgs.supports(MEB::OUT_ARG_W_op) && !is_null(outArgs.get_W_op()) ) {
705 if (!is_null(outArgs.get_W_op()->range())) {
707 description, *outArgs.get_W_op()->range(), *model.get_f_space() );
709 description, *outArgs.get_W_op()->domain(), *model.get_x_space() );
719 ( outArgs.supports(MEB::OUT_ARG_W) && !is_null(outArgs.get_W()) )
721 ( outArgs.supports(MEB::OUT_ARG_W_op) && !is_null(outArgs.get_W_op()) )
725 if ( inArgs->supports(MEB::IN_ARG_alpha) && inArgs->supports(MEB::IN_ARG_beta) ) {
733 else if ( inArgs->supports(MEB::IN_ARG_beta) ) {
734 TEUCHOS_TEST_FOR_EXCEPT( inArgs->get_beta() == ST::zero() );
739 if (outArgs.supports(MEB::OUT_ARG_f)) {
740 for (
int l = 0; l < Np; ++l ) {
741 if (!outArgs.supports(MEB::OUT_ARG_DfDp,l).none()) {
745 *model.get_f_space(),
"f_space",
753 for (
int j = 0; j < Ng; ++j ) {
754 if (!is_null(outArgs.get_g(j))) {
756 description, *outArgs.get_g(j)->space(), *model.get_g_space(j) );
761 for (
int j = 0; j < Ng; ++j ) {
762 if (!outArgs.supports(MEB::OUT_ARG_DgDx_dot,j).none()) {
765 outArgs.get_DgDx_dot(j),
"DgDx_dot("+
TU::toString(j)+
")",
767 *model.get_x_space(),
"x_space" 773 for (
int j = 0; j < Ng; ++j ) {
774 if (!outArgs.supports(MEB::OUT_ARG_DgDx,j).none()) {
779 *model.get_x_space(),
"x_space" 785 for (
int j = 0; j < Ng; ++j ) {
786 for (
int l = 0; l < Np; ++l ) {
787 if (!outArgs.supports(MEB::OUT_ARG_DgDp,j,l).none()) {
792 outArgs.get_DgDp(j,l),
"DgDp("+j_str+
","+l_str+
")",
793 *model.get_g_space(j),
"g_space("+j_str+
")",
794 *model.get_p_space(l),
"p_space("+l_str+
")" 803 template<
class Scalar>
805 const ModelEvaluator<Scalar> &model
806 ,
const VectorBase<Scalar> &x
807 ,VectorBase<Scalar> *f
810 typedef ModelEvaluatorBase MEB;
811 MEB::InArgs<Scalar> inArgs = model.createInArgs();
812 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
813 inArgs.set_x(Teuchos::rcp(&x,
false));
814 outArgs.set_f(Teuchos::rcp(f,
false));
815 model.evalModel(inArgs,outArgs);
819 template<
class Scalar>
820 void Thyra::eval_f_W(
821 const ModelEvaluator<Scalar> &model
822 ,
const VectorBase<Scalar> &x
823 ,VectorBase<Scalar> *f
824 ,LinearOpWithSolveBase<Scalar> *W
828 typedef ModelEvaluatorBase MEB;
830 MEB::InArgs<Scalar> inArgs = model.createInArgs();
831 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
833 inArgs.set_x(Teuchos::rcp(&x,
false));
835 if (f) outArgs.set_f(Teuchos::rcp(f,
false));
836 if (W) outArgs.set_W(Teuchos::rcp(W,
false));
838 model.evalModel(inArgs,outArgs);
843 template<
class Scalar>
845 const ModelEvaluator<Scalar> &model
846 ,
const VectorBase<Scalar> &x
848 ,VectorBase<Scalar> *f
851 typedef ModelEvaluatorBase MEB;
852 MEB::InArgs<Scalar> inArgs = model.createInArgs();
853 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
854 inArgs.set_x(Teuchos::rcp(&x,
false));
855 if(inArgs.supports(MEB::IN_ARG_t)) inArgs.set_t(t);
856 outArgs.set_f(Teuchos::rcp(f,
false));
857 model.evalModel(inArgs,outArgs);
861 template<
class Scalar>
863 const ModelEvaluator<Scalar> &model,
865 const VectorBase<Scalar> &p_l,
867 const Ptr<VectorBase<Scalar> > &g_j
870 typedef ModelEvaluatorBase MEB;
871 MEB::InArgs<Scalar> inArgs = model.createInArgs();
872 MEB::OutArgs<Scalar> outArgs= model.createOutArgs();
873 inArgs.set_p(l, Teuchos::rcpFromRef(p_l));
874 outArgs.set_g(j, Teuchos::rcpFromRef(*g_j));
875 model.evalModel(inArgs,outArgs);
879 template<
class Scalar>
881 const ModelEvaluator<Scalar> &model,
883 const VectorBase<Scalar> &p_l,
886 VectorBase<Scalar> *g_j
889 typedef ModelEvaluatorBase MEB;
890 MEB::InArgs<Scalar> inArgs = model.createInArgs();
891 MEB::OutArgs<Scalar> outArgs= model.createOutArgs();
892 inArgs.set_p(l,Teuchos::rcp(&p_l,
false));
894 outArgs.set_g(j,Teuchos::rcp(g_j,
false));
895 model.evalModel(inArgs,outArgs);
899 template<
class Scalar>
900 void Thyra::eval_g_DgDp(
901 const ModelEvaluator<Scalar> &model,
903 const VectorBase<Scalar> &p_l,
905 const Ptr<VectorBase<Scalar> > &g_j,
906 const ModelEvaluatorBase::Derivative<Scalar> &DgDp_j_l
909 typedef ModelEvaluatorBase MEB;
910 MEB::InArgs<Scalar> inArgs = model.createInArgs();
911 MEB::OutArgs<Scalar> outArgs= model.createOutArgs();
912 inArgs.set_p(l, Teuchos::rcpFromRef(p_l));
914 outArgs.set_g(j, Teuchos::rcpFromPtr(g_j));
916 if (!DgDp_j_l.isEmpty()) {
917 outArgs.set_DgDp(j, l, DgDp_j_l);
919 model.evalModel(inArgs,outArgs);
923 template<
class Scalar>
925 const ModelEvaluator<Scalar> &model
926 ,
const VectorBase<Scalar> &x_dot
927 ,
const VectorBase<Scalar> &x
928 ,
const typename ModelEvaluatorBase::InArgs<Scalar>::ScalarMag &t
929 ,VectorBase<Scalar> *f
933 typedef ModelEvaluatorBase MEB;
935 MEB::InArgs<Scalar> inArgs = model.createInArgs();
936 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
938 inArgs.set_x_dot(Teuchos::rcp(&x_dot,
false));
939 inArgs.set_x(Teuchos::rcp(&x,
false));
940 if(inArgs.supports(MEB::IN_ARG_t))
943 outArgs.set_f(Teuchos::rcp(f,
false));
945 model.evalModel(inArgs,outArgs);
950 template<
class Scalar>
951 void Thyra::eval_f_W(
952 const ModelEvaluator<Scalar> &model
953 ,
const VectorBase<Scalar> &x_dot
954 ,
const VectorBase<Scalar> &x
955 ,
const typename ModelEvaluatorBase::InArgs<Scalar>::ScalarMag &t
958 ,VectorBase<Scalar> *f
959 ,LinearOpWithSolveBase<Scalar> *W
963 typedef ModelEvaluatorBase MEB;
965 MEB::InArgs<Scalar> inArgs = model.createInArgs();
966 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
968 inArgs.set_x_dot(Teuchos::rcp(&x_dot,
false));
969 inArgs.set_x(Teuchos::rcp(&x,
false));
970 if(inArgs.supports(MEB::IN_ARG_t))
972 inArgs.set_alpha(alpha);
973 inArgs.set_beta(beta);
975 if(f) outArgs.set_f(Teuchos::rcp(f,
false));
976 if(W) outArgs.set_W(Teuchos::rcp(W,
false));
978 model.evalModel(inArgs,outArgs);
983 #ifdef HAVE_THYRA_ME_POLYNOMIAL 986 template<
class Scalar>
987 void Thyra::eval_f_poly(
988 const ModelEvaluator<Scalar> &model
989 ,
const Teuchos::Polynomial< VectorBase<Scalar> > &x_poly
990 ,
const typename ModelEvaluatorBase::InArgs<Scalar>::ScalarMag &t
991 ,Teuchos::Polynomial< VectorBase<Scalar> > *f_poly
995 typedef ModelEvaluatorBase MEB;
997 MEB::InArgs<Scalar> inArgs = model.createInArgs();
998 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
1000 inArgs.set_x_poly(Teuchos::rcp(&x_poly,
false));
1001 if(inArgs.supports(MEB::IN_ARG_t))
1004 outArgs.set_f_poly(Teuchos::rcp(f_poly,
false));
1006 model.evalModel(inArgs,outArgs);
1011 template<
class Scalar>
1012 void Thyra::eval_f_poly(
1013 const ModelEvaluator<Scalar> &model
1014 ,
const Teuchos::Polynomial< VectorBase<Scalar> > &x_dot_poly
1015 ,
const VectorBase<Scalar> &x_poly
1016 ,
const typename ModelEvaluatorBase::InArgs<Scalar>::ScalarMag &t
1017 ,Teuchos::Polynomial< VectorBase<Scalar> > *f_poly
1021 typedef ModelEvaluatorBase MEB;
1023 MEB::InArgs<Scalar> inArgs = model.createInArgs();
1024 MEB::OutArgs<Scalar> outArgs = model.createOutArgs();
1026 inArgs.set_x_dot_poly(Teuchos::rcp(&x_dot_poly,
false));
1027 inArgs.set_x_poly(Teuchos::rcp(&x_poly,
false));
1028 if(inArgs.supports(MEB::IN_ARG_t))
1031 outArgs.set_f_poly(Teuchos::rcp(f_poly,
false));
1033 model.evalModel(inArgs,outArgs);
1038 #endif // HAVE_THYRA_ME_POLYNOMIAL 1041 #endif // THYRA_MODEL_EVALUATOR_HELPERS_HPP #define THYRA_ASSERT_VEC_SPACES(FUNC_NAME, VS1, VS2)
This is a very useful macro that should be used to validate that two vector spaces are compatible...
std::string toString(ModelEvaluatorBase::EInArgsMembers)
EDerivativeMultiVectorOrientation
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
RCP< MultiVectorBase< Scalar > > getMultiVector() const
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
ModelEvaluatorBase::DerivativeMultiVector< Scalar > create_DgDx_dot_mv(const ModelEvaluator< Scalar > &model, int j, ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation)
void assertDerivSpaces(const std::string &modelEvalDescription, const ModelEvaluatorBase::Derivative< Scalar > &deriv, const std::string &deriv_name, const VectorSpaceBase< Scalar > &fnc_space, const std::string &fnc_space_name, const VectorSpaceBase< Scalar > &var_space, const std::string &var_space_name)
Assert that that Thyra objects imbedded in a Derivative object matches its function and variable spac...
#define THYRA_ASSERT_VEC_SPACES_NAMES(FUNC_NAME, VS1, VS1_NAME, VS2, VS2_NAME)
Helper assertion macro.
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
RCP< MultiVectorBase< Scalar > > createMembers(const RCP< const VectorSpaceBase< Scalar > > &vs, int numMembers, const std::string &label="")
Create a set of vector members (a MultiVectorBase) from the vector space.