61template <
typename A,
typename B,
typename C, std::size_t... AIs, std::size_t... BIs, std::size_t... CIs>
130 auto& tag = blockLattice.template getField<fields::fsi::REDUCED_ELEMENT_TAG>();
135 blockLattice.template getField<FIELDS>())...
137 auto end = thrust::partition(thrust::device,
141 std::size_t nActiveCells = end - begin;
143 if (nActiveCells > 0) {
145 thrust::sort_by_key(thrust::device,
147 tag[0].deviceData() + nActiveCells,
150 blockLattice.template getField<FIELDS>())...
155 auto&
parameters = blockLattice.template getData<OperatorParameters<IntegratePorousElementFieldsO>>().
parameters;
156 if (nActiveCells > 0) {
157 auto reducedElementTag =
parameters.template get<fields::array_of<fields::fsi::REDUCED_ELEMENT_TAG>>();
158 const std::size_t nKeys = thrust::reduce_by_key(
161 tag[0].deviceData() + nActiveCells,
164 blockLattice.template getField<FIELDS>())...
170 thrust::equal_to<T>{},
172 ).first - reducedElementTag;
173 parameters.template set<fields::fsi::REDUCED_ELEMENTS_COUNT>(nKeys);
175 parameters.template set<fields::fsi::REDUCED_ELEMENTS_COUNT>(0);
178 if (nActiveCells > 0) {
179 thrust::fill(thrust::device,
181 tag[0].deviceData() + nActiveCells,