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:
parent
f359f6f15f
commit
707eccd3d5
@ -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),
|
||||
|
Loading…
Reference in New Issue
Block a user