Move streamsurface into flow

This commit is contained in:
Dave Pugmire 2022-07-25 09:09:59 -04:00
parent e786874a77
commit 6a934167c2
13 changed files with 91 additions and 125 deletions

@ -1,70 +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_filter_StreamSurface_h
#define vtk_m_filter_StreamSurface_h
#include <vtkm/filter/FilterDataSetWithField.h>
#include <vtkm/filter/flow/worklet/GridEvaluators.h>
#include <vtkm/filter/flow/worklet/ParticleAdvection.h>
#include <vtkm/filter/flow/worklet/Stepper.h>
#include <vtkm/worklet/StreamSurface.h>
namespace vtkm
{
namespace filter
{
/// \brief generate streamlines from a vector field.
/// Takes as input a vector field and seed locations and generates the
/// paths taken by the seeds through the vector field.
class StreamSurface : public vtkm::filter::FilterDataSetWithField<StreamSurface>
{
public:
using SupportedTypes = vtkm::TypeListFieldVec3;
VTKM_CONT
StreamSurface();
VTKM_CONT
void SetStepSize(vtkm::FloatDefault s) { this->StepSize = s; }
VTKM_CONT
void SetNumberOfSteps(vtkm::Id n) { this->NumberOfSteps = n; }
VTKM_CONT
void SetSeeds(vtkm::cont::ArrayHandle<vtkm::Particle>& seeds) { this->Seeds = seeds; }
template <typename T, typename StorageType, typename DerivedPolicy>
VTKM_CONT vtkm::cont::DataSet 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);
template <typename DerivedPolicy>
VTKM_CONT bool MapFieldOntoOutput(vtkm::cont::DataSet& result,
const vtkm::cont::Field& field,
vtkm::filter::PolicyBase<DerivedPolicy> policy);
private:
vtkm::Id NumberOfSteps;
vtkm::cont::ArrayHandle<vtkm::Particle> Seeds;
vtkm::FloatDefault StepSize;
vtkm::worklet::StreamSurface Worklet;
};
}
} // namespace vtkm::filter
#ifndef vtk_m_filter_StreamSurface_hxx
#include <vtkm/filter/StreamSurface.hxx>
#endif
#endif // vtk_m_filter_StreamSurface_h

