From 2d518b1f244f51a4faf1aaacf696255f1000f0ee Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Mon, 17 Aug 2015 11:15:03 -0600 Subject: [PATCH] Update ArrayPortalUniformPointCoordinates Move ArrayPortalUniformPointCoordinates to the vtkm::internal namespace since it is going to be actively used in both control and execution environments. Replace usage of extent with simple dimensions. We have decided that there is not a lot of value in supporting extent in VTK-m. --- .../cont/ArrayHandleUniformPointCoordinates.h | 101 ++-------------- vtkm/cont/PointCoordinatesUniform.h | 4 +- ...TestArrayHandleUniformPointCoordinates.cxx | 25 ++-- .../UnitTestDynamicPointCoordinates.cxx | 15 ++- .../cont/testing/UnitTestPointCoordinates.cxx | 16 ++- .../ArrayPortalUniformPointCoordinates.h | 108 ++++++++++++++++++ vtkm/internal/CMakeLists.txt | 1 + 7 files changed, 145 insertions(+), 125 deletions(-) create mode 100644 vtkm/internal/ArrayPortalUniformPointCoordinates.h diff --git a/vtkm/cont/ArrayHandleUniformPointCoordinates.h b/vtkm/cont/ArrayHandleUniformPointCoordinates.h index dc7269f94..e7278a682 100644 --- a/vtkm/cont/ArrayHandleUniformPointCoordinates.h +++ b/vtkm/cont/ArrayHandleUniformPointCoordinates.h @@ -20,94 +20,13 @@ #ifndef vtk_m_cont_ArrayHandleUniformPointCoordinates_h #define vtk_m_cont_ArrayHandleUniformPointCoordinates_h -#include - +#include #include #include namespace vtkm { namespace cont { -namespace internal { - -/// \brief An implicit array port that computes point coordinates for a uniform -/// grid. -/// -class ArrayPortalUniformPointCoordinates -{ -public: - typedef vtkm::Vec ValueType; - - VTKM_EXEC_CONT_EXPORT - ArrayPortalUniformPointCoordinates() : NumberOfValues(0) { } - - VTKM_EXEC_CONT_EXPORT - ArrayPortalUniformPointCoordinates(vtkm::Extent3 extent, - ValueType origin, - ValueType spacing) - : Extent(extent), - Dimensions(vtkm::ExtentPointDimensions(extent)), - NumberOfValues(vtkm::ExtentNumberOfPoints(extent)), - Origin(origin), - Spacing(spacing) - { } - - VTKM_EXEC_CONT_EXPORT - ArrayPortalUniformPointCoordinates( - const ArrayPortalUniformPointCoordinates &src) - : Extent(src.Extent), - Dimensions(src.Dimensions), - NumberOfValues(src.NumberOfValues), - Origin(src.Origin), - Spacing(src.Spacing) - { } - - VTKM_EXEC_CONT_EXPORT - ArrayPortalUniformPointCoordinates & - operator=(const ArrayPortalUniformPointCoordinates &src) - { - this->Extent = src.Extent; - this->Dimensions = src.Dimensions; - this->NumberOfValues = src.NumberOfValues; - this->Origin = src.Origin; - this->Spacing = src.Spacing; - return *this; - } - - VTKM_EXEC_CONT_EXPORT - vtkm::Id GetNumberOfValues() const { return this->NumberOfValues; } - - VTKM_EXEC_CONT_EXPORT - ValueType Get(vtkm::Id index) const { - return this->GetCoordinatesForTopologyIndex( - vtkm::ExtentPointFlatIndexToTopologyIndex(index, this->Extent)); - } - - VTKM_EXEC_CONT_EXPORT - vtkm::Id3 GetRange3() const { return this->Dimensions; } - - VTKM_EXEC_CONT_EXPORT - ValueType Get(vtkm::Id3 index) const { - return this->GetCoordinatesForTopologyIndex(index + this->Extent.Min); - } - -private: - vtkm::Extent3 Extent; - vtkm::Id3 Dimensions; - vtkm::Id NumberOfValues; - ValueType Origin; - ValueType Spacing; - - VTKM_EXEC_CONT_EXPORT - ValueType GetCoordinatesForTopologyIndex(vtkm::Id3 ijk) const { - return ValueType(this->Origin[0] + this->Spacing[0] * static_cast(ijk[0]), - this->Origin[1] + this->Spacing[1] * static_cast(ijk[1]), - this->Origin[2] + this->Spacing[2] * static_cast(ijk[2])); - } -}; - -} // namespace internal - /// ArrayHandleUniformPointCoordinates is a specialization of ArrayHandle. It /// contains the information necessary to compute the point coordinates in a /// uniform orthogonal grid (extent, origin, and spacing) and implicitly @@ -117,31 +36,29 @@ class ArrayHandleUniformPointCoordinates : public vtkm::cont::ArrayHandle< vtkm::Vec, vtkm::cont::StorageTagImplicit< - internal::ArrayPortalUniformPointCoordinates> > + vtkm::internal::ArrayPortalUniformPointCoordinates> > { public: typedef vtkm::Vec ValueType; - -private: typedef vtkm::cont::StorageTagImplicit< - internal::ArrayPortalUniformPointCoordinates> StorageTag; - - typedef vtkm::cont::internal::Storage StorageType; + vtkm::internal::ArrayPortalUniformPointCoordinates> StorageTag; typedef vtkm::cont::ArrayHandle Superclass; +private: + typedef vtkm::cont::internal::Storage StorageType; + public: VTKM_CONT_EXPORT ArrayHandleUniformPointCoordinates() : Superclass() { } VTKM_CONT_EXPORT - ArrayHandleUniformPointCoordinates(vtkm::Extent3 extent, + ArrayHandleUniformPointCoordinates(vtkm::Id3 dimensions, ValueType origin, ValueType spacing) : Superclass( - StorageType(internal::ArrayPortalUniformPointCoordinates(extent, - origin, - spacing))) + StorageType(vtkm::internal::ArrayPortalUniformPointCoordinates( + dimensions, origin, spacing))) { } }; diff --git a/vtkm/cont/PointCoordinatesUniform.h b/vtkm/cont/PointCoordinatesUniform.h index 77d72f709..cd8ea573a 100644 --- a/vtkm/cont/PointCoordinatesUniform.h +++ b/vtkm/cont/PointCoordinatesUniform.h @@ -45,10 +45,10 @@ public: PointCoordinatesUniform() { } VTKM_CONT_EXPORT - PointCoordinatesUniform(const vtkm::Extent3 &extent, + PointCoordinatesUniform(const vtkm::Id3 &dimensions, const ValueType &origin, const ValueType &spacing) - : Array(extent, origin, spacing) + : Array(dimensions, origin, spacing) { } /// In this \c CastAndCall, both \c TypeList and \c StorageList are diff --git a/vtkm/cont/testing/UnitTestArrayHandleUniformPointCoordinates.cxx b/vtkm/cont/testing/UnitTestArrayHandleUniformPointCoordinates.cxx index 9216144cf..75f79a0d5 100644 --- a/vtkm/cont/testing/UnitTestArrayHandleUniformPointCoordinates.cxx +++ b/vtkm/cont/testing/UnitTestArrayHandleUniformPointCoordinates.cxx @@ -26,44 +26,41 @@ namespace { typedef vtkm::Vec Vector3; -const vtkm::Id3 MIN_VALUES(-5, 8, 40); -const vtkm::Id3 MAX_VALUES(10, 25, 44); -const vtkm::Id3 POINT_DIMS(16, 18, 5); +const vtkm::Id3 DIMENSIONS(16, 18, 5); const vtkm::Id NUM_POINTS = 1440; -const Vector3 ORIGIN(30, -3, -14); +const Vector3 ORIGIN(-20, 5, -10); const Vector3 SPACING(10, 1, 0.1f); -const Vector3 LOWER_LEFT(-20, 5, -10); // MIN_VALUES*SPACING + ORIGIN void TestArrayHandleUniformPointCoordinates() { std::cout << "Creating ArrayHandleUniformPointCoordinates" << std::endl; vtkm::cont::ArrayHandleUniformPointCoordinates arrayHandle( - vtkm::Extent3(MIN_VALUES, MAX_VALUES), ORIGIN, SPACING); + DIMENSIONS, ORIGIN, SPACING); VTKM_TEST_ASSERT(arrayHandle.GetNumberOfValues() == NUM_POINTS, "Array computed wrong number of points."); std::cout << "Getting array portal." << std::endl; - vtkm::cont::internal::ArrayPortalUniformPointCoordinates portal = + vtkm::internal::ArrayPortalUniformPointCoordinates portal = arrayHandle.GetPortalConstControl(); VTKM_TEST_ASSERT(portal.GetNumberOfValues() == NUM_POINTS, "Portal has wrong number of points."); - VTKM_TEST_ASSERT(portal.GetRange3() == POINT_DIMS, + VTKM_TEST_ASSERT(portal.GetRange3() == DIMENSIONS, "Portal range is wrong."); std::cout << "Checking computed values of portal." << std::endl; Vector3 expectedValue; vtkm::Id flatIndex = 0; vtkm::Id3 blockIndex; - expectedValue[2] = LOWER_LEFT[2]; - for (blockIndex[2] = 0; blockIndex[2] < POINT_DIMS[2]; blockIndex[2]++) + expectedValue[2] = ORIGIN[2]; + for (blockIndex[2] = 0; blockIndex[2] < DIMENSIONS[2]; blockIndex[2]++) { - expectedValue[1] = LOWER_LEFT[1]; - for (blockIndex[1] = 0; blockIndex[1] < POINT_DIMS[1]; blockIndex[1]++) + expectedValue[1] = ORIGIN[1]; + for (blockIndex[1] = 0; blockIndex[1] < DIMENSIONS[1]; blockIndex[1]++) { - expectedValue[0] = LOWER_LEFT[0]; - for (blockIndex[0] = 0; blockIndex[0] < POINT_DIMS[0]; blockIndex[0]++) + expectedValue[0] = ORIGIN[0]; + for (blockIndex[0] = 0; blockIndex[0] < DIMENSIONS[0]; blockIndex[0]++) { VTKM_TEST_ASSERT(test_equal(expectedValue, portal.Get(flatIndex)), "Got wrong value for flat index."); diff --git a/vtkm/cont/testing/UnitTestDynamicPointCoordinates.cxx b/vtkm/cont/testing/UnitTestDynamicPointCoordinates.cxx index d41bbafdf..5006773cf 100644 --- a/vtkm/cont/testing/UnitTestDynamicPointCoordinates.cxx +++ b/vtkm/cont/testing/UnitTestDynamicPointCoordinates.cxx @@ -31,21 +31,20 @@ namespace { -const vtkm::Extent3 EXTENT = vtkm::Extent3(vtkm::Id3(0,0,0), vtkm::Id3(9,9,9)); +const vtkm::Id3 DIMENSIONS = vtkm::Id3(9,9,9); const vtkm::Vec ORIGIN = vtkm::Vec(0, 0, 0); const vtkm::Vec SPACING = vtkm::Vec(1, 1, 1); -const vtkm::Id3 DIMENSION = vtkm::ExtentPointDimensions(EXTENT); -const vtkm::Id ARRAY_SIZE = DIMENSION[0]*DIMENSION[1]*DIMENSION[2]; +const vtkm::Id ARRAY_SIZE = DIMENSIONS[0]*DIMENSIONS[1]*DIMENSIONS[2]; vtkm::Vec ExpectedCoordinates(vtkm::Id index) { - vtkm::Id3 index3d = vtkm::ExtentPointFlatIndexToTopologyIndex(index, EXTENT); - return vtkm::make_Vec(vtkm::FloatDefault(index3d[0]), - vtkm::FloatDefault(index3d[1]), - vtkm::FloatDefault(index3d[2])); + return vtkm::make_Vec( + vtkm::FloatDefault(index%DIMENSIONS[0]), + vtkm::FloatDefault((index/DIMENSIONS[0])%DIMENSIONS[1]), + vtkm::FloatDefault(index/(DIMENSIONS[0]*DIMENSIONS[1]))); } int g_CheckArrayInvocations; @@ -178,7 +177,7 @@ void TryUniformPointCoordinates() vtkm::cont::DynamicPointCoordinates pointCoordinates = vtkm::cont::DynamicPointCoordinates( - vtkm::cont::PointCoordinatesUniform(EXTENT, ORIGIN, SPACING)); + vtkm::cont::PointCoordinatesUniform(DIMENSIONS, ORIGIN, SPACING)); pointCoordinates.CastAndCall(CheckArray()); diff --git a/vtkm/cont/testing/UnitTestPointCoordinates.cxx b/vtkm/cont/testing/UnitTestPointCoordinates.cxx index f5b41a0f4..476d3a001 100644 --- a/vtkm/cont/testing/UnitTestPointCoordinates.cxx +++ b/vtkm/cont/testing/UnitTestPointCoordinates.cxx @@ -29,7 +29,6 @@ #include #include -#include #include #include @@ -41,14 +40,13 @@ namespace { -const vtkm::Extent3 EXTENT = vtkm::Extent3(vtkm::Id3(0,0,0), vtkm::Id3(9,9,9)); +const vtkm::Id3 DIMENSIONS = vtkm::Id3(9,9,9); const vtkm::Vec ORIGIN = vtkm::Vec(0, 0, 0); const vtkm::Vec SPACING = vtkm::Vec(1, 1, 1); -const vtkm::Id3 DIMENSION = vtkm::ExtentPointDimensions(EXTENT); -const vtkm::Id ARRAY_SIZE = DIMENSION[0]*DIMENSION[1]*DIMENSION[2]; +const vtkm::Id ARRAY_SIZE = DIMENSIONS[0]*DIMENSIONS[1]*DIMENSIONS[2]; typedef vtkm::cont::StorageTagBasic StorageTag; @@ -56,10 +54,10 @@ struct StorageListTag : vtkm::cont::StorageListTagBasic { }; vtkm::Vec ExpectedCoordinates(vtkm::Id index) { - vtkm::Id3 index3d = vtkm::ExtentPointFlatIndexToTopologyIndex(index, EXTENT); - return vtkm::make_Vec(vtkm::FloatDefault(index3d[0]), - vtkm::FloatDefault(index3d[1]), - vtkm::FloatDefault(index3d[2])); + return vtkm::make_Vec( + vtkm::FloatDefault(index%DIMENSIONS[0]), + vtkm::FloatDefault((index/DIMENSIONS[0])%DIMENSIONS[1]), + vtkm::FloatDefault(index/(DIMENSIONS[0]*DIMENSIONS[1]))); } struct CheckArray @@ -122,7 +120,7 @@ void TestPointCoordinatesUniform() std::cout << "Testing PointCoordinatesUniform" << std::endl; vtkm::cont::PointCoordinatesUniform pointCoordinates = - vtkm::cont::PointCoordinatesUniform(EXTENT, ORIGIN, SPACING); + vtkm::cont::PointCoordinatesUniform(DIMENSIONS, ORIGIN, SPACING); pointCoordinates.CastAndCall( CheckArray(), vtkm::ListTagEmpty(), // Not used diff --git a/vtkm/internal/ArrayPortalUniformPointCoordinates.h b/vtkm/internal/ArrayPortalUniformPointCoordinates.h new file mode 100644 index 000000000..e05e5d64b --- /dev/null +++ b/vtkm/internal/ArrayPortalUniformPointCoordinates.h @@ -0,0 +1,108 @@ +//============================================================================ +// 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. +//============================================================================ +#ifndef vtk_m_internal_ArrayPortalUniformPointCoordinates_h +#define vtk_m_internal_ArrayPortalUniformPointCoordinates_h + +#include + +namespace vtkm { +namespace internal { + +/// \brief An implicit array port that computes point coordinates for a uniform grid. +/// +class ArrayPortalUniformPointCoordinates +{ +public: + typedef vtkm::Vec ValueType; + + VTKM_EXEC_CONT_EXPORT + ArrayPortalUniformPointCoordinates() : NumberOfValues(0) { } + + VTKM_EXEC_CONT_EXPORT + ArrayPortalUniformPointCoordinates(vtkm::Id3 dimensions, + ValueType origin, + ValueType spacing) + : Dimensions(dimensions), + NumberOfValues(dimensions[0]*dimensions[1]*dimensions[2]), + Origin(origin), + Spacing(spacing) + { } + + VTKM_EXEC_CONT_EXPORT + ArrayPortalUniformPointCoordinates( + const ArrayPortalUniformPointCoordinates &src) + : Dimensions(src.Dimensions), + NumberOfValues(src.NumberOfValues), + Origin(src.Origin), + Spacing(src.Spacing) + { } + + VTKM_EXEC_CONT_EXPORT + ArrayPortalUniformPointCoordinates & + operator=(const ArrayPortalUniformPointCoordinates &src) + { + this->Dimensions = src.Dimensions; + this->NumberOfValues = src.NumberOfValues; + this->Origin = src.Origin; + this->Spacing = src.Spacing; + return *this; + } + + VTKM_EXEC_CONT_EXPORT + vtkm::Id GetNumberOfValues() const { return this->NumberOfValues; } + + VTKM_EXEC_CONT_EXPORT + ValueType Get(vtkm::Id index) const { + return this->Get( + vtkm::Id3(index%this->Dimensions[0], + (index/this->Dimensions[0])%this->Dimensions[1], + index/(this->Dimensions[0]*this->Dimensions[1]))); + } + + VTKM_EXEC_CONT_EXPORT + vtkm::Id3 GetRange3() const { return this->Dimensions; } + + VTKM_EXEC_CONT_EXPORT + ValueType Get(vtkm::Id3 index) const { + return ValueType(this->Origin[0] + this->Spacing[0] * static_cast(index[0]), + this->Origin[1] + this->Spacing[1] * static_cast(index[1]), + this->Origin[2] + this->Spacing[2] * static_cast(index[2])); + } + + VTKM_EXEC_CONT_EXPORT + const vtkm::Id3 &GetDimensions() const { return this->Dimensions; } + + VTKM_EXEC_CONT_EXPORT + const ValueType &GetOrigin() const { return this->Origin; } + + VTKM_EXEC_CONT_EXPORT + const ValueType &GetSpacing() const { return this->Spacing; } + +private: + vtkm::Id3 Dimensions; + vtkm::Id NumberOfValues; + ValueType Origin; + ValueType Spacing; +}; + +} +} // namespace vtkm::internal + +#endif //vtk_m_internal_ArrayPortalUniformPointCoordinates_h diff --git a/vtkm/internal/CMakeLists.txt b/vtkm/internal/CMakeLists.txt index 5fdfb6c62..566f2260a 100644 --- a/vtkm/internal/CMakeLists.txt +++ b/vtkm/internal/CMakeLists.txt @@ -19,6 +19,7 @@ ##============================================================================ set(headers + ArrayPortalUniformPointCoordinates.h ConfigureFor32.h ConfigureFor64.h ConnectivityStructuredInternals.h