assign zero plane, need to implement the function in Base

This commit is contained in:
Samuel Li 2017-02-15 23:54:38 -07:00
parent c87fe5d8b5
commit e432351f8a
2 changed files with 83 additions and 11 deletions

@ -44,15 +44,16 @@ public:
// Constructor
WaveletDWT( WaveletName name ) : WaveletBase( name ) {}
/*
// Function: extend a cube in X direction
template< typename SigInArrayType, typename ExtensionArrayType, typename DeviceTag >
vtkm::Id Extend3DLeftRight(
const SigInArrayType &sigIn,
const SigInArrayType &sigIn, // input
vtkm::Id sigDimX, vtkm::Id sigDimY, vtkm::Id sigDimZ,
vtkm::Id sigStartX, vtkm::Id sigStarty, vtkm::Id sigDimZ,
vtkm::Id sigPretendDimX, vtkm::Id sigPretendDimY, vtkm::Id sigPretendDimZ,
ExtensionArrayType &ext1,
ExtensionArrayType &ext2,
ExtensionArrayType &ext1, // output
ExtensionArrayType &ext2, // output
vtkm::Id addLen,
vtkm::worklet::wavelets::DWTMode ext1Method,
vtkm::worklet::wavelets::DWTMode ext2Method,
@ -60,9 +61,31 @@ public:
bool padZeroAtExt2,
DeviceTag )
{
// TODO
}
// pretendSigPaddedZero and padZeroAtExt2 cannot happen at the same time
VTKM_ASSERT( !pretendSigPaddedZero || !padZeroAtExt2 );
if( addLen == 0 ) // Haar kernel
{
ext1.PrepareForOutput( 0, DeviceTag() );
if( pretendSigPaddedZero || padZeroAtExt2 )
{
if( modeLR ) // right extension
{
ext2.PrepareForOutput( sigPretendDimY, DeviceTag() );
WaveletBase::DeviceAssignZero2DColumn( ext2, 1, sigPretendDimY, 0, DeviceTag() );
}
else // bottom extension
{
ext2.PrepareForOutput( sigPretendDimX, DeviceTag() );
WaveletBase::DeviceAssignZero2DRow( ext2, sigPretendDimX, 1, 0, DeviceTag() );
}
}
else
ext2.PrepareForOutput( 0, DeviceTag() );
return 0;
}
}
*/
template< typename SigInArrayType, typename ExtensionArrayType, typename DeviceTag >
vtkm::Id Extend2D (const SigInArrayType &sigIn, // Input
@ -85,7 +108,7 @@ public:
if( addLen == 0 ) // Haar kernel
{
ext1.PrepareForOutput( 0, DeviceTag() );
ext1.PrepareForOutput( 0, DeviceTag() ); // no need to extend on left/top
if( pretendSigPaddedZero || padZeroAtExt2 )
{
if( modeLR ) // right extension

@ -2905,7 +2905,8 @@ private:
// Assign zero to a row, or a column, or a single element in a 2D array.
// Assign zero to a row or a column in a 2D array.
// Change row or column is controlled by negative indices.
class AssignZero2DWorklet : public vtkm::worklet::WorkletMapField
{
public:
@ -2920,7 +2921,7 @@ public:
// Index translation helper
VTKM_EXEC_CONT
void GetLogicalDim( const Id &idx, Id &x, Id &y ) const
void GetLogicalDim( vtkm::Id idx, vtkm::Id &x, vtkm::Id &y ) const
{
x = idx % dimX;
y = idx / dimX;
@ -2937,8 +2938,8 @@ public:
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
else if( zeroX < 0 && y == zeroY ) // assign zero to a row
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
else if( x == zeroX && y == zeroY ) // assign zero to an element
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
// else if( x == zeroX && y == zeroY ) // assign zero to an element
// array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
}
private:
@ -2949,6 +2950,54 @@ private:
// Assign zero to a plane (2D) in a 3D cube.
// Which plane to assign zero is controlled by negative indices.
class AssignZero3DWorklet : public vtkm::worklet::WorkletMapField
{
public:
typedef void ControlSignature( WholeArrayInOut< ScalarAll > );
typedef void ExecutionSignature( _1, WorkIndex );
// Constructor
VTKM_EXEC_CONT
AssignZero3DWorklet( vtkm::Id x, vtkm::Id y, vtkm::Id z,
vtkm::Id zero_x, vtkm::Id zero_y, vtkm::Id zero_z )
: dimX( x ), dimY( y ), dimZ( z ),
zeroX( zero_x ), zeroY( zero_y ), zeroZ( zero_z )
{ }
// Index translation helper
VTKM_EXEC_CONT
void GetLogicalDim( vtkm::Id idx, vtkm::Id &x, vtkm::Id &y, vtkm::Id &z ) const
{
z = idx / (DimX * DimY);
y = (idx - z * DimX * DimY) / DimX;
x = idx % dimX;
}
template< typename PortalType >
VTKM_EXEC
void operator()( PortalType &array,
const vtkm::Id &workIdx ) const
{
vtkm::Id x, y, z;
GetLogicalDim( workIdx, x, y, z );
if( zeroZ < 0 && zeroY < 0 && x == zeroX ) // plane perpendicular to X axis
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
else if( zeroZ < 0 && zeroX < 0 && y == zeroY ) // plane perpendicular to Y axis
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
else if( zeroY < 0 && zeroX < 0 && z == zeroZ ) // plane perpendicular to Z axis
array.Set( workIdx, static_cast<typename PortalType::ValueType>(0.0) );
}
private:
vtkm::Id dimX, dimY, dimZ;
vtkm::Id zeroX, zeroY, zeroZ; // element at (zeroX, zeroY, zeroZ) will be assigned zero.
// each becomes a wild card if negative
};
// Worklet: Copys a small rectangle to part of a big rectangle
// WARNING: this worklet only supports basic ArrayHandle types.
class RectangleCopyTo : public vtkm::worklet::WorkletMapField