fix bug on operating on 32bit float

This commit is contained in:
Samuel Li 2017-02-24 16:40:14 -07:00
parent 0c260370c5
commit 4d22303c6b
2 changed files with 12 additions and 14 deletions

@ -97,6 +97,7 @@ private: // see wikipedia page
vtkm::Float64 sigmaX2, sigmaY2; // 2 * sigma * sigma vtkm::Float64 sigmaX2, sigmaY2; // 2 * sigma * sigma
}; };
template< typename T>
class GaussianWorklet3D : public vtkm::worklet::WorkletMapField class GaussianWorklet3D : public vtkm::worklet::WorkletMapField
{ {
public: public:
@ -117,26 +118,23 @@ public:
} }
VTKM_EXEC VTKM_EXEC
vtkm::Float64 GetGaussian( vtkm::Float64 x, vtkm::Float64 y, vtkm::Float64 z ) const T GetGaussian( T x, T y, T z ) const
{ {
return 0.0; // need to be filled return 0.0; // need to be filled
} }
VTKM_EXEC VTKM_EXEC
vtkm::Float64 GetToyVal( vtkm::Float64 x, vtkm::Float64 y, vtkm::Float64 z ) const T GetToyVal( T x, T y, T z ) const
{ {
return x * 100 + y * 10 + z; // 3-digit xyz when all x, y, z are between 0 and 9 return x * 100 + y * 10 + z; // 3-digit xyz when all x, y, z are between 0 and 9
} }
template<typename T>
VTKM_EXEC VTKM_EXEC
void operator()(T& val, const vtkm::Id& workIdx) const void operator()(T& val, const vtkm::Id& workIdx) const
{ {
vtkm::Id x, y, z; vtkm::Id x, y, z;
Sig1Dto3D( workIdx, x, y, z ); Sig1Dto3D( workIdx, x, y, z );
val = GetToyVal( static_cast<vtkm::Float64>(x), val = GetToyVal( x, y, z );
static_cast<vtkm::Float64>(y),
static_cast<vtkm::Float64>(z) );
} }
private: private:
@ -172,7 +170,7 @@ void FillArray2D( ArrayType& array, vtkm::Id dimX, vtkm::Id dimY )
template< typename ArrayType > template< typename ArrayType >
void FillArray3D( ArrayType& array, vtkm::Id dimX, vtkm::Id dimY, vtkm::Id dimZ ) void FillArray3D( ArrayType& array, vtkm::Id dimX, vtkm::Id dimY, vtkm::Id dimZ )
{ {
typedef vtkm::worklet::wavelets::GaussianWorklet3D WorkletType; typedef vtkm::worklet::wavelets::GaussianWorklet3D< typename ArrayType::ValueType> WorkletType;
WorkletType worklet( dimX, dimY, dimZ ); WorkletType worklet( dimX, dimY, dimZ );
vtkm::worklet::DispatcherMapField< WorkletType > dispatcher( worklet ); vtkm::worklet::DispatcherMapField< WorkletType > dispatcher( worklet );
dispatcher.Invoke( array ); dispatcher.Invoke( array );
@ -183,17 +181,17 @@ void FillArray3D( ArrayType& array, vtkm::Id dimX, vtkm::Id dimY, vtkm::Id dimZ
void TestDecomposeReconstruct3D() void TestDecomposeReconstruct3D()
{ {
std::cout << "Testing 3D wavelet compressor on a 10x10x10 cube: " << std::endl; std::cout << "Testing 3D wavelet compressor on a 10x10x10 cube: " << std::endl;
vtkm::Id sigX = 10; vtkm::Id sigX = 1024;
vtkm::Id sigY = 10; vtkm::Id sigY = 1024;
vtkm::Id sigZ = 10; vtkm::Id sigZ = 1024;
vtkm::Id sigLen = sigX * sigY * sigZ; vtkm::Id sigLen = sigX * sigY * sigZ;
// make input data array handle // make input data array handle
vtkm::cont::ArrayHandle<vtkm::Float64> inputArray; vtkm::cont::ArrayHandle<vtkm::Float32> inputArray;
inputArray.PrepareForOutput( sigLen, VTKM_DEFAULT_DEVICE_ADAPTER_TAG() ); inputArray.PrepareForOutput( sigLen, VTKM_DEFAULT_DEVICE_ADAPTER_TAG() );
FillArray3D( inputArray, sigX, sigY, sigZ ); FillArray3D( inputArray, sigX, sigY, sigZ );
vtkm::cont::ArrayHandle<vtkm::Float64> outputArray; vtkm::cont::ArrayHandle<vtkm::Float32> outputArray;
// Use a WaveletCompressor // Use a WaveletCompressor
vtkm::worklet::wavelets::WaveletName wname = vtkm::worklet::wavelets::CDF9_7; vtkm::worklet::wavelets::WaveletName wname = vtkm::worklet::wavelets::CDF9_7;
@ -229,7 +227,7 @@ void TestDecomposeReconstruct3D()
//std::cout << "Squash time = " << elapsedTime2 << std::endl; //std::cout << "Squash time = " << elapsedTime2 << std::endl;
// Reconstruct // Reconstruct
vtkm::cont::ArrayHandle<vtkm::Float64> reconstructArray; vtkm::cont::ArrayHandle<vtkm::Float32> reconstructArray;
//timer.Reset(); //timer.Reset();
//computationTime = //computationTime =
compressor.WaveReconstruct3D( outputArray, nLevels, sigX, sigY, sigZ, reconstructArray, L, compressor.WaveReconstruct3D( outputArray, nLevels, sigX, sigY, sigZ, reconstructArray, L,

@ -227,7 +227,7 @@ public:
typename ArrayType::ValueType DeviceSum( const ArrayType &array, DeviceTag ) typename ArrayType::ValueType DeviceSum( const ArrayType &array, DeviceTag )
{ {
return vtkm::cont::DeviceAdapterAlgorithm< DeviceTag >::Reduce return vtkm::cont::DeviceAdapterAlgorithm< DeviceTag >::Reduce
( array, 0.0 ); ( array, static_cast<typename ArrayType::ValueType>(0.0) );
} }