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>
262 virtual void evalModelImpl(
279 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
280 DefaultDerivLinearOpSupport;
282 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
283 DefaultDerivMvAdjointSupport;
285 typedef ModelEvaluatorDefaultBaseTypes::MultiVectorAdjointPair<Scalar>
286 MultiVectorAdjointPair;
302 bool default_W_support_;
309 void lazyInitializeDefaultBase()
const;
311 void assert_l(
const int l)
const;
313 void assert_j(
const int j)
const;
318 static DefaultDerivLinearOpSupport
319 determineDefaultDerivLinearOpSupport(
324 createDefaultLinearOp(
325 const DefaultDerivLinearOpSupport &defaultLinearOpSupport,
331 updateDefaultLinearOpSupport(
333 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
337 getOutArgImplForDefaultLinearOpSupport(
339 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
342 static DefaultDerivMvAdjointSupport
343 determineDefaultDerivMvAdjointSupport(
350 updateDefaultDerivMvAdjointSupport(
352 const DefaultDerivMvAdjointSupport &defaultMvAdjointSupport
366 #include "Thyra_ModelEvaluatorHelpers.hpp"
367 #include "Thyra_DefaultScaledAdjointLinearOp.hpp"
368 #include "Thyra_DetachedMultiVectorView.hpp"
369 #include "Teuchos_Assert.hpp"
378 template<
class Scalar>
381 lazyInitializeDefaultBase();
382 return prototypeOutArgs_.Np();
386 template<
class Scalar>
389 lazyInitializeDefaultBase();
390 return prototypeOutArgs_.Ng();
394 template<
class Scalar>
398 lazyInitializeDefaultBase();
399 if (default_W_support_)
400 return this->get_W_factory()->createOp();
401 return Teuchos::null;
405 template<
class Scalar>
409 lazyInitializeDefaultBase();
413 const DefaultDerivLinearOpSupport
414 defaultLinearOpSupport = DfDp_default_op_support_[l];
415 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
416 return createDefaultLinearOp(
417 defaultLinearOpSupport,
422 return this->create_DfDp_op_impl(l);
426 template<
class Scalar>
430 lazyInitializeDefaultBase();
434 const DefaultDerivLinearOpSupport
435 defaultLinearOpSupport = DgDx_dot_default_op_support_[j];
436 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
437 return createDefaultLinearOp(
438 defaultLinearOpSupport,
439 this->get_g_space(j),
443 return this->create_DgDx_dot_op_impl(j);
447 template<
class Scalar>
451 lazyInitializeDefaultBase();
455 const DefaultDerivLinearOpSupport
456 defaultLinearOpSupport = DgDx_default_op_support_[j];
457 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
458 return createDefaultLinearOp(
459 defaultLinearOpSupport,
460 this->get_g_space(j),
464 return this->create_DgDx_op_impl(j);
468 template<
class Scalar>
472 lazyInitializeDefaultBase();
477 const DefaultDerivLinearOpSupport
478 defaultLinearOpSupport = DgDp_default_op_support_[j][l];
479 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
480 return createDefaultLinearOp(
481 defaultLinearOpSupport,
482 this->get_g_space(j),
486 return this->create_DgDp_op_impl(j,l);
490 template<
class Scalar>
494 lazyInitializeDefaultBase();
495 return prototypeOutArgs_;
499 template<
class Scalar>
506 using Teuchos::outArg;
509 lazyInitializeDefaultBase();
511 const int l_Np = outArgs.
Np();
512 const int l_Ng = outArgs.
Ng();
519 assertInArgsEvalObjects(*
this,inArgs);
520 assertOutArgsEvalObjects(*
this,outArgs,&inArgs);
528 MEB::OutArgs<Scalar> outArgsImpl = this->createOutArgsImpl();
533 outArgsImpl.setArgs(outArgs,
true);
536 if (outArgsImpl.supports(MEB::OUT_ARG_f)) {
537 for (
int l = 0; l < l_Np; ++l ) {
538 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
539 DfDp_default_op_support_[l];
540 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
541 outArgsImpl.set_DfDp( l,
542 getOutArgImplForDefaultLinearOpSupport(
543 outArgs.
get_DfDp(l), defaultLinearOpSupport
554 for (
int j = 0; j < l_Ng; ++j ) {
555 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
556 DgDx_dot_default_op_support_[j];
557 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
558 outArgsImpl.set_DgDx_dot( j,
559 getOutArgImplForDefaultLinearOpSupport(
570 for (
int j = 0; j < l_Ng; ++j ) {
571 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
572 DgDx_default_op_support_[j];
573 if (defaultLinearOpSupport.provideDefaultLinearOp()) {
574 outArgsImpl.set_DgDx( j,
575 getOutArgImplForDefaultLinearOpSupport(
576 outArgs.
get_DgDx(j), defaultLinearOpSupport
586 for (
int j = 0; j < l_Ng; ++j ) {
588 DgDp_default_op_support_[j];
590 DgDp_default_mv_support_[j];
591 for (
int l = 0; l < l_Np; ++l ) {
592 const DefaultDerivLinearOpSupport defaultLinearOpSupport =
593 DgDp_default_op_support_j[l];
594 const DefaultDerivMvAdjointSupport defaultMvAdjointSupport =
595 DgDp_default_mv_support_j[l];
596 MEB::Derivative<Scalar> DgDp_j_l;
597 if (!outArgs.
supports(MEB::OUT_ARG_DgDp,j,l).none())
600 defaultLinearOpSupport.provideDefaultLinearOp()
601 && !
is_null(DgDp_j_l.getLinearOp())
604 outArgsImpl.set_DgDp( j, l,
605 getOutArgImplForDefaultLinearOpSupport(
606 DgDp_j_l, defaultLinearOpSupport
611 defaultMvAdjointSupport.provideDefaultAdjoint()
612 && !
is_null(DgDp_j_l.getMultiVector())
616 DgDp_j_l.getMultiVector();
618 defaultMvAdjointSupport.mvAdjointCopyOrientation()
620 DgDp_j_l.getMultiVectorOrientation()
627 createMembers(DgDp_j_l_mv->domain(), DgDp_j_l_mv->range()->dim());
628 outArgsImpl.set_DgDp( j, l,
629 MEB::Derivative<Scalar>(
631 getOtherDerivativeMultiVectorOrientation(
632 defaultMvAdjointSupport.mvAdjointCopyOrientation()
639 MultiVectorAdjointPair(DgDp_j_l_mv, DgDp_j_l_mv_adj)
656 if ( default_W_support_ && !
is_null(W=outArgs.
get_W()) ) {
658 W_factory = this->get_W_factory();
661 uninitializeOp<Scalar>(*W_factory, W.
ptr(), outArg(W_op_const));
673 W_op = this->create_W_op();
675 outArgsImpl.set_W_op(W_op);
685 this->evalModelImpl( inArgs, outArgsImpl );
692 const int numMvAdjointCopies = DgDp_temp_adjoint_copies.
size();
693 for (
int adj_copy_i = 0; adj_copy_i < numMvAdjointCopies; ++adj_copy_i ) {
694 const MultiVectorAdjointPair adjPair =
695 DgDp_temp_adjoint_copies[adj_copy_i];
696 doExplicitMultiVectorAdjoint( *adjPair.mvImplAdjoint, &*adjPair.mvOuter );
702 if ( default_W_support_ && !
is_null(W=outArgs.
get_W()) ) {
704 W_factory = this->get_W_factory();
705 W_factory->setOStream(this->getOStream());
706 W_factory->setVerbLevel(this->getVerbLevel());
707 initializeOp<Scalar>(*W_factory, outArgsImpl.get_W_op().
getConst(), W.
ptr());
719 template<
class Scalar>
726 isInitialized_ =
false;
727 default_W_support_ =
false;
733 const MEB::InArgs<Scalar> inArgs = this->createInArgs();
734 const MEB::OutArgs<Scalar> outArgsImpl = this->createOutArgsImpl();
741 assertInArgsOutArgsSetup( this->description(), inArgs, outArgsImpl );
742 #endif // TEUCHOS_DEBUG
748 const int l_Ng = outArgsImpl.Ng();
749 const int l_Np = outArgsImpl.Np();
752 MEB::OutArgsSetup<Scalar> outArgs;
753 outArgs.setModelEvalDescription(this->description());
754 outArgs.set_Np_Ng(l_Np,l_Ng);
755 outArgs.setSupports(outArgsImpl);
758 DfDp_default_op_support_.clear();
759 if (outArgs.supports(MEB::OUT_ARG_f)) {
760 for (
int l = 0; l < l_Np; ++l ) {
761 const MEB::DerivativeSupport DfDp_l_impl_support =
762 outArgsImpl.supports(MEB::OUT_ARG_DfDp,l);
763 const DefaultDerivLinearOpSupport DfDp_l_op_support =
764 determineDefaultDerivLinearOpSupport(DfDp_l_impl_support);
765 DfDp_default_op_support_.push_back(DfDp_l_op_support);
767 MEB::OUT_ARG_DfDp, l,
768 updateDefaultLinearOpSupport(
769 DfDp_l_impl_support, DfDp_l_op_support
776 DgDx_dot_default_op_support_.clear();
777 for (
int j = 0; j < l_Ng; ++j ) {
778 const MEB::DerivativeSupport DgDx_dot_j_impl_support =
779 outArgsImpl.supports(MEB::OUT_ARG_DgDx_dot,j);
780 const DefaultDerivLinearOpSupport DgDx_dot_j_op_support =
781 determineDefaultDerivLinearOpSupport(DgDx_dot_j_impl_support);
782 DgDx_dot_default_op_support_.push_back(DgDx_dot_j_op_support);
784 MEB::OUT_ARG_DgDx_dot, j,
785 updateDefaultLinearOpSupport(
786 DgDx_dot_j_impl_support, DgDx_dot_j_op_support
792 DgDx_default_op_support_.clear();
793 for (
int j = 0; j < l_Ng; ++j ) {
794 const MEB::DerivativeSupport DgDx_j_impl_support =
795 outArgsImpl.supports(MEB::OUT_ARG_DgDx,j);
796 const DefaultDerivLinearOpSupport DgDx_j_op_support =
797 determineDefaultDerivLinearOpSupport(DgDx_j_impl_support);
798 DgDx_default_op_support_.push_back(DgDx_j_op_support);
800 MEB::OUT_ARG_DgDx, j,
801 updateDefaultLinearOpSupport(
802 DgDx_j_impl_support, DgDx_j_op_support
808 DgDp_default_op_support_.clear();
809 DgDp_default_mv_support_.clear();
810 for (
int j = 0; j < l_Ng; ++j ) {
813 for (
int l = 0; l < l_Np; ++l ) {
814 const MEB::DerivativeSupport DgDp_j_l_impl_support =
815 outArgsImpl.supports(MEB::OUT_ARG_DgDp,j,l);
817 const DefaultDerivLinearOpSupport DgDp_j_l_op_support =
818 determineDefaultDerivLinearOpSupport(DgDp_j_l_impl_support);
819 DgDp_default_op_support_[j].push_back(DgDp_j_l_op_support);
821 MEB::OUT_ARG_DgDp, j, l,
822 updateDefaultLinearOpSupport(
823 DgDp_j_l_impl_support, DgDp_j_l_op_support
827 const DefaultDerivMvAdjointSupport DgDp_j_l_mv_support =
828 determineDefaultDerivMvAdjointSupport(
829 DgDp_j_l_impl_support, *this->get_g_space(j), *this->get_p_space(l)
831 DgDp_default_mv_support_[j].push_back(DgDp_j_l_mv_support);
833 MEB::OUT_ARG_DgDp, j, l,
834 updateDefaultDerivMvAdjointSupport(
835 outArgs.supports(MEB::OUT_ARG_DgDp, j, l),
845 default_W_support_ =
false;
846 if ( outArgsImpl.supports(MEB::OUT_ARG_W_op) && !
is_null(this->get_W_factory())
847 && !outArgsImpl.supports(MEB::OUT_ARG_W) )
849 default_W_support_ =
true;
850 outArgs.setSupports(MEB::OUT_ARG_W);
851 outArgs.set_W_properties(outArgsImpl.get_W_properties());
858 prototypeOutArgs_ = outArgs;
859 isInitialized_ =
true;
867 template<
class Scalar>
872 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
874 outArgs.supports(MEB::OUT_ARG_DfDp,l).supports(MEB::DERIV_LINEAR_OP),
876 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
877 " supports the LinearOpBase form of DfDp("<<l<<
") (as determined from its"
878 " OutArgs object created by createOutArgsImpl())"
879 " but this function create_DfDp_op_impl(...) has not been overridden"
880 " to create such an object!"
882 return Teuchos::null;
886 template<
class Scalar>
887 RCP<LinearOpBase<Scalar> >
888 ModelEvaluatorDefaultBase<Scalar>::create_DgDx_dot_op_impl(
int j)
const
890 typedef ModelEvaluatorBase MEB;
891 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
893 outArgs.supports(MEB::OUT_ARG_DgDx_dot,j).supports(MEB::DERIV_LINEAR_OP),
895 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
896 " supports the LinearOpBase form of DgDx_dot("<<j<<
") (as determined from"
897 " its OutArgs object created by createOutArgsImpl())"
898 " but this function create_DgDx_dot_op_impl(...) has not been overridden"
899 " to create such an object!"
901 return Teuchos::null;
905 template<
class Scalar>
906 RCP<LinearOpBase<Scalar> >
907 ModelEvaluatorDefaultBase<Scalar>::create_DgDx_op_impl(
int j)
const
909 typedef ModelEvaluatorBase MEB;
910 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
912 outArgs.supports(MEB::OUT_ARG_DgDx,j).supports(MEB::DERIV_LINEAR_OP),
914 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
915 " supports the LinearOpBase form of DgDx("<<j<<
") (as determined from"
916 " its OutArgs object created by createOutArgsImpl())"
917 " but this function create_DgDx_op_impl(...) has not been overridden"
918 " to create such an object!"
920 return Teuchos::null;
924 template<
class Scalar>
925 RCP<LinearOpBase<Scalar> >
926 ModelEvaluatorDefaultBase<Scalar>::create_DgDp_op_impl(
int j,
int l)
const
928 typedef ModelEvaluatorBase MEB;
929 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
931 outArgs.supports(MEB::OUT_ARG_DgDp,j,l).supports(MEB::DERIV_LINEAR_OP),
933 "Error, The ModelEvaluator subclass "<<this->description()<<
" says that it"
934 " supports the LinearOpBase form of DgDp("<<j<<
","<<l<<
")"
935 " (as determined from its OutArgs object created by createOutArgsImpl())"
936 " but this function create_DgDp_op_impl(...) has not been overridden"
937 " to create such an object!"
939 return Teuchos::null;
946 template<
class Scalar>
948 :isInitialized_(false), default_W_support_(false)
955 template<
class Scalar>
963 template<
class Scalar>
964 void ModelEvaluatorDefaultBase<Scalar>::assert_l(
const int l)
const
970 template<
class Scalar>
971 void ModelEvaluatorDefaultBase<Scalar>::assert_j(
const int j)
const
980 template<
class Scalar>
981 ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
982 ModelEvaluatorDefaultBase<Scalar>::determineDefaultDerivLinearOpSupport(
983 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl
986 typedef ModelEvaluatorBase MEB;
989 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
991 derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW)
994 !derivSupportImpl.supports(MEB::DERIV_LINEAR_OP)
997 return DefaultDerivLinearOpSupport(
998 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
999 ? MEB::DERIV_MV_BY_COL
1000 : MEB::DERIV_TRANS_MV_BY_ROW
1003 return DefaultDerivLinearOpSupport();
1007 template<
class Scalar>
1008 RCP<LinearOpBase<Scalar> >
1009 ModelEvaluatorDefaultBase<Scalar>::createDefaultLinearOp(
1010 const DefaultDerivLinearOpSupport &defaultLinearOpSupport,
1011 const RCP<
const VectorSpaceBase<Scalar> > &fnc_space,
1012 const RCP<
const VectorSpaceBase<Scalar> > &var_space
1015 using Teuchos::rcp_implicit_cast;
1016 typedef LinearOpBase<Scalar> LOB;
1017 typedef ModelEvaluatorBase MEB;
1018 switch(defaultLinearOpSupport.mvImplOrientation()) {
1019 case MEB::DERIV_MV_BY_COL:
1022 case MEB::DERIV_TRANS_MV_BY_ROW:
1024 return nonconstAdjoint<Scalar>(
1025 rcp_implicit_cast<LOB>(
createMembers(var_space, fnc_space->dim()))
1027 #ifdef TEUCHOS_DEBUG
1032 return Teuchos::null;
1036 template<
class Scalar>
1037 ModelEvaluatorBase::DerivativeSupport
1038 ModelEvaluatorDefaultBase<Scalar>::updateDefaultLinearOpSupport(
1039 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1040 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
1043 typedef ModelEvaluatorBase MEB;
1044 MEB::DerivativeSupport derivSupport = derivSupportImpl;
1045 if (defaultLinearOpSupport.provideDefaultLinearOp())
1046 derivSupport.plus(MEB::DERIV_LINEAR_OP);
1047 return derivSupport;
1051 template<
class Scalar>
1052 ModelEvaluatorBase::Derivative<Scalar>
1053 ModelEvaluatorDefaultBase<Scalar>::getOutArgImplForDefaultLinearOpSupport(
1054 const ModelEvaluatorBase::Derivative<Scalar> &deriv,
1055 const DefaultDerivLinearOpSupport &defaultLinearOpSupport
1059 using Teuchos::rcp_dynamic_cast;
1060 typedef ModelEvaluatorBase MEB;
1061 typedef MultiVectorBase<Scalar> MVB;
1062 typedef ScaledAdjointLinearOpBase<Scalar> SALOB;
1067 if (
is_null(deriv.getLinearOp()))
1072 switch(defaultLinearOpSupport.mvImplOrientation()) {
1073 case MEB::DERIV_MV_BY_COL: {
1074 return MEB::Derivative<Scalar>(
1075 rcp_dynamic_cast<MVB>(deriv.getLinearOp(),
true),
1076 MEB::DERIV_MV_BY_COL
1079 case MEB::DERIV_TRANS_MV_BY_ROW: {
1080 return MEB::Derivative<Scalar>(
1081 rcp_dynamic_cast<MVB>(
1082 rcp_dynamic_cast<SALOB>(deriv.getLinearOp(),
true)->getNonconstOrigOp()
1084 MEB::DERIV_TRANS_MV_BY_ROW
1087 #ifdef TEUCHOS_DEBUG
1093 return ModelEvaluatorBase::Derivative<Scalar>();
1098 template<
class Scalar>
1099 ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
1100 ModelEvaluatorDefaultBase<Scalar>::determineDefaultDerivMvAdjointSupport(
1101 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1102 const VectorSpaceBase<Scalar> &fnc_space,
1103 const VectorSpaceBase<Scalar> &var_space
1106 typedef ModelEvaluatorBase MEB;
1109 const bool implSupportsMv =
1110 ( derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1111 || derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW) );
1112 const bool implLacksMvOrientSupport =
1113 ( !derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1114 || !derivSupportImpl.supports(MEB::DERIV_TRANS_MV_BY_ROW) );
1115 const bool bothSpacesHaveInCoreViews =
1116 ( fnc_space.hasInCoreView() && var_space.hasInCoreView() );
1117 if ( implSupportsMv && implLacksMvOrientSupport && bothSpacesHaveInCoreViews ) {
1118 return DefaultDerivMvAdjointSupport(
1119 derivSupportImpl.supports(MEB::DERIV_MV_BY_COL)
1120 ? MEB::DERIV_TRANS_MV_BY_ROW
1121 : MEB::DERIV_MV_BY_COL
1125 return DefaultDerivMvAdjointSupport();
1129 template<
class Scalar>
1130 ModelEvaluatorBase::DerivativeSupport
1131 ModelEvaluatorDefaultBase<Scalar>::updateDefaultDerivMvAdjointSupport(
1132 const ModelEvaluatorBase::DerivativeSupport &derivSupportImpl,
1133 const DefaultDerivMvAdjointSupport &defaultMvAdjointSupport
1136 typedef ModelEvaluatorBase MEB;
1137 MEB::DerivativeSupport derivSupport = derivSupportImpl;
1138 if (defaultMvAdjointSupport.provideDefaultAdjoint())
1139 derivSupport.plus(defaultMvAdjointSupport.mvAdjointCopyOrientation());
1140 return derivSupport;
1147 #endif // THYRA_MODEL_EVALUATOR_DEFAULT_BASE_HPP