Merge topic 'add-contour-tree-unit-tests'

c59d8b25b Use test_equal_ArrayHandles instead of custom functions ArraysEqual
06ab386a0 Added test for combinining contour tree meshes
3d5adf335 Re-enabled tests with external files (and added required files to Git LFS)

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Kenneth Moreland <kmorel@sandia.gov>
Merge-request: !2344
This commit is contained in:
Gunther Weber 2021-02-01 21:55:16 +00:00 committed by Kitware Robot
commit 8ebd889732
9 changed files with 152 additions and 13 deletions

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5706bddc644b5b120ffbd424b3073ce989735272726de711ca8dac19b4a30ee1
size 2653

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ddf65aefbd8c8fe8fb479521af7e5fa894cc94b3f890e2cc527a8df5c6e5601c
size 728

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea0a0903fce2b7b42023ca0a2bdc008781a61fa74f75b2b107e6d0788c404551
size 1441

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:58aed19216ce91b6c9bc7c0d8ee31c1062405ad6f5a4a977b49f213e2ce81307
size 1518

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bc4033483646c7e3c7be921ca4f821d1277c0d6d79063b1565dfb78c4766bf4d
size 1234

@ -70,24 +70,22 @@ public:
TestContourTreeUniformDistributed8x9(4);
TestContourTreeUniformDistributed8x9(8);
TestContourTreeUniformDistributed8x9(16);
#if 0
TestContourTreeFile(Testing::DataPath("rectilinear/vanc.vtk"),
"var",
Testing::DataPath("rectilinear/vanc.ct_txt"),
Testing::RegressionImagePath("vanc.ct_txt"),
2);
TestContourTreeFile(Testing::DataPath("rectilinear/vanc.vtk"),
"var",
Testing::DataPath("rectilinear/vanc.ct_txt"),
Testing::RegressionImagePath("vanc.ct_txt"),
4);
TestContourTreeFile(Testing::DataPath("rectilinear/vanc.vtk"),
"var",
Testing::DataPath("rectilinear/vanc.ct_txt"),
Testing::RegressionImagePath("vanc.ct_txt"),
8);
TestContourTreeFile(Testing::DataPath("rectilinear/vanc.vtk"),
"var",
Testing::DataPath("rectilinear/vanc.ct_txt"),
Testing::RegressionImagePath("vanc.ct_txt"),
16);
#endif
TestContourTreeUniformDistributed5x6x7(2, false);
TestContourTreeUniformDistributed5x6x7(4, false);
TestContourTreeUniformDistributed5x6x7(8, false);

