2020-02-03 18:00:31 +00:00
|
|
|
//============================================================================
|
|
|
|
// 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 <vtkm/filter/MapFieldPermutation.h>
|
|
|
|
|
|
|
|
#include <vtkm/TypeList.h>
|
2020-02-06 17:57:54 +00:00
|
|
|
#include <vtkm/TypeTraits.h>
|
|
|
|
#include <vtkm/VecTraits.h>
|
2020-02-03 18:00:31 +00:00
|
|
|
|
|
|
|
#include <vtkm/cont/Logging.h>
|
|
|
|
|
2020-06-03 21:24:36 +00:00
|
|
|
#include <vtkm/cont/internal/CastInvalidValue.h>
|
|
|
|
|
2020-02-06 17:57:54 +00:00
|
|
|
#include <vtkm/worklet/WorkletMapField.h>
|
|
|
|
|
2020-02-03 18:00:31 +00:00
|
|
|
#include <vtkm/filter/PolicyDefault.h>
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
|
2020-02-06 17:57:54 +00:00
|
|
|
template <typename T>
|
|
|
|
struct MapPermutationWorklet : vtkm::worklet::WorkletMapField
|
|
|
|
{
|
|
|
|
T InvalidValue;
|
|
|
|
|
|
|
|
explicit MapPermutationWorklet(T invalidValue)
|
|
|
|
: InvalidValue(invalidValue)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
using ControlSignature = void(FieldIn permutationIndex, WholeArrayIn input, FieldOut output);
|
|
|
|
|
|
|
|
template <typename InputPortalType>
|
|
|
|
VTKM_EXEC void operator()(vtkm::Id permutationIndex, InputPortalType inputPortal, T& output) const
|
|
|
|
{
|
|
|
|
if ((permutationIndex >= 0) && (permutationIndex < inputPortal.GetNumberOfValues()))
|
|
|
|
{
|
|
|
|
output = inputPortal.Get(permutationIndex);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
output = this->InvalidValue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-02-03 18:00:31 +00:00
|
|
|
struct DoMapFieldPermutation
|
|
|
|
{
|
|
|
|
bool CalledMap = false;
|
|
|
|
|
|
|
|
template <typename T, typename S>
|
|
|
|
void operator()(const vtkm::cont::ArrayHandle<T, S>& inputArray,
|
|
|
|
const vtkm::cont::ArrayHandle<vtkm::Id>& permutation,
|
2020-02-06 17:57:54 +00:00
|
|
|
vtkm::cont::VariantArrayHandle& output,
|
|
|
|
vtkm::Float64 invalidValue)
|
2020-02-03 18:00:31 +00:00
|
|
|
{
|
|
|
|
vtkm::cont::ArrayHandle<T> outputArray;
|
2020-06-03 21:24:36 +00:00
|
|
|
MapPermutationWorklet<T> worklet(vtkm::cont::internal::CastInvalidValue<T>(invalidValue));
|
2020-02-06 17:57:54 +00:00
|
|
|
vtkm::cont::Invoker invoke;
|
|
|
|
invoke(worklet, permutation, inputArray, outputArray);
|
2020-02-03 18:00:31 +00:00
|
|
|
output = vtkm::cont::VariantArrayHandle(outputArray);
|
|
|
|
this->CalledMap = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // anonymous namespace
|
|
|
|
|
|
|
|
bool vtkm::filter::MapFieldPermutation(const vtkm::cont::Field& inputField,
|
|
|
|
const vtkm::cont::ArrayHandle<vtkm::Id>& permutation,
|
2020-02-06 17:57:54 +00:00
|
|
|
vtkm::cont::Field& outputField,
|
|
|
|
vtkm::Float64 invalidValue)
|
2020-02-03 18:00:31 +00:00
|
|
|
{
|
|
|
|
vtkm::cont::VariantArrayHandle outputArray;
|
|
|
|
DoMapFieldPermutation functor;
|
|
|
|
inputField.GetData().ResetTypes<vtkm::TypeListAll>().CastAndCall(
|
2020-02-06 17:57:54 +00:00
|
|
|
vtkm::filter::PolicyDefault::StorageList{}, functor, permutation, outputArray, invalidValue);
|
2020-02-03 18:00:31 +00:00
|
|
|
if (functor.CalledMap)
|
|
|
|
{
|
|
|
|
outputField = vtkm::cont::Field(inputField.GetName(), inputField.GetAssociation(), outputArray);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
VTKM_LOG_S(vtkm::cont::LogLevel::Warn, "Faild to map field " << inputField.GetName());
|
|
|
|
}
|
|
|
|
return functor.CalledMap;
|
|
|
|
}
|
|
|
|
|
2020-02-05 04:44:10 +00:00
|
|
|
bool vtkm::filter::MapFieldPermutation(const vtkm::cont::Field& inputField,
|
|
|
|
const vtkm::cont::ArrayHandle<vtkm::Id>& permutation,
|
2020-02-06 17:57:54 +00:00
|
|
|
vtkm::cont::DataSet& outputData,
|
|
|
|
vtkm::Float64 invalidValue)
|
2020-02-03 18:00:31 +00:00
|
|
|
{
|
|
|
|
vtkm::cont::Field outputField;
|
2020-02-06 17:57:54 +00:00
|
|
|
bool success =
|
|
|
|
vtkm::filter::MapFieldPermutation(inputField, permutation, outputField, invalidValue);
|
2020-02-03 18:00:31 +00:00
|
|
|
if (success)
|
|
|
|
{
|
|
|
|
outputData.AddField(outputField);
|
|
|
|
}
|
|
|
|
return success;
|
|
|
|
}
|