144 const std::shared_ptr<StructuredBlockForest> &blocks,
145 BlockDataID rho_0ID_, BlockDataID rho_1ID_, BlockDataID rho_2ID_,
146 BlockDataID rho_3ID_,
float order_0,
float order_1,
float order_2,
147 float order_3,
float rate_coefficient,
float stoech_0,
float stoech_1,
148 float stoech_2,
float stoech_3)
154 auto createIdxVector = [](IBlock *
const, StructuredBlockStorage *
const) {
157 indexVectorID = blocks->addStructuredBlockData<
IndexVectors>(
159 "IndexField_ReactionKernelIndexed_4_single_precision_CUDA");
204 ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID,
205 FlagUID domainFlagUID) {
206 for (
auto &
block : *blocks)
207 fillFromFlagField<FlagField_T>(&
block, flagFieldID, boundaryFlagUID,
213 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
219 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
221 if (!(flagField->flagExists(boundaryFlagUID) and
222 flagField->flagExists(domainFlagUID)))
225 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
226 auto domainFlag = flagField->getFlag(domainFlagUID);
228 auto inner = flagField->xyzSize();
229 inner.expand(cell_idx_t(-1));
231 indexVectorAll.clear();
232 indexVectorInner.clear();
233 indexVectorOuter.clear();
235 auto flagWithGLayers = flagField->xyzSizeWithGhostLayer();
236 for (
auto it = flagField->beginWithGhostLayerXYZ(); it != flagField->end();
239 if (!isFlagSet(it, boundaryFlag))
241 if (flagWithGLayers.contains(it.x() + cell_idx_c(0),
242 it.y() + cell_idx_c(0),
243 it.z() + cell_idx_c(0)) &&
244 isFlagSet(it.neighbor(0, 0, 0, 0), domainFlag)) {
246 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
248 indexVectorAll.emplace_back(element);
249 if (
inner.contains(it.x(), it.y(), it.z()))
250 indexVectorInner.emplace_back(element);
252 indexVectorOuter.emplace_back(element);