Extend2D passes initial test, need to test more.

This commit is contained in:
Samuel Li 2016-08-26 14:51:23 -06:00
parent b988591be5
commit 858895d3c8
3 changed files with 109 additions and 118 deletions

@ -68,27 +68,32 @@ void Debug2DExtend()
vtkm::Id NX = 5;
vtkm::Id NY = 4;
typedef vtkm::cont::ArrayHandleInterpreter< vtkm::Id > ArrayInterp;
ArrayInterp left, right;
ArrayInterp left, center, right;
left.PrepareForOutput( NX * NY, VTKM_DEFAULT_DEVICE_ADAPTER_TAG() );
left.InterpretAs2D( NX, NY );
right.PrepareForOutput( 2*NX * NY, VTKM_DEFAULT_DEVICE_ADAPTER_TAG() );
right.InterpretAs2D( 2*NX, NY );
right.PrepareForOutput( NX * NY, VTKM_DEFAULT_DEVICE_ADAPTER_TAG() );
right.InterpretAs2D( NX, NY );
center.PrepareForOutput( 2*NX * NY, VTKM_DEFAULT_DEVICE_ADAPTER_TAG() );
center.InterpretAs2D( 2*NX, NY );
for( vtkm::Id i = 0; i < 2*NX*NY; i++ )
right.GetPortalControl().Set(i, i);
typedef vtkm::worklet::wavelets::LeftSYMHExtentionWorklet2D LeftSYMH2D;
LeftSYMH2D worklet( NX, NY, 2*NX, NY);
vtkm::worklet::DispatcherMapField< LeftSYMH2D, VTKM_DEFAULT_DEVICE_ADAPTER_TAG>
dispatcher( worklet );
dispatcher.Invoke( left, right );
center.GetPortalControl().Set(i, i);
typedef vtkm::cont::ArrayHandleConcatenate2DLeftRight< ArrayInterp, ArrayInterp >
ConcatLR;
ConcatLR concatLR( left, right );
for( vtkm::Id j = 0; j < concatLR.GetDimY(); j++ )
ConcatLeftOn;
typedef vtkm::cont::ArrayHandleConcatenate2DLeftRight< ConcatLeftOn, ArrayInterp >
ConcatRightOn;
ConcatRightOn output;
vtkm::worklet::wavelets::WaveletDWT dwt( vtkm::worklet::wavelets::CDF9_7 );
vtkm::worklet::wavelets::DWTMode leftMode = vtkm::worklet::wavelets::SYMH;
vtkm::worklet::wavelets::DWTMode rightMode = vtkm::worklet::wavelets::SYMH;
dwt.Extend2D( center, output, 4, leftMode, rightMode, false, false,
VTKM_DEFAULT_DEVICE_ADAPTER_TAG() );
for( vtkm::Id j = 0; j < output.GetDimY(); j++ )
{
for( vtkm::Id i = 0; i < concatLR.GetDimX(); i++ )
std::cout << concatLR.Get2D( i, j ) << "\t";
for( vtkm::Id i = 0; i < output.GetDimX(); i++ )
std::cout << output.Get2D( i, j ) << " \t";
std::cout << std::endl;
}
}

