Use types for different options in PA filters.

This commit is contained in:
Dave Pugmire 2022-06-23 15:25:31 -04:00
parent 294a489f5b
commit 6618597711
13 changed files with 557 additions and 86 deletions

@ -498,6 +498,7 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::VecCConst<T>>
namespace internal namespace internal
{ {
/// Used for overriding VecTraits for basic scalar types. /// Used for overriding VecTraits for basic scalar types.
/// ///
template <typename ScalarType> template <typename ScalarType>
@ -539,6 +540,44 @@ struct VTKM_NEVER_EXPORT VecTraitsBasic
dest[0] = src; dest[0] = src;
} }
}; };
namespace detail
{
template <typename T, typename = vtkm::HasVecTraits<T>>
struct VTKM_NEVER_EXPORT SafeVecTraitsImpl;
template <typename T>
struct VTKM_NEVER_EXPORT SafeVecTraitsImpl<T, std::true_type> : vtkm::VecTraits<T>
{
};
template <typename T>
struct VTKM_NEVER_EXPORT SafeVecTraitsImpl<T, std::false_type> : vtkm::internal::VecTraitsBasic<T>
{
};
} // namespace detail
/// \brief A version of VecTraits that will be available for any type.
///
/// The `VecTraits` template is only defined for types that have a specific specialization
/// for it. That means if you use `VecTraits` in a template, that template will likely
/// fail to build for types that are not defined for `VecTraits`.
///
/// To use `VecTraits` in a class that should support all types, not just those with
/// defined `VecTraits`, you can use this "safe" version. `SafeVecTraits` is the same as
/// `VecTraits` if the latter is defined. If the `VecTraits` are not defined, then
/// `SafeVecTraits` treats the type as a simple scalar value.
///
/// This template ensures that it will work reasonably well for all types. But be careful
/// as if `VecTraits` is later defined, the template is likely to change.
///
template <typename T>
struct VTKM_NEVER_EXPORT SafeVecTraits : detail::SafeVecTraitsImpl<T>
{
};
} // namespace internal } // namespace internal
/// \brief VecTraits for Pair types /// \brief VecTraits for Pair types
@ -554,7 +593,7 @@ struct VTKM_NEVER_EXPORT VecTraits<vtkm::Pair<T, U>>
{ {
}; };
} // anonymous namespace } // namespace vtkm
#define VTKM_BASIC_TYPE_VECTOR(type) \ #define VTKM_BASIC_TYPE_VECTOR(type) \
namespace vtkm \ namespace vtkm \

