mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-08 13:23:51 +00:00
Removed ExecutionWholeArray class
`ExecutionWholeArray` is an archaic class in VTK-m that is a thin wrapper around an array portal. In the early days of VTK-m, this class was used to transfer whole arrays to the execution environment. However, now the supported method is to use `WholeArray*` tags in the `ControlSignature` of a worklet. Nevertheless, the `WholeArray*` tags caused the array portal transferred to the worklet to be wrapped inside of an `ExecutionWholeArray` class. This is unnecessary and can cause confusion about the types of data being used. Most code is unaffected by this change. Some code that had to work around the issue of the portal wrapped in another class used the `GetPortal` method which is no longer needed (for obvious reasons). One extra feature that `ExecutionWholeArray` had was that it provided an subscript operator (somewhat incorrectly). Thus, any use of '[..]' to index the array portal have to be changed to use the `Get` method.
This commit is contained in:
parent
d694675027
commit
2945813755
@ -225,21 +225,30 @@ public:
|
|||||||
using ExecutionSignature = void(_1, _2, _3, _4);
|
using ExecutionSignature = void(_1, _2, _3, _4);
|
||||||
using InputDomain = _1;
|
using InputDomain = _1;
|
||||||
|
|
||||||
template <typename WeightType, typename T, typename S>
|
template <typename WeightType, typename PortalType, typename U>
|
||||||
VTKM_EXEC void operator()(const vtkm::Id2& low_high,
|
VTKM_EXEC void operator()(const vtkm::Id2& low_high,
|
||||||
const WeightType& weight,
|
const WeightType& weight,
|
||||||
const vtkm::exec::ExecutionWholeArrayConst<T, S>& inPortal,
|
const PortalType& inPortal,
|
||||||
T& result) const
|
U& result) const
|
||||||
|
{
|
||||||
|
using T = typename PortalType::ValueType;
|
||||||
|
this->DoIt(low_high, weight, inPortal, result, typename std::is_same<T, U>::type{});
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename WeightType, typename PortalType>
|
||||||
|
VTKM_EXEC void DoIt(const vtkm::Id2& low_high,
|
||||||
|
const WeightType& weight,
|
||||||
|
const PortalType& inPortal,
|
||||||
|
typename PortalType::ValueType& result,
|
||||||
|
std::true_type) const
|
||||||
{
|
{
|
||||||
//fetch the low / high values from inPortal
|
//fetch the low / high values from inPortal
|
||||||
result = vtkm::Lerp(inPortal.Get(low_high[0]), inPortal.Get(low_high[1]), weight);
|
result = vtkm::Lerp(inPortal.Get(low_high[0]), inPortal.Get(low_high[1]), weight);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename WeightType, typename T, typename S, typename U>
|
template <typename WeightType, typename PortalType, typename U>
|
||||||
VTKM_EXEC void operator()(const vtkm::Id2&,
|
VTKM_EXEC void DoIt(const vtkm::Id2&, const WeightType&, const PortalType&, U&, std::false_type)
|
||||||
const WeightType&,
|
const
|
||||||
const vtkm::exec::ExecutionWholeArrayConst<T, S>&,
|
|
||||||
U&) const
|
|
||||||
{
|
{
|
||||||
//the inPortal and result need to be the same type so this version only
|
//the inPortal and result need to be the same type so this version only
|
||||||
//exists to generate code when using dynamic arrays
|
//exists to generate code when using dynamic arrays
|
||||||
|
18
docs/changelog/no-execution-whole-array.md
Normal file
18
docs/changelog/no-execution-whole-array.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Removed ExecutionWholeArray class
|
||||||
|
|
||||||
|
`ExecutionWholeArray` is an archaic class in VTK-m that is a thin wrapper
|
||||||
|
around an array portal. In the early days of VTK-m, this class was used to
|
||||||
|
transfer whole arrays to the execution environment. However, now the
|
||||||
|
supported method is to use `WholeArray*` tags in the `ControlSignature` of
|
||||||
|
a worklet.
|
||||||
|
|
||||||
|
Nevertheless, the `WholeArray*` tags caused the array portal transferred to
|
||||||
|
the worklet to be wrapped inside of an `ExecutionWholeArray` class. This
|
||||||
|
is unnecessary and can cause confusion about the types of data being used.
|
||||||
|
|
||||||
|
Most code is unaffected by this change. Some code that had to work around
|
||||||
|
the issue of the portal wrapped in another class used the `GetPortal`
|
||||||
|
method which is no longer needed (for obvious reasons). One extra feature
|
||||||
|
that `ExecutionWholeArray` had was that it provided an subscript operator
|
||||||
|
(somewhat incorrectly). Thus, any use of '[..]' to index the array portal
|
||||||
|
have to be changed to use the `Get` method.
|
@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
#include <vtkm/cont/arg/Transport.h>
|
#include <vtkm/cont/arg/Transport.h>
|
||||||
|
|
||||||
#include <vtkm/exec/ExecutionWholeArray.h>
|
|
||||||
|
|
||||||
namespace vtkm
|
namespace vtkm
|
||||||
{
|
{
|
||||||
namespace cont
|
namespace cont
|
||||||
@ -56,7 +54,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayIn, ContObjectType, Devi
|
|||||||
using ValueType = typename ContObjectType::ValueType;
|
using ValueType = typename ContObjectType::ValueType;
|
||||||
using StorageTag = typename ContObjectType::StorageTag;
|
using StorageTag = typename ContObjectType::StorageTag;
|
||||||
|
|
||||||
using ExecObjectType = vtkm::exec::ExecutionWholeArrayConst<ValueType, StorageTag>;
|
using ExecObjectType = typename ContObjectType::ReadPortalType;
|
||||||
|
|
||||||
template <typename InputDomainType>
|
template <typename InputDomainType>
|
||||||
VTKM_CONT ExecObjectType operator()(ContObjectType& array,
|
VTKM_CONT ExecObjectType operator()(ContObjectType& array,
|
||||||
@ -69,7 +67,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayIn, ContObjectType, Devi
|
|||||||
// array might not have the same size depending on how the user is using
|
// array might not have the same size depending on how the user is using
|
||||||
// the array.
|
// the array.
|
||||||
|
|
||||||
return ExecObjectType(array, Device{}, token);
|
return array.PrepareForInput(Device{}, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VTKM_MSVC
|
#ifdef VTKM_MSVC
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
#include <vtkm/cont/arg/Transport.h>
|
#include <vtkm/cont/arg/Transport.h>
|
||||||
|
|
||||||
#include <vtkm/exec/ExecutionWholeArray.h>
|
|
||||||
|
|
||||||
namespace vtkm
|
namespace vtkm
|
||||||
{
|
{
|
||||||
namespace cont
|
namespace cont
|
||||||
@ -58,7 +56,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayInOut, ContObjectType, D
|
|||||||
using ValueType = typename ContObjectType::ValueType;
|
using ValueType = typename ContObjectType::ValueType;
|
||||||
using StorageTag = typename ContObjectType::StorageTag;
|
using StorageTag = typename ContObjectType::StorageTag;
|
||||||
|
|
||||||
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag>;
|
using ExecObjectType = typename ContObjectType::WritePortalType;
|
||||||
|
|
||||||
template <typename InputDomainType>
|
template <typename InputDomainType>
|
||||||
VTKM_CONT ExecObjectType operator()(ContObjectType& array,
|
VTKM_CONT ExecObjectType operator()(ContObjectType& array,
|
||||||
@ -71,7 +69,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayInOut, ContObjectType, D
|
|||||||
// array might not have the same size depending on how the user is using
|
// array might not have the same size depending on how the user is using
|
||||||
// the array.
|
// the array.
|
||||||
|
|
||||||
return ExecObjectType(array, Device{}, token);
|
return array.PrepareForInPlace(Device{}, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VTKM_MSVC
|
#ifdef VTKM_MSVC
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
#include <vtkm/cont/arg/Transport.h>
|
#include <vtkm/cont/arg/Transport.h>
|
||||||
|
|
||||||
#include <vtkm/exec/ExecutionWholeArray.h>
|
|
||||||
|
|
||||||
namespace vtkm
|
namespace vtkm
|
||||||
{
|
{
|
||||||
namespace cont
|
namespace cont
|
||||||
@ -58,7 +56,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayOut, ContObjectType, Dev
|
|||||||
using ValueType = typename ContObjectType::ValueType;
|
using ValueType = typename ContObjectType::ValueType;
|
||||||
using StorageTag = typename ContObjectType::StorageTag;
|
using StorageTag = typename ContObjectType::StorageTag;
|
||||||
|
|
||||||
using ExecObjectType = vtkm::exec::ExecutionWholeArray<ValueType, StorageTag>;
|
using ExecObjectType = typename ContObjectType::WritePortalType;
|
||||||
|
|
||||||
template <typename InputDomainType>
|
template <typename InputDomainType>
|
||||||
VTKM_CONT ExecObjectType operator()(ContObjectType& array,
|
VTKM_CONT ExecObjectType operator()(ContObjectType& array,
|
||||||
@ -71,7 +69,7 @@ struct Transport<vtkm::cont::arg::TransportTagWholeArrayOut, ContObjectType, Dev
|
|||||||
// array might not have the same size depending on how the user is using
|
// array might not have the same size depending on how the user is using
|
||||||
// the array.
|
// the array.
|
||||||
|
|
||||||
return ExecObjectType(array, array.GetNumberOfValues(), Device{}, token);
|
return array.PrepareForOutput(array.GetNumberOfValues(), Device{}, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VTKM_MSVC
|
#ifdef VTKM_MSVC
|
||||||
|
@ -103,7 +103,7 @@ public:
|
|||||||
{
|
{
|
||||||
// Note that CoordPortalType is actually a RectilinearPortalType wrapped in an
|
// Note that CoordPortalType is actually a RectilinearPortalType wrapped in an
|
||||||
// ExecutionWholeArrayConst. We need to get out the actual portal.
|
// ExecutionWholeArrayConst. We need to get out the actual portal.
|
||||||
vtkm::Id calculated = CalculateCellId(pointIn, coordsPortal.GetPortal());
|
vtkm::Id calculated = CalculateCellId(pointIn, coordsPortal);
|
||||||
vtkm::ErrorCode status = locator.FindCell(pointIn, cellId, parametric);
|
vtkm::ErrorCode status = locator.FindCell(pointIn, cellId, parametric);
|
||||||
if (status != vtkm::ErrorCode::Success)
|
if (status != vtkm::ErrorCode::Success)
|
||||||
{
|
{
|
||||||
|
@ -27,7 +27,6 @@ set(headers
|
|||||||
ConnectivityExtrude.h
|
ConnectivityExtrude.h
|
||||||
ConnectivityPermuted.h
|
ConnectivityPermuted.h
|
||||||
ConnectivityStructured.h
|
ConnectivityStructured.h
|
||||||
ExecutionWholeArray.h
|
|
||||||
FieldNeighborhood.h
|
FieldNeighborhood.h
|
||||||
FunctorBase.h
|
FunctorBase.h
|
||||||
ParametricCoordinates.h
|
ParametricCoordinates.h
|
||||||
|
@ -1,191 +0,0 @@
|
|||||||
//============================================================================
|
|
||||||
// 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.
|
|
||||||
//============================================================================
|
|
||||||
#ifndef vtk_m_exec_ExecutionWholeArray_h
|
|
||||||
#define vtk_m_exec_ExecutionWholeArray_h
|
|
||||||
|
|
||||||
#include <vtkm/cont/ArrayHandle.h>
|
|
||||||
#include <vtkm/cont/DeviceAdapter.h>
|
|
||||||
|
|
||||||
#include <vtkm/Deprecated.h>
|
|
||||||
|
|
||||||
namespace vtkm
|
|
||||||
{
|
|
||||||
namespace exec
|
|
||||||
{
|
|
||||||
|
|
||||||
/// The following classes have been sort of deprecated and are meant to be used
|
|
||||||
/// internally only. Please use the \c WholeArrayIn, \c WholeArrayOut, and
|
|
||||||
/// \c WholeArrayInOut \c ControlSignature tags instead.
|
|
||||||
|
|
||||||
/// \c ExecutionWholeArray is an execution object that allows an array handle
|
|
||||||
/// content to be a parameter in an execution environment
|
|
||||||
/// function. This can be used to allow worklets to have a shared search
|
|
||||||
/// structure.
|
|
||||||
///
|
|
||||||
template <typename T, typename StorageTag, typename... MaybeDevice>
|
|
||||||
class ExecutionWholeArray;
|
|
||||||
|
|
||||||
template <typename T, typename StorageTag>
|
|
||||||
class ExecutionWholeArray<T, StorageTag>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using ValueType = T;
|
|
||||||
using HandleType = vtkm::cont::ArrayHandle<T, StorageTag>;
|
|
||||||
using PortalType = typename HandleType::WritePortalType;
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArray()
|
|
||||||
: Portal()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArray(HandleType& handle,
|
|
||||||
vtkm::cont::DeviceAdapterId device,
|
|
||||||
vtkm::cont::Token& token)
|
|
||||||
: Portal(handle.PrepareForInPlace(device, token))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArray(HandleType& handle,
|
|
||||||
vtkm::Id length,
|
|
||||||
vtkm::cont::DeviceAdapterId device,
|
|
||||||
vtkm::cont::Token& token)
|
|
||||||
: Portal(handle.PrepareForOutput(length, device, token))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
vtkm::Id GetNumberOfValues() const { return this->Portal.GetNumberOfValues(); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
T Get(vtkm::Id index) const { return this->Portal.Get(index); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
T operator[](vtkm::Id index) const { return this->Portal.Get(index); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
void Set(vtkm::Id index, const T& t) const { this->Portal.Set(index, t); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
const PortalType& GetPortal() const { return this->Portal; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
PortalType Portal;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename StorageTag, typename Device>
|
|
||||||
class VTKM_DEPRECATED(1.6, "ExecutionWholeArray no longer uses Device template parameter.")
|
|
||||||
ExecutionWholeArray<T, StorageTag, Device> : public ExecutionWholeArray<T, StorageTag>
|
|
||||||
{
|
|
||||||
using Superclass = ExecutionWholeArray<T, StorageTag>;
|
|
||||||
using HandleType = typename Superclass::HandleType;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using Superclass::Superclass;
|
|
||||||
|
|
||||||
VTKM_CONT ExecutionWholeArray(HandleType& handle)
|
|
||||||
: Superclass(handle, Device{}, vtkm::cont::Token{})
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArray(HandleType& handle, vtkm::Id length)
|
|
||||||
: Superclass(handle, length, Device{}, vtkm::cont::Token{})
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArray(HandleType& handle, vtkm::cont::Token& token)
|
|
||||||
: Superclass(handle, Device{}, token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArray(HandleType& handle, vtkm::Id length, vtkm::cont::Token& token)
|
|
||||||
: Superclass(handle, length, Device{}, token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// \c ExecutionWholeArrayConst is an execution object that allows an array handle
|
|
||||||
/// content to be a parameter in an execution environment
|
|
||||||
/// function. This can be used to allow worklets to have a shared search
|
|
||||||
/// structure
|
|
||||||
///
|
|
||||||
template <typename T, typename StorageTag, typename... MaybeDevice>
|
|
||||||
class ExecutionWholeArrayConst;
|
|
||||||
|
|
||||||
template <typename T, typename StorageTag>
|
|
||||||
class ExecutionWholeArrayConst<T, StorageTag>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using ValueType = T;
|
|
||||||
using HandleType = vtkm::cont::ArrayHandle<T, StorageTag>;
|
|
||||||
using PortalType = typename HandleType::ReadPortalType;
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArrayConst()
|
|
||||||
: Portal()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArrayConst(const HandleType& handle,
|
|
||||||
vtkm::cont::DeviceAdapterId device,
|
|
||||||
vtkm::cont::Token& token)
|
|
||||||
: Portal(handle.PrepareForInput(device, token))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
vtkm::Id GetNumberOfValues() const { return this->Portal.GetNumberOfValues(); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
T Get(vtkm::Id index) const { return this->Portal.Get(index); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
T operator[](vtkm::Id index) const { return this->Portal.Get(index); }
|
|
||||||
|
|
||||||
VTKM_EXEC
|
|
||||||
const PortalType& GetPortal() const { return this->Portal; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
PortalType Portal;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename StorageTag, typename Device>
|
|
||||||
class VTKM_DEPRECATED(1.6, "ExecutionWholeArray no longer uses Device template parameter.")
|
|
||||||
ExecutionWholeArrayConst<T, StorageTag, Device> : public ExecutionWholeArrayConst<T, StorageTag>
|
|
||||||
{
|
|
||||||
using Superclass = ExecutionWholeArrayConst<T, StorageTag>;
|
|
||||||
using HandleType = typename Superclass::HandleType;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using Superclass::Superclass;
|
|
||||||
|
|
||||||
VTKM_CONT ExecutionWholeArrayConst(HandleType& handle)
|
|
||||||
: Superclass(handle, Device{}, vtkm::cont::Token{})
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
VTKM_CONT
|
|
||||||
ExecutionWholeArrayConst(HandleType& handle, vtkm::cont::Token& token)
|
|
||||||
: Superclass(handle, Device{}, token)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
} // namespace vtkm::exec
|
|
||||||
|
|
||||||
#endif //vtk_m_exec_ExecutionWholeArray_h
|
|
@ -271,8 +271,8 @@ public:
|
|||||||
{
|
{
|
||||||
for (vtkm::IdComponent iter = pointCount - 1; iter >= 0; iter--)
|
for (vtkm::IdComponent iter = pointCount - 1; iter >= 0; iter--)
|
||||||
{
|
{
|
||||||
if (static_cast<vtkm::Float64>(prevVals[valPositionStart + iter]) <=
|
if (static_cast<vtkm::Float64>(prevVals.Get(valPositionStart + iter)) <=
|
||||||
static_cast<vtkm::Float64>(newVals[valPositionStart + iter]))
|
static_cast<vtkm::Float64>(newVals.Get(valPositionStart + iter)))
|
||||||
{
|
{
|
||||||
caseId++;
|
caseId++;
|
||||||
}
|
}
|
||||||
@ -548,11 +548,12 @@ public:
|
|||||||
// need to swap the weight of the point to be A-C / ((D-C) - (B-A)),
|
// need to swap the weight of the point to be A-C / ((D-C) - (B-A)),
|
||||||
// where A and C are edge0 mats 1 and 2, and B and D are edge1 mats 1 and 2.
|
// where A and C are edge0 mats 1 and 2, and B and D are edge1 mats 1 and 2.
|
||||||
ei.Weight = vtkm::Float64(1) +
|
ei.Weight = vtkm::Float64(1) +
|
||||||
((static_cast<vtkm::Float64>(curScalars[valPositionStart + edge[0]] -
|
((static_cast<vtkm::Float64>(curScalars.Get(valPositionStart + edge[0]) -
|
||||||
newScalars[valPositionStart + edge[0]])) /
|
newScalars.Get(valPositionStart + edge[0]))) /
|
||||||
static_cast<vtkm::Float64>(
|
static_cast<vtkm::Float64>(curScalars.Get(valPositionStart + edge[1]) -
|
||||||
curScalars[valPositionStart + edge[1]] - curScalars[valPositionStart + edge[0]] +
|
curScalars.Get(valPositionStart + edge[0]) +
|
||||||
newScalars[valPositionStart + edge[0]] - newScalars[valPositionStart + edge[1]]));
|
newScalars.Get(valPositionStart + edge[0]) -
|
||||||
|
newScalars.Get(valPositionStart + edge[1])));
|
||||||
|
|
||||||
inCellEdgeReverseConnectivity.Set(inCellEdgeInterpIndex, inCellInterpPointIndex);
|
inCellEdgeReverseConnectivity.Set(inCellEdgeInterpIndex, inCellInterpPointIndex);
|
||||||
inCellEdgeInterpolation.Set(inCellEdgeInterpIndex, ei);
|
inCellEdgeInterpolation.Set(inCellEdgeInterpIndex, ei);
|
||||||
@ -609,11 +610,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
ei.Weight = vtkm::Float64(1) +
|
ei.Weight = vtkm::Float64(1) +
|
||||||
((static_cast<vtkm::Float64>(curScalars[valPositionStart + edge[0]] -
|
((static_cast<vtkm::Float64>(curScalars.Get(valPositionStart + edge[0]) -
|
||||||
newScalars[valPositionStart + edge[0]])) /
|
newScalars.Get(valPositionStart + edge[0]))) /
|
||||||
static_cast<vtkm::Float64>(
|
static_cast<vtkm::Float64>(curScalars.Get(valPositionStart + edge[1]) -
|
||||||
curScalars[valPositionStart + edge[1]] - curScalars[valPositionStart + edge[0]] +
|
curScalars.Get(valPositionStart + edge[0]) +
|
||||||
newScalars[valPositionStart + edge[0]] - newScalars[valPositionStart + edge[1]]));
|
newScalars.Get(valPositionStart + edge[0]) -
|
||||||
|
newScalars.Get(valPositionStart + edge[1])));
|
||||||
//Add to set of new edge points
|
//Add to set of new edge points
|
||||||
//Add reverse connectivity;
|
//Add reverse connectivity;
|
||||||
edgePointReverseConnectivity.Set(edgeIndex, connectivityIndex++);
|
edgePointReverseConnectivity.Set(edgeIndex, connectivityIndex++);
|
||||||
|
@ -103,7 +103,7 @@ public:
|
|||||||
vtkm::IdComponent caseNumber = 0;
|
vtkm::IdComponent caseNumber = 0;
|
||||||
for (vtkm::IdComponent j = 0; j < numVerticesPerCell; ++j)
|
for (vtkm::IdComponent j = 0; j < numVerticesPerCell; ++j)
|
||||||
{
|
{
|
||||||
caseNumber |= (fieldIn[j] > isovalues[i]) << j;
|
caseNumber |= (fieldIn[j] > isovalues.Get(i)) << j;
|
||||||
}
|
}
|
||||||
|
|
||||||
sum += classifyTable.GetNumTriangles(shape.Id, caseNumber);
|
sum += classifyTable.GetNumTriangles(shape.Id, caseNumber);
|
||||||
@ -239,7 +239,7 @@ public:
|
|||||||
|
|
||||||
for (i = 0; i < numIsoValues; ++i)
|
for (i = 0; i < numIsoValues; ++i)
|
||||||
{
|
{
|
||||||
const FieldType ivalue = isovalues[i];
|
const FieldType ivalue = isovalues.Get(i);
|
||||||
// Compute the Marching Cubes case number for this cell. We need to iterate
|
// Compute the Marching Cubes case number for this cell. We need to iterate
|
||||||
// the isovalues until the sum >= our visit index. But we need to make
|
// the isovalues until the sum >= our visit index. But we need to make
|
||||||
// sure the caseNumber is correct before stopping
|
// sure the caseNumber is correct before stopping
|
||||||
@ -275,7 +275,8 @@ public:
|
|||||||
outputPointId + triVertex,
|
outputPointId + triVertex,
|
||||||
vtkm::Id2(indices[edgeVertices.first], indices[edgeVertices.second]));
|
vtkm::Id2(indices[edgeVertices.first], indices[edgeVertices.second]));
|
||||||
|
|
||||||
vtkm::FloatDefault interpolant = static_cast<vtkm::FloatDefault>(isovalues[i] - fieldValue0) /
|
vtkm::FloatDefault interpolant =
|
||||||
|
static_cast<vtkm::FloatDefault>(isovalues.Get(i) - fieldValue0) /
|
||||||
static_cast<vtkm::FloatDefault>(fieldValue1 - fieldValue0);
|
static_cast<vtkm::FloatDefault>(fieldValue1 - fieldValue0);
|
||||||
|
|
||||||
metaData.InterpWeightsPortal.Set(outputPointId + triVertex, interpolant);
|
metaData.InterpWeightsPortal.Set(outputPointId + triVertex, interpolant);
|
||||||
@ -448,10 +449,8 @@ public:
|
|||||||
vtkm::exec::arg::ThreadIndicesPointNeighborhood tpn(pointId, pointId, 0, pointId, pointGeom);
|
vtkm::exec::arg::ThreadIndicesPointNeighborhood tpn(pointId, pointId, 0, pointId, pointGeom);
|
||||||
|
|
||||||
const auto& boundary = tpn.GetBoundaryState();
|
const auto& boundary = tpn.GetBoundaryState();
|
||||||
auto pointPortal = pointCoordinates.GetPortal();
|
vtkm::exec::FieldNeighborhood<WholeCoordinatesIn> points(pointCoordinates, boundary);
|
||||||
auto fieldPortal = inputField.GetPortal();
|
vtkm::exec::FieldNeighborhood<WholeFieldIn> field(inputField, boundary);
|
||||||
vtkm::exec::FieldNeighborhood<decltype(pointPortal)> points(pointPortal, boundary);
|
|
||||||
vtkm::exec::FieldNeighborhood<decltype(fieldPortal)> field(fieldPortal, boundary);
|
|
||||||
|
|
||||||
vtkm::worklet::gradient::StructuredPointGradient gradient;
|
vtkm::worklet::gradient::StructuredPointGradient gradient;
|
||||||
gradient(boundary, points, field, normal);
|
gradient(boundary, points, field, normal);
|
||||||
@ -530,10 +529,8 @@ public:
|
|||||||
vtkm::exec::arg::ThreadIndicesPointNeighborhood tpn(pointId, pointId, 0, pointId, pointGeom);
|
vtkm::exec::arg::ThreadIndicesPointNeighborhood tpn(pointId, pointId, 0, pointId, pointGeom);
|
||||||
|
|
||||||
const auto& boundary = tpn.GetBoundaryState();
|
const auto& boundary = tpn.GetBoundaryState();
|
||||||
auto pointPortal = pointCoordinates.GetPortal();
|
vtkm::exec::FieldNeighborhood<WholeCoordinatesIn> points(pointCoordinates, boundary);
|
||||||
auto fieldPortal = inputField.GetPortal();
|
vtkm::exec::FieldNeighborhood<WholeFieldIn> field(inputField, boundary);
|
||||||
vtkm::exec::FieldNeighborhood<decltype(pointPortal)> points(pointPortal, boundary);
|
|
||||||
vtkm::exec::FieldNeighborhood<decltype(fieldPortal)> field(fieldPortal, boundary);
|
|
||||||
|
|
||||||
vtkm::worklet::gradient::StructuredPointGradient gradient;
|
vtkm::worklet::gradient::StructuredPointGradient gradient;
|
||||||
NormalType grad1;
|
NormalType grad1;
|
||||||
|
@ -109,15 +109,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Compute points inside cell bounds
|
// Compute points inside cell bounds
|
||||||
auto portal = points.GetPortal();
|
|
||||||
auto minp =
|
auto minp =
|
||||||
static_cast<vtkm::Id3>(vtkm::Ceil((cbmin - portal.GetOrigin()) / portal.GetSpacing()));
|
static_cast<vtkm::Id3>(vtkm::Ceil((cbmin - points.GetOrigin()) / points.GetSpacing()));
|
||||||
auto maxp =
|
auto maxp =
|
||||||
static_cast<vtkm::Id3>(vtkm::Floor((cbmax - portal.GetOrigin()) / portal.GetSpacing()));
|
static_cast<vtkm::Id3>(vtkm::Floor((cbmax - points.GetOrigin()) / points.GetSpacing()));
|
||||||
|
|
||||||
// clamp
|
// clamp
|
||||||
minp = vtkm::Max(minp, vtkm::Id3(0));
|
minp = vtkm::Max(minp, vtkm::Id3(0));
|
||||||
maxp = vtkm::Min(maxp, portal.GetDimensions() - vtkm::Id3(1));
|
maxp = vtkm::Min(maxp, points.GetDimensions() - vtkm::Id3(1));
|
||||||
|
|
||||||
for (vtkm::Id k = minp[2]; k <= maxp[2]; ++k)
|
for (vtkm::Id k = minp[2]; k <= maxp[2]; ++k)
|
||||||
{
|
{
|
||||||
@ -125,13 +124,13 @@ public:
|
|||||||
{
|
{
|
||||||
for (vtkm::Id i = minp[0]; i <= maxp[0]; ++i)
|
for (vtkm::Id i = minp[0]; i <= maxp[0]; ++i)
|
||||||
{
|
{
|
||||||
auto pt = portal.Get(vtkm::Id3(i, j, k));
|
auto pt = points.Get(vtkm::Id3(i, j, k));
|
||||||
CoordsType pc;
|
CoordsType pc;
|
||||||
vtkm::ErrorCode status =
|
vtkm::ErrorCode status =
|
||||||
vtkm::exec::WorldCoordinatesToParametricCoordinates(cellPoints, pt, cellShape, pc);
|
vtkm::exec::WorldCoordinatesToParametricCoordinates(cellPoints, pt, cellShape, pc);
|
||||||
if ((status == vtkm::ErrorCode::Success) && vtkm::exec::CellInside(pc, cellShape))
|
if ((status == vtkm::ErrorCode::Success) && vtkm::exec::CellInside(pc, cellShape))
|
||||||
{
|
{
|
||||||
auto pointId = i + portal.GetDimensions()[0] * (j + portal.GetDimensions()[1] * k);
|
auto pointId = i + points.GetDimensions()[0] * (j + points.GetDimensions()[1] * k);
|
||||||
cellIds.Set(pointId, cellId);
|
cellIds.Set(pointId, cellId);
|
||||||
pcoords.Set(pointId, pc);
|
pcoords.Set(pointId, pc);
|
||||||
}
|
}
|
||||||
|
@ -148,14 +148,14 @@ public:
|
|||||||
if (hyperID == NumHypernodes - 1)
|
if (hyperID == NumHypernodes - 1)
|
||||||
rightSupernodeID = NumSupernodes - 1;
|
rightSupernodeID = NumSupernodes - 1;
|
||||||
else
|
else
|
||||||
rightSupernodeID = treeFirstSuperchildPortal[hyperID + 1] - 1;
|
rightSupernodeID = treeFirstSuperchildPortal.Get(hyperID + 1) - 1;
|
||||||
} // join graph
|
} // join graph
|
||||||
else
|
else
|
||||||
{ // split graph
|
{ // split graph
|
||||||
if (hyperID == 0)
|
if (hyperID == 0)
|
||||||
rightSupernodeID = NumSupernodes - 1;
|
rightSupernodeID = NumSupernodes - 1;
|
||||||
else
|
else
|
||||||
rightSupernodeID = treeFirstSuperchildPortal[hyperID - 1] - 1;
|
rightSupernodeID = treeFirstSuperchildPortal.Get(hyperID - 1) - 1;
|
||||||
} // split graph
|
} // split graph
|
||||||
|
|
||||||
// the right end is guaranteed to be the hypernode at the top, which is not
|
// the right end is guaranteed to be the hypernode at the top, which is not
|
||||||
@ -164,7 +164,7 @@ public:
|
|||||||
while (leftSupernodeID != rightSupernodeID - 1)
|
while (leftSupernodeID != rightSupernodeID - 1)
|
||||||
{ // binary search
|
{ // binary search
|
||||||
vtkm::Id midSupernodeID = (leftSupernodeID + rightSupernodeID) / 2;
|
vtkm::Id midSupernodeID = (leftSupernodeID + rightSupernodeID) / 2;
|
||||||
vtkm::Id midNodeID = treeSupernodesPortal[midSupernodeID];
|
vtkm::Id midNodeID = treeSupernodesPortal.Get(midSupernodeID);
|
||||||
// this is NEVER equal, because nodeID cannot be a supernode
|
// this is NEVER equal, because nodeID cannot be a supernode
|
||||||
if (IsJoinGraph ? (midNodeID > nodeID) : (midNodeID < nodeID))
|
if (IsJoinGraph ? (midNodeID > nodeID) : (midNodeID < nodeID))
|
||||||
rightSupernodeID = midSupernodeID;
|
rightSupernodeID = midSupernodeID;
|
||||||
|
@ -53,7 +53,6 @@
|
|||||||
#ifndef vtk_m_worklet_contourtree_augmented_pointer_doubling_h
|
#ifndef vtk_m_worklet_contourtree_augmented_pointer_doubling_h
|
||||||
#define vtk_m_worklet_contourtree_augmented_pointer_doubling_h
|
#define vtk_m_worklet_contourtree_augmented_pointer_doubling_h
|
||||||
|
|
||||||
#include <vtkm/exec/ExecutionWholeArray.h>
|
|
||||||
#include <vtkm/filter/scalar_topology/worklet/contourtree_augmented/Types.h>
|
#include <vtkm/filter/scalar_topology/worklet/contourtree_augmented/Types.h>
|
||||||
#include <vtkm/worklet/WorkletMapField.h>
|
#include <vtkm/worklet/WorkletMapField.h>
|
||||||
|
|
||||||
|
@ -128,26 +128,17 @@ private:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//This is fairly complex so that we can trigger code to extract
|
|
||||||
//VecRectilinearPointCoordinates when using structured connectivity, and
|
|
||||||
//uniform point coordinates.
|
|
||||||
//c++14 would make the return type simply auto
|
|
||||||
template <typename ThreadIndicesType, typename WholeFieldIn>
|
template <typename ThreadIndicesType, typename WholeFieldIn>
|
||||||
VTKM_EXEC auto GetValues(const ThreadIndicesType& indices, const WholeFieldIn& in) const
|
VTKM_EXEC auto GetValues(const ThreadIndicesType& indices, const WholeFieldIn& in) const
|
||||||
-> decltype(std::declval<vtkm::exec::arg::Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
|
|
||||||
vtkm::exec::arg::AspectTagDefault,
|
|
||||||
typename WholeFieldIn::PortalType>>()
|
|
||||||
.Load(indices, in.GetPortal()))
|
|
||||||
{
|
{
|
||||||
//the current problem is that when the topology is structured
|
//the current problem is that when the topology is structured
|
||||||
//we are passing in an vtkm::Id when it wants a Id2 or an Id3 that
|
//we are passing in an vtkm::Id when it wants a Id2 or an Id3 that
|
||||||
//represents the flat index of the topology
|
//represents the flat index of the topology
|
||||||
using ExecObjectType = typename WholeFieldIn::PortalType;
|
|
||||||
using Fetch = vtkm::exec::arg::Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
|
using Fetch = vtkm::exec::arg::Fetch<vtkm::exec::arg::FetchTagArrayTopologyMapIn,
|
||||||
vtkm::exec::arg::AspectTagDefault,
|
vtkm::exec::arg::AspectTagDefault,
|
||||||
ExecObjectType>;
|
WholeFieldIn>;
|
||||||
Fetch fetch;
|
Fetch fetch;
|
||||||
return fetch.Load(indices, in.GetPortal());
|
return fetch.Load(indices, in);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -46,14 +46,15 @@ struct PerlinNoiseWorklet : public vtkm::worklet::WorkletVisitPointsWithCells
|
|||||||
vtkm::FloatDefault w = this->Fade(zf);
|
vtkm::FloatDefault w = this->Fade(zf);
|
||||||
|
|
||||||
vtkm::Id aaa, aba, aab, abb, baa, bba, bab, bbb;
|
vtkm::Id aaa, aba, aab, abb, baa, bba, bab, bbb;
|
||||||
aaa = perms[perms[perms[xi] + yi] + zi];
|
aaa = perms.Get(perms.Get(perms.Get(xi) + yi) + zi);
|
||||||
aba = perms[perms[perms[xi] + this->Increment(yi)] + zi];
|
aba = perms.Get(perms.Get(perms.Get(xi) + this->Increment(yi)) + zi);
|
||||||
aab = perms[perms[perms[xi] + yi] + this->Increment(zi)];
|
aab = perms.Get(perms.Get(perms.Get(xi) + yi) + this->Increment(zi));
|
||||||
abb = perms[perms[perms[xi] + this->Increment(yi)] + this->Increment(zi)];
|
abb = perms.Get(perms.Get(perms.Get(xi) + this->Increment(yi)) + this->Increment(zi));
|
||||||
baa = perms[perms[perms[this->Increment(xi)] + yi] + zi];
|
baa = perms.Get(perms.Get(perms.Get(this->Increment(xi)) + yi) + zi);
|
||||||
bba = perms[perms[perms[this->Increment(xi)] + this->Increment(yi)] + zi];
|
bba = perms.Get(perms.Get(perms.Get(this->Increment(xi)) + this->Increment(yi)) + zi);
|
||||||
bab = perms[perms[perms[this->Increment(xi)] + yi] + this->Increment(zi)];
|
bab = perms.Get(perms.Get(perms.Get(this->Increment(xi)) + yi) + this->Increment(zi));
|
||||||
bbb = perms[perms[perms[this->Increment(xi)] + this->Increment(yi)] + this->Increment(zi)];
|
bbb = perms.Get(perms.Get(perms.Get(this->Increment(xi)) + this->Increment(yi)) +
|
||||||
|
this->Increment(zi));
|
||||||
|
|
||||||
vtkm::FloatDefault x1, x2, y1, y2;
|
vtkm::FloatDefault x1, x2, y1, y2;
|
||||||
x1 = vtkm::Lerp(this->Gradient(aaa, xf, yf, zf), this->Gradient(baa, xf - 1, yf, zf), u);
|
x1 = vtkm::Lerp(this->Gradient(aaa, xf, yf, zf), this->Gradient(baa, xf - 1, yf, zf), u);
|
||||||
|
@ -281,7 +281,7 @@ public:
|
|||||||
choice = 1;
|
choice = 1;
|
||||||
using Split = SplitProperties;
|
using Split = SplitProperties;
|
||||||
vtkm::FloatDefault minCost = vtkm::Infinity<vtkm::FloatDefault>();
|
vtkm::FloatDefault minCost = vtkm::Infinity<vtkm::FloatDefault>();
|
||||||
const Split& xSplit = xSplits[ArgMin(xSplits, index * Stride, Stride)];
|
const Split& xSplit = xSplits.Get(ArgMin(xSplits, index * Stride, Stride));
|
||||||
bool found = false;
|
bool found = false;
|
||||||
if (xSplit.Cost < minCost && xSplit.NumLeftPoints != 0 && xSplit.NumRightPoints != 0)
|
if (xSplit.Cost < minCost && xSplit.NumLeftPoints != 0 && xSplit.NumRightPoints != 0)
|
||||||
{
|
{
|
||||||
@ -292,7 +292,7 @@ public:
|
|||||||
plane = xSplit.Plane;
|
plane = xSplit.Plane;
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
const Split& ySplit = ySplits[ArgMin(ySplits, index * Stride, Stride)];
|
const Split& ySplit = ySplits.Get(ArgMin(ySplits, index * Stride, Stride));
|
||||||
if (ySplit.Cost < minCost && ySplit.NumLeftPoints != 0 && ySplit.NumRightPoints != 0)
|
if (ySplit.Cost < minCost && ySplit.NumLeftPoints != 0 && ySplit.NumRightPoints != 0)
|
||||||
{
|
{
|
||||||
minCost = ySplit.Cost;
|
minCost = ySplit.Cost;
|
||||||
@ -302,7 +302,7 @@ public:
|
|||||||
plane = ySplit.Plane;
|
plane = ySplit.Plane;
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
const Split& zSplit = zSplits[ArgMin(zSplits, index * Stride, Stride)];
|
const Split& zSplit = zSplits.Get(ArgMin(zSplits, index * Stride, Stride));
|
||||||
if (zSplit.Cost < minCost && zSplit.NumLeftPoints != 0 && zSplit.NumRightPoints != 0)
|
if (zSplit.Cost < minCost && zSplit.NumLeftPoints != 0 && zSplit.NumRightPoints != 0)
|
||||||
{
|
{
|
||||||
minCost = zSplit.Cost;
|
minCost = zSplit.Cost;
|
||||||
@ -314,13 +314,13 @@ public:
|
|||||||
}
|
}
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
const Split& xMSplit = xSplits[NumPlanes];
|
const Split& xMSplit = xSplits.Get(NumPlanes);
|
||||||
minCost = xMSplit.Cost;
|
minCost = xMSplit.Cost;
|
||||||
node.Dimension = 0;
|
node.Dimension = 0;
|
||||||
node.LMax = xMSplit.LMax;
|
node.LMax = xMSplit.LMax;
|
||||||
node.RMin = xMSplit.RMin;
|
node.RMin = xMSplit.RMin;
|
||||||
plane = xMSplit.Plane;
|
plane = xMSplit.Plane;
|
||||||
const Split& yMSplit = ySplits[NumPlanes];
|
const Split& yMSplit = ySplits.Get(NumPlanes);
|
||||||
if (yMSplit.Cost < minCost && yMSplit.NumLeftPoints != 0 && yMSplit.NumRightPoints != 0)
|
if (yMSplit.Cost < minCost && yMSplit.NumLeftPoints != 0 && yMSplit.NumRightPoints != 0)
|
||||||
{
|
{
|
||||||
minCost = yMSplit.Cost;
|
minCost = yMSplit.Cost;
|
||||||
@ -329,7 +329,7 @@ public:
|
|||||||
node.RMin = yMSplit.RMin;
|
node.RMin = yMSplit.RMin;
|
||||||
plane = yMSplit.Plane;
|
plane = yMSplit.Plane;
|
||||||
}
|
}
|
||||||
const Split& zMSplit = zSplits[NumPlanes];
|
const Split& zMSplit = zSplits.Get(NumPlanes);
|
||||||
if (zMSplit.Cost < minCost && zMSplit.NumLeftPoints != 0 && zMSplit.NumRightPoints != 0)
|
if (zMSplit.Cost < minCost && zMSplit.NumLeftPoints != 0 && zMSplit.NumRightPoints != 0)
|
||||||
{
|
{
|
||||||
minCost = zMSplit.Cost;
|
minCost = zMSplit.Cost;
|
||||||
@ -348,7 +348,7 @@ public:
|
|||||||
vtkm::Id minIdx = start;
|
vtkm::Id minIdx = start;
|
||||||
for (vtkm::Id i = start; i < (start + length); ++i)
|
for (vtkm::Id i = start; i < (start + length); ++i)
|
||||||
{
|
{
|
||||||
if (values[i].Cost < values[minIdx].Cost)
|
if (values.Get(i).Cost < values.Get(minIdx).Cost)
|
||||||
{
|
{
|
||||||
minIdx = i;
|
minIdx = i;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user