mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-19 18:45:43 +00:00
Added custom CopyIf function
This commit is contained in:
parent
d370674d2b
commit
e0f0e4d673
@ -94,6 +94,13 @@ struct DeviceAdapterAlgorithm
|
||||
vtkm::cont::ArrayHandle<T, COut>& output,
|
||||
UnaryPredicate unary_predicate);
|
||||
|
||||
template <typename T, typename U, class CIn, class CStencil, class COut>
|
||||
VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
const vtkm::cont::ArrayHandle<U, CStencil>& stencil,
|
||||
vtkm::cont::ArrayHandle<T, COut>& output,
|
||||
const vtkm::Id& output_size);
|
||||
|
||||
|
||||
/// \brief Copy the contents of a section of one ArrayHandle to another
|
||||
///
|
||||
/// Copies the a range of elements of \c input to \c output. The number of
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -124,6 +124,44 @@ public:
|
||||
output.Shrink(writePos);
|
||||
}
|
||||
|
||||
template <typename T, typename U, class CIn, class CStencil, class COut>
|
||||
VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
const vtkm::cont::ArrayHandle<U, CStencil>& stencil,
|
||||
vtkm::cont::ArrayHandle<T, COut>& output,
|
||||
const vtkm::Id& output_size)
|
||||
{
|
||||
::vtkm::NotZeroInitialized unary_predicate;
|
||||
CopyIf(input, stencil, output, output_size, unary_predicate);
|
||||
}
|
||||
|
||||
|
||||
template <typename T, typename U, class CIn, class CStencil, class COut, class UnaryPredicate>
|
||||
VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
const vtkm::cont::ArrayHandle<U, CStencil>& stencil,
|
||||
vtkm::cont::ArrayHandle<T, COut>& output,
|
||||
const vtkm::Id& output_size,
|
||||
UnaryPredicate predicate)
|
||||
{
|
||||
vtkm::Id inputSize = input.GetNumberOfValues();
|
||||
VTKM_ASSERT(inputSize == stencil.GetNumberOfValues());
|
||||
|
||||
auto inputPortal = input.PrepareForInput(DeviceAdapterTagSerial());
|
||||
auto stencilPortal = stencil.PrepareForInput(DeviceAdapterTagSerial());
|
||||
auto outputPortal = output.PrepareForOutput(output_size, DeviceAdapterTagSerial());
|
||||
|
||||
vtkm::Id readPos = 0;
|
||||
vtkm::Id writePos = 0;
|
||||
|
||||
for (; readPos < inputSize; ++readPos)
|
||||
{
|
||||
if (predicate(stencilPortal.Get(readPos)))
|
||||
{
|
||||
outputPortal.Set(writePos, inputPortal.Get(readPos));
|
||||
++writePos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename U, class CIn, class COut>
|
||||
VTKM_CONT static bool CopySubRange(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
vtkm::Id inputStartIndex,
|
||||
|
@ -79,6 +79,35 @@ public:
|
||||
output.Shrink(outputSize);
|
||||
}
|
||||
|
||||
template <typename T, typename U, class CIn, class CStencil, class COut>
|
||||
VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
const vtkm::cont::ArrayHandle<U, CStencil>& stencil,
|
||||
vtkm::cont::ArrayHandle<T, COut>& output,
|
||||
const vtkm::Id& output_size)
|
||||
{
|
||||
|
||||
VTKM_LOG_SCOPE_FUNCTION(vtkm::cont::LogLevel::Perf);
|
||||
::vtkm::NotZeroInitialized unary_predicate;
|
||||
CopyIf(input, stencil, output, output_size, unary_predicate);
|
||||
}
|
||||
|
||||
template <typename T, typename U, class CIn, class CStencil, class COut, class UnaryPredicate>
|
||||
VTKM_CONT static void CopyIf(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
const vtkm::cont::ArrayHandle<U, CStencil>& stencil,
|
||||
vtkm::cont::ArrayHandle<T, COut>& output,
|
||||
const vtkm::Id& output_size,
|
||||
UnaryPredicate unary_predicate)
|
||||
{
|
||||
|
||||
VTKM_LOG_SCOPE_FUNCTION(vtkm::cont::LogLevel::Perf);
|
||||
vtkm::Id inputSize = input.GetNumberOfValues();
|
||||
tbb::CopyIfPortals(input.PrepareForInput(DeviceAdapterTagTBB()),
|
||||
stencil.PrepareForInput(DeviceAdapterTagTBB()),
|
||||
output.PrepareForOutput(output_size, DeviceAdapterTagTBB()),
|
||||
unary_predicate);
|
||||
}
|
||||
|
||||
|
||||
template <typename T, typename U, class CIn, class COut>
|
||||
VTKM_CONT static bool CopySubRange(const vtkm::cont::ArrayHandle<T, CIn>& input,
|
||||
vtkm::Id inputStartIndex,
|
||||
|
Loading…
Reference in New Issue
Block a user