mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-08 13:23:51 +00:00
Support component extraction from ArrayHandleConstant better
Previously, `ArrayHandleConstant` did not really support component extraction. Instead, it let a fallback operation create a full array on the CPU. Component extraction is now quite efficient for `ArrayHandleConstant`. It creates a basic `ArrayHandle` with one entry and sets a modulo on the `ArrayHandleStride` to access that value for all indices.
This commit is contained in:
parent
969e55048b
commit
14460dbb31
9
docs/changelog/arrayhandleconstant-extract-component.md
Normal file
9
docs/changelog/arrayhandleconstant-extract-component.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Added support for component extraction from ArrayHandleConstant better
|
||||||
|
|
||||||
|
Previously, `ArrayHandleConstant` did not really support component
|
||||||
|
extraction. Instead, it let a fallback operation create a full array on
|
||||||
|
the CPU.
|
||||||
|
|
||||||
|
Component extraction is now quite efficient for `ArrayHandleConstant`. It
|
||||||
|
creates a basic `ArrayHandle` with one entry and sets a modulo on the
|
||||||
|
`ArrayHandleStride` to access that value for all indices.
|
@ -10,6 +10,7 @@
|
|||||||
#ifndef vtk_m_cont_ArrayHandleConstant_h
|
#ifndef vtk_m_cont_ArrayHandleConstant_h
|
||||||
#define vtk_m_cont_ArrayHandleConstant_h
|
#define vtk_m_cont_ArrayHandleConstant_h
|
||||||
|
|
||||||
|
#include <vtkm/cont/ArrayExtractComponent.h>
|
||||||
#include <vtkm/cont/ArrayHandleImplicit.h>
|
#include <vtkm/cont/ArrayHandleImplicit.h>
|
||||||
|
|
||||||
#include <vtkm/cont/internal/ArrayRangeComputeUtils.h>
|
#include <vtkm/cont/internal/ArrayRangeComputeUtils.h>
|
||||||
@ -100,6 +101,33 @@ vtkm::cont::ArrayHandleConstant<T> make_ArrayHandleConstant(T value, vtkm::Id nu
|
|||||||
namespace internal
|
namespace internal
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct VTKM_CONT_EXPORT ArrayExtractComponentImpl<vtkm::cont::StorageTagConstant>
|
||||||
|
{
|
||||||
|
template <typename T>
|
||||||
|
VTKM_CONT auto operator()(const vtkm::cont::ArrayHandle<T, vtkm::cont::StorageTagConstant>& src,
|
||||||
|
vtkm::IdComponent componentIndex,
|
||||||
|
vtkm::CopyFlag allowCopy) const
|
||||||
|
{
|
||||||
|
if (allowCopy != vtkm::CopyFlag::On)
|
||||||
|
{
|
||||||
|
throw vtkm::cont::ErrorBadValue(
|
||||||
|
"Cannot extract component of ArrayHandleConstant without copying. "
|
||||||
|
"(However, the whole array does not need to be copied.)");
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkm::cont::ArrayHandleConstant<T> srcArray = src;
|
||||||
|
|
||||||
|
vtkm::VecFlat<T> vecValue{ srcArray.GetValue() };
|
||||||
|
|
||||||
|
// Make a basic array with one entry (the constant value).
|
||||||
|
auto basicArray = vtkm::cont::make_ArrayHandle({ vecValue[componentIndex] });
|
||||||
|
|
||||||
|
// Set up a modulo = 1 so all indices go to this one value.
|
||||||
|
return vtkm::cont::make_ArrayHandleStride(basicArray, src.GetNumberOfValues(), 1, 0, 1, 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <typename S>
|
template <typename S>
|
||||||
struct ArrayRangeComputeImpl;
|
struct ArrayRangeComputeImpl;
|
||||||
|
|
||||||
|
@ -375,6 +375,20 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @brief Create an array by adding a stride to a basic array.
|
||||||
|
///
|
||||||
|
template <typename T>
|
||||||
|
vtkm::cont::ArrayHandleStride<T> make_ArrayHandleStride(
|
||||||
|
const vtkm::cont::ArrayHandle<T, vtkm::cont::StorageTagBasic>& array,
|
||||||
|
vtkm::Id numValues,
|
||||||
|
vtkm::Id stride,
|
||||||
|
vtkm::Id offset,
|
||||||
|
vtkm::Id modulo = 0,
|
||||||
|
vtkm::Id divisor = 1)
|
||||||
|
{
|
||||||
|
return { array, numValues, stride, offset, modulo, divisor };
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} // namespace vtkm::cont
|
} // namespace vtkm::cont
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@
|
|||||||
#define vtk_m_cont_ArrayHandleUniformPointCoordinates_h
|
#define vtk_m_cont_ArrayHandleUniformPointCoordinates_h
|
||||||
|
|
||||||
#include <vtkm/Range.h>
|
#include <vtkm/Range.h>
|
||||||
#include <vtkm/cont/ArrayExtractComponent.h>
|
|
||||||
#include <vtkm/cont/ArrayHandleImplicit.h>
|
#include <vtkm/cont/ArrayHandleImplicit.h>
|
||||||
#include <vtkm/internal/ArrayPortalUniformPointCoordinates.h>
|
#include <vtkm/internal/ArrayPortalUniformPointCoordinates.h>
|
||||||
|
|
||||||
@ -68,9 +67,15 @@ public:
|
|||||||
VTKM_CONT vtkm::Vec3f GetSpacing() const;
|
VTKM_CONT vtkm::Vec3f GetSpacing() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class ArrayHandleStride;
|
||||||
|
|
||||||
namespace internal
|
namespace internal
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
struct ArrayExtractComponentImpl;
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct VTKM_CONT_EXPORT ArrayExtractComponentImpl<vtkm::cont::StorageTagUniformPoints>
|
struct VTKM_CONT_EXPORT ArrayExtractComponentImpl<vtkm::cont::StorageTagUniformPoints>
|
||||||
{
|
{
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include <vtkm/cont/ArrayHandleCartesianProduct.h>
|
#include <vtkm/cont/ArrayHandleCartesianProduct.h>
|
||||||
#include <vtkm/cont/ArrayHandleCompositeVector.h>
|
#include <vtkm/cont/ArrayHandleCompositeVector.h>
|
||||||
|
#include <vtkm/cont/ArrayHandleConstant.h>
|
||||||
#include <vtkm/cont/ArrayHandleExtractComponent.h>
|
#include <vtkm/cont/ArrayHandleExtractComponent.h>
|
||||||
#include <vtkm/cont/ArrayHandleGroupVec.h>
|
#include <vtkm/cont/ArrayHandleGroupVec.h>
|
||||||
#include <vtkm/cont/ArrayHandleIndex.h>
|
#include <vtkm/cont/ArrayHandleIndex.h>
|
||||||
@ -283,6 +284,12 @@ void DoTest()
|
|||||||
CheckInputArray(array, vtkm::CopyFlag::On);
|
CheckInputArray(array, vtkm::CopyFlag::On);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::cout << "ArrayHandleConstant" << std::endl;
|
||||||
|
vtkm::cont::ArrayHandleConstant<vtkm::Vec3f> array(TestValue(0, vtkm::Vec3f{}), ARRAY_SIZE);
|
||||||
|
CheckInputArray(array, vtkm::CopyFlag::On);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::cout << "Weird combination." << std::endl;
|
std::cout << "Weird combination." << std::endl;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user