Merge topic 'cross_and_dot_filters'
da2b518e fix compiler warning 1a0dfaa7 Add mapfield method. daf11713 Filters to compute the cross and dot product of vector fields. Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: Robert Maynard <robert.maynard@kitware.com> Merge-request: !1098
This commit is contained in:
commit
4fd3203bc2
@ -24,6 +24,8 @@ set(headers
|
||||
ClipWithField.h
|
||||
ClipWithImplicitFunction.h
|
||||
ContourTreeUniform.h
|
||||
CrossProduct.h
|
||||
DotProduct.h
|
||||
Entropy.h
|
||||
ExternalFaces.h
|
||||
ExtractGeometry.h
|
||||
@ -64,6 +66,8 @@ set(header_template_sources
|
||||
ClipWithField.hxx
|
||||
ClipWithImplicitFunction.hxx
|
||||
ContourTreeUniform.hxx
|
||||
CrossProduct.hxx
|
||||
DotProduct.hxx
|
||||
Entropy.hxx
|
||||
ExternalFaces.hxx
|
||||
ExtractGeometry.hxx
|
||||
|
72
vtkm/filter/CrossProduct.h
Normal file
72
vtkm/filter/CrossProduct.h
Normal file
@ -0,0 +1,72 @@
|
||||
//============================================================================
|
||||
// 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
|
||||
// Copyright 2014 UT-Battelle, LLC.
|
||||
// Copyright 2014 Los Alamos National Security.
|
||||
//
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
||||
// Laboratory (LANL), the U.S. Government retains certain rights in
|
||||
// this software.
|
||||
//============================================================================
|
||||
|
||||
#ifndef vtk_m_filter_CrossProduct_h
|
||||
#define vtk_m_filter_CrossProduct_h
|
||||
|
||||
#include <vtkm/filter/FilterField.h>
|
||||
#include <vtkm/worklet/CrossProduct.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace filter
|
||||
{
|
||||
|
||||
class CrossProduct : public vtkm::filter::FilterField<CrossProduct>
|
||||
{
|
||||
public:
|
||||
VTKM_CONT
|
||||
CrossProduct();
|
||||
|
||||
VTKM_CONT
|
||||
void SetSecondaryFieldName(const std::string& nm) { SecondaryFieldName = nm; }
|
||||
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
VTKM_CONT vtkm::filter::Result DoExecute(
|
||||
const vtkm::cont::DataSet& input,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType>& field,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
|
||||
const DeviceAdapter& tag);
|
||||
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
VTKM_CONT bool DoMapField(vtkm::filter::Result& result,
|
||||
const vtkm::cont::ArrayHandle<T, StorageType>& input,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
|
||||
DeviceAdapter tag);
|
||||
|
||||
private:
|
||||
vtkm::worklet::CrossProduct Worklet;
|
||||
std::string SecondaryFieldName;
|
||||
};
|
||||
|
||||
template <>
|
||||
class FilterTraits<CrossProduct>
|
||||
{ //currently the CrossProduct filter only works on vector data.
|
||||
public:
|
||||
typedef TypeListTagVecCommon InputFieldTypeList;
|
||||
};
|
||||
}
|
||||
} // namespace vtkm::filter
|
||||
|
||||
#include <vtkm/filter/CrossProduct.hxx>
|
||||
|
||||
#endif // vtk_m_filter_CrossProduct_h
|
84
vtkm/filter/CrossProduct.hxx
Normal file
84
vtkm/filter/CrossProduct.hxx
Normal file
@ -0,0 +1,84 @@
|
||||
//============================================================================
|
||||
// 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
|
||||
// Copyright 2014 UT-Battelle, LLC.
|
||||
// Copyright 2014 Los Alamos National Security.
|
||||
//
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
||||
// Laboratory (LANL), the U.S. Government retains certain rights in
|
||||
// this software.
|
||||
//============================================================================
|
||||
|
||||
#include <vtkm/worklet/DispatcherMapField.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace filter
|
||||
{
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline VTKM_CONT CrossProduct::CrossProduct()
|
||||
: vtkm::filter::FilterField<CrossProduct>()
|
||||
, Worklet()
|
||||
, SecondaryFieldName("")
|
||||
{
|
||||
this->SetOutputFieldName("crossproduct");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
inline VTKM_CONT vtkm::filter::Result CrossProduct::DoExecute(
|
||||
const vtkm::cont::DataSet& inDataSet,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType>& field,
|
||||
const vtkm::filter::FieldMetadata& fieldMetadata,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
|
||||
const DeviceAdapter&)
|
||||
{
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType> outArray;
|
||||
|
||||
vtkm::worklet::DispatcherMapField<vtkm::worklet::CrossProduct, DeviceAdapter> dispatcher(
|
||||
this->Worklet);
|
||||
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType> secondaryField;
|
||||
try
|
||||
{
|
||||
vtkm::filter::ApplyPolicy(inDataSet.GetField(SecondaryFieldName), policy)
|
||||
.CopyTo(secondaryField);
|
||||
}
|
||||
catch (const vtkm::cont::Error&)
|
||||
{
|
||||
return vtkm::filter::Result();
|
||||
}
|
||||
|
||||
dispatcher.Invoke(field, secondaryField, outArray);
|
||||
|
||||
return vtkm::filter::Result(inDataSet,
|
||||
outArray,
|
||||
this->GetOutputFieldName(),
|
||||
fieldMetadata.GetAssociation(),
|
||||
fieldMetadata.GetCellSetName());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
inline VTKM_CONT bool CrossProduct::DoMapField(vtkm::filter::Result& result,
|
||||
const vtkm::cont::ArrayHandle<T, StorageType>& input,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>&,
|
||||
DeviceAdapter)
|
||||
{
|
||||
//we copy the input handle to the result dataset, reusing the metadata
|
||||
result.GetDataSet().AddField(fieldMeta.AsField(input));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} // namespace vtkm::filter
|
72
vtkm/filter/DotProduct.h
Normal file
72
vtkm/filter/DotProduct.h
Normal file
@ -0,0 +1,72 @@
|
||||
//============================================================================
|
||||
// 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
|
||||
// Copyright 2014 UT-Battelle, LLC.
|
||||
// Copyright 2014 Los Alamos National Security.
|
||||
//
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
||||
// Laboratory (LANL), the U.S. Government retains certain rights in
|
||||
// this software.
|
||||
//============================================================================
|
||||
|
||||
#ifndef vtk_m_filter_DotProduct_h
|
||||
#define vtk_m_filter_DotProduct_h
|
||||
|
||||
#include <vtkm/filter/FilterField.h>
|
||||
#include <vtkm/worklet/DotProduct.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace filter
|
||||
{
|
||||
|
||||
class DotProduct : public vtkm::filter::FilterField<DotProduct>
|
||||
{
|
||||
public:
|
||||
VTKM_CONT
|
||||
DotProduct();
|
||||
|
||||
VTKM_CONT
|
||||
void SetSecondaryFieldName(const std::string& nm) { SecondaryFieldName = nm; }
|
||||
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
VTKM_CONT vtkm::filter::Result DoExecute(
|
||||
const vtkm::cont::DataSet& input,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType>& field,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
|
||||
const DeviceAdapter& tag);
|
||||
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
VTKM_CONT bool DoMapField(vtkm::filter::Result& result,
|
||||
const vtkm::cont::ArrayHandle<T, StorageType>& input,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
|
||||
DeviceAdapter tag);
|
||||
|
||||
private:
|
||||
vtkm::worklet::DotProduct Worklet;
|
||||
std::string SecondaryFieldName;
|
||||
};
|
||||
|
||||
template <>
|
||||
class FilterTraits<DotProduct>
|
||||
{ //currently the DotProduct filter only works on vector data.
|
||||
public:
|
||||
typedef TypeListTagVecCommon InputFieldTypeList;
|
||||
};
|
||||
}
|
||||
} // namespace vtkm::filter
|
||||
|
||||
#include <vtkm/filter/DotProduct.hxx>
|
||||
|
||||
#endif // vtk_m_filter_DotProduct_h
|
84
vtkm/filter/DotProduct.hxx
Normal file
84
vtkm/filter/DotProduct.hxx
Normal file
@ -0,0 +1,84 @@
|
||||
//============================================================================
|
||||
// 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
|
||||
// Copyright 2014 UT-Battelle, LLC.
|
||||
// Copyright 2014 Los Alamos National Security.
|
||||
//
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
||||
// Laboratory (LANL), the U.S. Government retains certain rights in
|
||||
// this software.
|
||||
//============================================================================
|
||||
|
||||
#include <vtkm/worklet/DispatcherMapField.h>
|
||||
|
||||
namespace vtkm
|
||||
{
|
||||
namespace filter
|
||||
{
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
inline VTKM_CONT DotProduct::DotProduct()
|
||||
: vtkm::filter::FilterField<DotProduct>()
|
||||
, Worklet()
|
||||
, SecondaryFieldName("")
|
||||
{
|
||||
this->SetOutputFieldName("crossproduct");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
inline VTKM_CONT vtkm::filter::Result DotProduct::DoExecute(
|
||||
const vtkm::cont::DataSet& inDataSet,
|
||||
const vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType>& field,
|
||||
const vtkm::filter::FieldMetadata& fieldMetadata,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
|
||||
const DeviceAdapter&)
|
||||
{
|
||||
vtkm::cont::ArrayHandle<T, StorageType> outArray;
|
||||
|
||||
vtkm::worklet::DispatcherMapField<vtkm::worklet::DotProduct, DeviceAdapter> dispatcher(
|
||||
this->Worklet);
|
||||
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType> secondaryField;
|
||||
try
|
||||
{
|
||||
vtkm::filter::ApplyPolicy(inDataSet.GetField(SecondaryFieldName), policy)
|
||||
.CopyTo(secondaryField);
|
||||
}
|
||||
catch (const vtkm::cont::Error&)
|
||||
{
|
||||
return vtkm::filter::Result();
|
||||
}
|
||||
|
||||
dispatcher.Invoke(field, secondaryField, outArray);
|
||||
|
||||
return vtkm::filter::Result(inDataSet,
|
||||
outArray,
|
||||
this->GetOutputFieldName(),
|
||||
fieldMetadata.GetAssociation(),
|
||||
fieldMetadata.GetCellSetName());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
|
||||
inline VTKM_CONT bool DotProduct::DoMapField(vtkm::filter::Result& result,
|
||||
const vtkm::cont::ArrayHandle<T, StorageType>& input,
|
||||
const vtkm::filter::FieldMetadata& fieldMeta,
|
||||
const vtkm::filter::PolicyBase<DerivedPolicy>&,
|
||||
DeviceAdapter)
|
||||
{
|
||||
//we copy the input handle to the result dataset, reusing the metadata
|
||||
result.GetDataSet().AddField(fieldMeta.AsField(input));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} // namespace vtkm::filter
|
@ -24,6 +24,8 @@ set(unit_tests
|
||||
UnitTestClipWithFieldFilter.cxx
|
||||
UnitTestClipWithImplicitFunctionFilter.cxx
|
||||
UnitTestContourTreeUniformFilter.cxx
|
||||
UnitTestCrossProductFilter.cxx
|
||||
UnitTestDotProductFilter.cxx
|
||||
UnitTestEntropyFilter.cxx
|
||||
UnitTestExternalFacesFilter.cxx
|
||||
UnitTestExtractGeometryFilter.cxx
|
||||
|
156
vtkm/filter/testing/UnitTestCrossProductFilter.cxx
Normal file
156
vtkm/filter/testing/UnitTestCrossProductFilter.cxx
Normal file
@ -0,0 +1,156 @@
|
||||
//============================================================================
|
||||
// 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
|
||||
// Copyright 2014 UT-Battelle, LLC.
|
||||
// Copyright 2014 Los Alamos National Security.
|
||||
//
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
||||
// Laboratory (LANL), the U.S. Government retains certain rights in
|
||||
// this software.
|
||||
//============================================================================
|
||||
|
||||
#include <vtkm/cont/testing/MakeTestDataSet.h>
|
||||
#include <vtkm/cont/testing/Testing.h>
|
||||
#include <vtkm/filter/CrossProduct.h>
|
||||
|
||||
#include <random>
|
||||
#include <vector>
|
||||
|
||||
namespace
|
||||
{
|
||||
std::mt19937 randGenerator;
|
||||
|
||||
template <typename T>
|
||||
void createVectors(std::size_t numPts,
|
||||
int vecType,
|
||||
std::vector<vtkm::Vec<T, 3>>& vecs1,
|
||||
std::vector<vtkm::Vec<T, 3>>& vecs2)
|
||||
{
|
||||
if (vecType == 0) // X x Y
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
}
|
||||
else if (vecType == 1) // Y x Z
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
}
|
||||
else if (vecType == 2) // Z x X
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
}
|
||||
else if (vecType == 3) // Y x X
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
}
|
||||
else if (vecType == 4) // Z x Y
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
}
|
||||
else if (vecType == 5) // X x Z
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
}
|
||||
else if (vecType == 6)
|
||||
{
|
||||
//Test some other vector combinations
|
||||
std::uniform_real_distribution<vtkm::Float64> randomDist(-10.0, 10.0);
|
||||
randomDist(randGenerator);
|
||||
|
||||
vecs1.resize(numPts);
|
||||
vecs2.resize(numPts);
|
||||
for (std::size_t i = 0; i < numPts; i++)
|
||||
{
|
||||
vecs1[i] = vtkm::make_Vec(
|
||||
randomDist(randGenerator), randomDist(randGenerator), randomDist(randGenerator));
|
||||
vecs2[i] = vtkm::make_Vec(
|
||||
randomDist(randGenerator), randomDist(randGenerator), randomDist(randGenerator));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TestCrossProduct()
|
||||
{
|
||||
std::cout << "Testing CrossProduct Filter" << std::endl;
|
||||
|
||||
vtkm::cont::testing::MakeTestDataSet testDataSet;
|
||||
|
||||
const int numCases = 7;
|
||||
for (int i = 0; i < numCases; i++)
|
||||
{
|
||||
vtkm::cont::DataSet dataSet = testDataSet.Make3DUniformDataSet0();
|
||||
vtkm::Id nVerts = dataSet.GetCoordinateSystem(0).GetData().GetNumberOfValues();
|
||||
|
||||
std::vector<vtkm::Vec<vtkm::FloatDefault, 3>> vecs1, vecs2;
|
||||
createVectors(static_cast<std::size_t>(nVerts), i, vecs1, vecs2);
|
||||
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> field1, field2;
|
||||
field1 = vtkm::cont::make_ArrayHandle(vecs1);
|
||||
field2 = vtkm::cont::make_ArrayHandle(vecs2);
|
||||
|
||||
vtkm::cont::DataSetFieldAdd::AddPointField(dataSet, "vec1", field1);
|
||||
vtkm::cont::DataSetFieldAdd::AddPointField(dataSet, "vec2", field2);
|
||||
|
||||
vtkm::filter::Result result;
|
||||
vtkm::filter::CrossProduct filter;
|
||||
|
||||
filter.SetSecondaryFieldName("vec2");
|
||||
result = filter.Execute(dataSet, dataSet.GetField("vec1"));
|
||||
|
||||
VTKM_TEST_ASSERT(result.IsValid(), "Result should be valid");
|
||||
VTKM_TEST_ASSERT(result.GetField().GetName() == "crossproduct", "Output field has wrong name.");
|
||||
VTKM_TEST_ASSERT(result.GetField().GetAssociation() == vtkm::cont::Field::ASSOC_POINTS,
|
||||
"Output field has wrong association");
|
||||
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> outputArray;
|
||||
if (result.FieldAs(outputArray))
|
||||
{
|
||||
auto v1Portal = field1.GetPortalConstControl();
|
||||
auto v2Portal = field2.GetPortalConstControl();
|
||||
auto outPortal = outputArray.GetPortalConstControl();
|
||||
|
||||
for (vtkm::Id j = 0; j < outputArray.GetNumberOfValues(); j++)
|
||||
{
|
||||
vtkm::Vec<vtkm::FloatDefault, 3> v1 = v1Portal.Get(j);
|
||||
vtkm::Vec<vtkm::FloatDefault, 3> v2 = v2Portal.Get(j);
|
||||
vtkm::Vec<vtkm::FloatDefault, 3> res = outPortal.Get(j);
|
||||
|
||||
//Make sure result is orthogonal each input vector. Need to normalize to compare with zero.
|
||||
vtkm::Vec<vtkm::FloatDefault, 3> v1N(vtkm::Normal(v1)), v2N(vtkm::Normal(v1)),
|
||||
resN(vtkm::Normal(res));
|
||||
VTKM_TEST_ASSERT(test_equal(vtkm::dot(resN, v1N), vtkm::FloatDefault(0.0)),
|
||||
"Wrong result for cross product");
|
||||
VTKM_TEST_ASSERT(test_equal(vtkm::dot(resN, v2N), vtkm::FloatDefault(0.0)),
|
||||
"Wrong result for cross product");
|
||||
|
||||
vtkm::FloatDefault sinAngle =
|
||||
vtkm::Magnitude(res) * vtkm::RMagnitude(v1) * vtkm::RMagnitude(v2);
|
||||
vtkm::FloatDefault cosAngle =
|
||||
vtkm::dot(v1, v2) * vtkm::RMagnitude(v1) * vtkm::RMagnitude(v2);
|
||||
VTKM_TEST_ASSERT(
|
||||
test_equal(sinAngle * sinAngle + cosAngle * cosAngle, vtkm::FloatDefault(1.0)),
|
||||
"Bad cross product length.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int UnitTestCrossProductFilter(int, char* [])
|
||||
{
|
||||
return vtkm::cont::testing::Testing::Run(TestCrossProduct);
|
||||
}
|
142
vtkm/filter/testing/UnitTestDotProductFilter.cxx
Normal file
142
vtkm/filter/testing/UnitTestDotProductFilter.cxx
Normal file
@ -0,0 +1,142 @@
|
||||
//============================================================================
|
||||
// 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 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
|
||||
// Copyright 2014 UT-Battelle, LLC.
|
||||
// Copyright 2014 Los Alamos National Security.
|
||||
//
|
||||
// Under the terms of Contract DE-NA0003525 with NTESS,
|
||||
// the U.S. Government retains certain rights in this software.
|
||||
//
|
||||
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
||||
// Laboratory (LANL), the U.S. Government retains certain rights in
|
||||
// this software.
|
||||
//============================================================================
|
||||
|
||||
#include <vtkm/cont/testing/MakeTestDataSet.h>
|
||||
#include <vtkm/cont/testing/Testing.h>
|
||||
#include <vtkm/filter/DotProduct.h>
|
||||
|
||||
#include <random>
|
||||
#include <vector>
|
||||
|
||||
namespace
|
||||
{
|
||||
std::mt19937 randGenerator;
|
||||
|
||||
template <typename T>
|
||||
void createVectors(std::size_t numPts,
|
||||
int vecType,
|
||||
std::vector<vtkm::Vec<T, 3>>& vecs1,
|
||||
std::vector<vtkm::Vec<T, 3>>& vecs2)
|
||||
{
|
||||
if (vecType == 0) // X x Y
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
}
|
||||
else if (vecType == 1) // Y x Z
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
}
|
||||
else if (vecType == 2) // Z x X
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
}
|
||||
else if (vecType == 3) // Y x X
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
}
|
||||
else if (vecType == 4) // Z x Y
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 1, 0));
|
||||
}
|
||||
else if (vecType == 5) // X x Z
|
||||
{
|
||||
vecs1.resize(numPts, vtkm::make_Vec(1, 0, 0));
|
||||
vecs2.resize(numPts, vtkm::make_Vec(0, 0, 1));
|
||||
}
|
||||
else if (vecType == 6)
|
||||
{
|
||||
//Test some other vector combinations
|
||||
std::uniform_real_distribution<vtkm::Float64> randomDist(-10.0, 10.0);
|
||||
randomDist(randGenerator);
|
||||
|
||||
vecs1.resize(numPts);
|
||||
vecs2.resize(numPts);
|
||||
for (std::size_t i = 0; i < numPts; i++)
|
||||
{
|
||||
vecs1[i] = vtkm::make_Vec(
|
||||
randomDist(randGenerator), randomDist(randGenerator), randomDist(randGenerator));
|
||||
vecs2[i] = vtkm::make_Vec(
|
||||
randomDist(randGenerator), randomDist(randGenerator), randomDist(randGenerator));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TestDotProduct()
|
||||
{
|
||||
std::cout << "Testing DotProduct Filter" << std::endl;
|
||||
|
||||
vtkm::cont::testing::MakeTestDataSet testDataSet;
|
||||
|
||||
const int numCases = 7;
|
||||
for (int i = 0; i < numCases; i++)
|
||||
{
|
||||
vtkm::cont::DataSet dataSet = testDataSet.Make3DUniformDataSet0();
|
||||
vtkm::Id nVerts = dataSet.GetCoordinateSystem(0).GetData().GetNumberOfValues();
|
||||
|
||||
std::vector<vtkm::Vec<vtkm::FloatDefault, 3>> vecs1, vecs2;
|
||||
createVectors(static_cast<std::size_t>(nVerts), i, vecs1, vecs2);
|
||||
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::FloatDefault, 3>> field1, field2;
|
||||
field1 = vtkm::cont::make_ArrayHandle(vecs1);
|
||||
field2 = vtkm::cont::make_ArrayHandle(vecs2);
|
||||
|
||||
vtkm::cont::DataSetFieldAdd::AddPointField(dataSet, "vec1", field1);
|
||||
vtkm::cont::DataSetFieldAdd::AddPointField(dataSet, "vec2", field2);
|
||||
|
||||
vtkm::filter::Result result;
|
||||
vtkm::filter::DotProduct filter;
|
||||
|
||||
filter.SetSecondaryFieldName("vec2");
|
||||
result = filter.Execute(dataSet, dataSet.GetField("vec1"));
|
||||
|
||||
VTKM_TEST_ASSERT(result.IsValid(), "result should be valid");
|
||||
VTKM_TEST_ASSERT(result.GetField().GetName() == "crossproduct", "Output field has wrong name.");
|
||||
VTKM_TEST_ASSERT(result.GetField().GetAssociation() == vtkm::cont::Field::ASSOC_POINTS,
|
||||
"Output field has wrong association");
|
||||
|
||||
vtkm::cont::ArrayHandle<vtkm::FloatDefault> outputArray;
|
||||
if (result.FieldAs(outputArray))
|
||||
{
|
||||
auto v1Portal = field1.GetPortalConstControl();
|
||||
auto v2Portal = field2.GetPortalConstControl();
|
||||
auto outPortal = outputArray.GetPortalConstControl();
|
||||
|
||||
for (vtkm::Id j = 0; j < outputArray.GetNumberOfValues(); j++)
|
||||
{
|
||||
vtkm::Vec<vtkm::FloatDefault, 3> v1 = v1Portal.Get(j);
|
||||
vtkm::Vec<vtkm::FloatDefault, 3> v2 = v2Portal.Get(j);
|
||||
vtkm::FloatDefault res = outPortal.Get(j);
|
||||
|
||||
VTKM_TEST_ASSERT(test_equal(vtkm::dot(v1, v2), res), "Wrong result for dot product");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int UnitTestDotProductFilter(int, char* [])
|
||||
{
|
||||
return vtkm::cont::testing::Testing::Run(TestDotProduct);
|
||||
}
|
Loading…
Reference in New Issue
Block a user