//============================================================================ // 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. // // Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS). // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 Los Alamos National Security. // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_worklet_ParticleAdvection_h #define vtk_m_worklet_ParticleAdvection_h #include #include #include #include namespace vtkm { namespace worklet { template struct ParticleAdvectionResult { ParticleAdvectionResult() : positions() , status() , stepsTaken() { } ParticleAdvectionResult(const vtkm::cont::ArrayHandle>& pos, const vtkm::cont::ArrayHandle& stat, const vtkm::cont::ArrayHandle& steps) : positions(pos) , status(stat) , stepsTaken(steps) { } vtkm::cont::ArrayHandle> positions; vtkm::cont::ArrayHandle status; vtkm::cont::ArrayHandle stepsTaken; }; class ParticleAdvection { public: ParticleAdvection() {} template ParticleAdvectionResult Run( const IntegratorType& it, const vtkm::cont::ArrayHandle, PointStorage>& pts, const vtkm::Id& nSteps, const DeviceAdapter&) { vtkm::worklet::particleadvection::ParticleAdvectionWorklet worklet; vtkm::cont::ArrayHandle stepsTaken, status; vtkm::Id numSeeds = static_cast(pts.GetNumberOfValues()); //Allocate status and steps arrays. vtkm::cont::ArrayHandleConstant init(0, numSeeds); stepsTaken.Allocate(numSeeds); vtkm::cont::ArrayCopy(init, stepsTaken, DeviceAdapter()); vtkm::cont::ArrayHandleConstant statusOK(static_cast(1), numSeeds); status.Allocate(numSeeds); vtkm::cont::ArrayCopy(statusOK, status, DeviceAdapter()); worklet.Run(it, pts, nSteps, status, stepsTaken); //Create output. ParticleAdvectionResult res(pts, status, stepsTaken); return res; } template ParticleAdvectionResult Run( const IntegratorType& it, const vtkm::cont::ArrayHandle, PointStorage>& pts, const vtkm::cont::ArrayHandle& stepsAlreadyTaken, const vtkm::Id& nSteps, const DeviceAdapter&) { vtkm::worklet::particleadvection::ParticleAdvectionWorklet worklet; vtkm::cont::ArrayHandle stepsTaken, status; vtkm::Id numSeeds = static_cast(pts.GetNumberOfValues()); //Allocate status and steps arrays. stepsTaken.Allocate(numSeeds); vtkm::cont::ArrayCopy(stepsAlreadyTaken, stepsTaken, DeviceAdapter()); vtkm::cont::ArrayHandleConstant statusOK(static_cast(1), numSeeds); status.Allocate(numSeeds); vtkm::cont::ArrayCopy(statusOK, status, DeviceAdapter()); worklet.Run(it, pts, nSteps, status, stepsTaken); //Create output. ParticleAdvectionResult res(pts, status, stepsTaken); return res; } }; template struct StreamlineResult { StreamlineResult() : positions() , polyLines() , status() , stepsTaken() { } 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) { } vtkm::cont::ArrayHandle> positions; vtkm::cont::CellSetExplicit<> polyLines; vtkm::cont::ArrayHandle status; vtkm::cont::ArrayHandle stepsTaken; }; class Streamline { public: Streamline() {} template StreamlineResult Run( const IntegratorType& it, const vtkm::cont::ArrayHandle, PointStorage>& seedArray, const vtkm::Id& nSteps, const DeviceAdapter&) { using DeviceAlgorithm = typename vtkm::cont::DeviceAdapterAlgorithm; vtkm::worklet::particleadvection::StreamlineWorklet worklet; vtkm::cont::ArrayHandle, PointStorage> positions; vtkm::cont::CellSetExplicit<> polyLines; //Allocate status and steps arrays. vtkm::Id numSeeds = seedArray.GetNumberOfValues(); vtkm::Id val = vtkm::worklet::particleadvection::ParticleStatus::STATUS_OK; vtkm::cont::ArrayHandle status, steps; vtkm::cont::ArrayHandleConstant ok(val, numSeeds); status.Allocate(numSeeds); DeviceAlgorithm::Copy(ok, status); vtkm::cont::ArrayHandleConstant zero(0, numSeeds); steps.Allocate(numSeeds); DeviceAlgorithm::Copy(zero, steps); worklet.Run(it, seedArray, nSteps, positions, polyLines, status, steps); StreamlineResult res(positions, polyLines, status, steps); return res; } }; } } #endif // vtk_m_worklet_ParticleAdvection_h