@ -72,6 +72,7 @@
#include <vtkm/cont/ArrayRangeCompute.h>
#include <vtkm/cont/DeviceAdapterAlgorithm.h>
#include <vtkm/cont/EnvironmentTracker.h>
#include <vtkm/io/ErrorIO.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/contourtree_augmented/ArrayTransforms.h>
#include <vtkm/worklet/contourtree_augmented/data_set_mesh/IdRelabeler.h> // This is needed only as an unused default argument.
@ -91,7 +92,6 @@
#include <vtkm/worklet/contourtree_augmented/meshtypes/mesh_boundary/ComputeMeshBoundaryContourTreeMesh.h>
#include <vtkm/worklet/contourtree_augmented/meshtypes/mesh_boundary/MeshBoundaryContourTreeMesh.h>
#include <vtkm/worklet/contourtree_augmented/PrintVectors.h> // TODO remove should not be needed
#include <vtkm/cont/ExecutionObjectBase.h>
@ -274,7 +274,7 @@ private:
// Internal helper function to Load 1D index array from file
template <typename ValueType>
void LoadVector(std::istream& is, const vtkm::cont::ArrayHandle<ValueType>& vec);
void LoadVector(std::istream& is, vtkm::cont::ArrayHandle<ValueType>& vec);
}; // ContourTreeMesh
@ -810,6 +810,10 @@ template <typename FieldType>
inline void ContourTreeMesh<FieldType>::Load(const char* filename)
{
std::ifstream is(filename);
if (!is.is_open())
{
throw vtkm::io::ErrorIO(std::string("Unable to open file: ") + std::string(filename));
}
LoadVector(is, this->SortedValues);
LoadVector(is, this->GlobalMeshIndex);
LoadVector(is, this->Neighbours);
@ -827,7 +831,7 @@ inline void ContourTreeMesh<FieldType>::SaveVector(
const vtkm::cont::ArrayHandle<ValueType>& vec) const
{
vtkm::Id numVals = vec.GetNumberOfValues();
//os.write(reinterpret_cast<const char*>(&numVals), sizeof(ValueType));
//os.write(rXeinterpret_cast<const char*>(&numVals), sizeof(ValueType));
os << numVals << ": ";
auto vecPortal = vec.ReadPortal();
for (vtkm::Id i = 0; i < numVals; ++i)
@ -839,16 +843,22 @@ inline void ContourTreeMesh<FieldType>::SaveVector(
template <typename FieldType>
template <typename ValueType>
inline void ContourTreeMesh<FieldType>::LoadVector(std::istream& is,
const vtkm::cont::ArrayHandle<ValueType>& vec)
vtkm::cont::ArrayHandle<ValueType>& vec)
{
vtkm::Id numVals;
is.read(reinterpret_cast<char*>(&numVals), sizeof(ValueType));
is >> numVals;
char colon = is.get();
if (colon != ':')
{
throw vtkm::io::ErrorIO("Error parsing file");
}
vec.Allocate(numVals);
auto vecPortal = vec.WritePortal();
vtkm::Id val;
ValueType val;
for (vtkm::Id i = 0; i < numVals; ++i)
{
is.read(reinterpret_cast<char*>(val), sizeof(ValueType));
is >> val;
vecPortal.Set(i, val);
}
}

@ -25,6 +25,7 @@ set(unit_tests
UnitTestContour.cxx
UnitTestContourTreeUniform.cxx
UnitTestContourTreeUniformAugmented.cxx
UnitTestContourTreeUniformDistributed.cxx
UnitTestCoordinateSystemTransform.cxx
UnitTestCosmoTools.cxx
UnitTestCrossProduct.cxx

@ -0,0 +1,115 @@
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt 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.
//============================================================================
// Copyright (c) 2018, The Regents of the University of California, through
// Lawrence Berkeley National Laboratory (subject to receipt of any required approvals
// from the U.S. Dept. of Energy). All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// (1) Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
//
// (2) Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// (3) Neither the name of the University of California, Lawrence Berkeley National
// Laboratory, U.S. Dept. of Energy nor the names of its contributors may be
// used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
// OF THE POSSIBILITY OF SUCH DAMAGE.
//
//=============================================================================
//
// This code is an extension of the algorithm presented in the paper:
// Parallel Peak Pruning for Scalable SMP Contour Tree Computation.
// Hamish Carr, Gunther Weber, Christopher Sewell, and James Ahrens.
// Proceedings of the IEEE Symposium on Large Data Analysis and Visualization
// (LDAV), October 2016, Baltimore, Maryland.
//
// The PPP2 algorithm and software were jointly developed by
// Hamish Carr (University of Leeds), Gunther H. Weber (LBNL), and
// Oliver Ruebel (LBNL)
//==============================================================================
#include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/cont/testing/Testing.h>
#include <vtkm/worklet/contourtree_augmented/meshtypes/ContourTreeMesh.h>
namespace
{
// Functor needed so we can discover the FieldType and DeviceAdapter template parameters to call MergeWith
struct MergeContourTreeMeshFunctor
{
template <typename DeviceAdapterTag, typename FieldType>
bool operator()(DeviceAdapterTag,
vtkm::worklet::contourtree_augmented::ContourTreeMesh<FieldType>& in,
vtkm::worklet::contourtree_augmented::ContourTreeMesh<FieldType>& out) const
{
out.template MergeWith<DeviceAdapterTag>(in);
return true;
}
};
template <typename FieldType>
void TestContourTreeMeshCombine(const std::string& mesh1_filename,
const std::string& mesh2_filename,
const std::string& combined_filename)
{
vtkm::worklet::contourtree_augmented::ContourTreeMesh<FieldType> contourTreeMesh1;
contourTreeMesh1.Load(mesh1_filename.c_str());
vtkm::worklet::contourtree_augmented::ContourTreeMesh<FieldType> contourTreeMesh2;
contourTreeMesh2.Load(mesh2_filename.c_str());
vtkm::cont::TryExecute(MergeContourTreeMeshFunctor{}, contourTreeMesh1, contourTreeMesh2);
// Result is written to contourTreeMesh2
vtkm::worklet::contourtree_augmented::ContourTreeMesh<FieldType> combinedContourTreeMesh;
combinedContourTreeMesh.Load(combined_filename.c_str());
VTKM_TEST_ASSERT(
test_equal_ArrayHandles(contourTreeMesh2.SortedValues, combinedContourTreeMesh.SortedValues));
VTKM_TEST_ASSERT(test_equal_ArrayHandles(contourTreeMesh2.GlobalMeshIndex,
combinedContourTreeMesh.GlobalMeshIndex));
VTKM_TEST_ASSERT(test_equal_ArrayHandles(contourTreeMesh2.GlobalMeshIndex,
combinedContourTreeMesh.GlobalMeshIndex));
VTKM_TEST_ASSERT(
test_equal_ArrayHandles(contourTreeMesh2.Neighbours, combinedContourTreeMesh.Neighbours));
VTKM_TEST_ASSERT(test_equal_ArrayHandles(contourTreeMesh2.FirstNeighbour,
combinedContourTreeMesh.FirstNeighbour));
VTKM_TEST_ASSERT(contourTreeMesh2.NumVertices == combinedContourTreeMesh.NumVertices);
VTKM_TEST_ASSERT(contourTreeMesh2.MaxNeighbours == combinedContourTreeMesh.MaxNeighbours);
}
void TestContourTreeUniformDistributed()
{
using vtkm::cont::testing::Testing;
TestContourTreeMeshCombine<vtkm::FloatDefault>(
Testing::DataPath("misc/5x6_7_MC_Rank0_Block0_Round1_BeforeCombineMesh1.ctm"),
Testing::DataPath("misc/5x6_7_MC_Rank0_Block0_Round1_BeforeCombineMesh2.ctm"),
Testing::RegressionImagePath("5x6_7_MC_Rank0_Block0_Round1_CombinedMesh.ctm"));
}
} // anonymous namespace
int UnitTestContourTreeUniformDistributed(int argc, char* argv[])
{
return vtkm::cont::testing::Testing::Run(TestContourTreeUniformDistributed, argc, argv);
}