//============================================================================ // 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_WorkletMapTopology_h #define vtk_m_worklet_WorkletMapTopology_h #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace vtkm { namespace worklet { namespace detail { struct WorkletMapTopologyBase : vtkm::worklet::internal::WorkletBase { }; } // namespace detail /// Base class for worklets that do a simple mapping of field arrays. All /// inputs and outputs are on the same domain. That is, all the arrays are the /// same size. /// template class WorkletMapTopology : public detail::WorkletMapTopologyBase { public: using FromTopologyType = FromTopology; using ToTopologyType = ToTopology; /// \brief A control signature tag for input fields. /// /// This tag takes a template argument that is a type list tag that limits /// the possible value types in the array. /// template struct FieldInTo : vtkm::cont::arg::ControlSignatureTagBase { using TypeCheckTag = vtkm::cont::arg::TypeCheckTagArray; using TransportTag = vtkm::cont::arg::TransportTagTopologyFieldIn; using FetchTag = vtkm::exec::arg::FetchTagArrayDirectIn; }; /// \brief A control signature tag for input connectivity. /// /// This tag takes a template argument that is a type list tag that limits /// the possible value types in the array. /// template struct FieldInFrom : vtkm::cont::arg::ControlSignatureTagBase { using TypeCheckTag = vtkm::cont::arg::TypeCheckTagArray; using TransportTag = vtkm::cont::arg::TransportTagTopologyFieldIn; using FetchTag = vtkm::exec::arg::FetchTagArrayTopologyMapIn; }; /// \brief A control signature tag for output fields. /// /// This tag takes a template argument that is a type list tag that limits /// the possible value types in the array. /// template struct FieldOut : vtkm::cont::arg::ControlSignatureTagBase { using TypeCheckTag = vtkm::cont::arg::TypeCheckTagArray; using TransportTag = vtkm::cont::arg::TransportTagArrayOut; using FetchTag = vtkm::exec::arg::FetchTagArrayDirectOut; }; /// \brief A control signature tag for input-output (in-place) fields. /// /// This tag takes a template argument that is a type list tag that limits /// the possible value types in the array. /// template struct FieldInOut : vtkm::cont::arg::ControlSignatureTagBase { using TypeCheckTag = vtkm::cont::arg::TypeCheckTagArray; using TransportTag = vtkm::cont::arg::TransportTagArrayInOut; using FetchTag = vtkm::exec::arg::FetchTagArrayDirectInOut; }; /// \brief A control signature tag for input connectivity. /// struct CellSetIn : vtkm::cont::arg::ControlSignatureTagBase { using TypeCheckTag = vtkm::cont::arg::TypeCheckTagCellSet; using TransportTag = vtkm::cont::arg::TransportTagCellSetIn; using FetchTag = vtkm::exec::arg::FetchTagCellSetIn; }; /// \brief An execution signature tag for getting the cell shape. /// struct CellShape : vtkm::exec::arg::CellShape { }; /// \brief An execution signature tag to get the number of from elements. /// /// In a topology map, there are \em from and \em to topology elements /// specified. The scheduling occurs on the \em to elements, and for each \em /// to element there is some number of incident \em from elements that are /// accessible. This \c ExecutionSignature tag provides the number of these /// \em from elements that are accessible. /// struct FromCount : vtkm::exec::arg::FromCount { }; /// \brief An execution signature tag to get the indices of from elements. /// /// In a topology map, there are \em from and \em to topology elements /// specified. The scheduling occurs on the \em to elements, and for each \em /// to element there is some number of incident \em from elements that are /// accessible. This \c ExecutionSignature tag provides the indices of these /// \em from elements that are accessible. /// struct FromIndices : vtkm::exec::arg::FromIndices { }; /// Topology map worklets use topology map indices. /// VTKM_SUPPRESS_EXEC_WARNINGS template VTKM_EXEC vtkm::exec::arg::ThreadIndicesTopologyMap GetThreadIndices( const T& threadIndex, const OutToInArrayType& outToIn, const VisitArrayType& visit, const InputDomainType& connectivity, const G& globalThreadIndexOffset) const { return vtkm::exec::arg::ThreadIndicesTopologyMap( threadIndex, outToIn, visit, connectivity, globalThreadIndexOffset); } }; /// Base class for worklets that map from Points to Cells. /// class WorkletMapPointToCell : public WorkletMapTopology { public: template using FieldInPoint = FieldInFrom; template using FieldInCell = FieldInTo; template using FieldOutCell = FieldOut; template using FieldInOutCell = FieldInOut; using PointCount = FromCount; using PointIndices = FromIndices; }; /// Base class for worklets that map from Cells to Points. /// class WorkletMapCellToPoint : public WorkletMapTopology { public: template using FieldInCell = FieldInFrom; template using FieldInPoint = FieldInTo; template using FieldOutPoint = FieldOut; template using FieldInOutPoint = FieldInOut; using CellCount = FromCount; using CellIndices = FromIndices; }; } } // namespace vtkm::worklet #endif //vtk_m_worklet_WorkletMapTopology_h