Make dot/cross filter interface more consistent

Both the dot product filter and the cross product filter require 2
fields to be selected as their input. Previously, you used the
superclass' SetActiveField for the primary field and
SetSecondaryFieldName for the secondary field. This changes adds a
SetPrimaryField method to make the selection more clear. I also changed
SetSecondaryFieldName to SetSecondaryField that optionally takes an
association to make it more consistent.
This commit is contained in:
Kenneth Moreland 2018-03-25 10:43:49 -06:00
parent f359f6f15f
commit 707eccd3d5
6 changed files with 54 additions and 20 deletions

@ -36,7 +36,21 @@ public:
CrossProduct();
VTKM_CONT
void SetSecondaryFieldName(const std::string& nm) { SecondaryFieldName = nm; }
void SetPrimaryField(
const std::string& name,
vtkm::cont::Field::AssociationEnum association = vtkm::cont::Field::ASSOC_ANY)
{
this->SetActiveField(name, association);
}
VTKM_CONT
void SetSecondaryField(
const std::string& name,
vtkm::cont::Field::AssociationEnum association = vtkm::cont::Field::ASSOC_ANY)
{
this->SecondaryFieldName = name;
this->SecondaryFieldAssociation = association;
}
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
VTKM_CONT vtkm::filter::Result DoExecute(
@ -54,8 +68,8 @@ public:
DeviceAdapter tag);
private:
vtkm::worklet::CrossProduct Worklet;
std::string SecondaryFieldName;
vtkm::cont::Field::AssociationEnum SecondaryFieldAssociation;
};
template <>

@ -28,8 +28,8 @@ namespace filter
//-----------------------------------------------------------------------------
inline VTKM_CONT CrossProduct::CrossProduct()
: vtkm::filter::FilterField<CrossProduct>()
, Worklet()
, SecondaryFieldName("")
, SecondaryFieldName()
, SecondaryFieldAssociation(vtkm::cont::Field::ASSOC_ANY)
{
this->SetOutputFieldName("crossproduct");
}
@ -45,14 +45,14 @@ inline VTKM_CONT vtkm::filter::Result CrossProduct::DoExecute(
{
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>> outArray;
vtkm::worklet::DispatcherMapField<vtkm::worklet::CrossProduct, DeviceAdapter> dispatcher(
this->Worklet);
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>> secondaryField;
try
{
using Traits = vtkm::filter::FilterTraits<CrossProduct>;
vtkm::filter::ApplyPolicy(inDataSet.GetField(SecondaryFieldName), policy, Traits())
vtkm::filter::ApplyPolicy(
inDataSet.GetField(this->SecondaryFieldName, this->SecondaryFieldAssociation),
policy,
Traits())
.CopyTo(secondaryField);
}
catch (const vtkm::cont::Error&)
@ -60,6 +60,7 @@ inline VTKM_CONT vtkm::filter::Result CrossProduct::DoExecute(
return vtkm::filter::Result();
}
vtkm::worklet::DispatcherMapField<vtkm::worklet::CrossProduct, DeviceAdapter> dispatcher;
dispatcher.Invoke(field, secondaryField, outArray);
return vtkm::filter::Result(inDataSet,

@ -36,7 +36,21 @@ public:
DotProduct();
VTKM_CONT
void SetSecondaryFieldName(const std::string& nm) { SecondaryFieldName = nm; }
void SetPrimaryField(
const std::string& name,
vtkm::cont::Field::AssociationEnum association = vtkm::cont::Field::ASSOC_ANY)
{
this->SetActiveField(name, association);
}
VTKM_CONT
void SetSecondaryField(
const std::string& name,
vtkm::cont::Field::AssociationEnum association = vtkm::cont::Field::ASSOC_ANY)
{
this->SecondaryFieldName = name;
this->SecondaryFieldAssociation = association;
}
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
VTKM_CONT vtkm::filter::Result DoExecute(
@ -54,8 +68,8 @@ public:
DeviceAdapter tag);
private:
vtkm::worklet::DotProduct Worklet;
std::string SecondaryFieldName;
vtkm::cont::Field::AssociationEnum SecondaryFieldAssociation;
};
template <>

@ -28,8 +28,8 @@ namespace filter
//-----------------------------------------------------------------------------
inline VTKM_CONT DotProduct::DotProduct()
: vtkm::filter::FilterField<DotProduct>()
, Worklet()
, SecondaryFieldName("")
, SecondaryFieldName()
, SecondaryFieldAssociation(vtkm::cont::Field::ASSOC_ANY)
{
this->SetOutputFieldName("crossproduct");
}
@ -45,14 +45,14 @@ inline VTKM_CONT vtkm::filter::Result DotProduct::DoExecute(
{
vtkm::cont::ArrayHandle<T> outArray;
vtkm::worklet::DispatcherMapField<vtkm::worklet::DotProduct, DeviceAdapter> dispatcher(
this->Worklet);
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>> secondaryField;
try
{
using Traits = vtkm::filter::FilterTraits<DotProduct>;
vtkm::filter::ApplyPolicy(inDataSet.GetField(SecondaryFieldName), policy, Traits())
vtkm::filter::ApplyPolicy(
inDataSet.GetField(this->SecondaryFieldName, this->SecondaryFieldAssociation),
policy,
Traits())
.CopyTo(secondaryField);
}
catch (const vtkm::cont::Error&)
@ -60,6 +60,7 @@ inline VTKM_CONT vtkm::filter::Result DotProduct::DoExecute(
return vtkm::filter::Result();
}
vtkm::worklet::DispatcherMapField<vtkm::worklet::DotProduct, DeviceAdapter> dispatcher;
dispatcher.Invoke(field, secondaryField, outArray);
return vtkm::filter::Result(inDataSet,

@ -92,6 +92,8 @@ void TestCrossProduct()
const int numCases = 7;
for (int i = 0; i < numCases; i++)
{
std::cout << "Case " << i << std::endl;
vtkm::cont::DataSet dataSet = testDataSet.Make3DUniformDataSet0();
vtkm::Id nVerts = dataSet.GetCoordinateSystem(0).GetData().GetNumberOfValues();
@ -106,8 +108,8 @@ void TestCrossProduct()
vtkm::cont::DataSetFieldAdd::AddPointField(dataSet, "vec2", field2);
vtkm::filter::CrossProduct filter;
filter.SetSecondaryFieldName("vec2");
filter.SetActiveField("vec1");
filter.SetPrimaryField("vec1");
filter.SetSecondaryField("vec2");
vtkm::cont::DataSet result = filter.Execute(dataSet);
VTKM_TEST_ASSERT(result.HasField("crossproduct", vtkm::cont::Field::ASSOC_POINTS),

@ -92,6 +92,8 @@ void TestDotProduct()
const int numCases = 7;
for (int i = 0; i < numCases; i++)
{
std::cout << "Case " << i << std::endl;
vtkm::cont::DataSet dataSet = testDataSet.Make3DUniformDataSet0();
vtkm::Id nVerts = dataSet.GetCoordinateSystem(0).GetData().GetNumberOfValues();
@ -106,8 +108,8 @@ void TestDotProduct()
vtkm::cont::DataSetFieldAdd::AddPointField(dataSet, "vec2", field2);
vtkm::filter::DotProduct filter;
filter.SetActiveField("vec1");
filter.SetSecondaryFieldName("vec2");
filter.SetPrimaryField("vec1");
filter.SetSecondaryField("vec2");
vtkm::cont::DataSet result = filter.Execute(dataSet);
VTKM_TEST_ASSERT(result.HasField("crossproduct", vtkm::cont::Field::ASSOC_POINTS),