32 #ifndef SACADO_FAD_SIMPLEFADOPS_HPP 33 #define SACADO_FAD_SIMPLEFADOPS_HPP 42 template <
typename ValueT>
48 template <
typename ValueT>
54 template <
typename ValueT>
61 template <
typename ValueT>
67 template <
typename ValueT>
74 template <
typename ValueT>
78 ValueT t2 = 1.0/(2.0*t1);
82 #ifdef HAVE_SACADO_CXX11 83 template <
typename ValueT>
85 cbrt(
const SimpleFad<ValueT>&
a) {
87 ValueT t2 = 1.0/(3.0*t1*t1);
88 return SimpleFad<ValueT>(
a, t1, t2);
92 template <
typename ValueT>
98 template <
typename ValueT>
104 template <
typename ValueT>
108 ValueT t2 = 1.0 + t1*t1;
112 template <
typename ValueT>
119 template <
typename ValueT>
126 template <
typename ValueT>
130 1.0/(1.0 +
a.val()*
a.val()));
133 template <
typename ValueT>
139 template <
typename ValueT>
145 template <
typename ValueT>
152 template <
typename ValueT>
159 template <
typename ValueT>
166 template <
typename ValueT>
170 1.0 /(1.0 -
a.val()*
a.val()));
173 template <
typename ValueT>
182 template <
typename ValueT>
191 template <
typename ValueT>
195 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
198 for (
int i=0; i<sz; i++)
200 else if (
a.hasFastAccess())
201 for (
int i=0; i<sz; i++)
202 c.fastAccessDx(i) =
a.fastAccessDx(i);
204 for (
int i=0; i<sz; i++)
210 template <
typename ValueT>
217 template <
typename ValueT>
224 template <
typename ValueT>
228 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
231 for (
int i=0; i<sz; i++)
233 else if (
a.hasFastAccess())
234 for (
int i=0; i<sz; i++)
235 c.fastAccessDx(i) =
a.fastAccessDx(i);
237 for (
int i=0; i<sz; i++)
243 template <
typename ValueT>
250 template <
typename ValueT>
257 template <
typename ValueT>
261 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
264 for (
int i=0; i<sz; i++)
267 else if (
a.hasFastAccess())
268 for (
int i=0; i<sz; i++)
269 c.fastAccessDx(i) =
a.fastAccessDx(i)*b.
val();
271 for (
int i=0; i<sz; i++)
277 template <
typename ValueT>
284 template <
typename ValueT>
291 template <
typename ValueT>
295 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
298 ValueT t = b.
val()*b.
val();
299 for (
int i=0; i<sz; i++)
303 else if (
a.hasFastAccess())
304 for (
int i=0; i<sz; i++)
305 c.fastAccessDx(i) =
a.fastAccessDx(i)/b.
val();
307 ValueT t = -
a.val()/(b.
val()*b.
val());
308 for (
int i=0; i<sz; i++)
315 template <
typename ValueT>
322 template <
typename ValueT>
329 template <
typename ValueT>
333 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
337 if (
a.val() != value_type(0)) {
338 ValueT t1 =
c.val()*b.
val()/
a.val();
340 for (
int i=0; i<sz; i++)
345 else if (
a.hasFastAccess()) {
346 if (
a.val() != value_type(0)) {
347 ValueT t1 =
c.val()*b.
val()/
a.val();
348 for (
int i=0; i<sz; i++)
349 c.fastAccessDx(i) =
a.fastAccessDx(i)*t1;
353 if (
a.val() != value_type(0)) {
355 for (
int i=0; i<sz; i++)
363 template <
typename ValueT>
369 if (
a != value_type(0))
375 template <
typename ValueT>
381 if (
a.val() != value_type(0))
387 template <
typename ValueT>
391 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
394 ValueT t =
a.val()*
a.val() + b.
val()*b.
val();
395 ValueT t1 = b.
val()/t;
396 ValueT t2 =
a.val()/t;
397 for (
int i=0; i<sz; i++)
401 else if (
a.hasFastAccess()) {
402 ValueT t1 = b.
val()/(
a.val()*
a.val() + b.
val()*b.
val());
403 for (
int i=0; i<sz; i++)
404 c.fastAccessDx(i) =
a.fastAccessDx(i)*t1;
407 ValueT t2 = -
a.val()/(
a.val()*
a.val() + b.
val()*b.
val());
408 for (
int i=0; i<sz; i++)
415 template <
typename ValueT>
423 template <
typename ValueT>
428 b/(
a.val()*
a.val() + b*b));
431 template <
typename ValueT>
435 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
438 if (
a.val() >= b.
val())
439 for (
int i=0; i<sz; i++)
440 c.fastAccessDx(i) =
a.fastAccessDx(i);
442 for (
int i=0; i<sz; i++)
445 else if (
a.hasFastAccess()) {
446 if (
a.val() >= b.
val())
447 for (
int i=0; i<sz; i++)
448 c.fastAccessDx(i) =
a.fastAccessDx(i);
450 for (
int i=0; i<sz; i++)
451 c.fastAccessDx(i) = 0.0;
454 if (
a.val() >= b.
val())
455 for (
int i=0; i<sz; i++)
456 c.fastAccessDx(i) = 0.0;
458 for (
int i=0; i<sz; i++)
465 template <
typename ValueT>
471 for (
int i=0; i<
c.size(); i++)
472 c.fastAccessDx(i) = 0.0;
474 for (
int i=0; i<
c.size(); i++)
480 template <
typename ValueT>
486 for (
int i=0; i<
c.size(); i++)
487 c.fastAccessDx(i) =
a.fastAccessDx(i);
489 for (
int i=0; i<
c.size(); i++)
490 c.fastAccessDx(i) = 0.0;
495 template <
typename ValueT>
499 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
502 if (
a.val() <= b.
val())
503 for (
int i=0; i<sz; i++)
504 c.fastAccessDx(i) =
a.fastAccessDx(i);
506 for (
int i=0; i<sz; i++)
509 else if (
a.hasFastAccess()) {
510 if (
a.val() <= b.
val())
511 for (
int i=0; i<sz; i++)
512 c.fastAccessDx(i) =
a.fastAccessDx(i);
514 for (
int i=0; i<sz; i++)
515 c.fastAccessDx(i) = 0.0;
518 if (
a.val() <= b.
val())
519 for (
int i=0; i<sz; i++)
520 c.fastAccessDx(i) = 0.0;
522 for (
int i=0; i<sz; i++)
529 template <
typename ValueT>
535 for (
int i=0; i<
c.size(); i++)
536 c.fastAccessDx(i) = 0.0;
538 for (
int i=0; i<
c.size(); i++)
544 template <
typename ValueT>
550 for (
int i=0; i<
c.size(); i++)
551 c.fastAccessDx(i) =
a.fastAccessDx(i);
553 for (
int i=0; i<
c.size(); i++)
554 c.fastAccessDx(i) = 0.0;
565 #define FAD_RELOP_MACRO(OP) \ 568 template <typename ValueT> \ 570 operator OP (const SimpleFad<ValueT>& a, \ 571 const SimpleFad<ValueT>& b) \ 573 return a.val() OP b.val(); \ 576 template <typename ValueT> \ 578 operator OP (const ValueT& a, \ 579 const SimpleFad<ValueT>& b) \ 581 return a OP b.val(); \ 584 template <typename ValueT> \ 586 operator OP (const SimpleFad<ValueT>& a, \ 589 return a.val() OP b; \ 605 #undef FAD_RELOP_MACRO 611 template <
typename ValueT>
626 template <
typename T>
628 bool is_zero = (x.
val() == 0.0);
629 for (
int i=0; i<x.
size(); i++)
630 is_zero = is_zero && (x.
dx(i) == 0.0);
638 #define FAD_BOOL_MACRO(OP) \ 641 template <typename T1, typename T2> \ 643 operator OP (const SimpleFad<T1>& expr1, \ 644 const SimpleFad<T2>& expr2) \ 646 return toBool(expr1) OP toBool(expr2); \ 649 template <typename T2> \ 651 operator OP (const typename SimpleFad<T2>::value_type& a, \ 652 const SimpleFad<T2>& expr2) \ 654 return a OP toBool(expr2); \ 657 template <typename T1> \ 659 operator OP (const SimpleFad<T1>& expr1, \ 660 const typename SimpleFad<T1>::value_type& b) \ 662 return toBool(expr1) OP b; \ 670 #undef FAD_BOOL_MACRO 678 template <
typename ValueT>
681 os << x.
val() <<
" [";
683 for (
int i=0; i< x.
size(); i++) {
684 os <<
" " << x.
dx(i);
695 #endif // SACADO_FAD_SIMPLEFADOPS_HPP
SimpleFad< ValueT > atan2(const SimpleFad< ValueT > &a, const typename SimpleFad< ValueT >::value_type &b)
KOKKOS_INLINE_FUNCTION bool operator!(const Expr< ExprT > &expr)
SimpleFad< ValueT > atan2(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > abs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sqrt(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > asin(const SimpleFad< ValueT > &a)
KOKKOS_INLINE_FUNCTION const ValueT & val() const
Returns value.
Forward-mode AD class using dynamic memory allocation but no expression templates.
KOKKOS_INLINE_FUNCTION int size() const
Returns number of derivative components.
SimpleFad< ValueT > acosh(const SimpleFad< ValueT > &a)
KOKKOS_INLINE_FUNCTION bool hasFastAccess() const
Returns true if derivative array is not empty.
KOKKOS_INLINE_FUNCTION mpl::enable_if_c< ExprLevel< Expr< T1 > >::value==ExprLevel< Expr< T2 > >::value, Expr< PowerOp< Expr< T1 >, Expr< T2 > > > >::type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
SimpleFad< ValueT > log(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const typename SimpleFad< ValueT >::value_type &b)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const typename SimpleFad< ValueT >::value_type &b)
SimpleFad< ValueT > exp(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan(const SimpleFad< ValueT > &a)
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
KOKKOS_INLINE_FUNCTION const ValueT * dx() const
Returns derivative array.
SimpleFad< ValueT > fabs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > pow(const SimpleFad< ValueT > &a, const typename SimpleFad< ValueT >::value_type &b)
SimpleFad< ValueT > log10(const SimpleFad< ValueT > &a)
#define FAD_RELOP_MACRO(OP)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > sin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atanh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sinh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator/(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
#define FAD_BOOL_MACRO(OP)
std::ostream & operator<<(std::ostream &os, const Expr< ExprT > &x)
GeneralFadType::value_type value_type
Typename of values.
SimpleFad< ValueT > tan(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > cos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > cosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator*(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > operator-(const SimpleFad< ValueT > &a)
KOKKOS_INLINE_FUNCTION bool toBool(const Expr< ExprT > &x)
KOKKOS_INLINE_FUNCTION ValueT & fastAccessDx(int i)
Returns derivative component i without bounds checking.
SimpleFad< ValueT > acos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tanh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > asinh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator+(const SimpleFad< ValueT > &a)