@ -25,6 +25,7 @@ set(flow_headers
Pathline.h Pathline.h
PathParticle.h PathParticle.h
Streamline.h Streamline.h
StreamSurface.h
) )
set(flow_sources set(flow_sources
@ -33,6 +34,7 @@ set(flow_sources
Pathline.cxx Pathline.cxx
PathParticle.cxx PathParticle.cxx
Streamline.cxx Streamline.cxx
StreamSurface.cxx
) )
vtkm_library( vtkm_library(

@ -8,13 +8,9 @@
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#ifndef vtk_m_filter_StreamSurface_hxx #include <vtkm/filter/flow/StreamSurface.h>
#define vtk_m_filter_StreamSurface_hxx
#include <vtkm/filter/StreamSurface.h>
#include <vtkm/cont/ArrayCopy.h> #include <vtkm/cont/ArrayCopy.h>
#include <vtkm/cont/ArrayHandleIndex.h>
#include <vtkm/cont/ErrorFilterExecution.h> #include <vtkm/cont/ErrorFilterExecution.h>
#include <vtkm/filter/flow/worklet/Field.h> #include <vtkm/filter/flow/worklet/Field.h>
#include <vtkm/filter/flow/worklet/GridEvaluators.h> #include <vtkm/filter/flow/worklet/GridEvaluators.h>
@ -22,57 +18,53 @@
#include <vtkm/filter/flow/worklet/Particles.h> #include <vtkm/filter/flow/worklet/Particles.h>
#include <vtkm/filter/flow/worklet/RK4Integrator.h> #include <vtkm/filter/flow/worklet/RK4Integrator.h>
#include <vtkm/filter/flow/worklet/Stepper.h> #include <vtkm/filter/flow/worklet/Stepper.h>
#include <vtkm/filter/flow/worklet/StreamSurface.h>
namespace vtkm namespace vtkm
{ {
namespace filter namespace filter
{ {
namespace flow
//-----------------------------------------------------------------------------
inline VTKM_CONT StreamSurface::StreamSurface()
: vtkm::filter::FilterDataSetWithField<StreamSurface>()
, Worklet()
{ {
}
//----------------------------------------------------------------------------- VTKM_CONT vtkm::cont::DataSet StreamSurface::DoExecute(const vtkm::cont::DataSet& input)
template <typename T, typename StorageType, typename DerivedPolicy>
inline VTKM_CONT vtkm::cont::DataSet StreamSurface::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>&)
{ {
//Check for some basics. this->ValidateOptions();
if (this->Seeds.GetNumberOfValues() == 0)
throw vtkm::cont::ErrorFilterExecution("No seeds provided."); if (!this->Seeds.IsBaseComponentType<vtkm::Particle>())
throw vtkm::cont::ErrorFilterExecution("Unsupported seed type in StreamSurface filter.");
const vtkm::cont::UnknownCellSet& cells = input.GetCellSet(); const vtkm::cont::UnknownCellSet& cells = input.GetCellSet();
const vtkm::cont::CoordinateSystem& coords = const vtkm::cont::CoordinateSystem& coords =
input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex()); input.GetCoordinateSystem(this->GetActiveCoordinateSystemIndex());
using FieldHandle = vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType>; using FieldHandle = vtkm::cont::ArrayHandle<vtkm::Vec3f>;
using FieldType = vtkm::worklet::flow::VelocityField<FieldHandle>; using FieldType = vtkm::worklet::flow::VelocityField<FieldHandle>;
using GridEvalType = vtkm::worklet::flow::GridEvaluator<FieldType>; using GridEvalType = vtkm::worklet::flow::GridEvaluator<FieldType>;
using RK4Type = vtkm::worklet::flow::RK4Integrator<GridEvalType>; using RK4Type = vtkm::worklet::flow::RK4Integrator<GridEvalType>;
using Stepper = vtkm::worklet::flow::Stepper<RK4Type, GridEvalType>; using Stepper = vtkm::worklet::flow::Stepper<RK4Type, GridEvalType>;
//compute streamlines //compute streamlines
FieldType velocities(field, fieldMeta.GetAssociation()); const auto& field = input.GetField(this->GetActiveFieldName());
FieldHandle arr;
vtkm::cont::ArrayCopyShallowIfPossible(field.GetData(), arr);
FieldType velocities(arr, field.GetAssociation());
GridEvalType eval(coords, cells, velocities); GridEvalType eval(coords, cells, velocities);
Stepper rk4(eval, this->StepSize); Stepper rk4(eval, this->StepSize);
vtkm::worklet::flow::Streamline streamline; vtkm::worklet::flow::Streamline streamline;
using ParticleArray = vtkm::cont::ArrayHandle<vtkm::Particle>;
vtkm::cont::ArrayHandle<vtkm::Particle> seedArray; vtkm::cont::ArrayHandle<vtkm::Particle> seedArray;
vtkm::cont::ArrayCopy(this->Seeds, seedArray); vtkm::cont::ArrayCopy(this->Seeds.AsArrayHandle<ParticleArray>(), seedArray);
auto res = streamline.Run(rk4, seedArray, this->NumberOfSteps); auto res = streamline.Run(rk4, seedArray, this->NumberOfSteps);
//compute surface from streamlines //compute surface from streamlines
vtkm::worklet::flow::StreamSurface streamSurface;
vtkm::cont::ArrayHandle<vtkm::Vec3f> srfPoints; vtkm::cont::ArrayHandle<vtkm::Vec3f> srfPoints;
vtkm::cont::CellSetSingleType<> srfCells; vtkm::cont::CellSetSingleType<> srfCells;
vtkm::cont::CoordinateSystem slCoords("coordinates", res.Positions); vtkm::cont::CoordinateSystem slCoords("coordinates", res.Positions);
this->Worklet.Run(slCoords, res.PolyLines, srfPoints, srfCells); streamSurface.Run(slCoords, res.PolyLines, srfPoints, srfCells);
vtkm::cont::DataSet outData; vtkm::cont::DataSet outData;
vtkm::cont::CoordinateSystem outputCoords("coordinates", srfPoints); vtkm::cont::CoordinateSystem outputCoords("coordinates", srfPoints);
@ -82,14 +74,6 @@ inline VTKM_CONT vtkm::cont::DataSet StreamSurface::DoExecute(
return outData; return outData;
} }
//-----------------------------------------------------------------------------
template <typename DerivedPolicy>
inline VTKM_CONT bool StreamSurface::MapFieldOntoOutput(vtkm::cont::DataSet&,
const vtkm::cont::Field&,
vtkm::filter::PolicyBase<DerivedPolicy>)
{
return false;
} }
} }
} // namespace vtkm::filter } // namespace vtkm::filter::flow
#endif

@ -0,0 +1,48 @@
//============================================================================
// 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_filter_flow_StreamSurface_h
#define vtk_m_filter_flow_StreamSurface_h
#include <vtkm/Particle.h>
#include <vtkm/filter/flow/FlowTypes.h>
#include <vtkm/filter/flow/NewFilterParticleAdvectionSteadyState.h>
#include <vtkm/filter/flow/vtkm_filter_flow_export.h>
namespace vtkm
{
namespace filter
{
namespace flow
{
/// \brief generate streamlines from a vector field.
/// Takes as input a vector field and seed locations and generates the
/// paths taken by the seeds through the vector field.
class VTKM_FILTER_FLOW_EXPORT StreamSurface
: public vtkm::filter::flow::NewFilterParticleAdvectionSteadyState
{
public:
VTKM_CONT StreamSurface()
: NewFilterParticleAdvectionSteadyState(vtkm::filter::flow::FlowResultType::STREAMLINE_TYPE)
{
}
protected:
VTKM_CONT vtkm::cont::DataSet DoExecute(const vtkm::cont::DataSet& inData) override;
};
}
}
} // namespace vtkm::filter::flow
#endif // vtk_m_filter_flow_StreamSurface_h

@ -8,8 +8,8 @@
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#ifndef vtk_m_filter_Streamline_h #ifndef vtk_m_filter_flow_Streamline_h
#define vtk_m_filter_Streamline_h #define vtk_m_filter_flow_Streamline_h
#include <vtkm/Particle.h> #include <vtkm/Particle.h>
#include <vtkm/filter/flow/FlowTypes.h> #include <vtkm/filter/flow/FlowTypes.h>
@ -46,4 +46,4 @@ protected:
} }
} // namespace vtkm::filter::flow } // namespace vtkm::filter::flow
#endif // vtk_m_filter_Streamline_h #endif // vtk_m_filter_flow_Streamline_h

