Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_ModelEvaluatorBase_decl.hpp
1// @HEADER
2// ***********************************************************************
3//
4// Thyra: Interfaces and Support for Abstract Numerical Algorithms
5// Copyright (2004) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38//
39// ***********************************************************************
40// @HEADER
41
42#ifndef THYRA_MODEL_EVALUATOR_BASE_DECL_HPP
43#define THYRA_MODEL_EVALUATOR_BASE_DECL_HPP
44
45
46#include "Thyra_LinearOpWithSolveBase.hpp"
47#include "Teuchos_Describable.hpp"
48#include "Teuchos_any.hpp"
49#include "Teuchos_Assert.hpp"
50
51#ifdef HAVE_THYRA_ME_POLYNOMIAL
52# include "Teuchos_Polynomial.hpp"
53#endif
54
55namespace Stokhos {
56 class ProductEpetraVector;
57 class ProductEpetraMultiVector;
58 class ProductEpetraOperator;
59}
60
61namespace Thyra {
62
63
84 : virtual public Teuchos::Describable,
85 virtual public Teuchos::VerboseObject<ModelEvaluatorBase>
86{
87public:
88
91
107 };
109 static const int NUM_E_IN_ARGS_MEMBERS=13;
110
114 };
115
158 template<class Scalar>
160 public:
164 InArgs();
167 int Np() const;
170 int Ng() const;
172 bool supports(EInArgsMembers arg) const;
174 void set_x_dot_dot( const RCP<const VectorBase<Scalar> > &x_dot_dot );
178 void set_x_dot( const RCP<const VectorBase<Scalar> > &x_dot );
182 void set_x( const RCP<const VectorBase<Scalar> > &x );
185
187 void set_x_direction( const RCP<const MultiVectorBase<Scalar> > &x_direction );
189 void set_p_direction( int l, const RCP<const MultiVectorBase<Scalar> > &p_direction_l );
194
196 void set_f_multiplier( const RCP<const VectorBase<Scalar> > &f_multiplier );
200 void set_g_multiplier( int j, const RCP<const VectorBase<Scalar> > &g_multiplier );
203
205 template<typename ObjectType>
206 bool supports() const;
208 template<typename ObjectType>
209 void set(const RCP<const ObjectType>& uo);
211 template<typename ObjectType>
213
214#ifdef HAVE_THYRA_ME_POLYNOMIAL
216 void set_x_poly(
217 const RCP<const Teuchos::Polynomial< VectorBase<Scalar> > > &x_poly );
221 void set_x_dot_poly(
222 const RCP<const Teuchos::Polynomial< VectorBase<Scalar> > > &x_dot_poly );
224 RCP<const Teuchos::Polynomial< VectorBase<Scalar> > > get_x_dot_poly() const;
225#endif // HAVE_THYRA_ME_POLYNOMIAL
227 void set_p( int l, const RCP<const VectorBase<Scalar> > &p_l );
229 RCP<const VectorBase<Scalar> > get_p(int l) const;
230
231
236
241
242 void set_p_mp( int l, const RCP<const Stokhos::ProductEpetraVector > &p_mp_l );
243 RCP<const Stokhos::ProductEpetraVector > get_p_mp(int l) const;
245 bool supports(EInArgs_p_mp arg, int l) const;
246
247
249 void set_t( ScalarMag t );
251 ScalarMag get_t() const;
253 void set_alpha( Scalar alpha );
255 Scalar get_alpha() const;
257 void set_beta( Scalar beta );
259 Scalar get_beta() const;
261 void set_W_x_dot_dot_coeff( Scalar W_x_dot_dot_coeff );
263 Scalar get_W_x_dot_dot_coeff() const;
265 void set_step_size( Scalar step_size);
267 Scalar get_step_size() const;
269 void set_stage_number( Scalar stage_number);
271 Scalar get_stage_number() const;
274 void setArgs(
275 const InArgs<Scalar>& inArgs, bool ignoreUnsupported = false,
276 bool cloneObjects = false
277 );
279 void assertSameSupport( const InArgs<Scalar> &inArgs ) const;
281 std::string modelEvalDescription() const;
283 std::string description() const;
286 void describe(
288 ) const;
289 protected:
291 void _setModelEvalDescription( const std::string &modelEvalDescription );
293 void _set_Np_Ng(int Np, int Ng);
295 void _setSupports( EInArgsMembers arg, bool supports );
297 void _setSupports( EInArgs_p_mp arg, int l, bool supports );
299 void _setSupports( const InArgs<Scalar>& inputInArgs, const int Np );
301 template<typename ObjectType>
302 void _setSupports( const bool supports );
305 private:
306 // types
309 // data
310 std::string modelEvalDescription_;
311 RCP<const VectorBase<Scalar> > x_dot_dot_;
317
318 RCP<const VectorBase<Scalar> > f_multiplier_;
319 p_t g_multiplier_;
321#ifdef HAVE_THYRA_ME_POLYNOMIAL
324#endif // HAVE_THYRA_ME_POLYNOMIAL
325 p_t p_;
326 p_direction_t p_direction_;
327 ScalarMag t_;
328 Scalar alpha_;
329 Scalar beta_;
330 Scalar W_x_dot_dot_coeff_;
331 Scalar step_size_;
332 Scalar stage_number_;
333 bool supports_[NUM_E_IN_ARGS_MEMBERS];
334 Teuchos::Array<bool> supports_p_mp_; //Np
335 // functions
336 void assert_supports(EInArgsMembers arg) const;
337 void assert_supports(EInArgs_p_mp arg, int l) const;
338 void assert_l(int l) const;
339 void assert_j(int j) const;
340
341 std::map<std::string,Teuchos::any> extended_inargs_;
342 };
343
346 EVAL_TYPE_EXACT = 0,
349 };
350
357 template<class ObjType>
358 class Evaluation : public RCP<ObjType> {
359 public:
362 : evalType_(EVAL_TYPE_EXACT) {}
364 Evaluation() : evalType_(EVAL_TYPE_EXACT) {}
367 : RCP<ObjType>(obj), evalType_(EVAL_TYPE_EXACT) {}
369 Evaluation( const RCP<ObjType> &obj, EEvalType evalType )
370 : RCP<ObjType>(obj), evalType_(evalType) {}
372 EEvalType getType() const { return evalType_; }
374 void reset( const RCP<ObjType> &obj, EEvalType evalType )
375 { this->operator=(obj); evalType_ = evalType; }
376 private:
377 EEvalType evalType_;
378 };
379
386 };
387
391 };
392
396 public:
399 :supportsLinearOp_(false), supportsMVByCol_(false), supportsTransMVByRow_(false)
400 {}
403 :supportsLinearOp_(true), supportsMVByCol_(false), supportsTransMVByRow_(false)
404 {}
407 :supportsLinearOp_(false), supportsMVByCol_(mvOrientation==DERIV_MV_BY_COL)
408 ,supportsTransMVByRow_(mvOrientation==DERIV_TRANS_MV_BY_ROW)
409 {}
412 { supportsLinearOp_ = true; return *this; }
415 {
416 switch(mvOrientation) {
417 case DERIV_MV_BY_COL: supportsMVByCol_ = true; break;
418 case DERIV_TRANS_MV_BY_ROW: supportsTransMVByRow_ = true; break;
419 default: TEUCHOS_TEST_FOR_EXCEPT(true);
420 }
421 return *this;
422 }
424 bool none() const
425 { return ( !supportsLinearOp_ && !supportsMVByCol_ && !supportsTransMVByRow_ ); }
428 { return supportsLinearOp_; }
431 {
432 switch(mvOrientation) {
433 case DERIV_MV_BY_COL: return supportsMVByCol_;
434 case DERIV_TRANS_MV_BY_ROW: return supportsTransMVByRow_;
435 default: TEUCHOS_TEST_FOR_EXCEPT(true);
436 }
438 }
440 bool isSameSupport(const DerivativeSupport &derivSupport) const
441 {
442 return (
443 supportsLinearOp_ == derivSupport.supportsLinearOp_
444 && supportsMVByCol_ == derivSupport.supportsMVByCol_
445 && supportsTransMVByRow_ == derivSupport.supportsTransMVByRow_
446 );
447 }
449 std::string description() const;
450 private:
451 bool supportsLinearOp_;
452 bool supportsMVByCol_;
453 bool supportsTransMVByRow_;
454 public:
455 };
456
462 };
463
469 };
470
484 {}
487 EDerivativeLinearity in_linearity, ERankStatus in_rank,
488 bool in_supportsAdjoint
489 )
490 :linearity(in_linearity),rank(in_rank),
491 supportsAdjoint(in_supportsAdjoint)
492 {}
493 };
494
498 template<class Scalar>
500 public:
503 :orientation_(DERIV_MV_BY_COL)
504 {}
507 const RCP<MultiVectorBase<Scalar> > &mv
509 ) : mv_(mv.assert_not_null()), orientation_(orientation) {}
512 { orientation_ = orientation; };
515 { mv_.assert_not_null(); return *this; }
518 { return mv_; }
521 { return orientation_; }
523 std::string description() const;
525 void describe(
527 ) const;
528 private:
531 };
532
536 template<class Scalar>
538 public:
543 : lo_(lo.assert_not_null()) {}
546 const RCP<MultiVectorBase<Scalar> > &mv,
548 ) : dmv_(mv,orientation) {}
551 : dmv_(dmv) {}
553 bool isEmpty() const
554 { return ( lo_.get()==NULL && dmv_.getMultiVector().get()==NULL ); }
557 { dmv_.assert_not_null(); lo_.assert_not_null(); return *this; }
560 { return lo_; }
563 { return dmv_.getMultiVector(); }
566 { return dmv_.getOrientation(); }
569 { return dmv_; }
573 bool isSupportedBy( const DerivativeSupport &derivSupport ) const
574 {
575 // If there is not derivative support then we will return false!
576 if (derivSupport.none())
577 return false;
578 if (!is_null(getMultiVector())) {
579 return derivSupport.supports(getMultiVectorOrientation());
580 }
581 else if(!is_null(getLinearOp())) {
582 return derivSupport.supports(DERIV_LINEAR_OP);
583 }
584 // If nothing is set then of course we support that!
585 return true;
586 }
588 std::string description() const;
590 void describe(
592 ) const;
593 private:
596 };
597
602 public:
605 :orientation_(DERIV_MV_BY_COL)
606 {}
611 ,const Teuchos::Array<int> &paramIndexes = Teuchos::Array<int>()
612 ) : mv_(mv.assert_not_null()), orientation_(orientation), paramIndexes_(paramIndexes) {}
615 { orientation_ = orientation; };
618 { mv_.assert_not_null(); return *this; }
621 { return mv_; }
624 { return orientation_; }
627 { return paramIndexes_; }
629 std::string description() const {return "\n";}
631 void describe(
632 Teuchos::FancyOStream &/* out */, const Teuchos::EVerbosityLevel /* verbLevel */
633 ) const {}
634 private:
637 Teuchos::Array<int> paramIndexes_;
638 };
639
644 public:
649 : lo_(lo.assert_not_null()) {}
654 ) : dmv_(mv,orientation) {}
657 : dmv_(dmv) {}
659 bool isEmpty() const
660 { return ( lo_.get()==NULL && dmv_.getMultiVector().get()==NULL ); }
663 { dmv_.assert_not_null(); lo_.assert_not_null(); return *this; }
666 { return lo_; }
669 { return dmv_.getMultiVector(); }
672 { return dmv_.getOrientation(); }
675 { return dmv_; }
679 bool isSupportedBy( const DerivativeSupport &derivSupport ) const
680 {
681 // If there is not derivative support then we will return false!
682 if (derivSupport.none())
683 return false;
684 if (!is_null(getMultiVector())) {
685 return derivSupport.supports(getMultiVectorOrientation());
686 }
687 else if(!is_null(getLinearOp())) {
688 return derivSupport.supports(DERIV_LINEAR_OP);
689 }
690 // If nothing is set then of course we support that!
691 return true;
692 }
694 std::string description() const {return "\n";}
696 void describe(
697 Teuchos::FancyOStream &/* out */, const Teuchos::EVerbosityLevel /* verbLevel */
698 ) const {}
699 private:
702 };
703
713 };
715 static const int NUM_E_OUT_ARGS_MEMBERS=7;
716
720 };
721
725 };
726
730 };
731
735 };
736
737#ifdef Thyra_BUILD_HESSIAN_SUPPORT
739 enum EOutArgs_hess_vec_prod_f_xx {
740 OUT_ARG_hess_vec_prod_f_xx
741 };
742
744 enum EOutArgs_hess_vec_prod_f_xp {
745 OUT_ARG_hess_vec_prod_f_xp
746 };
747
749 enum EOutArgs_hess_vec_prod_f_px {
750 OUT_ARG_hess_vec_prod_f_px
751 };
752
754 enum EOutArgs_hess_vec_prod_f_pp {
755 OUT_ARG_hess_vec_prod_f_pp
756 };
757
759 enum EOutArgs_hess_vec_prod_g_xx {
760 OUT_ARG_hess_vec_prod_g_xx
761 };
762
764 enum EOutArgs_hess_vec_prod_g_xp {
765 OUT_ARG_hess_vec_prod_g_xp
766 };
767
769 enum EOutArgs_hess_vec_prod_g_px {
770 OUT_ARG_hess_vec_prod_g_px
771 };
772
774 enum EOutArgs_hess_vec_prod_g_pp {
775 OUT_ARG_hess_vec_prod_g_pp
776 };
777
779 enum EOutArgs_hess_f_xx {
780 OUT_ARG_hess_f_xx
781 };
782
784 enum EOutArgs_hess_f_xp {
785 OUT_ARG_hess_f_xp
786 };
787
789 enum EOutArgs_hess_f_pp {
790 OUT_ARG_hess_f_pp
791 };
792
794 enum EOutArgs_hess_g_xx {
795 OUT_ARG_hess_g_xx
796 };
797
799 enum EOutArgs_hess_g_xp {
800 OUT_ARG_hess_g_xp
801 };
802
804 enum EOutArgs_hess_g_pp {
805 OUT_ARG_hess_g_pp
806 };
807
809 enum EOutArgs_H_xx {
810 OUT_ARG_H_xx
811 };
812
814 enum EOutArgs_H_xp {
815 OUT_ARG_H_xp
816 };
817
819 enum EOutArgs_H_pp {
820 OUT_ARG_H_pp
821 };
822#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
823
827 };
828
832 };
833
837 };
838
842 };
843
847 };
848
901 template<class Scalar>
903 public:
905 OutArgs();
908 int Np() const;
911 int Ng() const;
913 bool supports(EOutArgsMembers arg) const;
916 const DerivativeSupport& supports(EOutArgsDfDp arg, int l) const;
919 const DerivativeSupport& supports(EOutArgsDgDx_dot arg, int j) const;
922 const DerivativeSupport& supports(EOutArgsDgDx arg, int j) const;
925 const DerivativeSupport& supports(EOutArgsDgDp arg, int j, int l) const;
926
927#ifdef Thyra_BUILD_HESSIAN_SUPPORT
929 bool supports(EOutArgs_hess_vec_prod_f_xx arg) const;
932 bool supports(EOutArgs_hess_vec_prod_f_xp arg, int l) const;
935 bool supports(EOutArgs_hess_vec_prod_f_px arg, int l) const;
938 bool supports(EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2) const;
941 bool supports(EOutArgs_hess_vec_prod_g_xx arg, int j) const;
944 bool supports(EOutArgs_hess_vec_prod_g_xp arg, int j, int l) const;
947 bool supports(EOutArgs_hess_vec_prod_g_px arg, int j, int l) const;
950 bool supports(EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2) const;
952 bool supports(EOutArgs_hess_f_xx arg) const;
955 bool supports(EOutArgs_hess_f_xp arg, int l) const;
958 bool supports(EOutArgs_hess_f_pp arg, int l1, int l2) const;
961 bool supports(EOutArgs_hess_g_xx arg, int j) const;
964 bool supports(EOutArgs_hess_g_xp arg, int j, int l) const;
967 bool supports(EOutArgs_hess_g_pp arg, int j, int l1, int l2) const;
969 bool supports(EOutArgs_H_xx arg) const;
972 bool supports(EOutArgs_H_xp arg, int l) const;
975 bool supports(EOutArgs_H_pp arg, int l1, int l2) const;
976#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
977
979 void set_f( const Evaluation<VectorBase<Scalar> > &f );
983 void set_g( int j, const Evaluation<VectorBase<Scalar> > &g_j );
987 void set_W( const RCP<LinearOpWithSolveBase<Scalar> > &W );
990
992 template<typename ObjectType>
993 bool supports() const;
995 template<typename ObjectType>
996 void set(const RCP<const ObjectType>& uo);
998 template<typename ObjectType>
1000
1001 const DerivativeSupport& supports(EOutArgsDfDp_mp arg, int l) const;
1002 bool supports(EOutArgs_g_mp arg, int j) const;
1003 const DerivativeSupport& supports(EOutArgsDgDx_dot_mp arg, int j) const;
1004 const DerivativeSupport& supports(EOutArgsDgDx_mp arg, int j) const;
1005 const DerivativeSupport& supports(EOutArgsDgDp_mp arg, int j, int l) const;
1007 void set_f_mp( const RCP<Stokhos::ProductEpetraVector> &f_mp );
1011 void set_g_mp( int j, const RCP<Stokhos::ProductEpetraVector> &g_mp_j );
1018
1020 void set_W_op( const RCP<LinearOpBase<Scalar> > &W_op );
1024 void set_W_prec( const RCP<PreconditionerBase<Scalar> > &W_prec );
1031 void set_DfDp(int l, const Derivative<Scalar> &DfDp_l);
1033 Derivative<Scalar> get_DfDp(int l) const;
1038 void set_DgDx_dot(int j, const Derivative<Scalar> &DgDx_dot_j);
1040 Derivative<Scalar> get_DgDx_dot(int j) const;
1045 void set_DgDx(int j, const Derivative<Scalar> &DgDx_j);
1047 Derivative<Scalar> get_DgDx(int j) const;
1052 void set_DgDp( int j, int l, const Derivative<Scalar> &DgDp_j_l );
1054 Derivative<Scalar> get_DgDp(int j, int l) const;
1057 DerivativeProperties get_DgDp_properties(int j, int l) const;
1058
1059#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1060
1062 void set_hess_vec_prod_f_xx(const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_xx);
1064 void set_hess_vec_prod_f_xp(int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_xp_l);
1066 void set_hess_vec_prod_f_px(int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_px_l);
1068 void set_hess_vec_prod_f_pp(int l1, int l2, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_f_pp_l1_l2);
1069
1071 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_xx() const;
1073 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_xp(int l) const;
1075 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_px(int l) const;
1077 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_f_pp(int l1, int l2) const;
1078
1080 void set_hess_vec_prod_g_xx(int j, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_xx_j);
1082 void set_hess_vec_prod_g_xp(int j, int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_xp_j_l);
1084 void set_hess_vec_prod_g_px(int j, int l, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_px_j_l);
1086 void set_hess_vec_prod_g_pp(int j, int l1, int l2, const RCP<MultiVectorBase<Scalar> > &hess_vec_prod_g_pp_j_l1_l2);
1087
1089 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_xx(int j) const;
1091 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_xp(int j, int l) const;
1093 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_px(int j, int l) const;
1095 RCP<MultiVectorBase<Scalar> > get_hess_vec_prod_g_pp(int j, int l1, int l2) const;
1096
1098 void set_hess_f_xx(const RCP<LinearOpBase<Scalar> > &hess_f_xx);
1100 void set_hess_f_xp(int l, const RCP<LinearOpBase<Scalar> > &hess_f_xp_l);
1102 void set_hess_f_pp(int l1, int l2, const RCP<LinearOpBase<Scalar> > &hess_f_pp_l1_l2);
1104 void set_hess_g_xx(int j, const RCP<LinearOpBase<Scalar> > &hess_g_xx_j);
1106 void set_hess_g_xp(int j, int l, const RCP<LinearOpBase<Scalar> > &hess_g_xp_j_l);
1108 void set_hess_g_pp(int j, int l1, int l2, const RCP<LinearOpBase<Scalar> > &hess_g_pp_j_l1_l2);
1110 void set_H_xx(const RCP<LinearOpBase<Scalar> > &H_xx);
1112 void set_H_xp(int l, const RCP<LinearOpBase<Scalar> > &H_xp_l);
1114 void set_H_pp(int l1, int l2, const RCP<LinearOpBase<Scalar> > &H_pp_l1_l2);
1115
1117 RCP<LinearOpBase<Scalar> > get_hess_f_xx() const;
1119 RCP<LinearOpBase<Scalar> > get_hess_f_xp(int l) const;
1121 RCP<LinearOpBase<Scalar> > get_hess_f_pp(int l1, int l2) const;
1123 RCP<LinearOpBase<Scalar> > get_hess_g_xx(int j) const;
1125 RCP<LinearOpBase<Scalar> > get_hess_g_xp(int j, int l) const;
1127 RCP<LinearOpBase<Scalar> > get_hess_g_pp(int j, int l1, int l2) const;
1129 RCP<LinearOpBase<Scalar> > get_H_xx() const;
1131 RCP<LinearOpBase<Scalar> > get_H_xp(int l) const;
1133 RCP<LinearOpBase<Scalar> > get_H_pp(int l1, int l2) const;
1134
1135#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1136
1137 void set_DfDp_mp(int l, const MPDerivative &DfDp_mp_l);
1138 MPDerivative get_DfDp_mp(int l) const;
1139 DerivativeProperties get_DfDp_mp_properties(int l) const;
1140 void set_DgDx_dot_mp(int j, const MPDerivative &DgDx_dot_mp_j);
1141 MPDerivative get_DgDx_dot_mp(int j) const;
1142 DerivativeProperties get_DgDx_dot_mp_properties(int j) const;
1143 void set_DgDx_mp(int j, const MPDerivative &DgDx_mp_j);
1144 MPDerivative get_DgDx_mp(int j) const;
1145 DerivativeProperties get_DgDx_mp_properties(int j) const;
1146 void set_DgDp_mp( int j, int l, const MPDerivative &DgDp_mp_j_l );
1147 MPDerivative get_DgDp_mp(int j, int l) const;
1148 DerivativeProperties get_DgDp_mp_properties(int j, int l) const;
1149
1150#ifdef HAVE_THYRA_ME_POLYNOMIAL
1152 void set_f_poly( const RCP<Teuchos::Polynomial< VectorBase<Scalar> > > &f_poly );
1154 RCP<Teuchos::Polynomial< VectorBase<Scalar> > > get_f_poly() const;
1155#endif // HAVE_THYRA_ME_POLYNOMIAL
1161 void setArgs( const OutArgs<Scalar>& outArgs, bool ignoreUnsupported = false );
1173 void setFailed() const;
1179 bool isFailed() const;
1181 bool isEmpty() const;
1183 void assertSameSupport( const OutArgs<Scalar> &outArgs ) const;
1185 std::string modelEvalDescription() const;
1187 std::string description() const;
1190 void describe(
1192 ) const;
1193 protected:
1195 void _setModelEvalDescription( const std::string &modelEvalDescription );
1197 void _set_Np_Ng(int Np, int Ng);
1199 void _setSupports( EOutArgsMembers arg, bool supports );
1201 template<typename ObjectType>
1202 void _setSupports( const bool supports );
1204 void _setSupports( EOutArgsDfDp arg, int l, const DerivativeSupport& );
1206 void _setSupports( EOutArgsDgDx_dot arg, int j, const DerivativeSupport& );
1208 void _setSupports( EOutArgsDgDx arg, int j, const DerivativeSupport& );
1210 void _setSupports( EOutArgsDgDp arg, int j, int l, const DerivativeSupport& );
1211
1212#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1213
1215 void _setSupports( EOutArgs_hess_vec_prod_f_xx arg, bool supports );
1217 void _setSupports( EOutArgs_hess_vec_prod_f_xp arg, int l, bool supports );
1219 void _setSupports( EOutArgs_hess_vec_prod_f_px arg, int l, bool supports );
1221 void _setSupports( EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2, bool supports );
1223 void _setSupports( EOutArgs_hess_vec_prod_g_xx arg, int j, bool supports );
1225 void _setSupports( EOutArgs_hess_vec_prod_g_xp arg, int j, int l, bool supports );
1227 void _setSupports( EOutArgs_hess_vec_prod_g_px arg, int j, int l, bool supports );
1229 void _setSupports( EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2, bool supports );
1230
1232 void _setSupports( EOutArgs_hess_f_xx arg, bool supports );
1234 void _setSupports( EOutArgs_hess_f_xp arg, int l, bool supports );
1236 void _setSupports( EOutArgs_hess_f_pp arg, int l1, int l2, bool supports );
1238 void _setSupports( EOutArgs_hess_g_xx arg, int j, bool supports );
1240 void _setSupports( EOutArgs_hess_g_xp arg, int j, int l, bool supports );
1242 void _setSupports( EOutArgs_hess_g_pp arg, int j, int l1, int l2, bool supports );
1244 void _setSupports( EOutArgs_H_xx arg, bool supports );
1246 void _setSupports( EOutArgs_H_xp arg, int l, bool supports );
1248 void _setSupports( EOutArgs_H_pp arg, int l1, int l2, bool supports );
1249
1250#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1251
1252 void _setSupports( EOutArgs_g_mp arg, int j, bool supports );
1253 void _setSupports( EOutArgsDfDp_mp arg, int l, const DerivativeSupport& );
1254 void _setSupports( EOutArgsDgDx_dot_mp arg, int j, const DerivativeSupport& );
1255 void _setSupports( EOutArgsDgDx_mp arg, int j, const DerivativeSupport& );
1256 void _setSupports( EOutArgsDgDp_mp arg, int j, int l, const DerivativeSupport& );
1257
1259 void _set_W_properties( const DerivativeProperties &properties );
1261 void _set_DfDp_properties( int l, const DerivativeProperties &properties );
1263 void _set_DgDx_dot_properties( int j, const DerivativeProperties &properties );
1265 void _set_DgDx_properties( int j, const DerivativeProperties &properties );
1267 void _set_DgDp_properties( int j, int l, const DerivativeProperties &properties );
1268
1269 void _set_DfDp_mp_properties( int l, const DerivativeProperties &properties );
1270 void _set_DgDx_dot_mp_properties( int j, const DerivativeProperties &properties );
1271 void _set_DgDx_mp_properties( int j, const DerivativeProperties &properties );
1272 void _set_DgDp_mp_properties( int j, int l, const DerivativeProperties &properties );
1273
1275 void _setSupports( const OutArgs<Scalar>& inputOutArgs );
1280#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1282 void _setHessianSupports( const bool supports );
1283#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1284
1285 private:
1286 // types
1291#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1292 typedef Teuchos::Array<RCP<LinearOpBase<Scalar> > > hess_t;
1293 typedef Teuchos::Array<RCP<MultiVectorBase<Scalar> > > hess_vec_t;
1294 typedef Teuchos::Array<bool> hess_supports_t;
1295#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1296
1297 // data
1298 std::string modelEvalDescription_;
1299 bool supports_[NUM_E_OUT_ARGS_MEMBERS];
1300 supports_t supports_DfDp_; // Np
1301 supports_t supports_DgDx_dot_; // Ng
1302 supports_t supports_DgDx_; // Ng
1303 supports_t supports_DgDp_; // Ng x Np
1304
1305#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1306
1307 bool supports_hess_f_xx_;
1308 hess_supports_t supports_hess_f_xp_;
1309 hess_supports_t supports_hess_f_pp_;
1310 hess_supports_t supports_hess_g_xx_;
1311 hess_supports_t supports_hess_g_xp_;
1312 hess_supports_t supports_hess_g_pp_;
1313 bool supports_H_xx_;
1314 hess_supports_t supports_H_xp_;
1315 hess_supports_t supports_H_pp_;
1316
1317 bool supports_hess_vec_prod_f_xx_;
1318 hess_supports_t supports_hess_vec_prod_f_xp_;
1319 hess_supports_t supports_hess_vec_prod_f_px_;
1320 hess_supports_t supports_hess_vec_prod_f_pp_;
1321 hess_supports_t supports_hess_vec_prod_g_xx_;
1322 hess_supports_t supports_hess_vec_prod_g_xp_;
1323 hess_supports_t supports_hess_vec_prod_g_px_;
1324 hess_supports_t supports_hess_vec_prod_g_pp_;
1325
1326#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1327
1329 g_t g_; // Ng
1333 DerivativeProperties W_properties_;
1334 deriv_t DfDp_; // Np
1335 deriv_properties_t DfDp_properties_; // Np
1336 deriv_t DgDx_dot_; // Ng
1337 deriv_t DgDx_; // Ng
1338 deriv_properties_t DgDx_dot_properties_; // Ng
1339 deriv_properties_t DgDx_properties_; // Ng
1340 deriv_t DgDp_; // Ng x Np
1341 deriv_properties_t DgDp_properties_; // Ng x Np
1342
1343#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1344
1345 RCP<LinearOpBase<Scalar> > hess_f_xx_;
1346 hess_t hess_f_xp_;
1347 hess_t hess_f_pp_;
1348 hess_t hess_g_xx_;
1349 hess_t hess_g_xp_;
1350 hess_t hess_g_pp_;
1352 hess_t H_xp_;
1353 hess_t H_pp_;
1354
1355 RCP<MultiVectorBase<Scalar> > hess_vec_prod_f_xx_;
1356 hess_vec_t hess_vec_prod_f_xp_; // Np
1357 hess_vec_t hess_vec_prod_f_px_; // Np
1358 hess_vec_t hess_vec_prod_f_pp_; // Np x Np
1359
1360 hess_vec_t hess_vec_prod_g_xx_; // Ng
1361 hess_vec_t hess_vec_prod_g_xp_; // Ng x Np
1362 hess_vec_t hess_vec_prod_g_px_; // Ng x Np
1363 hess_vec_t hess_vec_prod_g_pp_; // Ng x Np x Np
1364
1365#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1366
1367 Teuchos::Array<bool> supports_g_mp_; //Ng
1368 supports_t supports_DfDp_mp_; // Np_mp
1369 supports_t supports_DgDx_dot_mp_; // Ng_mp
1370 supports_t supports_DgDx_mp_; // Ng_mp
1371 supports_t supports_DgDp_mp_; // Ng_mp x Np_mp
1376 Teuchos::Array<MPDerivative> DgDx_dot_mp_;
1379 deriv_properties_t DfDp_mp_properties_;
1380 deriv_properties_t DgDx_dot_mp_properties_;
1381 deriv_properties_t DgDx_mp_properties_;
1382 deriv_properties_t DgDp_mp_properties_;
1383
1384#ifdef HAVE_THYRA_ME_POLYNOMIAL
1386#endif // HAVE_THYRA_ME_POLYNOMIAL
1387 mutable bool isFailed_;
1388
1389 std::map<std::string,Teuchos::any> extended_outargs_;
1390
1391 // functions
1392 void assert_supports(EOutArgsMembers arg) const;
1393 void assert_supports(
1394 EOutArgsDfDp arg, int l,
1395 const Derivative<Scalar> &deriv = Derivative<Scalar>()
1396 ) const;
1397 void assert_supports(
1398 EOutArgsDgDx_dot arg, int j,
1399 const Derivative<Scalar> &deriv = Derivative<Scalar>()
1400 ) const;
1401 void assert_supports(
1402 EOutArgsDgDx arg, int j,
1403 const Derivative<Scalar> &deriv = Derivative<Scalar>()
1404 ) const;
1405 void assert_supports(
1406 EOutArgsDgDp arg, int j, int l,
1407 const Derivative<Scalar> &deriv = Derivative<Scalar>()
1408 ) const;
1409
1410#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1411
1412 void assert_supports(
1413 EOutArgs_hess_vec_prod_f_xx arg
1414 ) const;
1415 void assert_supports(
1416 EOutArgs_hess_vec_prod_f_xp arg, int l
1417 ) const;
1418 void assert_supports(
1419 EOutArgs_hess_vec_prod_f_px arg, int l
1420 ) const;
1421 void assert_supports(
1422 EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2
1423 ) const;
1424 void assert_supports(
1425 EOutArgs_hess_vec_prod_g_xx arg, int j
1426 ) const;
1427 void assert_supports(
1428 EOutArgs_hess_vec_prod_g_xp arg, int j, int l
1429 ) const;
1430 void assert_supports(
1431 EOutArgs_hess_vec_prod_g_px arg, int j, int l
1432 ) const;
1433 void assert_supports(
1434 EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2
1435 ) const;
1436
1437 void assert_supports(
1438 EOutArgs_hess_f_xx arg
1439 ) const;
1440 void assert_supports(
1441 EOutArgs_hess_f_xp arg, int l
1442 ) const;
1443 void assert_supports(
1444 EOutArgs_hess_f_pp arg, int l1, int l2
1445 ) const;
1446 void assert_supports(
1447 EOutArgs_hess_g_xx arg, int j
1448 ) const;
1449 void assert_supports(
1450 EOutArgs_hess_g_xp arg, int j, int l
1451 ) const;
1452 void assert_supports(
1453 EOutArgs_hess_g_pp arg, int j, int l1, int l2
1454 ) const;
1455 void assert_supports(
1456 EOutArgs_H_xx arg
1457 ) const;
1458 void assert_supports(
1459 EOutArgs_H_xp arg, int l
1460 ) const;
1461 void assert_supports(
1462 EOutArgs_H_pp arg, int l1, int l2
1463 ) const;
1464
1465#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1466
1467 void assert_supports(EOutArgs_g_mp arg, int j) const;
1468 void assert_supports(
1469 EOutArgsDfDp_mp arg, int l,
1470 const MPDerivative &deriv = MPDerivative()
1471 ) const;
1472 void assert_supports(
1473 EOutArgsDgDx_dot_mp arg, int j,
1474 const MPDerivative &deriv = MPDerivative()
1475 ) const;
1476 void assert_supports(
1477 EOutArgsDgDx_mp arg, int j,
1478 const MPDerivative &deriv = MPDerivative()
1479 ) const;
1480 void assert_supports(
1481 EOutArgsDgDp_mp arg, int j, int l,
1482 const MPDerivative &deriv = MPDerivative()
1483 ) const;
1484
1485 void assert_l(int l) const;
1486 void assert_j(int j) const;
1487 };
1488
1490
1491// Added since at least gcc 3.3.4 does not do the right thing here!
1492#ifdef HAVE_PROTECTED_NESTED_TEMPLATE_CLASS_ACCESS
1493protected:
1494#endif
1495
1498
1506 template<class Scalar>
1507 class InArgsSetup : public InArgs<Scalar> {
1508 public:
1510 InArgsSetup();
1512 InArgsSetup( const InArgs<Scalar>& );
1514 void setModelEvalDescription( const std::string &modelEvalDescription );
1516 void set_Np(int Np);
1518 void set_Np_Ng(int Np, int Ng);
1520 void setSupports( EInArgsMembers arg, bool supports = true );
1522 void setSupports( const InArgs<Scalar>& inputInArgs, const int Np = -1 );
1524 template<typename ObjectType>
1525 void setSupports(const bool supports = true);
1528
1529 void setSupports( EInArgs_p_mp arg, int l, bool supports);
1530 };
1531
1539 template<class Scalar>
1540 class OutArgsSetup : public OutArgs<Scalar> {
1541 public:
1543 OutArgsSetup();
1545 OutArgsSetup( const OutArgs<Scalar>& );
1547 void setModelEvalDescription( const std::string &modelEvalDescription );
1549 void set_Np_Ng(int Np, int Ng);
1551 void setSupports( EOutArgsMembers arg, bool supports = true );
1553 void setSupports(EOutArgsDfDp arg, int l, const DerivativeSupport& );
1555 void setSupports(EOutArgsDgDx_dot arg, int j, const DerivativeSupport& );
1557 void setSupports(EOutArgsDgDx arg, int j, const DerivativeSupport& );
1559 void setSupports(EOutArgsDgDp arg, int j, int l, const DerivativeSupport& );
1560
1561#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1563 void setSupports(EOutArgs_hess_vec_prod_f_xx arg, bool supports = true );
1565 void setSupports(EOutArgs_hess_vec_prod_f_xp arg, int l, bool supports = true );
1567 void setSupports(EOutArgs_hess_vec_prod_f_px arg, int l, bool supports = true );
1569 void setSupports(EOutArgs_hess_vec_prod_f_pp arg, int l1, int l2, bool supports = true );
1571 void setSupports(EOutArgs_hess_vec_prod_g_xx arg, int j, bool supports = true );
1573 void setSupports(EOutArgs_hess_vec_prod_g_xp arg, int j, int l, bool supports = true );
1575 void setSupports(EOutArgs_hess_vec_prod_g_px arg, int j, int l, bool supports = true );
1577 void setSupports(EOutArgs_hess_vec_prod_g_pp arg, int j, int l1, int l2, bool supports = true );
1579 void setSupports(EOutArgs_hess_f_xx arg, bool supports = true );
1581 void setSupports(EOutArgs_hess_f_xp arg, int l, bool supports = true );
1583 void setSupports(EOutArgs_hess_f_pp arg, int l1, int l2, bool supports = true );
1585 void setSupports(EOutArgs_hess_g_xx arg, int j, bool supports = true );
1587 void setSupports(EOutArgs_hess_g_xp arg, int j, int l, bool supports = true );
1589 void setSupports(EOutArgs_hess_g_pp arg, int j, int l1, int l2, bool supports = true );
1591 void setSupports(EOutArgs_H_xx arg, bool supports = true );
1593 void setSupports(EOutArgs_H_xp arg, int l, bool supports = true );
1595 void setSupports(EOutArgs_H_pp arg, int l1, int l2, bool supports = true );
1596#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1597
1599 template<typename ObjectType>
1600 void setSupports(const bool supports = true);
1601
1602 void setSupports( EOutArgs_g_mp arg, int j, bool supports);
1603 void setSupports(EOutArgsDfDp_mp arg, int l, const DerivativeSupport& );
1604 void setSupports(EOutArgsDgDx_dot_mp arg, int j, const DerivativeSupport& );
1605 void setSupports(EOutArgsDgDx_mp arg, int j, const DerivativeSupport& );
1606 void setSupports(EOutArgsDgDp_mp arg, int j, int l, const DerivativeSupport& );
1607
1609 void set_W_properties( const DerivativeProperties &properties );
1611 void set_DfDp_properties( int l, const DerivativeProperties &properties );
1613 void set_DgDx_dot_properties( int j, const DerivativeProperties &properties );
1615 void set_DgDx_properties( int j, const DerivativeProperties &properties );
1617 void set_DgDp_properties( int j, int l, const DerivativeProperties &properties );
1618
1619 void set_DfDp_mp_properties( int l, const DerivativeProperties &properties );
1620 void set_DgDx_dot_mp_properties( int j, const DerivativeProperties &properties );
1621 void set_DgDx_mp_properties( int j, const DerivativeProperties &properties );
1622 void set_DgDp_mp_properties( int j, int l, const DerivativeProperties &properties );
1623
1625 void setSupports( const OutArgs<Scalar>& inputOutArgs );
1630
1631#ifdef Thyra_BUILD_HESSIAN_SUPPORT
1633 void setHessianSupports( const bool supports = true );
1634#endif // ifdef Thyra_BUILD_HESSIAN_SUPPORT
1635 };
1636
1638
1641
1644
1646
1647private:
1648 // Not defined and not to be called
1650 ModelEvaluatorBase& operator=(const ModelEvaluatorBase&);
1651
1652}; // ModelEvaluatorBase
1653
1654
1657
1658
1661
1662
1664std::string toString(
1666 );
1667
1668
1671getOtherDerivativeMultiVectorOrientation(
1673 );
1674
1675
1676} // namespace Thyra
1677
1678
1679// //////////////////////////////////
1680// Inline Defintions
1681
1682// Extended InArgs
1683template<class Scalar>
1684template<typename ObjectType>
1686{
1687 std::map<std::string,Teuchos::any>::const_iterator search =
1688 extended_inargs_.find(typeid(ObjectType).name());
1689
1690 if (search == extended_inargs_.end())
1691 return false;
1692
1693 return true;
1694}
1695
1696template<class Scalar>
1697template<typename ObjectType>
1699{
1700 std::map<std::string,Teuchos::any>::iterator search = extended_inargs_.find(typeid(ObjectType).name());
1701 TEUCHOS_TEST_FOR_EXCEPTION(search == extended_inargs_.end(),
1702 std::runtime_error,
1703 "ERROR: InArgs::set<ObjectType>() was called with unsupported extended data type \""
1704 << typeid(ObjectType).name() << "\"!");
1705
1706 search->second = Teuchos::any(eo);
1707}
1708
1709template<class Scalar>
1710template<typename ObjectType>
1713{
1714 std::map<std::string,Teuchos::any>::const_iterator search = extended_inargs_.find(typeid(ObjectType).name());
1715 TEUCHOS_TEST_FOR_EXCEPTION(search == extended_inargs_.end(),
1716 std::runtime_error,
1717 "ERROR: InArgs::get<ObjectType>() was called with unsupported extended data type \""
1718 << typeid(ObjectType).name() << "\"!");
1719
1720 return Teuchos::any_cast<Teuchos::RCP<const ObjectType> >(search->second);
1721}
1722
1723template<class Scalar>
1724template<class ObjectType>
1726setSupports(const bool in_supports)
1727{
1728 this->template _setSupports<ObjectType>(in_supports);
1729}
1730
1731template<class Scalar>
1732template<class ObjectType>
1734_setSupports(const bool in_supports)
1735{
1736 if (in_supports)
1737 // When supports() is called, the map is searched to check for
1738 // supporting a type. If we support the type, we will insert an
1739 // empty placholder for now so that the search is successful for
1740 // support checks.
1741 this->extended_inargs_[typeid(ObjectType).name()] = Teuchos::any();
1742 else {
1743 // if false, remove the entry
1744 std::map<std::string,Teuchos::any>::iterator search =
1745 this->extended_inargs_.find(typeid(ObjectType).name());
1746
1747 if (search != this->extended_inargs_.end())
1748 this->extended_inargs_.erase(typeid(ObjectType).name());
1749 }
1750}
1751
1752// Extended OutArgs
1753template<class Scalar>
1754template<typename ObjectType>
1756{
1757 std::map<std::string,Teuchos::any>::const_iterator search =
1758 extended_outargs_.find(typeid(ObjectType).name());
1759
1760 if (search == extended_outargs_.end())
1761 return false;
1762
1763 return true;
1764}
1765
1766template<class Scalar>
1767template<typename ObjectType>
1769{
1770 std::map<std::string,Teuchos::any>::iterator search = extended_outargs_.find(typeid(ObjectType).name());
1771 TEUCHOS_TEST_FOR_EXCEPTION(search == extended_outargs_.end(),
1772 std::runtime_error,
1773 "ERROR: OutArgs::set<ObjectType>() was called with unsupported extended data type \""
1774 << typeid(ObjectType).name() << "\"!");
1775
1776 search->second = Teuchos::any(eo);
1777}
1778
1779template<class Scalar>
1780template<typename ObjectType>
1783{
1784 std::map<std::string,Teuchos::any>::const_iterator search = extended_outargs_.find(typeid(ObjectType).name());
1785 TEUCHOS_TEST_FOR_EXCEPTION(search == extended_outargs_.end(),
1786 std::runtime_error,
1787 "ERROR: OutArgs::get<ObjectType>() was called with unsupported extended data type \""
1788 << typeid(ObjectType).name() << "\"!");
1789
1790 return Teuchos::any_cast<Teuchos::RCP<const ObjectType> >(search->second);
1791}
1792
1793template<class Scalar>
1794template<class ObjectType>
1796setSupports(const bool in_supports)
1797{
1798 this->template _setSupports<ObjectType>(in_supports);
1799}
1800
1801template<class Scalar>
1802template<class ObjectType>
1804_setSupports(const bool in_supports)
1805{
1806 if (in_supports)
1807 // When supports() is called, the map is searched to check for
1808 // supporting a type. If we support the type, we will insert an
1809 // empty placholder for now so that the search is successful for
1810 // support checks.
1811 this->extended_outargs_[typeid(ObjectType).name()] = Teuchos::any();
1812 else {
1813 // if false, remove the entry
1814 std::map<std::string,Teuchos::any>::iterator search =
1815 this->extended_outargs_.find(typeid(ObjectType).name());
1816
1817 if (search != this->extended_outargs_.end())
1818 this->extended_outargs_.erase(typeid(ObjectType).name());
1819 }
1820}
1821
1822//
1823// Thyra_MEB_helper_functions_grp
1824//
1825
1826
1827inline
1829{
1830 switch(arg) {
1831 case ModelEvaluatorBase::IN_ARG_x_dot_dot:
1832 return "IN_ARG_x_dot_dot";
1833 case ModelEvaluatorBase::IN_ARG_x_dot:
1834 return "IN_ARG_x_dot";
1835 case ModelEvaluatorBase::IN_ARG_x:
1836 return "IN_ARG_x";
1837 case ModelEvaluatorBase::IN_ARG_x_dot_poly:
1838 return "IN_ARG_x_dot_poly";
1839 case ModelEvaluatorBase::IN_ARG_x_poly:
1840 return "IN_ARG_x_poly";
1841 case ModelEvaluatorBase::IN_ARG_x_dot_mp:
1842 return "IN_ARG_x_dot_mp";
1843 case ModelEvaluatorBase::IN_ARG_x_mp:
1844 return "IN_ARG_x_mp";
1845 case ModelEvaluatorBase::IN_ARG_t:
1846 return "IN_ARG_t";
1847 case ModelEvaluatorBase::IN_ARG_alpha:
1848 return "IN_ARG_alpha";
1849 case ModelEvaluatorBase::IN_ARG_beta:
1850 return "IN_ARG_beta";
1851 case ModelEvaluatorBase::IN_ARG_W_x_dot_dot_coeff:
1852 return "IN_ARG_W_x_dot_dot_coeff";
1853 case ModelEvaluatorBase::IN_ARG_step_size:
1854 return "IN_ARG_step_size";
1855 case ModelEvaluatorBase::IN_ARG_stage_number:
1856 return "IN_ARG_stage_number";
1857#ifdef TEUCHOS_DEBUG
1858 default:
1860#endif
1861 }
1862 return ""; // Will never be executed!
1863}
1864
1865
1866inline
1867std::string Thyra::toString(ModelEvaluatorBase::EOutArgsMembers arg)
1868{
1869 switch(arg) {
1870 case ModelEvaluatorBase::OUT_ARG_f:
1871 return "OUT_ARG_f";
1872 case ModelEvaluatorBase::OUT_ARG_W:
1873 return "OUT_ARG_W";
1874 case ModelEvaluatorBase::OUT_ARG_f_mp:
1875 return "OUT_ARG_f_mp";
1876 case ModelEvaluatorBase::OUT_ARG_W_mp:
1877 return "OUT_ARG_W_mp";
1878 case ModelEvaluatorBase::OUT_ARG_W_op:
1879 return "OUT_ARG_W_op";
1880 case ModelEvaluatorBase::OUT_ARG_W_prec:
1881 return "OUT_ARG_W_prec";
1882 case ModelEvaluatorBase::OUT_ARG_f_poly:
1883 return "OUT_ARG_f_poly";
1884#ifdef TEUCHOS_DEBUG
1885 default:
1887#endif
1888 }
1889 return ""; // Will never be executed!
1890}
1891
1892
1893inline
1894std::string Thyra::toString(
1895 ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
1896 )
1897{
1898 switch(orientation) {
1899 case ModelEvaluatorBase::DERIV_MV_BY_COL:
1900 return "DERIV_MV_BY_COL";
1901 case ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW:
1902 return "DERIV_TRANS_MV_BY_ROW";
1903#ifdef TEUCHOS_DEBUG
1904 default:
1906#endif
1907 }
1908 return ""; // Should never execute this!
1909}
1910
1911
1912inline
1914Thyra::getOtherDerivativeMultiVectorOrientation(
1915 ModelEvaluatorBase::EDerivativeMultiVectorOrientation orientation
1916 )
1917{
1918 switch(orientation) {
1919 case ModelEvaluatorBase::DERIV_MV_BY_COL:
1920 return ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW;
1921 case ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW:
1922 return ModelEvaluatorBase::DERIV_MV_BY_COL;
1923#ifdef TEUCHOS_DEBUG
1924 default:
1926#endif
1927 }
1928 return ModelEvaluatorBase::DERIV_MV_BY_COL; // Should never execute this!
1929}
1930
1931
1932#endif // THYRA_MODEL_EVALUATOR_BASE_DECL_HPP
const RCP< T > & assert_not_null() const
T * get() const
RCP< T > & operator=(const RCP< T > &r_ptr)
Base class for all linear operators.
Base class for all linear operators that can support a high-level solve operation.
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
DerivativeMultiVector(const RCP< MultiVectorBase< Scalar > > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
void changeOrientation(const EDerivativeMultiVectorOrientation orientation)
const DerivativeMultiVector< Scalar > & assert_not_null() const
EDerivativeMultiVectorOrientation getOrientation() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Determines the forms of a general derivative that are supported.
bool supports(EDerivativeMultiVectorOrientation mvOrientation) const
bool isSameSupport(const DerivativeSupport &derivSupport) const
DerivativeSupport(EDerivativeMultiVectorOrientation mvOrientation)
DerivativeSupport & plus(EDerivativeMultiVectorOrientation mvOrientation)
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
DerivativeMultiVector< Scalar > getDerivativeMultiVector() const
RCP< MultiVectorBase< Scalar > > getMultiVector() const
Derivative(const DerivativeMultiVector< Scalar > &dmv)
Derivative(const RCP< MultiVectorBase< Scalar > > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
const Derivative< Scalar > & assert_not_null() const
bool isSupportedBy(const DerivativeSupport &derivSupport) const
Returns true if the form of the derivative contained here is supported by deriveSupport.
Derivative(const RCP< LinearOpBase< Scalar > > &lo)
RCP< LinearOpBase< Scalar > > getLinearOp() const
EDerivativeMultiVectorOrientation getMultiVectorOrientation() const
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Type to embed evaluation accuracy with an RCP-managed object.
void reset(const RCP< ObjType > &obj, EEvalType evalType)
Evaluation(const RCP< ObjType > &obj, EEvalType evalType)
Evaluation(const RCP< ObjType > &obj)
Implicit conversion from RCP<ObjType>.
Protected subclass of InArgs that only ModelEvaluator subclasses can access to set up the selection o...
void setModelEvalDescription(const std::string &modelEvalDescription)
void setSupports(EInArgsMembers arg, bool supports=true)
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object.
void set_stage_number(Scalar stage_number)
Precondition: supports(IN_ARG_stage_number)==true.
Scalar get_W_x_dot_dot_coeff() const
Precondition: supports(IN_ARG_W_x_dot_dot_coeff)==true.
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng >= 0).
Scalar get_alpha() const
Precondition: supports(IN_ARG_alpha)==true.
RCP< const VectorBase< Scalar > > get_f_multiplier() const
Precondition: supports(IN_ARG_x)==true.
RCP< const MultiVectorBase< Scalar > > get_x_direction() const
Precondition: supports(IN_ARG_x)==true.
RCP< const VectorBase< Scalar > > get_p(int l) const
Get p(l) where 0 <= l && l < this->Np().
void set_W_x_dot_dot_coeff(Scalar W_x_dot_dot_coeff)
Precondition: supports(IN_ARG_W_x_dot_dot_coeff)==true.
void setArgs(const InArgs< Scalar > &inArgs, bool ignoreUnsupported=false, bool cloneObjects=false)
Set non-null arguments (does not overwrite non-NULLs with NULLs) .
void set_x_mp(const RCP< const Stokhos::ProductEpetraVector > &x_mp)
Precondition: supports(IN_ARG_x_mp)==true.
void set_p_direction(int l, const RCP< const MultiVectorBase< Scalar > > &p_direction_l)
Precondition: supports(IN_ARG_x)==true.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Create a more detailed description along about this object and the ModelEvaluator that created it.
RCP< const Stokhos::ProductEpetraVector > get_x_mp() const
Precondition: supports(IN_ARG_x_mp)==true.
RCP< const MultiVectorBase< Scalar > > get_p_direction(int l) const
Get p(l) where 0 <= l && l < this->Np().
void set_x_dot_mp(const RCP< const Stokhos::ProductEpetraVector > &x_dot_mp)
Precondition: supports(IN_ARG_x_dot_mp)==true.
void set_f_multiplier(const RCP< const VectorBase< Scalar > > &f_multiplier)
Precondition: supports(IN_ARG_x)==true.
void assertSameSupport(const InArgs< Scalar > &inArgs) const
Assert that two InArgs objects have the same support.
void set_x(const RCP< const VectorBase< Scalar > > &x)
Precondition: supports(IN_ARG_x)==true.
Scalar get_beta() const
Precondition: supports(IN_ARG_beta)==true.
void set_beta(Scalar beta)
Precondition: supports(IN_ARG_beta)==true.
void set(const RCP< const ObjectType > &uo)
Set an extended input object of type ObjectType in the InArgs. Precondition: supports()==true.
void set_step_size(Scalar step_size)
Precondition: supports(IN_ARG_step_size)==true.
void set_x_direction(const RCP< const MultiVectorBase< Scalar > > &x_direction)
Precondition: supports(IN_ARG_x)==true.
RCP< const VectorBase< Scalar > > get_x() const
Precondition: supports(IN_ARG_x)==true.
bool supports() const
Determines if an extended input argument of type ObjectType is supported.
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
.
RCP< const ObjectType > get() const
Get an extended input object of type ObjectType>/tt> from the InArgs. Precondition: supports()==true.
ScalarMag get_t() const
.Precondition: supports(IN_ARG_t)==true
void set_x_dot(const RCP< const VectorBase< Scalar > > &x_dot)
Precondition: supports(IN_ARG_x_dot)==true.
Scalar get_stage_number() const
Precondition: supports(IN_ARG_stage_number)==true.
RCP< const VectorBase< Scalar > > get_g_multiplier(int j) const
Precondition: supports(IN_ARG_x)==true.
void set_alpha(Scalar alpha)
Precondition: supports(IN_ARG_alpha)==true.
void set_t(ScalarMag t)
Precondition: supports(IN_ARG_t)==true.
RCP< const VectorBase< Scalar > > get_x_dot() const
Precondition: supports(IN_ARG_x_dot)==true.
bool supports(EInArgsMembers arg) const
Determines if an input argument is supported or not.
void set_g_multiplier(int j, const RCP< const VectorBase< Scalar > > &g_multiplier)
Precondition: supports(IN_ARG_x)==true.
void set_x_dot_dot(const RCP< const VectorBase< Scalar > > &x_dot_dot)
Precondition: supports(IN_ARG_x_dot_dot)==true.
void _setSupports(EInArgsMembers arg, bool supports)
Scalar get_step_size() const
Precondition: supports(IN_ARG_step_size)==true.
void _setModelEvalDescription(const std::string &modelEvalDescription)
RCP< const Stokhos::ProductEpetraVector > get_x_dot_mp() const
Precondition: supports(IN_ARG_x_dotmp)==true.
int Np() const
Return the number of parameter subvectors p(l) supported (Np >= 0).
RCP< const VectorBase< Scalar > > get_x_dot_dot() const
Precondition: supports(IN_ARG_x_dot_dot)==true.
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
RCP< Stokhos::ProductEpetraMultiVector > getMultiVector() const
void describe(Teuchos::FancyOStream &, const Teuchos::EVerbosityLevel) const
void changeOrientation(const EDerivativeMultiVectorOrientation orientation)
MPDerivativeMultiVector(const RCP< Stokhos::ProductEpetraMultiVector > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL, const Teuchos::Array< int > &paramIndexes=Teuchos::Array< int >())
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
MPDerivativeMultiVector getDerivativeMultiVector() const
RCP< Stokhos::ProductEpetraMultiVector > getMultiVector() const
MPDerivative(const RCP< Stokhos::ProductEpetraMultiVector > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
MPDerivative(const RCP< Stokhos::ProductEpetraOperator > &lo)
MPDerivative(const MPDerivativeMultiVector &dmv)
bool isSupportedBy(const DerivativeSupport &derivSupport) const
Returns true if the form of the derivative contained here is supported by deriveSupport.
EDerivativeMultiVectorOrientation getMultiVectorOrientation() const
RCP< Stokhos::ProductEpetraOperator > getLinearOp() const
void describe(Teuchos::FancyOStream &, const Teuchos::EVerbosityLevel) const
Protected subclass of OutArgs that only ModelEvaluator subclasses can access to set up the selection ...
void setSupports(EOutArgsMembers arg, bool supports=true)
void set_DgDx_dot_properties(int j, const DerivativeProperties &properties)
void set_DfDp_properties(int l, const DerivativeProperties &properties)
void set_W_properties(const DerivativeProperties &properties)
void set_DgDx_properties(int j, const DerivativeProperties &properties)
void set_DgDp_properties(int j, int l, const DerivativeProperties &properties)
void setModelEvalDescription(const std::string &modelEvalDescription)
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object.
void _set_DfDp_properties(int l, const DerivativeProperties &properties)
Derivative< Scalar > get_DfDp(int l) const
Precondition: supports(OUT_ARG_DfDp,l)==true.
void _setSupports(EOutArgsMembers arg, bool supports)
void _set_DgDx_dot_properties(int j, const DerivativeProperties &properties)
void set(const RCP< const ObjectType > &uo)
Set an extended output argument of type ObjectType in OutArgs. Precondition: supports()==true.
RCP< LinearOpWithSolveBase< Scalar > > get_W() const
Precondition: supports(OUT_ARG_W)==true.
DerivativeProperties get_DfDp_properties(int l) const
Return the know properties of DfDp(l) (precondition: supports(OUT_ARG_DfDp,l)==true).
int Ng() const
Return the number of axillary response functions g(j)(...) supported (Ng >= 0).
void set_f_mp(const RCP< Stokhos::ProductEpetraVector > &f_mp)
Precondition: supports(OUT_ARG_f_mp)==true.
void set_f(const Evaluation< VectorBase< Scalar > > &f)
Precondition: supports(OUT_ARG_f)==true.
void _set_DgDx_properties(int j, const DerivativeProperties &properties)
bool supports() const
Determines if an extended output argument of type ObjectType is supported.
Derivative< Scalar > get_DgDp(int j, int l) const
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
void assertSameSupport(const OutArgs< Scalar > &outArgs) const
Assert that two OutArgs objects have the same support.
Evaluation< VectorBase< Scalar > > get_f() const
Precondition: supports(OUT_ARG_f)==true.
void set_W(const RCP< LinearOpWithSolveBase< Scalar > > &W)
Precondition: supports(OUT_ARG_W)==true.
void set_DfDp(int l, const Derivative< Scalar > &DfDp_l)
Precondition: supports(OUT_ARG_DfDp,l)==true.
DerivativeProperties get_W_properties() const
Return the known properties of W (precondition: supports(OUT_ARG_f)==true).
void set_W_prec(const RCP< PreconditionerBase< Scalar > > &W_prec)
Precondition: supports(OUT_ARG_W_op)==true.
RCP< Stokhos::ProductEpetraOperator > get_W_mp() const
Precondition: supports(OUT_ARG_W_mp)==true.
void set_W_mp(const RCP< Stokhos::ProductEpetraOperator > &W_mp)
Precondition: supports(OUT_ARG_W_mp)==true.
void _set_DgDp_properties(int j, int l, const DerivativeProperties &properties)
RCP< LinearOpBase< Scalar > > get_W_op() const
Precondition: supports(OUT_ARG_W_op)==true.
void set_DgDx(int j, const Derivative< Scalar > &DgDx_j)
Precondition: supports(OUT_ARG_DgDx,j)==true.
void set_DgDx_dot(int j, const Derivative< Scalar > &DgDx_dot_j)
Precondition: supports(OUT_ARG_DgDx_dot,j)==true.
DerivativeProperties get_DgDx_dot_properties(int j) const
Return the know properties of DgDx_dot(j) (precondition: supports(OUT_ARG_DgDx_dot,...
Derivative< Scalar > get_DgDx_dot(int j) const
Precondition: supports(OUT_ARG_DgDx_dot,j)==true.
DerivativeProperties get_DgDx_properties(int j) const
Return the know properties of DgDx(j) (precondition: supports(OUT_ARG_DgDx,j)==true).
Derivative< Scalar > get_DgDx(int j) const
Precondition: supports(OUT_ARG_DgDx,j)==true.
void set_W_op(const RCP< LinearOpBase< Scalar > > &W_op)
Precondition: supports(OUT_ARG_W_op)==true.
DerivativeProperties get_DgDp_properties(int j, int l) const
Return the know properties of DgDp(j,l) (precondition: supports(OUT_ARG_DgDp,j,l)==true).
bool supports(EOutArgsMembers arg) const
Determine if an input argument is supported or not.
RCP< PreconditionerBase< Scalar > > get_W_prec() const
Precondition: supports(OUT_ARG_W_op)==true.
RCP< Stokhos::ProductEpetraVector > get_g_mp(int j) const
Precondition: supports(OUT_ARG_g_mp)==true..
void set_DgDp(int j, int l, const Derivative< Scalar > &DgDp_j_l)
Precondition: supports(OUT_ARG_DgDp,j,l)==true.
int Np() const
Return the number of parameter subvectors p(l) supported (Np >= 0).
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Create a more detailed description along about this object and the ModelEvaluator that created it.
void _setModelEvalDescription(const std::string &modelEvalDescription)
void _set_W_properties(const DerivativeProperties &properties)
void setFailed() const
Set that the evaluation as a whole failed.
RCP< Stokhos::ProductEpetraVector > get_f_mp() const
Precondition: supports(OUT_ARG_f_mp)==true.
void set_g(int j, const Evaluation< VectorBase< Scalar > > &g_j)
Precondition: supports(OUT_ARG_g)==true.
RCP< const ObjectType > get() const
Get an extended output argument of type ObjectType from OutArgs. Precondition: supports()==true.
void set_g_mp(int j, const RCP< Stokhos::ProductEpetraVector > &g_mp_j)
Precondition: supports(OUT_ARG_g_mp)==true.
bool isFailed() const
Return if the evaluation failed or not.
Evaluation< VectorBase< Scalar > > get_g(int j) const
Precondition: supports(OUT_ARG_g)==true..
Base subclass for ModelEvaluator that defines some basic types.
@ DERIV_MV_GRADIENT_FORM
Gradient form DhDz^T (nh columns of z_space vectors)
@ DERIV_MV_JACOBIAN_FORM
Jacobian form DhDz (nz columns of h_space vectors)
@ EVAL_TYPE_APPROX_DERIV
Do an exact evaluation (default)
@ EVAL_TYPE_VERY_APPROX_DERIV
An approx. eval. for a F.D. deriv.
Interface for a collection of column vectors called a multi-vector.
Simple interface class to access a precreated preconditioner as one or more linear operators objects ...
Abstract interface for finite-dimensional dense vectors.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
Simple public strict containing properties of a derivative object.
DerivativeProperties(EDerivativeLinearity in_linearity, ERankStatus in_rank, bool in_supportsAdjoint)