@ -37,7 +37,7 @@ namespace internal
// is defined rather than where it is resolved. This causes problems when extracting // is defined rather than where it is resolved. This causes problems when extracting
// components of, say, an ArrayHandleMultiplexer holding an ArrayHandleSOA. // components of, say, an ArrayHandleMultiplexer holding an ArrayHandleSOA.
template <typename T, typename S> template <typename T, typename S>
vtkm::cont::ArrayHandleStride<typename vtkm::VecTraits<T>::BaseComponentType> vtkm::cont::ArrayHandleStride<typename vtkm::internal::SafeVecTraits<T>::BaseComponentType>
ArrayExtractComponentFallback(const vtkm::cont::ArrayHandle<T, S>& src, ArrayExtractComponentFallback(const vtkm::cont::ArrayHandle<T, S>& src,
vtkm::IdComponent componentIndex, vtkm::IdComponent componentIndex,
vtkm::CopyFlag allowCopy) vtkm::CopyFlag allowCopy)
@ -53,7 +53,7 @@ ArrayExtractComponentFallback(const vtkm::cont::ArrayHandle<T, S>& src,
<< vtkm::cont::TypeToString<vtkm::cont::ArrayHandle<T, S>>() << vtkm::cont::TypeToString<vtkm::cont::ArrayHandle<T, S>>()
<< " requires an inefficient memory copy."); << " requires an inefficient memory copy.");
using BaseComponentType = typename vtkm::VecTraits<T>::BaseComponentType; using BaseComponentType = typename vtkm::internal::SafeVecTraits<T>::BaseComponentType;
vtkm::Id numValues = src.GetNumberOfValues(); vtkm::Id numValues = src.GetNumberOfValues();
vtkm::cont::ArrayHandleBasic<BaseComponentType> dest; vtkm::cont::ArrayHandleBasic<BaseComponentType> dest;
dest.Allocate(numValues); dest.Allocate(numValues);
@ -78,10 +78,10 @@ template <typename S>
struct ArrayExtractComponentImpl : ArrayExtractComponentImplInefficient struct ArrayExtractComponentImpl : ArrayExtractComponentImplInefficient
{ {
template <typename T> template <typename T>
vtkm::cont::ArrayHandleStride<typename vtkm::VecTraits<T>::BaseComponentType> operator()( vtkm::cont::ArrayHandleStride<typename vtkm::internal::SafeVecTraits<T>::BaseComponentType>
const vtkm::cont::ArrayHandle<T, S>& src, operator()(const vtkm::cont::ArrayHandle<T, S>& src,
vtkm::IdComponent componentIndex, vtkm::IdComponent componentIndex,
vtkm::CopyFlag allowCopy) const vtkm::CopyFlag allowCopy) const
{ {
// This is the slow "default" implementation. ArrayHandle implementations should provide // This is the slow "default" implementation. ArrayHandle implementations should provide
// more efficient overloads where applicable. // more efficient overloads where applicable.
@ -93,13 +93,15 @@ template <>
struct ArrayExtractComponentImpl<vtkm::cont::StorageTagStride> struct ArrayExtractComponentImpl<vtkm::cont::StorageTagStride>
{ {
template <typename T> template <typename T>
vtkm::cont::ArrayHandleStride<typename vtkm::VecTraits<T>::BaseComponentType> operator()( vtkm::cont::ArrayHandleStride<typename vtkm::internal::SafeVecTraits<T>::BaseComponentType>
const vtkm::cont::ArrayHandle<T, vtkm::cont::StorageTagStride>& src, operator()(const vtkm::cont::ArrayHandle<T, vtkm::cont::StorageTagStride>& src,
vtkm::IdComponent componentIndex, vtkm::IdComponent componentIndex,
vtkm::CopyFlag allowCopy) const vtkm::CopyFlag allowCopy) const
{ {
return this->DoExtract( return this->DoExtract(src,
src, componentIndex, allowCopy, typename vtkm::VecTraits<T>::HasMultipleComponents{}); componentIndex,
allowCopy,
typename vtkm::internal::SafeVecTraits<T>::HasMultipleComponents{});
} }
private: private:
@ -110,7 +112,7 @@ private:
vtkm::VecTraitsTagSingleComponent) const vtkm::VecTraitsTagSingleComponent) const
{ {
VTKM_ASSERT(componentIndex == 0); VTKM_ASSERT(componentIndex == 0);
using VTraits = vtkm::VecTraits<T>; using VTraits = vtkm::internal::SafeVecTraits<T>;
using TBase = typename VTraits::BaseComponentType; using TBase = typename VTraits::BaseComponentType;
VTKM_STATIC_ASSERT(VTraits::NUM_COMPONENTS == 1); VTKM_STATIC_ASSERT(VTraits::NUM_COMPONENTS == 1);
@ -133,7 +135,7 @@ private:
vtkm::CopyFlag allowCopy, vtkm::CopyFlag allowCopy,
vtkm::VecTraitsTagMultipleComponents) const vtkm::VecTraitsTagMultipleComponents) const
{ {
using VTraits = vtkm::VecTraits<VecType>; using VTraits = vtkm::internal::SafeVecTraits<VecType>;
using T = typename VTraits::ComponentType; using T = typename VTraits::ComponentType;
constexpr vtkm::IdComponent N = VTraits::NUM_COMPONENTS; constexpr vtkm::IdComponent N = VTraits::NUM_COMPONENTS;
@ -252,10 +254,10 @@ using ArrayExtractComponentIsInefficient = typename std::is_base_of<
/// `vtkm::cont::internal::ArrayExtractComponentImpl`. /// `vtkm::cont::internal::ArrayExtractComponentImpl`.
/// ///
template <typename T, typename S> template <typename T, typename S>
vtkm::cont::ArrayHandleStride<typename vtkm::VecTraits<T>::BaseComponentType> ArrayExtractComponent( vtkm::cont::ArrayHandleStride<typename vtkm::internal::SafeVecTraits<T>::BaseComponentType>
const vtkm::cont::ArrayHandle<T, S>& src, ArrayExtractComponent(const vtkm::cont::ArrayHandle<T, S>& src,
vtkm::IdComponent componentIndex, vtkm::IdComponent componentIndex,
vtkm::CopyFlag allowCopy = vtkm::CopyFlag::On) vtkm::CopyFlag allowCopy = vtkm::CopyFlag::On)
{ {
return internal::ArrayExtractComponentImpl<S>{}(src, componentIndex, allowCopy); return internal::ArrayExtractComponentImpl<S>{}(src, componentIndex, allowCopy);
} }

@ -831,9 +831,9 @@ VTKM_NEVER_EXPORT VTKM_CONT inline void printSummary_ArrayHandle_Value(
std::ostream& out, std::ostream& out,
vtkm::VecTraitsTagMultipleComponents) vtkm::VecTraitsTagMultipleComponents)
{ {
using Traits = vtkm::VecTraits<T>; using Traits = vtkm::internal::SafeVecTraits<T>;
using ComponentType = typename Traits::ComponentType; using ComponentType = typename Traits::ComponentType;
using IsVecOfVec = typename vtkm::VecTraits<ComponentType>::HasMultipleComponents; using IsVecOfVec = typename vtkm::internal::SafeVecTraits<ComponentType>::HasMultipleComponents;
vtkm::IdComponent numComponents = Traits::GetNumberOfComponents(value); vtkm::IdComponent numComponents = Traits::GetNumberOfComponents(value);
out << "("; out << "(";
printSummary_ArrayHandle_Value(Traits::GetComponent(value, 0), out, IsVecOfVec()); printSummary_ArrayHandle_Value(Traits::GetComponent(value, 0), out, IsVecOfVec());
@ -853,10 +853,10 @@ VTKM_NEVER_EXPORT VTKM_CONT inline void printSummary_ArrayHandle_Value(
{ {
out << "{"; out << "{";
printSummary_ArrayHandle_Value( printSummary_ArrayHandle_Value(
value.first, out, typename vtkm::VecTraits<T1>::HasMultipleComponents()); value.first, out, typename vtkm::internal::SafeVecTraits<T1>::HasMultipleComponents());
out << ","; out << ",";
printSummary_ArrayHandle_Value( printSummary_ArrayHandle_Value(
value.second, out, typename vtkm::VecTraits<T2>::HasMultipleComponents()); value.second, out, typename vtkm::internal::SafeVecTraits<T2>::HasMultipleComponents());
out << "}"; out << "}";
} }
@ -872,7 +872,7 @@ VTKM_NEVER_EXPORT VTKM_CONT inline void printSummary_ArrayHandle(
{ {
using ArrayType = vtkm::cont::ArrayHandle<T, StorageT>; using ArrayType = vtkm::cont::ArrayHandle<T, StorageT>;
using PortalType = typename ArrayType::ReadPortalType; using PortalType = typename ArrayType::ReadPortalType;
using IsVec = typename vtkm::VecTraits<T>::HasMultipleComponents; using IsVec = typename vtkm::internal::SafeVecTraits<T>::HasMultipleComponents;
vtkm::Id sz = array.GetNumberOfValues(); vtkm::Id sz = array.GetNumberOfValues();

@ -55,12 +55,12 @@ vtkm::Id UnknownAHNumberOfValues(void* mem)
return arrayHandle->GetNumberOfValues(); return arrayHandle->GetNumberOfValues();
} }
template <typename T, typename StaticSize = typename vtkm::VecTraits<T>::IsSizeStatic> template <typename T, typename StaticSize = typename vtkm::internal::SafeVecTraits<T>::IsSizeStatic>
struct UnknownAHNumberOfComponentsImpl; struct UnknownAHNumberOfComponentsImpl;
template <typename T> template <typename T>
struct UnknownAHNumberOfComponentsImpl<T, vtkm::VecTraitsTagSizeStatic> struct UnknownAHNumberOfComponentsImpl<T, vtkm::VecTraitsTagSizeStatic>
{ {
static constexpr vtkm::IdComponent Value = vtkm::VecTraits<T>::NUM_COMPONENTS; static constexpr vtkm::IdComponent Value = vtkm::internal::SafeVecTraits<T>::NUM_COMPONENTS;
}; };
template <typename T> template <typename T>
struct UnknownAHNumberOfComponentsImpl<T, vtkm::VecTraitsTagSizeVariable> struct UnknownAHNumberOfComponentsImpl<T, vtkm::VecTraitsTagSizeVariable>
@ -74,18 +74,25 @@ vtkm::IdComponent UnknownAHNumberOfComponents()
return UnknownAHNumberOfComponentsImpl<T>::Value; return UnknownAHNumberOfComponentsImpl<T>::Value;
} }
template <typename T, typename StaticSize = typename vtkm::VecTraits<T>::IsSizeStatic> template <typename T,
typename = typename vtkm::internal::SafeVecTraits<T>::IsSizeStatic,
typename = vtkm::HasVecTraits<T>>
struct UnknownAHNumberOfComponentsFlatImpl; struct UnknownAHNumberOfComponentsFlatImpl;
template <typename T> template <typename T>
struct UnknownAHNumberOfComponentsFlatImpl<T, vtkm::VecTraitsTagSizeStatic> struct UnknownAHNumberOfComponentsFlatImpl<T, vtkm::VecTraitsTagSizeStatic, std::true_type>
{ {
static constexpr vtkm::IdComponent Value = vtkm::VecFlat<T>::NUM_COMPONENTS; static constexpr vtkm::IdComponent Value = vtkm::VecFlat<T>::NUM_COMPONENTS;
}; };
template <typename T> template <typename T>
struct UnknownAHNumberOfComponentsFlatImpl<T, vtkm::VecTraitsTagSizeVariable> struct UnknownAHNumberOfComponentsFlatImpl<T, vtkm::VecTraitsTagSizeVariable, std::true_type>
{ {
static constexpr vtkm::IdComponent Value = 0; static constexpr vtkm::IdComponent Value = 0;
}; };
template <typename T>
struct UnknownAHNumberOfComponentsFlatImpl<T, vtkm::VecTraitsTagSizeStatic, std::false_type>
{
static constexpr vtkm::IdComponent Value = 1;
};
template <typename T> template <typename T>
vtkm::IdComponent UnknownAHNumberOfComponentsFlat() vtkm::IdComponent UnknownAHNumberOfComponentsFlat()
@ -306,13 +313,14 @@ std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic(vtkm::VecTraitsTag
template <typename T> template <typename T>
std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic() std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceBasic()
{ {
return UnknownAHNewInstanceBasic<T>(typename vtkm::VecTraits<T>::IsSizeStatic{}); return UnknownAHNewInstanceBasic<T>(typename vtkm::internal::SafeVecTraits<T>::IsSizeStatic{});
} }
template <typename T> template <typename T>
std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(vtkm::VecTraitsTagSizeStatic) std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(vtkm::VecTraitsTagSizeStatic)
{ {
using FloatT = typename vtkm::VecTraits<T>::template ReplaceBaseComponentType<vtkm::FloatDefault>; using FloatT = typename vtkm::internal::SafeVecTraits<T>::template ReplaceBaseComponentType<
vtkm::FloatDefault>;
return UnknownAHContainer::Make(vtkm::cont::ArrayHandleBasic<FloatT>{}); return UnknownAHContainer::Make(vtkm::cont::ArrayHandleBasic<FloatT>{});
} }
template <typename T> template <typename T>
@ -324,7 +332,8 @@ std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic(vtkm::VecTrai
template <typename T> template <typename T>
std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic() std::shared_ptr<UnknownAHContainer> UnknownAHNewInstanceFloatBasic()
{ {
return UnknownAHNewInstanceFloatBasic<T>(typename vtkm::VecTraits<T>::IsSizeStatic{}); return UnknownAHNewInstanceFloatBasic<T>(
typename vtkm::internal::SafeVecTraits<T>::IsSizeStatic{});
} }
template <typename T, typename S> template <typename T, typename S>
@ -333,7 +342,7 @@ inline UnknownAHContainer::UnknownAHContainer(const vtkm::cont::ArrayHandle<T, S
, ValueType(typeid(T)) , ValueType(typeid(T))
, StorageType(typeid(S)) , StorageType(typeid(S))
, BaseComponentType( , BaseComponentType(
UnknownAHComponentInfo::Make<typename vtkm::VecTraits<T>::BaseComponentType>()) UnknownAHComponentInfo::Make<typename vtkm::internal::SafeVecTraits<T>::BaseComponentType>())
, DeleteFunction(detail::UnknownAHDelete<T, S>) , DeleteFunction(detail::UnknownAHDelete<T, S>)
, NewInstance(detail::UnknownAHNewInstance<T, S>) , NewInstance(detail::UnknownAHNewInstance<T, S>)
, NewInstanceBasic(detail::UnknownAHNewInstanceBasic<T>) , NewInstanceBasic(detail::UnknownAHNewInstanceBasic<T>)

@ -90,7 +90,8 @@ protected:
*/ */
vtkm::Id NumberOfSteps; vtkm::Id NumberOfSteps;
vtkm::filter::particleadvection::ParticleAdvectionResultType ResultType; vtkm::filter::particleadvection::ParticleAdvectionResultType ResultType =
vtkm::filter::particleadvection::UNKNOWN_TYPE;
vtkm::cont::ArrayHandle<ParticleType> Seeds; vtkm::cont::ArrayHandle<ParticleType> Seeds;
vtkm::filter::particleadvection::IntegrationSolverType SolverType; vtkm::filter::particleadvection::IntegrationSolverType SolverType;
vtkm::FloatDefault StepSize; vtkm::FloatDefault StepSize;

@ -13,6 +13,8 @@
#include <vtkm/Particle.h> #include <vtkm/Particle.h>
#include <vtkm/filter/FilterParticleAdvection.h> #include <vtkm/filter/FilterParticleAdvection.h>
#include <vtkm/filter/NewFilterField.h>
#include <vtkm/filter/particleadvection/ParticleAdvectionTypes.h>
namespace vtkm namespace vtkm
{ {
@ -38,6 +40,19 @@ public:
vtkm::cont::UnknownArrayHandle SeedArray; vtkm::cont::UnknownArrayHandle SeedArray;
}; };
class ParticleAdvection3 : public vtkm::filter::NewFilterField
{
public:
// VTKM_CONT ParticleAdvection3() {}
protected:
VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& inData) override;
VTKM_CONT vtkm::cont::PartitionedDataSet DoExecutePartitions(
const vtkm::cont::PartitionedDataSet& inData) override;
vtkm::cont::UnknownArrayHandle SeedArray;
};
} }
} // namespace vtkm::filter } // namespace vtkm::filter

@ -29,6 +29,7 @@ namespace filter
inline VTKM_CONT ParticleAdvection2::ParticleAdvection2() inline VTKM_CONT ParticleAdvection2::ParticleAdvection2()
: vtkm::filter::FilterParticleAdvection<ParticleAdvection2, vtkm::Particle>() : vtkm::filter::FilterParticleAdvection<ParticleAdvection2, vtkm::Particle>()
{ {
this->ResultType = vtkm::filter::particleadvection::PARTICLE_ADVECT_TYPE;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -56,21 +57,17 @@ inline VTKM_CONT vtkm::cont::PartitionedDataSet ParticleAdvection2::PrepareForEx
if (!ds.HasPointField(activeField) && !ds.HasCellField(activeField)) if (!ds.HasPointField(activeField) && !ds.HasCellField(activeField))
throw vtkm::cont::ErrorFilterExecution("Unsupported field assocation"); throw vtkm::cont::ErrorFilterExecution("Unsupported field assocation");
dsi.push_back(DSIType(ds, blockId, activeField, this->SolverType, this->VecFieldType)); dsi.push_back(
DSIType(ds, blockId, activeField, this->SolverType, this->VecFieldType, this->ResultType));
} }
std::vector<vtkm::Particle> seeds; this->SeedArray = this->Seeds;
seeds.push_back(this->Seeds.ReadPortal().Get(0)); vtkm::filter::particleadvection::PAV pav(
seeds.push_back(this->Seeds.ReadPortal().Get(1)); boundsMap,
seeds.push_back(this->Seeds.ReadPortal().Get(2)); dsi,
std::cout << "SEEDS= " << seeds[0].Pos << " " << seeds[1].Pos << " " << seeds[2].Pos << std::endl; this->UseThreadedAlgorithm,
vtkm::filter::particleadvection::ParticleAdvectionResultType::PARTICLE_ADVECT_TYPE);
//this->SeedArray = this->Seeds; return pav.Execute(this->NumberOfSteps, this->StepSize, this->SeedArray);
//vtkm::cont::UncertainArrayHandle<vtkm::List<vtkm::Particle>, vtkm::cont::StorageListBasic> arr;
//arr = this->Seeds;
vtkm::filter::particleadvection::PAV pav(boundsMap, dsi, this->UseThreadedAlgorithm);
return pav.Execute(this->NumberOfSteps, this->StepSize, this->Seeds);
#if 0 #if 0
//std::vector<DSIType> ddsi; //std::vector<DSIType> ddsi;
@ -97,6 +94,20 @@ inline VTKM_CONT vtkm::cont::PartitionedDataSet ParticleAdvection2::PrepareForEx
#endif #endif
} }
VTKM_CONT vtkm::cont::DataSet ParticleAdvection3::DoExecute(const vtkm::cont::DataSet& inData)
{
std::cout << "Meow DS" << std::endl;
auto result = this->DoExecutePartitions(inData);
return result.GetPartition(0);
}
VTKM_CONT vtkm::cont::PartitionedDataSet ParticleAdvection3::DoExecutePartitions(
const vtkm::cont::PartitionedDataSet& inData)
{
std::cout << "Meow pDS" << std::endl;
return inData;
}
} }
} // namespace vtkm::filter } // namespace vtkm::filter
#endif #endif

@ -48,8 +48,13 @@ public:
vtkm::cont::PartitionedDataSet GetOutput() vtkm::cont::PartitionedDataSet GetOutput()
{ {
vtkm::cont::PartitionedDataSet output;
for (const auto& b : this->Blocks)
output.AppendPartition(b.GetOutput<ParticleType>());
std::cout << "GetOutput: " << __FILE__ << " " << __LINE__ << std::endl; std::cout << "GetOutput: " << __FILE__ << " " << __LINE__ << std::endl;
auto output = internal::ResultHelper<ResultType, ParticleType>::GetOutput(this->Results); //auto output = internal::ResultHelper<ResultType, ParticleType>::GetOutput(this->Results);
output.PrintSummary(std::cout); output.PrintSummary(std::cout);
return output; return output;
@ -100,15 +105,17 @@ public:
while (this->TotalNumTerminatedParticles < this->TotalNumParticles) while (this->TotalNumTerminatedParticles < this->TotalNumParticles)
{ {
std::cout << __FILE__ << " " << __LINE__ << std::endl;
std::vector<ParticleType> v; std::vector<ParticleType> v;
vtkm::Id numTerm = 0, blockId = -1; vtkm::Id numTerm = 0, blockId = -1;
if (GetActiveParticles(v, blockId)) if (this->GetActiveParticles(v, blockId))
{ {
const auto& block = this->GetDataSet(blockId); //make this a pointer to avoid the copy?
ResultType<ParticleType> r; auto& block = this->GetDataSet(blockId);
block.Advect(v, this->StepSize, this->NumberOfSteps, r); //block.Advect(v, this->StepSize, this->NumberOfSteps, r);
numTerm = this->UpdateResult(r, blockId); DSIStuff<ParticleType> stuff(this->BoundsMap, this->ParticleBlockIDsMap);
block.Advect(v, this->StepSize, this->NumberOfSteps, stuff);
numTerm = this->UpdateResult(stuff);
//numTerm = this->UpdateResult(r, blockId);
std::cout << " Advect: " << v.size() << " NT= " << numTerm << std::endl; std::cout << " Advect: " << v.size() << " NT= " << numTerm << std::endl;
} }
@ -138,9 +145,9 @@ public:
this->TotalNumParticles = static_cast<vtkm::Id>(total); this->TotalNumParticles = static_cast<vtkm::Id>(total);
} }
const DSI& GetDataSet(vtkm::Id id) const DSI& GetDataSet(vtkm::Id id)
{ {
for (const auto& it : this->Blocks) for (auto& it : this->Blocks)
if (it.GetID() == id) if (it.GetID() == id)
return it; return it;
throw vtkm::cont::ErrorFilterExecution("Bad block"); throw vtkm::cont::ErrorFilterExecution("Bad block");
@ -231,6 +238,7 @@ public:
this->ParticleBlockIDsMap[it.first] = it.second; this->ParticleBlockIDsMap[it.first] = it.second;
} }
/*
void UpdateTerminated(const vtkm::cont::ArrayHandle<ParticleType>& particles, void UpdateTerminated(const vtkm::cont::ArrayHandle<ParticleType>& particles,
const std::vector<vtkm::Id>& idxTerm) const std::vector<vtkm::Id>& idxTerm)
{ {
@ -238,7 +246,9 @@ public:
for (const auto& idx : idxTerm) for (const auto& idx : idxTerm)
this->ParticleBlockIDsMap.erase(portal.Get(idx).ID); this->ParticleBlockIDsMap.erase(portal.Get(idx).ID);
} }
*/
/*
void ClassifyParticles(const vtkm::cont::ArrayHandle<ParticleType>& particles, void ClassifyParticles(const vtkm::cont::ArrayHandle<ParticleType>& particles,
std::unordered_map<vtkm::Id, std::vector<vtkm::Id>>& idsMapA, std::unordered_map<vtkm::Id, std::vector<vtkm::Id>>& idsMapA,
std::unordered_map<vtkm::Id, std::vector<vtkm::Id>>& idsMapI, std::unordered_map<vtkm::Id, std::vector<vtkm::Id>>& idsMapI,
@ -319,10 +329,28 @@ public:
//Make sure we didn't miss anything. Every particle goes into a single bucket. //Make sure we didn't miss anything. Every particle goes into a single bucket.
VTKM_ASSERT(static_cast<std::size_t>(n) == (A.size() + I.size() + termIdx.size())); VTKM_ASSERT(static_cast<std::size_t>(n) == (A.size() + I.size() + termIdx.size()));
} }
*/
vtkm::Id UpdateResult(const DSIStuff<ParticleType>& stuff)
{
this->UpdateActive(stuff.A, stuff.IdMapA);
this->UpdateInactive(stuff.I, stuff.IdMapI);
vtkm::Id numTerm = static_cast<vtkm::Id>(stuff.TermID.size());
//Update terminated particles.
if (numTerm > 0)
{
for (const auto& id : stuff.TermID)
this->ParticleBlockIDsMap.erase(id);
}
return numTerm;
}
/*
vtkm::Id UpdateResult(ResultType<ParticleType>& res, vtkm::Id blockId) vtkm::Id UpdateResult(ResultType<ParticleType>& res, vtkm::Id blockId)
{ {
std::cout << "UpdateResult: blockId= " << blockId << std::endl; std::cout<<"UpdateResult: blockId= "<<blockId<<std::endl;
std::unordered_map<vtkm::Id, std::vector<vtkm::Id>> idsMapI, idsMapA; std::unordered_map<vtkm::Id, std::vector<vtkm::Id>> idsMapI, idsMapA;
std::vector<ParticleType> A, I; std::vector<ParticleType> A, I;
std::vector<vtkm::Id> termIdx; std::vector<vtkm::Id> termIdx;
@ -340,6 +368,7 @@ public:
return numTerm; return numTerm;
} }
*/
virtual bool GetBlockAndWait(const vtkm::Id& numLocalTerm) virtual bool GetBlockAndWait(const vtkm::Id& numLocalTerm)
{ {

@ -19,6 +19,8 @@
#include <vtkm/worklet/particleadvection/RK4Integrator.h> #include <vtkm/worklet/particleadvection/RK4Integrator.h>
#include <vtkm/worklet/particleadvection/Stepper.h> #include <vtkm/worklet/particleadvection/Stepper.h>
#include <vtkm/exec/internal/Variant.h>
namespace vtkm namespace vtkm
{ {
namespace filter namespace filter
@ -26,6 +28,23 @@ namespace filter
namespace particleadvection namespace particleadvection
{ {
template <typename ParticleType>
struct DSIStuff
{
DSIStuff(const vtkm::filter::particleadvection::BoundsMap& boundsMap,
const std::unordered_map<vtkm::Id, std::vector<vtkm::Id>>& particleBlockIDsMap)
: BoundsMap(boundsMap)
, ParticleBlockIDsMap(particleBlockIDsMap)
{
}
std::vector<ParticleType> A, I;
std::unordered_map<vtkm::Id, std::vector<vtkm::Id>> IdMapA, IdMapI;
std::vector<vtkm::Id> TermID;
const vtkm::filter::particleadvection::BoundsMap BoundsMap;
const std::unordered_map<vtkm::Id, std::vector<vtkm::Id>> ParticleBlockIDsMap;
};
class DSI class DSI
{ {
public: public:
@ -33,10 +52,13 @@ public:
vtkm::Id id, vtkm::Id id,
const std::string& fieldNm, const std::string& fieldNm,
vtkm::filter::particleadvection::IntegrationSolverType solverType, vtkm::filter::particleadvection::IntegrationSolverType solverType,
vtkm::filter::particleadvection::VectorFieldType vecFieldType) vtkm::filter::particleadvection::VectorFieldType vecFieldType,
vtkm::filter::particleadvection::ParticleAdvectionResultType resultType)
: Rank(this->Comm.rank())
{ {
this->SolverType = solverType; this->SolverType = solverType;
this->VecFieldType = vecFieldType; this->VecFieldType = vecFieldType;
this->ResType = resultType;
this->DataSet = ds; this->DataSet = ds;
this->Id = id; this->Id = id;
this->FieldName = fieldNm; this->FieldName = fieldNm;
@ -47,12 +69,19 @@ public:
VTKM_CONT vtkm::Id GetID() const { return this->Id; } VTKM_CONT vtkm::Id GetID() const { return this->Id; }
VTKM_CONT void SetCopySeedFlag(bool val) { this->CopySeedArray = val; } VTKM_CONT void SetCopySeedFlag(bool val) { this->CopySeedArray = val; }
//template <typename ParticleType, typename ResultType>
template <typename ParticleType, template <typename> class ResultType> template <typename ParticleType>
VTKM_CONT void Advect(std::vector<ParticleType>& v, VTKM_CONT void Advect(std::vector<ParticleType>& v,
vtkm::FloatDefault stepSize, //move these to member data(?) vtkm::FloatDefault stepSize, //move these to member data(?)
vtkm::Id maxSteps, vtkm::Id maxSteps,
ResultType<ParticleType>& result) const; DSIStuff<ParticleType>& stuff);
template <typename ParticleType>
VTKM_CONT vtkm::cont::DataSet GetOutput() const;
protected:
template <typename ParticleType, template <typename> class ResultType>
VTKM_CONT void UpdateResult(ResultType<ParticleType>& result, DSIStuff<ParticleType>& stuff);
template <typename ArrayType> template <typename ArrayType>
VTKM_CONT void GetVelocityField( VTKM_CONT void GetVelocityField(
@ -69,6 +98,7 @@ public:
VTKM_CONT void GetElectroMagneticField( VTKM_CONT void GetElectroMagneticField(
vtkm::worklet::particleadvection::ElectroMagneticField<ArrayType>& elecMagField) const vtkm::worklet::particleadvection::ElectroMagneticField<ArrayType>& elecMagField) const
{ {
std::cout << "FIX ME: need fieldname2" << std::endl;
ArrayType arr1, arr2; ArrayType arr1, arr2;
vtkm::cont::ArrayCopyShallowIfPossible(this->DataSet.GetField(this->FieldName).GetData(), arr1); vtkm::cont::ArrayCopyShallowIfPossible(this->DataSet.GetField(this->FieldName).GetData(), arr1);
vtkm::cont::ArrayCopyShallowIfPossible(this->DataSet.GetField(this->FieldName).GetData(), vtkm::cont::ArrayCopyShallowIfPossible(this->DataSet.GetField(this->FieldName).GetData(),
@ -79,14 +109,31 @@ public:
vtkm::worklet::particleadvection::ElectroMagneticField<ArrayType>(arr1, arr2, assoc); vtkm::worklet::particleadvection::ElectroMagneticField<ArrayType>(arr1, arr2, assoc);
} }
//private: template <typename ParticleType>
VTKM_CONT void ClassifyParticles(const vtkm::cont::ArrayHandle<ParticleType>& particles,
DSIStuff<ParticleType>& stuff) const;
template <typename ParticleType, template <typename> class ResultType>
VTKM_CONT vtkm::cont::DataSet ResultToDataSet() const;
vtkmdiy::mpi::communicator Comm = vtkm::cont::EnvironmentTracker::GetCommunicator();
vtkm::Id Rank;
vtkm::cont::DataSet DataSet; vtkm::cont::DataSet DataSet;
vtkm::Id Id; vtkm::Id Id;
std::string FieldName; std::string FieldName;
vtkm::filter::particleadvection::IntegrationSolverType SolverType; vtkm::filter::particleadvection::IntegrationSolverType SolverType;
vtkm::filter::particleadvection::VectorFieldType VecFieldType; vtkm::filter::particleadvection::VectorFieldType VecFieldType;
vtkm::filter::particleadvection::ParticleAdvectionResultType ResType =
vtkm::filter::particleadvection::UNKNOWN_TYPE;
bool CopySeedArray = false; bool CopySeedArray = false;
//Add results array?
using ResultVariantType =
vtkm::exec::internal::Variant<vtkm::worklet::ParticleAdvectionResult<vtkm::Particle>,
vtkm::worklet::StreamlineResult<vtkm::Particle>,
vtkm::worklet::ParticleAdvectionResult<vtkm::ChargedParticle>,
vtkm::worklet::StreamlineResult<vtkm::ChargedParticle>>;
std::vector<ResultVariantType> Results;
}; };
} }

@ -17,12 +17,264 @@ namespace filter
{ {
namespace particleadvection namespace particleadvection
{ {
#if 0
namespace internal
{
//Helper class to store the different result types.
//template <typename ResultType>
template <template <typename> class ResultType, typename ParticleType>
class ResultHelper2;
template <typename ParticleType>
class ResultHelper2<vtkm::worklet::ParticleAdvectionResult, ParticleType>
{
using PAType = vtkm::worklet::ParticleAdvectionResult<ParticleType>;
public:
static void Store(const PAType& result)
{
}
static vtkm::cont::DataSet
GetOutput()
{
vtkm::cont::DataSet ds;
return ds;
}
};
template <typename ParticleType>
class ResultHelper2<vtkm::worklet::StreamlineResult, ParticleType>
{
using PAType = vtkm::worklet::StreamlineResult<ParticleType>;
public:
static void Store(const PAType& result)
{
}
static vtkm::cont::DataSet
GetOutput()
{
vtkm::cont::DataSet ds;
return ds;
}
};
}
#endif
template <typename ParticleType>
VTKM_CONT vtkm::cont::DataSet DSI::GetOutput() const
{
vtkm::cont::DataSet ds;
std::size_t nResults = this->Results.size();
if (nResults == 0)
return ds;
std::cout << "Check the variant type!" << std::endl;
if (this->ResType == PARTICLE_ADVECT_TYPE)
{
using RType = vtkm::worklet::ParticleAdvectionResult<ParticleType>;
std::vector<vtkm::cont::ArrayHandle<ParticleType>> allParticles;
allParticles.reserve(nResults);
//Get all the particles and put them into a single ArrayHandle: pts
for (const auto& vres : this->Results)
allParticles.push_back(vres.Get<RType>().Particles);
vtkm::cont::ArrayHandle<vtkm::Vec3f> pts;
vtkm::cont::ParticleArrayCopy(allParticles, pts);
vtkm::Id numPoints = pts.GetNumberOfValues();
if (numPoints > 0)
{
//Create coordinate system and vertex cell set.
ds.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", pts));
vtkm::cont::CellSetSingleType<> cells;
vtkm::cont::ArrayHandleIndex conn(numPoints);
vtkm::cont::ArrayHandle<vtkm::Id> connectivity;
vtkm::cont::ArrayCopy(conn, connectivity);
cells.Fill(numPoints, vtkm::CELL_SHAPE_VERTEX, 1, connectivity);
ds.SetCellSet(cells);
}
}
else if (this->ResType == STREAMLINE_TYPE)
{
using ResultType = vtkm::worklet::StreamlineResult<ParticleType>;
//Easy case with one result.
if (nResults == 1)
{
const auto& res = this->Results[0].Get<ResultType>();
ds.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", res.Positions));
ds.SetCellSet(res.PolyLines);
}
else
{
std::vector<vtkm::Id> posOffsets(nResults, 0);
vtkm::Id totalNumCells = 0, totalNumPts = 0;
for (std::size_t i = 0; i < nResults; i++)
{
const auto& res = this->Results[i].Get<ResultType>();
if (i == 0)
posOffsets[i] = 0;
else
posOffsets[i] = totalNumPts;
totalNumPts += res.Positions.GetNumberOfValues();
totalNumCells += res.PolyLines.GetNumberOfCells();
}
//Append all the points together.
vtkm::cont::ArrayHandle<vtkm::Vec3f> appendPts;
appendPts.Allocate(totalNumPts);
for (std::size_t i = 0; i < nResults; i++)
{
const auto& res = this->Results[i].Get<ResultType>();
// copy all values into appendPts starting at offset.
vtkm::cont::Algorithm::CopySubRange(
res.Positions, 0, res.Positions.GetNumberOfValues(), appendPts, posOffsets[i]);
}
ds.AddCoordinateSystem(vtkm::cont::CoordinateSystem("coordinates", appendPts));
//Create polylines.
std::vector<vtkm::Id> numPtsPerCell(static_cast<std::size_t>(totalNumCells));
std::size_t off = 0;
for (std::size_t i = 0; i < nResults; i++)
{
const auto& res = this->Results[i].Get<ResultType>();
vtkm::Id nCells = res.PolyLines.GetNumberOfCells();
for (vtkm::Id j = 0; j < nCells; j++)
numPtsPerCell[off++] = static_cast<vtkm::Id>(res.PolyLines.GetNumberOfPointsInCell(j));
}
auto numPointsPerCellArray = vtkm::cont::make_ArrayHandle(numPtsPerCell, vtkm::CopyFlag::Off);
vtkm::cont::ArrayHandle<vtkm::Id> cellIndex;
vtkm::Id connectivityLen =
vtkm::cont::Algorithm::ScanExclusive(numPointsPerCellArray, cellIndex);
vtkm::cont::ArrayHandleIndex connCount(connectivityLen);
vtkm::cont::ArrayHandle<vtkm::Id> connectivity;
vtkm::cont::ArrayCopy(connCount, connectivity);
vtkm::cont::ArrayHandle<vtkm::UInt8> cellTypes;
auto polyLineShape = vtkm::cont::make_ArrayHandleConstant<vtkm::UInt8>(
vtkm::CELL_SHAPE_POLY_LINE, totalNumCells);
vtkm::cont::ArrayCopy(polyLineShape, cellTypes);
auto offsets = vtkm::cont::ConvertNumComponentsToOffsets(numPointsPerCellArray);
vtkm::cont::CellSetExplicit<> polyLines;
polyLines.Fill(totalNumPts, cellTypes, connectivity, offsets);
ds.SetCellSet(polyLines);
}
}
else
{
throw vtkm::cont::ErrorFilterExecution("Unsupported ParticleAdvectionResultType");
}
return ds;
}
template <typename ParticleType, template <typename> class ResultType> template <typename ParticleType, template <typename> class ResultType>
VTKM_CONT void DSI::UpdateResult(ResultType<ParticleType>& result, DSIStuff<ParticleType>& stuff)
{
this->ClassifyParticles(result.Particles, stuff);
this->Results.push_back(result);
}
template <typename ParticleType>
VTKM_CONT void DSI::ClassifyParticles(const vtkm::cont::ArrayHandle<ParticleType>& particles,
DSIStuff<ParticleType>& stuff) const
{
stuff.A.clear();
stuff.I.clear();
stuff.TermID.clear();
stuff.IdMapI.clear();
stuff.IdMapA.clear();
auto portal = particles.WritePortal();
vtkm::Id n = portal.GetNumberOfValues();
for (vtkm::Id i = 0; i < n; i++)
{
auto p = portal.Get(i);
if (p.Status.CheckTerminate())
stuff.TermID.push_back(p.ID);
else
{
const auto& it = stuff.ParticleBlockIDsMap.find(p.ID);
VTKM_ASSERT(it != stuff.ParticleBlockIDsMap.end());
auto currBIDs = it->second;
VTKM_ASSERT(!currBIDs.empty());
std::vector<vtkm::Id> newIDs;
if (p.Status.CheckSpatialBounds() && !p.Status.CheckTookAnySteps())
newIDs.assign(std::next(currBIDs.begin(), 1), currBIDs.end());
else
newIDs = stuff.BoundsMap.FindBlocks(p.Pos, currBIDs);
//reset the particle status.
p.Status = vtkm::ParticleStatus();
if (newIDs.empty()) //No blocks, we're done.
{
p.Status.SetTerminate();
stuff.TermID.push_back(p.ID);
}
else
{
//If we have more than blockId, we want to minimize communication
//and put any blocks owned by this rank first.
if (newIDs.size() > 1)
{
for (auto idit = newIDs.begin(); idit != newIDs.end(); idit++)
{
vtkm::Id bid = *idit;
if (stuff.BoundsMap.FindRank(bid) == this->Rank)
{
newIDs.erase(idit);
newIDs.insert(newIDs.begin(), bid);
break;
}
}
}
int dstRank = stuff.BoundsMap.FindRank(newIDs[0]);
if (dstRank == this->Rank)
{
stuff.A.push_back(p);
stuff.IdMapA[p.ID] = newIDs;
}
else
{
stuff.I.push_back(p);
stuff.IdMapI[p.ID] = newIDs;
}
}
portal.Set(i, p);
}
}
//Make sure we didn't miss anything. Every particle goes into a single bucket.
VTKM_ASSERT(static_cast<std::size_t>(n) ==
(stuff.A.size() + stuff.I.size() + stuff.TermID.size()));
}
template <typename ParticleType>
VTKM_CONT void DSI::Advect(std::vector<ParticleType>& v, VTKM_CONT void DSI::Advect(std::vector<ParticleType>& v,
vtkm::FloatDefault stepSize, vtkm::FloatDefault stepSize,
vtkm::Id maxSteps, vtkm::Id maxSteps,
ResultType<ParticleType>& result) const DSIStuff<ParticleType>& stuff)
{ {
//using Association = vtkm::cont::Field::Association; //using Association = vtkm::cont::Field::Association;
using ArrayType = vtkm::cont::ArrayHandle<vtkm::Vec3f>; using ArrayType = vtkm::cont::ArrayHandle<vtkm::Vec3f>;
@ -46,9 +298,22 @@ VTKM_CONT void DSI::Advect(std::vector<ParticleType>& v,
GridEvType eval(this->DataSet, velField); GridEvType eval(this->DataSet, velField);
StepperType stepper(eval, stepSize); StepperType stepper(eval, stepSize);
vtkm::worklet::ParticleAdvection Worklet;
result = Worklet.Run(stepper, seedArray, maxSteps); //make this a template
//Put results in unknown array?? if (this->ResType == PARTICLE_ADVECT_TYPE)
{
vtkm::worklet::ParticleAdvection Worklet;
auto r = Worklet.Run(stepper, seedArray, maxSteps);
this->UpdateResult(r, stuff);
// /*result =*/ Worklet.Run(stepper, seedArray, maxSteps);
}
else
{
vtkm::worklet::Streamline Worklet;
auto r = Worklet.Run(stepper, seedArray, maxSteps);
this->UpdateResult(r, stuff);
//Put results in unknown array??
}
} }
else if (this->VecFieldType == ELECTRO_MAGNETIC_FIELD_TYPE) //vtkm::ChargedParticle else if (this->VecFieldType == ELECTRO_MAGNETIC_FIELD_TYPE) //vtkm::ChargedParticle
{ {
@ -62,8 +327,21 @@ VTKM_CONT void DSI::Advect(std::vector<ParticleType>& v,
GridEvType eval(this->DataSet, velField); GridEvType eval(this->DataSet, velField);
StepperType stepper(eval, stepSize); StepperType stepper(eval, stepSize);
vtkm::worklet::ParticleAdvection Worklet;
result = Worklet.Run(stepper, seedArray, maxSteps); if (this->ResType == PARTICLE_ADVECT_TYPE)
{
vtkm::worklet::ParticleAdvection Worklet;
auto r = Worklet.Run(stepper, seedArray, maxSteps);
this->UpdateResult(r, stuff);
///*result =*/ auto r = Worklet.Run(stepper, seedArray, maxSteps);
}
else
{
vtkm::worklet::Streamline Worklet;
auto r = Worklet.Run(stepper, seedArray, maxSteps);
this->UpdateResult(r, stuff);
///*result =*/ Worklet.Run(stepper, seedArray, maxSteps);
}
} }
} }
@ -81,8 +359,8 @@ VTKM_CONT void DSI::Advect(std::vector<ParticleType>& v,
GridEvType eval(this->DataSet, velField); GridEvType eval(this->DataSet, velField);
StepperType stepper(eval, stepSize); StepperType stepper(eval, stepSize);
vtkm::worklet::ParticleAdvection Worklet; // vtkm::worklet::ParticleAdvection Worklet;
result = Worklet.Run(stepper, seedArray, maxSteps); // result = Worklet.Run(stepper, seedArray, maxSteps);
//Put results in unknown array?? //Put results in unknown array??
} }
} }

@ -27,38 +27,78 @@ class PAV
public: public:
PAV(const vtkm::filter::particleadvection::BoundsMap& bm, PAV(const vtkm::filter::particleadvection::BoundsMap& bm,
const std::vector<DSI>& blocks, const std::vector<DSI>& blocks,
const bool& useThreaded) const bool& useThreaded,
const vtkm::filter::particleadvection::ParticleAdvectionResultType& parType)
: Blocks(blocks) : Blocks(blocks)
, BoundsMap(bm) , BoundsMap(bm)
, ResultType(parType)
, UseThreadedAlgorithm(useThreaded) , UseThreadedAlgorithm(useThreaded)
{ {
} }
vtkm::cont::PartitionedDataSet Execute(vtkm::Id numSteps, vtkm::cont::PartitionedDataSet Execute(vtkm::Id numSteps,
vtkm::FloatDefault stepSize, vtkm::FloatDefault stepSize,
const vtkm::cont::ArrayHandle<vtkm::Particle>& seeds) const vtkm::cont::UnknownArrayHandle& seeds)
{
using ParticleArray = vtkm::cont::ArrayHandle<vtkm::Particle>;
using ChargedParticleArray = vtkm::cont::ArrayHandle<vtkm::ChargedParticle>;
if (seeds.IsBaseComponentType<vtkm::Particle>())
return this->Execute(numSteps, stepSize, seeds.AsArrayHandle<ParticleArray>());
else if (seeds.IsBaseComponentType<vtkm::ChargedParticle>())
return this->Execute(numSteps, stepSize, seeds.AsArrayHandle<ChargedParticleArray>());
throw vtkm::cont::ErrorFilterExecution("Unsupported options in ABA");
}
private:
template <typename ParticleType>
vtkm::cont::PartitionedDataSet Execute(vtkm::Id numSteps,
vtkm::FloatDefault stepSize,
const vtkm::cont::ArrayHandle<ParticleType>& seeds)
{ {
if (!this->UseThreadedAlgorithm) if (!this->UseThreadedAlgorithm)
{ {
//make a templated algorithm execution()
if (this->ResultType ==
vtkm::filter::particleadvection::ParticleAdvectionResultType::PARTICLE_ADVECT_TYPE)
{
using AlgorithmType =
vtkm::filter::particleadvection::ABA<vtkm::worklet::ParticleAdvectionResult,
ParticleType>;
AlgorithmType algo(this->BoundsMap, this->Blocks);
algo.Execute(numSteps, stepSize, seeds);
return algo.GetOutput();
}
else
{
using AlgorithmType =
vtkm::filter::particleadvection::ABA<vtkm::worklet::StreamlineResult, ParticleType>;
AlgorithmType algo(this->BoundsMap, this->Blocks);
algo.Execute(numSteps, stepSize, seeds);
return algo.GetOutput();
}
}
else
{
std::cout << "Change me to threaded ABA" << std::endl;
using AlgorithmType = using AlgorithmType =
vtkm::filter::particleadvection::ABA<vtkm::worklet::ParticleAdvectionResult, vtkm::filter::particleadvection::ABA<vtkm::worklet::ParticleAdvectionResult, ParticleType>;
vtkm::Particle>;
AlgorithmType algo(this->BoundsMap, this->Blocks); AlgorithmType algo(this->BoundsMap, this->Blocks);
algo.Execute(numSteps, stepSize, seeds); algo.Execute(numSteps, stepSize, seeds);
return algo.GetOutput(); return algo.GetOutput();
} }
else
{
//using ThreadedAlgorithmType = vtkm::filter::particleadvection::ParticleAdvectionThreadedAlgorithm;
//AlgorithmType algo;
}
throw vtkm::cont::ErrorFilterExecution("Unsupported options in ABA");
} }
std::vector<DSI> Blocks; std::vector<DSI> Blocks;
vtkm::filter::particleadvection::BoundsMap BoundsMap; vtkm::filter::particleadvection::BoundsMap BoundsMap;
ParticleAdvectionResultType ResultType;
bool UseThreadedAlgorithm; bool UseThreadedAlgorithm;
}; };

@ -30,7 +30,8 @@ enum VectorFieldType
enum ParticleAdvectionResultType enum ParticleAdvectionResultType
{ {
PARTICLE_ADVECT_TYPE = 0, UNKNOWN_TYPE = -1,
PARTICLE_ADVECT_TYPE,
STREAMLINE_TYPE, STREAMLINE_TYPE,
}; };

@ -65,7 +65,6 @@ void TestStreamline()
vtkm::Particle(vtkm::Vec3f(.2f, 3.0f, .2f), 2) }); vtkm::Particle(vtkm::Vec3f(.2f, 3.0f, .2f), 2) });
vtkm::filter::ParticleAdvection2 streamline; vtkm::filter::ParticleAdvection2 streamline;
streamline.SetStepSize(0.1f); streamline.SetStepSize(0.1f);
streamline.SetNumberOfSteps(20); streamline.SetNumberOfSteps(20);
streamline.SetSeeds(seedArray); streamline.SetSeeds(seedArray);
@ -584,7 +583,7 @@ void TestStreamlineFilters()
vtkm::filter::ParticleAdvection2 filter; vtkm::filter::ParticleAdvection2 filter;
TestStreamline(); TestStreamline();
/*
std::vector<bool> flags = { true, false }; std::vector<bool> flags = { true, false };
std::vector<FilterType> fTypes = { FilterType::PARTICLE_ADVECTION, std::vector<FilterType> fTypes = { FilterType::PARTICLE_ADVECTION,
FilterType::STREAMLINE, FilterType::STREAMLINE,
@ -601,7 +600,7 @@ void TestStreamlineFilters()
TestStreamline(); TestStreamline();
TestPathline(); TestPathline();
/*
for (auto useSL : flags) for (auto useSL : flags)
TestAMRStreamline(useSL); TestAMRStreamline(useSL);