@ -12,6 +12,8 @@ set(unit_tests
UnitTestStreamlineFilter.cxx UnitTestStreamlineFilter.cxx
UnitTestWorkletParticleAdvection.cxx UnitTestWorkletParticleAdvection.cxx
UnitTestWorkletTemporalAdvection.cxx UnitTestWorkletTemporalAdvection.cxx
UnitTestStreamSurfaceFilter.cxx
UnitTestStreamSurfaceWorklet.cxx
) )
set(libraries set(libraries

@ -10,7 +10,7 @@
#include <vtkm/cont/DataSetBuilderUniform.h> #include <vtkm/cont/DataSetBuilderUniform.h>
#include <vtkm/cont/testing/Testing.h> #include <vtkm/cont/testing/Testing.h>
#include <vtkm/filter/StreamSurface.h> #include <vtkm/filter/flow/StreamSurface.h>
namespace namespace
{ {
@ -44,7 +44,7 @@ void TestStreamSurface()
vtkm::Particle(vtkm::Vec3f(.1f, 3.0f, .3f), 2), vtkm::Particle(vtkm::Vec3f(.1f, 3.0f, .3f), 2),
vtkm::Particle(vtkm::Vec3f(.1f, 3.5f, .2f), 3) }); vtkm::Particle(vtkm::Vec3f(.1f, 3.5f, .2f), 3) });
vtkm::filter::StreamSurface streamSrf; vtkm::filter::flow::StreamSurface streamSrf;
streamSrf.SetStepSize(0.1f); streamSrf.SetStepSize(0.1f);
streamSrf.SetNumberOfSteps(20); streamSrf.SetNumberOfSteps(20);

