//============================================================================ // 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 #include #include #include static unsigned int uid = 1; template vtkm::cont::ArrayHandle CreateArray(T min, T max, vtkm::Id numVals, vtkm::TypeTraitsScalarTag) { std::mt19937 gen(uid++); std::uniform_real_distribution dis(static_cast(min), static_cast(max)); vtkm::cont::ArrayHandle handle; handle.Allocate(numVals); auto portal = handle.WritePortal(); std::generate(vtkm::cont::ArrayPortalToIteratorBegin(portal), vtkm::cont::ArrayPortalToIteratorEnd(portal), [&]() { return static_cast(dis(gen)); }); return handle; } template vtkm::cont::ArrayHandle CreateArray(const T& min, const T& max, vtkm::Id numVals, vtkm::TypeTraitsVectorTag) { constexpr int size = T::NUM_COMPONENTS; std::mt19937 gen(uid++); std::uniform_real_distribution dis[size]; for (int cc = 0; cc < size; ++cc) { dis[cc] = std::uniform_real_distribution(static_cast(min[cc]), static_cast(max[cc])); } vtkm::cont::ArrayHandle handle; handle.Allocate(numVals); auto portal = handle.WritePortal(); std::generate(vtkm::cont::ArrayPortalToIteratorBegin(portal), vtkm::cont::ArrayPortalToIteratorEnd(portal), [&]() { T val; for (int cc = 0; cc < size; ++cc) { val[cc] = static_cast(dis[cc](gen)); } return val; }); return handle; } static constexpr vtkm::Id ARRAY_SIZE = 1025; template void Validate(const vtkm::cont::ArrayHandle& ranges, const ValueType& min, const ValueType& max) { VTKM_TEST_ASSERT(ranges.GetNumberOfValues() == 1, "Wrong number of ranges"); auto portal = ranges.ReadPortal(); auto range = portal.Get(0); std::cout << " expecting [" << min << ", " << max << "], got [" << range.Min << ", " << range.Max << "]" << std::endl; VTKM_TEST_ASSERT(range.IsNonEmpty() && range.Min >= static_cast(min) && range.Max <= static_cast(max), "Got wrong range."); } template void Validate(const vtkm::cont::ArrayHandle& ranges, const vtkm::Vec& min, const vtkm::Vec& max) { VTKM_TEST_ASSERT(ranges.GetNumberOfValues() == size, "Wrong number of ranges"); auto portal = ranges.ReadPortal(); for (int cc = 0; cc < size; ++cc) { auto range = portal.Get(cc); std::cout << " [0] expecting [" << min[cc] << ", " << max[cc] << "], got [" << range.Min << ", " << range.Max << "]" << std::endl; VTKM_TEST_ASSERT(range.IsNonEmpty() && range.Min >= static_cast(min[cc]) && range.Max <= static_cast(max[cc]), "Got wrong range."); } } template void TryRangeComputeDS(const ValueType& min, const ValueType& max) { std::cout << "Trying type (dataset): " << vtkm::testing::TypeName::Name() << std::endl; // let's create a dummy dataset with a bunch of fields. vtkm::cont::DataSet dataset; dataset.AddPointField( "pointvar", CreateArray(min, max, ARRAY_SIZE, typename vtkm::TypeTraits::DimensionalityTag())); vtkm::cont::ArrayHandle ranges = vtkm::cont::FieldRangeCompute(dataset, "pointvar"); Validate(ranges, min, max); } template void TryRangeComputePDS(const ValueType& min, const ValueType& max) { std::cout << "Trying type (PartitionedDataSet): " << vtkm::testing::TypeName::Name() << std::endl; vtkm::cont::PartitionedDataSet mb; for (int cc = 0; cc < 5; cc++) { // let's create a dummy dataset with a bunch of fields. vtkm::cont::DataSet dataset; dataset.AddPointField( "pointvar", CreateArray(min, max, ARRAY_SIZE, typename vtkm::TypeTraits::DimensionalityTag())); mb.AppendPartition(dataset); } vtkm::cont::ArrayHandle ranges = vtkm::cont::FieldRangeCompute(mb, "pointvar"); Validate(ranges, min, max); } static void TestFieldRangeCompute() { // init random seed. std::srand(100); TryRangeComputeDS(0, 1000); TryRangeComputeDS(-1024, 1024); TryRangeComputeDS(vtkm::make_Vec(1024, 0, -1024), vtkm::make_Vec(2048, 2048, 2048)); TryRangeComputePDS(0, 1000); TryRangeComputePDS(-1024, 1024); TryRangeComputePDS(vtkm::make_Vec(1024, 0, -1024), vtkm::make_Vec(2048, 2048, 2048)); }; int UnitTestFieldRangeCompute(int argc, char* argv[]) { return vtkm::cont::testing::Testing::Run(TestFieldRangeCompute, argc, argv); }