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>
71 1.0/(std::log(10.0)*
a.val()));
74 template <
typename ValueT>
82#ifdef HAVE_SACADO_CXX11
83 template <
typename ValueT>
85 cbrt(
const SimpleFad<ValueT>&
a) {
86 ValueT t1 = std::cbrt(
a.val());
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>
112 template <
typename ValueT>
116 -1.0/std::sqrt(1.0 -
a.val()*
a.val()));
119 template <
typename ValueT>
123 1.0/std::sqrt(1.0 -
a.val()*
a.val()));
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>
156 1.0/std::sqrt(
a.val()*
a.val()-1.0));
159 template <
typename ValueT>
163 1.0/std::sqrt(1.0 +
a.val()*
a.val()));
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();
197 if (
a.hasFastAccess() && b.hasFastAccess())
198 for (
int i=0;
i<sz;
i++)
199 c.fastAccessDx(
i) =
a.fastAccessDx(
i) + b.fastAccessDx(
i);
200 else if (
a.hasFastAccess())
201 for (
int i=0;
i<sz;
i++)
202 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
203 else if (b.hasFastAccess())
204 for (
int i=0;
i<sz;
i++)
205 c.fastAccessDx(
i) = b.fastAccessDx(
i);
210 template <
typename ValueT>
217 template <
typename ValueT>
224 template <
typename ValueT>
228 int sz =
a.size() >= b.size() ?
a.size() : b.size();
230 if (
a.hasFastAccess() && b.hasFastAccess())
231 for (
int i=0;
i<sz;
i++)
232 c.fastAccessDx(
i) =
a.fastAccessDx(
i) - b.fastAccessDx(
i);
233 else if (
a.hasFastAccess())
234 for (
int i=0;
i<sz;
i++)
235 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
236 else if (b.hasFastAccess())
237 for (
int i=0;
i<sz;
i++)
238 c.fastAccessDx(
i) = -b.fastAccessDx(
i);
243 template <
typename ValueT>
250 template <
typename ValueT>
257 template <
typename ValueT>
261 int sz =
a.size() >= b.size() ?
a.size() : b.size();
263 if (
a.hasFastAccess() && b.hasFastAccess())
264 for (
int i=0;
i<sz;
i++)
266 a.fastAccessDx(
i)*b.val() + b.fastAccessDx(
i)*
a.val();
267 else if (
a.hasFastAccess())
268 for (
int i=0;
i<sz;
i++)
269 c.fastAccessDx(
i) =
a.fastAccessDx(
i)*b.val();
270 else if (b.hasFastAccess())
271 for (
int i=0;
i<sz;
i++)
272 c.fastAccessDx(
i) = b.fastAccessDx(
i)*
a.val();
277 template <
typename ValueT>
284 template <
typename ValueT>
291 template <
typename ValueT>
295 int sz =
a.size() >= b.size() ?
a.size() : b.size();
297 if (
a.hasFastAccess() && b.hasFastAccess()) {
298 ValueT t = b.val()*b.val();
299 for (
int i=0;
i<sz;
i++)
301 (
a.fastAccessDx(
i)*b.val() - b.fastAccessDx(
i)*
a.val()) / t;
303 else if (
a.hasFastAccess())
304 for (
int i=0;
i<sz;
i++)
305 c.fastAccessDx(
i) =
a.fastAccessDx(
i)/b.val();
306 else if (b.hasFastAccess()) {
307 ValueT t = -
a.val()/(b.val()*b.val());
308 for (
int i=0;
i<sz;
i++)
309 c.fastAccessDx(
i) = b.fastAccessDx(
i)*t;
315 template <
typename ValueT>
322 template <
typename ValueT>
329 template <
typename ValueT>
333 int sz =
a.size() >= b.size() ?
a.size() : b.size();
336 if (
a.hasFastAccess() && b.hasFastAccess()) {
337 if (
a.val() != value_type(0)) {
340 for (
int i=0;
i<sz;
i++)
342 a.fastAccessDx(
i)*
t1 + b.fastAccessDx(
i)*
t2;
345 else if (
a.hasFastAccess()) {
346 if (b.val() == value_type(1)) {
347 for (
int i=0;
i<sz;
i++)
348 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
350 else if (
a.val() != value_type(0)) {
352 for (
int i=0;
i<sz;
i++)
353 c.fastAccessDx(
i) =
a.fastAccessDx(
i)*
t1;
356 else if (b.hasFastAccess()) {
357 if (
a.val() != value_type(0)) {
359 for (
int i=0;
i<sz;
i++)
360 c.fastAccessDx(
i) = b.fastAccessDx(
i)*
t2;
367 template <
typename ValueT>
372 ValueT t = std::pow(
a,b.val());
373 if (
a != value_type(0))
379 template <
typename ValueT>
384 ValueT t = std::pow(
a.val(),b);
385 if (b == value_type(1))
387 else if (
a.val() != value_type(0))
393 template <
typename ValueT>
397 int sz =
a.size() >= b.size() ?
a.size() : b.size();
399 if (
a.hasFastAccess() && b.hasFastAccess()) {
400 ValueT t =
a.val()*
a.val() + b.val()*b.val();
403 for (
int i=0;
i<sz;
i++)
405 a.fastAccessDx(
i)*
t1 - b.fastAccessDx(
i)*
t2;
407 else if (
a.hasFastAccess()) {
408 ValueT t1 = b.val()/(
a.val()*
a.val() + b.val()*b.val());
409 for (
int i=0;
i<sz;
i++)
410 c.fastAccessDx(
i) =
a.fastAccessDx(
i)*
t1;
412 else if (b.hasFastAccess()) {
413 ValueT t2 = -
a.val()/(
a.val()*
a.val() + b.val()*b.val());
414 for (
int i=0;
i<sz;
i++)
415 c.fastAccessDx(
i) = b.fastAccessDx(
i)*
t2;
421 template <
typename ValueT>
426 -
a/(
a*
a + b.val()*b.val()));
429 template <
typename ValueT>
434 b/(
a.val()*
a.val() + b*b));
437 template <
typename ValueT>
441 int sz =
a.size() >= b.size() ?
a.size() : b.size();
443 if (
a.hasFastAccess() && b.hasFastAccess()) {
444 if (
a.val() >= b.val())
445 for (
int i=0;
i<sz;
i++)
446 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
448 for (
int i=0;
i<sz;
i++)
449 c.fastAccessDx(
i) = b.fastAccessDx(
i);
451 else if (
a.hasFastAccess()) {
452 if (
a.val() >= b.val())
453 for (
int i=0;
i<sz;
i++)
454 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
456 for (
int i=0;
i<sz;
i++)
457 c.fastAccessDx(
i) = 0.0;
459 else if (b.hasFastAccess()) {
460 if (
a.val() >= b.val())
461 for (
int i=0;
i<sz;
i++)
462 c.fastAccessDx(
i) = 0.0;
464 for (
int i=0;
i<sz;
i++)
465 c.fastAccessDx(
i) = b.fastAccessDx(
i);
471 template <
typename ValueT>
477 for (
int i=0;
i<
c.size();
i++)
478 c.fastAccessDx(
i) = 0.0;
480 for (
int i=0;
i<
c.size();
i++)
481 c.fastAccessDx(
i) = b.fastAccessDx(
i);
486 template <
typename ValueT>
492 for (
int i=0;
i<
c.size();
i++)
493 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
495 for (
int i=0;
i<
c.size();
i++)
496 c.fastAccessDx(
i) = 0.0;
501 template <
typename ValueT>
505 int sz =
a.size() >= b.size() ?
a.size() : b.size();
507 if (
a.hasFastAccess() && b.hasFastAccess()) {
508 if (
a.val() <= b.val())
509 for (
int i=0;
i<sz;
i++)
510 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
512 for (
int i=0;
i<sz;
i++)
513 c.fastAccessDx(
i) = b.fastAccessDx(
i);
515 else if (
a.hasFastAccess()) {
516 if (
a.val() <= b.val())
517 for (
int i=0;
i<sz;
i++)
518 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
520 for (
int i=0;
i<sz;
i++)
521 c.fastAccessDx(
i) = 0.0;
523 else if (b.hasFastAccess()) {
524 if (
a.val() <= b.val())
525 for (
int i=0;
i<sz;
i++)
526 c.fastAccessDx(
i) = 0.0;
528 for (
int i=0;
i<sz;
i++)
529 c.fastAccessDx(
i) = b.fastAccessDx(
i);
535 template <
typename ValueT>
541 for (
int i=0;
i<
c.size();
i++)
542 c.fastAccessDx(
i) = 0.0;
544 for (
int i=0;
i<
c.size();
i++)
545 c.fastAccessDx(
i) = b.fastAccessDx(
i);
550 template <
typename ValueT>
556 for (
int i=0;
i<
c.size();
i++)
557 c.fastAccessDx(
i) =
a.fastAccessDx(
i);
559 for (
int i=0;
i<
c.size();
i++)
560 c.fastAccessDx(
i) = 0.0;
571#define FAD_RELOP_MACRO(OP) \
574 template <typename ValueT> \
576 operator OP (const SimpleFad<ValueT>& a, \
577 const SimpleFad<ValueT>& b) \
579 return a.val() OP b.val(); \
582 template <typename ValueT> \
584 operator OP (const ValueT& a, \
585 const SimpleFad<ValueT>& b) \
587 return a OP b.val(); \
590 template <typename ValueT> \
592 operator OP (const SimpleFad<ValueT>& a, \
595 return a.val() OP b; \
611#undef FAD_RELOP_MACRO
617 template <
typename ValueT>
632 template <
typename T>
635 for (
int i=0;
i<
x.size();
i++)
644#define FAD_BOOL_MACRO(OP) \
647 template <typename T1, typename T2> \
649 operator OP (const SimpleFad<T1>& expr1, \
650 const SimpleFad<T2>& expr2) \
652 return toBool(expr1) OP toBool(expr2); \
655 template <typename T2> \
657 operator OP (const typename SimpleFad<T2>::value_type& a, \
658 const SimpleFad<T2>& expr2) \
660 return a OP toBool(expr2); \
663 template <typename T1> \
665 operator OP (const SimpleFad<T1>& expr1, \
666 const typename SimpleFad<T1>::value_type& b) \
668 return toBool(expr1) OP b; \
684 template <
typename ValueT>
687 os <<
x.val() <<
" [";
689 for (
int i=0;
i<
x.size();
i++) {
690 os <<
" " <<
x.dx(
i);
#define FAD_RELOP_MACRO(OP)
#define FAD_BOOL_MACRO(OP)
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
Fad specializations for Teuchos::BLAS wrappers.
SACADO_INLINE_FUNCTION const T & val() const
Returns value.
GeneralFadType::value_type value_type
Typename of values.
SimpleFad< ValueT > operator-(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > fabs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atan2(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > cosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tanh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > acosh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > log(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > asinh(const SimpleFad< ValueT > &a)
std::ostream & operator<<(std::ostream &os, const Expr< ExprT > &x)
SimpleFad< ValueT > asin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sqrt(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > acos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator*(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > abs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator/(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SimpleFad< ValueT > log10(const SimpleFad< ValueT > &a)
SACADO_INLINE_FUNCTION bool toBool(const Expr< ExprT > &x)
SimpleFad< ValueT > exp(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sin(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > cos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > sinh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tan(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator+(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > atanh(const SimpleFad< ValueT > &a)
SACADO_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)
SACADO_INLINE_FUNCTION bool operator!(const Expr< ExprT > &expr)