@ -29,6 +29,8 @@
#include <vtkm/cont/ArrayHandleConcatenate.h>
#include <vtkm/cont/ArrayHandleCounting.h>
#include <vtkm/cont/ArrayHandlePermutation.h>
#include <vtkm/cont/ArrayHandleInterpreter.h>
#include <vtkm/cont/ArrayHandleConcatenate2DLeftRight.h>
#include <vtkm/Math.h>
#include <vtkm/cont/Timer.h>
@ -47,7 +49,6 @@ public:
typedef vtkm::Float64 FLOAT_64;
// Func: Extend 2D signal
#if 0
template< typename SigInArrayType, typename SigExtendedArrayType, typename DeviceTag >
vtkm::Id Extend2D( const SigInArrayType &sigIn, // Input
SigExtendedArrayType &sigOut, // Output
@ -61,116 +62,53 @@ public:
// "right extension" can be attached a zero on either end, but not both ends.
VTKM_ASSERT( !attachZeroRightRight || !attachZeroRightLeft );
vtkm::Id sigInDimX = sigIn.GetDimX();
vtkm::Id sigInDimY = sigIn.GetDimY();
vtkm::Id extendDimX = addLen;
vtkm::Id extendDimY = sigInDimY;
vtkm::Id sigDimX = sigIn.GetDimX();
vtkm::Id sigDimY = sigIn.GetDimY();
vtkm::Id extDimX = addLen;
vtkm::Id extDimY = sigDimY;
typedef typename SigInArrayType::ValueType ValueType;
typedef vtkm::cont::ArrayHandleInterpreter< ValueType > ExtendArrayType;
typedef vtkm::cont::ArrayHandleInterpreter< ValueType > ExtendArrayType;
// Work on left extension
ExtendArrayType leftExtend;
leftExtend.PrepareForOutput( extendDimX * extendDimY, DeviceTag() );
leftExtend.PrepareForOutput( extDimX * extDimY, DeviceTag() );
leftExtend.InterpretAs2D( extDimX, extDimY );
vtkm::Id sigInLen = sigIn.GetNumberOfValues();
typedef vtkm::worklet::wavelets::LeftSYMHExtentionWorklet LeftSYMH;
typedef vtkm::worklet::wavelets::LeftSYMWExtentionWorklet LeftSYMW;
typedef vtkm::worklet::wavelets::RightSYMHExtentionWorklet RightSYMH;
typedef vtkm::worklet::wavelets::RightSYMWExtentionWorklet RightSYMW;
typedef vtkm::worklet::wavelets::LeftASYMHExtentionWorklet LeftASYMH;
typedef vtkm::worklet::wavelets::LeftASYMWExtentionWorklet LeftASYMW;
typedef vtkm::worklet::wavelets::RightASYMHExtentionWorklet RightASYMH;
typedef vtkm::worklet::wavelets::RightASYMWExtentionWorklet RightASYMW;
switch( leftExtMethod )
{
case SYMH:
{
LeftSYMH worklet( addLen );
vtkm::worklet::DispatcherMapField< LeftSYMH, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( leftExtend, sigIn );
break;
}
case SYMW:
{
LeftSYMW worklet( addLen );
vtkm::worklet::DispatcherMapField< LeftSYMW, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( leftExtend, sigIn );
break;
}
case ASYMH:
{
LeftASYMH worklet( addLen );
vtkm::worklet::DispatcherMapField< LeftASYMH, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( leftExtend, sigIn );
break;
}
case ASYMW:
{
LeftASYMW worklet( addLen );
vtkm::worklet::DispatcherMapField< LeftASYMW, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( leftExtend, sigIn );
break;
}
default:
{
vtkm::cont::ErrorControlInternal("Left extension mode not supported!");
return 1;
}
}
typedef vtkm::worklet::wavelets::LeftExtentionWorklet2D LeftWorkletType;
LeftWorkletType leftWorklet( extDimX, extDimY, sigDimX, sigDimY, leftExtMethod );
vtkm::worklet::DispatcherMapField< LeftWorkletType, DeviceTag >
dispatcher( leftWorklet );
dispatcher.Invoke( leftExtend, sigIn );
// Work on right extension
ExtendArrayType rightExtend;
if( !attachZeroRightLeft ) // no attach zero, or only attach on RightRight
{
// Allocate memory
vtkm::Id extDimXToAlloc = extDimX;
if( attachZeroRightRight )
rightExtend.PrepareForOutput( addLen+1, DeviceTag() );
else
rightExtend.PrepareForOutput( addLen, DeviceTag() );
extDimXToAlloc++;
rightExtend.PrepareForOutput( extDimXToAlloc * extDimY, DeviceTag() );
rightExtend.InterpretAs2D( extDimXToAlloc, extDimY );
typedef vtkm::worklet::wavelets::RightExtentionWorklet2D RightWorkletType;
RightWorkletType rightWorklet( extDimX, extDimY, sigDimX, sigDimY, rightExtMethod );
vtkm::worklet::DispatcherMapField< RightWorkletType, DeviceTag >
dispatcher2( rightWorklet );
dispatcher2.Invoke( rightExtend, sigIn );
switch( rightExtMethod )
{
case SYMH:
{
RightSYMH worklet( sigInLen );
vtkm::worklet::DispatcherMapField< RightSYMH, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( rightExtend, sigIn );
break;
}
case SYMW:
{
RightSYMW worklet( sigInLen );
vtkm::worklet::DispatcherMapField< RightSYMW, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( rightExtend, sigIn );
break;
}
case ASYMH:
{
RightASYMH worklet( sigInLen );
vtkm::worklet::DispatcherMapField< RightASYMH, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( rightExtend, sigIn );
break;
}
case ASYMW:
{
RightASYMW worklet( sigInLen );
vtkm::worklet::DispatcherMapField< RightASYMW, DeviceTag > dispatcher( worklet );
dispatcher.Invoke( rightExtend, sigIn );
break;
}
default:
{
vtkm::cont::ErrorControlInternal("Right extension mode not supported!");
return 1;
}
}
if( attachZeroRightRight )
WaveletBase::DeviceAssignZero( rightExtend, addLen, DeviceTag() );
{
typedef vtkm::worklet::wavelets::AssignZero2DColumnWorklet AssignZero2DType;
AssignZero2DType zeroWorklet( extDimXToAlloc, extDimY, extDimXToAlloc-1 );
vtkm::worklet::DispatcherMapField< AssignZero2DType, DeviceTag >
dispatcher3( zeroWorklet );
dispatcher3.Invoke( rightExtend );
}
}
else // attachZeroRightLeft mode
{
#if 0
typedef vtkm::cont::ArrayHandleConcatenate<SigInArrayType, ExtendArrayType>
ConcatArray;
// attach a zero at the end of sigIn
@ -225,16 +163,31 @@ public:
WaveletBase::DeviceCopyStartX( rightExtend, rightExtendPlusOne, 1, DeviceTag() );
WaveletBase::DeviceAssignZero( rightExtendPlusOne, 0, DeviceTag() );
rightExtend = rightExtendPlusOne ;
#endif
}
typedef vtkm::cont::ArrayHandleConcatenate< ExtendArrayType, SigInArrayType>
typedef vtkm::cont::ArrayHandleConcatenate2DLeftRight< ExtendArrayType, SigInArrayType>
ArrayConcat;
ArrayConcat leftOn( leftExtend, sigIn );
sigOut = vtkm::cont::make_ArrayHandleConcatenate( leftOn, rightExtend );
typedef vtkm::cont::ArrayHandleConcatenate2DLeftRight< ArrayConcat, ExtendArrayType >
ArrayConcat2;
ArrayConcat2 rightOn( leftOn, rightExtend );
sigOut = rightOn;
sigOut.CopyDimInfo( rightOn );
std::cout << "leftExtend: " << std::endl;
leftExtend.PrintInfo();
std::cout << "rightExtend: " << std::endl;
rightExtend.PrintInfo();
std::cout << "leftOnExtend: " << std::endl;
leftOn.PrintInfo();
std::cout << "sigOutExtend: " << std::endl;
sigOut.PrintInfo();
return 0;
}
#endif
// Func: Extend 1D signal
template< typename SigInArrayType, typename SigExtendedArrayType, typename DeviceTag >

