From 896065044ab917f3cda3bb9cec90ead2b1a55dc8 Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Tue, 12 Jul 2022 07:04:44 -0600 Subject: [PATCH] Consolidate UnitTestPointLocatorSparseGrid Previously, each device adapter implementation had their own version of this test by including a common header. Simplify this by making a single test in UnitTests_vtkm_cont_testing, which can now be compiled for and tested on a device. --- vtkm/cont/cuda/testing/CMakeLists.txt | 1 - .../UnitTestCudaPointLocatorSparseGrid.cu | 19 -- vtkm/cont/kokkos/testing/CMakeLists.txt | 1 - .../UnitTestKokkosPointLocatorSparseGrid.cxx | 19 -- vtkm/cont/openmp/testing/CMakeLists.txt | 1 - .../UnitTestOpenMPPointLocatorSparseGrid.cxx | 19 -- vtkm/cont/serial/testing/CMakeLists.txt | 1 - .../UnitTestSerialPointLocatorSparseGrid.cxx | 19 -- vtkm/cont/tbb/testing/CMakeLists.txt | 1 - .../UnitTestTBBPointLocatorSparseGrid.cxx | 19 -- vtkm/cont/testing/CMakeLists.txt | 2 +- .../testing/TestingPointLocatorSparseGrid.h | 195 ------------------ .../UnitTestPointLocatorSparseGrid.cxx | 189 +++++++++++++++++ 13 files changed, 190 insertions(+), 296 deletions(-) delete mode 100644 vtkm/cont/cuda/testing/UnitTestCudaPointLocatorSparseGrid.cu delete mode 100644 vtkm/cont/kokkos/testing/UnitTestKokkosPointLocatorSparseGrid.cxx delete mode 100644 vtkm/cont/openmp/testing/UnitTestOpenMPPointLocatorSparseGrid.cxx delete mode 100644 vtkm/cont/serial/testing/UnitTestSerialPointLocatorSparseGrid.cxx delete mode 100644 vtkm/cont/tbb/testing/UnitTestTBBPointLocatorSparseGrid.cxx delete mode 100644 vtkm/cont/testing/TestingPointLocatorSparseGrid.h create mode 100644 vtkm/cont/testing/UnitTestPointLocatorSparseGrid.cxx diff --git a/vtkm/cont/cuda/testing/CMakeLists.txt b/vtkm/cont/cuda/testing/CMakeLists.txt index faf552b52..56c9f7edc 100644 --- a/vtkm/cont/cuda/testing/CMakeLists.txt +++ b/vtkm/cont/cuda/testing/CMakeLists.txt @@ -13,7 +13,6 @@ set(unit_tests UnitTestCudaIterators.cu UnitTestCudaMathEdgeCases.cu UnitTestCudaShareUserProvidedManagedMemory.cu - UnitTestCudaPointLocatorSparseGrid.cu UnitTestCudaRuntimeDeviceConfiguration.cu ) diff --git a/vtkm/cont/cuda/testing/UnitTestCudaPointLocatorSparseGrid.cu b/vtkm/cont/cuda/testing/UnitTestCudaPointLocatorSparseGrid.cu deleted file mode 100644 index d1bbc1192..000000000 --- a/vtkm/cont/cuda/testing/UnitTestCudaPointLocatorSparseGrid.cu +++ /dev/null @@ -1,19 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ - -#include - -int UnitTestCudaPointLocatorSparseGrid(int argc, char* argv[]) -{ - auto& tracker = vtkm::cont::GetRuntimeDeviceTracker(); - tracker.ForceDevice(vtkm::cont::DeviceAdapterTagCuda{}); - return vtkm::cont::testing::Testing::Run( - TestingPointLocatorSparseGrid(), argc, argv); -} diff --git a/vtkm/cont/kokkos/testing/CMakeLists.txt b/vtkm/cont/kokkos/testing/CMakeLists.txt index 890dfa170..9e7d8cc5e 100644 --- a/vtkm/cont/kokkos/testing/CMakeLists.txt +++ b/vtkm/cont/kokkos/testing/CMakeLists.txt @@ -10,7 +10,6 @@ set(unit_tests UnitTestKokkosDeviceAdapter.cxx - UnitTestKokkosPointLocatorSparseGrid.cxx UnitTestKokkosRuntimeDeviceConfiguration.cxx ) diff --git a/vtkm/cont/kokkos/testing/UnitTestKokkosPointLocatorSparseGrid.cxx b/vtkm/cont/kokkos/testing/UnitTestKokkosPointLocatorSparseGrid.cxx deleted file mode 100644 index c0c716964..000000000 --- a/vtkm/cont/kokkos/testing/UnitTestKokkosPointLocatorSparseGrid.cxx +++ /dev/null @@ -1,19 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ - -#include - -int UnitTestKokkosPointLocatorSparseGrid(int argc, char* argv[]) -{ - auto& tracker = vtkm::cont::GetRuntimeDeviceTracker(); - tracker.ForceDevice(vtkm::cont::DeviceAdapterTagKokkos{}); - return vtkm::cont::testing::Testing::Run( - TestingPointLocatorSparseGrid(), argc, argv); -} diff --git a/vtkm/cont/openmp/testing/CMakeLists.txt b/vtkm/cont/openmp/testing/CMakeLists.txt index 479de06ca..5a29ffd0f 100644 --- a/vtkm/cont/openmp/testing/CMakeLists.txt +++ b/vtkm/cont/openmp/testing/CMakeLists.txt @@ -10,7 +10,6 @@ set(unit_tests UnitTestOpenMPDeviceAdapter.cxx - UnitTestOpenMPPointLocatorSparseGrid.cxx UnitTestOpenMPRuntimeDeviceConfiguration.cxx ) diff --git a/vtkm/cont/openmp/testing/UnitTestOpenMPPointLocatorSparseGrid.cxx b/vtkm/cont/openmp/testing/UnitTestOpenMPPointLocatorSparseGrid.cxx deleted file mode 100644 index 79a4e009d..000000000 --- a/vtkm/cont/openmp/testing/UnitTestOpenMPPointLocatorSparseGrid.cxx +++ /dev/null @@ -1,19 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ -#include -#include - -int UnitTestOpenMPPointLocatorSparseGrid(int argc, char* argv[]) -{ - auto& tracker = vtkm::cont::GetRuntimeDeviceTracker(); - tracker.ForceDevice(vtkm::cont::DeviceAdapterTagOpenMP{}); - return vtkm::cont::testing::Testing::Run( - TestingPointLocatorSparseGrid(), argc, argv); -} diff --git a/vtkm/cont/serial/testing/CMakeLists.txt b/vtkm/cont/serial/testing/CMakeLists.txt index 86a92f041..c1a00e54d 100644 --- a/vtkm/cont/serial/testing/CMakeLists.txt +++ b/vtkm/cont/serial/testing/CMakeLists.txt @@ -10,7 +10,6 @@ set(unit_tests UnitTestSerialDeviceAdapter.cxx - UnitTestSerialPointLocatorSparseGrid.cxx ) if (NOT VTKm_NO_DEPRECATED_VIRTUAL) diff --git a/vtkm/cont/serial/testing/UnitTestSerialPointLocatorSparseGrid.cxx b/vtkm/cont/serial/testing/UnitTestSerialPointLocatorSparseGrid.cxx deleted file mode 100644 index 242c094f1..000000000 --- a/vtkm/cont/serial/testing/UnitTestSerialPointLocatorSparseGrid.cxx +++ /dev/null @@ -1,19 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ - -#include - -int UnitTestSerialPointLocatorSparseGrid(int argc, char* argv[]) -{ - auto& tracker = vtkm::cont::GetRuntimeDeviceTracker(); - tracker.ForceDevice(vtkm::cont::DeviceAdapterTagSerial{}); - return vtkm::cont::testing::Testing::Run( - TestingPointLocatorSparseGrid(), argc, argv); -} diff --git a/vtkm/cont/tbb/testing/CMakeLists.txt b/vtkm/cont/tbb/testing/CMakeLists.txt index 7a0895a46..640a29e22 100644 --- a/vtkm/cont/tbb/testing/CMakeLists.txt +++ b/vtkm/cont/tbb/testing/CMakeLists.txt @@ -10,7 +10,6 @@ set(unit_tests UnitTestTBBDeviceAdapter.cxx - UnitTestTBBPointLocatorSparseGrid.cxx UnitTestTBBRuntimeDeviceConfiguration.cxx ) diff --git a/vtkm/cont/tbb/testing/UnitTestTBBPointLocatorSparseGrid.cxx b/vtkm/cont/tbb/testing/UnitTestTBBPointLocatorSparseGrid.cxx deleted file mode 100644 index 159e7aaf2..000000000 --- a/vtkm/cont/tbb/testing/UnitTestTBBPointLocatorSparseGrid.cxx +++ /dev/null @@ -1,19 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ - -#include - -int UnitTestTBBPointLocatorSparseGrid(int argc, char* argv[]) -{ - auto& tracker = vtkm::cont::GetRuntimeDeviceTracker(); - tracker.ForceDevice(vtkm::cont::DeviceAdapterTagTBB{}); - return vtkm::cont::testing::Testing::Run( - TestingPointLocatorSparseGrid(), argc, argv); -} diff --git a/vtkm/cont/testing/CMakeLists.txt b/vtkm/cont/testing/CMakeLists.txt index 53b8b955c..8f08b8944 100644 --- a/vtkm/cont/testing/CMakeLists.txt +++ b/vtkm/cont/testing/CMakeLists.txt @@ -13,7 +13,6 @@ set(headers MakeTestDataSet.h Testing.h TestingDeviceAdapter.h - TestingPointLocatorSparseGrid.h TestingRuntimeDeviceConfiguration.h TestingSerialization.h TestingVirtualObjectHandle.h @@ -108,6 +107,7 @@ set(unit_tests_device UnitTestDeviceAdapterAlgorithmDependency.cxx UnitTestImplicitFunction.cxx UnitTestParticleArrayCopy.cxx + UnitTestPointLocatorSparseGrid.cxx ) set(library_sources diff --git a/vtkm/cont/testing/TestingPointLocatorSparseGrid.h b/vtkm/cont/testing/TestingPointLocatorSparseGrid.h deleted file mode 100644 index 6e4902f3e..000000000 --- a/vtkm/cont/testing/TestingPointLocatorSparseGrid.h +++ /dev/null @@ -1,195 +0,0 @@ -//============================================================================ -// 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. -//============================================================================ - -#ifndef vtk_m_cont_testing_TestingPointLocatorSparseGrid_h -#define vtk_m_cont_testing_TestingPointLocatorSparseGrid_h - -#include - -#include - -#include - -#include - -////brute force method ///// -template -VTKM_EXEC_CONT vtkm::Id NNSVerify3D(CoordiVecT qc, CoordiPortalT coordiPortal, CoordiT& dis2) -{ - dis2 = std::numeric_limits::max(); - vtkm::Id nnpIdx = -1; - - for (vtkm::Int32 i = 0; i < coordiPortal.GetNumberOfValues(); i++) - { - CoordiT splitX = coordiPortal.Get(i)[0]; - CoordiT splitY = coordiPortal.Get(i)[1]; - CoordiT splitZ = coordiPortal.Get(i)[2]; - CoordiT _dis2 = (splitX - qc[0]) * (splitX - qc[0]) + (splitY - qc[1]) * (splitY - qc[1]) + - (splitZ - qc[2]) * (splitZ - qc[2]); - if (_dis2 < dis2) - { - dis2 = _dis2; - nnpIdx = i; - } - } - return nnpIdx; -} - -class NearestNeighborSearchBruteForce3DWorklet : public vtkm::worklet::WorkletMapField -{ -public: - using ControlSignature = void(FieldIn qcIn, - WholeArrayIn treeCoordiIn, - FieldOut nnIdOut, - FieldOut nnDisOut); - using ExecutionSignature = void(_1, _2, _3, _4); - - VTKM_CONT - NearestNeighborSearchBruteForce3DWorklet() {} - - template - VTKM_EXEC void operator()(const CoordiVecType& qc, - const CoordiPortalType& coordiPortal, - IdType& nnId, - CoordiType& nnDis) const - { - nnDis = std::numeric_limits::max(); - - nnId = NNSVerify3D(qc, coordiPortal, nnDis); - } -}; - -class PointLocatorSparseGridWorklet : public vtkm::worklet::WorkletMapField -{ -public: - typedef void ControlSignature(FieldIn qcIn, - ExecObject locator, - FieldOut nnIdOut, - FieldOut nnDistOut); - - typedef void ExecutionSignature(_1, _2, _3, _4); - - VTKM_CONT - PointLocatorSparseGridWorklet() {} - - template - VTKM_EXEC void operator()(const CoordiVecType& qc, - const Locator& locator, - vtkm::Id& nnIdOut, - vtkm::FloatDefault& nnDis) const - { - locator.FindNearestNeighbor(qc, nnIdOut, nnDis); - } -}; - -template -class TestingPointLocatorSparseGrid -{ -public: - void TestTest() const - { - vtkm::Int32 nTrainingPoints = 5; - vtkm::Int32 nTestingPoint = 1; - - std::vector coordi; - - ///// randomly generate training points///// - std::default_random_engine dre; - std::uniform_real_distribution dr(0.0f, 10.0f); - - for (vtkm::Int32 i = 0; i < nTrainingPoints; i++) - { - coordi.push_back(vtkm::make_Vec(dr(dre), dr(dre), dr(dre))); - } - // Add a point to each corner to test the case where points might slip out - // of the range by epsilon - coordi.push_back(vtkm::make_Vec(00.0f, 00.0f, 00.0f)); - coordi.push_back(vtkm::make_Vec(00.0f, 10.0f, 00.0f)); - coordi.push_back(vtkm::make_Vec(10.0f, 00.0f, 00.0f)); - coordi.push_back(vtkm::make_Vec(10.0f, 10.0f, 00.0f)); - coordi.push_back(vtkm::make_Vec(00.0f, 00.0f, 10.0f)); - coordi.push_back(vtkm::make_Vec(00.0f, 10.0f, 10.0f)); - coordi.push_back(vtkm::make_Vec(10.0f, 00.0f, 10.0f)); - coordi.push_back(vtkm::make_Vec(10.0f, 10.0f, 10.0f)); - auto coordi_Handle = vtkm::cont::make_ArrayHandle(coordi, vtkm::CopyFlag::Off); - - vtkm::cont::CoordinateSystem coord("points", coordi_Handle); - - vtkm::cont::PointLocatorSparseGrid locator; - locator.SetCoordinates(coord); - locator.SetRange({ { 0.0, 10.0 } }); - locator.SetNumberOfBins({ 5, 5, 5 }); - - locator.Update(); - - ///// randomly generate testing points///// - std::vector qcVec; - for (vtkm::Int32 i = 0; i < nTestingPoint; i++) - { - qcVec.push_back(vtkm::make_Vec(dr(dre), dr(dre), dr(dre))); - } - // Test near each corner to make sure that corner gets included - qcVec.push_back(vtkm::make_Vec(0.01f, 0.01f, 0.01f)); - qcVec.push_back(vtkm::make_Vec(0.01f, 9.99f, 0.01f)); - qcVec.push_back(vtkm::make_Vec(9.99f, 0.01f, 0.01f)); - qcVec.push_back(vtkm::make_Vec(9.99f, 9.99f, 0.01f)); - qcVec.push_back(vtkm::make_Vec(0.01f, 0.01f, 9.991f)); - qcVec.push_back(vtkm::make_Vec(0.01f, 9.99f, 9.99f)); - qcVec.push_back(vtkm::make_Vec(9.99f, 0.01f, 9.99f)); - qcVec.push_back(vtkm::make_Vec(9.99f, 9.99f, 9.99f)); - auto qc_Handle = vtkm::cont::make_ArrayHandle(qcVec, vtkm::CopyFlag::Off); - - vtkm::cont::ArrayHandle nnId_Handle; - vtkm::cont::ArrayHandle nnDis_Handle; - - PointLocatorSparseGridWorklet pointLocatorSparseGridWorklet; - vtkm::worklet::DispatcherMapField locatorDispatcher( - pointLocatorSparseGridWorklet); - locatorDispatcher.SetDevice(DeviceAdapter()); - locatorDispatcher.Invoke(qc_Handle, locator, nnId_Handle, nnDis_Handle); - - // brute force - vtkm::cont::ArrayHandle bfnnId_Handle; - vtkm::cont::ArrayHandle bfnnDis_Handle; - NearestNeighborSearchBruteForce3DWorklet nnsbf3dWorklet; - vtkm::worklet::DispatcherMapField nnsbf3DDispatcher( - nnsbf3dWorklet); - nnsbf3DDispatcher.SetDevice(DeviceAdapter()); - nnsbf3DDispatcher.Invoke(qc_Handle, coordi_Handle, bfnnId_Handle, bfnnDis_Handle); - - ///// verify search result ///// - bool passTest = true; - auto nnPortal = nnDis_Handle.ReadPortal(); - auto bfPortal = bfnnDis_Handle.ReadPortal(); - for (vtkm::Int32 i = 0; i < nTestingPoint; i++) - { - vtkm::Id workletIdx = nnId_Handle.WritePortal().Get(i); - vtkm::FloatDefault workletDis = nnPortal.Get(i); - vtkm::Id bfworkletIdx = bfnnId_Handle.WritePortal().Get(i); - vtkm::FloatDefault bfworkletDis = bfPortal.Get(i); - - if (workletIdx != bfworkletIdx) - { - std::cout << "bf index: " << bfworkletIdx << ", dis: " << bfworkletDis - << ", grid: " << workletIdx << ", dis " << workletDis << std::endl; - passTest = false; - } - } - VTKM_TEST_ASSERT(passTest, "Uniform Grid NN search result incorrect."); - } - - void operator()() const - { - vtkm::cont::GetRuntimeDeviceTracker().ForceDevice(DeviceAdapter()); - this->TestTest(); - } -}; - -#endif // vtk_m_cont_testing_TestingPointLocatorSparseGrid_h diff --git a/vtkm/cont/testing/UnitTestPointLocatorSparseGrid.cxx b/vtkm/cont/testing/UnitTestPointLocatorSparseGrid.cxx new file mode 100644 index 000000000..08f7107b3 --- /dev/null +++ b/vtkm/cont/testing/UnitTestPointLocatorSparseGrid.cxx @@ -0,0 +1,189 @@ +//============================================================================ +// 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. +//============================================================================ + +#include + +#include + +#include + +#include + +#include + +namespace +{ + +////brute force method ///// +template +VTKM_EXEC_CONT vtkm::Id NNSVerify3D(CoordiVecT qc, CoordiPortalT coordiPortal, CoordiT& dis2) +{ + dis2 = std::numeric_limits::max(); + vtkm::Id nnpIdx = -1; + + for (vtkm::Int32 i = 0; i < coordiPortal.GetNumberOfValues(); i++) + { + CoordiT splitX = coordiPortal.Get(i)[0]; + CoordiT splitY = coordiPortal.Get(i)[1]; + CoordiT splitZ = coordiPortal.Get(i)[2]; + CoordiT _dis2 = (splitX - qc[0]) * (splitX - qc[0]) + (splitY - qc[1]) * (splitY - qc[1]) + + (splitZ - qc[2]) * (splitZ - qc[2]); + if (_dis2 < dis2) + { + dis2 = _dis2; + nnpIdx = i; + } + } + return nnpIdx; +} + +class NearestNeighborSearchBruteForce3DWorklet : public vtkm::worklet::WorkletMapField +{ +public: + using ControlSignature = void(FieldIn qcIn, + WholeArrayIn treeCoordiIn, + FieldOut nnIdOut, + FieldOut nnDisOut); + using ExecutionSignature = void(_1, _2, _3, _4); + + VTKM_CONT + NearestNeighborSearchBruteForce3DWorklet() {} + + template + VTKM_EXEC void operator()(const CoordiVecType& qc, + const CoordiPortalType& coordiPortal, + IdType& nnId, + CoordiType& nnDis) const + { + nnDis = std::numeric_limits::max(); + + nnId = NNSVerify3D(qc, coordiPortal, nnDis); + } +}; + +class PointLocatorSparseGridWorklet : public vtkm::worklet::WorkletMapField +{ +public: + typedef void ControlSignature(FieldIn qcIn, + ExecObject locator, + FieldOut nnIdOut, + FieldOut nnDistOut); + + typedef void ExecutionSignature(_1, _2, _3, _4); + + VTKM_CONT + PointLocatorSparseGridWorklet() {} + + template + VTKM_EXEC void operator()(const CoordiVecType& qc, + const Locator& locator, + vtkm::Id& nnIdOut, + vtkm::FloatDefault& nnDis) const + { + locator.FindNearestNeighbor(qc, nnIdOut, nnDis); + } +}; + +void TestTest() +{ + vtkm::cont::Invoker invoke; + + vtkm::Int32 nTrainingPoints = 5; + vtkm::Int32 nTestingPoint = 1; + + std::vector coordi; + + ///// randomly generate training points///// + std::default_random_engine dre; + std::uniform_real_distribution dr(0.0f, 10.0f); + + for (vtkm::Int32 i = 0; i < nTrainingPoints; i++) + { + coordi.push_back(vtkm::make_Vec(dr(dre), dr(dre), dr(dre))); + } + // Add a point to each corner to test the case where points might slip out + // of the range by epsilon + coordi.push_back(vtkm::make_Vec(00.0f, 00.0f, 00.0f)); + coordi.push_back(vtkm::make_Vec(00.0f, 10.0f, 00.0f)); + coordi.push_back(vtkm::make_Vec(10.0f, 00.0f, 00.0f)); + coordi.push_back(vtkm::make_Vec(10.0f, 10.0f, 00.0f)); + coordi.push_back(vtkm::make_Vec(00.0f, 00.0f, 10.0f)); + coordi.push_back(vtkm::make_Vec(00.0f, 10.0f, 10.0f)); + coordi.push_back(vtkm::make_Vec(10.0f, 00.0f, 10.0f)); + coordi.push_back(vtkm::make_Vec(10.0f, 10.0f, 10.0f)); + auto coordi_Handle = vtkm::cont::make_ArrayHandle(coordi, vtkm::CopyFlag::Off); + + vtkm::cont::CoordinateSystem coord("points", coordi_Handle); + + vtkm::cont::PointLocatorSparseGrid locator; + locator.SetCoordinates(coord); + locator.SetRange({ { 0.0, 10.0 } }); + locator.SetNumberOfBins({ 5, 5, 5 }); + + locator.Update(); + + ///// randomly generate testing points///// + std::vector qcVec; + for (vtkm::Int32 i = 0; i < nTestingPoint; i++) + { + qcVec.push_back(vtkm::make_Vec(dr(dre), dr(dre), dr(dre))); + } + // Test near each corner to make sure that corner gets included + qcVec.push_back(vtkm::make_Vec(0.01f, 0.01f, 0.01f)); + qcVec.push_back(vtkm::make_Vec(0.01f, 9.99f, 0.01f)); + qcVec.push_back(vtkm::make_Vec(9.99f, 0.01f, 0.01f)); + qcVec.push_back(vtkm::make_Vec(9.99f, 9.99f, 0.01f)); + qcVec.push_back(vtkm::make_Vec(0.01f, 0.01f, 9.991f)); + qcVec.push_back(vtkm::make_Vec(0.01f, 9.99f, 9.99f)); + qcVec.push_back(vtkm::make_Vec(9.99f, 0.01f, 9.99f)); + qcVec.push_back(vtkm::make_Vec(9.99f, 9.99f, 9.99f)); + auto qc_Handle = vtkm::cont::make_ArrayHandle(qcVec, vtkm::CopyFlag::Off); + + vtkm::cont::ArrayHandle nnId_Handle; + vtkm::cont::ArrayHandle nnDis_Handle; + + invoke(PointLocatorSparseGridWorklet{}, qc_Handle, locator, nnId_Handle, nnDis_Handle); + + // brute force + vtkm::cont::ArrayHandle bfnnId_Handle; + vtkm::cont::ArrayHandle bfnnDis_Handle; + invoke(NearestNeighborSearchBruteForce3DWorklet{}, + qc_Handle, + coordi_Handle, + bfnnId_Handle, + bfnnDis_Handle); + + ///// verify search result ///// + bool passTest = true; + auto nnPortal = nnDis_Handle.ReadPortal(); + auto bfPortal = bfnnDis_Handle.ReadPortal(); + for (vtkm::Int32 i = 0; i < nTestingPoint; i++) + { + vtkm::Id workletIdx = nnId_Handle.WritePortal().Get(i); + vtkm::FloatDefault workletDis = nnPortal.Get(i); + vtkm::Id bfworkletIdx = bfnnId_Handle.WritePortal().Get(i); + vtkm::FloatDefault bfworkletDis = bfPortal.Get(i); + + if (workletIdx != bfworkletIdx) + { + std::cout << "bf index: " << bfworkletIdx << ", dis: " << bfworkletDis + << ", grid: " << workletIdx << ", dis " << workletDis << std::endl; + passTest = false; + } + } + VTKM_TEST_ASSERT(passTest, "Uniform Grid NN search result incorrect."); +} + +} // anonymous namespace + +int UnitTestPointLocatorSparseGrid(int argc, char* argv[]) +{ + return vtkm::cont::testing::Testing::Run(TestTest, argc, argv); +}