use one worklet to perform 4 different kinds of left extensions

This commit is contained in:
Samuel Li 2016-08-26 11:18:50 -06:00
parent 4bda2f3042
commit 3cb1d24ede
2 changed files with 71 additions and 54 deletions

@ -33,13 +33,6 @@ namespace worklet {
namespace wavelets { namespace wavelets {
enum DWTMode { // boundary extension modes
SYMH,
SYMW,
ASYMH,
ASYMW
};
// Functionalities are similar to MatWaveBase in VAPoR. // Functionalities are similar to MatWaveBase in VAPoR.
class WaveletBase class WaveletBase
{ {

@ -31,6 +31,14 @@ namespace worklet {
namespace wavelets { namespace wavelets {
enum DWTMode { // boundary extension modes
SYMH,
SYMW,
ASYMH,
ASYMW
};
// Worklet: perform a simple forward transform // Worklet: perform a simple forward transform
class ForwardTransform: public vtkm::worklet::WorkletMapField class ForwardTransform: public vtkm::worklet::WorkletMapField
{ {
@ -468,53 +476,6 @@ private:
}; };
// Worklet for 2D signal extension no. 1
class LeftSYMHExtentionWorklet2D : public vtkm::worklet::WorkletMapField
{
public:
typedef void ControlSignature( WholeArrayOut < ScalarAll >, // extension part
WholeArrayIn < ScalarAll > ); // signal part
typedef void ExecutionSignature( _1, _2, WorkIndex );
typedef _1 InputDomain;
typedef vtkm::Id Id;
// Constructor
VTKM_EXEC_CONT_EXPORT
LeftSYMHExtentionWorklet2D( Id x1, Id y1, Id x2, Id y2)
: extDimX( x1 ), extDimY( y1 ), sigDimX( x2 ), sigDimY( y2 ) {}
// Index translation helper
VTKM_EXEC_CONT_EXPORT
void GetExtLogicalDim( const Id &idx, Id &x, Id &y ) const
{
x = idx % extDimX;
y = idx / extDimX;
}
// Index translation helper
VTKM_EXEC_CONT_EXPORT
Id GetSignal1DIndex( Id x, Id y ) const
{
return y * sigDimX + x;
}
template< typename PortalOutType, typename PortalInType >
VTKM_EXEC_EXPORT
void operator()( PortalOutType &portalOut,
const PortalInType &portalIn,
const vtkm::Id &workIndex) const
{
Id extX, extY;
GetExtLogicalDim( workIndex, extX, extY );
Id sigX = extDimX - extX - 1;
portalOut.Set( workIndex, portalIn.Get( GetSignal1DIndex(sigX, extY) ));
}
private:
vtkm::Id extDimX, extDimY, sigDimX, sigDimY;
};
// Worklet for signal extension no. 2 // Worklet for signal extension no. 2
class LeftSYMWExtentionWorklet : public vtkm::worklet::WorkletMapField class LeftSYMWExtentionWorklet : public vtkm::worklet::WorkletMapField
{ {
@ -596,6 +557,69 @@ private:
}; };
// Worklet for 2D signal extension
class LeftExtentionWorklet2D : public vtkm::worklet::WorkletMapField
{
public:
typedef void ControlSignature( WholeArrayOut < ScalarAll >, // extension part
WholeArrayIn < ScalarAll > ); // signal part
typedef void ExecutionSignature( _1, _2, WorkIndex );
typedef _1 InputDomain;
typedef vtkm::Id Id;
// Constructor
VTKM_EXEC_CONT_EXPORT
LeftExtentionWorklet2D( Id x1, Id y1, Id x2, Id y2, DWTMode m)
: extDimX( x1 ), extDimY( y1 ), sigDimX( x2 ), sigDimY( y2 ), mode(m) {}
// Index translation helper
VTKM_EXEC_CONT_EXPORT
void GetExtLogicalDim( const Id &idx, Id &x, Id &y ) const
{
x = idx % extDimX;
y = idx / extDimX;
}
// Index translation helper
VTKM_EXEC_CONT_EXPORT
Id GetSignal1DIndex( Id x, Id y ) const
{
return y * sigDimX + x;
}
template< typename PortalOutType, typename PortalInType >
VTKM_EXEC_EXPORT
void operator()( PortalOutType &portalOut,
const PortalInType &portalIn,
const vtkm::Id &workIndex) const
{
Id extX, extY;
Id sigX;
typename PortalOutType::ValueType sym = 1.0;
GetExtLogicalDim( workIndex, extX, extY );
if ( mode == SYMH )
sigX = extDimX - extX - 1;
else if ( mode == SYMW )
sigX = extDimX - extX;
else if ( mode == ASYMH )
{
sigX = extDimX - extX - 1;
sym = -1.0;
}
else // mode == ASYMW
{
sigX = extDimX - extX;
sym = -1.0;
}
portalOut.Set( workIndex, portalIn.Get( GetSignal1DIndex(sigX, extY) ) * sym );
}
private:
vtkm::Id extDimX, extDimY, sigDimX, sigDimY;
DWTMode mode;
};
// Worklet for signal extension no. 5 // Worklet for signal extension no. 5
class RightSYMHExtentionWorklet : public vtkm::worklet::WorkletMapField class RightSYMHExtentionWorklet : public vtkm::worklet::WorkletMapField
{ {