From 180d11e7f2655b1841756caf7fad7ca2c124d586 Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Thu, 18 Feb 2021 16:40:56 -0700 Subject: [PATCH] Add ImplicitFunctionGeneral --- vtkm/ImplicitFunction.h | 85 ++++++++++++++++++++- vtkm/cont/testing/TestingImplicitFunction.h | 26 ++++++- 2 files changed, 108 insertions(+), 3 deletions(-) diff --git a/vtkm/ImplicitFunction.h b/vtkm/ImplicitFunction.h index ae0b43914..d87fe2974 100644 --- a/vtkm/ImplicitFunction.h +++ b/vtkm/ImplicitFunction.h @@ -14,11 +14,16 @@ #include #include #include -#include + +#include // For interface class only. #include +#ifndef VTKM_NO_DEPRECATED_VIRTUAL +#include +#endif // VTKM_NO_DEPRECATED_VIRTUAL + namespace vtkm { @@ -778,6 +783,84 @@ private: Vector Center; }; +namespace detail +{ + +struct ImplicitFunctionValueFunctor +{ + template + VTKM_EXEC_CONT typename ImplicitFunctionType::Scalar operator()( + const ImplicitFunctionType& function, + const typename ImplicitFunctionType::Vector& point) const + { + return function.Value(point); + } +}; + +struct ImplicitFunctionGradientFunctor +{ + template + VTKM_EXEC_CONT typename ImplicitFunctionType::Vector operator()( + const ImplicitFunctionType& function, + const typename ImplicitFunctionType::Vector& point) const + { + return function.Gradient(point); + } +}; + +} // namespace detail + +template +class ImplicitFunctionMultiplexer + : public vtkm::internal::ImplicitFunctionBase< + ImplicitFunctionMultiplexer> +{ + vtkm::exec::internal::Variant Variant; + + using Superclass = + vtkm::internal::ImplicitFunctionBase>; + +public: + using Scalar = typename Superclass::Scalar; + using Vector = typename Superclass::Vector; + + VTKM_EXEC_CONT ImplicitFunctionMultiplexer() = default; + + template + VTKM_EXEC_CONT ImplicitFunctionMultiplexer( + const vtkm::internal::ImplicitFunctionBase& function) + : Variant(reinterpret_cast(function)) + { + } + + VTKM_EXEC_CONT Scalar Value(const Vector& point) const + { + return this->Variant.CastAndCall(detail::ImplicitFunctionValueFunctor{}, point); + } + + VTKM_EXEC_CONT Vector Gradient(const Vector& point) const + { + return this->Variant.CastAndCall(detail::ImplicitFunctionGradientFunctor{}, point); + } +}; + +class ImplicitFunctionGeneral + : public vtkm::ImplicitFunctionMultiplexer +{ + using Superclass = vtkm::ImplicitFunctionMultiplexer; + +public: + using Superclass::Superclass; +}; + } // namespace vtkm #endif //vtk_m_ImplicitFunction_h diff --git a/vtkm/cont/testing/TestingImplicitFunction.h b/vtkm/cont/testing/TestingImplicitFunction.h index 7841ffccb..c6efdfc9f 100644 --- a/vtkm/cont/testing/TestingImplicitFunction.h +++ b/vtkm/cont/testing/TestingImplicitFunction.h @@ -131,10 +131,32 @@ private: VTKM_TEST_ASSERT(test_equal_ArrayHandles(values, expectedValuesArray)); VTKM_TEST_ASSERT(test_equal_ArrayHandles(gradients, expectedGradientsArray)); } - } - VTKM_DEPRECATED_SUPPRESS_END + VTKM_DEPRECATED_SUPPRESS_END #endif //!VTKM_NO_DEPRECATED_VIRTUAL + { + vtkm::ImplicitFunctionMultiplexer functionChoose(function); + vtkm::cont::ArrayHandle values; + vtkm::cont::ArrayHandle> gradients; + implicit_function_detail::EvaluateOnCoordinates( + this->Input.GetCoordinateSystem(0), functionChoose, values, gradients, device); + + VTKM_TEST_ASSERT(test_equal_ArrayHandles(values, expectedValuesArray)); + VTKM_TEST_ASSERT(test_equal_ArrayHandles(gradients, expectedGradientsArray)); + } + + { + vtkm::ImplicitFunctionGeneral functionChoose(function); + vtkm::cont::ArrayHandle values; + vtkm::cont::ArrayHandle> gradients; + implicit_function_detail::EvaluateOnCoordinates( + this->Input.GetCoordinateSystem(0), functionChoose, values, gradients, device); + + VTKM_TEST_ASSERT(test_equal_ArrayHandles(values, expectedValuesArray)); + VTKM_TEST_ASSERT(test_equal_ArrayHandles(gradients, expectedGradientsArray)); + } + } + template void TestBox(DeviceAdapter device) {