Add full support for dynamic array handles to Topology test worklets.
Currently the topology test worklets only worked for Float32, and produced warnings when generating the Float64 code paths, this solves this problem.
This commit is contained in:
parent
95f58564c9
commit
ae9914e9c8
@ -34,72 +34,89 @@ namespace test {
|
||||
|
||||
class MaxNodeOrCellValue : public vtkm::worklet::WorkletMapTopology
|
||||
{
|
||||
static const int LEN_IDS = 6;
|
||||
static const int LEN_IDS = 8;
|
||||
public:
|
||||
typedef void ControlSignature(FieldDestIn<Scalar> inCells,
|
||||
FieldSrcIn<Scalar> inNodes,
|
||||
TopologyIn<LEN_IDS> topology,
|
||||
FieldDestOut<Scalar> outCells);
|
||||
//Todo: we need a way to mark what control signature item each execution signature for topology comes from
|
||||
typedef _4 ExecutionSignature(_1, _2, vtkm::exec::arg::TopologyIdCount, vtkm::exec::arg::TopologyElementType, vtkm::exec::arg::TopologyIdSet);
|
||||
typedef void ExecutionSignature(_1, _4, _2,
|
||||
vtkm::exec::arg::TopologyIdCount,
|
||||
vtkm::exec::arg::TopologyElementType,
|
||||
vtkm::exec::arg::TopologyIdSet);
|
||||
typedef _3 InputDomain;
|
||||
|
||||
VTKM_CONT_EXPORT
|
||||
MaxNodeOrCellValue() { };
|
||||
|
||||
template<typename T>
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Float32 operator()(const vtkm::Float32 &cellval,
|
||||
const vtkm::exec::TopologyData<vtkm::Float32,LEN_IDS> &nodevals,
|
||||
const vtkm::Id &count,
|
||||
const vtkm::Id & vtkmNotUsed(type),
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> & vtkmNotUsed(nodeIDs)) const
|
||||
void operator()(const T &cellval,
|
||||
T& max_value,
|
||||
const vtkm::exec::TopologyData<T,LEN_IDS> &nodevals,
|
||||
const vtkm::Id &count,
|
||||
const vtkm::Id & vtkmNotUsed(type),
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> & vtkmNotUsed(nodeIDs)) const
|
||||
{
|
||||
//simple functor that returns the max of CellValue and nodeValue
|
||||
vtkm::Float32 max_value = cellval;
|
||||
max_value = cellval;
|
||||
for (vtkm::Id i=0; i<count; ++i)
|
||||
{
|
||||
max_value = nodevals[i] > max_value ? nodevals[i] : max_value;
|
||||
}
|
||||
return max_value;
|
||||
}
|
||||
|
||||
template<typename T1, typename T2, typename T3>
|
||||
VTKM_EXEC_EXPORT
|
||||
void operator()(const T1 &,
|
||||
T2 &,
|
||||
const vtkm::exec::TopologyData<T3,LEN_IDS> &,
|
||||
const vtkm::Id &,
|
||||
const vtkm::Id &,
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> &) const
|
||||
{
|
||||
this->RaiseError("Cannot call this worklet with different types.");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class AvgNodeToCellValue : public vtkm::worklet::WorkletMapTopology
|
||||
{
|
||||
static const int LEN_IDS = 98;
|
||||
static const int LEN_IDS = 8;
|
||||
public:
|
||||
typedef void ControlSignature(FieldSrcIn<Scalar> inNodes,
|
||||
TopologyIn<LEN_IDS> topology,
|
||||
FieldDestOut<Scalar> outCells);
|
||||
//Todo: we need a way to mark what control signature item each execution signature for topology comes from
|
||||
typedef _3 ExecutionSignature(_1,
|
||||
vtkm::exec::arg::TopologyIdCount,
|
||||
vtkm::exec::arg::TopologyElementType,
|
||||
vtkm::exec::arg::TopologyIdSet);
|
||||
typedef void ExecutionSignature(_1,
|
||||
_3,
|
||||
vtkm::exec::arg::TopologyIdCount);
|
||||
typedef _2 InputDomain;
|
||||
|
||||
VTKM_CONT_EXPORT
|
||||
AvgNodeToCellValue() { };
|
||||
|
||||
template<typename T>
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Float32 operator()(const vtkm::exec::TopologyData<vtkm::Float32,LEN_IDS> &nodevals,
|
||||
const vtkm::Id &count,
|
||||
const vtkm::Id & vtkmNotUsed(type),
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> & vtkmNotUsed(nodeIDs) ) const
|
||||
void operator()(const vtkm::exec::TopologyData<T,LEN_IDS> &nodevals,
|
||||
T& avgVal,
|
||||
const vtkm::Id &count) const
|
||||
{
|
||||
//simple functor that returns the average nodeValue.
|
||||
vtkm::Float32 avgVal = 0.0;
|
||||
|
||||
for (vtkm::Id i=0; i<count; ++i)
|
||||
avgVal = nodevals[0];
|
||||
for (vtkm::Id i=1; i<count; ++i)
|
||||
{
|
||||
avgVal += nodevals[i];
|
||||
// std::cout << i << " " << nodevals[i] << std::endl;
|
||||
}
|
||||
// std::cout << "avgVal: " << avgVal << std::endl;
|
||||
// std::cout << "avgVal: " << (avgVal / count) << std::endl;
|
||||
return avgVal / count;
|
||||
avgVal = avgVal / count;
|
||||
}
|
||||
|
||||
template<typename T1, typename T2>
|
||||
VTKM_EXEC_EXPORT
|
||||
void operator()(const T1 &, T2 &, const vtkm::Id &) const
|
||||
{
|
||||
this->RaiseError("Cannot call this worklet with different types.");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
TopologyIn<LEN_IDS> topology,
|
||||
FieldDestOut<Scalar> outCells);
|
||||
//Todo: we need a way to mark what control signature item each execution signature for topology comes from
|
||||
typedef _4 ExecutionSignature(_1, _2,
|
||||
typedef void ExecutionSignature(_1, _4, _2,
|
||||
vtkm::exec::arg::TopologyIdCount,
|
||||
vtkm::exec::arg::TopologyElementType,
|
||||
vtkm::exec::arg::TopologyIdSet);
|
||||
@ -51,23 +51,37 @@ public:
|
||||
VTKM_CONT_EXPORT
|
||||
MaxNodeOrCellValue() { };
|
||||
|
||||
template<typename T>
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Float32 operator()(const vtkm::Float32 &cellval,
|
||||
const vtkm::exec::TopologyData<vtkm::Float32,LEN_IDS> &nodevals,
|
||||
const vtkm::Id &count,
|
||||
const vtkm::Id & vtkmNotUsed(type),
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> & vtkmNotUsed(nodeIDs)) const
|
||||
void operator()(const T &cellval,
|
||||
T& max_value,
|
||||
const vtkm::exec::TopologyData<T,LEN_IDS> &nodevals,
|
||||
const vtkm::Id &count,
|
||||
const vtkm::Id & vtkmNotUsed(type),
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> & vtkmNotUsed(nodeIDs)) const
|
||||
{
|
||||
//simple functor that returns the max of CellValue and nodeValue
|
||||
vtkm::Float32 max_value = cellval;
|
||||
max_value = cellval;
|
||||
for (vtkm::Id i=0; i<count; ++i)
|
||||
max_value = nodevals[i] > max_value ? nodevals[i] : max_value;
|
||||
return max_value;
|
||||
{
|
||||
max_value = nodevals[i] > max_value ? nodevals[i] : max_value;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T1, typename T2, typename T3>
|
||||
VTKM_EXEC_EXPORT
|
||||
void operator()(const T1 &,
|
||||
T2 &,
|
||||
const vtkm::exec::TopologyData<T3,LEN_IDS> &,
|
||||
const vtkm::Id &,
|
||||
const vtkm::Id &,
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> &) const
|
||||
{
|
||||
this->RaiseError("Cannot call this worklet with different types.");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class AvgNodeToCellValue : public vtkm::worklet::WorkletMapTopology
|
||||
{
|
||||
static const int LEN_IDS = 4;
|
||||
@ -75,30 +89,36 @@ public:
|
||||
typedef void ControlSignature(FieldSrcIn<Scalar> inNodes,
|
||||
TopologyIn<LEN_IDS> topology,
|
||||
FieldDestOut<Scalar> outCells);
|
||||
//Todo: we need a way to mark what control signature item each execution signature for topology comes from
|
||||
typedef _3 ExecutionSignature(_1,
|
||||
vtkm::exec::arg::TopologyIdCount,
|
||||
vtkm::exec::arg::TopologyElementType,
|
||||
vtkm::exec::arg::TopologyIdSet);
|
||||
typedef void ExecutionSignature(_1,
|
||||
_3,
|
||||
vtkm::exec::arg::TopologyIdCount);
|
||||
typedef _2 InputDomain;
|
||||
|
||||
VTKM_CONT_EXPORT
|
||||
AvgNodeToCellValue() { };
|
||||
|
||||
template<typename T>
|
||||
VTKM_EXEC_EXPORT
|
||||
vtkm::Float32 operator()(const vtkm::exec::TopologyData<vtkm::Float32,LEN_IDS> &nodevals,
|
||||
const vtkm::Id &count,
|
||||
const vtkm::Id & vtkmNotUsed(type),
|
||||
const vtkm::exec::TopologyData<vtkm::Id,LEN_IDS> & vtkmNotUsed(nodeIDs)) const
|
||||
void operator()(const vtkm::exec::TopologyData<T,LEN_IDS> &nodevals,
|
||||
T& avgVal,
|
||||
const vtkm::Id &count) const
|
||||
{
|
||||
//simple functor that returns the average nodeValue.
|
||||
vtkm::Float32 avgVal = 0.0;
|
||||
for (vtkm::Id i=0; i<count; ++i)
|
||||
avgVal += nodevals[i];
|
||||
|
||||
avgVal /= count;
|
||||
return avgVal;
|
||||
//simple functor that returns the average nodeValue.
|
||||
avgVal = nodevals[0];
|
||||
for (vtkm::Id i=1; i<count; ++i)
|
||||
{
|
||||
avgVal += nodevals[i];
|
||||
}
|
||||
avgVal = avgVal / count;
|
||||
}
|
||||
|
||||
template<typename T1, typename T2>
|
||||
VTKM_EXEC_EXPORT
|
||||
void operator()(const T1 &, T2 &, const vtkm::Id &) const
|
||||
{
|
||||
this->RaiseError("Cannot call this worklet with different types.");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user