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::cosh(a.val());
149  t = 1.0/(t*t);
150  return SimpleFad<ValueT>(a, std::tanh(a.val()), t);
151  }
152 
153  template <typename ValueT>
154  SimpleFad<ValueT>
156  return SimpleFad<ValueT>(a, std::acosh(a.val()),
157  1.0/std::sqrt(a.val()*a.val()-1.0));
158  }
159 
160  template <typename ValueT>
161  SimpleFad<ValueT>
163  return SimpleFad<ValueT>(a, std::asinh(a.val()),
164  1.0/std::sqrt(1.0 + a.val()*a.val()));
165  }
166 
167  template <typename ValueT>
168  SimpleFad<ValueT>
170  return SimpleFad<ValueT>(a, std::atanh(a.val()),
171  1.0 /(1.0 - a.val()*a.val()));
172  }
173 
174  template <typename ValueT>
175  SimpleFad<ValueT>
176  abs(const SimpleFad<ValueT>& a) {
177  ValueT t = 1.0;
178  if (a.val() < 0)
179  t = -1.0;
180  return SimpleFad<ValueT>(a, std::abs(a.val()), t);
181  }
182 
183  template <typename ValueT>
184  SimpleFad<ValueT>
186  ValueT t = 1.0;
187  if (a.val() < 0)
188  t = -1.0;
189  return SimpleFad<ValueT>(a, std::fabs(a.val()), t);
190  }
191 
192  template <typename ValueT>
193  SimpleFad<ValueT>
195  const SimpleFad<ValueT>& b) {
196  int sz = a.size() >= b.size() ? a.size() : b.size();
197  SimpleFad<ValueT> c(sz, a.val() + b.val());
198  if (a.hasFastAccess() && b.hasFastAccess())
199  for (int i=0; i<sz; i++)
200  c.fastAccessDx(i) = a.fastAccessDx(i) + b.fastAccessDx(i);
201  else if (a.hasFastAccess())
202  for (int i=0; i<sz; i++)
203  c.fastAccessDx(i) = a.fastAccessDx(i);
204  else if (b.hasFastAccess())
205  for (int i=0; i<sz; i++)
206  c.fastAccessDx(i) = b.fastAccessDx(i);
207 
208  return c;
209  }
210 
211  template <typename ValueT>
212  SimpleFad<ValueT>
214  const SimpleFad<ValueT>& b) {
215  return SimpleFad<ValueT>(b, a+b.val(), 1.0);
216  }
217 
218  template <typename ValueT>
219  SimpleFad<ValueT>
221  const typename SimpleFad<ValueT>::value_type& b) {
222  return SimpleFad<ValueT>(a, a.val()+b, 1.0);
223  }
224 
225  template <typename ValueT>
226  SimpleFad<ValueT>
228  const SimpleFad<ValueT>& b) {
229  int sz = a.size() >= b.size() ? a.size() : b.size();
230  SimpleFad<ValueT> c(sz, a.val() - b.val());
231  if (a.hasFastAccess() && b.hasFastAccess())
232  for (int i=0; i<sz; i++)
233  c.fastAccessDx(i) = a.fastAccessDx(i) - b.fastAccessDx(i);
234  else if (a.hasFastAccess())
235  for (int i=0; i<sz; i++)
236  c.fastAccessDx(i) = a.fastAccessDx(i);
237  else if (b.hasFastAccess())
238  for (int i=0; i<sz; i++)
239  c.fastAccessDx(i) = -b.fastAccessDx(i);
240 
241  return c;
242  }
243 
244  template <typename ValueT>
245  SimpleFad<ValueT>
247  const SimpleFad<ValueT>& b) {
248  return SimpleFad<ValueT>(b, a-b.val(), -1.0);
249  }
250 
251  template <typename ValueT>
252  SimpleFad<ValueT>
254  const typename SimpleFad<ValueT>::value_type& b) {
255  return SimpleFad<ValueT>(a, a.val()-b, 1.0);
256  }
257 
258  template <typename ValueT>
259  SimpleFad<ValueT>
261  const SimpleFad<ValueT>& b) {
262  int sz = a.size() >= b.size() ? a.size() : b.size();
263  SimpleFad<ValueT> c(sz, a.val() * b.val());
264  if (a.hasFastAccess() && b.hasFastAccess())
265  for (int i=0; i<sz; i++)
266  c.fastAccessDx(i) =
267  a.fastAccessDx(i)*b.val() + b.fastAccessDx(i)*a.val();
268  else if (a.hasFastAccess())
269  for (int i=0; i<sz; i++)
270  c.fastAccessDx(i) = a.fastAccessDx(i)*b.val();
271  else if (b.hasFastAccess())
272  for (int i=0; i<sz; i++)
273  c.fastAccessDx(i) = b.fastAccessDx(i)*a.val();
274 
275  return c;
276  }
277 
278  template <typename ValueT>
279  SimpleFad<ValueT>
281  const SimpleFad<ValueT>& b) {
282  return SimpleFad<ValueT>(b, a*b.val(), a);
283  }
284 
285  template <typename ValueT>
286  SimpleFad<ValueT>
288  const typename SimpleFad<ValueT>::value_type& b) {
289  return SimpleFad<ValueT>(a, a.val()*b, b);
290  }
291 
292  template <typename ValueT>
293  SimpleFad<ValueT>
295  const SimpleFad<ValueT>& b) {
296  int sz = a.size() >= b.size() ? a.size() : b.size();
297  SimpleFad<ValueT> c(sz, a.val() / b.val());
298  if (a.hasFastAccess() && b.hasFastAccess()) {
299  ValueT t = b.val()*b.val();
300  for (int i=0; i<sz; i++)
301  c.fastAccessDx(i) =
302  (a.fastAccessDx(i)*b.val() - b.fastAccessDx(i)*a.val()) / t;
303  }
304  else if (a.hasFastAccess())
305  for (int i=0; i<sz; i++)
306  c.fastAccessDx(i) = a.fastAccessDx(i)/b.val();
307  else if (b.hasFastAccess()) {
308  ValueT t = -a.val()/(b.val()*b.val());
309  for (int i=0; i<sz; i++)
310  c.fastAccessDx(i) = b.fastAccessDx(i)*t;
311  }
312 
313  return c;
314  }
315 
316  template <typename ValueT>
317  SimpleFad<ValueT>
319  const SimpleFad<ValueT>& b) {
320  return SimpleFad<ValueT>(b, a/b.val(), -a/(b.val()*b.val()));
321  }
322 
323  template <typename ValueT>
324  SimpleFad<ValueT>
326  const typename SimpleFad<ValueT>::value_type& b) {
327  return SimpleFad<ValueT>(a, a.val()/b, 1.0/b);
328  }
329 
330  template <typename ValueT>
331  SimpleFad<ValueT>
333  const SimpleFad<ValueT>& b) {
334  int sz = a.size() >= b.size() ? a.size() : b.size();
335  SimpleFad<ValueT> c(sz, std::pow(a.val(), b.val()));
336  typedef typename SimpleFad<ValueT>::value_type value_type;
337  if (a.hasFastAccess() && b.hasFastAccess()) {
338  if (a.val() != value_type(0)) {
339  ValueT t1 = c.val()*b.val()/a.val();
340  ValueT t2 = c.val()*std::log(a.val());
341  for (int i=0; i<sz; i++)
342  c.fastAccessDx(i) =
343  a.fastAccessDx(i)*t1 + b.fastAccessDx(i)*t2;
344  }
345  }
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;
351  }
352  }
353  else if (b.hasFastAccess()) {
354  if (a.val() != value_type(0)) {
355  ValueT t2 = c.val()*std::log(a.val());
356  for (int i=0; i<sz; i++)
357  c.fastAccessDx(i) = b.fastAccessDx(i)*t2;
358  }
359  }
360 
361  return c;
362  }
363 
364  template <typename ValueT>
365  SimpleFad<ValueT>
366  pow(const typename SimpleFad<ValueT>::value_type& a,
367  const SimpleFad<ValueT>& b) {
368  typedef typename SimpleFad<ValueT>::value_type value_type;
369  ValueT t = std::pow(a,b.val());
370  if (a != value_type(0))
371  return SimpleFad<ValueT>(b, t, t*std::log(a));
372  else
373  return SimpleFad<ValueT>(b, t, value_type(0));
374  }
375 
376  template <typename ValueT>
377  SimpleFad<ValueT>
379  const typename SimpleFad<ValueT>::value_type& b) {
380  typedef typename SimpleFad<ValueT>::value_type value_type;
381  ValueT t = std::pow(a.val(),b);
382  if (a.val() != value_type(0))
383  return SimpleFad<ValueT>(a, t, t*b/a.val());
384  else
385  return SimpleFad<ValueT>(a, t, value_type(0));
386  }
387 
388  template <typename ValueT>
389  SimpleFad<ValueT>
391  const SimpleFad<ValueT>& b) {
392  int sz = a.size() >= b.size() ? a.size() : b.size();
393  SimpleFad<ValueT> c(sz, std::atan2(a.val(), b.val()));
394  if (a.hasFastAccess() && b.hasFastAccess()) {
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++)
399  c.fastAccessDx(i) =
400  a.fastAccessDx(i)*t1 - b.fastAccessDx(i)*t2;
401  }
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;
406  }
407  else if (b.hasFastAccess()) {
408  ValueT t2 = -a.val()/(a.val()*a.val() + b.val()*b.val());
409  for (int i=0; i<sz; i++)
410  c.fastAccessDx(i) = b.fastAccessDx(i)*t2;
411  }
412 
413  return c;
414  }
415 
416  template <typename ValueT>
417  SimpleFad<ValueT>
419  const SimpleFad<ValueT>& b) {
420  return SimpleFad<ValueT>(b, std::atan2(a,b.val()),
421  -a/(a*a + b.val()*b.val()));
422  }
423 
424  template <typename ValueT>
425  SimpleFad<ValueT>
427  const typename SimpleFad<ValueT>::value_type& b) {
428  return SimpleFad<ValueT>(a, std::atan2(a.val(),b),
429  b/(a.val()*a.val() + b*b));
430  }
431 
432  template <typename ValueT>
433  SimpleFad<ValueT>
435  const SimpleFad<ValueT>& b) {
436  int sz = a.size() >= b.size() ? a.size() : b.size();
437  SimpleFad<ValueT> c(sz, std::max(a.val(), b.val()));
438  if (a.hasFastAccess() && b.hasFastAccess()) {
439  if (a.val() >= b.val())
440  for (int i=0; i<sz; i++)
441  c.fastAccessDx(i) = a.fastAccessDx(i);
442  else
443  for (int i=0; i<sz; i++)
444  c.fastAccessDx(i) = b.fastAccessDx(i);
445  }
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);
450  else
451  for (int i=0; i<sz; i++)
452  c.fastAccessDx(i) = 0.0;
453  }
454  else if (b.hasFastAccess()) {
455  if (a.val() >= b.val())
456  for (int i=0; i<sz; i++)
457  c.fastAccessDx(i) = 0.0;
458  else
459  for (int i=0; i<sz; i++)
460  c.fastAccessDx(i) = b.fastAccessDx(i);
461  }
462 
463  return c;
464  }
465 
466  template <typename ValueT>
467  SimpleFad<ValueT>
468  max(const typename SimpleFad<ValueT>::value_type& a,
469  const SimpleFad<ValueT>& b) {
470  SimpleFad<ValueT> c(b.size(), std::max(a, b.val()));
471  if (a >= b.val())
472  for (int i=0; i<c.size(); i++)
473  c.fastAccessDx(i) = 0.0;
474  else
475  for (int i=0; i<c.size(); i++)
476  c.fastAccessDx(i) = b.fastAccessDx(i);
477 
478  return c;
479  }
480 
481  template <typename ValueT>
482  SimpleFad<ValueT>
484  const typename SimpleFad<ValueT>::value_type& b) {
485  SimpleFad<ValueT> c(a.size(), std::max(a.val(), b));
486  if (a.val() >= b)
487  for (int i=0; i<c.size(); i++)
488  c.fastAccessDx(i) = a.fastAccessDx(i);
489  else
490  for (int i=0; i<c.size(); i++)
491  c.fastAccessDx(i) = 0.0;
492 
493  return c;
494  }
495 
496  template <typename ValueT>
497  SimpleFad<ValueT>
499  const SimpleFad<ValueT>& b) {
500  int sz = a.size() >= b.size() ? a.size() : b.size();
501  SimpleFad<ValueT> c(sz, std::min(a.val(), b.val()));
502  if (a.hasFastAccess() && b.hasFastAccess()) {
503  if (a.val() <= b.val())
504  for (int i=0; i<sz; i++)
505  c.fastAccessDx(i) = a.fastAccessDx(i);
506  else
507  for (int i=0; i<sz; i++)
508  c.fastAccessDx(i) = b.fastAccessDx(i);
509  }
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);
514  else
515  for (int i=0; i<sz; i++)
516  c.fastAccessDx(i) = 0.0;
517  }
518  else if (b.hasFastAccess()) {
519  if (a.val() <= b.val())
520  for (int i=0; i<sz; i++)
521  c.fastAccessDx(i) = 0.0;
522  else
523  for (int i=0; i<sz; i++)
524  c.fastAccessDx(i) = b.fastAccessDx(i);
525  }
526 
527  return c;
528  }
529 
530  template <typename ValueT>
531  SimpleFad<ValueT>
532  min(const typename SimpleFad<ValueT>::value_type& a,
533  const SimpleFad<ValueT>& b) {
534  SimpleFad<ValueT> c(b.size(), std::min(a, b.val()));
535  if (a <= b.val())
536  for (int i=0; i<c.size(); i++)
537  c.fastAccessDx(i) = 0.0;
538  else
539  for (int i=0; i<c.size(); i++)
540  c.fastAccessDx(i) = b.fastAccessDx(i);
541 
542  return c;
543  }
544 
545  template <typename ValueT>
546  SimpleFad<ValueT>
548  const typename SimpleFad<ValueT>::value_type& b) {
549  SimpleFad<ValueT> c(a.size(), std::min(a.val(), b));
550  if (a.val() <= b)
551  for (int i=0; i<c.size(); i++)
552  c.fastAccessDx(i) = a.fastAccessDx(i);
553  else
554  for (int i=0; i<c.size(); i++)
555  c.fastAccessDx(i) = 0.0;
556 
557  return c;
558  }
559 
560  } // namespace Fad
561 
562 } // namespace Sacado
563 
564  //-------------------------- Relational Operators -----------------------
565 
566 #define FAD_RELOP_MACRO(OP) \
567 namespace Sacado { \
568  namespace Fad { \
569  template <typename ValueT> \
570  inline bool \
571  operator OP (const SimpleFad<ValueT>& a, \
572  const SimpleFad<ValueT>& b) \
573  { \
574  return a.val() OP b.val(); \
575  } \
576  \
577  template <typename ValueT> \
578  inline bool \
579  operator OP (const ValueT& a, \
580  const SimpleFad<ValueT>& b) \
581  { \
582  return a OP b.val(); \
583  } \
584  \
585  template <typename ValueT> \
586  inline bool \
587  operator OP (const SimpleFad<ValueT>& a, \
588  const ValueT& b) \
589  { \
590  return a.val() OP b; \
591  } \
592  } \
593 }
594 
595 FAD_RELOP_MACRO(==)
596 FAD_RELOP_MACRO(!=)
599 FAD_RELOP_MACRO(<=)
600 FAD_RELOP_MACRO(>=)
601 FAD_RELOP_MACRO(<<=)
602 FAD_RELOP_MACRO(>>=)
605 
606 #undef FAD_RELOP_MACRO
607 
608 namespace Sacado {
609 
610  namespace Fad {
611 
612  template <typename ValueT>
613  inline bool operator ! (const SimpleFad<ValueT>& a)
614  {
615  return ! a.val();
616  }
617 
618  } // namespace Fad
619 
620 } // namespace Sacado
621 
622 //-------------------------- Boolean Operators -----------------------
623 namespace Sacado {
624 
625  namespace Fad {
626 
627  template <typename T>
628  bool toBool(const SimpleFad<T>& x) {
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);
632  return !is_zero;
633  }
634 
635  } // namespace Fad
636 
637 } // namespace Sacado
638 
639 #define FAD_BOOL_MACRO(OP) \
640 namespace Sacado { \
641  namespace Fad { \
642  template <typename T1, typename T2> \
643  inline bool \
644  operator OP (const SimpleFad<T1>& expr1, \
645  const SimpleFad<T2>& expr2) \
646  { \
647  return toBool(expr1) OP toBool(expr2); \
648  } \
649  \
650  template <typename T2> \
651  inline bool \
652  operator OP (const typename SimpleFad<T2>::value_type& a, \
653  const SimpleFad<T2>& expr2) \
654  { \
655  return a OP toBool(expr2); \
656  } \
657  \
658  template <typename T1> \
659  inline bool \
660  operator OP (const SimpleFad<T1>& expr1, \
661  const typename SimpleFad<T1>::value_type& b) \
662  { \
663  return toBool(expr1) OP b; \
664  } \
665  } \
666 }
667 
668 FAD_BOOL_MACRO(&&)
669 FAD_BOOL_MACRO(||)
670 
671 #undef FAD_BOOL_MACRO
672 
673 //-------------------------- I/O Operators -----------------------
674 
675 namespace Sacado {
676 
677  namespace Fad {
678 
679  template <typename ValueT>
680  std::ostream& operator << (std::ostream& os,
681  const SimpleFad<ValueT>& x) {
682  os << x.val() << " [";
683 
684  for (int i=0; i< x.size(); i++) {
685  os << " " << x.dx(i);
686  }
687 
688  os << " ]";
689  return os;
690  }
691 
692  } // namespace Fad
693 
694 } // namespace Sacado
695 
696 #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)