16 #ifndef dealii_numbers_h 17 #define dealii_numbers_h 20 #include <deal.II/base/config.h> 22 #include <deal.II/base/types.h> 28 #ifdef DEAL_II_WITH_CUDA 29 # include <cuda_runtime_api.h> 30 # define DEAL_II_CUDA_HOST_DEV __host__ __device__ 32 # define DEAL_II_CUDA_HOST_DEV 35 DEAL_II_NAMESPACE_OPEN
38 template <
typename Number>
43 DEAL_II_NAMESPACE_CLOSE
47 #ifdef DEAL_II_WITH_ADOLC 48 # include <deal.II/differentiation/ad/adolc_math.h> 50 # include <adolc/adouble.h> 56 #ifdef DEAL_II_TRILINOS_WITH_SACADO 57 # include <Sacado.hpp> 62 template <
typename Number>
63 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number>
64 sqrt(const ::VectorizedArray<Number> &);
65 template <
typename Number>
66 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number>
67 abs(const ::VectorizedArray<Number> &);
68 template <
typename Number>
69 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number>
70 max(const ::VectorizedArray<Number> &,
71 const ::VectorizedArray<Number> &);
72 template <
typename Number>
73 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number>
74 min(const ::VectorizedArray<Number> &,
75 const ::VectorizedArray<Number> &);
76 template <
typename Number>
78 pow(const ::VectorizedArray<Number> &,
const Number p);
79 template <
typename Number>
81 sin(const ::VectorizedArray<Number> &);
82 template <
typename Number>
84 cos(const ::VectorizedArray<Number> &);
85 template <
typename Number>
87 tan(const ::VectorizedArray<Number> &);
88 template <
typename Number>
90 exp(const ::VectorizedArray<Number> &);
91 template <
typename Number>
93 log(const ::VectorizedArray<Number> &);
96 DEAL_II_NAMESPACE_OPEN
118 static const double E = 2.7182818284590452354;
123 static const double LOG2E = 1.4426950408889634074;
128 static const double LOG10E = 0.43429448190325182765;
133 static const double LN2 = 0.69314718055994530942;
138 static const double LN10 = 2.30258509299404568402;
143 static const double PI = 3.14159265358979323846;
148 static const double PI_2 = 1.57079632679489661923;
153 static const double PI_4 = 0.78539816339744830962;
158 static const double SQRT2 = 1.41421356237309504880;
163 static const double SQRT1_2 = 0.70710678118654752440;
199 is_finite(
const std::complex<double> &x);
217 is_finite(
const std::complex<long double> &x);
229 template <
typename Number1,
typename Number2>
243 template <
typename Number1,
typename Number2>
254 template <
typename Number>
268 template <
typename Number1,
typename Number2>
282 template <
typename Number1,
typename Number2>
285 const Number2 &value_2);
299 template <
typename Number1,
typename Number2>
313 template <
typename Number1,
typename Number2>
316 const Number2 &value_2);
328 template <
typename number>
336 static const bool is_complex =
false;
351 static DEAL_II_CUDA_HOST_DEV
const number &
352 conjugate(
const number &x);
362 abs_square(
const number &x);
368 abs(
const number &x);
378 template <
typename number>
386 static const bool is_complex =
true;
399 static std::complex<number>
400 conjugate(
const std::complex<number> &x);
409 abs_square(
const std::complex<number> &x);
416 abs(
const std::complex<number> &x);
424 return std::isnan(x);
430 return std::isfinite(x);
463 template <
typename number>
464 DEAL_II_CUDA_HOST_DEV
const number &
472 template <
typename number>
481 template <
typename number>
490 template <
typename number>
499 template <
typename number>
508 template <
typename number>
526 template <
typename T>
531 template <
typename NumberType>
543 template <
typename From,
typename To>
548 template <
typename T>
551 template <
typename F,
typename T>
552 static constexpr
auto 553 test(
int) -> decltype(f(static_cast<T>(std::declval<F>())),
true)
558 template <
typename F,
typename T>
559 static constexpr
auto 566 static bool const value = test<From, To>(0);
582 template <
typename T>
585 static DEAL_II_CUDA_HOST_DEV
const T &
599 template <
typename F>
602 typename std::enable_if<
603 !std::is_same<
typename std::decay<T>::type,
604 typename std::decay<F>::type>::value &&
605 std::is_constructible<T, F>::value>::type * =
nullptr)
611 template <
typename F>
614 typename std::enable_if<
615 !std::is_same<
typename std::decay<T>::type,
616 typename std::decay<F>::type>::value &&
617 !std::is_constructible<T, F>::value &&
620 return static_cast<T
>(f);
627 template <
typename F>
630 typename std::enable_if<
631 !std::is_same<
typename std::decay<T>::type,
632 typename std::decay<F>::type>::value &&
633 !std::is_constructible<T, F>::value &&
641 template <
typename T>
644 static const std::complex<T> &
645 value(
const std::complex<T> &t)
650 static std::complex<T>
653 return std::complex<T>(t);
657 template <
typename U>
658 static std::complex<T>
659 value(
const std::complex<U> &t)
669 #ifdef DEAL_II_ADOLC_WITH_ADVANCED_BRANCHING 683 values_are_equal(
const adouble &value_1,
const adouble &value_2);
696 template <
typename Number>
698 values_are_equal(
const adouble &value_1,
const Number &value_2)
701 return values_are_equal(value_1,
716 template <
typename Number>
718 values_are_equal(
const Number &value_1,
const adouble &value_2)
721 return values_are_equal(value_2, value_1);
737 value_is_less_than(
const adouble &value_1,
const adouble &value_2);
751 template <
typename Number>
753 value_is_less_than(
const adouble &value_1,
const Number &value_2)
756 return value_is_less_than(value_1,
772 template <
typename Number>
774 value_is_less_than(
const Number &value_1,
const adouble &value_2)
784 template <
typename Number1,
typename Number2>
786 values_are_equal(
const Number1 &value_1,
const Number2 &value_2)
792 template <
typename Number1,
typename Number2>
796 return !(values_are_equal(value_1, value_2));
800 template <
typename Number>
804 return values_are_equal(value, 0.0);
808 template <
typename Number1,
typename Number2>
810 value_is_less_than(
const Number1 &value_1,
const Number2 &value_2)
816 template <
typename Number1,
typename Number2>
820 return (value_is_less_than(value_1, value_2) ||
821 values_are_equal(value_1, value_2));
825 template <
typename Number1,
typename Number2>
833 template <
typename Number1,
typename Number2>
836 const Number2 &value_2)
838 return !(value_is_less_than(value_1, value_2));
842 DEAL_II_NAMESPACE_CLOSE
static const double SQRT2
bool value_is_less_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
bool value_is_zero(const Number &value)
bool values_are_equal(const Number1 &value_1, const Number2 &value_2)
bool is_finite(const double x)
bool values_are_not_equal(const Number1 &value_1, const Number2 &value_2)
bool is_nan(const double x)
bool value_is_greater_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
bool value_is_greater_than(const Number1 &value_1, const Number2 &value_2)
bool value_is_less_than(const Number1 &value_1, const Number2 &value_2)
T min(const T &t, const MPI_Comm &mpi_communicator)
static const double LOG2E
static const double SQRT1_2
T max(const T &t, const MPI_Comm &mpi_communicator)
static const double LOG10E