16#if !defined(ADOLC_ADOUBLECUDA_H)
17#define ADOLC_ADOUBLECUDA_H 1
26#include <cuda_runtime.h>
27#include <math_constants.h>
31#if defined(NUMBER_DIRECTIONS)
32__managed__
size_t ADOLC_numDir = NUMBER_DIRECTIONS;
33#if defined(DYNAMIC_DIRECTIONS)
34#define ADVAL_DECL *adval
35#define ADVAL_TYPE_ADV const double *adv
37#define ADVAL_DECL adval[NUMBER_DIRECTIONS]
38#define ADVAL_TYPE_ADV const double adv[NUMBER_DIRECTIONS]
40#define ADVAL_TYPE double *
41#define FOR_I_EQ_0_LT_NUMDIR for (size_t i = 0; i < ADOLC_numDir; i++)
42#define ADVAL_I adval[i]
46#define ADVAL_DECL adval
48#define ADVAL_TYPE_ADV double adv
49#define ADVAL_TYPE double
50#define FOR_I_EQ_0_LT_NUMDIR
56#define ADOLC_MATH_NSP std
58inline __device__
double makeNaN() {
return CUDART_NAN; }
60inline __device__
double makeInf() {
return CUDART_INF; }
62#define CUDADEV __device__ inline
63#define CUDAHOST __host__ inline
64#define CUDAHOSTDEV __host__ __device__ inline
79#if defined(DYNAMIC_DIRECTIONS)
206#if defined(NUMBER_DIRECTIONS)
223#if defined(DYNAMIC_DIRECTIONS)
224 adval =
new double[ADOLC_numDir];
229#if defined(DYNAMIC_DIRECTIONS)
230 adval =
new double[ADOLC_numDir];
237#if defined(DYNAMIC_DIRECTIONS)
238 adval =
new double[ADOLC_numDir];
245#if defined(DYNAMIC_DIRECTIONS)
246 adval =
new double[ADOLC_numDir];
253#if defined(DYNAMIC_DIRECTIONS)
271 return adouble(val + v, adval);
276 tmp.val = val + a.val;
278 tmp.ADVAL_I =
ADVAL_I + a.ADVAL_I;
283 return adouble(v + a.val, a.adval);
288 return adouble(val - v, adval);
293 tmp.val = val - a.val;
295 tmp.ADVAL_I =
ADVAL_I - a.ADVAL_I;
303 tmp.ADVAL_I = -a.ADVAL_I;
318 tmp.val = val * a.val;
320 tmp.ADVAL_I =
ADVAL_I * a.val + val * a.ADVAL_I;
328 tmp.ADVAL_I = v * a.ADVAL_I;
343 tmp.val = val / a.val;
345 tmp.ADVAL_I = (
ADVAL_I * a.val - val * a.ADVAL_I) / (a.val * a.val);
353 tmp.ADVAL_I = (-v * a.ADVAL_I) / (a.val * a.val);
388 tmp.val = ADOLC_MATH_NSP::tan(a.val);
389 tmp2 = ADOLC_MATH_NSP::cos(a.val);
392 tmp.ADVAL_I = a.ADVAL_I / tmp2;
398 tmp.val = ADOLC_MATH_NSP::exp(a.val);
400 tmp.ADVAL_I = tmp.val * a.ADVAL_I;
406 tmp.val = ADOLC_MATH_NSP::log(a.val);
409 tmp.ADVAL_I = a.ADVAL_I / a.val;
410 else if (a.val == 0 && a.ADVAL_I != 0.0) {
411 int sign = (a.ADVAL_I < 0) ? -1 : 1;
412 tmp.ADVAL_I = sign *
makeInf();
420 tmp.val = ADOLC_MATH_NSP::sqrt(a.val);
423 tmp.ADVAL_I = a.ADVAL_I / (tmp.val * 2);
424 else if (a.val == 0.0 && a.ADVAL_I != 0.0) {
425 int sign = (a.ADVAL_I < 0) ? -1 : 1;
426 tmp.ADVAL_I = sign *
makeInf();
435 tmp.val = ADOLC_MATH_NSP::sin(a.val);
436 tmp2 = ADOLC_MATH_NSP::cos(a.val);
438 tmp.ADVAL_I = tmp2 * a.ADVAL_I;
445 tmp.val = ADOLC_MATH_NSP::cos(a.val);
446 tmp2 = -ADOLC_MATH_NSP::sin(a.val);
448 tmp.ADVAL_I = tmp2 * a.ADVAL_I;
454 tmp.val = ADOLC_MATH_NSP::asin(a.val);
455 double tmp2 = ADOLC_MATH_NSP::sqrt(1 - a.val * a.val);
457 tmp.ADVAL_I = a.ADVAL_I / tmp2;
463 tmp.val = ADOLC_MATH_NSP::acos(a.val);
464 double tmp2 = -ADOLC_MATH_NSP::sqrt(1 - a.val * a.val);
466 tmp.ADVAL_I = a.ADVAL_I / tmp2;
472 tmp.val = ADOLC_MATH_NSP::atan(a.val);
473 double tmp2 = 1 + a.val * a.val;
477 tmp.ADVAL_I = a.ADVAL_I * tmp2;
484 tmp.val = ADOLC_MATH_NSP::atan2(a.val, b.val);
485 double tmp2 = a.val * a.val;
486 double tmp3 = b.val * b.val;
487 double tmp4 = tmp3 / (tmp2 + tmp3);
490 tmp.ADVAL_I = (a.ADVAL_I * b.val - a.val * b.ADVAL_I) / tmp3 * tmp4;
497 tmp.val = ADOLC_MATH_NSP::pow(a.val, v);
498 double tmp2 = v * ADOLC_MATH_NSP::pow(a.val, v - 1);
500 tmp.ADVAL_I = tmp2 * a.ADVAL_I;
506 tmp.val = ADOLC_MATH_NSP::pow(a.val, b.val);
507 double tmp2 = b.val * ADOLC_MATH_NSP::pow(a.val, b.val - 1);
508 double tmp3 = ADOLC_MATH_NSP::log(a.val) * tmp.val;
510 tmp.ADVAL_I = tmp2 * a.ADVAL_I + tmp3 * b.ADVAL_I;
516 tmp.val = ADOLC_MATH_NSP::pow(v, a.val);
517 double tmp2 = tmp.val * ADOLC_MATH_NSP::log(v);
519 tmp.ADVAL_I = tmp2 * a.ADVAL_I;
525 tmp.val = ADOLC_MATH_NSP::log10(a.val);
526 double tmp2 = ADOLC_MATH_NSP::log((
double)10) * a.val;
528 tmp.ADVAL_I = a.ADVAL_I / tmp2;
534 tmp.val = ADOLC_MATH_NSP::sinh(a.val);
535 double tmp2 = ADOLC_MATH_NSP::cosh(a.val);
537 tmp.ADVAL_I = a.ADVAL_I * tmp2;
543 tmp.val = ADOLC_MATH_NSP::cosh(a.val);
544 double tmp2 = ADOLC_MATH_NSP::sinh(a.val);
546 tmp.ADVAL_I = a.ADVAL_I * tmp2;
552 tmp.val = ADOLC_MATH_NSP::tanh(a.val);
553 double tmp2 = ADOLC_MATH_NSP::cosh(a.val);
556 tmp.ADVAL_I = a.ADVAL_I / tmp2;
562 tmp.val = ADOLC_MATH_NSP_ERF::asinh(a.val);
563 double tmp2 = ADOLC_MATH_NSP::sqrt(a.val * a.val + 1);
565 tmp.ADVAL_I = a.ADVAL_I / tmp2;
571 tmp.val = ADOLC_MATH_NSP_ERF::acosh(a.val);
572 double tmp2 = ADOLC_MATH_NSP::sqrt(a.val * a.val - 1);
574 tmp.ADVAL_I = a.ADVAL_I / tmp2;
580 tmp.val = ADOLC_MATH_NSP_ERF::atanh(a.val);
581 double tmp2 = 1 - a.val * a.val;
583 tmp.ADVAL_I = a.ADVAL_I / tmp2;
589 tmp.val = ADOLC_MATH_NSP::fabs(a.val);
597 tmp.ADVAL_I = a.ADVAL_I * as;
604 tmp.ADVAL_I = a.ADVAL_I * as;
611 tmp.val = ADOLC_MATH_NSP::ceil(a.val);
619 tmp.val = ADOLC_MATH_NSP::floor(a.val);
627 double tmp2 = a.val - b.val;
631 tmp.ADVAL_I = b.ADVAL_I;
636 tmp.ADVAL_I = a.ADVAL_I;
639 if (a.ADVAL_I < b.ADVAL_I)
640 tmp.ADVAL_I = b.ADVAL_I;
642 tmp.ADVAL_I = a.ADVAL_I;
651 double tmp2 = v - a.val;
655 tmp.ADVAL_I = a.ADVAL_I;
664 tmp.ADVAL_I = a.ADVAL_I;
675 double tmp2 = a.val - v;
684 tmp.ADVAL_I = a.ADVAL_I;
688 tmp.ADVAL_I = a.ADVAL_I;
699 double tmp2 = a.val - b.val;
703 tmp.ADVAL_I = a.ADVAL_I;
708 tmp.ADVAL_I = b.ADVAL_I;
711 if (a.ADVAL_I < b.ADVAL_I)
712 tmp.ADVAL_I = a.ADVAL_I;
714 tmp.ADVAL_I = b.ADVAL_I;
723 double tmp2 = v - a.val;
732 tmp.ADVAL_I = a.ADVAL_I;
736 tmp.ADVAL_I = a.ADVAL_I;
747 double tmp2 = a.val - v;
751 tmp.ADVAL_I = a.ADVAL_I;
760 tmp.ADVAL_I = a.ADVAL_I;
770 return a *
pow(2., b);
774 return a * ADOLC_MATH_NSP::pow(2., v);
778 return v *
pow(2., a);
782 return ADOLC_MATH_NSP::frexp(a.val, v);
787 tmp.val = ADOLC_MATH_NSP_ERF::erf(a.val);
788 double tmp2 = 2.0 / ADOLC_MATH_NSP_ERF::sqrt(ADOLC_MATH_NSP::acos(-1.0)) *
789 ADOLC_MATH_NSP_ERF::exp(-a.val * a.val);
791 tmp.ADVAL_I = tmp2 * a.ADVAL_I;
797 tmp.val = ADOLC_MATH_NSP_ERF::erfc(a.val);
798 double tmp2 = -2.0 / ADOLC_MATH_NSP_ERF::sqrt(ADOLC_MATH_NSP::acos(-1.0)) *
799 ADOLC_MATH_NSP_ERF::exp(-a.val * a.val);
801 tmp.ADVAL_I = tmp2 * a.ADVAL_I;
910#if defined(NUMBER_DIRECTIONS)
912 unsigned int locp = p;
913 if (locp >= ADOLC_numDir) {
914 locp = ADOLC_numDir - 1;
920 unsigned int locp = p;
921 if (locp >= ADOLC_numDir) {
922 locp = ADOLC_numDir - 1;
928#if defined(NUMBER_DIRECTIONS)
929void setNumDir(
const unsigned int p) {
930#if !defined(DYNAMIC_DIRECTIONS)
931 if (p > NUMBER_DIRECTIONS)
932 ADOLC_numDir = NUMBER_DIRECTIONS;
943 out <<
"Value: " << a.val;
944#if !defined(NUMBER_DIRECTIONS)
947 out <<
" ADValues (" << ADOLC_numDir <<
"): ";
950 out << a.ADVAL_I <<
" ";
959 }
while (c !=
':' && !in.eof());
961#if !defined(NUMBER_DIRECTIONS)
964 while (c !=
':' && !in.eof());
969 while (c !=
'(' && !in.eof());
971 if (num > NUMBER_DIRECTIONS) {
972 cout <<
"ADOL-C error: to many directions in input\n";
977 while (c !=
')' && !in.eof());
983 while (c !=
')' && !in.eof());
#define FOR_I_EQ_0_LT_NUMDIR
Definition adoublecuda.h:50
#define ADVAL_TYPE_ADV
Definition adoublecuda.h:48
#define CUDADEV
Definition adoublecuda.h:62
#define ADVAL_I
Definition adoublecuda.h:51
#define CUDAHOSTDEV
Definition adoublecuda.h:64
#define CUDAHOST
Definition adoublecuda.h:63
#define ADV_I
Definition adoublecuda.h:52
#define ADVAL_TYPE
Definition adoublecuda.h:49
#define V_I
Definition adoublecuda.h:53
~adouble()=default
Default destructor.
CUDA-compatible tapeless active scalar for forward derivatives.
Definition adoublecuda.h:72
CUDADEV friend adouble acos(const adouble &a)
Definition adoublecuda.h:461
CUDADEV friend int operator<=(const double, const adouble &)
Definition adoublecuda.h:878
CUDADEV void operator/=(const double v)
Definition adoublecuda.h:846
CUDADEV friend adouble atan2(const adouble &a, const adouble &b)
Definition adoublecuda.h:482
CUDAHOSTDEV ADVAL_TYPE getADValue() const
Definition adoublecuda.h:903
CUDADEV friend adouble asinh(const adouble &a)
Definition adoublecuda.h:560
CUDADEV friend adouble operator/(const double v, const adouble &a)
Definition adoublecuda.h:349
CUDADEV adouble operator-() const
Definition adoublecuda.h:259
CUDADEV friend int operator>(const double, const adouble &)
Definition adoublecuda.h:890
CUDADEV friend adouble ldexp(const adouble &a, const adouble &b)
Definition adoublecuda.h:769
CUDADEV friend adouble exp(const adouble &a)
Definition adoublecuda.h:396
CUDAHOST friend istream & operator>>(istream &, adouble &)
Definition adoublecuda.h:955
CUDADEV friend adouble fabs(const adouble &a)
Definition adoublecuda.h:587
CUDADEV friend adouble log10(const adouble &a)
Definition adoublecuda.h:523
CUDADEV friend adouble floor(const adouble &a)
Definition adoublecuda.h:617
CUDAHOSTDEV void setADValue(ADVAL_TYPE v)
Definition adoublecuda.h:905
CUDADEV friend adouble sqrt(const adouble &a)
Definition adoublecuda.h:418
CUDADEV friend adouble atan(const adouble &a)
Definition adoublecuda.h:470
CUDADEV friend adouble pow(const adouble &a, double v)
Definition adoublecuda.h:495
CUDADEV friend adouble atanh(const adouble &a)
Definition adoublecuda.h:578
CUDADEV adouble operator--()
Definition adoublecuda.h:371
CUDADEV friend adouble sin(const adouble &a)
Definition adoublecuda.h:432
CUDADEV friend adouble cosh(const adouble &a)
Definition adoublecuda.h:541
CUDAHOSTDEV double getValue() const
Definition adoublecuda.h:899
CUDADEV friend adouble asin(const adouble &a)
Definition adoublecuda.h:452
CUDADEV adouble()
Definition adoublecuda.h:222
CUDADEV void operator+=(const double v)
Definition adoublecuda.h:818
CUDADEV friend adouble acosh(const adouble &a)
Definition adoublecuda.h:569
CUDAHOSTDEV void setValue(const double v)
Definition adoublecuda.h:901
CUDADEV friend adouble ceil(const adouble &a)
Definition adoublecuda.h:609
CUDADEV void operator=(const double v)
Definition adoublecuda.h:806
CUDADEV friend int operator<(const double, const adouble &)
Definition adoublecuda.h:896
CUDADEV friend adouble cos(const adouble &a)
Definition adoublecuda.h:442
CUDADEV void operator*=(const double v)
Definition adoublecuda.h:834
CUDADEV friend int operator==(const double, const adouble &)
Definition adoublecuda.h:872
CUDADEV friend adouble fmax(const adouble &a, const adouble &b)
Definition adoublecuda.h:625
CUDADEV friend adouble fmin(const adouble &a, const adouble &b)
Definition adoublecuda.h:697
CUDADEV friend adouble log(const adouble &a)
Definition adoublecuda.h:404
CUDADEV friend int operator!=(const double, const adouble &)
Definition adoublecuda.h:866
CUDADEV adouble operator+() const
Definition adoublecuda.h:267
CUDAHOST friend ostream & operator<<(ostream &, const adouble &)
Definition adoublecuda.h:942
CUDADEV friend adouble operator*(const double v, const adouble &a)
Definition adoublecuda.h:324
CUDADEV friend adouble tan(const adouble &a)
Definition adoublecuda.h:385
CUDADEV friend double frexp(const adouble &a, int *v)
Definition adoublecuda.h:781
CUDADEV friend adouble erf(const adouble &a)
Definition adoublecuda.h:785
CUDADEV friend adouble erfc(const adouble &a)
Definition adoublecuda.h:795
CUDADEV friend adouble tanh(const adouble &a)
Definition adoublecuda.h:550
CUDADEV friend adouble sinh(const adouble &a)
Definition adoublecuda.h:532
CUDADEV void operator-=(const double v)
Definition adoublecuda.h:826
CUDADEV int operator!() const
Definition adoublecuda.h:859
CUDADEV friend int operator>=(const double, const adouble &)
Definition adoublecuda.h:884
CUDADEV adouble operator++()
Definition adoublecuda.h:358
Definition adoublecuda.h:29
CUDADEV adouble sinh(const adouble &a)
Definition adoublecuda.h:532
CUDADEV adouble sin(const adouble &a)
Definition adoublecuda.h:432
CUDADEV adouble operator-(const double v, const adouble &a)
Definition adoublecuda.h:299
CUDADEV int operator==(const double v, const adouble &a)
Definition adoublecuda.h:872
CUDADEV adouble atan2(const adouble &a, const adouble &b)
Definition adoublecuda.h:482
CUDADEV adouble acosh(const adouble &a)
Definition adoublecuda.h:569
CUDADEV adouble asinh(const adouble &a)
Definition adoublecuda.h:560
CUDADEV int operator<(const double v, const adouble &a)
Definition adoublecuda.h:896
CUDAHOST istream & operator>>(istream &in, adouble &a)
Definition adoublecuda.h:955
__device__ double makeInf()
Definition adoublecuda.h:60
CUDADEV double frexp(const adouble &a, int *v)
Definition adoublecuda.h:781
CUDADEV int operator>=(const double v, const adouble &a)
Definition adoublecuda.h:884
CUDADEV adouble log10(const adouble &a)
Definition adoublecuda.h:523
CUDADEV adouble operator+(const double v, const adouble &a)
Definition adoublecuda.h:282
CUDADEV adouble cos(const adouble &a)
Definition adoublecuda.h:442
CUDADEV adouble atanh(const adouble &a)
Definition adoublecuda.h:578
CUDADEV adouble asin(const adouble &a)
Definition adoublecuda.h:452
CUDADEV adouble operator/(const double v, const adouble &a)
Definition adoublecuda.h:349
CUDADEV adouble erfc(const adouble &a)
Definition adoublecuda.h:795
CUDADEV adouble fabs(const adouble &a)
Definition adoublecuda.h:587
CUDADEV adouble atan(const adouble &a)
Definition adoublecuda.h:470
CUDADEV adouble log(const adouble &a)
Definition adoublecuda.h:404
CUDADEV adouble sqrt(const adouble &a)
Definition adoublecuda.h:418
CUDADEV int operator!=(const double v, const adouble &a)
Definition adoublecuda.h:866
CUDADEV adouble acos(const adouble &a)
Definition adoublecuda.h:461
CUDAHOST ostream & operator<<(ostream &out, const adouble &a)
Definition adoublecuda.h:942
CUDADEV adouble fmin(const adouble &a, const adouble &b)
Definition adoublecuda.h:697
CUDADEV adouble pow(const adouble &a, double v)
Definition adoublecuda.h:495
CUDADEV adouble erf(const adouble &a)
Definition adoublecuda.h:785
CUDADEV adouble cosh(const adouble &a)
Definition adoublecuda.h:541
CUDADEV adouble tanh(const adouble &a)
Definition adoublecuda.h:550
CUDADEV adouble floor(const adouble &a)
Definition adoublecuda.h:617
CUDADEV int operator<=(const double v, const adouble &a)
Definition adoublecuda.h:878
CUDADEV adouble tan(const adouble &a)
Definition adoublecuda.h:385
CUDADEV int operator>(const double v, const adouble &a)
Definition adoublecuda.h:890
CUDADEV adouble fmax(const adouble &a, const adouble &b)
Definition adoublecuda.h:625
CUDADEV adouble operator*(const double v, const adouble &a)
Definition adoublecuda.h:324
__device__ double makeNaN()
Definition adoublecuda.h:58
CUDADEV adouble exp(const adouble &a)
Definition adoublecuda.h:396
CUDADEV adouble ceil(const adouble &a)
Definition adoublecuda.h:609
CUDADEV adouble ldexp(const adouble &a, const adouble &b)
Definition adoublecuda.h:769