49 #ifndef SACADO_TRAITS_HPP 50 #define SACADO_TRAITS_HPP 60 #ifdef HAVE_SACADO_COMPLEX 78 static const bool value =
false;
84 static const bool value =
false;
94 template <
typename T,
unsigned,
unsigned>
struct ViewFadType {};
98 static const bool value =
false;
106 template <
typename A,
typename B,
typename Enabled =
void>
struct Promote {};
109 template <
typename A>
111 typename mpl::enable_if_c< !OverrideDefaultPromote<A>::value >
::type > {
116 template <
typename A,
typename B>
118 typename mpl::enable_if_c< mpl::is_convertible<A,B>::value &&
119 !mpl::is_convertible<B,A>::value &&
120 !OverrideDefaultPromote<A>::value &&
121 !OverrideDefaultPromote<B>::value
127 template <
typename A,
typename B>
129 typename mpl::enable_if_c< mpl::is_convertible<B,A>::value &&
130 !mpl::is_convertible<A,B>::value &&
131 !OverrideDefaultPromote<A>::value &&
132 !OverrideDefaultPromote<B>::value
141 template <
typename A,
typename B>
143 typename mpl::enable_if_c< mpl::is_convertible<A,B>::value &&
144 mpl::is_convertible<B,A>::value &&
145 !mpl::is_same<A,B>::value &&
146 ( IsExpr<A>::value ||
147 IsExpr<B>::value ) >
::type >
159 template <
typename A,
typename B>
161 typename mpl::enable_if_c< !mpl::is_convertible<A,B>::value &&
162 !mpl::is_convertible<B,A>::value &&
164 mpl::is_convertible< B, typename BaseExprType< typename A::value_type >::type >::value
175 template <
typename A,
typename B>
177 typename mpl::enable_if_c< !mpl::is_convertible<A,B>::value &&
178 !mpl::is_convertible<B,A>::value &&
180 mpl::is_convertible< A, typename BaseExprType< typename B::value_type >::type >::value
191 template <
typename A,
typename B>
193 typename mpl::enable_if_c< !mpl::is_convertible<A,B>::value &&
194 !mpl::is_convertible<B,A>::value &&
197 mpl::is_same< typename BaseExprType< typename A::value_type >::type,
198 typename BaseExprType< typename B::value_type >::type >::value
207 #define SACADO_PROMOTE_SPECIALIZATION(type1,type2,type3) \ 208 template <> struct Promote< type1, type2, void > { \ 209 typedef type3 type; \ 211 template <> struct Promote< type2, type1, void > { \ 212 typedef type3 type; \ 220 #ifdef HAVE_SACADO_COMPLEX 229 #endif // HAVE_SACADO_COMPLEX 231 #undef SACADO_PROMOTE_SPECIALIZATION 235 #define SACADO_AD_PROMOTE_SPEC(NS, AD) 237 #define SACADO_AD_PROMOTE_SPEC2(NS, AD) 239 #define SACADO_FAD_PROMOTE_SPEC(NS, FAD) 241 #define SACADO_SFAD_PROMOTE_SPEC(NS, FAD) 243 #define SACADO_EXPR_PROMOTE_SPEC(NS) 245 #define SACADO_VFAD_PROMOTE_SPEC(NS) 247 #define SACADO_RAD_PROMOTE_SPEC(NS) \ 249 template <typename> class ADvar; \ 250 template <typename> class ADvari; \ 252 template <typename T> \ 253 struct OverrideDefaultPromote< NS :: ADvari <T>& > { \ 254 static const bool value = true; \ 256 template <typename T> \ 257 struct Promote< NS :: ADvar <T>, \ 258 NS :: ADvari <T>& > { \ 259 typedef NS :: ADvar <T> type; \ 261 template <typename T> \ 262 struct Promote< NS :: ADvari <T>&, \ 263 NS :: ADvar <T> > { \ 264 typedef NS :: ADvar <T> type; \ 266 template <typename T> \ 267 struct Promote< NS :: ADvari <T>&, \ 268 typename NS :: ADvari <T>::value_type > { \ 269 typedef NS :: ADvar <T> type; \ 271 template <typename T> \ 272 struct Promote< typename NS :: ADvari <T>::value_type, \ 273 NS :: ADvari <T>& > { \ 274 typedef NS :: ADvar <T> type; \ 276 template <typename T> \ 277 struct Promote< NS :: ADvari <T>&, \ 278 typename dummy< typename NS :: ADvari <T>::value_type, \ 279 typename NS :: ADvari <T>::scalar_type \ 281 typedef NS :: ADvar <T> type; \ 283 template <typename T> \ 284 struct Promote< typename dummy< typename NS :: ADvari <T>::value_type, \ 285 typename NS :: ADvari <T>::scalar_type \ 287 NS :: ADvari <T>& > { \ 288 typedef NS :: ADvar <T> type; \ 354 template <
typename T>
struct Value {
356 static const T&
eval(
const T& x) {
return x; }
366 static const T&
eval(
const T& x) {
return x; }
377 static std::string
eval() {
return ""; }
383 static bool eval(
const T& x,
const T& y) {
return x == y; }
405 template <
typename T>
struct IsFad {
410 template <
typename T>
416 template <
typename T>
422 #define SACADO_BUILTIN_SPECIALIZATION(t,NAME) \ 423 template <> struct ScalarType< t > { \ 426 template <> struct ValueType< t > { \ 429 template <> struct IsADType< t > { \ 430 static const bool value = false; \ 432 template <> struct IsScalarType< t > { \ 433 static const bool value = true; \ 435 template <> struct Value< t > { \ 436 KOKKOS_INLINE_FUNCTION \ 437 static const t& eval(const t& x) { return x; } \ 439 template <> struct ScalarValue< t > { \ 440 KOKKOS_INLINE_FUNCTION \ 441 static const t& eval(const t& x) { return x; } \ 443 template <> struct StringName< t > { \ 444 static std::string eval() { return NAME; } \ 446 template <> struct IsEqual< t > { \ 447 KOKKOS_INLINE_FUNCTION \ 448 static bool eval(const t& x, const t& y) { \ 451 template <> struct IsStaticallySized< t > { \ 452 static const bool value = true; \ 455 #define SACADO_BUILTIN_SPECIALIZATION_COMPLEX(t,NAME) \ 456 template <> struct ScalarType< t > { \ 459 template <> struct ValueType< t > { \ 462 template <> struct IsADType< t > { \ 463 static const bool value = false; \ 465 template <> struct IsScalarType< t > { \ 466 static const bool value = true; \ 468 template <> struct Value< t > { \ 469 static const t& eval(const t& x) { return x; } \ 471 template <> struct ScalarValue< t > { \ 472 static const t& eval(const t& x) { return x; } \ 474 template <> struct StringName< t > { \ 475 static std::string eval() { return NAME; } \ 477 template <> struct IsEqual< t > { \ 478 static bool eval(const t& x, const t& y) { \ 481 template <> struct IsStaticallySized< t > { \ 482 static const bool value = true; \ 493 #ifdef HAVE_SACADO_COMPLEX 498 #undef SACADO_BUILTIN_SPECIALIZATION 499 #undef SACADO_BUILTIN_SPECIALIZATION_COMPLEX 501 template<
typename T , T v ,
bool NonZero = ( v != T(0) ) >
516 template<
typename T , T zero >
531 #endif // SACADO_TRAITS_HPP KOKKOS_INLINE_FUNCTION integral_nonzero()
Base template specification for marking constants.
static std::string eval()
#define SACADO_PROMOTE_SPECIALIZATION(type1, type2, type3)
Specialization of Promote to builtin types.
KOKKOS_INLINE_FUNCTION integral_nonzero & operator=(const integral_nonzero &v)
KOKKOS_INLINE_FUNCTION integral_nonzero()
Base template specification for ScalarValue.
Base template specification for ScalarType.
static KOKKOS_INLINE_FUNCTION bool eval(const T &x, const T &y)
Base template specification for whether a type is a Fad type.
Base template specification for string names of types.
KOKKOS_INLINE_FUNCTION integral_nonzero(const integral_nonzero &)
Base template specification for IsADType.
static KOKKOS_INLINE_FUNCTION void eval(T &x)
Base template specification for static size.
Base template specification for Value.
KOKKOS_INLINE_FUNCTION integral_nonzero(const T &)
KOKKOS_INLINE_FUNCTION integral_nonzero & operator=(const integral_nonzero &)
const ScalarType< T >::type type
#define KOKKOS_INLINE_FUNCTION
KOKKOS_INLINE_FUNCTION integral_nonzero & operator=(const T &v)
Determine whether a given type is a view.
Base template specification for testing equivalence.
Get the base Fad type from a view/expression.
KOKKOS_INLINE_FUNCTION integral_nonzero(const integral_nonzero &v)
#define SACADO_BUILTIN_SPECIALIZATION_COMPLEX(t, NAME)
Remove const from a type.
Do not initialize the derivative array.
const ValueType< T >::type type
integral_nonzero< T, v > type
#define SACADO_BUILTIN_SPECIALIZATION(t, NAME)
Specialization of above classes to builtin types.
DerivInit
Enum use to signal whether the derivative array should be initialized in AD object constructors...
integral_nonzero< T, 0 > type
static KOKKOS_INLINE_FUNCTION const T & eval(const T &x)
Initialize the derivative array.
KOKKOS_INLINE_FUNCTION integral_nonzero(const T &v)
Base template specification for IsScalarType.
static const unsigned value
KOKKOS_INLINE_FUNCTION integral_nonzero & operator=(const T &)
Base template specification for ValueType.
static KOKKOS_INLINE_FUNCTION const T & eval(const T &x)
Base template specification for testing whether type is statically sized.
Get view type for any Fad type.