42 #ifndef SACADO_FAD_EXP_MP_VECTOR_HPP
43 #define SACADO_FAD_EXP_MP_VECTOR_HPP
64 typename std::enable_if<
65 Sacado::is_mp_vector<typename T::value_type>::value >::type
85 KOKKOS_INLINE_FUNCTION
89 KOKKOS_INLINE_FUNCTION
93 KOKKOS_INLINE_FUNCTION
95 return this->size() ? this->dx_[i].fastAccessCoeff(
j) :
val_type(0.0);
99 KOKKOS_INLINE_FUNCTION
101 return this->dx_[i].fastAccessCoeff(
j);
105 KOKKOS_INLINE_FUNCTION
107 return this->dx_[i].fastAccessCoeff(
j);
113 template <
typename DstType>
116 typename std::enable_if<
117 std::is_same< typename DstType::expr_spec_type, ExprSpecMPVector >::value
126 static const int VecNum = Sacado::StaticSize<value_type>::value;
129 template <
typename SrcType>
130 KOKKOS_INLINE_FUNCTION
133 const int xsz =
x.size();
135 if (xsz != dst.size())
136 dst.resizeAndZero(xsz);
138 const int sz = dst.size();
146 if (
x.hasFastAccess()) {
147 SACADO_FAD_DERIV_LOOP(i,sz)
148 for (
int j=0;
j<VecNum; ++
j)
149 dst.fastAccessDx(i,
j) =
x.fastAccessDx(i,
j);
152 SACADO_FAD_DERIV_LOOP(i,sz)
153 for (
int j=0;
j<VecNum; ++
j)
154 dst.fastAccessDx(i,
j) =
x.dx(i,
j);
157 for (
int j=0;
j<VecNum; ++
j)
158 dst.val(
j) =
x.val(
j);
162 template <
typename SrcType>
163 KOKKOS_INLINE_FUNCTION
166 const int xsz =
x.size(), sz = dst.size();
168 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
169 if ((xsz != sz) && (xsz != 0) && (sz != 0))
170 throw "Fad Error: Attempt to assign with incompatible sizes";
175 if (
x.hasFastAccess())
176 SACADO_FAD_DERIV_LOOP(i,sz)
177 for (
int j=0;
j<VecNum; ++
j)
178 dst.fastAccessDx(i,
j) +=
x.fastAccessDx(i,
j);
180 for (
int i=0; i<sz; ++i)
181 for (
int j=0;
j<VecNum; ++
j)
182 dst.fastAccessDx(i,
j) +=
x.dx(i,
j);
185 dst.resizeAndZero(xsz);
186 if (
x.hasFastAccess())
187 SACADO_FAD_DERIV_LOOP(i,xsz)
188 for (
int j=0;
j<VecNum; ++
j)
189 dst.fastAccessDx(i,
j) =
x.fastAccessDx(i,
j);
191 SACADO_FAD_DERIV_LOOP(i,xsz)
192 for (
int j=0;
j<VecNum; ++
j)
193 dst.fastAccessDx(i,
j) =
x.dx(i,
j);
197 for (
int j=0;
j<VecNum; ++
j)
198 dst.val(
j) +=
x.val(
j);
202 template <
typename SrcType>
203 KOKKOS_INLINE_FUNCTION
206 const int xsz =
x.size(), sz = dst.size();
208 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
209 if ((xsz != sz) && (xsz != 0) && (sz != 0))
210 throw "Fad Error: Attempt to assign with incompatible sizes";
215 if (
x.hasFastAccess())
216 SACADO_FAD_DERIV_LOOP(i,sz)
217 for (
int j=0;
j<VecNum; ++
j)
218 dst.fastAccessDx(i,
j) -=
x.fastAccessDx(i,
j);
220 SACADO_FAD_DERIV_LOOP(i,sz)
221 for (
int j=0;
j<VecNum; ++
j)
222 dst.fastAccessDx(i,
j) -=
x.dx(i,
j);
225 dst.resizeAndZero(xsz);
226 if (
x.hasFastAccess())
227 SACADO_FAD_DERIV_LOOP(i,xsz)
228 for (
int j=0;
j<VecNum; ++
j)
229 dst.fastAccessDx(i,
j) = -
x.fastAccessDx(i,
j);
231 SACADO_FAD_DERIV_LOOP(i,xsz)
232 for (
int j=0;
j<VecNum; ++
j)
233 dst.fastAccessDx(i,
j) = -
x.dx(i,
j);
237 for (
int j=0;
j<VecNum; ++
j)
238 dst.val(
j) -=
x.val(
j);
242 template <
typename SrcType>
243 KOKKOS_INLINE_FUNCTION
246 const int xsz =
x.size(), sz = dst.size();
250 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
251 if ((xsz != sz) && (xsz != 0) && (sz != 0))
252 throw "Fad Error: Attempt to assign with incompatible sizes";
257 if (
x.hasFastAccess())
258 SACADO_FAD_DERIV_LOOP(i,sz)
259 for (
int j=0;
j<VecNum; ++
j)
260 dst.fastAccessDx(i) = v.fastAccessCoeff(
j)*
x.fastAccessDx(i,
j) + dst.fastAccessDx(i,
j)*xval.fastAccessCoeff(
j);
262 SACADO_FAD_DERIV_LOOP(i,sz)
263 for (
int j=0;
j<VecNum; ++
j)
264 dst.fastAccessDx(i) = v.fastAccessCoeff(
j)*
x.dx(i,
j) + dst.fastAccessDx(i,
j)*xval.fastAccessCoeff(
j);
267 dst.resizeAndZero(xsz);
268 if (
x.hasFastAccess())
269 SACADO_FAD_DERIV_LOOP(i,xsz)
270 for (
int j=0;
j<VecNum; ++
j)
271 dst.fastAccessDx(i,
j) = v.fastAccessCoeff(
j)*
x.fastAccessDx(i,
j);
273 SACADO_FAD_DERIV_LOOP(i,xsz)
274 for (
int j=0;
j<VecNum; ++
j)
275 dst.fastAccessDx(i,
j) = v.fastAccessCoeff(
j)*
x.dx(i,
j);
280 SACADO_FAD_DERIV_LOOP(i,sz)
281 for (
int j=0;
j<VecNum; ++
j)
282 dst.fastAccessDx(i,
j) *= xval.fastAccessCoeff(
j);
286 for (
int j=0;
j<VecNum; ++
j)
287 dst.val(
j) *= xval.fastAccessCoeff(
j);
291 template <
typename SrcType>
292 KOKKOS_INLINE_FUNCTION
295 const int xsz =
x.size(), sz = dst.size();
299 #if defined(SACADO_DEBUG) && !defined(__CUDA_ARCH__ )
300 if ((xsz != sz) && (xsz != 0) && (sz != 0))
301 throw "Fad Error: Attempt to assign with incompatible sizes";
307 if (
x.hasFastAccess())
308 SACADO_FAD_DERIV_LOOP(i,sz)
309 for (
int j=0;
j<VecNum; ++
j)
310 dst.fastAccessDx(i,
j) =
311 ( dst.fastAccessDx(i,
j)*xval.fastAccessCoeff(
j) - v.fastAccessCoeff(
j)*
x.fastAccessDx(i,
j) ) / xval2.fastAccessCoeff(
j);
313 SACADO_FAD_DERIV_LOOP(i,sz)
314 for (
int j=0;
j<VecNum; ++
j)
315 dst.fastAccessDx(i,
j) =
316 ( dst.fastAccessDx(i,
j)*xval.fastAccessCoeff(
j) - v.fastAccessCoeff(
j)*
x.dx(i,
j) ) / xval2.fastAccessCoeff(
j);
319 dst.resizeAndZero(xsz);
320 if (
x.hasFastAccess())
321 SACADO_FAD_DERIV_LOOP(i,xsz)
322 for (
int j=0;
j<VecNum; ++
j)
323 dst.fastAccessDx(i,
j) = - v.fastAccessCoeff(
j)*
x.fastAccessDx(i,
j) / xval2.fastAccessCoeff(
j);
325 SACADO_FAD_DERIV_LOOP(i,xsz)
326 for (
int j=0;
j<VecNum; ++
j)
327 dst.fastAccessDx(i,
j) = -v.fastAccessCoeff(
j)*
x.dx(i,
j) / xval2.fastAccessCoeff(
j);
332 SACADO_FAD_DERIV_LOOP(i,sz)
333 for (
int j=0;
j<VecNum; ++
j)
334 dst.fastAccessDx(i,
j) /= xval.fastAccessCoeff(
j);
338 for (
int j=0;
j<VecNum; ++
j)
339 dst.val(
j) /= xval.fastAccessCoeff(
j);
348 template <
typename DstType>
351 typename std::enable_if<
352 Sacado::IsStaticallySized<DstType>::value &&
353 std::is_same< typename DstType::expr_spec_type, ExprSpecMPVector >::value
362 static const int VecNum = Sacado::StaticSize<value_type>::value;
365 template <
typename SrcType>
366 KOKKOS_INLINE_FUNCTION
369 const int sz = dst.size();
370 SACADO_FAD_DERIV_LOOP(i,sz)
371 for (
int j=0;
j<VecNum; ++
j)
372 dst.fastAccessDx(i,
j) =
x.fastAccessDx(i,
j);
373 for (
int j=0;
j<VecNum; ++
j)
374 dst.val(
j) =
x.val(
j);
378 template <
typename SrcType>
379 KOKKOS_INLINE_FUNCTION
382 const int sz = dst.size();
383 SACADO_FAD_DERIV_LOOP(i,sz)
384 for (
int j=0;
j<VecNum; ++
j)
385 dst.fastAccessDx(i,
j) +=
x.fastAccessDx(i,
j);
386 for (
int j=0;
j<VecNum; ++
j)
387 dst.val(
j) +=
x.val(
j);
391 template <
typename SrcType>
392 KOKKOS_INLINE_FUNCTION
395 const int sz = dst.size();
396 SACADO_FAD_DERIV_LOOP(i,sz)
397 for (
int j=0;
j<VecNum; ++
j)
398 dst.fastAccessDx(i,
j) -=
x.fastAccessDx(i,
j);
399 for (
int j=0;
j<VecNum; ++
j)
400 dst.val(
j) -=
x.val(
j);
404 template <
typename SrcType>
405 KOKKOS_INLINE_FUNCTION
408 const int sz = dst.size();
411 SACADO_FAD_DERIV_LOOP(i,sz)
412 for (
int j=0;
j<VecNum; ++
j)
413 dst.fastAccessDx(i,
j) = v.fastAccessCoeff(
j)*
x.fastAccessDx(i,
j) + dst.fastAccessDx(i,
j)*xval.fastAccessCoeff(
j);
414 for (
int j=0;
j<VecNum; ++
j)
415 dst.val(
j) *= xval.fastAccessCoeff(
j);
419 template <
typename SrcType>
420 KOKKOS_INLINE_FUNCTION
423 const int sz = dst.size();
427 SACADO_FAD_DERIV_LOOP(i,sz)
428 for (
int j=0;
j<VecNum; ++
j)
429 dst.fastAccessDx(i,
j) =
430 ( dst.fastAccessDx(i,
j)*xval.fastAccessCoeff(
j) - v.fastAccessCoeff(
j)*
x.fastAccessDx(i,
j) )/ xval2.fastAccessCoeff(
j);
431 for (
int j=0;
j<VecNum; ++
j)
432 dst.val(
j) /= xval.fastAccessCoeff(
j);
443 #include "Sacado_Fad_Exp_Ops.hpp"
445 #define FAD_UNARYOP_MACRO(OPNAME,OP,USING,MPVALUE,VALUE,DX,FASTACCESSDX) \
450 template <typename T> \
451 class OP< T,ExprSpecMPVector > : \
452 public Expr< OP< T,ExprSpecMPVector > > { \
455 typedef typename std::remove_cv<T>::type ExprT; \
456 typedef typename ExprT::value_type value_type; \
457 typedef typename ExprT::scalar_type scalar_type; \
459 typedef typename value_type::value_type val_type; \
461 typedef ExprSpecMPVector expr_spec_type; \
463 KOKKOS_INLINE_FUNCTION \
464 OP(const T& expr_) : expr(expr_) {} \
466 KOKKOS_INLINE_FUNCTION \
467 int size() const { return expr.size(); } \
469 KOKKOS_INLINE_FUNCTION \
470 bool hasFastAccess() const { \
471 return expr.hasFastAccess(); \
474 KOKKOS_INLINE_FUNCTION \
475 value_type val() const { \
480 KOKKOS_INLINE_FUNCTION \
481 val_type val(int j) const { \
486 KOKKOS_INLINE_FUNCTION \
487 val_type dx(int i, int j) const { \
492 KOKKOS_INLINE_FUNCTION \
493 val_type fastAccessDx(int i, int j) const { \
495 return FASTACCESSDX; \
514 expr.fastAccessDx(i,
j))
521 -expr.fastAccessDx(i,
j))
528 exp(expr.val(
j))*expr.fastAccessDx(i,
j))
534 expr.dx(i,
j)/expr.val(
j),
535 expr.fastAccessDx(i,
j)/expr.val(
j))
552 using std::
cos; using std::
sin;,
559 using std::
cos; using std::
sin;,
665 #undef FAD_UNARYOP_MACRO
676 template <
typename ConstType,
typename ValueType>
677 struct ConstTypeRef {
678 typedef ValueType type;
681 template <
typename ValueType>
682 struct ConstTypeRef<ValueType, ValueType> {
683 typedef ValueType& type;
689 #define FAD_BINARYOP_MACRO(OPNAME,OP,USING,MPVALUE,VALUE,DX,CDX1,CDX2,FASTACCESSDX,MPVAL_CONST_DX_1,MPVAL_CONST_DX_2,VAL_CONST_DX_1,VAL_CONST_DX_2,CONST_DX_1,CONST_DX_2,CONST_FASTACCESSDX_1,CONST_FASTACCESSDX_2) \
694 template <typename T1, typename T2 > \
695 class OP< T1, T2, false, false, ExprSpecMPVector > : \
696 public Expr< OP< T1, T2, false, false, ExprSpecMPVector > > { \
699 typedef typename std::remove_cv<T1>::type ExprT1; \
700 typedef typename std::remove_cv<T2>::type ExprT2; \
701 typedef typename ExprT1::value_type value_type_1; \
702 typedef typename ExprT2::value_type value_type_2; \
703 typedef typename Sacado::Promote<value_type_1, \
704 value_type_2>::type value_type; \
706 typedef typename ExprT1::scalar_type scalar_type_1; \
707 typedef typename ExprT2::scalar_type scalar_type_2; \
708 typedef typename Sacado::Promote<scalar_type_1, \
709 scalar_type_2>::type scalar_type; \
711 typedef typename value_type::value_type val_type; \
713 typedef ExprSpecMPVector expr_spec_type; \
715 KOKKOS_INLINE_FUNCTION \
716 OP(const T1& expr1_, const T2& expr2_) : \
717 expr1(expr1_), expr2(expr2_) {} \
719 KOKKOS_INLINE_FUNCTION \
721 const int sz1 = expr1.size(), sz2 = expr2.size(); \
722 return sz1 > sz2 ? sz1 : sz2; \
725 KOKKOS_INLINE_FUNCTION \
726 bool hasFastAccess() const { \
727 return expr1.hasFastAccess() && expr2.hasFastAccess(); \
730 KOKKOS_INLINE_FUNCTION \
731 value_type val() const { \
736 KOKKOS_INLINE_FUNCTION \
737 val_type val(int j) const { \
742 KOKKOS_INLINE_FUNCTION \
743 val_type dx(int i, int j) const { \
745 const int sz1 = expr1.size(), sz2 = expr2.size(); \
746 if (sz1 > 0 && sz2 > 0) \
754 KOKKOS_INLINE_FUNCTION \
755 val_type fastAccessDx(int i, int j) const { \
757 return FASTACCESSDX; \
767 template <typename T1, typename T2> \
768 class OP< T1, T2, false, true, ExprSpecMPVector > : \
769 public Expr< OP< T1, T2, false, true, ExprSpecMPVector > > { \
772 typedef typename std::remove_cv<T1>::type ExprT1; \
774 typedef typename ExprT1::value_type value_type; \
775 typedef typename ExprT1::scalar_type scalar_type; \
777 typedef typename value_type::value_type val_type; \
779 typedef ExprSpecMPVector expr_spec_type; \
781 KOKKOS_INLINE_FUNCTION \
782 OP(const T1& expr1_, const ConstT& c_) : \
783 expr1(expr1_), c(c_) {} \
785 KOKKOS_INLINE_FUNCTION \
787 return expr1.size(); \
790 KOKKOS_INLINE_FUNCTION \
791 bool hasFastAccess() const { \
792 return expr1.hasFastAccess(); \
795 KOKKOS_INLINE_FUNCTION \
796 value_type val() const { \
798 return MPVAL_CONST_DX_2; \
801 KOKKOS_INLINE_FUNCTION \
802 val_type val(int j) const { \
804 return VAL_CONST_DX_2; \
807 KOKKOS_INLINE_FUNCTION \
808 val_type dx(int i, int j) const { \
813 KOKKOS_INLINE_FUNCTION \
814 val_type fastAccessDx(int i, int j) const { \
816 return CONST_FASTACCESSDX_2; \
822 const typename ConstTypeRef<ConstT,value_type>::type c; \
825 template <typename T1, typename T2> \
826 class OP< T1, T2, true, false,ExprSpecMPVector > : \
827 public Expr< OP< T1, T2, true, false, ExprSpecMPVector > > { \
830 typedef typename std::remove_cv<T2>::type ExprT2; \
832 typedef typename ExprT2::value_type value_type; \
833 typedef typename ExprT2::scalar_type scalar_type; \
835 typedef typename value_type::value_type val_type; \
837 typedef ExprSpecMPVector expr_spec_type; \
839 KOKKOS_INLINE_FUNCTION \
840 OP(const ConstT& c_, const T2& expr2_) : \
841 c(c_), expr2(expr2_) {} \
843 KOKKOS_INLINE_FUNCTION \
845 return expr2.size(); \
848 KOKKOS_INLINE_FUNCTION \
849 bool hasFastAccess() const { \
850 return expr2.hasFastAccess(); \
853 KOKKOS_INLINE_FUNCTION \
854 value_type val() const { \
856 return MPVAL_CONST_DX_1; \
859 KOKKOS_INLINE_FUNCTION \
860 val_type val(int j) const { \
862 return VAL_CONST_DX_1; \
865 KOKKOS_INLINE_FUNCTION \
866 val_type dx(int i, int j) const { \
871 KOKKOS_INLINE_FUNCTION \
872 val_type fastAccessDx(int i, int j) const { \
874 return CONST_FASTACCESSDX_1; \
879 const typename ConstTypeRef<ConstT,value_type>::type c; \
892 expr1.val() + expr2.val(),
893 expr1.val(
j) + expr2.val(
j),
894 expr1.dx(i,
j) + expr2.dx(i,
j),
897 expr1.fastAccessDx(i,
j) + expr2.fastAccessDx(i,
j),
900 c.fastAccessCoeff(
j) + expr2.val(
j),
901 expr1.val(
j) + c.fastAccessCoeff(
j),
904 expr2.fastAccessDx(i,
j),
905 expr1.fastAccessDx(i,
j))
909 expr1.val() - expr2.val(),
910 expr1.val(
j) - expr2.val(
j),
911 expr1.dx(i,
j) - expr2.dx(i,
j),
914 expr1.fastAccessDx(i,
j) - expr2.fastAccessDx(i,
j),
917 c.fastAccessCoeff(
j) - expr2.val(
j),
918 expr1.val(
j) - c.fastAccessCoeff(
j),
921 -expr2.fastAccessDx(i,
j),
922 expr1.fastAccessDx(i,
j))
926 expr1.val() * expr2.val(),
927 expr1.val(
j) * expr2.val(
j),
928 expr1.val(
j)*expr2.dx(i,
j) + expr1.dx(i,
j)*expr2.val(
j),
929 expr1.val(
j)*expr2.dx(i,
j),
930 expr1.dx(i,
j)*expr2.val(
j),
931 expr1.val(
j)*expr2.fastAccessDx(i,
j) +
932 expr1.fastAccessDx(i,
j)*expr2.val(
j),
935 c.fastAccessCoeff(
j) * expr2.val(
j),
936 expr1.val(
j) * c.fastAccessCoeff(
j),
937 c.fastAccessCoeff(
j)*expr2.dx(i,
j),
938 expr1.dx(i,
j)*c.fastAccessCoeff(
j),
939 c.fastAccessCoeff(
j)*expr2.fastAccessDx(i,
j),
940 expr1.fastAccessDx(i,
j)*c.fastAccessCoeff(
j))
944 expr1.val() / expr2.val(),
945 expr1.val(
j) / expr2.val(
j),
946 (expr1.dx(i,
j)*expr2.val(
j) - expr2.dx(i,
j)*expr1.val(
j)) /
947 (expr2.val(
j)*expr2.val(
j)),
948 -expr2.dx(i,
j)*expr1.val(
j) / (expr2.val(
j)*expr2.val(
j)),
949 expr1.dx(i,
j)/expr2.val(
j),
950 (expr1.fastAccessDx(i,
j)*expr2.val(
j) -
951 expr2.fastAccessDx(i,
j)*expr1.val(
j)) /
952 (expr2.val(
j)*expr2.val(
j)),
955 c.fastAccessCoeff(
j) / expr2.val(
j),
956 expr1.val(
j) / c.fastAccessCoeff(
j),
957 -expr2.dx(i,
j)*c.fastAccessCoeff(
j) / (expr2.val(
j)*expr2.val(
j)),
958 expr1.dx(i,
j)/c.fastAccessCoeff(
j),
959 -expr2.fastAccessDx(i,
j)*c.fastAccessCoeff(
j) / (expr2.val(
j)*expr2.val(
j)),
960 expr1.fastAccessDx(i,
j)/c.fastAccessCoeff(
j))
964 atan2(expr1.val(), expr2.val()),
965 atan2(expr1.val(
j), expr2.val(
j)),
966 (expr2.val(
j)*expr1.dx(i,
j) - expr1.val(
j)*expr2.dx(i,
j))/
967 (expr1.val(
j)*expr1.val(
j) + expr2.val(
j)*expr2.val(
j)),
968 -expr1.val(
j)*expr2.dx(i,
j)/
969 (expr1.val(
j)*expr1.val(
j) + expr2.val(
j)*expr2.val(
j)),
970 expr2.val(
j)*expr1.dx(i,
j)/
971 (expr1.val(
j)*expr1.val(
j) + expr2.val(
j)*expr2.val(
j)),
972 (expr2.val(
j)*expr1.fastAccessDx(i,
j) - expr1.val(
j)*expr2.fastAccessDx(i,
j))/
973 (expr1.val(
j)*expr1.val(
j) + expr2.val(
j)*expr2.val(
j)),
974 atan2(c, expr2.val()),
975 atan2(expr1.val(), c),
976 atan2(c.fastAccessCoeff(
j), expr2.val(
j)),
977 atan2(expr1.val(
j), c.fastAccessCoeff(
j)),
978 (-c.fastAccessCoeff(
j)*expr2.dx(i,
j)) / (c.fastAccessCoeff(
j)*c.fastAccessCoeff(
j) + expr2.val(
j)*expr2.val(
j)),
979 (c.fastAccessCoeff(
j)*expr1.dx(i,
j))/ (expr1.val(
j)*expr1.val(
j) + c.fastAccessCoeff(
j)*c.fastAccessCoeff(
j)),
980 (-c.fastAccessCoeff(
j)*expr2.fastAccessDx(i,
j))/ (c.fastAccessCoeff(
j)*c.fastAccessCoeff(
j) + expr2.val(
j)*expr2.val(
j)),
981 (c.fastAccessCoeff(
j)*expr1.fastAccessDx(i,
j))/ (expr1.val(
j)*expr1.val(
j) + c.fastAccessCoeff(
j)*c.fastAccessCoeff(
j)))
985 pow(expr1.val(), expr2.val()),
986 pow(expr1.val(
j), expr2.val(
j)),
987 if_then_else( expr1.val(
j) == val_type(0.0), val_type(0.0), val_type((expr2.dx(i,
j)*
log(expr1.val(
j))+expr2.val(
j)*expr1.dx(i,
j)/expr1.val(
j))*
pow(expr1.val(
j),expr2.val(
j))) ),
988 if_then_else( expr1.val(
j) == val_type(0.0), val_type(0.0), val_type(expr2.dx(i,
j)*
log(expr1.val(
j))*
pow(expr1.val(
j),expr2.val(
j))) ),
989 if_then_else( expr1.val(
j) == val_type(0.0), val_type(0.0), val_type(expr2.val(
j)*expr1.dx(i,
j)/expr1.val(
j)*
pow(expr1.val(
j),expr2.val(
j))) ),
990 if_then_else( expr1.val(
j) == val_type(0.0), val_type(0.0), val_type((expr2.fastAccessDx(i,
j)*
log(expr1.val(
j))+expr2.val(
j)*expr1.fastAccessDx(i,
j)/expr1.val(
j))*
pow(expr1.val(
j),expr2.val(
j))) ),
993 pow(c.fastAccessCoeff(
j), expr2.val(
j)),
994 pow(expr1.val(
j), c.fastAccessCoeff(
j)),
995 if_then_else( c.fastAccessCoeff(
j) == val_type(0.0), val_type(0.0), val_type(expr2.dx(i,
j)*
log(c.fastAccessCoeff(
j))*
pow(c.fastAccessCoeff(
j),expr2.val(
j))) ),
996 if_then_else( expr1.val(
j) == val_type(0.0), val_type(0.0), val_type(c.fastAccessCoeff(
j)*expr1.dx(i,
j)/expr1.val(
j)*
pow(expr1.val(
j),c.fastAccessCoeff(
j))) ),
997 if_then_else( c.fastAccessCoeff(
j) == val_type(0.0), val_type(0.0), val_type(expr2.fastAccessDx(i,
j)*
log(c.fastAccessCoeff(
j))*
pow(c.fastAccessCoeff(
j),expr2.val(
j))) ),
998 if_then_else( expr1.val(
j) == val_type(0.0), val_type(0.0), val_type(c.fastAccessCoeff(
j)*expr1.fastAccessDx(i,
j)/expr1.val(
j)*
pow(expr1.val(
j),c.fastAccessCoeff(
j)))) )
1042 template <
typename CondT,
typename T1,
typename T2>
1043 class IfThenElseOp< CondT,T1,T2,false,false,ExprSpecMPVector > :
1044 public Expr< IfThenElseOp< CondT, T1, T2, false, false, ExprSpecMPVector > > {
1048 typedef typename std::remove_cv<T1>::type ExprT1;
1049 typedef typename std::remove_cv<T2>::type ExprT2;
1052 typedef typename Sacado::Promote<value_type_1,
1057 typedef typename Sacado::Promote<scalar_type_1,
1062 typedef ExprSpecMPVector expr_spec_type;
1064 KOKKOS_INLINE_FUNCTION
1065 IfThenElseOp(
const CondT& cond_,
const T1& expr1_,
const T2& expr2_) :
1066 cond(cond_), expr1(expr1_), expr2(expr2_) {}
1068 KOKKOS_INLINE_FUNCTION
1070 int sz1 = expr1.size(), sz2 = expr2.size();
1071 return sz1 > sz2 ? sz1 : sz2;
1074 KOKKOS_INLINE_FUNCTION
1075 bool hasFastAccess()
const {
1076 return expr1.hasFastAccess() && expr2.hasFastAccess();
1079 KOKKOS_INLINE_FUNCTION
1084 KOKKOS_INLINE_FUNCTION
1085 val_type
val(
int j)
const {
1089 KOKKOS_INLINE_FUNCTION
1090 val_type
dx(
int i,
int j)
const {
1094 KOKKOS_INLINE_FUNCTION
1096 return if_then_else( cond, expr1.fastAccessDx(i,
j), expr2.fastAccessDx(i,
j) );
1107 template <
typename CondT,
typename T1,
typename T2>
1108 class IfThenElseOp< CondT, T1, T2, false,
true, ExprSpecMPVector> :
1109 public Expr< IfThenElseOp< CondT, T1, T2, false, true, ExprSpecMPVector > > {
1113 typedef typename std::remove_cv<T1>::type ExprT1;
1120 KOKKOS_INLINE_FUNCTION
1121 IfThenElseOp(
const CondT& cond_,
const T1& expr1_,
const ConstT& c_) :
1122 cond(cond_), expr1(expr1_), c(c_) {}
1124 KOKKOS_INLINE_FUNCTION
1126 return expr1.size();
1129 KOKKOS_INLINE_FUNCTION
1130 bool hasFastAccess()
const {
1131 return expr1.hasFastAccess();
1134 KOKKOS_INLINE_FUNCTION
1139 KOKKOS_INLINE_FUNCTION
1140 val_type
val(
int j)
const {
1144 KOKKOS_INLINE_FUNCTION
1145 val_type
dx(
int i,
int j)
const {
1149 KOKKOS_INLINE_FUNCTION
1151 return if_then_else( cond, expr1.fastAccessDx(i,
j), val_type(0.0) );
1158 const typename ConstTypeRef<ConstT,value_type>::type c;
1161 template <
typename CondT,
typename T1,
typename T2>
1162 class IfThenElseOp< CondT, T1, T2,
true, false, ExprSpecMPVector> :
1163 public Expr< IfThenElseOp< CondT, T1, T2, true, false, ExprSpecMPVector > > {
1167 typedef typename std::remove_cv<T2>::type ExprT2;
1174 typedef ExprSpecMPVector expr_spec_type;
1176 KOKKOS_INLINE_FUNCTION
1177 IfThenElseOp(
const CondT& cond_,
const ConstT& c_,
const T2& expr2_) :
1178 cond(cond_), c(c_), expr2(expr2_) {}
1180 KOKKOS_INLINE_FUNCTION
1182 return expr2.size();
1185 KOKKOS_INLINE_FUNCTION
1186 bool hasFastAccess()
const {
1187 return expr2.hasFastAccess();
1190 KOKKOS_INLINE_FUNCTION
1195 KOKKOS_INLINE_FUNCTION
1196 val_type
val(
int j)
const {
1200 KOKKOS_INLINE_FUNCTION
1201 val_type
dx(
int i,
int j)
const {
1205 KOKKOS_INLINE_FUNCTION
1207 return if_then_else( cond, val_type(0.0), expr2.fastAccessDx(i,
j) );
1213 const typename ConstTypeRef<ConstT,value_type>::type c;
1221 #undef FAD_BINARYOP_MACRO
1223 #endif // SACADO_FAD_EXP_MP_VECTOR_HPP