finish multi-level implementation, need to test
This commit is contained in:
parent
4d22303c6b
commit
80590fdf29
@ -162,7 +162,7 @@ public:
|
||||
vtkm::Id nLevels, // n levels of DWT
|
||||
vtkm::Id inX, vtkm::Id inY, vtkm::Id inZ,
|
||||
OutArrayType &coeffOut,
|
||||
std::vector<vtkm::Id> &L,
|
||||
//std::vector<vtkm::Id> &L,
|
||||
DeviceTag )
|
||||
{
|
||||
vtkm::Id sigInLen = sigIn.GetNumberOfValues();
|
||||
@ -179,7 +179,7 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
this->ComputeL3( inX, inY, inZ, nLevels, L );
|
||||
//this->ComputeL3( inX, inY, inZ, nLevels, L );
|
||||
|
||||
vtkm::Id currentLenX = inX;
|
||||
vtkm::Id currentLenY = inY;
|
||||
@ -192,39 +192,37 @@ public:
|
||||
// First level transform writes to the output array
|
||||
vtkm::Float64 computationTime = WaveletDWT::DWT3D(
|
||||
sigIn,
|
||||
currentLenX, currentLenY, currentLenZ,
|
||||
0, 0, 0,
|
||||
currentLenX, currentLenY, currentLenZ,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
currentLenX, currentLenY, currentLenZ,
|
||||
coeffOut,
|
||||
L3d,
|
||||
DeviceTag() );
|
||||
|
||||
VTKM_ASSERT( coeffOut.GetNumberOfValues() == currentLenX * currentLenY * currentLenZ );
|
||||
currentLenX = WaveletBase::GetApproxLength( currentLenX );
|
||||
currentLenY = WaveletBase::GetApproxLength( currentLenY );
|
||||
currentLenZ = WaveletBase::GetApproxLength( currentLenZ );
|
||||
|
||||
|
||||
// Successor transforms writes to a temporary array
|
||||
/* for( vtkm::Id i = nLevels-1; i > 0; i-- )
|
||||
for( vtkm::Id i = nLevels-1; i > 0; i-- )
|
||||
{
|
||||
OutBasicArray tempOutput;
|
||||
|
||||
computationTime +=
|
||||
WaveletDWT::DWT2D ( coeffOut,
|
||||
inX, inY,
|
||||
0, 0,
|
||||
currentLenX, currentLenY,
|
||||
tempOutput, L2d, DeviceTag() );
|
||||
|
||||
// copy results to coeffOut
|
||||
WaveletBase::DeviceRectangleCopyTo( tempOutput, currentLenX, currentLenY,
|
||||
coeffOut, inX, inY, 0, 0, DeviceTag() );
|
||||
|
||||
// update currentLen
|
||||
currentLenX = WaveletBase::GetApproxLength( currentLenX );
|
||||
currentLenY = WaveletBase::GetApproxLength( currentLenY );
|
||||
} */
|
||||
currentLenZ = WaveletBase::GetApproxLength( currentLenZ );
|
||||
|
||||
OutBasicArray tempOutput;
|
||||
|
||||
computationTime += WaveletDWT::DWT3D(
|
||||
coeffOut,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
currentLenX, currentLenY, currentLenZ,
|
||||
tempOutput,
|
||||
DeviceTag() );
|
||||
|
||||
// copy results to coeffOut
|
||||
WaveletBase::DeviceCubeCopyTo( tempOutput,
|
||||
currentLenX, currentLenY, currentLenZ,
|
||||
coeffOut,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
DeviceTag() );
|
||||
}
|
||||
|
||||
return computationTime;
|
||||
}
|
||||
@ -239,12 +237,10 @@ public:
|
||||
vtkm::Id nLevels, // n levels of DWT
|
||||
vtkm::Id inX, vtkm::Id inY, vtkm::Id inZ,
|
||||
OutArrayType &arrOut,
|
||||
std::vector<vtkm::Id> &L,
|
||||
DeviceTag )
|
||||
{
|
||||
vtkm::Id arrInLen = arrIn.GetNumberOfValues();
|
||||
VTKM_ASSERT( inX * inY * inZ == arrInLen );
|
||||
VTKM_ASSERT( vtkm::Id(L.size()) == 21 * nLevels + 6 );
|
||||
if( nLevels < 0 || nLevels > WaveletBase::GetWaveletMaxLevel( inX ) ||
|
||||
nLevels > WaveletBase::GetWaveletMaxLevel( inY ) ||
|
||||
nLevels > WaveletBase::GetWaveletMaxLevel( inZ ) )
|
||||
@ -264,52 +260,58 @@ public:
|
||||
else
|
||||
vtkm::cont::DeviceAdapterAlgorithm< DeviceTag >::Copy( arrIn, outBuffer );
|
||||
|
||||
std::vector<vtkm::Id> L;
|
||||
this->ComputeL3( inX, inY, inZ, nLevels, L );
|
||||
std::vector<vtkm::Id> L3d(27, 0);
|
||||
for( size_t i = 0; i < 27; i++ )
|
||||
L3d[i] = L[i];
|
||||
|
||||
WaveletDWT::IDWT3D( outBuffer,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
L3d,
|
||||
arrOut,
|
||||
DeviceTag() );
|
||||
|
||||
|
||||
// All transforms but the last operate on temporary arrays
|
||||
/*for( size_t i = 1; i < static_cast<size_t>(nLevels); i++ )
|
||||
// All transforms but the last level operate on temporary arrays
|
||||
for( size_t i = 0; i < 24; i++ )
|
||||
L3d[i] = L[i];
|
||||
for( size_t i = 1; i < static_cast<size_t>(nLevels); i++ )
|
||||
{
|
||||
L2d[8] = L2d[0] + L2d[4]; // This is always true for Biorthogonal wavelets
|
||||
L2d[9] = L2d[1] + L2d[3]; // (same above)
|
||||
L3d[24] = L3d[0] + L3d[12]; // Total X dim; this is always true for Biorthogonal wavelets
|
||||
L3d[25] = L3d[1] + L3d[7]; // Total Y dim
|
||||
L3d[26] = L3d[2] + L3d[5]; // Total Z dim
|
||||
|
||||
OutBasicArray tempOutput;
|
||||
|
||||
// IDWT
|
||||
computationTime +=
|
||||
WaveletDWT::IDWT2D ( outBuffer, inX, inY, 0, 0, L2d, tempOutput, DeviceTag() );
|
||||
//computationTime +=
|
||||
WaveletDWT::IDWT3D( outBuffer,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
L3d,
|
||||
tempOutput,
|
||||
DeviceTag() );
|
||||
|
||||
// copy back reconstructed block
|
||||
WaveletBase::DeviceRectangleCopyTo( tempOutput, L2d[8], L2d[9],
|
||||
outBuffer, inX, inY, 0, 0, DeviceTag() );
|
||||
WaveletBase::DeviceCubeCopyTo( tempOutput,
|
||||
L3d[24], L3d[25], L3d[26],
|
||||
outBuffer,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
DeviceTag() );
|
||||
|
||||
// update L2d array
|
||||
L2d[0] = L2d[8];
|
||||
L2d[1] = L2d[9];
|
||||
L2d[2] = L[6*i+2];
|
||||
L2d[3] = L[6*i+3];
|
||||
L2d[4] = L[6*i+4];
|
||||
L2d[5] = L[6*i+5];
|
||||
L2d[6] = L[6*i+6];
|
||||
L2d[7] = L[6*i+7];
|
||||
|
||||
// update L3d array
|
||||
L3d[0] = L3d[24];
|
||||
L3d[1] = L3d[25];
|
||||
L3d[2] = L3d[26];
|
||||
for( size_t j = 3; j < 24; j++ )
|
||||
L3d[j] = L[ 21 * i + j ];
|
||||
}
|
||||
|
||||
// The last transform outputs to the final output
|
||||
L2d[8] = L2d[0] + L2d[4];
|
||||
L2d[9] = L2d[1] + L2d[3];
|
||||
computationTime +=
|
||||
WaveletDWT::IDWT2D ( outBuffer, inX, inY, 0, 0, L2d, arrOut, DeviceTag() );
|
||||
*/
|
||||
L3d[24] = L3d[0] + L3d[12];
|
||||
L3d[25] = L3d[1] + L3d[7];
|
||||
L3d[26] = L3d[2] + L3d[5];
|
||||
//computationTime +=
|
||||
WaveletDWT::IDWT3D( outBuffer,
|
||||
inX, inY, inZ,
|
||||
0, 0, 0,
|
||||
L3d,
|
||||
arrOut,
|
||||
DeviceTag() );
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
@ -505,10 +505,9 @@ public:
|
||||
vtkm::Id sigStartX, vtkm::Id sigStartY, vtkm::Id sigStartZ,
|
||||
vtkm::Id sigPretendDimX, vtkm::Id sigPretendDimY, vtkm::Id sigPretendDimZ,
|
||||
ArrayOutType &coeffOut,
|
||||
std::vector<vtkm::Id> &L,
|
||||
DeviceTag )
|
||||
{
|
||||
VTKM_ASSERT( L.size() == 27 );
|
||||
std::vector<vtkm::Id> L(27, 0);
|
||||
|
||||
// LLL
|
||||
L[0] = WaveletBase::GetApproxLength( sigPretendDimX );
|
||||
@ -673,7 +672,8 @@ public:
|
||||
// Performs one level of IDWT on a small cube of a big cube
|
||||
// The output array has the same dimensions as the small cube.
|
||||
template< typename ArrayInType, typename ArrayOutType, typename DeviceTag >
|
||||
vtkm::Float64 IDWT3D( const ArrayInType &coeffIn,
|
||||
vtkm::Float64 IDWT3D(
|
||||
const ArrayInType &coeffIn,
|
||||
vtkm::Id inDimX, vtkm::Id inDimY, vtkm::Id inDimZ,
|
||||
vtkm::Id inStartX, vtkm::Id inStartY, vtkm::Id inStartZ,
|
||||
const std::vector<vtkm::Id> &L,
|
||||
|
@ -539,7 +539,7 @@ public:
|
||||
dimX5(x_5), dimY5(y_5), dimZ5(z_5),
|
||||
startX5(start_x5), startY5(start_y5), startZ5(start_z5)
|
||||
{
|
||||
printf("IndexTranslator6CubesFrontBack: \n" );
|
||||
/* printf("IndexTranslator6CubesFrontBack: \n" );
|
||||
printf(" cube1 dims: (%lld, %lld, %lld)\n", dimX1, dimY1, dimZ1 );
|
||||
printf(" cube2 dims: (%lld, %lld, %lld)\n", dimX2, dimY2, dimZ2 );
|
||||
printf(" cube3 dims: (%lld, %lld, %lld)\n", dimX3, dimY3, dimZ3 );
|
||||
@ -547,7 +547,7 @@ public:
|
||||
printf(" cube5 dims: (%lld, %lld, %lld)\n", dimX5, dimY5, dimZ5 );
|
||||
printf(" cA dims: (%lld, %lld, %lld)\n", dimXa, dimYa, dimZa );
|
||||
printf(" cD dims: (%lld, %lld, %lld)\n", dimXd, dimYd, dimZd );
|
||||
printf(" start idx : (%lld, %lld, %lld)\n", startX5, startY5, startZ5 );
|
||||
printf(" start idx : (%lld, %lld, %lld)\n", startX5, startY5, startZ5 ); */
|
||||
}
|
||||
|
||||
VTKM_EXEC_CONT
|
||||
@ -1396,8 +1396,8 @@ public:
|
||||
x_5, y_5, z_5,
|
||||
startX5, startY5, startZ5 )
|
||||
{
|
||||
printf("InverseTransform3DFrontBack: \n");
|
||||
printf(" output dims: (%lld, %lld, %lld)\n", outDimX, outDimY, outDimZ );
|
||||
/* printf("InverseTransform3DFrontBack: \n");
|
||||
printf(" output dims: (%lld, %lld, %lld)\n", outDimX, outDimY, outDimZ ); */
|
||||
}
|
||||
|
||||
VTKM_EXEC_CONT
|
||||
|
Loading…
Reference in New Issue
Block a user