@ -10,9 +10,9 @@
#include <vtkm/cont/DataSetBuilderExplicit.h> #include <vtkm/cont/DataSetBuilderExplicit.h>
#include <vtkm/cont/testing/Testing.h> #include <vtkm/cont/testing/Testing.h>
#include <vtkm/filter/flow/worklet/StreamSurface.h>
#include <vtkm/io/VTKDataSetWriter.h> #include <vtkm/io/VTKDataSetWriter.h>
#include <vtkm/worklet/DispatcherMapField.h> #include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/StreamSurface.h>
namespace namespace
{ {
@ -53,7 +53,7 @@ void TestSameNumPolylines()
dsb.AddCell(vtkm::CELL_SHAPE_POLY_LINE, ids); dsb.AddCell(vtkm::CELL_SHAPE_POLY_LINE, ids);
vtkm::cont::DataSet ds = dsb.Create(); vtkm::cont::DataSet ds = dsb.Create();
vtkm::worklet::StreamSurface streamSurfaceWorklet; vtkm::worklet::flow::StreamSurface streamSurfaceWorklet;
vtkm::cont::ArrayHandle<vtkm::Vec3f> newPoints; vtkm::cont::ArrayHandle<vtkm::Vec3f> newPoints;
vtkm::cont::CellSetSingleType<> newCells; vtkm::cont::CellSetSingleType<> newCells;
streamSurfaceWorklet.Run(ds.GetCoordinateSystem(0), ds.GetCellSet(), newPoints, newCells); streamSurfaceWorklet.Run(ds.GetCoordinateSystem(0), ds.GetCellSet(), newPoints, newCells);
@ -111,7 +111,7 @@ void TestUnequalNumPolylines(int unequalType)
dsb.AddCell(vtkm::CELL_SHAPE_POLY_LINE, ids); dsb.AddCell(vtkm::CELL_SHAPE_POLY_LINE, ids);
vtkm::cont::DataSet ds = dsb.Create(); vtkm::cont::DataSet ds = dsb.Create();
vtkm::worklet::StreamSurface streamSurfaceWorklet; vtkm::worklet::flow::StreamSurface streamSurfaceWorklet;
vtkm::cont::ArrayHandle<vtkm::Vec3f> newPoints; vtkm::cont::ArrayHandle<vtkm::Vec3f> newPoints;
vtkm::cont::CellSetSingleType<> newCells; vtkm::cont::CellSetSingleType<> newCells;
streamSurfaceWorklet.Run(ds.GetCoordinateSystem(0), ds.GetCellSet(), newPoints, newCells); streamSurfaceWorklet.Run(ds.GetCoordinateSystem(0), ds.GetCellSet(), newPoints, newCells);
@ -124,7 +124,7 @@ void TestUnequalNumPolylines(int unequalType)
"Wrong number of cells in StreamSurface worklet"); "Wrong number of cells in StreamSurface worklet");
} }
void TestStreamSurface() void TestStreamSurfaceWorklet()
{ {
std::cout << "Testing Stream Surface Worklet" << std::endl; std::cout << "Testing Stream Surface Worklet" << std::endl;
TestSameNumPolylines(); TestSameNumPolylines();
@ -134,7 +134,7 @@ void TestStreamSurface()
} }
} }
int UnitTestStreamSurface(int argc, char* argv[]) int UnitTestStreamSurfaceWorklet(int argc, char* argv[])
{ {
return vtkm::cont::testing::Testing::Run(TestStreamSurface, argc, argv); return vtkm::cont::testing::Testing::Run(TestStreamSurfaceWorklet, argc, argv);
} }

