//============================================================================= // // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. // // Copyright 2015 Sandia Corporation. // Copyright 2015 UT-Battelle, LLC. // Copyright 2015 Los Alamos National Security. // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. // //============================================================================= // **** DO NOT EDIT THIS FILE!!! **** // This file is automatically generated by FunctionInterfaceDetailPre.h.in #ifndef vtk_m_Math_h #define vtk_m_Math_h #include #include #include #ifndef VTKM_CUDA #include #include #include // The nonfinite and sign test functions are usually defined as macros, and // boost seems to want to undefine those macros so that it can implement the // C99 templates and other implementations of the same name. Get around the // problem by using the boost version when compiling for a CPU. VTKM_THIRDPARTY_PRE_INCLUDE #include #include VTKM_THIRDPARTY_POST_INCLUDE #include #define VTKM_USE_BOOST_CLASSIFY #define VTKM_USE_BOOST_SIGN #endif // !VTKM_CUDA #if !defined(__CUDA_ARCH__) #define VTKM_USE_STL_MIN_MAX #include #endif #if defined(VTKM_MSVC) && !defined(VTKM_CUDA) VTKM_THIRDPARTY_PRE_INCLUDE #include #include #include #include #include #include #include VTKM_THIRDPARTY_POST_INCLUDE #define VTKM_USE_BOOST_MATH #if (_MSC_VER <= 1600) && !defined(VTKM_USE_STL_MIN_MAX) #define VTKM_USE_STL_MIN_MAX #include #endif #endif #define VTKM_SYS_MATH_FUNCTION_32(func) func ## f #define VTKM_SYS_MATH_FUNCTION_64(func) func namespace vtkm { //----------------------------------------------------------------------------- /// Returns the constant 2 times Pi. /// VTKM_EXEC_CONT_EXPORT vtkm::Float64 TwoPi() { return 6.28318530717958647692528676655900576; } /// Returns the constant Pi. /// VTKM_EXEC_CONT_EXPORT vtkm::Float64 Pi() { return 3.14159265358979323846264338327950288; } /// Returns the constant Pi halves. /// VTKM_EXEC_CONT_EXPORT vtkm::Float64 Pi_2() { return 1.57079632679489661923132169163975144; } /// Returns the constant Pi thirds. /// VTKM_EXEC_CONT_EXPORT vtkm::Float64 Pi_3() { return 1.04719755119659774615421446109316762; } /// Returns the constant Pi fourths. /// VTKM_EXEC_CONT_EXPORT vtkm::Float64 Pi_4() { return 0.78539816339744830961566084581987572; } /// Compute the sine of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Sin(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(sin)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Sin(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(sin)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sin(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Sin(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sin(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Sin(x[0]), vtkm::Sin(x[1]), vtkm::Sin(x[2]), vtkm::Sin(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sin(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Sin(x[0]), vtkm::Sin(x[1]), vtkm::Sin(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sin(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Sin(x[0]), vtkm::Sin(x[1])); } /// Compute the cosine of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Cos(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(cos)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Cos(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(cos)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cos(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Cos(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cos(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Cos(x[0]), vtkm::Cos(x[1]), vtkm::Cos(x[2]), vtkm::Cos(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cos(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Cos(x[0]), vtkm::Cos(x[1]), vtkm::Cos(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cos(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Cos(x[0]), vtkm::Cos(x[1])); } /// Compute the tangent of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Tan(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(tan)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Tan(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(tan)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Tan(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Tan(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Tan(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Tan(x[0]), vtkm::Tan(x[1]), vtkm::Tan(x[2]), vtkm::Tan(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Tan(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Tan(x[0]), vtkm::Tan(x[1]), vtkm::Tan(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Tan(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Tan(x[0]), vtkm::Tan(x[1])); } /// Compute the arc sine of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 ASin(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(asin)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ASin(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(asin)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASin(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ASin(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASin(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ASin(x[0]), vtkm::ASin(x[1]), vtkm::ASin(x[2]), vtkm::ASin(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASin(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ASin(x[0]), vtkm::ASin(x[1]), vtkm::ASin(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASin(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ASin(x[0]), vtkm::ASin(x[1])); } /// Compute the arc cosine of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 ACos(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(acos)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ACos(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(acos)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACos(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ACos(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACos(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ACos(x[0]), vtkm::ACos(x[1]), vtkm::ACos(x[2]), vtkm::ACos(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACos(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ACos(x[0]), vtkm::ACos(x[1]), vtkm::ACos(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACos(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ACos(x[0]), vtkm::ACos(x[1])); } /// Compute the arc tangent of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 ATan(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(atan)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ATan(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(atan)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATan(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ATan(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATan(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ATan(x[0]), vtkm::ATan(x[1]), vtkm::ATan(x[2]), vtkm::ATan(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATan(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ATan(x[0]), vtkm::ATan(x[1]), vtkm::ATan(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATan(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ATan(x[0]), vtkm::ATan(x[1])); } /// Compute the arc tangent of \p x / \p y using the signs of both arguments /// to determine the quadrant of the return value. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 ATan2(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(atan2)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ATan2(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(atan2)(x,y); } /// Compute the hyperbolic sine of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 SinH(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(sinh)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 SinH(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(sinh)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec SinH(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::SinH(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec SinH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::SinH(x[0]), vtkm::SinH(x[1]), vtkm::SinH(x[2]), vtkm::SinH(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec SinH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::SinH(x[0]), vtkm::SinH(x[1]), vtkm::SinH(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec SinH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::SinH(x[0]), vtkm::SinH(x[1])); } /// Compute the hyperbolic cosine of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 CosH(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(cosh)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 CosH(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(cosh)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec CosH(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::CosH(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec CosH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::CosH(x[0]), vtkm::CosH(x[1]), vtkm::CosH(x[2]), vtkm::CosH(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec CosH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::CosH(x[0]), vtkm::CosH(x[1]), vtkm::CosH(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec CosH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::CosH(x[0]), vtkm::CosH(x[1])); } /// Compute the hyperbolic tangent of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 TanH(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(tanh)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 TanH(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(tanh)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec TanH(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::TanH(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec TanH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::TanH(x[0]), vtkm::TanH(x[1]), vtkm::TanH(x[2]), vtkm::TanH(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec TanH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::TanH(x[0]), vtkm::TanH(x[1]), vtkm::TanH(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec TanH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::TanH(x[0]), vtkm::TanH(x[1])); } /// Compute the hyperbolic arc sine of \p x. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ASinH(vtkm::Float32 x) { return boost::math::asinh(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ASinH(vtkm::Float64 x) { return boost::math::asinh(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ASinH(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(asinh)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ASinH(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(asinh)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASinH(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ASinH(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASinH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ASinH(x[0]), vtkm::ASinH(x[1]), vtkm::ASinH(x[2]), vtkm::ASinH(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASinH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ASinH(x[0]), vtkm::ASinH(x[1]), vtkm::ASinH(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ASinH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ASinH(x[0]), vtkm::ASinH(x[1])); } /// Compute the hyperbolic arc cosine of \p x. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ACosH(vtkm::Float32 x) { return boost::math::acosh(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ACosH(vtkm::Float64 x) { return boost::math::acosh(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ACosH(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(acosh)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ACosH(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(acosh)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACosH(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ACosH(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACosH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ACosH(x[0]), vtkm::ACosH(x[1]), vtkm::ACosH(x[2]), vtkm::ACosH(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACosH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ACosH(x[0]), vtkm::ACosH(x[1]), vtkm::ACosH(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ACosH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ACosH(x[0]), vtkm::ACosH(x[1])); } /// Compute the hyperbolic arc tangent of \p x. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ATanH(vtkm::Float32 x) { return boost::math::atanh(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ATanH(vtkm::Float64 x) { return boost::math::atanh(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ATanH(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(atanh)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ATanH(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(atanh)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATanH(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ATanH(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATanH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ATanH(x[0]), vtkm::ATanH(x[1]), vtkm::ATanH(x[2]), vtkm::ATanH(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATanH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ATanH(x[0]), vtkm::ATanH(x[1]), vtkm::ATanH(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ATanH(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ATanH(x[0]), vtkm::ATanH(x[1])); } //----------------------------------------------------------------------------- /// Computes \p x raised to the power of \p y. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Pow(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(pow)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Pow(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(pow)(x,y); } /// Compute the square root of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Sqrt(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(sqrt)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Sqrt(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(sqrt)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sqrt(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Sqrt(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sqrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Sqrt(x[0]), vtkm::Sqrt(x[1]), vtkm::Sqrt(x[2]), vtkm::Sqrt(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sqrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Sqrt(x[0]), vtkm::Sqrt(x[1]), vtkm::Sqrt(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Sqrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Sqrt(x[0]), vtkm::Sqrt(x[1])); } /// Compute the reciprocal square root of \p x. The result of this function is /// equivalent to 1/Sqrt(x). However, on some devices it is faster to /// compute the reciprocal square root than the regular square root. Thus, you /// should use this function whenever dividing by the square root. /// #ifdef VTKM_CUDA VTKM_EXEC_CONT_EXPORT vtkm::Float32 RSqrt(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(rsqrt)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 RSqrt(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(rsqrt)(x); } #else // !VTKM_CUDA VTKM_EXEC_CONT_EXPORT vtkm::Float32 RSqrt(vtkm::Float32 x) { return 1/vtkm::Sqrt(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 RSqrt(vtkm::Float64 x) { return 1/vtkm::Sqrt(x); } #endif // !VTKM_CUDA template VTKM_EXEC_CONT_EXPORT vtkm::Vec RSqrt(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::RSqrt(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec RSqrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::RSqrt(x[0]), vtkm::RSqrt(x[1]), vtkm::RSqrt(x[2]), vtkm::RSqrt(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec RSqrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::RSqrt(x[0]), vtkm::RSqrt(x[1]), vtkm::RSqrt(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec RSqrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::RSqrt(x[0]), vtkm::RSqrt(x[1])); } /// Compute the cube root of \p x. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Cbrt(vtkm::Float32 x) { return boost::math::cbrt(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Cbrt(vtkm::Float64 x) { return boost::math::cbrt(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Cbrt(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(cbrt)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Cbrt(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(cbrt)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cbrt(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Cbrt(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cbrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Cbrt(x[0]), vtkm::Cbrt(x[1]), vtkm::Cbrt(x[2]), vtkm::Cbrt(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cbrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Cbrt(x[0]), vtkm::Cbrt(x[1]), vtkm::Cbrt(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Cbrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Cbrt(x[0]), vtkm::Cbrt(x[1])); } /// Compute the reciprocal cube root of \p x. The result of this function is /// equivalent to 1/Cbrt(x). However, on some devices it is faster to /// compute the reciprocal cube root than the regular cube root. Thus, you /// should use this function whenever dividing by the cube root. /// #ifdef VTKM_CUDA VTKM_EXEC_CONT_EXPORT vtkm::Float32 RCbrt(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(rcbrt)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 RCbrt(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(rcbrt)(x); } #else // !VTKM_CUDA VTKM_EXEC_CONT_EXPORT vtkm::Float32 RCbrt(vtkm::Float32 x) { return 1/vtkm::Cbrt(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 RCbrt(vtkm::Float64 x) { return 1/vtkm::Cbrt(x); } #endif // !VTKM_CUDA template VTKM_EXEC_CONT_EXPORT vtkm::Vec RCbrt(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::RCbrt(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec RCbrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::RCbrt(x[0]), vtkm::RCbrt(x[1]), vtkm::RCbrt(x[2]), vtkm::RCbrt(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec RCbrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::RCbrt(x[0]), vtkm::RCbrt(x[1]), vtkm::RCbrt(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec RCbrt(const vtkm::Vec &x) { return vtkm::Vec(vtkm::RCbrt(x[0]), vtkm::RCbrt(x[1])); } /// Computes e**\p x, the base-e exponential of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Exp(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(exp)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Exp(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(exp)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Exp(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp(x[0]), vtkm::Exp(x[1]), vtkm::Exp(x[2]), vtkm::Exp(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp(x[0]), vtkm::Exp(x[1]), vtkm::Exp(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp(x[0]), vtkm::Exp(x[1])); } /// Computes 2**\p x, the base-2 exponential of \p x. /// #ifdef VTKM_MSVC VTKM_EXEC_CONT_EXPORT vtkm::Float32 Exp2(vtkm::Float32 x) { return vtkm::Pow(2,x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Exp2(vtkm::Float64 x) { return vtkm::Pow(2,x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Exp2(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(exp2)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Exp2(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(exp2)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp2(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Exp2(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp2(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp2(x[0]), vtkm::Exp2(x[1]), vtkm::Exp2(x[2]), vtkm::Exp2(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp2(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp2(x[0]), vtkm::Exp2(x[1]), vtkm::Exp2(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp2(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp2(x[0]), vtkm::Exp2(x[1])); } /// Computes (e**\p x) - 1, the of base-e exponental of \p x then minus 1. The /// accuracy of this function is good even for very small values of x. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ExpM1(vtkm::Float32 x) { return boost::math::expm1(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ExpM1(vtkm::Float64 x) { return boost::math::expm1(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 ExpM1(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(expm1)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ExpM1(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(expm1)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec ExpM1(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::ExpM1(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ExpM1(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ExpM1(x[0]), vtkm::ExpM1(x[1]), vtkm::ExpM1(x[2]), vtkm::ExpM1(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ExpM1(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ExpM1(x[0]), vtkm::ExpM1(x[1]), vtkm::ExpM1(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec ExpM1(const vtkm::Vec &x) { return vtkm::Vec(vtkm::ExpM1(x[0]), vtkm::ExpM1(x[1])); } /// Computes 10**\p x, the base-10 exponential of \p x. /// #ifdef VTKM_CUDA VTKM_EXEC_CONT_EXPORT vtkm::Float32 Exp10(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(exp10)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Exp10(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(exp10)(x); } #else // !VTKM_CUDA VTKM_EXEC_CONT_EXPORT vtkm::Float32 Exp10(vtkm::Float32 x) { return vtkm::Pow(10, x);; } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Exp10(vtkm::Float64 x) { return vtkm::Pow(10, x);; } #endif // !VTKM_CUDA template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp10(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Exp10(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp10(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp10(x[0]), vtkm::Exp10(x[1]), vtkm::Exp10(x[2]), vtkm::Exp10(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp10(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp10(x[0]), vtkm::Exp10(x[1]), vtkm::Exp10(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Exp10(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Exp10(x[0]), vtkm::Exp10(x[1])); } /// Computes the natural logarithm of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Log(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(log)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Log(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(log)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Log(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log(x[0]), vtkm::Log(x[1]), vtkm::Log(x[2]), vtkm::Log(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log(x[0]), vtkm::Log(x[1]), vtkm::Log(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log(x[0]), vtkm::Log(x[1])); } /// Computes the logarithm base 2 of \p x. /// #ifdef VTKM_MSVC VTKM_EXEC_CONT_EXPORT vtkm::Float32 Log2(vtkm::Float32 x) { //windows and boost don't provide log2 //0.6931471805599453 is the constant value of log(2) const vtkm::Float32 log2v = 0.6931471805599453f; return vtkm::Log(x)/log2v; } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Log2(vtkm::Float64 x) { //windows and boost don't provide log2 //0.6931471805599453 is the constant value of log(2) const vtkm::Float64 log2v = 0.6931471805599453; return vtkm::Log(x)/log2v; } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Log2(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(log2)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Log2(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(log2)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log2(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Log2(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log2(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log2(x[0]), vtkm::Log2(x[1]), vtkm::Log2(x[2]), vtkm::Log2(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log2(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log2(x[0]), vtkm::Log2(x[1]), vtkm::Log2(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log2(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log2(x[0]), vtkm::Log2(x[1])); } /// Computes the logarithm base 10 of \p x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Log10(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(log10)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Log10(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(log10)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log10(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Log10(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log10(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log10(x[0]), vtkm::Log10(x[1]), vtkm::Log10(x[2]), vtkm::Log10(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log10(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log10(x[0]), vtkm::Log10(x[1]), vtkm::Log10(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log10(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log10(x[0]), vtkm::Log10(x[1])); } /// Computes the value of log(1+x) accurately for very small values of x. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Log1P(vtkm::Float32 x) { return boost::math::log1p(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Log1P(vtkm::Float64 x) { return boost::math::log1p(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Log1P(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(log1p)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Log1P(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(log1p)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log1P(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Log1P(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log1P(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log1P(x[0]), vtkm::Log1P(x[1]), vtkm::Log1P(x[2]), vtkm::Log1P(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log1P(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log1P(x[0]), vtkm::Log1P(x[1]), vtkm::Log1P(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Log1P(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Log1P(x[0]), vtkm::Log1P(x[1])); } //----------------------------------------------------------------------------- /// Returns \p x or \p y, whichever is larger. /// template VTKM_EXEC_CONT_EXPORT T Max(const T &x, const T &y); #ifdef VTKM_USE_STL_MIN_MAX VTKM_EXEC_CONT_EXPORT vtkm::Float32 Max(vtkm::Float32 x, vtkm::Float32 y) { return (std::max)(x, y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Max(vtkm::Float64 x, vtkm::Float64 y) { return (std::max)(x, y); } #else // !VTKM_USE_STL_MIN_MAX VTKM_EXEC_CONT_EXPORT vtkm::Float32 Max(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(fmax)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Max(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(fmax)(x,y); } #endif // !VTKM_USE_STL_MIN_MAX /// Returns \p x or \p y, whichever is smaller. /// template VTKM_EXEC_CONT_EXPORT T Min(const T &x, const T &y); #ifdef VTKM_USE_STL_MIN_MAX VTKM_EXEC_CONT_EXPORT vtkm::Float32 Min(vtkm::Float32 x, vtkm::Float32 y) { return (std::min)(x, y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Min(vtkm::Float64 x, vtkm::Float64 y) { return (std::min)(x, y); } #else // !VTKM_USE_STL_MIN_MAX VTKM_EXEC_CONT_EXPORT vtkm::Float32 Min(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(fmin)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Min(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(fmin)(x,y); } #endif // !VTKM_USE_STL_MIN_MAX namespace detail { template VTKM_EXEC_CONT_EXPORT T Max(T x, T y, vtkm::TypeTraitsScalarTag) { return (x < y) ? y : x; } template VTKM_EXEC_CONT_EXPORT T Max(const T &x, const T &y, vtkm::TypeTraitsVectorTag) { typedef vtkm::VecTraits Traits; T result; for (vtkm::IdComponent index = 0; index < Traits::NUM_COMPONENTS; index++) { Traits::SetComponent(result, index, vtkm::Max(Traits::GetComponent(x, index), Traits::GetComponent(y, index))); } return result; } template VTKM_EXEC_CONT_EXPORT T Min(T x, T y, vtkm::TypeTraitsScalarTag) { return (x < y) ? x : y; } template VTKM_EXEC_CONT_EXPORT T Min(const T &x, const T &y, vtkm::TypeTraitsVectorTag) { typedef vtkm::VecTraits Traits; T result; for (vtkm::IdComponent index = 0; index < Traits::NUM_COMPONENTS; index++) { Traits::SetComponent(result, index, vtkm::Min(Traits::GetComponent(x, index), Traits::GetComponent(y, index))); } return result; } } // namespace detail /// Returns \p x or \p y, whichever is larger. /// template VTKM_EXEC_CONT_EXPORT T Max(const T &x, const T &y) { return detail::Max(x, y, typename vtkm::TypeTraits::DimensionalityTag()); } /// Returns \p x or \p y, whichever is smaller. /// template VTKM_EXEC_CONT_EXPORT T Min(const T &x, const T &y) { return detail::Min(x, y, typename vtkm::TypeTraits::DimensionalityTag()); } //----------------------------------------------------------------------------- //#ifdef VTKM_CUDA #define VTKM_USE_IEEE_NONFINITE //#endif #ifdef VTKM_USE_IEEE_NONFINITE namespace detail { union IEEE754Bits32 { vtkm::UInt32 bits; vtkm::Float32 scalar; }; #define VTKM_NAN_BITS_32 0x7FC00000 #define VTKM_INF_BITS_32 0x7F800000 #define VTKM_NEG_INF_BITS_32 0xFF800000 #define VTKM_EPSILON_32 1e-5f union IEEE754Bits64 { vtkm::UInt64 bits; vtkm::Float64 scalar; }; #define VTKM_NAN_BITS_64 0x7FF8000000000000LL #define VTKM_INF_BITS_64 0x7FF0000000000000LL #define VTKM_NEG_INF_BITS_64 0xFFF0000000000000LL #define VTKM_EPSILON_64 1e-9 template struct FloatLimits; template<> struct FloatLimits { typedef vtkm::detail::IEEE754Bits32 BitsType; VTKM_EXEC_CONT_EXPORT static vtkm::Float32 Nan() { BitsType nan = {VTKM_NAN_BITS_32}; return nan.scalar; } VTKM_EXEC_CONT_EXPORT static vtkm::Float32 Infinity() { BitsType inf = {VTKM_INF_BITS_32}; return inf.scalar; } VTKM_EXEC_CONT_EXPORT static vtkm::Float32 NegativeInfinity() { BitsType neginf = {VTKM_NEG_INF_BITS_32}; return neginf.scalar; } VTKM_EXEC_CONT_EXPORT static vtkm::Float32 Epsilon() { return VTKM_EPSILON_32; } }; template<> struct FloatLimits { typedef vtkm::detail::IEEE754Bits64 BitsType; VTKM_EXEC_CONT_EXPORT static vtkm::Float64 Nan() { BitsType nan = {VTKM_NAN_BITS_64}; return nan.scalar; } VTKM_EXEC_CONT_EXPORT static vtkm::Float64 Infinity() { BitsType inf = {VTKM_INF_BITS_64}; return inf.scalar; } VTKM_EXEC_CONT_EXPORT static vtkm::Float64 NegativeInfinity() { BitsType neginf = {VTKM_NEG_INF_BITS_64}; return neginf.scalar; } VTKM_EXEC_CONT_EXPORT static vtkm::Float64 Epsilon() { return VTKM_EPSILON_64; } }; #undef VTKM_NAN_BITS_32 #undef VTKM_INF_BITS_32 #undef VTKM_NEG_INF_BITS_32 #undef VTKM_EPSILON_32 #undef VTKM_NAN_BITS_64 #undef VTKM_INF_BITS_64 #undef VTKM_NEG_INF_BITS_64 #undef VTKM_EPSILON_64 } // namespace detail /// Returns the representation for not-a-number (NaN). /// template VTKM_EXEC_CONT_EXPORT T Nan() { return detail::FloatLimits::Nan(); } /// Returns the representation for infinity. /// template VTKM_EXEC_CONT_EXPORT T Infinity() { return detail::FloatLimits::Infinity(); } /// Returns the representation for negative infinity. /// template VTKM_EXEC_CONT_EXPORT T NegativeInfinity() { return detail::FloatLimits::NegativeInfinity(); } /// Returns the difference between 1 and the least value greater than 1 /// that is representable. /// template VTKM_EXEC_CONT_EXPORT T Epsilon() { return detail::FloatLimits::Epsilon(); } #else // !VTKM_USE_IEEE_NONFINITE /// Returns the representation for not-a-number (NaN). /// template VTKM_EXEC_CONT_EXPORT T Nan() { return std::numeric_limits::quiet_NaN(); } /// Returns the representation for infinity. /// template VTKM_EXEC_CONT_EXPORT T Infinity() { return std::numeric_limits::infinity(); } /// Returns the representation for negative infinity. /// template VTKM_EXEC_CONT_EXPORT T NegativeInfinity() { return -std::numeric_limits::infinity(); } /// Returns the difference between 1 and the least value greater than 1 /// that is representable. /// template VTKM_EXEC_CONT_EXPORT T Epsilon() { return std::numeric_limits::epsilon(); } #endif // !VTKM_USE_IEEE_NONFINITE /// Returns the representation for not-a-number (NaN). /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Nan32() { return vtkm::Nan(); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Nan64() { return vtkm::Nan(); } /// Returns the representation for infinity. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Infinity32() { return vtkm::Infinity(); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Infinity64() { return vtkm::Infinity(); } /// Returns the representation for negative infinity. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 NegativeInfinity32() { return vtkm::NegativeInfinity(); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 NegativeInfinity64() { return vtkm::NegativeInfinity(); } /// Returns the difference between 1 and the least value greater than 1 /// that is representable. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Epsilon32() { return vtkm::Epsilon(); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Epsilon64() { return vtkm::Epsilon(); } //----------------------------------------------------------------------------- /// Returns true if \p x is not a number. /// template VTKM_EXEC_CONT_EXPORT bool IsNan(T x) { #ifdef VTKM_USE_BOOST_CLASSIFY using boost::math::isnan; #endif return (isnan(x) != 0); } /// Returns true if \p x is positive or negative infinity. /// template VTKM_EXEC_CONT_EXPORT bool IsInf(T x) { #ifdef VTKM_USE_BOOST_CLASSIFY using boost::math::isinf; #endif return (isinf(x) != 0); } /// Returns true if \p x is a normal number (not NaN or infinite). /// template VTKM_EXEC_CONT_EXPORT bool IsFinite(T x) { #ifdef VTKM_USE_BOOST_CLASSIFY using boost::math::isfinite; #endif return (isfinite(x) != 0); } //----------------------------------------------------------------------------- /// Round \p x to the smallest integer value not less than x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Ceil(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(ceil)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Ceil(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(ceil)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Ceil(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Ceil(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Ceil(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Ceil(x[0]), vtkm::Ceil(x[1]), vtkm::Ceil(x[2]), vtkm::Ceil(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Ceil(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Ceil(x[0]), vtkm::Ceil(x[1]), vtkm::Ceil(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Ceil(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Ceil(x[0]), vtkm::Ceil(x[1])); } /// Round \p x to the largest integer value not greater than x. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 Floor(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(floor)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Floor(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(floor)(x); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Floor(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Floor(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Floor(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Floor(x[0]), vtkm::Floor(x[1]), vtkm::Floor(x[2]), vtkm::Floor(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Floor(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Floor(x[0]), vtkm::Floor(x[1]), vtkm::Floor(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Floor(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Floor(x[0]), vtkm::Floor(x[1])); } /// Round \p x to the nearest integral value. /// #ifdef VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Round(vtkm::Float32 x) { return boost::math::round(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Round(vtkm::Float64 x) { return boost::math::round(x); } #else // !VTKM_USE_BOOST_MATH VTKM_EXEC_CONT_EXPORT vtkm::Float32 Round(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(round)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Round(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(round)(x); } #endif // !VTKM_USE_BOOST_MATH template VTKM_EXEC_CONT_EXPORT vtkm::Vec Round(const vtkm::Vec &x) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::Round(x[index]); } return result; } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Round(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Round(x[0]), vtkm::Round(x[1]), vtkm::Round(x[2]), vtkm::Round(x[3])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Round(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Round(x[0]), vtkm::Round(x[1]), vtkm::Round(x[2])); } template VTKM_EXEC_CONT_EXPORT vtkm::Vec Round(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Round(x[0]), vtkm::Round(x[1])); } //----------------------------------------------------------------------------- /// Computes the remainder on division of 2 floating point numbers. The return /// value is \p numerator - n \p denominator, where n is the quotient of \p /// numerator divided by \p denominator rounded towards zero to an integer. For /// example, FMod(6.5, 2.3) returns 1.9, which is 6.5 - 2*2.3. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 FMod(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(fmod)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 FMod(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(fmod)(x,y); } /// Computes the remainder on division of 2 floating point numbers. The return /// value is \p numerator - n \p denominator, where n is the quotient of \p /// numerator divided by \p denominator rounded towards the nearest integer /// (instead of toward zero like FMod). For example, FMod(6.5, 2.3) /// returns -0.4, which is 6.5 - 3*2.3. /// #ifdef VTKM_MSVC template VTKM_EXEC_CONT_EXPORT T Remainder(T numerator, T denominator) { T quotient = vtkm::Round(numerator/denominator); return numerator - quotient*denominator; } #else // !VTKM_MSVC VTKM_EXEC_CONT_EXPORT vtkm::Float32 Remainder(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(remainder)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Remainder(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(remainder)(x,y); } #endif // !VTKM_MSVC /// Returns the remainder on division of 2 floating point numbers just like /// Remainder. In addition, this function also returns the \c quotient used to /// get that remainder. /// template VTKM_EXEC_CONT_EXPORT vtkm::Float32 RemainderQuotient(vtkm::Float32 numerator, vtkm::Float32 denominator, QType "ient) { #ifdef VTKM_USE_BOOST_MATH quotient = static_cast(boost::math::round(numerator/denominator)); return vtkm::Remainder(numerator, denominator); #else int iQuotient; vtkm::Float32 result = VTKM_SYS_MATH_FUNCTION_32(remquo)(numerator, denominator, &iQuotient); quotient = iQuotient; return result; #endif } template VTKM_EXEC_CONT_EXPORT vtkm::Float64 RemainderQuotient(vtkm::Float64 numerator, vtkm::Float64 denominator, QType "ient) { #ifdef VTKM_USE_BOOST_MATH quotient = static_cast(boost::math::round(numerator/denominator)); return vtkm::Remainder(numerator, denominator); #else int iQuotient; vtkm::Float64 result = VTKM_SYS_MATH_FUNCTION_64(remquo)(numerator, denominator, &iQuotient); quotient = iQuotient; return result; #endif } /// Gets the integral and fractional parts of \c x. The return value is the /// fractional part and \c integral is set to the integral part. /// VTKM_EXEC_CONT_EXPORT vtkm::Float32 ModF(vtkm::Float32 x, vtkm::Float32 &integral) { return VTKM_SYS_MATH_FUNCTION_32(modf)(x, &integral); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 ModF(vtkm::Float64 x, vtkm::Float64 &integral) { return VTKM_SYS_MATH_FUNCTION_64(modf)(x, &integral); } //----------------------------------------------------------------------------- /// Return the absolute value of \p x. That is, return \p x if it is positive or /// \p -x if it is negative. /// VTKM_EXEC_CONT_EXPORT vtkm::Int32 Abs(vtkm::Int32 x) { #if VTKM_SIZE_INT == 4 return abs(x); #else #error Unknown size of Int32. #endif } VTKM_EXEC_CONT_EXPORT vtkm::Int64 Abs(vtkm::Int64 x) { #if VTKM_SIZE_LONG == 8 return labs(x); #elif VTKM_SIZE_LONG_LONG == 8 return llabs(x); #else #error Unknown size of Int64. #endif } VTKM_EXEC_CONT_EXPORT vtkm::Float32 Abs(vtkm::Float32 x) { return VTKM_SYS_MATH_FUNCTION_32(fabs)(x); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 Abs(vtkm::Float64 x) { return VTKM_SYS_MATH_FUNCTION_64(fabs)(x); } template VTKM_EXEC_CONT_EXPORT 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 VTKM_EXEC_CONT_EXPORT 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 VTKM_EXEC_CONT_EXPORT vtkm::Vec Abs(const vtkm::Vec &x) { return vtkm::Vec(vtkm::Abs(x[0]), vtkm::Abs(x[1]), vtkm::Abs(x[2])); } template VTKM_EXEC_CONT_EXPORT 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. /// VTKM_EXEC_CONT_EXPORT vtkm::Int32 SignBit(vtkm::Float32 x) { #ifdef VTKM_USE_BOOST_SIGN using boost::math::signbit; #endif return static_cast(signbit(x)); } VTKM_EXEC_CONT_EXPORT vtkm::Int32 SignBit(vtkm::Float64 x) { #ifdef VTKM_USE_BOOST_SIGN using boost::math::signbit; #endif return static_cast(signbit(x)); } /// Returns true if \p x is less than zero, false otherwise. /// VTKM_EXEC_CONT_EXPORT bool IsNegative(vtkm::Float32 x) { return (vtkm::SignBit(x) != 0); } VTKM_EXEC_CONT_EXPORT bool IsNegative(vtkm::Float64 x) { return (vtkm::SignBit(x) != 0); } /// Copies the sign of \p y onto \p x. If \p y is positive, returns Abs(\p x). /// If \p y is negative, returns -Abs(\p x). /// #ifdef VTKM_USE_BOOST_SIGN VTKM_EXEC_CONT_EXPORT vtkm::Float32 CopySign(vtkm::Float32 x, vtkm::Float32 y) { return boost::math::copysign(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 CopySign(vtkm::Float64 x, vtkm::Float64 y) { return boost::math::copysign(x,y); } #else // !VTKM_USE_BOOST_SIGN VTKM_EXEC_CONT_EXPORT vtkm::Float32 CopySign(vtkm::Float32 x, vtkm::Float32 y) { return VTKM_SYS_MATH_FUNCTION_32(copysign)(x,y); } VTKM_EXEC_CONT_EXPORT vtkm::Float64 CopySign(vtkm::Float64 x, vtkm::Float64 y) { return VTKM_SYS_MATH_FUNCTION_64(copysign)(x,y); } #endif // !VTKM_USE_BOOST_SIGN template VTKM_EXEC_CONT_EXPORT vtkm::Vec CopySign(const vtkm::Vec &x, const vtkm::Vec &y) { vtkm::Vec result; for (vtkm::IdComponent index = 0; index < N; index++) { result[index] = vtkm::CopySign(x[index], y[index]); } return result; } } // namespace vtkm #endif //vtk_m_Math_h