//============================================================================ // 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_PointAverage_h #define vtk_m_worklet_PointAverage_h #include #include namespace vtkm { namespace worklet { //simple functor that returns the average point value of a given //cell based field. class PointAverage : public vtkm::worklet::WorkletVisitPointsWithCells { public: using ControlSignature = void(CellSetIn cellset, FieldInCell inCellField, FieldOutPoint outPointField); using ExecutionSignature = void(CellCount, _2, _3); using InputDomain = _1; template VTKM_EXEC void operator()(const vtkm::IdComponent& numCells, const CellValueVecType& cellValues, OutType& average) const { using CellValueType = typename CellValueVecType::ComponentType; using InVecSize = std::integral_constant::NUM_COMPONENTS>; using OutVecSize = std::integral_constant::NUM_COMPONENTS>; using SameLengthVectors = typename std::is_same::type; average = vtkm::TypeTraits::ZeroInitialization(); if (numCells != 0) { this->DoAverage(numCells, cellValues, average, SameLengthVectors()); } } private: template VTKM_EXEC void DoAverage(const vtkm::IdComponent& numCells, const CellValueVecType& cellValues, OutType& average, std::true_type) const { using OutComponentType = typename vtkm::VecTraits::ComponentType; OutType sum = OutType(cellValues[0]); for (vtkm::IdComponent cellIndex = 1; cellIndex < numCells; ++cellIndex) { // OutType constructor is for when OutType is a Vec. // static_cast is for when OutType is a small int that gets promoted to int32. sum = static_cast(sum + OutType(cellValues[cellIndex])); } // OutType constructor is for when OutType is a Vec. // static_cast is for when OutType is a small int that gets promoted to int32. average = static_cast(sum / OutType(static_cast(numCells))); } template VTKM_EXEC void DoAverage(const vtkm::IdComponent& vtkmNotUsed(numCells), const CellValueVecType& vtkmNotUsed(cellValues), OutType& vtkmNotUsed(average), std::false_type) const { this->RaiseError("PointAverage called with mismatched Vec sizes for PointAverage."); } }; } } // namespace vtkm::worklet #endif // vtk_m_worklet_PointAverage_h