Switch filter::threshold over to have a lower and upper bounds.

This commit is contained in:
Robert Maynard 2016-02-15 11:49:48 -05:00
parent bcee827097
commit 8e72ec8ea4
3 changed files with 30 additions and 15 deletions

@ -34,10 +34,14 @@ public:
Threshold(); Threshold();
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
void SetThresholdValue(vtkm::Float64 value){ this->ThresholdValue = value; } void SetLowerThreshold(vtkm::Float64 value){ this->LowerValue = value; }
VTKM_CONT_EXPORT
void SetUpperThreshold(vtkm::Float64 value){ this->UpperValue = value; }
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
vtkm::Float64 GetThresholdValue() const { return this->ThresholdValue; } vtkm::Float64 GetLowerThreshold() const { return this->LowerValue; }
VTKM_CONT_EXPORT
vtkm::Float64 GetUpperThreshold() const { return this->UpperValue; }
template<typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter> template<typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
@ -59,7 +63,8 @@ public:
private: private:
double ThresholdValue; double LowerValue;
double UpperValue;
vtkm::cont::ArrayHandle<vtkm::Id> ValidCellIds; vtkm::cont::ArrayHandle<vtkm::Id> ValidCellIds;
}; };

@ -27,22 +27,27 @@
namespace namespace
{ {
class HasValue class ThresholdRange
{ {
public: public:
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
HasValue(const vtkm::Float64& value) : Value(value) ThresholdRange(const vtkm::Float64& lower,
const vtkm::Float64& upper) :
Lower(lower),
Upper(upper)
{ } { }
template<typename T> template<typename T>
VTKM_EXEC_EXPORT VTKM_EXEC_EXPORT
bool operator()(const T& value) const bool operator()(const T& value) const
{ {
return value == static_cast<T>(this->Value); return value >= static_cast<T>(this->Lower) &&
value <= static_cast<T>(this->Upper);
} }
private: private:
vtkm::Float64 Value; vtkm::Float64 Lower;
vtkm::Float64 Upper;
}; };
class AddPermutationCellSet class AddPermutationCellSet
@ -79,7 +84,8 @@ namespace filter {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Threshold::Threshold(): Threshold::Threshold():
vtkm::filter::DataSetWithFieldFilter<Threshold>(), vtkm::filter::DataSetWithFieldFilter<Threshold>(),
ThresholdValue(0), LowerValue(0),
UpperValue(0),
ValidCellIds() ValidCellIds()
{ {
@ -100,12 +106,12 @@ vtkm::filter::DataSetResult Threshold::DoExecute(const vtkm::cont::DataSet& inpu
const vtkm::cont::DynamicCellSet& cells = const vtkm::cont::DynamicCellSet& cells =
input.GetCellSet(this->GetActiveCellSetIndex()); input.GetCellSet(this->GetActiveCellSetIndex());
HasValue predicate( this->GetThresholdValue() ); ThresholdRange predicate( this->GetLowerThreshold(), this->GetUpperThreshold() );
vtkm::cont::ArrayHandle<bool> passFlags; vtkm::cont::ArrayHandle<bool> passFlags;
if(fieldMeta.IsPointField()) if(fieldMeta.IsPointField())
{ {
typedef vtkm::worklet::Threshold Worklets; typedef vtkm::worklet::Threshold Worklets;
typedef Worklets::ThresholdByPointField< HasValue > ThresholdWorklet; typedef Worklets::ThresholdByPointField< ThresholdRange > ThresholdWorklet;
ThresholdWorklet worklet(predicate); ThresholdWorklet worklet(predicate);
vtkm::worklet::DispatcherMapTopology<ThresholdWorklet, DeviceAdapter> dispatcher(worklet); vtkm::worklet::DispatcherMapTopology<ThresholdWorklet, DeviceAdapter> dispatcher(worklet);
dispatcher.Invoke(vtkm::filter::Convert(cells, policy), field, passFlags); dispatcher.Invoke(vtkm::filter::Convert(cells, policy), field, passFlags);
@ -113,7 +119,7 @@ vtkm::filter::DataSetResult Threshold::DoExecute(const vtkm::cont::DataSet& inpu
else if(fieldMeta.IsCellField()) else if(fieldMeta.IsCellField())
{ {
typedef vtkm::worklet::Threshold Worklets; typedef vtkm::worklet::Threshold Worklets;
typedef Worklets::ThresholdByCellField< HasValue > ThresholdWorklet; typedef Worklets::ThresholdByCellField< ThresholdRange > ThresholdWorklet;
ThresholdWorklet worklet(predicate); ThresholdWorklet worklet(predicate);
vtkm::worklet::DispatcherMapTopology<ThresholdWorklet, DeviceAdapter> dispatcher(worklet); vtkm::worklet::DispatcherMapTopology<ThresholdWorklet, DeviceAdapter> dispatcher(worklet);
dispatcher.Invoke(vtkm::filter::Convert(cells, policy), field, passFlags); dispatcher.Invoke(vtkm::filter::Convert(cells, policy), field, passFlags);

@ -40,7 +40,8 @@ public:
vtkm::filter::Threshold threshold; vtkm::filter::Threshold threshold;
vtkm::filter::DataSetResult result; vtkm::filter::DataSetResult result;
threshold.SetThresholdValue(60.1); threshold.SetLowerThreshold(60.1);
threshold.SetUpperThreshold(60.1);
result = threshold.Execute(dataset, dataset.GetField("pointvar")); result = threshold.Execute(dataset, dataset.GetField("pointvar"));
threshold.MapFieldOntoOutput(result, dataset.GetField("cellvar") ); threshold.MapFieldOntoOutput(result, dataset.GetField("cellvar") );
@ -69,7 +70,8 @@ public:
vtkm::filter::Threshold threshold; vtkm::filter::Threshold threshold;
vtkm::filter::DataSetResult result; vtkm::filter::DataSetResult result;
threshold.SetThresholdValue(20.1); threshold.SetLowerThreshold(20.1);
threshold.SetUpperThreshold(20.1);
result = threshold.Execute(dataset, std::string("pointvar")); result = threshold.Execute(dataset, std::string("pointvar"));
threshold.MapFieldOntoOutput(result, dataset.GetField("cellvar") ); threshold.MapFieldOntoOutput(result, dataset.GetField("cellvar") );
@ -99,7 +101,8 @@ public:
vtkm::filter::Threshold threshold; vtkm::filter::Threshold threshold;
vtkm::filter::DataSetResult result; vtkm::filter::DataSetResult result;
threshold.SetThresholdValue(20.1); threshold.SetLowerThreshold(20.1);
threshold.SetUpperThreshold(20.1);
result = threshold.Execute(dataset, std::string("pointvar")); result = threshold.Execute(dataset, std::string("pointvar"));
threshold.MapFieldOntoOutput(result, dataset.GetField("cellvar") ); threshold.MapFieldOntoOutput(result, dataset.GetField("cellvar") );
@ -129,7 +132,8 @@ public:
vtkm::filter::Threshold threshold; vtkm::filter::Threshold threshold;
vtkm::filter::DataSetResult result; vtkm::filter::DataSetResult result;
threshold.SetThresholdValue(500.1); threshold.SetLowerThreshold(500.1);
threshold.SetUpperThreshold(500.1);
result = threshold.Execute(dataset, std::string("pointvar")); result = threshold.Execute(dataset, std::string("pointvar"));
VTKM_TEST_ASSERT(result.IsValid(), "threshold algorithm should return true"); VTKM_TEST_ASSERT(result.IsValid(), "threshold algorithm should return true");