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_SFAD_HPP
00055 #define SACADO_FAD_SFAD_HPP
00056
00057 #include "Sacado_Fad_SFadTraits.hpp"
00058 #include "Sacado_Fad_Expression.hpp"
00059 #include "Sacado_StaticArrayTraits.hpp"
00060
00061 namespace Sacado {
00062
00064 namespace Fad {
00065
00067 template <typename T, int Num>
00068 struct SFadExprTag {};
00069
00077 template <typename T, int Num>
00078 class Expr< SFadExprTag<T,Num> > {
00079
00080 public:
00081
00083 typedef T value_type;
00084
00089
00091 Expr() : val_( T(0.)) { ss_array<T>::zero(dx_, Num); }
00092
00094
00097 Expr(const T & x) : val_(x) { ss_array<T>::zero(dx_, Num); }
00098
00100
00103 Expr(const int sz, const T & x);
00104
00106
00111 Expr(const int sz, const int i, const T & x);
00112
00114 Expr(const Expr& x) : val_(x.val_) {
00115 ss_array<T>::copy(x.dx_, dx_, Num); }
00116
00118 template <typename S> Expr(const Expr<S>& x);
00119
00121 ~Expr() {}
00122
00124
00130 void diff(const int ith, const int n);
00131
00133
00137 void resize(int sz);
00138
00140 void zero() { ss_array<T>::zero(dx_, Num); }
00141
00143
00148
00150 const T& val() const { return val_;}
00151
00153 T& val() { return val_;}
00154
00156
00161
00163 int size() const { return Num;}
00164
00166 bool hasFastAccess() const { return true; }
00167
00169 bool isPassive() const { return false; }
00170
00172 void setIsConstant(bool is_const) {}
00173
00175 const T* dx() const { return &(dx_[0]);}
00176
00178 T dx(int i) const { return dx_[i]; }
00179
00181 T& fastAccessDx(int i) { return dx_[i];}
00182
00184 T fastAccessDx(int i) const { return dx_[i];}
00185
00187
00192
00194 Expr< SFadExprTag<T,Num> >& operator=(const T& val);
00195
00197 Expr< SFadExprTag<T,Num> >&
00198 operator=(const Expr< SFadExprTag<T,Num> >& x);
00199
00201 template <typename S>
00202 Expr< SFadExprTag<T,Num> >& operator=(const Expr<S>& x);
00203
00205
00210
00212 Expr< SFadExprTag<T,Num> >& operator += (const T& x);
00213
00215 Expr< SFadExprTag<T,Num> >& operator -= (const T& x);
00216
00218 Expr< SFadExprTag<T,Num> >& operator *= (const T& x);
00219
00221 Expr< SFadExprTag<T,Num> >& operator /= (const T& x);
00222
00224 template <typename S>
00225 Expr< SFadExprTag<T,Num> >& operator += (const Expr<S>& x);
00226
00228 template <typename S>
00229 Expr< SFadExprTag<T,Num> >& operator -= (const Expr<S>& x);
00230
00232 template <typename S>
00233 Expr< SFadExprTag<T,Num> >& operator *= (const Expr<S>& x);
00234
00236 template <typename S>
00237 Expr< SFadExprTag<T,Num> >& operator /= (const Expr<S>& x);
00238
00240
00241 protected:
00242
00244 T val_;
00245
00247 T dx_[Num];
00248
00249 };
00250
00252
00268 template <typename ValueT, int Num,
00269 typename ScalarT = typename ScalarValueType<ValueT>::type >
00270 class SFad :
00271 public Expr< SFadExprTag<ValueT,Num > > {
00272
00273 public:
00274
00279
00281
00284 SFad() :
00285 Expr< SFadExprTag< ValueT,Num > >() {}
00286
00288
00291 SFad(const ValueT & x) :
00292 Expr< SFadExprTag< ValueT,Num > >(x) {}
00293
00295
00298 SFad(const ScalarT& x) :
00299 Expr< SFadExprTag< ValueT,Num > >(ValueT(x)) {}
00300
00302
00305 SFad(const int sz, const ValueT & x) :
00306 Expr< SFadExprTag< ValueT,Num > >(sz,x) {}
00307
00309
00314 SFad(const int sz, const int i, const ValueT & x) :
00315 Expr< SFadExprTag< ValueT,Num > >(sz,i,x) {}
00316
00318 SFad(const SFad& x) :
00319 Expr< SFadExprTag< ValueT,Num > >(x) {}
00320
00322 template <typename S> SFad(const Expr<S>& x) :
00323 Expr< SFadExprTag< ValueT,Num > >(x) {}
00324
00326
00328 ~SFad() {}
00329
00331 SFad& operator=(const ValueT& val) {
00332 Expr< SFadExprTag< ValueT,Num > >::operator=(val);
00333 return *this;
00334 }
00335
00337 SFad& operator=(const ScalarT& val) {
00338 Expr< SFadExprTag< ValueT,Num > >::operator=(ValueT(val));
00339 return *this;
00340 }
00341
00343 SFad& operator=(const SFad& x) {
00344 Expr< SFadExprTag< ValueT,Num > >::operator=(static_cast<const Expr< SFadExprTag< ValueT,Num > >&>(x));
00345 return *this;
00346 }
00347
00349 template <typename S> SFad& operator=(const Expr<S>& x)
00350 {
00351 Expr< SFadExprTag< ValueT,Num > >::operator=(x);
00352 return *this;
00353 }
00354
00355 };
00356
00358
00363 template <typename ValueT, int Num>
00364 class SFad<ValueT,Num,ValueT> :
00365 public Expr< SFadExprTag<ValueT,Num > >{
00366
00367 public:
00368
00373
00375
00378 SFad() : Expr< SFadExprTag< ValueT,Num > >() {}
00379
00381
00384 SFad(const ValueT & x) :
00385 Expr< SFadExprTag< ValueT,Num > >(x) {}
00386
00388
00391 SFad(const int sz, const ValueT & x) :
00392 Expr< SFadExprTag< ValueT,Num > >(sz,x) {}
00393
00395
00400 SFad(const int sz, const int i, const ValueT & x) :
00401 Expr< SFadExprTag< ValueT,Num > >(sz,i,x) {}
00402
00404 SFad(const SFad& x) :
00405 Expr< SFadExprTag< ValueT,Num > >(x) {}
00406
00408 template <typename S> SFad(const Expr<S>& x) :
00409 Expr< SFadExprTag< ValueT,Num > >(x) {}
00410
00412
00414 ~SFad() {}
00415
00417 SFad& operator=(const ValueT& val) {
00418 Expr< SFadExprTag< ValueT,Num > >::operator=(val);
00419 return *this;
00420 }
00421
00423 SFad& operator=(const SFad& x) {
00424 Expr< SFadExprTag< ValueT,Num > >::operator=(static_cast<const Expr< SFadExprTag< ValueT,Num > >&>(x));
00425 return *this;
00426 }
00427
00429 template <typename S> SFad& operator=(const Expr<S>& x)
00430 {
00431 Expr< SFadExprTag< ValueT,Num > >::operator=(x);
00432 return *this;
00433 }
00434
00435 };
00436
00437 }
00438
00439 }
00440
00441 #include "Sacado_Fad_SFadImp.hpp"
00442 #include "Sacado_Fad_Ops.hpp"
00443
00444 #endif // SACADO_FAD_SFAD_HPP