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>
208 RCP<LinearOpWithSolveBase<Scalar> >
create_W()
const;
242 virtual RCP<LinearOpBase<Scalar> > create_DfDp_op_impl(
int l)
const;
245 virtual RCP<LinearOpBase<Scalar> > create_DgDx_dot_op_impl(
int j)
const;
248 virtual RCP<LinearOpBase<Scalar> > create_DgDx_op_impl(
int j)
const;
251 virtual RCP<LinearOpBase<Scalar> > create_DgDp_op_impl(
int j,
int l)
const;
262 virtual void evalModelImpl(
279 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivLinearOpSupport
280 DefaultDerivLinearOpSupport;
282 typedef ModelEvaluatorDefaultBaseTypes::DefaultDerivMvAdjointSupport
283 DefaultDerivMvAdjointSupport;
285 typedef ModelEvaluatorDefaultBaseTypes::MultiVectorAdjointPair<Scalar>
286 MultiVectorAdjointPair;
293 Array<DefaultDerivLinearOpSupport> DfDp_default_op_support_;
295 Array<DefaultDerivLinearOpSupport> DgDx_dot_default_op_support_;
297 Array<DefaultDerivLinearOpSupport> DgDx_default_op_support_;
299 Array<Array<DefaultDerivLinearOpSupport> > DgDp_default_op_support_;
300 Array<Array<DefaultDerivMvAdjointSupport> > DgDp_default_mv_support_;
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(
323 static RCP<LinearOpBase<Scalar> >
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>
395 RCP<LinearOpWithSolveBase<Scalar> >
398 lazyInitializeDefaultBase();
399 if (default_W_support_)
400 return this->get_W_factory()->createOp();
401 return Teuchos::null;
405 template<
class Scalar>
406 RCP<LinearOpBase<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>
427 RCP<LinearOpBase<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>
448 RCP<LinearOpBase<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>
469 RCP<LinearOpBase<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();
529 Array<MultiVectorAdjointPair> DgDp_temp_adjoint_copies;
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 ) {
587 const Array<DefaultDerivLinearOpSupport> &DgDp_default_op_support_j =
588 DgDp_default_op_support_[j];
589 const Array<DefaultDerivMvAdjointSupport> &DgDp_default_mv_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())
615 const RCP<MultiVectorBase<Scalar> > DgDp_j_l_mv =
616 DgDp_j_l.getMultiVector();
618 defaultMvAdjointSupport.mvAdjointCopyOrientation()
620 DgDp_j_l.getMultiVectorOrientation()
626 const RCP<MultiVectorBase<Scalar> > DgDp_j_l_mv_adj =
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()
638 DgDp_temp_adjoint_copies.push_back(
639 MultiVectorAdjointPair(DgDp_j_l_mv, DgDp_j_l_mv_adj)
655 RCP<LinearOpWithSolveBase<Scalar> > W;
656 if ( default_W_support_ && !is_null(W=outArgs.
get_W()) ) {
657 const RCP<const LinearOpWithSolveFactoryBase<Scalar> >
658 W_factory = this->get_W_factory();
660 RCP<const LinearOpBase<Scalar> > W_op_const;
661 uninitializeOp<Scalar>(*W_factory, W.ptr(), outArg(W_op_const));
662 RCP<LinearOpBase<Scalar> > W_op;
663 if (!is_null(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 );
701 RCP<LinearOpWithSolveBase<Scalar> > W;
702 if ( default_W_support_ && !is_null(W=outArgs.
get_W()) ) {
703 const RCP<const LinearOpWithSolveFactoryBase<Scalar> >
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 ) {
811 DgDp_default_op_support_.push_back(Array<DefaultDerivLinearOpSupport>());
812 DgDp_default_mv_support_.push_back(Array<DefaultDerivMvAdjointSupport>());
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>
868 RCP<LinearOpBase<Scalar> >
872 MEB::OutArgs<Scalar> outArgs = this->createOutArgsImpl();
873 TEUCHOS_TEST_FOR_EXCEPTION(
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 overriden" 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();
892 TEUCHOS_TEST_FOR_EXCEPTION(
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 overriden" 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();
911 TEUCHOS_TEST_FOR_EXCEPTION(
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 overriden" 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();
930 TEUCHOS_TEST_FOR_EXCEPTION(
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 overriden" 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 966 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(l,0,this->Np());
970 template<
class Scalar>
971 void ModelEvaluatorDefaultBase<Scalar>::assert_j(
const int j)
const 973 TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(j,0,this->Ng());
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 1029 TEUCHOS_TEST_FOR_EXCEPT(
true);
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 1089 TEUCHOS_TEST_FOR_EXCEPT(
true);
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 Pure abstract base interface for evaluating a stateless "model" that can be mapped into a number of d...
Default base class for concrete model evaluators.
RCP< LinearOpWithSolveBase< Scalar > > get_W() const
Precondition: supports(OUT_ARG_W)==true.
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...
EDerivativeMultiVectorOrientation
RCP< LinearOpBase< Scalar > > create_DgDp_op(int j, int l) const
Derivative< Scalar > get_DfDp(int l) const
Precondition: supports(OUT_ARG_DfDp,l)==true.
Derivative< Scalar > get_DgDp(int j, int l) const
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
RCP< LinearOpBase< Scalar > > create_DgDx_dot_op(int j) const
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
ModelEvaluatorDefaultBase()
Derivative< Scalar > get_DgDx(int j) const
Precondition: supports(OUT_ARG_DgDx,j)==true.
Abstract interface for objects that represent a space for vectors.
void initializeDefaultBase()
Function called by subclasses to fully initialize this object on any important change.
Derivative< Scalar > get_DgDx_dot(int j) const
Precondition: supports(OUT_ARG_DgDx_dot,j)==true.
void evalModel(const ModelEvaluatorBase::InArgs< Scalar > &inArgs, const ModelEvaluatorBase::OutArgs< Scalar > &outArgs) const
ModelEvaluatorBase::OutArgs< Scalar > createOutArgs() const
RCP< LinearOpBase< Scalar > > create_DfDp_op(int l) const
bool supports(EOutArgsMembers arg) const
Determine if an input argument is supported or not.
RCP< LinearOpWithSolveBase< Scalar > > create_W() const
Base class for all linear operators.
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng >= 0).
Base subclass for ModelEvaluator that defines some basic types.
int Np() const
Return the number of parameter subvectors p(l) supported (Np >= 0).
Determines the forms of a general derivative that are supported.
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.
RCP< LinearOpBase< Scalar > > create_DgDx_op(int j) const
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...