30 #ifndef SACADO_MATHFUNCTIONS_HPP
31 #define SACADO_MATHFUNCTIONS_HPP
40 #define UNARYFUNC_MACRO(OP,FADOP) \
44 template <typename T> class FADOP; \
45 template <typename T> \
46 KOKKOS_INLINE_FUNCTION \
47 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
49 template <typename T> class SimpleFad; \
50 template <typename T> \
51 SimpleFad<T> OP (const SimpleFad<T>&); \
55 template <typename T> class FADOP; \
56 template <typename T> class Expr; \
57 template <typename T> \
58 KOKKOS_INLINE_FUNCTION \
59 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
62 namespace CacheFad { \
63 template <typename T> class FADOP; \
64 template <typename T> class Expr; \
65 template <typename T> \
66 KOKKOS_INLINE_FUNCTION \
67 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
70 namespace ELRCacheFad { \
71 template <typename T> class FADOP; \
72 template <typename T> class Expr; \
73 template <typename T> \
74 KOKKOS_INLINE_FUNCTION \
75 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
79 template <typename T> class FADOP; \
80 template <typename T> class Expr; \
81 template <typename T> \
82 Expr< FADOP< Expr<T> > > OP (const Expr<T>&); \
86 template <typename T> class Taylor; \
87 template <typename T> Taylor<T> OP (const Base< Taylor<T> >&); \
90 namespace FlopCounterPack { \
91 template <typename T> class ScalarFlopCounter; \
92 template <typename T> \
93 ScalarFlopCounter<T> OP (const Base< ScalarFlopCounter<T> >&); \
97 template <typename T> class ADvari; \
98 template <typename T> class IndepADvar; \
99 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&); \
100 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&); \
105 using Sacado::Fad::OP; \
106 using Sacado::ELRFad::OP; \
107 using Sacado::CacheFad::OP; \
108 using Sacado::ELRCacheFad::OP; \
109 using Sacado::LFad::OP; \
110 using Sacado::Tay::OP; \
111 using Sacado::FlopCounterPack::OP; \
112 using Sacado::Rad::OP; \
133 #ifdef HAVE_SACADO_CXX11
137 #undef UNARYFUNC_MACRO
139 #define BINARYFUNC_MACRO(OP,FADOP) \
143 template <typename T1, typename T2> class FADOP; \
144 template <typename T> class ConstExpr; \
145 template <typename T> struct IsFadExpr; \
146 template <typename T> struct ExprLevel; \
147 template <typename T1, typename T2> \
148 KOKKOS_INLINE_FUNCTION \
149 typename mpl::enable_if_c< \
150 ExprLevel< Expr<T1> >::value == ExprLevel< Expr<T2> >::value, \
151 Expr< FADOP< Expr<T1>, Expr<T2> > > \
154 OP (const Expr<T1>&, const Expr<T2>&); \
156 template <typename T> \
157 KOKKOS_INLINE_FUNCTION \
158 Expr< FADOP< Expr<T>, Expr<T> > > \
159 OP (const Expr<T>&, const Expr<T>&); \
161 template <typename T> \
162 KOKKOS_INLINE_FUNCTION \
163 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
164 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
166 template <typename T> \
167 KOKKOS_INLINE_FUNCTION \
168 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
169 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
171 template <typename T> \
172 KOKKOS_INLINE_FUNCTION \
173 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
174 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
176 template <typename T> \
177 KOKKOS_INLINE_FUNCTION \
178 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
179 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
181 template <typename T> class SimpleFad; \
182 template <typename T> \
184 OP (const SimpleFad<T>&, const SimpleFad<T>&); \
186 template <typename T> \
188 OP (const SimpleFad<T>&, \
189 const typename SimpleFad<T>::value_type&); \
191 template <typename T> \
193 OP (const typename SimpleFad<T>::value_type&, \
194 const SimpleFad<T>&); \
198 template <typename T1, typename T2> class FADOP; \
199 template <typename T> class Expr; \
200 template <typename T> class ConstExpr; \
201 template <typename T> struct IsFadExpr; \
202 template <typename T> struct ExprLevel; \
203 template <typename T1, typename T2> \
204 KOKKOS_INLINE_FUNCTION \
205 SACADO_FAD_OP_ENABLE_EXPR_EXPR(FADOP) \
206 OP (const T1&, const T2&); \
208 template <typename T> \
209 KOKKOS_INLINE_FUNCTION \
210 Expr< FADOP< Expr<T>, Expr<T> > > \
211 OP (const Expr<T>&, const Expr<T>&); \
213 template <typename T> \
214 KOKKOS_INLINE_FUNCTION \
215 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
216 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
218 template <typename T> \
219 KOKKOS_INLINE_FUNCTION \
220 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
221 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
223 template <typename T> \
224 KOKKOS_INLINE_FUNCTION \
225 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
226 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
228 template <typename T> \
229 KOKKOS_INLINE_FUNCTION \
230 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
231 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
234 namespace CacheFad { \
235 template <typename T1, typename T2> class FADOP; \
236 template <typename T> class Expr; \
237 template <typename T> class ConstExpr; \
238 template <typename T> struct IsFadExpr; \
239 template <typename T> struct ExprLevel; \
240 template <typename T1, typename T2> \
241 KOKKOS_INLINE_FUNCTION \
242 SACADO_FAD_OP_ENABLE_EXPR_EXPR(FADOP) \
243 OP (const T1&, const T2&); \
245 template <typename T> \
246 KOKKOS_INLINE_FUNCTION \
247 Expr< FADOP< Expr<T>, Expr<T> > > \
248 OP (const Expr<T>&, const Expr<T>&); \
250 template <typename T> \
251 KOKKOS_INLINE_FUNCTION \
252 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
253 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
255 template <typename T> \
256 KOKKOS_INLINE_FUNCTION \
257 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
258 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
260 template <typename T> \
261 KOKKOS_INLINE_FUNCTION \
262 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
263 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
265 template <typename T> \
266 KOKKOS_INLINE_FUNCTION \
267 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
268 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
271 namespace ELRCacheFad { \
272 template <typename T1, typename T2> class FADOP; \
273 template <typename T> class Expr; \
274 template <typename T> class ConstExpr; \
275 template <typename T> struct IsFadExpr; \
276 template <typename T> struct ExprLevel; \
277 template <typename T1, typename T2> \
278 KOKKOS_INLINE_FUNCTION \
279 SACADO_FAD_OP_ENABLE_EXPR_EXPR(FADOP) \
280 OP (const T1&, const T2&); \
282 template <typename T> \
283 KOKKOS_INLINE_FUNCTION \
284 Expr< FADOP< Expr<T>, Expr<T> > > \
285 OP (const Expr<T>&, const Expr<T>&); \
287 template <typename T> \
288 KOKKOS_INLINE_FUNCTION \
289 Expr< FADOP< ConstExpr<typename Expr<T>::value_type>, Expr<T> > > \
290 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
292 template <typename T> \
293 KOKKOS_INLINE_FUNCTION \
294 Expr< FADOP< Expr<T>, ConstExpr<typename Expr<T>::value_type> > > \
295 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
297 template <typename T> \
298 KOKKOS_INLINE_FUNCTION \
299 SACADO_FAD_OP_ENABLE_SCALAR_EXPR(FADOP) \
300 OP (const typename Expr<T>::scalar_type&, const Expr<T>&); \
302 template <typename T> \
303 KOKKOS_INLINE_FUNCTION \
304 SACADO_FAD_OP_ENABLE_EXPR_SCALAR(FADOP) \
305 OP (const Expr<T>&, const typename Expr<T>::scalar_type&); \
309 template <typename T1, typename T2> class FADOP; \
310 template <typename T> class Expr; \
312 template <typename T1, typename T2> \
313 Expr< FADOP< Expr<T1>, Expr<T2> > > \
314 OP (const Expr<T1>&, const Expr<T2>&); \
316 template <typename T> \
317 Expr< FADOP< Expr<T>, Expr<T> > > \
318 OP (const Expr<T>&, const Expr<T>&); \
320 template <typename T> \
321 Expr< FADOP< typename Expr<T>::value_type, Expr<T> > > \
322 OP (const typename Expr<T>::value_type&, const Expr<T>&); \
324 template <typename T> \
325 Expr< FADOP< Expr<T>, typename Expr<T>::value_type > > \
326 OP (const Expr<T>&, const typename Expr<T>::value_type&); \
330 template <typename T> class Taylor; \
331 template <typename T> Taylor<T> OP ( \
332 const Base< Taylor<T> >&, \
333 const Base< Taylor<T> >&); \
334 template <typename T> Taylor<T> OP ( \
335 const typename Taylor<T>::value_type&, \
336 const Base< Taylor<T> >&); \
337 template <typename T> Taylor<T> OP ( \
338 const Base< Taylor<T> >&, \
339 const typename Taylor<T>::value_type&); \
342 namespace FlopCounterPack { \
343 template <typename T> class ScalarFlopCounter; \
344 template <typename T> \
345 ScalarFlopCounter<T> OP ( \
346 const Base< ScalarFlopCounter<T> >&, \
347 const Base< ScalarFlopCounter<T> >&); \
348 template <typename T> \
349 ScalarFlopCounter<T> OP ( \
350 const typename ScalarFlopCounter<T>::value_type&, \
351 const Base< ScalarFlopCounter<T> >&); \
352 template <typename T> \
353 ScalarFlopCounter<T> OP ( \
354 const Base< ScalarFlopCounter<T> >&, \
355 const typename ScalarFlopCounter<T>::value_type&); \
356 template <typename T> \
357 ScalarFlopCounter<T> OP ( \
359 const Base< ScalarFlopCounter<T> >&); \
360 template <typename T> \
361 ScalarFlopCounter<T> OP ( \
362 const Base< ScalarFlopCounter<T> >&, \
367 template <typename T> class ADvari; \
368 template <typename T> class IndepADvar; \
369 template <typename T> class DoubleAvoid; \
370 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
371 const Base< ADvari<T> >&); \
372 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
373 const Base< ADvari<T> >&); \
374 template <typename T> ADvari<T>& OP (T, \
375 const Base< ADvari<T> >&); \
376 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::dtype,\
377 const Base< ADvari<T> >&); \
378 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::itype,\
379 const Base< ADvari<T> >&); \
380 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::ltype,\
381 const Base< ADvari<T> >&); \
382 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
383 const Base< IndepADvar<T> >&); \
384 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
386 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
387 typename DoubleAvoid<T>::dtype);\
388 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
389 typename DoubleAvoid<T>::itype);\
390 template <typename T> ADvari<T>& OP (const Base< ADvari<T> >&, \
391 typename DoubleAvoid<T>::ltype);\
392 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
393 const Base< IndepADvar<T> >&); \
394 template <typename T> ADvari<T>& OP (T, \
395 const Base< IndepADvar<T> >&); \
396 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::dtype,\
397 const Base< IndepADvar<T> >&); \
398 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::itype,\
399 const Base< IndepADvar<T> >&); \
400 template <typename T> ADvari<T>& OP (typename DoubleAvoid<T>::ltype,\
401 const Base< IndepADvar<T> >&); \
402 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
404 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
405 typename DoubleAvoid<T>::dtype);\
406 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
407 typename DoubleAvoid<T>::itype);\
408 template <typename T> ADvari<T>& OP (const Base< IndepADvar<T> >&, \
409 typename DoubleAvoid<T>::ltype);\
415 using Sacado::Fad::OP; \
416 using Sacado::ELRFad::OP; \
417 using Sacado::CacheFad::OP; \
418 using Sacado::ELRCacheFad::OP; \
419 using Sacado::LFad::OP; \
420 using Sacado::Tay::OP; \
421 using Sacado::FlopCounterPack::OP; \
422 using Sacado::Rad::OP; \
430 #undef BINARYFUNC_MACRO
432 #if defined(HAVE_SACADO_KOKKOSCORE)
435 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
437 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
439 template <
typename T>
class DFad;
440 template <
typename T,
int N>
class SFad;
441 template <
typename T,
int N>
class SLFad;
442 template <
typename T>
444 void atomic_add(DFad<T>* dst,
const DFad<T>& x);
445 template <
typename T,
int N>
447 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
448 template <
typename T,
int N>
450 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
451 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
453 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
457 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
459 template <
typename T>
class DFad;
460 template <
typename T,
int N>
class SFad;
461 template <
typename T,
int N>
class SLFad;
462 template <
typename T>
464 void atomic_add(DFad<T>* dst,
const DFad<T>& x);
465 template <
typename T,
int N>
467 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
468 template <
typename T,
int N>
470 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
471 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
473 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
476 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
478 template <
typename T>
class DFad;
479 template <
typename T,
int N>
class SFad;
480 template <
typename T,
int N>
class SLFad;
481 template <
typename T>
483 void atomic_add(DFad<T>* dst,
const DFad<T>& x);
484 template <
typename T,
int N>
486 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
487 template <
typename T,
int N>
489 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
490 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
492 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
494 namespace ELRCacheFad {
495 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U>
497 template <
typename T>
class DFad;
498 template <
typename T,
int N>
class SFad;
499 template <
typename T,
int N>
class SLFad;
500 template <
typename T>
502 void atomic_add(DFad<T>* dst,
const DFad<T>& x);
503 template <
typename T,
int N>
505 void atomic_add(SFad<T,N>* dst,
const SFad<T,N>& x);
506 template <
typename T,
int N>
508 void atomic_add(SLFad<T,N>* dst,
const SLFad<T,N>& x);
509 template <
typename ValT,
unsigned sl,
unsigned ss,
typename U,
typename T>
511 void atomic_add(ViewFadPtr<ValT,sl,ss,U> dst,
const Expr<T>& x);
516 #ifndef SACADO_NEW_FAD_DESIGN_IS_DEFAULT
517 using Sacado::Fad::atomic_add;
519 using Sacado::ELRFad::atomic_add;
520 using Sacado::CacheFad::atomic_add;
521 using Sacado::ELRCacheFad::atomic_add;
526 #ifdef SACADO_ENABLE_NEW_DESIGN
530 #endif // SACADO_MATHFUNCTIONS_HPP