18 #ifndef viskores_cont_internal_ReverseConnectivityBuilder_h
19 #define viskores_cont_internal_ReverseConnectivityBuilder_h
42 template <
typename AtomicHistogram,
typename ConnInPortal,
typename RConnToConnIdxCalc>
45 AtomicHistogram Histo;
47 RConnToConnIdxCalc IdxCalc;
50 BuildHistogram(
const AtomicHistogram& histo,
51 const ConnInPortal& conn,
52 const RConnToConnIdxCalc& idxCalc)
65 this->Histo.Add(ptId, 1);
69 template <
typename AtomicHistogram,
70 typename ConnInPortal,
71 typename ROffsetInPortal,
72 typename RConnOutPortal,
73 typename RConnToConnIdxCalc,
74 typename ConnIdxToCellIdxCalc>
77 AtomicHistogram Histo;
79 ROffsetInPortal ROffsets;
81 RConnToConnIdxCalc IdxCalc;
82 ConnIdxToCellIdxCalc CellIdCalc;
85 GenerateRConn(
const AtomicHistogram& histo,
86 const ConnInPortal& conn,
87 const ROffsetInPortal& rOffsets,
88 const RConnOutPortal& rconn,
89 const RConnToConnIdxCalc& idxCalc,
90 const ConnIdxToCellIdxCalc& cellIdCalc)
96 , CellIdCalc(cellIdCalc)
111 const viskores::Id baseOffset = this->ROffsets.Get(ptId);
114 const viskores::Id nextAvailable = this->Histo.Add(ptId, 1);
117 const viskores::Id rconnIdx = baseOffset + nextAvailable;
118 this->RConn.Set(rconnIdx, cellId);
137 class ReverseConnectivityBuilder
141 template <
typename ConnArray,
143 typename ROffsetsArray,
144 typename RConnToConnIdxCalc,
145 typename ConnIdxToCellIdxCalc>
146 inline void Run(
const ConnArray& conn,
148 ROffsetsArray& rOffsets,
149 const RConnToConnIdxCalc& rConnToConnCalc,
150 const ConnIdxToCellIdxCalc& cellIdCalc,
156 auto connPortal = conn.PrepareForInput(device, connToken);
175 auto ac = atomicCounter.PrepareForExecution(device, token);
177 rcb::BuildHistogram<decltype(ac), decltype(connPortal), RConnToConnIdxCalc>;
178 BuildHisto histoGen{ ac, connPortal, rConnToConnCalc };
185 device, viskores::cont::make_ArrayHandleCast<viskores::Id>(rNumIndices), rOffsets);
208 auto ac = atomicCounter.PrepareForExecution(device, token);
209 auto rOffsetPortal = rOffsets.PrepareForInput(device, token);
210 auto rConnPortal = rConn.PrepareForOutput(rConnSize, device, token);
212 using GenRConnT = rcb::GenerateRConn<decltype(ac),
213 decltype(connPortal),
214 decltype(rOffsetPortal),
215 decltype(rConnPortal),
217 ConnIdxToCellIdxCalc>;
218 GenRConnT rConnGen{ ac, connPortal, rOffsetPortal, rConnPortal, rConnToConnCalc, cellIdCalc };
240 template <
typename OffsetsPortalType>
241 struct ConnIdxToCellIdCalc
243 OffsetsPortalType Offsets;
246 ConnIdxToCellIdCalc(
const OffsetsPortalType& offsets)
258 viskores::Id length = this->Offsets.GetNumberOfValues();
268 length -= halfway + 1;
276 upperBoundIdx = first;
279 return upperBoundIdx - 1;
284 struct ConnIdxToCellIdCalcSingleType
298 template <
typename ConnTableT,
typename RConnTableT>
299 void ComputeRConnTable(RConnTableT& rConnTable,
300 const ConnTableT& connTable,
304 if (rConnTable.ElementsValid)
309 const auto& conn = connTable.Connectivity;
310 auto& rConn = rConnTable.Connectivity;
311 auto& rOffsets = rConnTable.Offsets;
312 const viskores::Id rConnSize = conn.GetNumberOfValues();
316 const auto offInPortal = connTable.Offsets.PrepareForInput(device, token);
318 PassThrough idxCalc{};
319 ConnIdxToCellIdCalc<decltype(offInPortal)> cellIdCalc{ offInPortal };
321 viskores::cont::internal::ReverseConnectivityBuilder builder;
322 builder.Run(conn, rConn, rOffsets, idxCalc, cellIdCalc, numberOfPoints, rConnSize, device);
327 rConnTable.ElementsValid =
true;
331 template <
typename RConnTableT,
typename ConnectivityStorageTag>
332 void ComputeRConnTable(
333 RConnTableT& rConnTable,
334 const ConnectivityExplicitInternals<
336 ConnectivityStorageTag,
341 if (rConnTable.ElementsValid)
346 const auto& conn = connTable.Connectivity;
347 auto& rConn = rConnTable.Connectivity;
348 auto& rOffsets = rConnTable.Offsets;
349 const viskores::Id rConnSize = conn.GetNumberOfValues();
353 if (connTable.Offsets.GetNumberOfValues() >= 2)
361 PassThrough idxCalc{};
362 ConnIdxToCellIdCalcSingleType cellIdCalc{ cellSize };
364 viskores::cont::internal::ReverseConnectivityBuilder builder;
365 builder.Run(conn, rConn, rOffsets, idxCalc, cellIdCalc, numberOfPoints, rConnSize, device);
369 rConnTable.ElementsValid =
true;
376 #endif // ReverseConnectivityBuilder_h