@ -800,10 +800,7 @@ public:
// Constructor
VTKM_EXEC_CONT_EXPORT
AssignZeroWorklet( vtkm::Id idx )
{
this->zeroIdx = idx;
}
AssignZeroWorklet( vtkm::Id idx ) : zeroIdx( idx ) { }
template< typename PortalType >
VTKM_EXEC_EXPORT
@ -819,6 +816,42 @@ private:
};
// Worklet
class AssignZero2DColumnWorklet : public vtkm::worklet::WorkletMapField
{
public:
typedef void ControlSignature( WholeArrayInOut< ScalarAll > );
typedef void ExecutionSignature( _1, WorkIndex );
// Constructor
VTKM_EXEC_CONT_EXPORT
AssignZero2DColumnWorklet( vtkm::Id x, vtkm::Id y, vtkm::Id idx )
: dimX( x ), dimY( y ), zeroIdx( idx ) { }
// Index translation helper
VTKM_EXEC_CONT_EXPORT
void GetLogicalDim( const Id &idx, Id &x, Id &y ) const
{
x = idx % dimX;
y = idx / dimX;
}
template< typename PortalType >
VTKM_EXEC_EXPORT
void operator()( PortalType &array,
const vtkm::Id &workIdx ) const
{
vtkm::Id x, y;
GetLogicalDim( workIdx, x, y );
if( y == zeroIdx )
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
}
private:
vtkm::Id dimX, dimY, zeroIdx;
};
// Worklet:
class TransposeWorklet : public vtkm::worklet::WorkletMapField
{