31 #ifndef SACADO_FAD_EXP_OPS_HPP 32 #define SACADO_FAD_EXP_OPS_HPP 34 #include <type_traits> 40 #if defined(HAVE_SACADO_KOKKOSCORE) 41 #include "Kokkos_Atomic.hpp" 42 #include "impl/Kokkos_Error.hpp" 45 #define FAD_UNARYOP_MACRO(OPNAME,OP,USING,VALUE,DX,FASTACCESSDX) \ 50 template <typename T, typename ExprSpec> \ 53 template <typename T> \ 54 class OP< T,ExprSpecDefault > : \ 55 public Expr< OP<T,ExprSpecDefault> > { \ 58 typedef typename std::remove_cv<T>::type ExprT; \ 59 typedef typename ExprT::value_type value_type; \ 60 typedef typename ExprT::scalar_type scalar_type; \ 62 typedef ExprSpecDefault expr_spec_type; \ 64 KOKKOS_INLINE_FUNCTION \ 65 OP(const T& expr_) : expr(expr_) {} \ 67 KOKKOS_INLINE_FUNCTION \ 68 int size() const { return expr.size(); } \ 70 KOKKOS_INLINE_FUNCTION \ 71 bool hasFastAccess() const { \ 72 return expr.hasFastAccess(); \ 75 KOKKOS_INLINE_FUNCTION \ 76 value_type val() const { \ 81 KOKKOS_INLINE_FUNCTION \ 82 value_type dx(int i) const { \ 87 KOKKOS_INLINE_FUNCTION \ 88 value_type fastAccessDx(int i) const { \ 90 return FASTACCESSDX; \ 98 template <typename T> \ 99 KOKKOS_INLINE_FUNCTION \ 100 OP< typename Expr<T>::derived_type, \ 101 typename T::expr_spec_type > \ 102 OPNAME (const Expr<T>& expr) \ 104 typedef OP< typename Expr<T>::derived_type, \ 105 typename T::expr_spec_type > expr_t; \ 107 return expr_t(expr.derived()); \ 110 template <typename T, typename E> \ 111 struct ExprLevel< OP< T,E > > { \ 112 static const unsigned value = ExprLevel<T>::value; \ 115 template <typename T, typename E> \ 116 struct IsFadExpr< OP< T,E > > { \ 117 static const unsigned value = true; \ 123 template <typename T, typename E> \ 124 struct IsExpr< Fad::Exp::OP< T,E > > { \ 125 static const bool value = true; \ 128 template <typename T, typename E> \ 129 struct BaseExprType< Fad::Exp::OP< T,E > > { \ 130 typedef typename BaseExprType<T>::type type; \ 140 expr.fastAccessDx(i))
146 -expr.fastAccessDx(i))
151 exp(expr.val())*expr.dx(i),
152 exp(expr.val())*expr.fastAccessDx(i))
157 expr.dx(i)/expr.val(),
158 expr.fastAccessDx(i)/expr.val())
163 expr.dx(i)/(
log(value_type(10))*expr.val()),
164 expr.fastAccessDx(i) / (
log(value_type(10))*expr.val()))
169 expr.
dx(i)/(value_type(2)*
sqrt(expr.
val())),
209 expr.
dx(i)/(value_type(1)+expr.
val()*expr.
val()),
234 expr.
dx(i)/
sqrt((expr.
val()-value_type(1)) *
235 (expr.
val()+value_type(1))),
237 (expr.
val()+value_type(1))))
249 expr.
dx(i)/(value_type(1)-expr.
val()*expr.
val()),
271 #undef FAD_UNARYOP_MACRO 273 #define FAD_BINARYOP_MACRO(OPNAME,OP,USING,VALUE,DX,CDX1,CDX2,FASTACCESSDX,VAL_CONST_DX_1,VAL_CONST_DX_2,CONST_DX_1,CONST_DX_2,CONST_FASTACCESSDX_1,CONST_FASTACCESSDX_2) \ 278 template <typename T1, typename T2, \ 279 bool is_const_T1, bool is_const_T2, \ 280 typename ExprSpec > \ 283 template <typename T1, typename T2> \ 284 class OP< T1, T2, false, false, ExprSpecDefault > : \ 285 public Expr< OP< T1, T2, false, false, ExprSpecDefault > > { \ 288 typedef typename std::remove_cv<T1>::type ExprT1; \ 289 typedef typename std::remove_cv<T2>::type ExprT2; \ 290 typedef typename ExprT1::value_type value_type_1; \ 291 typedef typename ExprT2::value_type value_type_2; \ 292 typedef typename Sacado::Promote<value_type_1, \ 293 value_type_2>::type value_type; \ 295 typedef typename ExprT1::scalar_type scalar_type_1; \ 296 typedef typename ExprT2::scalar_type scalar_type_2; \ 297 typedef typename Sacado::Promote<scalar_type_1, \ 298 scalar_type_2>::type scalar_type; \ 300 typedef ExprSpecDefault expr_spec_type; \ 302 KOKKOS_INLINE_FUNCTION \ 303 OP(const T1& expr1_, const T2& expr2_) : \ 304 expr1(expr1_), expr2(expr2_) {} \ 306 KOKKOS_INLINE_FUNCTION \ 308 const int sz1 = expr1.size(), sz2 = expr2.size(); \ 309 return sz1 > sz2 ? sz1 : sz2; \ 312 KOKKOS_INLINE_FUNCTION \ 313 bool hasFastAccess() const { \ 314 return expr1.hasFastAccess() && expr2.hasFastAccess(); \ 317 KOKKOS_INLINE_FUNCTION \ 318 value_type val() const { \ 323 KOKKOS_INLINE_FUNCTION \ 324 value_type dx(int i) const { \ 326 const int sz1 = expr1.size(), sz2 = expr2.size(); \ 327 if (sz1 > 0 && sz2 > 0) \ 335 KOKKOS_INLINE_FUNCTION \ 336 value_type fastAccessDx(int i) const { \ 338 return FASTACCESSDX; \ 348 template <typename T1, typename T2> \ 349 class OP< T1, T2, false, true, ExprSpecDefault > \ 350 : public Expr< OP< T1, T2, false, true, ExprSpecDefault > > { \ 353 typedef typename std::remove_cv<T1>::type ExprT1; \ 355 typedef typename ExprT1::value_type value_type; \ 356 typedef typename ExprT1::scalar_type scalar_type; \ 358 typedef ExprSpecDefault expr_spec_type; \ 360 KOKKOS_INLINE_FUNCTION \ 361 OP(const T1& expr1_, const ConstT& c_) : \ 362 expr1(expr1_), c(c_) {} \ 364 KOKKOS_INLINE_FUNCTION \ 366 return expr1.size(); \ 369 KOKKOS_INLINE_FUNCTION \ 370 bool hasFastAccess() const { \ 371 return expr1.hasFastAccess(); \ 374 KOKKOS_INLINE_FUNCTION \ 375 value_type val() const { \ 377 return VAL_CONST_DX_2; \ 380 KOKKOS_INLINE_FUNCTION \ 381 value_type dx(int i) const { \ 386 KOKKOS_INLINE_FUNCTION \ 387 value_type fastAccessDx(int i) const { \ 389 return CONST_FASTACCESSDX_2; \ 398 template <typename T1, typename T2> \ 399 class OP< T1, T2, true, false, ExprSpecDefault > \ 400 : public Expr< OP< T1, T2, true, false, ExprSpecDefault > > { \ 403 typedef typename std::remove_cv<T2>::type ExprT2; \ 405 typedef typename ExprT2::value_type value_type; \ 406 typedef typename ExprT2::scalar_type scalar_type; \ 408 typedef ExprSpecDefault expr_spec_type; \ 410 KOKKOS_INLINE_FUNCTION \ 411 OP(const ConstT& c_, const T2& expr2_) : \ 412 c(c_), expr2(expr2_) {} \ 414 KOKKOS_INLINE_FUNCTION \ 416 return expr2.size(); \ 419 KOKKOS_INLINE_FUNCTION \ 420 bool hasFastAccess() const { \ 421 return expr2.hasFastAccess(); \ 424 KOKKOS_INLINE_FUNCTION \ 425 value_type val() const { \ 427 return VAL_CONST_DX_1; \ 430 KOKKOS_INLINE_FUNCTION \ 431 value_type dx(int i) const { \ 436 KOKKOS_INLINE_FUNCTION \ 437 value_type fastAccessDx(int i) const { \ 439 return CONST_FASTACCESSDX_1; \ 448 template <typename T1, typename T2> \ 449 KOKKOS_INLINE_FUNCTION \ 450 SACADO_FAD_EXP_OP_ENABLE_EXPR_EXPR(OP) \ 451 OPNAME (const T1& expr1, const T2& expr2) \ 453 typedef OP< typename Expr<T1>::derived_type, \ 454 typename Expr<T2>::derived_type, \ 455 false, false, typename T1::expr_spec_type > expr_t; \ 457 return expr_t(expr1.derived(), expr2.derived()); \ 460 template <typename T> \ 461 KOKKOS_INLINE_FUNCTION \ 462 OP< typename T::value_type, typename Expr<T>::derived_type, \ 463 true, false, typename T::expr_spec_type > \ 464 OPNAME (const typename T::value_type& c, \ 465 const Expr<T>& expr) \ 467 typedef typename T::value_type ConstT; \ 468 typedef OP< ConstT, typename Expr<T>::derived_type, \ 469 true, false, typename T::expr_spec_type > expr_t; \ 471 return expr_t(c, expr.derived()); \ 474 template <typename T> \ 475 KOKKOS_INLINE_FUNCTION \ 476 OP< typename Expr<T>::derived_type, typename T::value_type, \ 477 false, true, typename T::expr_spec_type > \ 478 OPNAME (const Expr<T>& expr, \ 479 const typename T::value_type& c) \ 481 typedef typename T::value_type ConstT; \ 482 typedef OP< typename Expr<T>::derived_type, ConstT, \ 483 false, true, typename T::expr_spec_type > expr_t; \ 485 return expr_t(expr.derived(), c); \ 488 template <typename T> \ 489 KOKKOS_INLINE_FUNCTION \ 490 SACADO_FAD_EXP_OP_ENABLE_SCALAR_EXPR(OP) \ 491 OPNAME (const typename T::scalar_type& c, \ 492 const Expr<T>& expr) \ 494 typedef typename T::scalar_type ConstT; \ 495 typedef OP< ConstT, typename Expr<T>::derived_type, \ 496 true, false, typename T::expr_spec_type > expr_t; \ 498 return expr_t(c, expr.derived()); \ 501 template <typename T> \ 502 KOKKOS_INLINE_FUNCTION \ 503 SACADO_FAD_EXP_OP_ENABLE_EXPR_SCALAR(OP) \ 504 OPNAME (const Expr<T>& expr, \ 505 const typename T::scalar_type& c) \ 507 typedef typename T::scalar_type ConstT; \ 508 typedef OP< typename Expr<T>::derived_type, ConstT, \ 509 false, true, typename T::expr_spec_type > expr_t; \ 511 return expr_t(expr.derived(), c); \ 514 template <typename T1, typename T2, bool c1, bool c2, typename E> \ 515 struct ExprLevel< OP< T1, T2, c1, c2, E > > { \ 516 static constexpr unsigned value_1 = ExprLevel<T1>::value; \ 517 static constexpr unsigned value_2 = ExprLevel<T2>::value; \ 518 static constexpr unsigned value = \ 519 value_1 >= value_2 ? value_1 : value_2; \ 522 template <typename T1, typename T2, bool c1, bool c2, typename E> \ 523 struct IsFadExpr< OP< T1, T2, c1, c2, E > > { \ 524 static constexpr unsigned value = true; \ 530 template <typename T1, typename T2, bool c1, bool c2, typename E> \ 531 struct IsExpr< Fad::Exp::OP< T1, T2, c1, c2, E > > { \ 532 static constexpr bool value = true; \ 535 template <typename T1, typename T2, bool c1, bool c2, typename E> \ 536 struct BaseExprType< Fad::Exp::OP< T1, T2, c1, c2, E > > { \ 537 typedef typename BaseExprType<T1>::type base_expr_1; \ 538 typedef typename BaseExprType<T2>::type base_expr_2; \ 539 typedef typename Sacado::Promote<base_expr_1, \ 540 base_expr_2>::type type; \ 549 expr1.val() + expr2.val(),
550 expr1.dx(i) + expr2.dx(i),
553 expr1.fastAccessDx(i) + expr2.fastAccessDx(i),
558 expr2.fastAccessDx(i),
559 expr1.fastAccessDx(i))
563 expr1.val() - expr2.val(),
564 expr1.dx(i) - expr2.dx(i),
567 expr1.fastAccessDx(i) - expr2.fastAccessDx(i),
572 -expr2.fastAccessDx(i),
573 expr1.fastAccessDx(i))
577 expr1.val() * expr2.val(),
578 expr1.val()*expr2.dx(i) + expr1.dx(i)*expr2.val(),
579 expr1.val()*expr2.dx(i),
580 expr1.dx(i)*expr2.val(),
581 expr1.val()*expr2.fastAccessDx(i) +
582 expr1.fastAccessDx(i)*expr2.val(),
587 c*expr2.fastAccessDx(i),
588 expr1.fastAccessDx(i)*
c)
592 expr1.val() / expr2.val(),
593 (expr1.dx(i)*expr2.val() - expr2.dx(i)*expr1.val()) /
594 (expr2.val()*expr2.val()),
595 -expr2.dx(i)*expr1.val() / (expr2.val()*expr2.val()),
596 expr1.dx(i)/expr2.val(),
597 (expr1.fastAccessDx(i)*expr2.val() -
598 expr2.fastAccessDx(i)*expr1.val()) /
599 (expr2.val()*expr2.val()),
602 -expr2.dx(i)*
c / (expr2.val()*expr2.val()),
604 -expr2.fastAccessDx(i)*
c / (expr2.val()*expr2.val()),
605 expr1.fastAccessDx(i)/
c)
609 atan2(expr1.val(), expr2.val()),
610 (expr2.val()*expr1.dx(i) - expr1.val()*expr2.dx(i))/
611 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
612 -expr1.val()*expr2.dx(i)/
613 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
614 expr2.val()*expr1.dx(i)/
615 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
616 (expr2.val()*expr1.fastAccessDx(i) - expr1.val()*expr2.fastAccessDx(i))/
617 (expr1.val()*expr1.val() + expr2.val()*expr2.val()),
620 (-
c*expr2.dx(i)) / (
c*
c + expr2.val()*expr2.val()),
621 (
c*expr1.dx(i))/ (expr1.val()*expr1.val() +
c*
c),
622 (-
c*expr2.fastAccessDx(i))/ (
c*
c + expr2.val()*expr2.val()),
623 (
c*expr1.fastAccessDx(i))/ (expr1.val()*expr1.val() +
c*
c))
675 template <
typename CondT,
typename T1,
typename T2,
676 bool is_const_T1,
bool is_const_T2,
678 class IfThenElseOp {};
680 template <
typename CondT,
typename T1,
typename T2>
681 class IfThenElseOp< CondT,
T1,
T2,
false,
false, ExprSpecDefault > :
682 public Expr< IfThenElseOp< CondT, T1, T2, false, false, ExprSpecDefault > > {
686 typedef typename std::remove_cv<T1>::type ExprT1;
687 typedef typename std::remove_cv<T2>::type ExprT2;
688 typedef typename ExprT1::value_type value_type_1;
689 typedef typename ExprT2::value_type value_type_2;
691 value_type_2>::type value_type;
693 typedef typename ExprT1::scalar_type scalar_type_1;
694 typedef typename ExprT2::scalar_type scalar_type_2;
696 scalar_type_2>::type scalar_type;
698 typedef ExprSpecDefault expr_spec_type;
701 IfThenElseOp(
const CondT& cond_,
const T1& expr1_,
const T2& expr2_) :
702 cond(cond_), expr1(expr1_), expr2(expr2_) {}
706 int sz1 = expr1.size(), sz2 = expr2.size();
707 return sz1 > sz2 ? sz1 : sz2;
711 bool hasFastAccess()
const {
712 return expr1.hasFastAccess() && expr2.hasFastAccess();
716 value_type
val()
const {
721 value_type
dx(
int i)
const {
727 return if_then_else( cond, expr1.fastAccessDx(i), expr2.fastAccessDx(i) );
738 template <
typename CondT,
typename T1,
typename T2>
739 class IfThenElseOp< CondT,
T1,
T2,
false,
true, ExprSpecDefault > :
740 public Expr< IfThenElseOp< CondT, T1, T2, false, true, ExprSpecDefault > > {
744 typedef typename std::remove_cv<T1>::type ExprT1;
746 typedef typename ExprT1::value_type value_type;
747 typedef typename ExprT1::scalar_type scalar_type;
749 typedef ExprSpecDefault expr_spec_type;
752 IfThenElseOp(
const CondT& cond_,
const T1& expr1_,
const ConstT& c_) :
753 cond(cond_), expr1(expr1_),
c(c_) {}
761 bool hasFastAccess()
const {
762 return expr1.hasFastAccess();
766 value_type
val()
const {
771 value_type
dx(
int i)
const {
772 return if_then_else( cond, expr1.dx(i), value_type(0.0) );
777 return if_then_else( cond, expr1.fastAccessDx(i), value_type(0.0) );
787 template <
typename CondT,
typename T1,
typename T2>
788 class IfThenElseOp< CondT,
T1,
T2,
true,
false, ExprSpecDefault > :
789 public Expr< IfThenElseOp< CondT, T1, T2, true, false, ExprSpecDefault > > {
793 typedef typename std::remove_cv<T2>::type ExprT2;
795 typedef typename ExprT2::value_type value_type;
796 typedef typename ExprT2::scalar_type scalar_type;
798 typedef ExprSpecDefault expr_spec_type;
801 IfThenElseOp(
const CondT& cond_,
const ConstT& c_,
const T2& expr2_) :
802 cond(cond_),
c(c_), expr2(expr2_) {}
810 bool hasFastAccess()
const {
811 return expr2.hasFastAccess();
815 value_type
val()
const {
820 value_type
dx(
int i)
const {
821 return if_then_else( cond, value_type(0.0), expr2.dx(i) );
826 return if_then_else( cond, value_type(0.0), expr2.fastAccessDx(i) );
836 template <
typename CondT,
typename T1,
typename T2>
838 typename mpl::enable_if_c< IsFadExpr<T1>::value && IsFadExpr<T2>::value &&
839 ExprLevel<T1>::value == ExprLevel<T2>::value,
841 typename Expr<T1>::derived_type,
842 typename Expr<T2>::derived_type,
844 typename T1::expr_spec_type >
848 typedef IfThenElseOp< CondT, typename Expr<T1>::derived_type,
849 typename Expr<T2>::derived_type,
850 false,
false,
typename T1::expr_spec_type > expr_t;
852 return expr_t(cond, expr1.derived(), expr2.derived());
855 template <
typename CondT,
typename T>
857 IfThenElseOp< CondT, typename T::value_type, typename Expr<T>::derived_type,
858 true,
false,
typename T::expr_spec_type >
859 if_then_else (
const CondT& cond,
const typename T::value_type&
c,
862 typedef typename T::value_type ConstT;
863 typedef IfThenElseOp< CondT, ConstT, typename Expr<T>::derived_type,
864 true,
false,
typename T::expr_spec_type > expr_t;
866 return expr_t(cond,
c, expr.derived());
869 template <
typename CondT,
typename T>
871 IfThenElseOp< CondT, typename Expr<T>::derived_type,
typename T::value_type,
872 false,
true,
typename T::expr_spec_type >
874 const typename T::value_type&
c)
876 typedef typename T::value_type ConstT;
877 typedef IfThenElseOp< CondT, typename Expr<T>::derived_type, ConstT,
878 false,
true,
typename T::expr_spec_type > expr_t;
880 return expr_t(cond, expr.derived(),
c);
883 template <
typename CondT,
typename T>
885 typename mpl::disable_if<
886 mpl::is_same<
typename T::value_type,
887 typename T::scalar_type >,
888 IfThenElseOp< CondT,
typename T::scalar_type,
889 typename Expr<T>::derived_type,
890 true,
false,
typename T::expr_spec_type >
892 if_then_else (
const CondT& cond,
const typename Expr<T>::scalar_type&
c,
895 typedef typename T::scalar_type ConstT;
896 typedef IfThenElseOp< CondT, ConstT, typename Expr<T>::derived_type,
897 true,
false,
typename T::expr_spec_type > expr_t;
899 return expr_t(cond,
c, expr.derived());
902 template <
typename CondT,
typename T>
904 typename mpl::disable_if<
905 mpl::is_same<
typename T::value_type,
906 typename T::scalar_type >,
907 IfThenElseOp< CondT, typename Expr<T>::derived_type,
908 typename T::scalar_type,
909 false,
true,
typename T::expr_spec_type >
912 const typename Expr<T>::scalar_type&
c)
914 typedef typename T::scalar_type ConstT;
915 typedef IfThenElseOp< CondT, typename Expr<T>::derived_type, ConstT,
916 false,
true,
typename T::expr_spec_type > expr_t;
918 return expr_t(cond, expr.derived(),
c);
921 template <
typename CondT,
typename T1,
typename T2,
bool c1,
bool c2,
923 struct ExprLevel< IfThenElseOp< CondT,
T1,
T2, c1, c2,
E > > {
924 static constexpr
unsigned value_1 = ExprLevel<T1>::value;
925 static constexpr
unsigned value_2 = ExprLevel<T2>::value;
926 static constexpr
unsigned value =
927 value_1 >= value_2 ? value_1 : value_2;
930 template <
typename CondT,
typename T1,
typename T2,
bool c1,
bool c2,
932 struct IsFadExpr< IfThenElseOp< CondT,
T1,
T2, c1, c2,
E > > {
933 static constexpr
unsigned value =
true;
939 template <
typename CondT,
typename T1,
typename T2,
bool c1,
bool c2,
941 struct IsExpr< Fad::Exp::IfThenElseOp< CondT, T1, T2, c1, c2, E > > {
942 static constexpr
bool value =
true;
945 template <
typename CondT,
typename T1,
typename T2,
bool c1,
bool c2,
947 struct BaseExprType< Fad::Exp::IfThenElseOp< CondT, T1, T2, c1, c2, E > > {
948 typedef typename BaseExprType<T1>::type base_expr_1;
949 typedef typename BaseExprType<T2>::type base_expr_2;
951 base_expr_2>::type type;
955 #undef FAD_BINARYOP_MACRO 962 template <
typename T1,
typename T2 = T1>
964 typedef decltype( std::declval<T1>() == std::declval<T2>() )
type;
970 #define FAD_RELOP_MACRO(OP) \ 974 template <typename T1, typename T2> \ 975 KOKKOS_INLINE_FUNCTION \ 976 typename mpl::enable_if_c< \ 977 IsFadExpr<T1>::value && IsFadExpr<T2>::value && \ 978 ExprLevel<T1>::value == ExprLevel<T2>::value, \ 979 typename ConditionalReturnType<typename T1::value_type, \ 980 typename T2::value_type>::type \ 982 operator OP (const T1& expr1, const T2& expr2) \ 984 return expr1.derived().val() OP expr2.derived().val(); \ 987 template <typename T2> \ 988 KOKKOS_INLINE_FUNCTION \ 989 typename ConditionalReturnType<typename T2::value_type>::type \ 990 operator OP (const typename T2::value_type& a, \ 991 const Expr<T2>& expr2) \ 993 return a OP expr2.derived().val(); \ 996 template <typename T1> \ 997 KOKKOS_INLINE_FUNCTION \ 998 typename ConditionalReturnType<typename T1::value_type>::type \ 999 operator OP (const Expr<T1>& expr1, \ 1000 const typename T1::value_type& b) \ 1002 return expr1.derived().val() OP b; \ 1019 #undef FAD_RELOP_MACRO 1026 template <
typename ExprT>
1030 return ! expr.
derived().val();
1044 template <
typename T>
1048 bool is_zero = (x.val() == 0.0);
1049 for (
int i=0; i<x.size(); i++)
1050 is_zero = is_zero && (x.dx(i) == 0.0);
1059 #define FAD_BOOL_MACRO(OP) \ 1060 namespace Sacado { \ 1063 template <typename T1, typename T2> \ 1064 KOKKOS_INLINE_FUNCTION \ 1066 operator OP (const Expr<T1>& expr1, \ 1067 const Expr<T2>& expr2) \ 1069 return toBool(expr1) OP toBool(expr2); \ 1072 template <typename T2> \ 1073 KOKKOS_INLINE_FUNCTION \ 1075 operator OP (const typename Expr<T2>::value_type& a, \ 1076 const Expr<T2>& expr2) \ 1078 return a OP toBool(expr2); \ 1081 template <typename T1> \ 1082 KOKKOS_INLINE_FUNCTION \ 1084 operator OP (const Expr<T1>& expr1, \ 1085 const typename Expr<T1>::value_type& b) \ 1087 return toBool(expr1) OP b; \ 1096 #undef FAD_BOOL_MACRO 1105 template <
typename T>
1106 std::ostream& operator << (std::ostream& os, const Expr<T>& xx) {
1108 os << x.val() <<
" [";
1110 for (
int i=0; i< x.size(); i++) {
1111 os <<
" " << x.dx(i);
1123 #if defined(HAVE_SACADO_KOKKOSCORE) 1133 template <
typename S>
1135 void atomic_add(GeneralFad<S>* dst,
const GeneralFad<S>& x) {
1136 using Kokkos::atomic_add;
1138 const int xsz = x.size();
1139 const int sz = dst->size();
1145 "Sacado error: Fad resize within atomic_add() not supported!");
1147 if (xsz != sz && sz > 0 && xsz > 0)
1149 "Sacado error: Fad assignment of incompatiable sizes!");
1152 if (sz > 0 && xsz > 0) {
1154 atomic_add(&(dst->fastAccessDx(i)), x.fastAccessDx(i));
1157 atomic_add(&(dst->val()), x.val());
1165 #endif // HAVE_SACADO_KOKKOSCORE 1167 #endif // SACADO_FAD_OPS_HPP
#define FAD_BOOL_MACRO(OP)
expr expr expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 MultiplicationOp
#define FAD_UNARYOP_MACRO(OPNAME, OP, USING, VALUE, DX, FASTACCESSDX)
decltype(std::declval< T1 >()==std::declval< T2 >()) typedef type
KOKKOS_INLINE_FUNCTION bool toBool(const Expr< T > &xx)
#define SACADO_FAD_THREAD_SINGLE
expr expr expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 expr1 expr1 c *expr2 expr1 c *expr2 expr1 c *expr2 expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 Atan2Op
pow(expr1.val(), expr2.val())
Wrapper for a generic expression template.
KOKKOS_INLINE_FUNCTION bool operator!(const Expr< ExprT > &expr)
expr expr expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 expr1 expr1 c *expr2 expr1 c *expr2 expr1 c *expr2 expr1 DivisionOp
#define KOKKOS_INLINE_FUNCTION
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
#define FAD_BINARYOP_MACRO(OPNAME, OP, USING, VALUE, DX, CDX1, CDX2, FASTACCESSDX, VAL_CONST_DX_1, VAL_CONST_DX_2, CONST_DX_1, CONST_DX_2, CONST_FASTACCESSDX_1, CONST_FASTACCESSDX_2)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
#define SACADO_FAD_DERIV_LOOP(I, SZ)
T derived_type
Typename of derived object, returned by derived()
KOKKOS_INLINE_FUNCTION const derived_type & derived() const
Return derived object.
#define FAD_RELOP_MACRO(OP)
atan2(expr1.val(), expr2.val())
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
if_then_else(expr.val() >=0, expr.dx(i), value_type(-expr.dx(i)))
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
expr expr expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 SubtractionOp
expr2 expr1 expr2 expr2 c *expr2 c *expr1 c *expr2 c *expr1 PowerOp