/*========================================================================= Program: Visualization Toolkit Module: TestStructuredData.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkSmartPointer.h" #include "vtkStructuredData.h" static int TestGridExtent(int ext[6]); static int TestCellIds(); static int TestPointIds(); static int Test1DCases(); static int Test2DCases(); static int TestGetNumNodesAndCells(); int TestStructuredData(int, char*[]) { if (Test1DCases() != EXIT_SUCCESS) { std::cerr << "1-D Test cases failed!\n"; return EXIT_FAILURE; } if (Test2DCases() != EXIT_SUCCESS) { std::cerr << "2-D Test cases failed!\n"; return EXIT_FAILURE; } int cellIdsResult = TestCellIds(); int pointIdsResult = TestPointIds(); if (cellIdsResult != EXIT_SUCCESS || pointIdsResult != EXIT_SUCCESS) { return EXIT_FAILURE; } if (TestGetNumNodesAndCells() != EXIT_SUCCESS) { std::cerr << "TestGetNumNodesAndCells() failed!\n"; return EXIT_FAILURE; } return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int TestGetNumNodesAndCells() { #ifdef VTK_USE_64BIT_IDS const int maxDim = 2047; #else const int maxDim = 511; #endif // Extent for 2048^3 grid int ext[6] = { 0, maxDim, 0, maxDim, 0, maxDim }; int dims[3]; vtkStructuredData::GetDimensionsFromExtent(ext, dims); if ((dims[0] != maxDim + 1) || (dims[1] != maxDim + 1) || (dims[2] != maxDim + 1)) { std::cerr << "Wrong dims computed: "; std::cerr << dims[0] << ", " << dims[1] << ", " << dims[2] << std::endl; return EXIT_FAILURE; } // Compute expected number of nodes. Note, we cast dims to vtkIdType to // ensure the compiler will generate a 32x32=64 multiply instruction. vtkIdType nNodesExpected = static_cast(dims[0]) * static_cast(dims[1]) * static_cast(dims[2]); if (vtkStructuredData::GetNumberOfPoints(ext) != nNodesExpected) { std::cerr << "ERROR: GetNumberOfNodes(ext) failed!\n"; std::cerr << "val=" << vtkStructuredData::GetNumberOfPoints(ext) << "\n"; std::cerr << "expected=" << nNodesExpected << "\n"; return EXIT_FAILURE; } vtkStructuredData::GetCellDimensionsFromExtent(ext, dims); if ((dims[0] != maxDim) || (dims[1] != maxDim) || (dims[2] != maxDim)) { std::cerr << "Wrong dims computed: "; std::cerr << dims[0] << ", " << dims[1] << ", " << dims[2] << std::endl; return EXIT_FAILURE; } // Compute expected number of nodes. Note, we cast dims to vtkIdType to // ensure the compiler will generate a 32x32=64 multiply instruction. vtkIdType nCellsExpected = static_cast(dims[0]) * static_cast(dims[1]) * static_cast(dims[2]); if (vtkStructuredData::GetNumberOfCells(ext) != nCellsExpected) { std::cerr << "ERROR: GetNumberOfNodes(ext) failed!\n"; std::cerr << "val=" << vtkStructuredData::GetNumberOfCells(ext) << "\n"; std::cerr << "expected=" << nCellsExpected << "\n"; return EXIT_FAILURE; } return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int TestGridExtent(int ext[6]) { int ijk[3]; int myijk[3]; for (int i = ext[0]; i <= ext[1]; ++i) { for (int j = ext[2]; j <= ext[3]; ++j) { for (int k = ext[4]; k <= ext[5]; ++k) { ijk[0] = i; ijk[1] = j; ijk[2] = k; vtkIdType idx = vtkStructuredData::ComputePointIdForExtent(ext, ijk); vtkStructuredData::ComputePointStructuredCoordsForExtent(idx, ext, myijk); if (!(ijk[0] == myijk[0] && ijk[1] == myijk[1] && ijk[2] == myijk[2])) { std::cerr << "TestSturcturedData failed when processing extent: ["; std::cerr << ext[0] << " " << ext[1] << " " << ext[2] << " " << ext[3] << " " << ext[4] << " " << ext[5] << "] " << std::endl; std::cerr << "Expected IJK: ("; std::cerr << ijk[0] << ", " << ijk[1] << ", " << ijk[2] << ")\n"; std::cerr << "Computed IJK: ("; std::cerr << myijk[0] << ", " << myijk[1] << ", " << myijk[2]; std::cerr << ")\n"; return EXIT_FAILURE; } // END if } // END for all k } // END for all j } // END for all i return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int Test1DCases() { int testExtents[3][6] = { { 0, 4, 0, 0, 0, 0 }, // X-LINE { 0, 0, 0, 4, 0, 0 }, // Y-LINE { 0, 0, 0, 0, 0, 4 } // Z-LINE }; int status; for (int i = 0; i < 3; ++i) { status = TestGridExtent(testExtents[i]); if (status == EXIT_FAILURE) { return (EXIT_FAILURE); } } return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int Test2DCases() { int testExtents[3][6] = { { 0, 4, 0, 4, 0, 0 }, // XY-PLANE { 0, 0, 0, 4, 0, 4 }, // YZ-PLANE { 0, 4, 0, 0, 0, 4 } // XZ-PLANE }; int status; for (int i = 0; i < 3; ++i) { status = TestGridExtent(testExtents[i]); if (status == EXIT_FAILURE) { return (EXIT_FAILURE); } } return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int TestCellIds() { int dim[3] = { 3, 4, 5 }; for (int i = 0; i < dim[0] - 1; ++i) { for (int j = 0; j < dim[1] - 1; ++j) { for (int k = 0; k < dim[2] - 1; ++k) { int pos[3]; pos[0] = i; pos[1] = j; pos[2] = k; int ijk[3]; vtkIdType id = vtkStructuredData::ComputeCellId(dim, pos); vtkStructuredData::ComputeCellStructuredCoords(id, dim, ijk); if (!(pos[0] == ijk[0] && pos[1] == ijk[1] && pos[2] == ijk[2])) { std::cerr << "TestStructuredData failed! Structured coords should be (" << i << ", " << j << ", " << k << ") but they are (" << ijk[0] << ", " << ijk[1] << ", " << ijk[2] << ")" << std::endl; return EXIT_FAILURE; } } } } return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int TestPointIds() { int dim[3] = { 3, 4, 5 }; for (int i = 0; i < dim[0]; ++i) { for (int j = 0; j < dim[1]; ++j) { for (int k = 0; k < dim[2]; ++k) { int pos[3]; pos[0] = i; pos[1] = j; pos[2] = k; int ijk[3]; vtkIdType id = vtkStructuredData::ComputePointId(dim, pos); vtkStructuredData::ComputePointStructuredCoords(id, dim, ijk); if (!(pos[0] == ijk[0] && pos[1] == ijk[1] && pos[2] == ijk[2])) { std::cerr << "TestStructuredData point structured coords failed!" << " Structured coords should be (" << i << ", " << j << ", " << k << ") but they are (" << ijk[0] << ", " << ijk[1] << ", " << ijk[2] << ")" << std::endl; return EXIT_FAILURE; } } } } return EXIT_SUCCESS; }