mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-10-05 01:49:02 +00:00
Added test for combinining contour tree meshes
This commit is contained in:
parent
3d5adf335d
commit
06ab386a03
@ -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:ea0a0903fce2b7b42023ca0a2bdc008781a61fa74f75b2b107e6d0788c404551
|
||||||
|
size 1441
|
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:58aed19216ce91b6c9bc7c0d8ee31c1062405ad6f5a4a977b49f213e2ce81307
|
||||||
|
size 1518
|
@ -72,6 +72,7 @@
|
|||||||
#include <vtkm/cont/ArrayRangeCompute.h>
|
#include <vtkm/cont/ArrayRangeCompute.h>
|
||||||
#include <vtkm/cont/DeviceAdapterAlgorithm.h>
|
#include <vtkm/cont/DeviceAdapterAlgorithm.h>
|
||||||
#include <vtkm/cont/EnvironmentTracker.h>
|
#include <vtkm/cont/EnvironmentTracker.h>
|
||||||
|
#include <vtkm/io/ErrorIO.h>
|
||||||
#include <vtkm/worklet/DispatcherMapField.h>
|
#include <vtkm/worklet/DispatcherMapField.h>
|
||||||
#include <vtkm/worklet/contourtree_augmented/ArrayTransforms.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.
|
#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/ComputeMeshBoundaryContourTreeMesh.h>
|
||||||
#include <vtkm/worklet/contourtree_augmented/meshtypes/mesh_boundary/MeshBoundaryContourTreeMesh.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/worklet/contourtree_augmented/PrintVectors.h> // TODO remove should not be needed
|
||||||
|
|
||||||
#include <vtkm/cont/ExecutionObjectBase.h>
|
#include <vtkm/cont/ExecutionObjectBase.h>
|
||||||
@ -274,7 +274,7 @@ private:
|
|||||||
|
|
||||||
// Internal helper function to Load 1D index array from file
|
// Internal helper function to Load 1D index array from file
|
||||||
template <typename ValueType>
|
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
|
}; // ContourTreeMesh
|
||||||
|
|
||||||
@ -810,6 +810,10 @@ template <typename FieldType>
|
|||||||
inline void ContourTreeMesh<FieldType>::Load(const char* filename)
|
inline void ContourTreeMesh<FieldType>::Load(const char* filename)
|
||||||
{
|
{
|
||||||
std::ifstream is(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->SortedValues);
|
||||||
LoadVector(is, this->GlobalMeshIndex);
|
LoadVector(is, this->GlobalMeshIndex);
|
||||||
LoadVector(is, this->Neighbours);
|
LoadVector(is, this->Neighbours);
|
||||||
@ -827,7 +831,7 @@ inline void ContourTreeMesh<FieldType>::SaveVector(
|
|||||||
const vtkm::cont::ArrayHandle<ValueType>& vec) const
|
const vtkm::cont::ArrayHandle<ValueType>& vec) const
|
||||||
{
|
{
|
||||||
vtkm::Id numVals = vec.GetNumberOfValues();
|
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 << ": ";
|
os << numVals << ": ";
|
||||||
auto vecPortal = vec.ReadPortal();
|
auto vecPortal = vec.ReadPortal();
|
||||||
for (vtkm::Id i = 0; i < numVals; ++i)
|
for (vtkm::Id i = 0; i < numVals; ++i)
|
||||||
@ -839,16 +843,22 @@ inline void ContourTreeMesh<FieldType>::SaveVector(
|
|||||||
template <typename FieldType>
|
template <typename FieldType>
|
||||||
template <typename ValueType>
|
template <typename ValueType>
|
||||||
inline void ContourTreeMesh<FieldType>::LoadVector(std::istream& is,
|
inline void ContourTreeMesh<FieldType>::LoadVector(std::istream& is,
|
||||||
const vtkm::cont::ArrayHandle<ValueType>& vec)
|
vtkm::cont::ArrayHandle<ValueType>& vec)
|
||||||
{
|
{
|
||||||
vtkm::Id numVals;
|
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);
|
vec.Allocate(numVals);
|
||||||
auto vecPortal = vec.WritePortal();
|
auto vecPortal = vec.WritePortal();
|
||||||
vtkm::Id val;
|
ValueType val;
|
||||||
for (vtkm::Id i = 0; i < numVals; ++i)
|
for (vtkm::Id i = 0; i < numVals; ++i)
|
||||||
{
|
{
|
||||||
is.read(reinterpret_cast<char*>(val), sizeof(ValueType));
|
is >> val;
|
||||||
vecPortal.Set(i, val);
|
vecPortal.Set(i, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ set(unit_tests
|
|||||||
UnitTestContour.cxx
|
UnitTestContour.cxx
|
||||||
UnitTestContourTreeUniform.cxx
|
UnitTestContourTreeUniform.cxx
|
||||||
UnitTestContourTreeUniformAugmented.cxx
|
UnitTestContourTreeUniformAugmented.cxx
|
||||||
|
UnitTestContourTreeUniformDistributed.cxx
|
||||||
UnitTestCoordinateSystemTransform.cxx
|
UnitTestCoordinateSystemTransform.cxx
|
||||||
UnitTestCosmoTools.cxx
|
UnitTestCosmoTools.cxx
|
||||||
UnitTestCrossProduct.cxx
|
UnitTestCrossProduct.cxx
|
||||||
|
158
vtkm/worklet/testing/UnitTestContourTreeUniformDistributed.cxx
Normal file
158
vtkm/worklet/testing/UnitTestContourTreeUniformDistributed.cxx
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
//============================================================================
|
||||||
|
// 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 T>
|
||||||
|
bool ArraysEqual(const vtkm::cont::ArrayHandle<T>& result,
|
||||||
|
const vtkm::cont::ArrayHandle<T>& expected)
|
||||||
|
{
|
||||||
|
bool are_equal = true;
|
||||||
|
if (result.GetNumberOfValues() == expected.GetNumberOfValues())
|
||||||
|
{
|
||||||
|
auto result_portal = result.ReadPortal();
|
||||||
|
auto expected_portal = expected.ReadPortal();
|
||||||
|
|
||||||
|
for (vtkm::Id i = 0; i < result.GetNumberOfValues(); ++i)
|
||||||
|
{
|
||||||
|
if (result_portal.Get(i) != expected_portal.Get(i))
|
||||||
|
{
|
||||||
|
are_equal = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
are_equal = false;
|
||||||
|
}
|
||||||
|
if (!are_equal)
|
||||||
|
{
|
||||||
|
std::cerr << "Mismatch error." << std::endl;
|
||||||
|
std::cerr << "Expected array of length " << expected.GetNumberOfValues() << ": ";
|
||||||
|
auto expected_portal = expected.ReadPortal();
|
||||||
|
for (vtkm::Id i = 0; i < expected.GetNumberOfValues(); ++i)
|
||||||
|
{
|
||||||
|
std::cerr << expected_portal.Get(i) << " ";
|
||||||
|
}
|
||||||
|
std::cerr << std::endl;
|
||||||
|
std::cerr << "Got array of length " << result.GetNumberOfValues() << ": ";
|
||||||
|
auto result_portal = result.ReadPortal();
|
||||||
|
for (vtkm::Id i = 0; i < result.GetNumberOfValues(); ++i)
|
||||||
|
{
|
||||||
|
std::cerr << result_portal.Get(i) << " ";
|
||||||
|
}
|
||||||
|
std::cerr << std::endl;
|
||||||
|
}
|
||||||
|
return are_equal;
|
||||||
|
}
|
||||||
|
|
||||||
|
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(
|
||||||
|
ArraysEqual(contourTreeMesh2.SortedValues, combinedContourTreeMesh.SortedValues));
|
||||||
|
VTKM_TEST_ASSERT(
|
||||||
|
ArraysEqual(contourTreeMesh2.GlobalMeshIndex, combinedContourTreeMesh.GlobalMeshIndex));
|
||||||
|
VTKM_TEST_ASSERT(
|
||||||
|
ArraysEqual(contourTreeMesh2.GlobalMeshIndex, combinedContourTreeMesh.GlobalMeshIndex));
|
||||||
|
VTKM_TEST_ASSERT(ArraysEqual(contourTreeMesh2.Neighbours, combinedContourTreeMesh.Neighbours));
|
||||||
|
VTKM_TEST_ASSERT(
|
||||||
|
ArraysEqual(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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user