//============================================================================ // 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 Sandia Corporation. // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 Los Alamos National Security. // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // 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_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::WorkletMapCellToPoint { public: typedef void ControlSignature(CellSetIn cellset, FieldInCell<> inCellField, FieldOutPoint<> outPointField); typedef void ExecutionSignature(CellCount, _2, _3); typedef _1 InputDomain; 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< vtkm::IdComponent, vtkm::VecTraits::NUM_COMPONENTS>; using OutVecSize = std::integral_constant< vtkm::IdComponent, vtkm::VecTraits::NUM_COMPONENTS>; using SameLengthVectors = typename std::is_same::type; 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) { sum = sum + OutType(cellValues[cellIndex]); } average = 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