13#ifndef dealii_numbers_h
14#define dealii_numbers_h
22#include <Kokkos_MathematicalFunctions.hpp>
31#ifdef DEAL_II_WITH_ADOLC
59 template <
typename Number>
81#if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 512
83#elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 256
85#elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128
105#if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128 && defined(__ALTIVEC__)
107#elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 512 && defined(__AVX512F__)
109#elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 256 && defined(__AVX__)
111#elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128 && defined(__SSE2__)
113#elif DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128 && defined(__ARM_NEON)
125template <
typename Number,
133#ifdef DEAL_II_WITH_ADOLC
148abs(
const adouble &x);
151abs(
const adtl::adouble &x);
159 template <
typename Number, std::
size_t w
idth>
160 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
sqrt(
161 const ::VectorizedArray<Number, width> &);
162 template <
typename Number, std::
size_t w
idth>
163 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
abs(
164 const ::VectorizedArray<Number, width> &);
165 template <
typename Number, std::
size_t w
idth>
166 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
max(
167 const ::VectorizedArray<Number, width> &,
168 const ::VectorizedArray<Number, width> &);
169 template <
typename Number, std::
size_t w
idth>
170 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
min(
171 const ::VectorizedArray<Number, width> &,
172 const ::VectorizedArray<Number, width> &);
173 template <
typename Number,
size_t w
idth>
175 const ::VectorizedArray<Number, width> &,
const Number p);
176 template <
typename Number,
size_t w
idth>
178 const ::VectorizedArray<Number, width> &);
179 template <
typename Number,
size_t w
idth>
181 const ::VectorizedArray<Number, width> &);
182 template <
typename Number,
size_t w
idth>
184 const ::VectorizedArray<Number, width> &);
185 template <
typename Number,
size_t w
idth>
187 const ::VectorizedArray<Number, width> &);
188 template <
typename Number,
size_t w
idth>
190 const ::VectorizedArray<Number, width> &);
215 constexpr double E = 2.7182818284590452354;
220 constexpr double LOG2E = 1.4426950408889634074;
225 constexpr double LOG10E = 0.43429448190325182765;
230 constexpr double LN2 = 0.69314718055994530942;
235 constexpr double LN10 = 2.30258509299404568402;
240 constexpr double PI = 3.14159265358979323846;
245 constexpr double PI_2 = 1.57079632679489661923;
250 constexpr double PI_4 = 0.78539816339744830962;
255 constexpr double SQRT2 = 1.41421356237309504880;
260 constexpr double SQRT1_2 = 0.70710678118654752440;
277 bool is_finite(
const std::complex<double> &x);
283 bool is_finite(
const std::complex<float> &x);
293 bool is_finite(
const std::complex<long double> &x);
305 template <
typename Number1,
typename Number2>
307 const Number2 &value_2);
319 template <
typename Number1,
typename Number2>
321 const Number2 &value_2);
330 template <
typename Number>
343 template <
typename Number1,
typename Number2>
356 template <
typename Number1,
typename Number2>
358 const Number2 &value_2);
372 template <
typename Number1,
typename Number2>
385 template <
typename Number1,
typename Number2>
387 const Number2 &value_2);
397 template <
typename number>
453 template <
typename number>
479 static constexpr std::complex<number>
480 conjugate(
const std::complex<number> &x);
496 abs(
const std::complex<number> &x);
503 return std::isnan(x);
510 return std::isfinite(x);
533 inline bool is_finite(
const std::complex<long double> &x)
540 template <
typename number>
549 template <
typename number>
558 template <
typename number>
564#if DEAL_II_KOKKOS_VERSION_GTE(3, 7, 0)
565 if constexpr (std::is_same_v<number, double> ||
566 std::is_same_v<number, float>)
570 return Kokkos::abs(x);
576#ifdef DEAL_II_WITH_ADOLC
588 template <
typename number>
590 const std::complex<number> &x)
597 template <
typename number>
603#ifdef DEAL_II_WITH_ADOLC
612 template <
typename number>
630 template <
typename T>
635 template <
typename NumberType>
647 template <
typename From,
typename To>
649 decltype(
static_cast<To
>(std::declval<From>()));
650 template <
typename From,
typename To>
652 internal::is_supported_operation<get_is_explicitly_convertible, From, To>;
658 template <
typename T>
675 template <
typename F>
678 std::enable_if_t<!std::is_same_v<std::decay_t<T>, std::decay_t<F>> &&
679 std::is_constructible_v<T, F>> * =
nullptr)
685 template <
typename F>
688 std::enable_if_t<!std::is_same_v<std::decay_t<T>, std::decay_t<F>> &&
689 !std::is_constructible_v<T, F> &&
690 is_explicitly_convertible<const F, T>> * =
nullptr)
692 return static_cast<T
>(f);
699 template <
typename F>
703 std::enable_if_t<!std::is_same_v<std::decay_t<T>, std::decay_t<F>> &&
704 !std::is_constructible_v<T, F> &&
705 !is_explicitly_convertible<const F, T> &&
712 template <
typename T>
715 static constexpr const std::complex<T> &
721 static constexpr std::complex<T>
724 return std::complex<T>(t);
728 template <
typename U>
729 static constexpr std::complex<T>
741#ifdef DEAL_II_ADOLC_WITH_ADVANCED_BRANCHING
768 template <
typename Number>
788 template <
typename Number>
823 template <
typename Number>
844 template <
typename Number>
856 template <
typename Number1,
typename Number2>
864 template <
typename Number1,
typename Number2>
865 inline constexpr bool
872 template <
typename Number>
880 template <
typename Number1,
typename Number2>
888 template <
typename Number1,
typename Number2>
897 template <
typename Number1,
typename Number2>
905 template <
typename Number1,
typename Number2>
908 const Number2 &value_2)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_HOST_DEVICE
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_HOST_DEVICE_ALWAYS_INLINE
decltype(static_cast< To >(std::declval< From >())) get_is_explicitly_convertible
constexpr bool is_explicitly_convertible
bool value_is_less_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)
constexpr bool values_are_not_equal(const Number1 &value_1, const Number2 &value_2)
constexpr bool value_is_zero(const Number &value)
constexpr bool values_are_equal(const Number1 &value_1, const Number2 &value_2)
bool value_is_less_than(const Number1 &value_1, const Number2 &value_2)
bool is_finite(const double x)
bool value_is_greater_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
bool is_nan(const double x)
::VectorizedArray< Number, width > log(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > exp(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > tan(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > cos(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sin(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
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_v< std::decay_t< T >, std::decay_t< F > > &&!std::is_constructible_v< T, F > &&!is_explicitly_convertible< const F, T > &&Differentiation::AD::is_ad_number< F >::value > *=nullptr)
static constexpr T value(const F &f, std::enable_if_t<!std::is_same_v< std::decay_t< T >, std::decay_t< F > > &&std::is_constructible_v< T, F > > *=nullptr)
static constexpr const T & value(const T &t)
static constexpr T value(const F &f, std::enable_if_t<!std::is_same_v< std::decay_t< T >, std::decay_t< F > > &&!std::is_constructible_v< T, F > &&is_explicitly_convertible< const F, T > > *=nullptr)
static constexpr unsigned int max_width
std::complex< double > double_type
static constexpr const number & conjugate(const number &x)
static constexpr bool is_complex
static real_type abs(const number &x)
static constexpr real_type abs_square(const number &x)