diff --git a/vtkm/Math.h b/vtkm/Math.h index 9d48cde71..cf1394441 100644 --- a/vtkm/Math.h +++ b/vtkm/Math.h @@ -2570,9 +2570,25 @@ vtkm::Int64 Abs(vtkm::Int64 x) #error Unknown size of Int64. #endif } +static inline VTKM_EXEC_CONT +vtkm::Float32 Abs(vtkm::Float32 x) { +#ifdef VTKM_CUDA + return VTKM_CUDA_MATH_FUNCTION_32(fabs)(x); +#else + return std::fabs(x); +#endif +} +static inline VTKM_EXEC_CONT +vtkm::Float64 Abs(vtkm::Float64 x) { +#ifdef VTKM_CUDA + return VTKM_CUDA_MATH_FUNCTION_64(fabs)(x); +#else + return std::fabs(x); +#endif +} template static inline VTKM_EXEC_CONT -typename detail::FloatingPointReturnType::Type +typename detail::FloatingPointReturnType::Type Abs(T x) { #ifdef VTKM_CUDA return VTKM_CUDA_MATH_FUNCTION_64(fabs)(static_cast(x)); @@ -2580,31 +2596,10 @@ Abs(T x) { return std::fabs(static_cast(x)); #endif } -template<> -inline VTKM_EXEC_CONT -detail::FloatingPointReturnType::Type -Abs(vtkm::Float32 x) { -#ifdef VTKM_CUDA - return VTKM_CUDA_MATH_FUNCTION_32(fabs)(x); -#else - return std::fabs(x); -#endif -} -template<> -inline VTKM_EXEC_CONT -detail::FloatingPointReturnType::Type -Abs(vtkm::Float64 x) { -#ifdef VTKM_CUDA - return VTKM_CUDA_MATH_FUNCTION_64(fabs)(x); -#else - return std::fabs(x); -#endif -} template static inline VTKM_EXEC_CONT -vtkm::Vec::Type,N> -Abs(const vtkm::Vec &x) { - vtkm::Vec::Type,N> result; +vtkm::Vec Abs(const vtkm::Vec &x) { + vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Abs(x[index]); @@ -2613,27 +2608,24 @@ Abs(const vtkm::Vec &x) { } template static inline VTKM_EXEC_CONT -vtkm::Vec::Type,4> -Abs(const vtkm::Vec &x) { - return vtkm::Vec::Type,4>(vtkm::Abs(x[0]), - vtkm::Abs(x[1]), - vtkm::Abs(x[2]), - vtkm::Abs(x[3])); +vtkm::Vec Abs(const vtkm::Vec &x) { + return vtkm::Vec(vtkm::Abs(x[0]), + vtkm::Abs(x[1]), + vtkm::Abs(x[2]), + vtkm::Abs(x[3])); } template static inline VTKM_EXEC_CONT -vtkm::Vec::Type,3> -Abs(const vtkm::Vec &x) { - return vtkm::Vec::Type,3>(vtkm::Abs(x[0]), - vtkm::Abs(x[1]), - vtkm::Abs(x[2])); +vtkm::Vec Abs(const vtkm::Vec &x) { + return vtkm::Vec(vtkm::Abs(x[0]), + vtkm::Abs(x[1]), + vtkm::Abs(x[2])); } template static inline VTKM_EXEC_CONT -vtkm::Vec::Type,2> -Abs(const vtkm::Vec &x) { - return vtkm::Vec::Type,2>(vtkm::Abs(x[0]), - vtkm::Abs(x[1])); +vtkm::Vec Abs(const vtkm::Vec &x) { + return vtkm::Vec(vtkm::Abs(x[0]), + vtkm::Abs(x[1])); } /// Returns a nonzero value if \p x is negative. diff --git a/vtkm/Math.h.in b/vtkm/Math.h.in index 06594e27b..0600da040 100644 --- a/vtkm/Math.h.in +++ b/vtkm/Math.h.in @@ -994,7 +994,63 @@ vtkm::Int64 Abs(vtkm::Int64 x) #error Unknown size of Int64. #endif } -$unary_math_function('Abs', 'fabs')\ +static inline VTKM_EXEC_CONT +vtkm::Float32 Abs(vtkm::Float32 x) { +#ifdef VTKM_CUDA + return VTKM_CUDA_MATH_FUNCTION_32(fabs)(x); +#else + return std::fabs(x); +#endif +} +static inline VTKM_EXEC_CONT +vtkm::Float64 Abs(vtkm::Float64 x) { +#ifdef VTKM_CUDA + return VTKM_CUDA_MATH_FUNCTION_64(fabs)(x); +#else + return std::fabs(x); +#endif +} +template +static inline VTKM_EXEC_CONT +typename detail::FloatingPointReturnType::Type +Abs(T x) { +#ifdef VTKM_CUDA + return VTKM_CUDA_MATH_FUNCTION_64(fabs)(static_cast(x)); +#else + return std::fabs(static_cast(x)); +#endif +} +template +static inline VTKM_EXEC_CONT +vtkm::Vec Abs(const vtkm::Vec &x) { + vtkm::Vec result; + for (vtkm::IdComponent index = 0; index < N; index++) + { + result[index] = vtkm::Abs(x[index]); + } + return result; +} +template +static inline VTKM_EXEC_CONT +vtkm::Vec Abs(const vtkm::Vec &x) { + return vtkm::Vec(vtkm::Abs(x[0]), + vtkm::Abs(x[1]), + vtkm::Abs(x[2]), + vtkm::Abs(x[3])); +} +template +static inline VTKM_EXEC_CONT +vtkm::Vec Abs(const vtkm::Vec &x) { + return vtkm::Vec(vtkm::Abs(x[0]), + vtkm::Abs(x[1]), + vtkm::Abs(x[2])); +} +template +static inline VTKM_EXEC_CONT +vtkm::Vec Abs(const vtkm::Vec &x) { + return vtkm::Vec(vtkm::Abs(x[0]), + vtkm::Abs(x[1])); +} /// Returns a nonzero value if \p x is negative. /// diff --git a/vtkm/VectorAnalysis.h b/vtkm/VectorAnalysis.h index c5675265a..f1f8b4e83 100644 --- a/vtkm/VectorAnalysis.h +++ b/vtkm/VectorAnalysis.h @@ -86,7 +86,7 @@ namespace detail { template VTKM_EXEC_CONT typename detail::FloatingPointReturnType::Type -MagnitudeTemplate(T &x, vtkm::TypeTraitsScalarTag) +MagnitudeTemplate(T x, vtkm::TypeTraitsScalarTag) { return vtkm::Abs(x); } @@ -125,7 +125,7 @@ VTKM_EXEC_CONT typename detail::FloatingPointReturnType::Type RMagnitudeTemplate(T x, vtkm::TypeTraitsScalarTag) { - return 1.0/vtkm::Abs(x); + return T(1)/vtkm::Abs(x); } template