30 #ifndef SACADO_MATHFUNCTIONS_HPP
31 #define SACADO_MATHFUNCTIONS_HPP
44 #define UNARYFUNC_MACRO(OP,FADOP) \
48 template <typename T> \
49 SACADO_INLINE_FUNCTION \
50 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
52 template <typename T> class SimpleFad; \
53 template <typename T> \
54 SimpleFad<T> OP (const SimpleFad<T>&); \
58 template <typename T> class FADOP; \
59 template <typename T> class Expr; \
60 template <typename T> \
61 SACADO_INLINE_FUNCTION \
62 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
65 namespace CacheFad { \
66 template <typename T> class FADOP; \
67 template <typename T> class Expr; \
68 template <typename T> \
69 SACADO_INLINE_FUNCTION \
70 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
73 namespace ELRCacheFad { \
74 template <typename T> class FADOP; \
75 template <typename T> class Expr; \
76 template <typename T> \
77 SACADO_INLINE_FUNCTION \
78 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
82 template <typename T> class FADOP; \
83 template <typename T> class Expr; \
84 template <typename T> \
85 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
89 template <typename T> class Taylor; \
90 template <typename T> Taylor<T> OP (const Base< Taylor<T> >&); \
93 namespace FlopCounterPack { \
94 template <typename T> class ScalarFlopCounter; \
95 template <typename T> \
96 ScalarFlopCounter<T> OP (const Base< ScalarFlopCounter<T> >&); \
100 template <typename T> class ADvari; \
101 template <typename T> class IndepADvar; \
102 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&); \
103 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&); \
108 using Sacado::Fad::OP; \
109 using Sacado::ELRFad::OP; \
110 using Sacado::CacheFad::OP; \
111 using Sacado::ELRCacheFad::OP; \
112 using Sacado::LFad::OP; \
113 using Sacado::Tay::OP; \
114 using Sacado::FlopCounterPack::OP; \
115 using Sacado::Rad::OP; \
138 #undef UNARYFUNC_MACRO
142 template <
typename T>
144 Expr< SafeSqrtOp< Expr<T> > >
safe_sqrt (
const Expr<T>&);
149 template <
typename T>
156 template <
typename T>
161 namespace ELRCacheFad {
163 template <
typename T>
169 #define BINARYFUNC_MACRO(OP,FADOP) \
173 template <typename T> class ConstExpr; \
174 template <typename T> struct IsFadExpr; \
175 template <typename T> struct ExprLevel; \
176 template <typename T1, typename T2> \
177 SACADO_INLINE_FUNCTION \
178 typename mpl::enable_if_c< \
179 ExprLevel< Expr<T1> >::value == ExprLevel< Expr<T2> >::value, \
180 Expr< FADOP< Expr<T1>, Expr<T2> > > \
183 OP (const Expr<T1>&, const Expr<T2>&); \
185 template <typename T> \
186 SACADO_INLINE_FUNCTION \
187 Expr< FADOP< Expr<T>, Expr<T> > > \
188 OP (const Expr<T>&, const Expr<T>&); \
190 template <typename T> \
191 SACADO_INLINE_FUNCTION \
192 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
193 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
195 template <typename T> \
196 SACADO_INLINE_FUNCTION \
197 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
198 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
200 template <typename T> \
201 SACADO_INLINE_FUNCTION \
202 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
203 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
205 template <typename T> \
206 SACADO_INLINE_FUNCTION \
207 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
208 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
210 template <typename T> class SimpleFad; \
211 template <typename T> \
213 OP (const SimpleFad<T>&, const SimpleFad<T>&); \
215 template <typename T> \
217 OP (const SimpleFad<T>&, \
218 const typename SimpleFad<T>::value_type&); \
220 template <typename T> \
222 OP (const typename SimpleFad<T>::value_type&, \
223 const SimpleFad<T>&); \
227 template <typename T1, typename T2> class FADOP; \
228 template <typename T> class Expr; \
229 template <typename T> class ConstExpr; \
230 template <typename T> struct IsFadExpr; \
231 template <typename T> struct ExprLevel; \
232 template <typename T1, typename T2> \
233 SACADO_INLINE_FUNCTION \
234 SACADO_FAD_OP_ENABLE_EXPR_EXPR(FADOP) \
235 OP (const T1&, const T2&); \
237 template <typename T> \
238 SACADO_INLINE_FUNCTION \
239 Expr< FADOP< Expr<T>, Expr<T> > > \
240 OP (const Expr<T>&, const Expr<T>&); \
242 template <typename T> \
243 SACADO_INLINE_FUNCTION \
244 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
245 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
247 template <typename T> \
248 SACADO_INLINE_FUNCTION \
249 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
250 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
252 template <typename T> \
253 SACADO_INLINE_FUNCTION \
254 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
255 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
257 template <typename T> \
258 SACADO_INLINE_FUNCTION \
259 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
260 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
263 namespace CacheFad { \
264 template <typename T1, typename T2> class FADOP; \
265 template <typename T> class Expr; \
266 template <typename T> class ConstExpr; \
267 template <typename T> struct IsFadExpr; \
268 template <typename T> struct ExprLevel; \
269 template <typename T1, typename T2> \
270 SACADO_INLINE_FUNCTION \
271 SACADO_FAD_OP_ENABLE_EXPR_EXPR(FADOP) \
272 OP (const T1&, const T2&); \
274 template <typename T> \
275 SACADO_INLINE_FUNCTION \
276 Expr< FADOP< Expr<T>, Expr<T> > > \
277 OP (const Expr<T>&, const Expr<T>&); \
279 template <typename T> \
280 SACADO_INLINE_FUNCTION \
281 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
282 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
284 template <typename T> \
285 SACADO_INLINE_FUNCTION \
286 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
287 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
289 template <typename T> \
290 SACADO_INLINE_FUNCTION \
291 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
292 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
294 template <typename T> \
295 SACADO_INLINE_FUNCTION \
296 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
297 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
300 namespace ELRCacheFad { \
301 template <typename T1, typename T2> class FADOP; \
302 template <typename T> class Expr; \
303 template <typename T> class ConstExpr; \
304 template <typename T> struct IsFadExpr; \
305 template <typename T> struct ExprLevel; \
306 template <typename T1, typename T2> \
307 SACADO_INLINE_FUNCTION \
308 SACADO_FAD_OP_ENABLE_EXPR_EXPR(FADOP) \
309 OP (const T1&, const T2&); \
311 template <typename T> \
312 SACADO_INLINE_FUNCTION \
313 Expr< FADOP< Expr<T>, Expr<T> > > \
314 OP (const Expr<T>&, const Expr<T>&); \
316 template <typename T> \
317 SACADO_INLINE_FUNCTION \
318 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
319 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
321 template <typename T> \
322 SACADO_INLINE_FUNCTION \
323 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
324 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
326 template <typename T> \
327 SACADO_INLINE_FUNCTION \
328 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
329 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
331 template <typename T> \
332 SACADO_INLINE_FUNCTION \
333 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
334 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
338 template <typename T1, typename T2> class FADOP; \
339 template <typename T> class Expr; \
341 template <typename T1, typename T2> \
342 Expr< FADOP< Expr<T1>, Expr<T2> > > \
343 OP (const Expr<T1>&, const Expr<T2>&); \
345 template <typename T> \
346 Expr< FADOP< Expr<T>, Expr<T> > > \
347 OP (const Expr<T>&, const Expr<T>&); \
349 template <typename T> \
350 Expr< FADOP< typename Expr<T>::value_type, Expr<T> > > \
351 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
353 template <typename T> \
354 Expr< FADOP< Expr<T>, typename Expr<T>::value_type > > \
355 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
359 template <typename T> class Taylor; \
360 template <typename T> Taylor<T> OP ( \
361 const Base< Taylor<T> >&, \
362 const Base< Taylor<T> >&); \
363 template <typename T> Taylor<T> OP ( \
364 const typename Taylor<T>::value_type&, \
365 const Base< Taylor<T> >&); \
366 template <typename T> Taylor<T> OP ( \
367 const Base< Taylor<T> >&, \
368 const typename Taylor<T>::value_type&); \
371 namespace FlopCounterPack { \
372 template <typename T> class ScalarFlopCounter; \
373 template <typename T> \
374 ScalarFlopCounter<T> OP ( \
375 const Base< ScalarFlopCounter<T> >&, \
376 const Base< ScalarFlopCounter<T> >&); \
377 template <typename T> \
378 ScalarFlopCounter<T> OP ( \
379 const typename ScalarFlopCounter<T>::value_type&, \
380 const Base< ScalarFlopCounter<T> >&); \
381 template <typename T> \
382 ScalarFlopCounter<T> OP ( \
383 const Base< ScalarFlopCounter<T> >&, \
384 const typename ScalarFlopCounter<T>::value_type&); \
385 template <typename T> \
386 ScalarFlopCounter<T> OP ( \
388 const Base< ScalarFlopCounter<T> >&); \
389 template <typename T> \
390 ScalarFlopCounter<T> OP ( \
391 const Base< ScalarFlopCounter<T> >&, \
396 template <typename T> class ADvari; \
397 template <typename T> class IndepADvar; \
398 template <typename T> class DoubleAvoid; \
399 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
400 const Base< ADvari<T> >&); \
401 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
402 const Base< ADvari<T> >&); \
403 template <typename T> ADvari<T>& OP (T, \
404 const Base< ADvari<T> >&); \
405 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::dtype,\
406 const Base< ADvari<T> >&); \
407 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::itype,\
408 const Base< ADvari<T> >&); \
409 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::ltype,\
410 const Base< ADvari<T> >&); \
411 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
412 const Base< IndepADvar<T> >&); \
413 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
415 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
416 typename DoubleAvoid<T>::dtype);\
417 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
418 typename DoubleAvoid<T>::itype);\
419 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
420 typename DoubleAvoid<T>::ltype);\
421 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
422 const Base< IndepADvar<T> >&); \
423 template <typename T> ADvari<T>& OP (T, \
424 const Base< IndepADvar<T> >&); \
425 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::dtype,\
426 const Base< IndepADvar<T> >&); \
427 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::itype,\
428 const Base< IndepADvar<T> >&); \
429 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::ltype,\
430 const Base< IndepADvar<T> >&); \
431 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
433 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
434 typename DoubleAvoid<T>::dtype);\
435 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
436 typename DoubleAvoid<T>::itype);\
437 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
438 typename DoubleAvoid<T>::ltype);\
444 using Sacado::Fad::OP; \
445 using Sacado::ELRFad::OP; \
446 using Sacado::CacheFad::OP; \
447 using Sacado::ELRCacheFad::OP; \
448 using Sacado::LFad::OP; \
449 using Sacado::Tay::OP; \
450 using Sacado::FlopCounterPack::OP; \
451 using Sacado::Rad::OP; \
459 #undef BINARYFUNC_MACRO
461 #if defined(HAVE_SACADO_KOKKOS)
464 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
466 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
468 template <
typename T>
class DFad;
469 template <
typename T,
int N>
class SFad;
470 template <
typename T,
int N>
class SLFad;
471 template <
typename T>
473 void atomic_add(DFad<T>* dst,
const DFad<T>&
x);
474 template <
typename T,
int N>
476 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
477 template <
typename T,
int N>
479 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
480 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
482 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
486 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
488 template <
typename T>
class DFad;
489 template <
typename T,
int N>
class SFad;
490 template <
typename T,
int N>
class SLFad;
491 template <
typename T>
493 void atomic_add(DFad<T>* dst,
const DFad<T>&
x);
494 template <
typename T,
int N>
496 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
497 template <
typename T,
int N>
499 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
500 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
502 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
505 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
507 template <
typename T>
class DFad;
508 template <
typename T,
int N>
class SFad;
509 template <
typename T,
int N>
class SLFad;
510 template <
typename T>
512 void atomic_add(DFad<T>* dst,
const DFad<T>&
x);
513 template <
typename T,
int N>
515 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
516 template <
typename T,
int N>
518 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
519 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
521 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
523 namespace ELRCacheFad {
524 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
526 template <
typename T>
class DFad;
527 template <
typename T,
int N>
class SFad;
528 template <
typename T,
int N>
class SLFad;
529 template <
typename T>
531 void atomic_add(DFad<T>* dst,
const DFad<T>&
x);
532 template <
typename T,
int N>
534 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
535 template <
typename T,
int N>
537 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
538 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
540 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
545 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
546 using Sacado::Fad::atomic_add;
548 using Sacado::ELRFad::atomic_add;
549 using Sacado::CacheFad::atomic_add;
550 using Sacado::ELRCacheFad::atomic_add;
555 #ifdef SACADO_ENABLE_NEW_DESIGN
559 #endif // SACADO_MATHFUNCTIONS_HPP
expr2 expr1 expr2 expr2 c *expr2 c *expr1 c *expr2 c *expr1 MaxOp
SACADO_INLINE_FUNCTION Expr< SafeSqrtOp< Expr< T > > > safe_sqrt(const Expr< T > &)
SACADO_INLINE_FUNCTION Expr< SafeSqrtOp< Expr< T > > > safe_sqrt(const Expr< T > &)
GeneralFad< StaticStorage< T, Num > > SLFad
expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 expr1 expr1 c *expr2 expr1 c *expr2 expr1 c *expr2 expr1 expr1 expr1 expr2 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 Atan2Op
#define BINARYFUNC_MACRO(OP, FADOP)
GeneralFad< DynamicStorage< T > > DFad
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
Wrapper for a generic expression template.
atan2(expr1.val(), expr2.val())
Wrapper for a generic expression template.
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
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)
#define SACADO_INLINE_FUNCTION
Wrapper for a generic expression template.
GeneralFad< StaticFixedStorage< T, Num > > SFad
#define UNARYFUNC_MACRO(OP, FADOP)
SACADO_INLINE_FUNCTION Expr< SafeSqrtOp< Expr< T > > > safe_sqrt(const Expr< T > &)
SACADO_INLINE_FUNCTION Expr< SafeSqrtOp< Expr< T > > > safe_sqrt(const Expr< T > &)
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 PowerOp