1 //============================================================================ 2 // Copyright (c) Kitware, Inc. 3 // All rights reserved. 4 // See LICENSE.txt for details. 5 // This software is distributed WITHOUT ANY WARRANTY; without even 6 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 7 // PURPOSE. See the above copyright notice for more information. 8 // 9 // Copyright 2015 Sandia Corporation. 10 // Copyright 2015 UT-Battelle, LLC. 11 // Copyright 2015 Los Alamos National Security. 12 // 13 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, 14 // the U.S. Government retains certain rights in this software. 15 // 16 // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National 17 // Laboratory (LANL), the U.S. Government retains certain rights in 18 // this software. 19 //============================================================================ 20 #ifndef vtkmConnectivityExec_h 21 #define vtkmConnectivityExec_h 22 #ifndef __VTK_WRAP__ 23 #ifndef VTK_WRAPPING_CXX 24 25 #include "vtkmTags.h" 26 27 #include <vtkm/CellShape.h> 28 #include <vtkm/TopologyElementTag.h> 29 #include <vtkm/cont/ArrayHandle.h> 30 #include <vtkm/VecFromPortal.h> 31 32 #include <vtkm/cont/serial/DeviceAdapterSerial.h> 33 #include <vtkm/cont/cuda/DeviceAdapterCuda.h> 34 #include <vtkm/cont/openmp/DeviceAdapterOpenMP.h> 35 #include <vtkm/cont/tbb/DeviceAdapterTBB.h> 36 37 namespace vtkm { 38 namespace exec { 39 40 template <typename Device> class VTKM_ALWAYS_EXPORT ConnectivityVTKAOS 41 { 42 typedef vtkm::cont::ArrayHandle<vtkm::UInt8, tovtkm::vtkAOSArrayContainerTag> 43 ShapeHandleType; 44 typedef vtkm::cont::ArrayHandle<vtkm::Id, tovtkm::vtkCellArrayContainerTag> 45 ConnectivityHandleType; 46 typedef vtkm::cont::ArrayHandle<vtkm::Id, tovtkm::vtkAOSArrayContainerTag> 47 OffsetHandleType; 48 49 typedef typename ShapeHandleType::template ExecutionTypes<Device>::PortalConst 50 ShapePortalType; 51 typedef typename ConnectivityHandleType::template ExecutionTypes< 52 Device>::PortalConst ConnectivityPortalType; 53 typedef 54 typename OffsetHandleType::template ExecutionTypes<Device>::PortalConst 55 IndexOffsetPortalType; 56 57 public: 58 typedef typename vtkm::Id SchedulingRangeType; 59 60 VTKM_SUPPRESS_EXEC_WARNINGS 61 VTKM_EXEC_CONT 62 ConnectivityVTKAOS(); 63 64 VTKM_EXEC_CONT 65 ConnectivityVTKAOS(const ShapePortalType& shapePortal, 66 const ConnectivityPortalType& connPortal, 67 const IndexOffsetPortalType& indexOffsetPortal); 68 69 VTKM_SUPPRESS_EXEC_WARNINGS 70 VTKM_EXEC 71 vtkm::Id GetNumberOfElements() const; 72 73 typedef vtkm::CellShapeTagGeneric CellShapeTag; 74 75 VTKM_EXEC 76 CellShapeTag GetCellShape(vtkm::Id index) const; 77 78 typedef vtkm::VecFromPortal<ConnectivityPortalType> IndicesType; 79 80 /// Returns a Vec-like object containing the indices for the given index. 81 /// The object returned is not an actual array, but rather an object that 82 /// loads the indices lazily out of the connectivity array. This prevents 83 /// us from having to know the number of indices at compile time. 84 /// 85 VTKM_EXEC 86 IndicesType GetIndices(vtkm::Id index) const; 87 88 private: 89 ShapePortalType Shapes; 90 ConnectivityPortalType Connectivity; 91 IndexOffsetPortalType IndexOffsets; 92 }; 93 94 95 template <typename Device> class VTKM_ALWAYS_EXPORT ConnectivityVTKSingleType 96 { 97 typedef vtkm::cont::ArrayHandle<vtkm::Id, tovtkm::vtkCellArrayContainerTag> 98 ConnectivityHandleType; 99 typedef typename ConnectivityHandleType::template ExecutionTypes< 100 Device>::PortalConst ConnectivityPortalType; 101 102 public: 103 typedef typename vtkm::Id SchedulingRangeType; 104 105 VTKM_SUPPRESS_EXEC_WARNINGS 106 VTKM_EXEC_CONT 107 ConnectivityVTKSingleType(); 108 109 VTKM_EXEC_CONT 110 ConnectivityVTKSingleType(const ConnectivityPortalType& connPortal, 111 vtkm::Id numCells, 112 vtkm::IdComponent numPointsPerCell, 113 vtkm::UInt8 shapeType); 114 115 VTKM_EXEC 116 vtkm::Id GetNumberOfElements() const; 117 118 typedef vtkm::CellShapeTagGeneric CellShapeTag; 119 120 VTKM_EXEC 121 CellShapeTag GetCellShape(vtkm::Id index) const; 122 123 typedef vtkm::VecFromPortal<ConnectivityPortalType> IndicesType; 124 125 /// Returns a Vec-like object containing the indices for the given index. 126 /// The object returned is not an actual array, but rather an object that 127 /// loads the indices lazily out of the connectivity array. This prevents 128 /// us from having to know the number of indices at compile time. 129 /// 130 VTKM_EXEC 131 IndicesType GetIndices(vtkm::Id index) const; 132 133 private: 134 ConnectivityPortalType Connectivity; 135 vtkm::Id NumberOfCells; 136 vtkm::IdComponent NumberOfPointsPerCell; 137 vtkm::UInt8 ShapeType; 138 }; 139 140 141 template <typename Device> class VTKM_ALWAYS_EXPORT ReverseConnectivityVTK 142 { 143 typedef vtkm::cont::ArrayHandle<vtkm::Id> ConnectivityHandleType; 144 typedef vtkm::cont::ArrayHandle<vtkm::IdComponent> NumIndicesHandleType; 145 typedef vtkm::cont::ArrayHandle<vtkm::Id> OffsetHandleType; 146 147 typedef typename ConnectivityHandleType::template ExecutionTypes< 148 Device>::PortalConst ConnectivityPortalType; 149 150 typedef typename OffsetHandleType::template ExecutionTypes<Device>::PortalConst 151 IndexOffsetPortalType; 152 153 typedef typename NumIndicesHandleType::template ExecutionTypes<Device>::PortalConst 154 NumIndicesPortalType; 155 156 public: 157 typedef typename vtkm::Id SchedulingRangeType; 158 159 VTKM_SUPPRESS_EXEC_WARNINGS 160 VTKM_EXEC_CONT 161 ReverseConnectivityVTK(); 162 163 VTKM_EXEC_CONT 164 ReverseConnectivityVTK(const ConnectivityPortalType& connPortal, 165 const NumIndicesPortalType& numIndicesPortal, 166 const IndexOffsetPortalType& indexOffsetPortal); 167 168 VTKM_EXEC 169 vtkm::Id GetNumberOfElements() const; 170 171 typedef vtkm::CellShapeTagVertex CellShapeTag; 172 173 VTKM_EXEC GetCellShape(vtkm::Id)174 CellShapeTag GetCellShape(vtkm::Id) const { return vtkm::CellShapeTagVertex(); } 175 176 typedef vtkm::VecFromPortal<ConnectivityPortalType> IndicesType; 177 178 /// Returns a Vec-like object containing the indices for the given index. 179 /// The object returned is not an actual array, but rather an object that 180 /// loads the indices lazily out of the connectivity array. This prevents 181 /// us from having to know the number of indices at compile time. 182 /// 183 VTKM_EXEC 184 IndicesType GetIndices(vtkm::Id index) const; 185 186 private: 187 ConnectivityPortalType Connectivity; 188 NumIndicesPortalType NumIndices; 189 IndexOffsetPortalType IndexOffsets; 190 }; 191 192 // template methods we want to compile only once 193 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKAOS<vtkm::cont::DeviceAdapterTagSerial>; 194 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKSingleType<vtkm::cont::DeviceAdapterTagSerial>; 195 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ReverseConnectivityVTK<vtkm::cont::DeviceAdapterTagSerial>; 196 197 #ifdef VTKM_ENABLE_TBB 198 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKAOS<vtkm::cont::DeviceAdapterTagTBB>; 199 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKSingleType<vtkm::cont::DeviceAdapterTagTBB>; 200 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ReverseConnectivityVTK<vtkm::cont::DeviceAdapterTagTBB>; 201 #endif 202 203 #ifdef VTKM_ENABLE_OPENMP 204 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKAOS<vtkm::cont::DeviceAdapterTagOpenMP>; 205 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKSingleType<vtkm::cont::DeviceAdapterTagOpenMP>; 206 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ReverseConnectivityVTK<vtkm::cont::DeviceAdapterTagOpenMP>; 207 #endif 208 209 //only when cuda is enabled, and the compiler is cuda 210 #if defined(VTKM_ENABLE_CUDA) && defined(VTKM_CUDA) 211 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKAOS<vtkm::cont::DeviceAdapterTagCuda>; 212 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ConnectivityVTKSingleType<vtkm::cont::DeviceAdapterTagCuda>; 213 extern template class VTKACCELERATORSVTKM_TEMPLATE_EXPORT ReverseConnectivityVTK<vtkm::cont::DeviceAdapterTagCuda>; 214 #endif 215 } 216 } 217 218 219 #endif 220 #endif 221 #endif 222 // VTK-HeaderTest-Exclude: vtkmConnectivityExec.h 223