16 #ifndef dealii_numbers_h 17 #define dealii_numbers_h 24 #ifdef DEAL_II_COMPILER_CUDA_AWARE 25 # include <cuComplex.h> 31 #include <type_traits> 33 #ifdef DEAL_II_COMPILER_CUDA_AWARE 34 # define DEAL_II_CUDA_HOST_DEV __host__ __device__ 36 # define DEAL_II_CUDA_HOST_DEV 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__) 123 template <
typename Number,
127 template <
typename T>
135 #ifdef DEAL_II_WITH_ADOLC 138 # include <adolc/adouble.h> 144 #ifdef DEAL_II_TRILINOS_WITH_SACADO 145 # include <Sacado.hpp> 150 template <
typename Number, std::
size_t w
idth>
151 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
152 sqrt(const ::VectorizedArray<Number, width> &);
153 template <
typename Number, std::
size_t w
idth>
154 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
155 abs(const ::VectorizedArray<Number, width> &);
156 template <
typename Number, std::
size_t w
idth>
157 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
158 max(const ::VectorizedArray<Number, width> &,
159 const ::VectorizedArray<Number, width> &);
160 template <
typename Number, std::
size_t w
idth>
161 DEAL_II_ALWAYS_INLINE ::VectorizedArray<Number, width>
162 min(const ::VectorizedArray<Number, width> &,
163 const ::VectorizedArray<Number, width> &);
164 template <
typename Number,
size_t w
idth>
166 pow(const ::VectorizedArray<Number, width> &,
const Number p);
167 template <
typename Number,
size_t w
idth>
169 sin(const ::VectorizedArray<Number, width> &);
170 template <
typename Number,
size_t w
idth>
172 cos(const ::VectorizedArray<Number, width> &);
173 template <
typename Number,
size_t w
idth>
175 tan(const ::VectorizedArray<Number, width> &);
176 template <
typename Number,
size_t w
idth>
178 exp(const ::VectorizedArray<Number, width> &);
179 template <
typename Number,
size_t w
idth>
181 log(const ::VectorizedArray<Number, width> &);
206 static constexpr
double E = 2.7182818284590452354;
211 static constexpr
double LOG2E = 1.4426950408889634074;
216 static constexpr
double LOG10E = 0.43429448190325182765;
221 static constexpr
double LN2 = 0.69314718055994530942;
226 static constexpr
double LN10 = 2.30258509299404568402;
231 static constexpr
double PI = 3.14159265358979323846;
236 static constexpr
double PI_2 = 1.57079632679489661923;
241 static constexpr
double PI_4 = 0.78539816339744830962;
246 static constexpr
double SQRT2 = 1.41421356237309504880;
251 static constexpr
double SQRT1_2 = 0.70710678118654752440;
258 template <
typename Number,
typename =
void>
265 template <
typename Number>
286 is_finite(
const std::complex<double> &x);
304 is_finite(
const std::complex<long double> &x);
316 template <
typename Number1,
typename Number2>
330 template <
typename Number1,
typename Number2>
341 template <
typename Number>
355 template <
typename Number1,
typename Number2>
369 template <
typename Number1,
typename Number2>
372 const Number2 &value_2);
386 template <
typename Number1,
typename Number2>
400 template <
typename Number1,
typename Number2>
403 const Number2 &value_2);
413 template <
typename number>
421 static constexpr
bool is_complex =
false;
439 conjugate(
const number &x);
449 template <
typename Dummy = number>
451 typename std::enable_if<std::is_same<Dummy, number>::value &&
454 abs_square(
const number &x);
456 template <
typename Dummy = number>
458 typename std::enable_if<std::is_same<Dummy, number>::value &&
459 !is_cuda_compatible<Dummy>::value,
461 abs_square(
const number &x);
467 abs(
const number &x);
475 template <
typename number>
483 static constexpr
bool is_complex =
true;
496 static constexpr std::complex<number>
497 conjugate(
const std::complex<number> &x);
506 abs_square(
const std::complex<number> &x);
513 abs(
const std::complex<number> &x);
521 return std::isnan(x);
529 return std::isfinite(x);
562 template <
typename number>
571 template <
typename number>
572 template <
typename Dummy>
574 typename std::enable_if<std::is_same<Dummy, number>::value &&
584 template <
typename number>
585 template <
typename Dummy>
587 typename std::enable_if<std::is_same<Dummy, number>::value &&
588 !is_cuda_compatible<Dummy>::value,
597 template <
typename number>
606 template <
typename number>
607 constexpr std::complex<number>
615 template <
typename number>
624 template <
typename number>
642 template <
typename T>
647 template <
typename NumberType>
659 template <
typename From,
typename To>
664 template <
typename T>
667 template <
typename F,
typename T>
668 static constexpr
auto 669 test(
int) -> decltype(f(static_cast<T>(std::declval<F>())),
true)
674 template <
typename F,
typename T>
675 static constexpr
auto 682 static bool const value = test<From, To>(0);
689 template <
typename T>
706 template <
typename F>
709 typename std::enable_if<
710 !std::is_same<
typename std::decay<T>::type,
711 typename std::decay<F>::type>::
value &&
712 std::is_constructible<T, F>::value>::type * =
nullptr)
718 template <
typename F>
721 typename std::enable_if<
722 !std::is_same<
typename std::decay<T>::type,
723 typename std::decay<F>::type>::
value &&
724 !std::is_constructible<T, F>::value &&
727 return static_cast<T>(f);
734 template <
typename F>
737 typename std::enable_if<
738 !std::is_same<
typename std::decay<T>::type,
739 typename std::decay<F>::type>::
value &&
740 !std::is_constructible<T, F>::value &&
748 template <
typename T>
751 static constexpr
const std::complex<T> &
757 static constexpr std::complex<T>
760 return std::complex<T>(t);
764 template <
typename U>
765 static constexpr std::complex<T>
773 #ifdef DEAL_II_COMPILER_CUDA_AWARE 780 return make_cuComplex(t, 0.f);
787 static cuDoubleComplex
790 return make_cuDoubleComplex(t, 0.);
798 #ifdef DEAL_II_ADOLC_WITH_ADVANCED_BRANCHING 825 template <
typename Number>
845 template <
typename Number>
880 template <
typename Number>
901 template <
typename Number>
913 template <
typename Number1,
typename Number2>
921 template <
typename Number1,
typename Number2>
929 template <
typename Number>
937 template <
typename Number1,
typename Number2>
945 template <
typename Number1,
typename Number2>
954 template <
typename Number1,
typename Number2>
962 template <
typename Number1,
typename Number2>
965 const Number2 &value_2)
static T value(const F &f, typename std::enable_if< !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 >::type *=nullptr)
static constexpr double LOG2E
static constexpr unsigned int max_width
bool value_is_less_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
static constexpr const T & value(const T &t)
static constexpr double LN10
static constexpr std::complex< T > value(const T &t)
static constexpr T value(const F &f, typename std::enable_if< !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 >::type *=nullptr)
bool values_are_equal(const Number &value_1, const adouble &value_2)
static cuDoubleComplex value(const double t)
static constexpr std::complex< T > value(const std::complex< U > &t)
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim >>> &Du)
static constexpr double LOG10E
Tensor< 2, dim, Number > F(const Tensor< 2, dim, Number > &Grad_u)
bool value_is_less_than(const Number &value_1, const adouble &value_2)
bool is_finite(const std::complex< long double > &x)
static constexpr double SQRT1_2
static constexpr double E
static constexpr double SQRT2
static constexpr auto test(int) -> decltype(f(static_cast< T >(std::declval< F >())), true)
bool values_are_not_equal(const Number1 &value_1, const Number2 &value_2)
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ALWAYS_INLINE
static constexpr auto test(...) -> bool
static cuComplex value(const float t)
static constexpr double PI_2
bool is_nan(const double x)
bool value_is_greater_than_or_equal_to(const Number1 &value_1, const Number2 &value_2)
static constexpr double LN2
bool value_is_greater_than(const Number1 &value_1, const Number2 &value_2)
static constexpr double PI
#define DEAL_II_NAMESPACE_OPEN
static constexpr const std::complex< T > & value(const std::complex< T > &t)
constexpr bool value_is_zero(const Number &value)
#define DEAL_II_CUDA_HOST_DEV
static constexpr double PI_4
static constexpr T value(const F &f, typename std::enable_if< !std::is_same< typename std::decay< T >::type, typename std::decay< F >::type >::value &&std::is_constructible< T, F >::value >::type *=nullptr)