42 #ifndef THYRA_MODEL_EVALUATOR_DEFAULT_BASE_HPP
43 #define THYRA_MODEL_EVALUATOR_DEFAULT_BASE_HPP
45 #include "Thyra_VectorBase.hpp"
47 #include "Thyra_ModelEvaluator.hpp"
48 #include "Thyra_LinearOpWithSolveFactoryHelpers.hpp"
51 #ifdef HAVE_THYRA_ME_POLYNOMIAL
67 #include "Thyra_PolynomialVectorTraits.hpp"
70 #endif // HAVE_THYRA_ME_POLYNOMIAL
83 namespace ModelEvaluatorDefaultBaseTypes {
89 class DefaultDerivLinearOpSupport {
91 DefaultDerivLinearOpSupport()
92 :provideDefaultLinearOp_(false),
93 mvImplOrientation_(ModelEvaluatorBase::DERIV_MV_BY_COL)
95 DefaultDerivLinearOpSupport(
98 :provideDefaultLinearOp_(true),
99 mvImplOrientation_(mvImplOrientation_in)
101 bool provideDefaultLinearOp()
const
102 {
return provideDefaultLinearOp_; }
104 {
return mvImplOrientation_; }
106 bool provideDefaultLinearOp_;
114 class DefaultDerivMvAdjointSupport {
116 DefaultDerivMvAdjointSupport()
117 :provideDefaultAdjoint_(false),
118 mvAdjointCopyOrientation_(ModelEvaluatorBase::DERIV_MV_BY_COL)
120 DefaultDerivMvAdjointSupport(
123 :provideDefaultAdjoint_(true),
124 mvAdjointCopyOrientation_(mvAdjointCopyOrientation_in)
126 bool provideDefaultAdjoint()
const
127 {
return provideDefaultAdjoint_; }
129 {
return mvAdjointCopyOrientation_; }
131 bool provideDefaultAdjoint_;
138 template<
class Scalar>
139 struct MultiVectorAdjointPair {
140 MultiVectorAdjointPair()
142 MultiVectorAdjointPair(
143 const RCP<MultiVectorBase<Scalar> > &in_mvOuter,
144 const RCP<
const MultiVectorBase<Scalar> > &in_mvImplAdjoint
146 : mvOuter(in_mvOuter),
147 mvImplAdjoint(in_mvImplAdjoint)
149 RCP<MultiVectorBase<Scalar> > mvOuter;
150 RCP<const MultiVectorBase<Scalar> > mvImplAdjoint;
187 template<
class Scalar>
221 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
234 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
287 virtual void evalModelImpl(
304 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
305 DefaultDerivLinearOpSupport;
307 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
308 DefaultDerivMvAdjointSupport;
310 typedef ModelEvaluatorDefaultBaseTypes::MultiVectorAdjointPair<Scalar>
311 MultiVectorAdjointPair;
327 bool default_W_support_;
334 void lazyInitializeDefaultBase()
const;
336 void assert_l(
const int l)
const;
338 void assert_j(
const int j)
const;
343 static DefaultDerivLinearOpSupport
344 determineDefaultDerivLinearOpSupport(
349 createDefaultLinearOp(
350 const DefaultDerivLinearOpSupport &defaultLinearOpSupport,
356 updateDefaultLinearOpSupport(
358 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
362 getOutArgImplForDefaultLinearOpSupport(
364 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
367 static DefaultDerivMvAdjointSupport
368 determineDefaultDerivMvAdjointSupport(
375 updateDefaultDerivMvAdjointSupport(
377 const DefaultDerivMvAdjointSupport &defaultMvAdjointSupport
391 #include "Thyra_ModelEvaluatorHelpers.hpp"
392 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
393 #include "Thyra_DetachedMultiVectorView.hpp"
394 #include "Teuchos_Assert.hpp"
403 template<
class Scalar>
406 lazyInitializeDefaultBase();
407 return prototypeOutArgs_.Np();
411 template<
class Scalar>
414 lazyInitializeDefaultBase();
415 return prototypeOutArgs_.Ng();
419 template<
class Scalar>
423 lazyInitializeDefaultBase();
424 if (default_W_support_)
425 return this->get_W_factory()->createOp();
426 return Teuchos::null;
430 template<
class Scalar>
434 lazyInitializeDefaultBase();
438 const DefaultDerivLinearOpSupport
439 defaultLinearOpSupport = DfDp_default_op_support_[l];
440 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
441 return createDefaultLinearOp(
442 defaultLinearOpSupport,
447 return this->create_DfDp_op_impl(l);
451 template<
class Scalar>
455 lazyInitializeDefaultBase();
459 const DefaultDerivLinearOpSupport
460 defaultLinearOpSupport = DgDx_dot_default_op_support_[j];
461 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
462 return createDefaultLinearOp(
463 defaultLinearOpSupport,
464 this->get_g_space(j),
468 return this->create_DgDx_dot_op_impl(j);
472 template<
class Scalar>
476 lazyInitializeDefaultBase();
480 const DefaultDerivLinearOpSupport
481 defaultLinearOpSupport = DgDx_default_op_support_[j];
482 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
483 return createDefaultLinearOp(
484 defaultLinearOpSupport,
485 this->get_g_space(j),
489 return this->create_DgDx_op_impl(j);
493 template<
class Scalar>
497 lazyInitializeDefaultBase();
502 const DefaultDerivLinearOpSupport
503 defaultLinearOpSupport = DgDp_default_op_support_[j][l];
504 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
505 return createDefaultLinearOp(
506 defaultLinearOpSupport,
507 this->get_g_space(j),
511 return this->create_DgDp_op_impl(j,l);
515 template<
class Scalar>
519 lazyInitializeDefaultBase();
520 return prototypeOutArgs_;
524 template<
class Scalar>
531 using Teuchos::outArg;
534 lazyInitializeDefaultBase();
536 const int l_Np = outArgs.
Np();
537 const int l_Ng = outArgs.
Ng();
544 assertInArgsEvalObjects(*
this,inArgs);
545 assertOutArgsEvalObjects(*
this,outArgs,&inArgs);
553 MEB::OutArgs<Scalar> outArgsImpl = this->createOutArgsImpl();
558 outArgsImpl.setArgs(outArgs,
true);
561 if (outArgsImpl.supports(MEB::OUT_ARG_f)) {
562 for (
int l = 0; l < l_Np; ++l ) {
563 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
564 DfDp_default_op_support_[l];
565 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
566 outArgsImpl.set_DfDp( l,
567 getOutArgImplForDefaultLinearOpSupport(
568 outArgs.
get_DfDp(l), defaultLinearOpSupport
579 for (
int j = 0; j < l_Ng; ++j ) {
580 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
581 DgDx_dot_default_op_support_[j];
582 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
583 outArgsImpl.set_DgDx_dot( j,
584 getOutArgImplForDefaultLinearOpSupport(
595 for (
int j = 0; j < l_Ng; ++j ) {
596 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
597 DgDx_default_op_support_[j];
598 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
599 outArgsImpl.set_DgDx( j,
600 getOutArgImplForDefaultLinearOpSupport(
601 outArgs.
get_DgDx(j), defaultLinearOpSupport
611 for (
int j = 0; j < l_Ng; ++j ) {
613 DgDp_default_op_support_[j];
615 DgDp_default_mv_support_[j];
616 for (
int l = 0; l < l_Np; ++l ) {
617 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
618 DgDp_default_op_support_j[l];
619 const DefaultDerivMvAdjointSupport defaultMvAdjointSupport =
620 DgDp_default_mv_support_j[l];
621 MEB::Derivative<Scalar> DgDp_j_l;
622 if (!outArgs.
supports(MEB::OUT_ARG_DgDp,j,l).none())
625 defaultLinearOpSupport.provideDefaultLinearOp()
626 && !
is_null(DgDp_j_l.getLinearOp())
629 outArgsImpl.set_DgDp( j, l,
630 getOutArgImplForDefaultLinearOpSupport(
631 DgDp_j_l, defaultLinearOpSupport
636 defaultMvAdjointSupport.provideDefaultAdjoint()
637 && !
is_null(DgDp_j_l.getMultiVector())
641 DgDp_j_l.getMultiVector();
643 defaultMvAdjointSupport.mvAdjointCopyOrientation()
645 DgDp_j_l.getMultiVectorOrientation()
652 createMembers(DgDp_j_l_mv->domain(), DgDp_j_l_mv->range()->dim());
653 outArgsImpl.set_DgDp( j, l,
654 MEB::Derivative<Scalar>(
656 getOtherDerivativeMultiVectorOrientation(
657 defaultMvAdjointSupport.mvAdjointCopyOrientation()
664 MultiVectorAdjointPair(DgDp_j_l_mv, DgDp_j_l_mv_adj)
681 if ( default_W_support_ && !
is_null(W=outArgs.
get_W()) ) {
683 W_factory = this->get_W_factory();
686 uninitializeOp<Scalar>(*W_factory, W.
ptr(), outArg(W_op_const));
698 W_op = this->create_W_op();
700 outArgsImpl.set_W_op(W_op);
709 this->evalModelImpl( inArgs, outArgsImpl );
716 const int numMvAdjointCopies = DgDp_temp_adjoint_copies.
size();
717 for (
int adj_copy_i = 0; adj_copy_i < numMvAdjointCopies; ++adj_copy_i ) {
718 const MultiVectorAdjointPair adjPair =
719 DgDp_temp_adjoint_copies[adj_copy_i];
720 doExplicitMultiVectorAdjoint( *adjPair.mvImplAdjoint, &*adjPair.mvOuter );
726 if ( default_W_support_ && !
is_null(W=outArgs.
get_W()) ) {
728 W_factory = this->get_W_factory();
729 W_factory->setOStream(this->getOStream());
730 W_factory->setVerbLevel(this->getVerbLevel());
731 initializeOp<Scalar>(*W_factory, outArgsImpl.get_W_op().
getConst(), W.
ptr());
743 template<
class Scalar>
750 isInitialized_ =
false;
751 default_W_support_ =
false;
757 const MEB::InArgs<Scalar> inArgs = this->createInArgs();
758 const MEB::OutArgs<Scalar> outArgsImpl = this->createOutArgsImpl();
765 assertInArgsOutArgsSetup( this->description(), inArgs, outArgsImpl );
766 #endif // TEUCHOS_DEBUG
772 const int l_Ng = outArgsImpl.Ng();
773 const int l_Np = outArgsImpl.Np();
776 MEB::OutArgsSetup<Scalar> outArgs;
777 outArgs.setModelEvalDescription(this->description());
778 outArgs.set_Np_Ng(l_Np,l_Ng);
779 outArgs.setSupports(outArgsImpl);
782 DfDp_default_op_support_.clear();
783 if (outArgs.supports(MEB::OUT_ARG_f)) {
784 for (
int l = 0; l < l_Np; ++l ) {
785 const MEB::DerivativeSupport DfDp_l_impl_support =
786 outArgsImpl.supports(MEB::OUT_ARG_DfDp,l);
787 const DefaultDerivLinearOpSupport DfDp_l_op_support =
788 determineDefaultDerivLinearOpSupport(DfDp_l_impl_support);
789 DfDp_default_op_support_.push_back(DfDp_l_op_support);
791 MEB::OUT_ARG_DfDp, l,
792 updateDefaultLinearOpSupport(
793 DfDp_l_impl_support, DfDp_l_op_support
800 DgDx_dot_default_op_support_.clear();
801 for (
int j = 0; j < l_Ng; ++j ) {
802 const MEB::DerivativeSupport DgDx_dot_j_impl_support =
803 outArgsImpl.supports(MEB::OUT_ARG_DgDx_dot,j);
804 const DefaultDerivLinearOpSupport DgDx_dot_j_op_support =
805 determineDefaultDerivLinearOpSupport(DgDx_dot_j_impl_support);
806 DgDx_dot_default_op_support_.push_back(DgDx_dot_j_op_support);
808 MEB::OUT_ARG_DgDx_dot, j,
809 updateDefaultLinearOpSupport(
810 DgDx_dot_j_impl_support, DgDx_dot_j_op_support
816 DgDx_default_op_support_.clear();
817 for (
int j = 0; j < l_Ng; ++j ) {
818 const MEB::DerivativeSupport DgDx_j_impl_support =
819 outArgsImpl.supports(MEB::OUT_ARG_DgDx,j);
820 const DefaultDerivLinearOpSupport DgDx_j_op_support =
821 determineDefaultDerivLinearOpSupport(DgDx_j_impl_support);
822 DgDx_default_op_support_.push_back(DgDx_j_op_support);
824 MEB::OUT_ARG_DgDx, j,
825 updateDefaultLinearOpSupport(
826 DgDx_j_impl_support, DgDx_j_op_support
832 DgDp_default_op_support_.clear();
833 DgDp_default_mv_support_.clear();
834 for (
int j = 0; j < l_Ng; ++j ) {
837 for (
int l = 0; l < l_Np; ++l ) {
838 const MEB::DerivativeSupport DgDp_j_l_impl_support =
839 outArgsImpl.supports(MEB::OUT_ARG_DgDp,j,l);
841 const DefaultDerivLinearOpSupport DgDp_j_l_op_support =
842 determineDefaultDerivLinearOpSupport(DgDp_j_l_impl_support);
843 DgDp_default_op_support_[j].push_back(DgDp_j_l_op_support);
845 MEB::OUT_ARG_DgDp, j, l,
846 updateDefaultLinearOpSupport(
847 DgDp_j_l_impl_support, DgDp_j_l_op_support
851 const DefaultDerivMvAdjointSupport DgDp_j_l_mv_support =
852 determineDefaultDerivMvAdjointSupport(
853 DgDp_j_l_impl_support, *this->get_g_space(j), *this->get_p_space(l)
855 DgDp_default_mv_support_[j].push_back(DgDp_j_l_mv_support);
857 MEB::OUT_ARG_DgDp, j, l,
858 updateDefaultDerivMvAdjointSupport(
859 outArgs.supports(MEB::OUT_ARG_DgDp, j, l),
869 default_W_support_ =
false;
870 if ( outArgsImpl.supports(MEB::OUT_ARG_W_op) && !
is_null(this->get_W_factory())
871 && !outArgsImpl.supports(MEB::OUT_ARG_W) )
873 default_W_support_ =
true;
874 outArgs.setSupports(MEB::OUT_ARG_W);
875 outArgs.set_W_properties(outArgsImpl.get_W_properties());
882 prototypeOutArgs_ = outArgs;
883 isInitialized_ =
true;
887 template<
class Scalar>
890 isInitialized_ =
false;
896 template<
class Scalar>
901 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
903 outArgs.supports(MEB::OUT_ARG_DfDp,l).supports(MEB::DERIV_LINEAR_OP),
905 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
906 " supports the LinearOpBase form of DfDp("<<l<<
") (as determined from its"
907 " OutArgs object created by createOutArgsImpl())"
908 " but this function create_DfDp_op_impl(...) has not been overridden"
909 " to create such an object!"
911 return Teuchos::null;
915 template<
class Scalar>
916 RCP<LinearOpBase<Scalar> >
917 ModelEvaluatorDefaultBase<Scalar>::create_DgDx_dot_op_impl(
int j)
const
919 typedef ModelEvaluatorBase MEB;
920 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
922 outArgs.supports(MEB::OUT_ARG_DgDx_dot,j).supports(MEB::DERIV_LINEAR_OP),
924 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
925 " supports the LinearOpBase form of DgDx_dot("<<j<<
") (as determined from"
926 " its OutArgs object created by createOutArgsImpl())"
927 " but this function create_DgDx_dot_op_impl(...) has not been overridden"
928 " to create such an object!"
930 return Teuchos::null;
934 template<
class Scalar>
935 RCP<LinearOpBase<Scalar> >
936 ModelEvaluatorDefaultBase<Scalar>::create_DgDx_op_impl(
int j)
const
938 typedef ModelEvaluatorBase MEB;
939 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
941 outArgs.supports(MEB::OUT_ARG_DgDx,j).supports(MEB::DERIV_LINEAR_OP),
943 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
944 " supports the LinearOpBase form of DgDx("<<j<<
") (as determined from"
945 " its OutArgs object created by createOutArgsImpl())"
946 " but this function create_DgDx_op_impl(...) has not been overridden"
947 " to create such an object!"
949 return Teuchos::null;
953 template<
class Scalar>
954 RCP<LinearOpBase<Scalar> >
955 ModelEvaluatorDefaultBase<Scalar>::create_DgDp_op_impl(
int j,
int l)
const
957 typedef ModelEvaluatorBase MEB;
958 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
960 outArgs.supports(MEB::OUT_ARG_DgDp,j,l).supports(MEB::DERIV_LINEAR_OP),
962 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
963 " supports the LinearOpBase form of DgDp("<<j<<
","<<l<<
")"
964 " (as determined from its OutArgs object created by createOutArgsImpl())"
965 " but this function create_DgDp_op_impl(...) has not been overridden"
966 " to create such an object!"
968 return Teuchos::null;
972 template<
class Scalar>
973 RCP<const VectorSpaceBase<Scalar> >
976 return this->get_f_space();
979 template<
class Scalar>
983 return this->get_g_space(j);
986 #ifdef Thyra_BUILD_HESSIAN_SUPPORT
988 template<
class Scalar>
992 return Teuchos::null;
995 template<
class Scalar>
996 RCP<LinearOpBase<Scalar> >
997 ModelEvaluatorDefaultBase<Scalar>::create_hess_f_xp(
int l)
const
999 return Teuchos::null;
1002 template<
class Scalar>
1003 RCP<LinearOpBase<Scalar> >
1004 ModelEvaluatorDefaultBase<Scalar>::create_hess_f_pp(
int l1,
int l2 )
const
1006 return Teuchos::null;
1009 template<
class Scalar>
1010 RCP<LinearOpBase<Scalar> >
1011 ModelEvaluatorDefaultBase<Scalar>::create_hess_g_xx(
int j)
const
1013 return Teuchos::null;
1016 template<
class Scalar>
1017 RCP<LinearOpBase<Scalar> >
1018 ModelEvaluatorDefaultBase<Scalar>::create_hess_g_xp(
int j,
int l )
const
1020 return Teuchos::null;
1023 template<
class Scalar>
1024 RCP<LinearOpBase<Scalar> >
1025 ModelEvaluatorDefaultBase<Scalar>::create_hess_g_pp(
int j,
int l1,
int l2 )
const
1027 return Teuchos::null;
1030 #endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1035 template<
class Scalar>
1037 :isInitialized_(false), default_W_support_(false)
1044 template<
class Scalar>
1047 if (!isInitialized_)
1052 template<
class Scalar>
1053 void ModelEvaluatorDefaultBase<Scalar>::assert_l(
const int l)
const
1059 template<
class Scalar>
1060 void ModelEvaluatorDefaultBase<Scalar>::assert_j(
const int j)
const
1069 template<
class Scalar>
1070 ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
1071 ModelEvaluatorDefaultBase<Scalar>::determineDefaultDerivLinearOpSupport(
1072 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl
1075 typedef ModelEvaluatorBase MEB;
1078 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1080 derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW)
1083 !derivSupportImpl.supports(MEB::DERIV_LINEAR_OP)
1086 return DefaultDerivLinearOpSupport(
1087 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1088 ? MEB::DERIV_MV_BY_COL
1089 : MEB::DERIV_TRANS_MV_BY_ROW
1092 return DefaultDerivLinearOpSupport();
1096 template<
class Scalar>
1097 RCP<LinearOpBase<Scalar> >
1098 ModelEvaluatorDefaultBase<Scalar>::createDefaultLinearOp(
1099 const DefaultDerivLinearOpSupport &defaultLinearOpSupport,
1100 const RCP<
const VectorSpaceBase<Scalar> > &fnc_space,
1101 const RCP<
const VectorSpaceBase<Scalar> > &var_space
1104 using Teuchos::rcp_implicit_cast;
1105 typedef LinearOpBase<Scalar> LOB;
1106 typedef ModelEvaluatorBase MEB;
1107 switch(defaultLinearOpSupport.mvImplOrientation()) {
1108 case MEB::DERIV_MV_BY_COL:
1110 return createMembers(fnc_space, var_space->dim());
1111 case MEB::DERIV_TRANS_MV_BY_ROW:
1113 return nonconstAdjoint<Scalar>(
1114 rcp_implicit_cast<LOB>(createMembers(var_space, fnc_space->dim()))
1116 #ifdef TEUCHOS_DEBUG
1121 return Teuchos::null;
1125 template<
class Scalar>
1126 ModelEvaluatorBase::DerivativeSupport
1127 ModelEvaluatorDefaultBase<Scalar>::updateDefaultLinearOpSupport(
1128 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1129 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
1132 typedef ModelEvaluatorBase MEB;
1133 MEB::DerivativeSupport derivSupport = derivSupportImpl;
1134 if (defaultLinearOpSupport.provideDefaultLinearOp())
1135 derivSupport.plus(MEB::DERIV_LINEAR_OP);
1136 return derivSupport;
1140 template<
class Scalar>
1141 ModelEvaluatorBase::Derivative<Scalar>
1142 ModelEvaluatorDefaultBase<Scalar>::getOutArgImplForDefaultLinearOpSupport(
1143 const ModelEvaluatorBase::Derivative<Scalar> &deriv,
1144 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
1148 using Teuchos::rcp_dynamic_cast;
1149 typedef ModelEvaluatorBase MEB;
1150 typedef MultiVectorBase<Scalar> MVB;
1151 typedef ScaledAdjointLinearOpBase<Scalar> SALOB;
1156 if (
is_null(deriv.getLinearOp()))
1161 switch(defaultLinearOpSupport.mvImplOrientation()) {
1162 case MEB::DERIV_MV_BY_COL: {
1163 return MEB::Derivative<Scalar>(
1164 rcp_dynamic_cast<MVB>(deriv.getLinearOp(),
true),
1165 MEB::DERIV_MV_BY_COL
1168 case MEB::DERIV_TRANS_MV_BY_ROW: {
1169 return MEB::Derivative<Scalar>(
1170 rcp_dynamic_cast<MVB>(
1171 rcp_dynamic_cast<SALOB>(deriv.getLinearOp(),
true)->getNonconstOrigOp()
1173 MEB::DERIV_TRANS_MV_BY_ROW
1176 #ifdef TEUCHOS_DEBUG
1182 return ModelEvaluatorBase::Derivative<Scalar>();
1187 template<
class Scalar>
1188 ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
1189 ModelEvaluatorDefaultBase<Scalar>::determineDefaultDerivMvAdjointSupport(
1190 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1191 const VectorSpaceBase<Scalar> &fnc_space,
1192 const VectorSpaceBase<Scalar> &var_space
1195 typedef ModelEvaluatorBase MEB;
1198 const bool implSupportsMv =
1199 ( derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1200 || derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW) );
1201 const bool implLacksMvOrientSupport =
1202 ( !derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1203 || !derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW) );
1204 const bool bothSpacesHaveInCoreViews =
1205 ( fnc_space.hasInCoreView() && var_space.hasInCoreView() );
1206 if ( implSupportsMv && implLacksMvOrientSupport && bothSpacesHaveInCoreViews ) {
1207 return DefaultDerivMvAdjointSupport(
1208 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1209 ? MEB::DERIV_TRANS_MV_BY_ROW
1210 : MEB::DERIV_MV_BY_COL
1214 return DefaultDerivMvAdjointSupport();
1218 template<
class Scalar>
1219 ModelEvaluatorBase::DerivativeSupport
1220 ModelEvaluatorDefaultBase<Scalar>::updateDefaultDerivMvAdjointSupport(
1221 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1222 const DefaultDerivMvAdjointSupport &defaultMvAdjointSupport
1225 typedef ModelEvaluatorBase MEB;
1226 MEB::DerivativeSupport derivSupport = derivSupportImpl;
1227 if (defaultMvAdjointSupport.provideDefaultAdjoint())
1228 derivSupport.plus(defaultMvAdjointSupport.mvAdjointCopyOrientation());
1229 return derivSupport;
1236 #endif // THYRA_MODEL_EVALUATOR_DEFAULT_BASE_HPP
RCP< const T > getConst() const
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng >= 0).
Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
RCP< LinearOpWithSolveBase< Scalar > > create_W() const
Default base class for concrete model evaluators.
bool is_null(const boost::shared_ptr< T > &p)
RCP< LinearOpBase< Scalar > > create_DfDp_op(int l) const
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...
Derivative< Scalar > get_DfDp(int l) const
Precondition: supports(OUT_ARG_DfDp,l)==true.
EDerivativeMultiVectorOrientation
void evalModel(const ModelEvaluatorBase::InArgs< Scalar > &inArgs, const ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual RCP< const VectorSpaceBase< Scalar > > get_g_multiplier_space(int j) const
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
ModelEvaluatorDefaultBase()
Abstract interface for objects that represent a space for vectors.
bool supports(EOutArgsMembers arg) const
Determine if an input argument is supported or not.
Derivative< Scalar > get_DgDp(int j, int l) const
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
void initializeDefaultBase()
Function called by subclasses to fully initialize this object on any important change.
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
int Np() const
Return the number of parameter subvectors p(l) supported (Np >= 0).
RCP< LinearOpBase< Scalar > > create_DgDx_op(int j) const
virtual RCP< const VectorSpaceBase< Scalar > > get_f_multiplier_space() const
Base class for all linear operators.
RCP< LinearOpBase< Scalar > > create_DgDx_dot_op(int j) const
Base subclass for ModelEvaluator that defines some basic types.
void push_back(const value_type &x)
RCP< LinearOpWithSolveBase< Scalar > > get_W() const
Precondition: supports(OUT_ARG_W)==true.
void resetDefaultBase()
Sets the the DefaultBase to an uninitialized state, forcing lazy initialization when needed...
Derivative< Scalar > get_DgDx_dot(int j) const
Precondition: supports(OUT_ARG_DgDx_dot,j)==true.
Determines the forms of a general derivative that are supported.
ModelEvaluatorBase::OutArgs< Scalar > createOutArgs() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Derivative< Scalar > get_DgDx(int j) const
Precondition: supports(OUT_ARG_DgDx,j)==true.
RCP< LinearOpBase< Scalar > > create_DgDp_op(int j, int l) const
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object...