44 static_assert(std::is_floating_point_v<T>);
60 : m_real(static_cast<T>(other.
real()))
61 , m_imag(static_cast<T>(other.
imag()))
67 : m_real(other.
real())
68 , m_imag(other.
imag())
75 return std::complex<T>{m_real, m_imag};
116 m_real +=
static_cast<T
>(other.
real());
117 m_imag +=
static_cast<T
>(other.
imag());
132 m_real -=
static_cast<T
>(other.
real());
133 m_imag -=
static_cast<T
>(other.
imag());
149 auto const newReal = m_real *
static_cast<T
>(other.
real()) - m_imag *
static_cast<T
>(other.
imag());
150 auto const newImag = m_imag *
static_cast<T
>(other.
real()) + m_real *
static_cast<T
>(other.
imag());
322 return !(lhs == rhs);
344 template<
typename T,
typename TChar,
typename TTraits>
345 std::basic_ostream<TChar, TTraits>&
operator<<(std::basic_ostream<TChar, TTraits>& os,
Complex<T> const& x)
347 os << x.operator std::complex<T>();
352 template<
typename T,
typename TChar,
typename TTraits>
382 return std::abs(std::complex<T>(x));
390 return std::acos(std::complex<T>(x));
398 return std::acosh(std::complex<T>(x));
406 return std::arg(std::complex<T>(x));
414 return std::asin(std::complex<T>(x));
422 return std::asinh(std::complex<T>(x));
430 return std::atan(std::complex<T>(x));
438 return std::atanh(std::complex<T>(x));
446 return std::conj(std::complex<T>(x));
454 return std::cos(std::complex<T>(x));
462 return std::cosh(std::complex<T>(x));
470 return std::exp(std::complex<T>(x));
478 return std::log(std::complex<T>(x));
486 return std::log10(std::complex<T>(x));
494 return std::norm(std::complex<T>(x));
502 return std::polar(r, theta);
507 template<
typename T,
typename U>
511 auto const result = std::pow(std::complex<T>(x), std::complex<U>(y));
512 using ValueType =
typename decltype(result)::value_type;
518 template<
typename T,
typename U>
526 template<
typename T,
typename U>
537 return std::proj(std::complex<T>(x));
545 return std::sin(std::complex<T>(x));
553 return std::sinh(std::complex<T>(x));
561 return std::sqrt(std::complex<T>(x));
569 return std::tan(std::complex<T>(x));
577 return std::tanh(std::complex<T>(x));
583 using internal::Complex;
585#if defined(ALPAKA_ACC_SYCL_ENABLED) || defined(ALPAKA_ACC_GPU_CUDA_ENABLED) || defined(ALPAKA_ACC_GPU_HIP_ENABLED)
587 namespace math::trait
591 template<
typename TAcc,
typename T>
595 template<
typename TCtx>
603 template<
typename TAcc,
typename T>
607 template<
typename TCtx>
611 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(-1.0)}
615 +
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)}
616 *
sqrt(ctx,
static_cast<T
>(1.0) -
arg *
arg));
621 template<
typename TAcc,
typename T>
625 template<
typename TCtx>
629 return log(ctx,
arg +
sqrt(ctx,
arg -
static_cast<T
>(1.0)) *
sqrt(ctx,
arg +
static_cast<T
>(1.0)));
634 template<
typename TAcc,
typename T>
638 template<
typename TCtx>
646 template<
typename TAcc,
typename T>
650 template<
typename TCtx>
654 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)}
658 -
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
arg);
663 template<
typename TAcc,
typename T>
667 template<
typename TCtx>
676 template<
typename TAcc,
typename T>
680 template<
typename TCtx>
684 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(-0.5)}
688 / (
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} +
arg));
693 template<
typename TAcc,
typename T>
697 template<
typename TCtx>
701 return static_cast<T
>(0.5)
702 * (
log(ctx,
static_cast<T
>(1.0) +
arg) -
log(ctx,
static_cast<T
>(1.0) -
arg));
707 template<
typename TAcc,
typename T>
717 template<
typename TAcc,
typename T>
721 template<
typename TCtx>
732 template<
typename TAcc,
typename T>
736 template<
typename TCtx>
740 return T(0.5) * (
exp(ctx,
arg) +
exp(ctx,
static_cast<T
>(-1.0) *
arg));
745 template<
typename TAcc,
typename T>
749 template<
typename TCtx>
753 auto re = T{}, im = T{};
760 template<
typename TAcc,
typename T>
764 template<
typename TCtx>
769 return log(ctx,
abs(ctx, argument))
770 +
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
arg(ctx, argument);
775 template<
typename TAcc,
typename T>
779 template<
typename TCtx>
782 return log(ctx, argument) /
log(ctx,
static_cast<T
>(2));
787 template<
typename TAcc,
typename T>
791 template<
typename TCtx>
794 return log(ctx, argument) /
log(ctx,
static_cast<T
>(10));
799 template<
typename TAcc,
typename T,
typename U>
803 template<
typename TCtx>
811 return exp(ctx, Promoted{exponent} *
log(ctx, Promoted{base}));
816 template<
typename TAcc,
typename T,
typename U>
817 struct Pow<TAcc,
Complex<T>, U>
820 template<
typename TCtx>
828 template<
typename TAcc,
typename T,
typename U>
829 struct Pow<TAcc, T,
Complex<U>>
832 template<
typename TCtx>
840 template<
typename TAcc,
typename T>
844 template<
typename TCtx>
847 return static_cast<T
>(1.0) /
sqrt(ctx,
arg);
852 template<
typename TAcc,
typename T>
856 template<
typename TCtx>
860 return (
exp(ctx,
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} *
arg)
862 /
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(2.0)};
867 template<
typename TAcc,
typename T>
871 template<
typename TCtx>
875 return (
exp(ctx,
arg) -
exp(ctx,
static_cast<T
>(-1.0) *
arg)) /
static_cast<T
>(2.0);
880 template<
typename TAcc,
typename T>
881 struct SinCos<TAcc,
Complex<T>>
884 template<
typename TCtx>
891 result_sin =
sin(ctx,
arg);
892 result_cos =
cos(ctx,
arg);
897 template<
typename TAcc,
typename T>
901 template<
typename TCtx>
906 auto const halfArg = T(0.5) *
arg(ctx, argument);
907 auto re = T{}, im = T{};
908 sincos(ctx, halfArg, im, re);
914 template<
typename TAcc,
typename T>
918 template<
typename TCtx>
923 auto const expValue =
exp(ctx,
Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(2.0)} *
arg);
924 return Complex<T>{
static_cast<T
>(0.0),
static_cast<T
>(1.0)} * (
static_cast<T
>(1.0) - expValue)
925 / (
static_cast<T
>(1.0) + expValue);
930 template<
typename TAcc,
typename T>
934 template<
typename TCtx>
938 return (
exp(ctx,
arg) -
exp(ctx,
static_cast<T
>(-1.0) *
arg))
939 / (
exp(ctx,
arg) +
exp(ctx,
static_cast<T
>(-1.0) *
arg));
Implementation of a complex number useable on host and device.
ALPAKA_FN_HOST_ACC Complex & operator+=(T const &other)
Addition assignment with a real number.
constexpr ALPAKA_FN_HOST_ACC T imag() const
Get the imaginary part.
constexpr ALPAKA_FN_HOST_ACC T real() const
Get the real part.
ALPAKA_FN_HOST_ACC Complex & operator-=(T const &other)
Subtraction assignment with a real number.
ALPAKA_FN_HOST_ACC Complex & operator/=(Complex< U > const &other)
Division assignment with a complex number.
ALPAKA_FN_HOST_ACC Complex & operator-=(Complex< U > const &other)
Subtraction assignment with a complex number.
constexpr ALPAKA_FN_HOST_ACC void imag(T value)
Set the imaginary part.
constexpr Complex(Complex const &other)=default
Copy constructor.
ALPAKA_FN_HOST_ACC Complex & operator*=(Complex< U > const &other)
Multiplication assignment with a complex number.
Complex & operator=(Complex const &)=default
Assignment.
constexpr ALPAKA_FN_HOST_ACC Complex(Complex< U > const &other)
Constructor from Complex of another type.
constexpr ALPAKA_FN_HOST_ACC void real(T value)
Set the real part.
ALPAKA_FN_HOST_ACC Complex & operator*=(T const &other)
Multiplication assignment with a real number.
ALPAKA_FN_HOST_ACC Complex & operator/=(T const &other)
Division assignment with a real number.
constexpr ALPAKA_FN_HOST_ACC Complex(std::complex< T > const &other)
Constructor from std::complex.
constexpr ALPAKA_FN_HOST_ACC Complex(T const &real=T{}, T const &imag=T{})
Constructor from the given real and imaginary parts.
T value_type
Type of the real and imaginary parts.
ALPAKA_FN_HOST_ACC Complex & operator+=(Complex< U > const &other)
Addition assignment with a complex number.
#define ALPAKA_FN_ACC
All functions that can be used on an accelerator have to be attributed with ALPAKA_FN_ACC or ALPAKA_F...
#define ALPAKA_FN_HOST_ACC
#define ALPAKA_NO_HOST_ACC_WARNING
Disable nvcc warning: 'calling a host function from host device function.' Usage: ALPAKA_NO_HOST_ACC_...
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > tan(Complex< T > const &x)
Tangent.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > cosh(Complex< T > const &x)
Hyperbolic cosine.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC auto pow(Complex< T > const &x, Complex< U > const &y)
Complex power of a complex number.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > acosh(Complex< T > const &x)
Arc hyperbolic cosine.
ALPAKA_FN_HOST_ACC Complex< T > operator+(Complex< T > const &val)
Host-device arithmetic operations matching std::complex<T>.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > asinh(Complex< T > const &x)
Arc hyperbolic sine.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > log(Complex< T > const &x)
Natural logarithm.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > conj(Complex< T > const &x)
Complex conjugate.
ALPAKA_FN_HOST_ACC Complex< T > operator-(Complex< T > const &val)
Unary minus.
constexpr ALPAKA_FN_HOST_ACC bool operator==(Complex< T > const &lhs, Complex< T > const &rhs)
Equality of two complex numbers.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > polar(T const &r, T const &theta=T())
Get a complex number with given magnitude and phase angle.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > atanh(Complex< T > const &x)
Arc hyperbolic tangent.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC T arg(Complex< T > const &x)
Argument.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > tanh(Complex< T > const &x)
Hyperbolic tangent.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > sinh(Complex< T > const &x)
Hyperbolic sine.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC T abs(Complex< T > const &x)
Host-only math functions matching std::complex<T>.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > sqrt(Complex< T > const &x)
Square root.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > proj(Complex< T > const &x)
Projection onto the Riemann sphere.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC T norm(Complex< T > const &x)
Squared magnitude.
std::basic_istream< TChar, TTraits > & operator>>(std::basic_istream< TChar, TTraits > &is, Complex< T > const &x)
Host-only input of a complex number.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > acos(Complex< T > const &x)
Arc cosine.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > cos(Complex< T > const &x)
Cosine.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > sin(Complex< T > const &x)
Sine.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > asin(Complex< T > const &x)
Arc sine.
std::basic_ostream< TChar, TTraits > & operator<<(std::basic_ostream< TChar, TTraits > &os, Complex< T > const &x)
Host-only output of a complex number.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > log10(Complex< T > const &x)
Base 10 logarithm.
ALPAKA_FN_HOST_ACC Complex< T > operator*(Complex< T > const &lhs, Complex< T > const &rhs)
Muptiplication of two complex numbers.
ALPAKA_FN_HOST_ACC Complex< T > operator/(Complex< T > const &lhs, Complex< T > const &rhs)
Division of two complex numbers.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > atan(Complex< T > const &x)
Arc tangent.
constexpr ALPAKA_FN_HOST_ACC bool operator!=(Complex< T > const &lhs, Complex< T > const &rhs)
Inequality of two complex numbers.
ALPAKA_NO_HOST_ACC_WARNING constexpr ALPAKA_FN_HOST_ACC Complex< T > exp(Complex< T > const &x)
Exponential.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto pow(T const &pow_ctx, TBase const &base, TExp const &exp)
Computes the value of base raised to the power exp.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto sqrt(T const &sqrt_ctx, TArg const &arg)
Computes the square root of arg.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto exp(T const &exp_ctx, TArg const &arg)
Computes the e (Euler's number, 2.7182818) raised to the given power arg.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto cos(T const &cos_ctx, TArg const &arg)
Computes the cosine (measured in radians).
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto sincos(T const &sincos_ctx, TArg const &arg, TArg &result_sin, TArg &result_cos) -> void
Computes the sine and cosine (measured in radians).
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto atan2(T const &atan2_ctx, Ty const &y, Tx const &x)
Computes the arc tangent of y/x using the signs of arguments to determine the correct quadrant.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto sin(T const &sin_ctx, TArg const &arg)
Computes the sine (measured in radians).
ALPAKA_FN_INLINE ALPAKA_FN_HOST_ACC auto floatEqualExactNoWarning(T a, T b) -> bool
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto abs(T const &abs_ctx, TArg const &arg)
Computes the absolute value.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto log(T const &log_ctx, TArg const &arg)
Computes the the natural (base e) logarithm of arg.
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto arg(T const &arg_ctx, TArgument const &argument)
Computes the complex argument of the value.
The alpaka accelerator library.
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_NO_HOST_ACC_WARNING ALPAKA_FN_HOST_ACC auto operator()(T const &, TArgument const &argument)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TBase const &base, TExp const &exp)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg, TArg &result_sin, TArg &result_cos)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)
ALPAKA_FN_HOST_ACC auto operator()(T const &, TArg const &arg)