work in progress for filter tables

This commit is contained in:
Samuel Li 2016-07-06 18:37:11 -06:00
parent 9c1e9574fa
commit f785fcb18f
2 changed files with 57 additions and 15 deletions

@ -28,19 +28,50 @@
namespace vtkm { namespace vtkm {
namespace worklet { namespace worklet {
namespace internal{
const vtkm::Float64 hm4_44[9] = {
0.037828455507264,
-0.023849465019557,
-0.110624404418437,
0.377402855612831,
0.852698679008894,
0.377402855612831,
-0.110624404418437,
-0.023849465019557,
0.037828455507264
};
const vtkm::Float64 h4[9] = {
0.0,
-0.064538882628697,
-0.040689417609164,
0.418092273221617,
0.788485616405583,
0.418092273221617,
-0.0406894176091641,
-0.0645388826286971,
0.0
};
}
class Wavelets class Wavelets
{ {
public: public:
// helper worklet // helper worklet
class ForwardTransform: public vtkm::worklet::WorkletMapField class ForwardTransform: public vtkm::worklet::WorkletMapField
{ {
public: public:
typedef void ControlSignature(WholeArrayIn<ScalarAll>, // sigIn typedef void ControlSignature(WholeArrayIn<ScalarAll>, // sigIn
FieldOut<ScalarAll>, // cA WholeArrayIn<vtkm::Float64>, // lowFilter
FieldOut<ScalarAll>); // cD WholeArrayIn<vtkm::Float64>, // highFilter
typedef void ExecutionSignature(_1, _2, _3, WorkIndex); FieldOut<ScalarAll>); // cA in even indices, cD in odd indices
typedef void ExecutionSignature(_1, _2, _3, _4, WorkIndex);
typedef _1 InputDomain; typedef _1 InputDomain;
typedef vtkm::Float64 FLOAT;
// ForwardTransform constructor // ForwardTransform constructor
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
ForwardTransform() ForwardTransform()
@ -51,16 +82,25 @@ public:
} }
template <typename T, typename ArrayPortalType> template <typename InputSignalPortalType,
typename FilterPortalType,
typename OutputCoeffType>
VTKM_EXEC_EXPORT VTKM_EXEC_EXPORT
void operator()(const ArrayPortalType &signalIn, void operator()(const InputSignalPortalType &signalIn,
T &coeffApproximation, const FilterPortalType &lowFilter,
T &coeffDetail, const FilterPortalType &highFilter,
OutputCoeffType &coeffOut,
const vtkm::Id &workIndex) const const vtkm::Id &workIndex) const
{ {
vtkm::Float64 tmp = static_cast<vtkm::Float64>(signalIn.Get(workIndex)); FLOAT tmp = static_cast<FLOAT>(signalIn.Get(workIndex));
coeffApproximation = static_cast<T>( tmp / 2.0 ); if( workIndex % 2 == 0 ) // work on cA, approximate coeffs
coeffDetail = static_cast<T>( tmp * 2.0 ); {
coeffOut = static_cast<OutputCoeffType>( tmpi + lowFilter.Get(0) );
}
else // work on cD, detail coeffs
{
coeffOut = static_cast<OutputCoeffType>( tmp + highFilter.Get(0) );
}
} }
private: private:

@ -33,26 +33,28 @@ void TestWavelets()
vtkm::Id arraySize = 10; vtkm::Id arraySize = 10;
std::vector<vtkm::Float32> tmpVector; std::vector<vtkm::Float32> tmpVector;
for( vtkm::Id i = 0; i < arraySize; i++ ) for( vtkm::Id i = 0; i < arraySize; i++ )
tmpVector.push_back(static_cast<vtkm::Float32>(i*2)); tmpVector.push_back(static_cast<vtkm::Float32>(i));
vtkm::cont::ArrayHandle<vtkm::Float32> input1DArray = vtkm::cont::ArrayHandle<vtkm::Float32> input1DArray =
vtkm::cont::make_ArrayHandle(tmpVector); vtkm::cont::make_ArrayHandle(tmpVector);
vtkm::cont::ArrayHandle<vtkm::Float32> outputArray1; vtkm::cont::ArrayHandle<vtkm::Float32> outputArray1;
/*
outputArray1.Allocate( arraySize ); outputArray1.Allocate( arraySize );
vtkm::cont::ArrayHandle<vtkm::Float32> outputArray2; vtkm::cont::ArrayHandle<vtkm::Float32> outputArray2;
outputArray2.Allocate( arraySize ); outputArray2.Allocate( arraySize );
*/
vtkm::worklet::Wavelets::ForwardTransform forwardTransform; vtkm::worklet::Wavelets::ForwardTransform forwardTransform;
vtkm::worklet::DispatcherMapField<vtkm::worklet::Wavelets::ForwardTransform> dispatcher(forwardTransform); vtkm::worklet::DispatcherMapField<vtkm::worklet::Wavelets::ForwardTransform> dispatcher(forwardTransform);
dispatcher.Invoke(input1DArray, outputArray1, outputArray2); dispatcher.Invoke(input1DArray, outputArray1);
std::cerr << "Invoke succeeded" << std::endl; std::cerr << "Invoke succeeded" << std::endl;
for (vtkm::Id i = 0; i < outputArray1.GetNumberOfValues(); ++i) for (vtkm::Id i = 0; i < outputArray1.GetNumberOfValues(); ++i)
{ {
std::cout<< outputArray1.GetPortalConstControl().Get(i) << ", " std::cout<< outputArray1.GetPortalConstControl().Get(i) << std::endl;
<< outputArray2.GetPortalConstControl().Get(i) << std::endl; // << outputArray2.GetPortalConstControl().Get(i) << std::endl;
// VTKM_TEST_ASSERT( // VTKM_TEST_ASSERT(
// test_equal( output1DArray.GetPortalConstControl().Get(i), // test_equal( output1DArray.GetPortalConstControl().Get(i),
// static_cast<vtkm::Float32>(i) * 2.0f ), // static_cast<vtkm::Float32>(i) * 2.0f ),