Sacado Package Browser (Single Doxygen Collection)  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Sacado_Fad_SimpleFadOps.hpp
Go to the documentation of this file.
1 // $Id$
2 // $Source$
3 // @HEADER
4 // ***********************************************************************
5 //
6 // Sacado Package
7 // Copyright (2006) Sandia Corporation
8 //
9 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
10 // the U.S. Government retains certain rights in this software.
11 //
12 // This library is free software; you can redistribute it and/or modify
13 // it under the terms of the GNU Lesser General Public License as
14 // published by the Free Software Foundation; either version 2.1 of the
15 // License, or (at your option) any later version.
16 //
17 // This library is distributed in the hope that it will be useful, but
18 // WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 // Lesser General Public License for more details.
21 //
22 // You should have received a copy of the GNU Lesser General Public
23 // License along with this library; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
25 // USA
26 // Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
27 // (etphipp@sandia.gov).
28 //
29 // ***********************************************************************
30 // @HEADER
31 
32 #ifndef SACADO_FAD_SIMPLEFADOPS_HPP
33 #define SACADO_FAD_SIMPLEFADOPS_HPP
34 
35 #include "Sacado_cmath.hpp"
36 #include <ostream> // for std::ostream
37 
38 namespace Sacado {
39 
40  namespace Fad {
41 
42  template <typename ValueT>
43  SimpleFad<ValueT>
45  return a;
46  }
47 
48  template <typename ValueT>
49  SimpleFad<ValueT>
51  return SimpleFad<ValueT>(a, -a.val(), -1.0);
52  }
53 
54  template <typename ValueT>
55  SimpleFad<ValueT>
57  ValueT t1 = std::exp(a.val());
58  return SimpleFad<ValueT>(a, t1, t1);
59  }
60 
61  template <typename ValueT>
62  SimpleFad<ValueT>
64  return SimpleFad<ValueT>(a, std::log(a.val()), 1.0/a.val());
65  }
66 
67  template <typename ValueT>
68  SimpleFad<ValueT>
70  return SimpleFad<ValueT>(a, std::log10(a.val()),
71  1.0/(std::log(10.0)*a.val()));
72  }
73 
74  template <typename ValueT>
75  SimpleFad<ValueT>
77  ValueT t1 = std::sqrt(a.val());
78  ValueT t2 = 1.0/(2.0*t1);
79  return SimpleFad<ValueT>(a, t1, t2);
80  }
81 
82 #ifdef HAVE_SACADO_CXX11
83  template <typename ValueT>
84  SimpleFad<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);
89  }
90 #endif
91 
92  template <typename ValueT>
93  SimpleFad<ValueT>
94  cos(const SimpleFad<ValueT>& a) {
95  return SimpleFad<ValueT>(a, std::cos(a.val()), -std::sin(a.val()));
96  }
97 
98  template <typename ValueT>
99  SimpleFad<ValueT>
100  sin(const SimpleFad<ValueT>& a) {
101  return SimpleFad<ValueT>(a, std::sin(a.val()), std::cos(a.val()));
102  }
103 
104  template <typename ValueT>
105  SimpleFad<ValueT>
106  tan(const SimpleFad<ValueT>& a) {
107  ValueT t1 = std::tan(a.val());
108  ValueT t2 = 1.0 + t1*t1;
109  return SimpleFad<ValueT>(a, t1, t2);
110  }
111 
112  template <typename ValueT>
113  SimpleFad<ValueT>
115  return SimpleFad<ValueT>(a, std::acos(a.val()),
116  -1.0/std::sqrt(1.0 - a.val()*a.val()));
117  }
118 
119  template <typename ValueT>
120  SimpleFad<ValueT>
122  return SimpleFad<ValueT>(a, std::asin(a.val()),
123  1.0/std::sqrt(1.0 - a.val()*a.val()));
124  }
125 
126  template <typename ValueT>
127  SimpleFad<ValueT>
129  return SimpleFad<ValueT>(a, std::atan(a.val()),
130  1.0/(1.0 + a.val()*a.val()));
131  }
132 
133  template <typename ValueT>
134  SimpleFad<ValueT>
136  return SimpleFad<ValueT>(a, std::cosh(a.val()), std::sinh(a.val()));
137  }
138 
139  template <typename ValueT>
140  SimpleFad<ValueT>
142  return SimpleFad<ValueT>(a, std::sinh(a.val()), std::cosh(a.val()));
143  }
144 
145  template <typename ValueT>
146  SimpleFad<ValueT>
148  ValueT t = std::tanh(a.val());
149  return SimpleFad<ValueT>(a, t, 1-t*t);
150  }
151 
152  template <typename ValueT>
153  SimpleFad<ValueT>
155  return SimpleFad<ValueT>(a, std::acosh(a.val()),
156  1.0/std::sqrt(a.val()*a.val()-1.0));
157  }
158 
159  template <typename ValueT>
160  SimpleFad<ValueT>
162  return SimpleFad<ValueT>(a, std::asinh(a.val()),
163  1.0/std::sqrt(1.0 + a.val()*a.val()));
164  }
165 
166  template <typename ValueT>
167  SimpleFad<ValueT>
169  return SimpleFad<ValueT>(a, std::atanh(a.val()),
170  1.0 /(1.0 - a.val()*a.val()));
171  }
172 
173  template <typename ValueT>
174  SimpleFad<ValueT>
175  abs(const SimpleFad<ValueT>& a) {
176  ValueT t = 1.0;
177  if (a.val() < 0)
178  t = -1.0;
179  return SimpleFad<ValueT>(a, std::abs(a.val()), t);
180  }
181 
182  template <typename ValueT>
183  SimpleFad<ValueT>
185  ValueT t = 1.0;
186  if (a.val() < 0)
187  t = -1.0;
188  return SimpleFad<ValueT>(a, std::fabs(a.val()), t);
189  }
190 
191  template <typename ValueT>
192  SimpleFad<ValueT>
194  const SimpleFad<ValueT>& b) {
195  int sz = a.size() >= b.size() ? a.size() : b.size();
196  SimpleFad<ValueT> c(sz, a.val() + b.val());
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);
206 
207  return c;
208  }
209 
210  template <typename ValueT>
211  SimpleFad<ValueT>
213  const SimpleFad<ValueT>& b) {
214  return SimpleFad<ValueT>(b, a+b.val(), 1.0);
215  }
216 
217  template <typename ValueT>
218  SimpleFad<ValueT>
220  const typename SimpleFad<ValueT>::value_type& b) {
221  return SimpleFad<ValueT>(a, a.val()+b, 1.0);
222  }
223 
224  template <typename ValueT>
225  SimpleFad<ValueT>
227  const SimpleFad<ValueT>& b) {
228  int sz = a.size() >= b.size() ? a.size() : b.size();
229  SimpleFad<ValueT> c(sz, a.val() - b.val());
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);
239 
240  return c;
241  }
242 
243  template <typename ValueT>
244  SimpleFad<ValueT>
246  const SimpleFad<ValueT>& b) {
247  return SimpleFad<ValueT>(b, a-b.val(), -1.0);
248  }
249 
250  template <typename ValueT>
251  SimpleFad<ValueT>
253  const typename SimpleFad<ValueT>::value_type& b) {
254  return SimpleFad<ValueT>(a, a.val()-b, 1.0);
255  }
256 
257  template <typename ValueT>
258  SimpleFad<ValueT>
260  const SimpleFad<ValueT>& b) {
261  int sz = a.size() >= b.size() ? a.size() : b.size();
262  SimpleFad<ValueT> c(sz, a.val() * b.val());
263  if (a.hasFastAccess() && b.hasFastAccess())
264  for (int i=0; i<sz; i++)
265  c.fastAccessDx(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();
273 
274  return c;
275  }
276 
277  template <typename ValueT>
278  SimpleFad<ValueT>
280  const SimpleFad<ValueT>& b) {
281  return SimpleFad<ValueT>(b, a*b.val(), a);
282  }
283 
284  template <typename ValueT>
285  SimpleFad<ValueT>
287  const typename SimpleFad<ValueT>::value_type& b) {
288  return SimpleFad<ValueT>(a, a.val()*b, b);
289  }
290 
291  template <typename ValueT>
292  SimpleFad<ValueT>
294  const SimpleFad<ValueT>& b) {
295  int sz = a.size() >= b.size() ? a.size() : b.size();
296  SimpleFad<ValueT> c(sz, a.val() / b.val());
297  if (a.hasFastAccess() && b.hasFastAccess()) {
298  ValueT t = b.val()*b.val();
299  for (int i=0; i<sz; i++)
300  c.fastAccessDx(i) =
301  (a.fastAccessDx(i)*b.val() - b.fastAccessDx(i)*a.val()) / t;
302  }
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;
310  }
311 
312  return c;
313  }
314 
315  template <typename ValueT>
316  SimpleFad<ValueT>
318  const SimpleFad<ValueT>& b) {
319  return SimpleFad<ValueT>(b, a/b.val(), -a/(b.val()*b.val()));
320  }
321 
322  template <typename ValueT>
323  SimpleFad<ValueT>
325  const typename SimpleFad<ValueT>::value_type& b) {
326  return SimpleFad<ValueT>(a, a.val()/b, 1.0/b);
327  }
328 
329  template <typename ValueT>
330  SimpleFad<ValueT>
332  const SimpleFad<ValueT>& b) {
333  int sz = a.size() >= b.size() ? a.size() : b.size();
334  SimpleFad<ValueT> c(sz, std::pow(a.val(), b.val()));
335  typedef typename SimpleFad<ValueT>::value_type value_type;
336  if (a.hasFastAccess() && b.hasFastAccess()) {
337  if (a.val() != value_type(0)) {
338  ValueT t1 = c.val()*b.val()/a.val();
339  ValueT t2 = c.val()*std::log(a.val());
340  for (int i=0; i<sz; i++)
341  c.fastAccessDx(i) =
342  a.fastAccessDx(i)*t1 + b.fastAccessDx(i)*t2;
343  }
344  }
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;
350  }
351  }
352  else if (b.hasFastAccess()) {
353  if (a.val() != value_type(0)) {
354  ValueT t2 = c.val()*std::log(a.val());
355  for (int i=0; i<sz; i++)
356  c.fastAccessDx(i) = b.fastAccessDx(i)*t2;
357  }
358  }
359 
360  return c;
361  }
362 
363  template <typename ValueT>
364  SimpleFad<ValueT>
365  pow(const typename SimpleFad<ValueT>::value_type& a,
366  const SimpleFad<ValueT>& b) {
367  typedef typename SimpleFad<ValueT>::value_type value_type;
368  ValueT t = std::pow(a,b.val());
369  if (a != value_type(0))
370  return SimpleFad<ValueT>(b, t, t*std::log(a));
371  else
372  return SimpleFad<ValueT>(b, t, value_type(0));
373  }
374 
375  template <typename ValueT>
376  SimpleFad<ValueT>
378  const typename SimpleFad<ValueT>::value_type& b) {
379  typedef typename SimpleFad<ValueT>::value_type value_type;
380  ValueT t = std::pow(a.val(),b);
381  if (a.val() != value_type(0))
382  return SimpleFad<ValueT>(a, t, t*b/a.val());
383  else
384  return SimpleFad<ValueT>(a, t, value_type(0));
385  }
386 
387  template <typename ValueT>
388  SimpleFad<ValueT>
390  const SimpleFad<ValueT>& b) {
391  int sz = a.size() >= b.size() ? a.size() : b.size();
392  SimpleFad<ValueT> c(sz, std::atan2(a.val(), b.val()));
393  if (a.hasFastAccess() && b.hasFastAccess()) {
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++)
398  c.fastAccessDx(i) =
399  a.fastAccessDx(i)*t1 - b.fastAccessDx(i)*t2;
400  }
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;
405  }
406  else if (b.hasFastAccess()) {
407  ValueT t2 = -a.val()/(a.val()*a.val() + b.val()*b.val());
408  for (int i=0; i<sz; i++)
409  c.fastAccessDx(i) = b.fastAccessDx(i)*t2;
410  }
411 
412  return c;
413  }
414 
415  template <typename ValueT>
416  SimpleFad<ValueT>
418  const SimpleFad<ValueT>& b) {
419  return SimpleFad<ValueT>(b, std::atan2(a,b.val()),
420  -a/(a*a + b.val()*b.val()));
421  }
422 
423  template <typename ValueT>
424  SimpleFad<ValueT>
426  const typename SimpleFad<ValueT>::value_type& b) {
427  return SimpleFad<ValueT>(a, std::atan2(a.val(),b),
428  b/(a.val()*a.val() + b*b));
429  }
430 
431  template <typename ValueT>
432  SimpleFad<ValueT>
434  const SimpleFad<ValueT>& b) {
435  int sz = a.size() >= b.size() ? a.size() : b.size();
436  SimpleFad<ValueT> c(sz, std::max(a.val(), b.val()));
437  if (a.hasFastAccess() && b.hasFastAccess()) {
438  if (a.val() >= b.val())
439  for (int i=0; i<sz; i++)
440  c.fastAccessDx(i) = a.fastAccessDx(i);
441  else
442  for (int i=0; i<sz; i++)
443  c.fastAccessDx(i) = b.fastAccessDx(i);
444  }
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);
449  else
450  for (int i=0; i<sz; i++)
451  c.fastAccessDx(i) = 0.0;
452  }
453  else if (b.hasFastAccess()) {
454  if (a.val() >= b.val())
455  for (int i=0; i<sz; i++)
456  c.fastAccessDx(i) = 0.0;
457  else
458  for (int i=0; i<sz; i++)
459  c.fastAccessDx(i) = b.fastAccessDx(i);
460  }
461 
462  return c;
463  }
464 
465  template <typename ValueT>
466  SimpleFad<ValueT>
467  max(const typename SimpleFad<ValueT>::value_type& a,
468  const SimpleFad<ValueT>& b) {
469  SimpleFad<ValueT> c(b.size(), std::max(a, b.val()));
470  if (a >= b.val())
471  for (int i=0; i<c.size(); i++)
472  c.fastAccessDx(i) = 0.0;
473  else
474  for (int i=0; i<c.size(); i++)
475  c.fastAccessDx(i) = b.fastAccessDx(i);
476 
477  return c;
478  }
479 
480  template <typename ValueT>
481  SimpleFad<ValueT>
483  const typename SimpleFad<ValueT>::value_type& b) {
484  SimpleFad<ValueT> c(a.size(), std::max(a.val(), b));
485  if (a.val() >= b)
486  for (int i=0; i<c.size(); i++)
487  c.fastAccessDx(i) = a.fastAccessDx(i);
488  else
489  for (int i=0; i<c.size(); i++)
490  c.fastAccessDx(i) = 0.0;
491 
492  return c;
493  }
494 
495  template <typename ValueT>
496  SimpleFad<ValueT>
498  const SimpleFad<ValueT>& b) {
499  int sz = a.size() >= b.size() ? a.size() : b.size();
500  SimpleFad<ValueT> c(sz, std::min(a.val(), b.val()));
501  if (a.hasFastAccess() && b.hasFastAccess()) {
502  if (a.val() <= b.val())
503  for (int i=0; i<sz; i++)
504  c.fastAccessDx(i) = a.fastAccessDx(i);
505  else
506  for (int i=0; i<sz; i++)
507  c.fastAccessDx(i) = b.fastAccessDx(i);
508  }
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);
513  else
514  for (int i=0; i<sz; i++)
515  c.fastAccessDx(i) = 0.0;
516  }
517  else if (b.hasFastAccess()) {
518  if (a.val() <= b.val())
519  for (int i=0; i<sz; i++)
520  c.fastAccessDx(i) = 0.0;
521  else
522  for (int i=0; i<sz; i++)
523  c.fastAccessDx(i) = b.fastAccessDx(i);
524  }
525 
526  return c;
527  }
528 
529  template <typename ValueT>
530  SimpleFad<ValueT>
531  min(const typename SimpleFad<ValueT>::value_type& a,
532  const SimpleFad<ValueT>& b) {
533  SimpleFad<ValueT> c(b.size(), std::min(a, b.val()));
534  if (a <= b.val())
535  for (int i=0; i<c.size(); i++)
536  c.fastAccessDx(i) = 0.0;
537  else
538  for (int i=0; i<c.size(); i++)
539  c.fastAccessDx(i) = b.fastAccessDx(i);
540 
541  return c;
542  }
543 
544  template <typename ValueT>
545  SimpleFad<ValueT>
547  const typename SimpleFad<ValueT>::value_type& b) {
548  SimpleFad<ValueT> c(a.size(), std::min(a.val(), b));
549  if (a.val() <= b)
550  for (int i=0; i<c.size(); i++)
551  c.fastAccessDx(i) = a.fastAccessDx(i);
552  else
553  for (int i=0; i<c.size(); i++)
554  c.fastAccessDx(i) = 0.0;
555 
556  return c;
557  }
558 
559  } // namespace Fad
560 
561 } // namespace Sacado
562 
563  //-------------------------- Relational Operators -----------------------
564 
565 #define FAD_RELOP_MACRO(OP) \
566 namespace Sacado { \
567  namespace Fad { \
568  template <typename ValueT> \
569  inline bool \
570  operator OP (const SimpleFad<ValueT>& a, \
571  const SimpleFad<ValueT>& b) \
572  { \
573  return a.val() OP b.val(); \
574  } \
575  \
576  template <typename ValueT> \
577  inline bool \
578  operator OP (const ValueT& a, \
579  const SimpleFad<ValueT>& b) \
580  { \
581  return a OP b.val(); \
582  } \
583  \
584  template <typename ValueT> \
585  inline bool \
586  operator OP (const SimpleFad<ValueT>& a, \
587  const ValueT& b) \
588  { \
589  return a.val() OP b; \
590  } \
591  } \
592 }
593 
594 FAD_RELOP_MACRO(==)
595 FAD_RELOP_MACRO(!=)
598 FAD_RELOP_MACRO(<=)
599 FAD_RELOP_MACRO(>=)
600 FAD_RELOP_MACRO(<<=)
601 FAD_RELOP_MACRO(>>=)
604 
605 #undef FAD_RELOP_MACRO
606 
607 namespace Sacado {
608 
609  namespace Fad {
610 
611  template <typename ValueT>
612  inline bool operator ! (const SimpleFad<ValueT>& a)
613  {
614  return ! a.val();
615  }
616 
617  } // namespace Fad
618 
619 } // namespace Sacado
620 
621 //-------------------------- Boolean Operators -----------------------
622 namespace Sacado {
623 
624  namespace Fad {
625 
626  template <typename T>
627  bool toBool(const SimpleFad<T>& x) {
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);
631  return !is_zero;
632  }
633 
634  } // namespace Fad
635 
636 } // namespace Sacado
637 
638 #define FAD_BOOL_MACRO(OP) \
639 namespace Sacado { \
640  namespace Fad { \
641  template <typename T1, typename T2> \
642  inline bool \
643  operator OP (const SimpleFad<T1>& expr1, \
644  const SimpleFad<T2>& expr2) \
645  { \
646  return toBool(expr1) OP toBool(expr2); \
647  } \
648  \
649  template <typename T2> \
650  inline bool \
651  operator OP (const typename SimpleFad<T2>::value_type& a, \
652  const SimpleFad<T2>& expr2) \
653  { \
654  return a OP toBool(expr2); \
655  } \
656  \
657  template <typename T1> \
658  inline bool \
659  operator OP (const SimpleFad<T1>& expr1, \
660  const typename SimpleFad<T1>::value_type& b) \
661  { \
662  return toBool(expr1) OP b; \
663  } \
664  } \
665 }
666 
667 FAD_BOOL_MACRO(&&)
668 FAD_BOOL_MACRO(||)
669 
670 #undef FAD_BOOL_MACRO
671 
672 //-------------------------- I/O Operators -----------------------
673 
674 namespace Sacado {
675 
676  namespace Fad {
677 
678  template <typename ValueT>
679  std::ostream& operator << (std::ostream& os,
680  const SimpleFad<ValueT>& x) {
681  os << x.val() << " [";
682 
683  for (int i=0; i< x.size(); i++) {
684  os << " " << x.dx(i);
685  }
686 
687  os << " ]";
688  return os;
689  }
690 
691  } // namespace Fad
692 
693 } // namespace Sacado
694 
695 #endif // SACADO_FAD_SIMPLEFADOPS_HPP
cbrt(expr.val())
KOKKOS_INLINE_FUNCTION int size() const
Returns number of derivative components.
asin(expr.val())
cosh(expr.val())
abs(expr.val())
KOKKOS_INLINE_FUNCTION const ValueT & val() const
Returns value.
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)
atan(expr.val())
Forward-mode AD class using dynamic memory allocation but no expression templates.
SimpleFad< ValueT > acosh(const SimpleFad< ValueT > &a)
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 > exp(const SimpleFad< ValueT > &a)
tanh(expr.val())
SimpleFad< ValueT > atan(const SimpleFad< ValueT > &a)
KOKKOS_INLINE_FUNCTION const ValueT * dx() const
Returns derivative array.
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
SimpleFad< ValueT > fabs(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > log10(const SimpleFad< ValueT > &a)
#define FAD_RELOP_MACRO(OP)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
sqrt(expr.val())
sinh(expr.val())
tan(expr.val())
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)
atan2(expr1.val(), expr2.val())
#define FAD_BOOL_MACRO(OP)
sin(expr.val())
KOKKOS_INLINE_FUNCTION bool hasFastAccess() const
Returns true if derivative array is not empty.
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)
log(expr.val())
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)
acos(expr.val())
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)
exp(expr.val())
KOKKOS_INLINE_FUNCTION ValueT & fastAccessDx(int i)
Returns derivative component i without bounds checking.
fabs(expr.val())
SimpleFad< ValueT > acos(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > tanh(const SimpleFad< ValueT > &a)
log10(expr.val())
cos(expr.val())
SimpleFad< ValueT > asinh(const SimpleFad< ValueT > &a)
SimpleFad< ValueT > operator+(const SimpleFad< ValueT > &a)