mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-20 11:05:44 +00:00
Extend2D passes initial test, need to test more.
This commit is contained in:
parent
b988591be5
commit
858895d3c8
@ -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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user