//============================================================================ // 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 namespace vtkm { namespace worklet { struct ParticleAdvectionResult { using ScalarType = vtkm::worklet::particleadvection::ScalarType; ParticleAdvectionResult() : positions() , status() , stepsTaken() , times() { } ParticleAdvectionResult(const vtkm::cont::ArrayHandle>& pos, const vtkm::cont::ArrayHandle& stat, const vtkm::cont::ArrayHandle& steps) : positions(pos) , status(stat) , stepsTaken(steps) { } ParticleAdvectionResult(const vtkm::cont::ArrayHandle>& pos, const vtkm::cont::ArrayHandle& stat, const vtkm::cont::ArrayHandle& steps, const vtkm::cont::ArrayHandle& timeArray) : positions(pos) , status(stat) , stepsTaken(steps) , times(timeArray) { } vtkm::cont::ArrayHandle> positions; vtkm::cont::ArrayHandle status; vtkm::cont::ArrayHandle stepsTaken; vtkm::cont::ArrayHandle times; }; class ParticleAdvection { public: using ScalarType = vtkm::worklet::particleadvection::ScalarType; ParticleAdvection() {} template ParticleAdvectionResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle, PointStorage>& pts, const vtkm::Id& nSteps) { vtkm::Id numSeeds = static_cast(pts.GetNumberOfValues()); vtkm::cont::ArrayHandle stepsTaken; vtkm::cont::ArrayHandle timeArray; //Allocate status and steps arrays. vtkm::cont::ArrayHandleConstant init(0, numSeeds); vtkm::cont::ArrayCopy(init, stepsTaken); //Allocate memory to store the time for temporal integration. vtkm::cont::ArrayHandleConstant time(0, numSeeds); vtkm::cont::ArrayCopy(time, timeArray); return Run(it, pts, stepsTaken, timeArray, nSteps); } template ParticleAdvectionResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle, PointStorage>& pts, vtkm::cont::ArrayHandle& inputSteps, const vtkm::Id& nSteps) { vtkm::Id numSeeds = static_cast(pts.GetNumberOfValues()); vtkm::cont::ArrayHandle timeArray; //Allocate memory to store the time for temporal integration. vtkm::cont::ArrayHandleConstant time(0, numSeeds); timeArray.Allocate(numSeeds); vtkm::cont::ArrayCopy(time, timeArray); return Run(it, pts, inputSteps, timeArray, nSteps); } template ParticleAdvectionResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle>& pts, vtkm::cont::ArrayHandle& inputSteps, vtkm::cont::ArrayHandle& inputTime, const vtkm::Id& nSteps) { vtkm::worklet::particleadvection::ParticleAdvectionWorklet worklet; vtkm::Id numSeeds = static_cast(pts.GetNumberOfValues()); vtkm::cont::ArrayHandle status; //Allocate status arrays. vtkm::cont::ArrayHandleConstant statusOK(static_cast(1), numSeeds); status.Allocate(numSeeds); vtkm::cont::ArrayCopy(statusOK, status); worklet.Run(it, pts, nSteps, status, inputSteps, inputTime); //Create output. return ParticleAdvectionResult(pts, status, inputSteps, inputTime); } template ParticleAdvectionResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle, PointStorage>& pts, vtkm::cont::ArrayHandle& inputSteps, vtkm::cont::ArrayHandle& inputTime, const vtkm::Id& nSteps) { vtkm::cont::ArrayHandle> ptsCopy; vtkm::cont::ArrayCopy(pts, ptsCopy); return Run(it, ptsCopy, inputSteps, inputTime, nSteps); } }; struct StreamlineResult { using ScalarType = vtkm::worklet::particleadvection::ScalarType; using VectorType = vtkm::Vec; StreamlineResult() : positions() , polyLines() , status() , stepsTaken() , times() { } StreamlineResult(const vtkm::cont::ArrayHandle>& pos, const vtkm::cont::CellSetExplicit<>& lines, const vtkm::cont::ArrayHandle& stat, const vtkm::cont::ArrayHandle& steps) : positions(pos) , polyLines(lines) , status(stat) , stepsTaken(steps) { } StreamlineResult(const vtkm::cont::ArrayHandle>& pos, const vtkm::cont::CellSetExplicit<>& lines, const vtkm::cont::ArrayHandle& stat, const vtkm::cont::ArrayHandle& steps, const vtkm::cont::ArrayHandle& timeArray) : positions(pos) , polyLines(lines) , status(stat) , stepsTaken(steps) , times(timeArray) { } vtkm::cont::ArrayHandle> positions; vtkm::cont::CellSetExplicit<> polyLines; vtkm::cont::ArrayHandle status; vtkm::cont::ArrayHandle stepsTaken; vtkm::cont::ArrayHandle times; }; class Streamline { public: using ScalarType = vtkm::worklet::particleadvection::ScalarType; Streamline() {} template StreamlineResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle, PointStorage>& seedArray, const vtkm::Id& nSteps) { vtkm::Id numSeeds = seedArray.GetNumberOfValues(); //Allocate status and steps arrays. vtkm::cont::ArrayHandle status, steps; vtkm::cont::ArrayHandleConstant statusOK(static_cast(1), numSeeds); vtkm::cont::ArrayCopy(statusOK, status); vtkm::cont::ArrayHandleConstant zero(0, numSeeds); vtkm::cont::ArrayCopy(zero, steps); //Allocate memory to store the time for temporal integration. vtkm::cont::ArrayHandle timeArray; vtkm::cont::ArrayHandleConstant time(0, numSeeds); vtkm::cont::ArrayCopy(time, timeArray); return Run(it, seedArray, steps, timeArray, nSteps); } template StreamlineResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle, PointStorage>& seedArray, vtkm::cont::ArrayHandle& inputSteps, const vtkm::Id& nSteps) { vtkm::Id numSeeds = seedArray.GetNumberOfValues(); //Allocate and initializr status array. vtkm::cont::ArrayHandle status; vtkm::cont::ArrayHandleConstant statusOK(static_cast(1), numSeeds); vtkm::cont::ArrayCopy(statusOK, status); //Allocate memory to store the time for temporal integration. vtkm::cont::ArrayHandle timeArray; vtkm::cont::ArrayHandleConstant time(0, numSeeds); vtkm::cont::ArrayCopy(time, timeArray); return Run(it, seedArray, inputSteps, timeArray, nSteps); } template StreamlineResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle>& seedArray, vtkm::cont::ArrayHandle& inputSteps, vtkm::cont::ArrayHandle& inputTime, const vtkm::Id& nSteps) { vtkm::worklet::particleadvection::StreamlineWorklet worklet; vtkm::cont::ArrayHandle> positions; vtkm::cont::CellSetExplicit<> polyLines; //Allocate and initialize status array. vtkm::Id numSeeds = seedArray.GetNumberOfValues(); vtkm::cont::ArrayHandle status; vtkm::cont::ArrayHandleConstant statusOK(static_cast(1), numSeeds); vtkm::cont::ArrayCopy(statusOK, status); worklet.Run(it, seedArray, nSteps, positions, polyLines, status, inputSteps, inputTime); return StreamlineResult(positions, polyLines, status, inputSteps, inputTime); } template StreamlineResult Run(const IntegratorType& it, vtkm::cont::ArrayHandle, PointStorage>& seedArray, vtkm::cont::ArrayHandle& inputSteps, vtkm::cont::ArrayHandle& inputTime, const vtkm::Id& nSteps) { vtkm::cont::ArrayHandle> seedCopy; vtkm::cont::ArrayCopy(seedArray, seedCopy); return Run(it, seedCopy, inputSteps, inputTime, nSteps); } }; } } #endif // vtk_m_worklet_ParticleAdvection_h