@ -21,6 +21,7 @@ set(headers
ParticleAdvectionWorklets.h ParticleAdvectionWorklets.h
RK4Integrator.h RK4Integrator.h
TemporalGridEvaluators.h TemporalGridEvaluators.h
StreamSurface.h
) )
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------

@ -7,8 +7,8 @@
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information. // PURPOSE. See the above copyright notice for more information.
//============================================================================ //============================================================================
#ifndef vtk_m_worklet_streamsurface_h #ifndef vtk_m_filter_flow_worklet_streamsurface_h
#define vtk_m_worklet_streamsurface_h #define vtk_m_filter_flow_worklet_streamsurface_h
#include <typeinfo> #include <typeinfo>
#include <vtkm/VectorAnalysis.h> #include <vtkm/VectorAnalysis.h>
@ -24,6 +24,8 @@ namespace vtkm
{ {
namespace worklet namespace worklet
{ {
namespace flow
{
class StreamSurface class StreamSurface
{ {
@ -276,7 +278,9 @@ public:
private: private:
}; };
}
}
#endif // vtk_m_worklet_streamsurface_h }
}
} //vtkm::worklet::flow
#endif // vtk_m_filter_flow_worklet_streamsurface_h

@ -25,7 +25,6 @@ set(unit_tests
UnitTestMIRFilter.cxx UnitTestMIRFilter.cxx
UnitTestMultiBlockFilter.cxx UnitTestMultiBlockFilter.cxx
UnitTestPartitionedDataSetFilters.cxx UnitTestPartitionedDataSetFilters.cxx
UnitTestStreamSurfaceFilter.cxx
) )
set(libraries set(libraries
@ -54,8 +53,6 @@ if ((TARGET vtkm::cuda) OR (TARGET vtkm::kokkos_cuda))
set(large_kernel_sources set(large_kernel_sources
RegressionTestStreamline.cxx RegressionTestStreamline.cxx
UnitTestLagrangianFilter.cxx UnitTestLagrangianFilter.cxx
UnitTestStreamlineFilter.cxx
UnitTestStreamSurfaceFilter.cxx
) )
set_source_files_properties(${large_kernel_sources} PROPERTIES set_source_files_properties(${large_kernel_sources} PROPERTIES
COMPILE_OPTIONS "-Xptxas;--disable-optimizer-constants" COMPILE_OPTIONS "-Xptxas;--disable-optimizer-constants"

@ -40,7 +40,6 @@ set(headers
StableSortIndices.h StableSortIndices.h
DescriptiveStatistics.h DescriptiveStatistics.h
StreamLineUniformGrid.h StreamLineUniformGrid.h
StreamSurface.h
TriangleWinding.h TriangleWinding.h
WaveletCompressor.h WaveletCompressor.h
WorkletMapField.h WorkletMapField.h

@ -35,7 +35,6 @@ set(unit_tests
UnitTestSplatKernels.cxx UnitTestSplatKernels.cxx
UnitTestScatterAndMaskWithTopology.cxx UnitTestScatterAndMaskWithTopology.cxx
UnitTestStreamLineUniformGrid.cxx UnitTestStreamLineUniformGrid.cxx
UnitTestStreamSurface.cxx
UnitTestTriangleWinding.cxx UnitTestTriangleWinding.cxx
UnitTestWholeCellSetIn.cxx UnitTestWholeCellSetIn.cxx
UnitTestWorkletMapField.cxx UnitTestWorkletMapField.cxx