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.
This commit is contained in:
Kenneth Moreland 2015-08-17 11:15:03 -06:00
parent d014b13432
commit 2d518b1f24
7 changed files with 145 additions and 125 deletions

@ -20,94 +20,13 @@
#ifndef vtk_m_cont_ArrayHandleUniformPointCoordinates_h #ifndef vtk_m_cont_ArrayHandleUniformPointCoordinates_h
#define vtk_m_cont_ArrayHandleUniformPointCoordinates_h #define vtk_m_cont_ArrayHandleUniformPointCoordinates_h
#include <vtkm/Extent.h> #include <vtkm/internal/ArrayPortalUniformPointCoordinates.h>
#include <vtkm/cont/ArrayHandle.h> #include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/StorageImplicit.h> #include <vtkm/cont/StorageImplicit.h>
namespace vtkm { namespace vtkm {
namespace cont { namespace cont {
namespace internal {
/// \brief An implicit array port that computes point coordinates for a uniform
/// grid.
///
class ArrayPortalUniformPointCoordinates
{
public:
typedef vtkm::Vec<vtkm::FloatDefault,3> 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<vtkm::FloatDefault>(ijk[0]),
this->Origin[1] + this->Spacing[1] * static_cast<vtkm::FloatDefault>(ijk[1]),
this->Origin[2] + this->Spacing[2] * static_cast<vtkm::FloatDefault>(ijk[2]));
}
};
} // namespace internal
/// ArrayHandleUniformPointCoordinates is a specialization of ArrayHandle. It /// ArrayHandleUniformPointCoordinates is a specialization of ArrayHandle. It
/// contains the information necessary to compute the point coordinates in a /// contains the information necessary to compute the point coordinates in a
/// uniform orthogonal grid (extent, origin, and spacing) and implicitly /// uniform orthogonal grid (extent, origin, and spacing) and implicitly
@ -117,31 +36,29 @@ class ArrayHandleUniformPointCoordinates
: public vtkm::cont::ArrayHandle< : public vtkm::cont::ArrayHandle<
vtkm::Vec<vtkm::FloatDefault,3>, vtkm::Vec<vtkm::FloatDefault,3>,
vtkm::cont::StorageTagImplicit< vtkm::cont::StorageTagImplicit<
internal::ArrayPortalUniformPointCoordinates> > vtkm::internal::ArrayPortalUniformPointCoordinates> >
{ {
public: public:
typedef vtkm::Vec<vtkm::FloatDefault,3> ValueType; typedef vtkm::Vec<vtkm::FloatDefault,3> ValueType;
private:
typedef vtkm::cont::StorageTagImplicit< typedef vtkm::cont::StorageTagImplicit<
internal::ArrayPortalUniformPointCoordinates> StorageTag; vtkm::internal::ArrayPortalUniformPointCoordinates> StorageTag;
typedef vtkm::cont::internal::Storage<ValueType, StorageTag> StorageType;
typedef vtkm::cont::ArrayHandle<ValueType, StorageTag> Superclass; typedef vtkm::cont::ArrayHandle<ValueType, StorageTag> Superclass;
private:
typedef vtkm::cont::internal::Storage<ValueType, StorageTag> StorageType;
public: public:
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
ArrayHandleUniformPointCoordinates() : Superclass() { } ArrayHandleUniformPointCoordinates() : Superclass() { }
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
ArrayHandleUniformPointCoordinates(vtkm::Extent3 extent, ArrayHandleUniformPointCoordinates(vtkm::Id3 dimensions,
ValueType origin, ValueType origin,
ValueType spacing) ValueType spacing)
: Superclass( : Superclass(
StorageType(internal::ArrayPortalUniformPointCoordinates(extent, StorageType(vtkm::internal::ArrayPortalUniformPointCoordinates(
origin, dimensions, origin, spacing)))
spacing)))
{ } { }
}; };

@ -45,10 +45,10 @@ public:
PointCoordinatesUniform() { } PointCoordinatesUniform() { }
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
PointCoordinatesUniform(const vtkm::Extent3 &extent, PointCoordinatesUniform(const vtkm::Id3 &dimensions,
const ValueType &origin, const ValueType &origin,
const ValueType &spacing) const ValueType &spacing)
: Array(extent, origin, spacing) : Array(dimensions, origin, spacing)
{ } { }
/// In this \c CastAndCall, both \c TypeList and \c StorageList are /// In this \c CastAndCall, both \c TypeList and \c StorageList are

@ -26,44 +26,41 @@ namespace {
typedef vtkm::Vec<vtkm::FloatDefault, 3> Vector3; typedef vtkm::Vec<vtkm::FloatDefault, 3> Vector3;
const vtkm::Id3 MIN_VALUES(-5, 8, 40); const vtkm::Id3 DIMENSIONS(16, 18, 5);
const vtkm::Id3 MAX_VALUES(10, 25, 44);
const vtkm::Id3 POINT_DIMS(16, 18, 5);
const vtkm::Id NUM_POINTS = 1440; 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 SPACING(10, 1, 0.1f);
const Vector3 LOWER_LEFT(-20, 5, -10); // MIN_VALUES*SPACING + ORIGIN
void TestArrayHandleUniformPointCoordinates() void TestArrayHandleUniformPointCoordinates()
{ {
std::cout << "Creating ArrayHandleUniformPointCoordinates" << std::endl; std::cout << "Creating ArrayHandleUniformPointCoordinates" << std::endl;
vtkm::cont::ArrayHandleUniformPointCoordinates arrayHandle( vtkm::cont::ArrayHandleUniformPointCoordinates arrayHandle(
vtkm::Extent3(MIN_VALUES, MAX_VALUES), ORIGIN, SPACING); DIMENSIONS, ORIGIN, SPACING);
VTKM_TEST_ASSERT(arrayHandle.GetNumberOfValues() == NUM_POINTS, VTKM_TEST_ASSERT(arrayHandle.GetNumberOfValues() == NUM_POINTS,
"Array computed wrong number of points."); "Array computed wrong number of points.");
std::cout << "Getting array portal." << std::endl; std::cout << "Getting array portal." << std::endl;
vtkm::cont::internal::ArrayPortalUniformPointCoordinates portal = vtkm::internal::ArrayPortalUniformPointCoordinates portal =
arrayHandle.GetPortalConstControl(); arrayHandle.GetPortalConstControl();
VTKM_TEST_ASSERT(portal.GetNumberOfValues() == NUM_POINTS, VTKM_TEST_ASSERT(portal.GetNumberOfValues() == NUM_POINTS,
"Portal has wrong number of points."); "Portal has wrong number of points.");
VTKM_TEST_ASSERT(portal.GetRange3() == POINT_DIMS, VTKM_TEST_ASSERT(portal.GetRange3() == DIMENSIONS,
"Portal range is wrong."); "Portal range is wrong.");
std::cout << "Checking computed values of portal." << std::endl; std::cout << "Checking computed values of portal." << std::endl;
Vector3 expectedValue; Vector3 expectedValue;
vtkm::Id flatIndex = 0; vtkm::Id flatIndex = 0;
vtkm::Id3 blockIndex; vtkm::Id3 blockIndex;
expectedValue[2] = LOWER_LEFT[2]; expectedValue[2] = ORIGIN[2];
for (blockIndex[2] = 0; blockIndex[2] < POINT_DIMS[2]; blockIndex[2]++) for (blockIndex[2] = 0; blockIndex[2] < DIMENSIONS[2]; blockIndex[2]++)
{ {
expectedValue[1] = LOWER_LEFT[1]; expectedValue[1] = ORIGIN[1];
for (blockIndex[1] = 0; blockIndex[1] < POINT_DIMS[1]; blockIndex[1]++) for (blockIndex[1] = 0; blockIndex[1] < DIMENSIONS[1]; blockIndex[1]++)
{ {
expectedValue[0] = LOWER_LEFT[0]; expectedValue[0] = ORIGIN[0];
for (blockIndex[0] = 0; blockIndex[0] < POINT_DIMS[0]; blockIndex[0]++) for (blockIndex[0] = 0; blockIndex[0] < DIMENSIONS[0]; blockIndex[0]++)
{ {
VTKM_TEST_ASSERT(test_equal(expectedValue, portal.Get(flatIndex)), VTKM_TEST_ASSERT(test_equal(expectedValue, portal.Get(flatIndex)),
"Got wrong value for flat index."); "Got wrong value for flat index.");

@ -31,21 +31,20 @@
namespace { 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<vtkm::FloatDefault,3> ORIGIN = const vtkm::Vec<vtkm::FloatDefault,3> ORIGIN =
vtkm::Vec<vtkm::FloatDefault,3>(0, 0, 0); vtkm::Vec<vtkm::FloatDefault,3>(0, 0, 0);
const vtkm::Vec<vtkm::FloatDefault,3> SPACING = const vtkm::Vec<vtkm::FloatDefault,3> SPACING =
vtkm::Vec<vtkm::FloatDefault,3>(1, 1, 1); vtkm::Vec<vtkm::FloatDefault,3>(1, 1, 1);
const vtkm::Id3 DIMENSION = vtkm::ExtentPointDimensions(EXTENT); const vtkm::Id ARRAY_SIZE = DIMENSIONS[0]*DIMENSIONS[1]*DIMENSIONS[2];
const vtkm::Id ARRAY_SIZE = DIMENSION[0]*DIMENSION[1]*DIMENSION[2];
vtkm::Vec<vtkm::FloatDefault,3> ExpectedCoordinates(vtkm::Id index) vtkm::Vec<vtkm::FloatDefault,3> ExpectedCoordinates(vtkm::Id index)
{ {
vtkm::Id3 index3d = vtkm::ExtentPointFlatIndexToTopologyIndex(index, EXTENT); return vtkm::make_Vec(
return vtkm::make_Vec(vtkm::FloatDefault(index3d[0]), vtkm::FloatDefault(index%DIMENSIONS[0]),
vtkm::FloatDefault(index3d[1]), vtkm::FloatDefault((index/DIMENSIONS[0])%DIMENSIONS[1]),
vtkm::FloatDefault(index3d[2])); vtkm::FloatDefault(index/(DIMENSIONS[0]*DIMENSIONS[1])));
} }
int g_CheckArrayInvocations; int g_CheckArrayInvocations;
@ -178,7 +177,7 @@ void TryUniformPointCoordinates()
vtkm::cont::DynamicPointCoordinates pointCoordinates = vtkm::cont::DynamicPointCoordinates pointCoordinates =
vtkm::cont::DynamicPointCoordinates( vtkm::cont::DynamicPointCoordinates(
vtkm::cont::PointCoordinatesUniform(EXTENT, ORIGIN, SPACING)); vtkm::cont::PointCoordinatesUniform(DIMENSIONS, ORIGIN, SPACING));
pointCoordinates.CastAndCall(CheckArray()); pointCoordinates.CastAndCall(CheckArray());

@ -29,7 +29,6 @@
#include <vtkm/cont/PointCoordinatesArray.h> #include <vtkm/cont/PointCoordinatesArray.h>
#include <vtkm/cont/PointCoordinatesUniform.h> #include <vtkm/cont/PointCoordinatesUniform.h>
#include <vtkm/Extent.h>
#include <vtkm/TypeListTag.h> #include <vtkm/TypeListTag.h>
#include <vtkm/cont/DeviceAdapterSerial.h> #include <vtkm/cont/DeviceAdapterSerial.h>
@ -41,14 +40,13 @@
namespace { 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<vtkm::FloatDefault,3> ORIGIN = const vtkm::Vec<vtkm::FloatDefault,3> ORIGIN =
vtkm::Vec<vtkm::FloatDefault,3>(0, 0, 0); vtkm::Vec<vtkm::FloatDefault,3>(0, 0, 0);
const vtkm::Vec<vtkm::FloatDefault,3> SPACING = const vtkm::Vec<vtkm::FloatDefault,3> SPACING =
vtkm::Vec<vtkm::FloatDefault,3>(1, 1, 1); vtkm::Vec<vtkm::FloatDefault,3>(1, 1, 1);
const vtkm::Id3 DIMENSION = vtkm::ExtentPointDimensions(EXTENT); const vtkm::Id ARRAY_SIZE = DIMENSIONS[0]*DIMENSIONS[1]*DIMENSIONS[2];
const vtkm::Id ARRAY_SIZE = DIMENSION[0]*DIMENSION[1]*DIMENSION[2];
typedef vtkm::cont::StorageTagBasic StorageTag; typedef vtkm::cont::StorageTagBasic StorageTag;
@ -56,10 +54,10 @@ struct StorageListTag : vtkm::cont::StorageListTagBasic { };
vtkm::Vec<vtkm::FloatDefault,3> ExpectedCoordinates(vtkm::Id index) vtkm::Vec<vtkm::FloatDefault,3> ExpectedCoordinates(vtkm::Id index)
{ {
vtkm::Id3 index3d = vtkm::ExtentPointFlatIndexToTopologyIndex(index, EXTENT); return vtkm::make_Vec(
return vtkm::make_Vec(vtkm::FloatDefault(index3d[0]), vtkm::FloatDefault(index%DIMENSIONS[0]),
vtkm::FloatDefault(index3d[1]), vtkm::FloatDefault((index/DIMENSIONS[0])%DIMENSIONS[1]),
vtkm::FloatDefault(index3d[2])); vtkm::FloatDefault(index/(DIMENSIONS[0]*DIMENSIONS[1])));
} }
struct CheckArray struct CheckArray
@ -122,7 +120,7 @@ void TestPointCoordinatesUniform()
std::cout << "Testing PointCoordinatesUniform" << std::endl; std::cout << "Testing PointCoordinatesUniform" << std::endl;
vtkm::cont::PointCoordinatesUniform pointCoordinates = vtkm::cont::PointCoordinatesUniform pointCoordinates =
vtkm::cont::PointCoordinatesUniform(EXTENT, ORIGIN, SPACING); vtkm::cont::PointCoordinatesUniform(DIMENSIONS, ORIGIN, SPACING);
pointCoordinates.CastAndCall( pointCoordinates.CastAndCall(
CheckArray(), CheckArray(),
vtkm::ListTagEmpty(), // Not used vtkm::ListTagEmpty(), // Not used

@ -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 <vtkm/Types.h>
namespace vtkm {
namespace internal {
/// \brief An implicit array port that computes point coordinates for a uniform grid.
///
class ArrayPortalUniformPointCoordinates
{
public:
typedef vtkm::Vec<vtkm::FloatDefault,3> 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<vtkm::FloatDefault>(index[0]),
this->Origin[1] + this->Spacing[1] * static_cast<vtkm::FloatDefault>(index[1]),
this->Origin[2] + this->Spacing[2] * static_cast<vtkm::FloatDefault>(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

@ -19,6 +19,7 @@
##============================================================================ ##============================================================================
set(headers set(headers
ArrayPortalUniformPointCoordinates.h
ConfigureFor32.h ConfigureFor32.h
ConfigureFor64.h ConfigureFor64.h
ConnectivityStructuredInternals.h ConnectivityStructuredInternals.h