00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #ifndef SACADO_FAD_EXPRESSION_HPP
00055 #define SACADO_FAD_EXPRESSION_HPP
00056
00057 #include "Sacado_Traits.hpp"
00058
00059 namespace Sacado {
00060
00061 namespace Fad {
00062
00064
00068 template <typename ExprT>
00069 class Expr {
00070
00071 public:
00072
00074 typedef typename ExprT::value_type value_type;
00075
00077 explicit Expr(const ExprT& expr) : expr_(expr) {}
00078
00080 int size() const {return expr_.size();}
00081
00083 bool hasFastAccess() const { return expr_.hasFastAccess();}
00084
00086 bool isPassive() const { return expr_.isPassive();}
00087
00089 value_type val() const { return expr_.val();}
00090
00092 value_type dx(int i) const { return expr_.dx(i);}
00093
00095 value_type fastAccessDx(int i) const { return expr_.fastAccessDx(i);}
00096
00097 protected:
00098
00100 Expr() {}
00101
00103 ExprT expr_;
00104
00105 };
00106
00108
00111 template <typename ConstT>
00112 class ConstExpr {
00113
00114 public:
00115
00117 typedef ConstT value_type;
00118
00120 ConstExpr(const ConstT& constant) : constant_(constant) {}
00121
00123 int size() const { return 0; }
00124
00126 bool hasFastAccess() const { return true; }
00127
00129 bool isPassive() const { return true; }
00130
00132 value_type val() const { return constant_; }
00133
00135 value_type dx(int i) const { return value_type(0); }
00136
00138 value_type fastAccessDx(int i) const { return value_type(0); }
00139
00140 protected:
00141
00143 const ConstT& constant_;
00144
00145 };
00146
00148
00154 template <typename ExprT, template<typename> class Op>
00155 class UnaryExpr {
00156
00157 public:
00158
00160 typedef typename ExprT::value_type value_type;
00161 typedef Op<ExprT> OpT;
00162
00164 UnaryExpr(const ExprT& expr) : expr_(expr) {}
00165
00167 int size() const { return expr_.size(); }
00168
00170 bool hasFastAccess() const { return expr_.hasFastAccess(); }
00171
00173 bool isPassive() const { return expr_.isPassive();}
00174
00176 value_type val() const { return OpT::computeValue(expr_); }
00177
00179 value_type dx(int i) const { return OpT::computeDx(i,expr_); }
00180
00182 value_type fastAccessDx(int i) const {
00183 return OpT::computeFastAccessDx(i,expr_);
00184 }
00185
00186 protected:
00187
00189 const ExprT& expr_;
00190
00191 };
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 template <typename T> struct ExprConstRef {
00202 typedef const T& type;
00203 };
00204 template <typename T> struct ExprConstRef< ConstExpr<T> > {
00205 typedef const ConstExpr<T> type;
00206 };
00207
00209
00216 template <typename ExprT1, typename ExprT2,
00217 template<typename,typename> class Op>
00218 class BinaryExpr {
00219
00220 public:
00221
00223 typedef typename ExprT1::value_type value_type_1;
00224
00226 typedef typename ExprT2::value_type value_type_2;
00227
00229 typedef typename Sacado::Promote<value_type_1,
00230 value_type_2>::type value_type;
00231
00232 typedef Op<ExprT1,ExprT2> OpT;
00233
00235 BinaryExpr(const ExprT1& expr1, const ExprT2& expr2) :
00236 expr1_(expr1), expr2_(expr2) {}
00237
00239 int size() const {
00240 int sz1 = expr1_.size(), sz2 = expr2_.size();
00241 return sz1 > sz2 ? sz1 : sz2;
00242 }
00243
00245 bool hasFastAccess() const {
00246 return expr1_.hasFastAccess() && expr2_.hasFastAccess();}
00247
00249 bool isPassive() const {
00250 return expr1_.isPassive() && expr2_.isPassive();}
00251
00253 value_type val() const {
00254 return OpT::computeValue(expr1_,expr2_); }
00255
00257 value_type dx(int i) const {
00258 return OpT::computeDx(i,expr1_,expr2_); }
00259
00261 value_type fastAccessDx(int i) const {
00262 return OpT::computeFastAccessDx(i,expr1_,expr2_);
00263 }
00264
00265 protected:
00266
00268 typename ExprConstRef<ExprT1>::type expr1_;
00269
00271 typename ExprConstRef<ExprT2>::type expr2_;
00272
00273 };
00274
00275 }
00276
00277 }
00278
00279 #endif // SACADO_FAD_EXPRESSION_HPP