42 #ifndef THYRA_MODEL_EVALUATOR_BASE_DECL_HPP 43 #define THYRA_MODEL_EVALUATOR_BASE_DECL_HPP 46 #include "Thyra_LinearOpWithSolveBase.hpp" 47 #include "Teuchos_Describable.hpp" 48 #include "Teuchos_any.hpp" 49 #include "Teuchos_Assert.hpp" 51 #ifdef HAVE_THYRA_ME_POLYNOMIAL 52 # include "Teuchos_Polynomial.hpp" 56 class ProductEpetraVector;
57 class ProductEpetraMultiVector;
58 class ProductEpetraOperator;
104 ,IN_ARG_W_x_dot_dot_coeff
109 static const int NUM_E_IN_ARGS_MEMBERS=13;
158 template<
class Scalar>
184 template<
typename ObjectType>
185 bool supports()
const;
187 template<
typename ObjectType>
190 template<
typename ObjectType>
193 #ifdef HAVE_THYRA_ME_POLYNOMIAL 204 #endif // HAVE_THYRA_ME_POLYNOMIAL 228 void set_t( ScalarMag t );
230 ScalarMag get_t()
const;
232 void set_alpha( Scalar alpha );
234 Scalar get_alpha()
const;
236 void set_beta( Scalar beta );
238 Scalar get_beta()
const;
240 void set_W_x_dot_dot_coeff( Scalar W_x_dot_dot_coeff );
242 Scalar get_W_x_dot_dot_coeff()
const;
244 void set_step_size( Scalar step_size);
246 Scalar get_step_size()
const;
248 void set_stage_number( Scalar stage_number);
250 Scalar get_stage_number()
const;
255 bool cloneObjects =
false 260 std::string modelEvalDescription()
const;
262 std::string description()
const;
270 void _setModelEvalDescription(
const std::string &modelEvalDescription );
272 void _set_Np(
int Np);
276 void _setSupports(
EInArgs_p_mp arg,
int l,
bool supports );
278 void _setSupports(
const InArgs<Scalar>& inputInArgs,
const int Np );
280 template<
typename ObjectType>
281 void _setSupports(
const bool supports );
288 std::string modelEvalDescription_;
295 #ifdef HAVE_THYRA_ME_POLYNOMIAL 298 #endif // HAVE_THYRA_ME_POLYNOMIAL 303 Scalar W_x_dot_dot_coeff_;
305 Scalar stage_number_;
306 bool supports_[NUM_E_IN_ARGS_MEMBERS];
311 void assert_l(
int l)
const;
313 std::map<std::string,Teuchos::any> extended_inargs_;
320 EVAL_TYPE_VERY_APPROX_DERIV
329 template<
class ObjType>
334 : evalType_(EVAL_TYPE_EXACT) {}
339 :
RCP<ObjType>(obj), evalType_(EVAL_TYPE_EXACT) {}
342 :
RCP<ObjType>(obj), evalType_(evalType) {}
347 { this->operator=(obj); evalType_ = evalType; }
356 DERIV_MV_BY_COL = DERIV_MV_JACOBIAN_FORM,
357 DERIV_TRANS_MV_BY_ROW = DERIV_MV_GRADIENT_FORM
371 :supportsLinearOp_(false), supportsMVByCol_(false), supportsTransMVByRow_(false)
375 :supportsLinearOp_(true), supportsMVByCol_(false), supportsTransMVByRow_(false)
379 :supportsLinearOp_(false), supportsMVByCol_(mvOrientation==DERIV_MV_BY_COL)
380 ,supportsTransMVByRow_(mvOrientation==DERIV_TRANS_MV_BY_ROW)
384 { supportsLinearOp_ =
true;
return *
this; }
388 switch(mvOrientation) {
389 case DERIV_MV_BY_COL: supportsMVByCol_ =
true;
break;
390 case DERIV_TRANS_MV_BY_ROW: supportsTransMVByRow_ =
true;
break;
397 {
return ( !supportsLinearOp_ && !supportsMVByCol_ && !supportsTransMVByRow_ ); }
400 {
return supportsLinearOp_; }
404 switch(mvOrientation) {
405 case DERIV_MV_BY_COL:
return supportsMVByCol_;
406 case DERIV_TRANS_MV_BY_ROW:
return supportsTransMVByRow_;
415 supportsLinearOp_ == derivSupport.supportsLinearOp_
416 && supportsMVByCol_ == derivSupport.supportsMVByCol_
417 && supportsTransMVByRow_ == derivSupport.supportsTransMVByRow_
421 std::string description()
const;
423 bool supportsLinearOp_;
424 bool supportsMVByCol_;
425 bool supportsTransMVByRow_;
431 DERIV_LINEARITY_UNKNOWN
432 ,DERIV_LINEARITY_CONST
433 ,DERIV_LINEARITY_NONCONST
440 ,DERIV_RANK_DEFICIENT
454 :linearity(DERIV_LINEARITY_UNKNOWN),
455 rank(DERIV_RANK_UNKNOWN),supportsAdjoint(false)
460 bool in_supportsAdjoint
462 :linearity(in_linearity),rank(in_rank),
463 supportsAdjoint(in_supportsAdjoint)
470 template<
class Scalar>
475 :orientation_(DERIV_MV_BY_COL)
481 ) : mv_(mv.assert_not_null()), orientation_(orientation) {}
484 { orientation_ = orientation; };
487 { mv_.assert_not_null();
return *
this; }
493 {
return orientation_; }
495 std::string description()
const;
508 template<
class Scalar>
515 : lo_(lo.assert_not_null()) {}
520 ) : dmv_(mv,orientation) {}
526 {
return ( lo_.get()==NULL && dmv_.getMultiVector().get()==NULL ); }
529 { dmv_.assert_not_null(); lo_.assert_not_null();
return *
this; }
535 {
return dmv_.getMultiVector(); }
538 {
return dmv_.getOrientation(); }
548 if (derivSupport.
none())
550 if (!
is_null(getMultiVector())) {
551 return derivSupport.
supports(getMultiVectorOrientation());
553 else if(!
is_null(getLinearOp())) {
554 return derivSupport.
supports(DERIV_LINEAR_OP);
560 std::string description()
const;
577 :orientation_(DERIV_MV_BY_COL)
584 ) : mv_(mv.assert_not_null()), orientation_(orientation), paramIndexes_(paramIndexes) {}
587 { orientation_ = orientation; };
596 {
return orientation_; }
599 {
return paramIndexes_; }
621 : lo_(lo.assert_not_null()) {}
626 ) : dmv_(mv,orientation) {}
632 {
return ( lo_.get()==NULL && dmv_.getMultiVector().get()==NULL ); }
641 {
return dmv_.getMultiVector(); }
644 {
return dmv_.getOrientation(); }
654 if (derivSupport.
none())
656 if (!
is_null(getMultiVector())) {
657 return derivSupport.
supports(getMultiVectorOrientation());
659 else if(!
is_null(getLinearOp())) {
660 return derivSupport.
supports(DERIV_LINEAR_OP);
687 static const int NUM_E_OUT_ARGS_MEMBERS=7;
786 template<
class Scalar>
825 template<
typename ObjectType>
826 bool supports()
const;
828 template<
typename ObjectType>
831 template<
typename ObjectType>
895 void set_DgDx_dot_mp(
int j,
const MPDerivative &DgDx_dot_mp_j);
901 void set_DgDp_mp(
int j,
int l,
const MPDerivative &DgDp_mp_j_l );
905 #ifdef HAVE_THYRA_ME_POLYNOMIAL 910 #endif // HAVE_THYRA_ME_POLYNOMIAL 916 void setArgs(
const OutArgs<Scalar>& outArgs,
bool ignoreUnsupported =
false );
928 void setFailed()
const;
934 bool isFailed()
const;
936 bool isEmpty()
const;
940 std::string modelEvalDescription()
const;
942 std::string description()
const;
950 void _setModelEvalDescription(
const std::string &modelEvalDescription );
952 void _set_Np_Ng(
int Np,
int Ng);
956 template<
typename ObjectType>
957 void _setSupports(
const bool supports );
967 void _setSupports(
EOutArgs_g_mp arg,
int j,
bool supports );
1002 std::string modelEvalDescription_;
1003 bool supports_[NUM_E_OUT_ARGS_MEMBERS];
1004 supports_t supports_DfDp_;
1005 supports_t supports_DgDx_dot_;
1006 supports_t supports_DgDx_;
1007 supports_t supports_DgDp_;
1015 deriv_properties_t DfDp_properties_;
1018 deriv_properties_t DgDx_dot_properties_;
1019 deriv_properties_t DgDx_properties_;
1021 deriv_properties_t DgDp_properties_;
1024 supports_t supports_DfDp_mp_;
1025 supports_t supports_DgDx_dot_mp_;
1026 supports_t supports_DgDx_mp_;
1027 supports_t supports_DgDp_mp_;
1035 deriv_properties_t DfDp_mp_properties_;
1036 deriv_properties_t DgDx_dot_mp_properties_;
1037 deriv_properties_t DgDx_mp_properties_;
1038 deriv_properties_t DgDp_mp_properties_;
1040 #ifdef HAVE_THYRA_ME_POLYNOMIAL 1042 #endif // HAVE_THYRA_ME_POLYNOMIAL 1043 mutable bool isFailed_;
1045 std::map<std::string,Teuchos::any> extended_outargs_;
1049 void assert_supports(
1053 void assert_supports(
1057 void assert_supports(
1061 void assert_supports(
1067 void assert_supports(
1071 void assert_supports(
1075 void assert_supports(
1079 void assert_supports(
1084 void assert_l(
int l)
const;
1085 void assert_j(
int j)
const;
1091 #ifdef HAVE_PROTECTED_NESTED_TEMPLATE_CLASS_ACCESS 1105 template<
class Scalar>
1113 void setModelEvalDescription(
const std::string &modelEvalDescription );
1115 void set_Np(
int Np);
1119 void setSupports(
const InArgs<Scalar>& inputInArgs,
const int Np = -1 );
1121 template<
typename ObjectType>
1122 void setSupports(
const bool supports =
true);
1126 void setSupports(
EInArgs_p_mp arg,
int l,
bool supports);
1136 template<
class Scalar>
1144 void setModelEvalDescription(
const std::string &modelEvalDescription );
1146 void set_Np_Ng(
int Np,
int Ng);
1158 template<
typename ObjectType>
1159 void setSupports(
const bool supports =
true);
1225 getOtherDerivativeMultiVectorOrientation(
1237 template<
class Scalar>
1238 template<
typename ObjectType>
1241 std::map<std::string,Teuchos::any>::const_iterator search =
1242 extended_inargs_.find(
typeid(ObjectType).name());
1244 if (search == extended_inargs_.end())
1250 template<
class Scalar>
1251 template<
typename ObjectType>
1254 std::map<std::string,Teuchos::any>::iterator search = extended_inargs_.find(
typeid(ObjectType).name());
1257 "ERROR: InArgs::set<ObjectType>() was called with unsupported extended data type \"" 1258 <<
typeid(ObjectType).name() <<
"\"!");
1263 template<
class Scalar>
1264 template<
typename ObjectType>
1268 std::map<std::string,Teuchos::any>::const_iterator search = extended_inargs_.find(
typeid(ObjectType).name());
1271 "ERROR: InArgs::get<ObjectType>() was called with unsupported extended data type \"" 1272 <<
typeid(ObjectType).name() <<
"\"!");
1277 template<
class Scalar>
1278 template<
class ObjectType>
1282 this->
template _setSupports<ObjectType>(in_supports);
1285 template<
class Scalar>
1286 template<
class ObjectType>
1295 this->extended_inargs_[
typeid(ObjectType).name()] =
Teuchos::any();
1298 std::map<std::string,Teuchos::any>::iterator search =
1299 this->extended_inargs_.find(
typeid(ObjectType).name());
1301 if (search != this->extended_inargs_.end())
1302 this->extended_inargs_.erase(
typeid(ObjectType).name());
1307 template<
class Scalar>
1308 template<
typename ObjectType>
1311 std::map<std::string,Teuchos::any>::const_iterator search =
1312 extended_outargs_.find(
typeid(ObjectType).name());
1314 if (search == extended_outargs_.end())
1320 template<
class Scalar>
1321 template<
typename ObjectType>
1324 std::map<std::string,Teuchos::any>::iterator search = extended_outargs_.find(
typeid(ObjectType).name());
1327 "ERROR: OutArgs::set<ObjectType>() was called with unsupported extended data type \"" 1328 <<
typeid(ObjectType).name() <<
"\"!");
1333 template<
class Scalar>
1334 template<
typename ObjectType>
1338 std::map<std::string,Teuchos::any>::const_iterator search = extended_outargs_.find(
typeid(ObjectType).name());
1341 "ERROR: OutArgs::get<ObjectType>() was called with unsupported extended data type \"" 1342 <<
typeid(ObjectType).name() <<
"\"!");
1347 template<
class Scalar>
1348 template<
class ObjectType>
1352 this->
template _setSupports<ObjectType>(in_supports);
1355 template<
class Scalar>
1356 template<
class ObjectType>
1365 this->extended_outargs_[
typeid(ObjectType).name()] =
Teuchos::any();
1368 std::map<std::string,Teuchos::any>::iterator search =
1369 this->extended_outargs_.find(
typeid(ObjectType).name());
1371 if (search != this->extended_outargs_.end())
1372 this->extended_outargs_.erase(
typeid(ObjectType).name());
1385 case ModelEvaluatorBase::IN_ARG_x_dot_dot:
1386 return "IN_ARG_x_dot_dot";
1387 case ModelEvaluatorBase::IN_ARG_x_dot:
1388 return "IN_ARG_x_dot";
1389 case ModelEvaluatorBase::IN_ARG_x:
1391 case ModelEvaluatorBase::IN_ARG_x_dot_poly:
1392 return "IN_ARG_x_dot_poly";
1393 case ModelEvaluatorBase::IN_ARG_x_poly:
1394 return "IN_ARG_x_poly";
1395 case ModelEvaluatorBase::IN_ARG_x_dot_mp:
1396 return "IN_ARG_x_dot_mp";
1397 case ModelEvaluatorBase::IN_ARG_x_mp:
1398 return "IN_ARG_x_mp";
1399 case ModelEvaluatorBase::IN_ARG_t:
1401 case ModelEvaluatorBase::IN_ARG_alpha:
1402 return "IN_ARG_alpha";
1403 case ModelEvaluatorBase::IN_ARG_beta:
1404 return "IN_ARG_beta";
1405 case ModelEvaluatorBase::IN_ARG_W_x_dot_dot_coeff:
1406 return "IN_ARG_W_x_dot_dot_coeff";
1407 case ModelEvaluatorBase::IN_ARG_step_size:
1408 return "IN_ARG_step_size";
1409 case ModelEvaluatorBase::IN_ARG_stage_number:
1410 return "IN_ARG_stage_number";
1411 #ifdef TEUCHOS_DEBUG 1424 case ModelEvaluatorBase::OUT_ARG_f:
1426 case ModelEvaluatorBase::OUT_ARG_W:
1428 case ModelEvaluatorBase::OUT_ARG_f_mp:
1429 return "OUT_ARG_f_mp";
1430 case ModelEvaluatorBase::OUT_ARG_W_mp:
1431 return "OUT_ARG_W_mp";
1432 case ModelEvaluatorBase::OUT_ARG_W_op:
1433 return "OUT_ARG_W_op";
1434 case ModelEvaluatorBase::OUT_ARG_W_prec:
1435 return "OUT_ARG_W_prec";
1436 case ModelEvaluatorBase::OUT_ARG_f_poly:
1437 return "OUT_ARG_f_poly";
1438 #ifdef TEUCHOS_DEBUG 1452 switch(orientation) {
1453 case ModelEvaluatorBase::DERIV_MV_BY_COL:
1454 return "DERIV_MV_BY_COL";
1455 case ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW:
1456 return "DERIV_TRANS_MV_BY_ROW";
1457 #ifdef TEUCHOS_DEBUG 1468 Thyra::getOtherDerivativeMultiVectorOrientation(
1472 switch(orientation) {
1473 case ModelEvaluatorBase::DERIV_MV_BY_COL:
1474 return ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW;
1475 case ModelEvaluatorBase::DERIV_TRANS_MV_BY_ROW:
1476 return ModelEvaluatorBase::DERIV_MV_BY_COL;
1477 #ifdef TEUCHOS_DEBUG 1482 return ModelEvaluatorBase::DERIV_MV_BY_COL;
1486 #endif // THYRA_MODEL_EVALUATOR_BASE_DECL_HPP Protected subclass of InArgs that only ModelEvaluator subclasses can access to set up the selection o...
RCP< const ObjectType > get() const
Get an extended input object of type ObjectType>/tt> from the InArgs. Precondition: supports()==true...
bool isSupportedBy(const DerivativeSupport &derivSupport) const
Returns true if the form of the derivative contained here is supported by deriveSupport.
MPDerivative(const RCP< Stokhos::ProductEpetraOperator > &lo)
Base class for all linear operators that can support a high-level solve operation.
bool is_null(const boost::shared_ptr< T > &p)
bool isSupportedBy(const DerivativeSupport &derivSupport) const
Returns true if the form of the derivative contained here is supported by deriveSupport.
Concrete aggregate class for all output arguments computable by a ModelEvaluator subclass object...
EDerivativeMultiVectorOrientation
MPDerivative(const RCP< Stokhos::ProductEpetraMultiVector > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void set(const RCP< const ObjectType > &uo)
Set an extended output argument of type ObjectType in OutArgs. Precondition: supports()==true.
RCP< LinearOpBase< Scalar > > getLinearOp() const
void changeOrientation(const EDerivativeMultiVectorOrientation orientation)
MPDerivativeMultiVector()
bool supports() const
Determines if an extended output argument of type ObjectType is supported.
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
void set(const RCP< const ObjectType > &uo)
Set an extended input object of type ObjectType in the InArgs. Precondition: supports()==true.
DerivativeMultiVector(const RCP< MultiVectorBase< Scalar > > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
Jacobian form DhDz (nz columns of h_space vectors)
bool supports(EDerivativeMultiVectorOrientation mvOrientation) const
EDerivativeLinearity linearity
Do an exact evaluation (default)
void _setSupports(EOutArgsMembers arg, bool supports)
MPDerivative(const MPDerivativeMultiVector &dmv)
MPDerivativeMultiVector getDerivativeMultiVector() const
Derivative(const RCP< MultiVectorBase< Scalar > > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL)
Evaluation(const RCP< ObjType > &obj)
Implicit conversion from RCP<ObjType>.
Simple interface class to access a precreated preconditioner as one or more linear operators objects ...
EDerivativeMultiVectorOrientation getMultiVectorOrientation() const
DerivativeSupport & plus(EDerivativeMultiVectorOrientation mvOrientation)
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
std::string description() const
void changeOrientation(const EDerivativeMultiVectorOrientation orientation)
Gradient form DhDz^T (nh columns of z_space vectors)
Evaluation(const RCP< ObjType > &obj, EEvalType evalType)
void setSupports(EInArgsMembers arg, bool supports=true)
RCP< Stokhos::ProductEpetraOperator > getLinearOp() const
EEvalType getType() const
Simple aggregate class for a derivative object represented as a column-wise multi-vector or its trans...
Interface for a collection of column vectors called a multi-vector.
RCP< MultiVectorBase< Scalar > > getMultiVector() const
Teuchos::ScalarTraits< Scalar >::magnitudeType ScalarMag
RCP< const ObjectType > get() const
Get an extended output argument of type ObjectType from OutArgs. Precondition: supports()==true.
DerivativeSupport(EDerivativeMultiVectorOrientation mvOrientation)
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Derivative(const DerivativeMultiVector< Scalar > &dmv)
const MPDerivativeMultiVector & assert_not_null() const
Abstract interface for finite-dimensional dense vectors.
TEUCHOSCORE_LIB_DLL_EXPORT std::string toString(const EVerbosityLevel verbLevel)
Simple public strict containing properties of a derivative object.
void _setSupports(EInArgsMembers arg, bool supports)
EEvalType
The type of an evaluation.
Base class for all linear operators.
DerivativeSupport(EDerivativeLinearOp)
Derivative(const RCP< LinearOpBase< Scalar > > &lo)
DerivativeProperties(EDerivativeLinearity in_linearity, ERankStatus in_rank, bool in_supportsAdjoint)
Base subclass for ModelEvaluator that defines some basic types.
void setSupports(EOutArgsMembers arg, bool supports=true)
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
const Derivative< Scalar > & assert_not_null() const
RCP< Stokhos::ProductEpetraMultiVector > getMultiVector() const
const MPDerivative & assert_not_null() const
RCP< MultiVectorBase< Scalar > > getMultiVector() const
EDerivativeMultiVectorOrientation getOrientation() const
Determines the forms of a general derivative that are supported.
EDerivativeMultiVectorOrientation getOrientation() const
DerivativeSupport & plus(EDerivativeLinearOp)
bool supports(EDerivativeLinearOp) const
DerivativeMultiVector< Scalar > getDerivativeMultiVector() const
Type to embed evaluation accuracy with an RCP-managed object.
Simple aggregate class that stores a derivative object as a general linear operator or as a multi-vec...
RCP< Stokhos::ProductEpetraMultiVector > getMultiVector() const
MPDerivativeMultiVector(const RCP< Stokhos::ProductEpetraMultiVector > &mv, const EDerivativeMultiVectorOrientation orientation=DERIV_MV_BY_COL, const Teuchos::Array< int > ¶mIndexes=Teuchos::Array< int >())
EDerivativeMultiVectorOrientation getMultiVectorOrientation() const
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Protected subclass of OutArgs that only ModelEvaluator subclasses can access to set up the selection ...
const Teuchos::Array< int > & getParamIndexes() const
bool supports() const
Determines if an extended input argument of type ObjectType is supported.
const DerivativeMultiVector< Scalar > & assert_not_null() const
Evaluation(Teuchos::ENull)
bool isSameSupport(const DerivativeSupport &derivSupport) const
void reset(const RCP< ObjType > &obj, EEvalType evalType)
Concrete aggregate class for all input arguments computable by a ModelEvaluator subclass object...
std::string description() const