//============================================================================ // 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_worklet_ParticleAdvection_h #define vtk_m_worklet_ParticleAdvection_h #include #include #include #include #include namespace vtkm { namespace worklet { namespace detail { class CopyToParticle : public vtkm::worklet::WorkletMapField { public: using ControlSignature = void(FieldIn pt, FieldIn id, FieldIn time, FieldIn step, FieldOut particle); using ExecutionSignature = void(_1, _2, _3, _4, _5); using InputDomain = _1; VTKM_EXEC void operator()(const vtkm::Vec3f& pt, const vtkm::Id& id, const vtkm::FloatDefault& time, const vtkm::Id& step, vtkm::Particle& particle) const { particle.Pos = pt; particle.ID = id; particle.Time = time; particle.NumSteps = step; particle.Status.SetOk(); } }; } //detail template struct ParticleAdvectionResult { ParticleAdvectionResult() : Particles() { } ParticleAdvectionResult(const vtkm::cont::ArrayHandle& p) : Particles(p) { } vtkm::cont::ArrayHandle Particles; }; class ParticleAdvection { public: ParticleAdvection() {} template ParticleAdvectionResult Run( const IntegratorType& it, vtkm::cont::ArrayHandle& particles, vtkm::Id MaxSteps) { vtkm::worklet::particleadvection::ParticleAdvectionWorklet worklet; worklet.Run(it, particles, MaxSteps); return ParticleAdvectionResult(particles); } template ParticleAdvectionResult Run( const IntegratorType& it, const vtkm::cont::ArrayHandle& points, vtkm::Id MaxSteps) { vtkm::worklet::particleadvection::ParticleAdvectionWorklet worklet; vtkm::cont::ArrayHandle particles; vtkm::cont::ArrayHandle step, ids; vtkm::cont::ArrayHandle time; vtkm::cont::Invoker invoke; vtkm::Id numPts = points.GetNumberOfValues(); vtkm::cont::ArrayHandleConstant s(0, numPts); vtkm::cont::ArrayHandleConstant t(0, numPts); vtkm::cont::ArrayHandleCounting id(0, 1, numPts); //Copy input to vtkm::Particle vtkm::cont::ArrayCopy(s, step); vtkm::cont::ArrayCopy(t, time); vtkm::cont::ArrayCopy(id, ids); invoke(detail::CopyToParticle{}, points, ids, time, step, particles); worklet.Run(it, particles, MaxSteps); return ParticleAdvectionResult(particles); } }; template struct StreamlineResult { StreamlineResult() : Particles() , Positions() , PolyLines() { } StreamlineResult(const vtkm::cont::ArrayHandle& part, const vtkm::cont::ArrayHandle& pos, const vtkm::cont::CellSetExplicit<>& lines) : Particles(part) , Positions(pos) , PolyLines(lines) { } vtkm::cont::ArrayHandle Particles; vtkm::cont::ArrayHandle Positions; vtkm::cont::CellSetExplicit<> PolyLines; }; class Streamline { public: Streamline() {} template StreamlineResult Run( const IntegratorType& it, vtkm::cont::ArrayHandle& particles, vtkm::Id MaxSteps) { vtkm::worklet::particleadvection::StreamlineWorklet worklet; vtkm::cont::ArrayHandle positions; vtkm::cont::CellSetExplicit<> polyLines; worklet.Run(it, particles, MaxSteps, positions, polyLines); return StreamlineResult(particles, positions, polyLines); } }; } } #endif // vtk_m_worklet_ParticleAdvection_h