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>
153 template <
typename ValueT>
160 template <
typename ValueT>
167 template <
typename ValueT>
171 1.0 /(1.0 -
a.val()*
a.val()));
174 template <
typename ValueT>
183 template <
typename ValueT>
192 template <
typename ValueT>
196 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
199 for (
int i=0; i<sz; i++)
201 else if (
a.hasFastAccess())
202 for (
int i=0; i<sz; i++)
203 c.fastAccessDx(i) =
a.fastAccessDx(i);
205 for (
int i=0; i<sz; i++)
211 template <
typename ValueT>
218 template <
typename ValueT>
225 template <
typename ValueT>
229 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
232 for (
int i=0; i<sz; i++)
234 else if (
a.hasFastAccess())
235 for (
int i=0; i<sz; i++)
236 c.fastAccessDx(i) =
a.fastAccessDx(i);
238 for (
int i=0; i<sz; i++)
244 template <
typename ValueT>
251 template <
typename ValueT>
258 template <
typename ValueT>
262 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
265 for (
int i=0; i<sz; i++)
268 else if (
a.hasFastAccess())
269 for (
int i=0; i<sz; i++)
270 c.fastAccessDx(i) =
a.fastAccessDx(i)*b.
val();
272 for (
int i=0; i<sz; i++)
278 template <
typename ValueT>
285 template <
typename ValueT>
292 template <
typename ValueT>
296 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
299 ValueT t = b.
val()*b.
val();
300 for (
int i=0; i<sz; i++)
304 else if (
a.hasFastAccess())
305 for (
int i=0; i<sz; i++)
306 c.fastAccessDx(i) =
a.fastAccessDx(i)/b.
val();
308 ValueT t = -
a.val()/(b.
val()*b.
val());
309 for (
int i=0; i<sz; i++)
316 template <
typename ValueT>
323 template <
typename ValueT>
330 template <
typename ValueT>
334 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
338 if (
a.val() != value_type(0)) {
339 ValueT t1 =
c.val()*b.
val()/
a.val();
341 for (
int i=0; i<sz; i++)
346 else if (
a.hasFastAccess()) {
347 if (
a.val() != value_type(0)) {
348 ValueT t1 =
c.val()*b.
val()/
a.val();
349 for (
int i=0; i<sz; i++)
350 c.fastAccessDx(i) =
a.fastAccessDx(i)*t1;
354 if (
a.val() != value_type(0)) {
356 for (
int i=0; i<sz; i++)
364 template <
typename ValueT>
370 if (
a != value_type(0))
376 template <
typename ValueT>
382 if (
a.val() != value_type(0))
388 template <
typename ValueT>
392 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
395 ValueT t =
a.val()*
a.val() + b.
val()*b.
val();
396 ValueT t1 = b.
val()/t;
397 ValueT t2 =
a.val()/t;
398 for (
int i=0; i<sz; i++)
402 else if (
a.hasFastAccess()) {
403 ValueT t1 = b.
val()/(
a.val()*
a.val() + b.
val()*b.
val());
404 for (
int i=0; i<sz; i++)
405 c.fastAccessDx(i) =
a.fastAccessDx(i)*t1;
408 ValueT t2 = -
a.val()/(
a.val()*
a.val() + b.
val()*b.
val());
409 for (
int i=0; i<sz; i++)
416 template <
typename ValueT>
424 template <
typename ValueT>
429 b/(
a.val()*
a.val() + b*b));
432 template <
typename ValueT>
436 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
439 if (
a.val() >= b.
val())
440 for (
int i=0; i<sz; i++)
441 c.fastAccessDx(i) =
a.fastAccessDx(i);
443 for (
int i=0; i<sz; i++)
446 else if (
a.hasFastAccess()) {
447 if (
a.val() >= b.
val())
448 for (
int i=0; i<sz; i++)
449 c.fastAccessDx(i) =
a.fastAccessDx(i);
451 for (
int i=0; i<sz; i++)
452 c.fastAccessDx(i) = 0.0;
455 if (
a.val() >= b.
val())
456 for (
int i=0; i<sz; i++)
457 c.fastAccessDx(i) = 0.0;
459 for (
int i=0; i<sz; i++)
466 template <
typename ValueT>
472 for (
int i=0; i<
c.size(); i++)
473 c.fastAccessDx(i) = 0.0;
475 for (
int i=0; i<
c.size(); i++)
481 template <
typename ValueT>
487 for (
int i=0; i<
c.size(); i++)
488 c.fastAccessDx(i) =
a.fastAccessDx(i);
490 for (
int i=0; i<
c.size(); i++)
491 c.fastAccessDx(i) = 0.0;
496 template <
typename ValueT>
500 int sz =
a.size() >= b.
size() ?
a.size() : b.
size();
503 if (
a.val() <= b.
val())
504 for (
int i=0; i<sz; i++)
505 c.fastAccessDx(i) =
a.fastAccessDx(i);
507 for (
int i=0; i<sz; i++)
510 else if (
a.hasFastAccess()) {
511 if (
a.val() <= b.
val())
512 for (
int i=0; i<sz; i++)
513 c.fastAccessDx(i) =
a.fastAccessDx(i);
515 for (
int i=0; i<sz; i++)
516 c.fastAccessDx(i) = 0.0;
519 if (
a.val() <= b.
val())
520 for (
int i=0; i<sz; i++)
521 c.fastAccessDx(i) = 0.0;
523 for (
int i=0; i<sz; i++)
530 template <
typename ValueT>
536 for (
int i=0; i<
c.size(); i++)
537 c.fastAccessDx(i) = 0.0;
539 for (
int i=0; i<
c.size(); i++)
545 template <
typename ValueT>
551 for (
int i=0; i<
c.size(); i++)
552 c.fastAccessDx(i) =
a.fastAccessDx(i);
554 for (
int i=0; i<
c.size(); i++)
555 c.fastAccessDx(i) = 0.0;
566 #define FAD_RELOP_MACRO(OP) \ 569 template <typename ValueT> \ 571 operator OP (const SimpleFad<ValueT>& a, \ 572 const SimpleFad<ValueT>& b) \ 574 return a.val() OP b.val(); \ 577 template <typename ValueT> \ 579 operator OP (const ValueT& a, \ 580 const SimpleFad<ValueT>& b) \ 582 return a OP b.val(); \ 585 template <typename ValueT> \ 587 operator OP (const SimpleFad<ValueT>& a, \ 590 return a.val() OP b; \ 606 #undef FAD_RELOP_MACRO 612 template <
typename ValueT>
627 template <
typename T>
629 bool is_zero = (x.
val() == 0.0);
630 for (
int i=0; i<x.
size(); i++)
631 is_zero = is_zero && (x.
dx(i) == 0.0);
639 #define FAD_BOOL_MACRO(OP) \ 642 template <typename T1, typename T2> \ 644 operator OP (const SimpleFad<T1>& expr1, \ 645 const SimpleFad<T2>& expr2) \ 647 return toBool(expr1) OP toBool(expr2); \ 650 template <typename T2> \ 652 operator OP (const typename SimpleFad<T2>::value_type& a, \ 653 const SimpleFad<T2>& expr2) \ 655 return a OP toBool(expr2); \ 658 template <typename T1> \ 660 operator OP (const SimpleFad<T1>& expr1, \ 661 const typename SimpleFad<T1>::value_type& b) \ 663 return toBool(expr1) OP b; \ 671 #undef FAD_BOOL_MACRO 679 template <
typename ValueT>
682 os << x.
val() <<
" [";
684 for (
int i=0; i< x.
size(); i++) {
685 os <<
" " << x.
dx(i);
696 #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.
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)
SimpleFad< ValueT > pow(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
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)