16 #ifndef dealii_numbers_h
17 #define dealii_numbers_h
24 #ifdef DEAL_II_WITH_CUDA
25 # include <cuComplex.h>
28 #include <Kokkos_Macros.hpp>
33 #include <type_traits>
35 #define DEAL_II_HOST_DEVICE KOKKOS_FUNCTION
36 #define DEAL_II_CUDA_HOST_DEV DEAL_II_HOST_DEVICE
37 #define DEAL_II_HOST_DEVICE_ALWAYS_INLINE KOKKOS_FORCEINLINE_FUNCTION
41 #ifdef DEAL_II_WITH_ADOLC
69 template <
typename Number>
91 #if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 512
93 #elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 256
95 #elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128
115 #if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128 && defined(__ALTIVEC__)
117 #elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 512 && defined(__AVX512F__)
119 #elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 256 && defined(__AVX__)
121 #elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128 && defined(__SSE2__)
133 template <
typename Number,
137 template <
typename T>
141 #ifdef DEAL_II_WITH_ADOLC
156 abs(
const adouble &x);
159 abs(
const adtl::adouble &x);
167 template <
typename Number, std::
size_t w
idth>
168 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
169 sqrt(const ::VectorizedArray<Number, width> &);
170 template <
typename Number, std::
size_t w
idth>
171 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
172 abs(const ::VectorizedArray<Number, width> &);
173 template <
typename Number, std::
size_t w
idth>
174 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
175 max(const ::VectorizedArray<Number, width> &,
176 const ::VectorizedArray<Number, width> &);
177 template <
typename Number, std::
size_t w
idth>
178 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
179 min(const ::VectorizedArray<Number, width> &,
180 const ::VectorizedArray<Number, width> &);
181 template <
typename Number,
size_t w
idth>
183 pow(const ::VectorizedArray<Number, width> &,
const Number p);
184 template <
typename Number,
size_t w
idth>
186 sin(const ::VectorizedArray<Number, width> &);
187 template <
typename Number,
size_t w
idth>
189 cos(const ::VectorizedArray<Number, width> &);
190 template <
typename Number,
size_t w
idth>
192 tan(const ::VectorizedArray<Number, width> &);
193 template <
typename Number,
size_t w
idth>
195 exp(const ::VectorizedArray<Number, width> &);
196 template <
typename Number,
size_t w
idth>
198 log(const ::VectorizedArray<Number, width> &);
223 static constexpr
double E = 2.7182818284590452354;
228 static constexpr
double LOG2E = 1.4426950408889634074;
233 static constexpr
double LOG10E = 0.43429448190325182765;
238 static constexpr
double LN2 = 0.69314718055994530942;
243 static constexpr
double LN10 = 2.30258509299404568402;
248 static constexpr
double PI = 3.14159265358979323846;
253 static constexpr
double PI_2 = 1.57079632679489661923;
258 static constexpr
double PI_4 = 0.78539816339744830962;
263 static constexpr
double SQRT2 = 1.41421356237309504880;
268 static constexpr
double SQRT1_2 = 0.70710678118654752440;
275 template <
typename Number,
typename =
void>
282 template <
typename Number>
303 is_finite(
const std::complex<double> &x);
321 is_finite(
const std::complex<long double> &x);
333 template <
typename Number1,
typename Number2>
347 template <
typename Number1,
typename Number2>
358 template <
typename Number>
372 template <
typename Number1,
typename Number2>
386 template <
typename Number1,
typename Number2>
389 const Number2 &value_2);
403 template <
typename Number1,
typename Number2>
417 template <
typename Number1,
typename Number2>
420 const Number2 &value_2);
430 template <
typename number>
471 template <
typename Dummy = number>
473 std::enable_if_t<std::is_same<Dummy, number>::value &&
478 template <
typename Dummy = number>
479 static constexpr std::enable_if_t<std::is_same<Dummy, number>::value &&
488 abs(
const number &x);
496 template <
typename number>
522 static constexpr std::complex<number>
523 conjugate(
const std::complex<number> &x);
539 abs(
const std::complex<number> &x);
547 return std::isnan(x);
555 return std::isfinite(x);
588 template <
typename number>
597 template <
typename number>
598 template <
typename Dummy>
600 std::enable_if_t<std::is_same<Dummy, number>::value &&
610 template <
typename number>
611 template <
typename Dummy>
612 constexpr std::enable_if_t<std::is_same<Dummy, number>::value &&
622 template <
typename number>
628 #ifdef DEAL_II_WITH_ADOLC
640 template <
typename number>
641 constexpr std::complex<number>
649 template <
typename number>
655 #ifdef DEAL_II_WITH_ADOLC
664 template <
typename number>
682 template <
typename T>
687 template <
typename NumberType>
699 template <
typename From,
typename To>
704 template <
typename T>
707 template <
typename F,
typename T>
708 static constexpr
auto
709 test(
int) -> decltype(
f(
static_cast<T>(std::declval<F>())),
true)
714 template <
typename F,
typename T>
715 static constexpr
auto
722 static bool const value = test<From, To>(0);
729 template <
typename T>
746 template <
typename F>
749 std::enable_if_t<!std::is_same<
typename std::decay<T>::type,
750 typename std::decay<F>::type>::
value &&
751 std::is_constructible<T, F>::value> * =
nullptr)
757 template <
typename F>
760 std::enable_if_t<!std::is_same<
typename std::decay<T>::type,
761 typename std::decay<F>::type>::
value &&
762 !std::is_constructible<T, F>::value &&
766 return static_cast<T>(f);
773 template <
typename F>
777 std::enable_if_t<!std::is_same<
typename std::decay<T>::type,
778 typename std::decay<F>::type>::
value &&
779 !std::is_constructible<T, F>::value &&
787 template <
typename T>
790 static constexpr
const std::complex<T> &
796 static constexpr std::complex<T>
799 return std::complex<T>(t);
803 template <
typename U>
804 static constexpr std::complex<T>
812 #ifdef DEAL_II_WITH_CUDA
819 return make_cuComplex(t, 0.f);
826 static cuDoubleComplex
829 return make_cuDoubleComplex(t, 0.);
837 #ifdef DEAL_II_ADOLC_WITH_ADVANCED_BRANCHING
864 template <
typename Number>
884 template <
typename Number>
919 template <
typename Number>
940 template <
typename Number>
952 template <
typename Number1,
typename Number2>
960 template <
typename Number1,
typename Number2>
968 template <
typename Number>
976 template <
typename Number1,
typename Number2>
984 template <
typename Number1,
typename Number2>
993 template <
typename Number1,
typename Number2>
1001 template <
typename Number1,
typename Number2>
1004 const Number2 &value_2)
VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &x)
#define DEAL_II_ALWAYS_INLINE
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim >>> &Du)
Tensor< 2, dim, Number > F(const Tensor< 2, dim, Number > &Grad_u)
static constexpr double LOG10E
static constexpr double PI_2
bool value_is_less_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
static constexpr double E
static constexpr double PI
bool value_is_greater_than(const Number1 &value_1, const Number2 &value_2)
static constexpr double SQRT2
constexpr bool value_is_zero(const Number &value)
bool values_are_not_equal(const Number1 &value_1, const Number2 &value_2)
static constexpr double SQRT1_2
constexpr bool values_are_equal(const Number1 &value_1, const Number2 &value_2)
static constexpr double PI_4
static constexpr double LN10
static constexpr double LN2
bool value_is_less_than(const Number1 &value_1, const Number2 &value_2)
bool is_finite(const double x)
static constexpr double LOG2E
bool value_is_greater_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
bool is_nan(const double x)
#define DEAL_II_HOST_DEVICE
#define DEAL_II_HOST_DEVICE_ALWAYS_INLINE
static cuComplex value(const float t)
static cuDoubleComplex value(const double t)
static constexpr std::complex< T > value(const std::complex< U > &t)
static constexpr std::complex< T > value(const T &t)
static constexpr const std::complex< T > & value(const std::complex< T > &t)
static T value(const F &f, std::enable_if_t<!std::is_same< typename std::decay< T >::type, typename std::decay< F >::type >::value &&!std::is_constructible< T, F >::value &&!is_explicitly_convertible< const F, T >::value &&Differentiation::AD::is_ad_number< F >::value > *=nullptr)
static constexpr DEAL_II_HOST_DEVICE_ALWAYS_INLINE T value(const F &f, std::enable_if_t<!std::is_same< typename std::decay< T >::type, typename std::decay< F >::type >::value &&std::is_constructible< T, F >::value > *=nullptr)
static constexpr T value(const F &f, std::enable_if_t<!std::is_same< typename std::decay< T >::type, typename std::decay< F >::type >::value &&!std::is_constructible< T, F >::value &&is_explicitly_convertible< const F, T >::value > *=nullptr)
static constexpr DEAL_II_HOST_DEVICE_ALWAYS_INLINE const T & value(const T &t)
constexpr static unsigned int max_width
static constexpr auto test(...) -> bool
static constexpr auto test(int) -> decltype(f(static_cast< T >(std::declval< F >())), true)
std::complex< double > double_type
static constexpr const number & conjugate(const number &x)
static constexpr std::enable_if_t< std::is_same< Dummy, number >::value &&!is_cuda_compatible< Dummy >::value, real_type > abs_square(const number &x)
static constexpr bool is_complex
static real_type abs(const number &x)
static constexpr std::enable_if_t< std::is_same< Dummy, number >::value &&is_cuda_compatible< Dummy >::value, real_type > abs_square(const number &x)