144 const std::shared_ptr<StructuredBlockForest> &blocks,
145 BlockDataID rho_0ID_, BlockDataID rho_1ID_,
float order_0,
float order_1,
146 float rate_coefficient,
float stoech_0,
float stoech_1)
150 auto createIdxVector = [](IBlock *
const, StructuredBlockStorage *
const) {
153 indexVectorID = blocks->addStructuredBlockData<
IndexVectors>(
155 "IndexField_ReactionKernelIndexed_2_single_precision_CUDA");
200 ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID,
201 FlagUID domainFlagUID) {
202 for (
auto &
block : *blocks)
203 fillFromFlagField<FlagField_T>(&
block, flagFieldID, boundaryFlagUID,
209 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
215 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
217 if (!(flagField->flagExists(boundaryFlagUID) and
218 flagField->flagExists(domainFlagUID)))
221 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
222 auto domainFlag = flagField->getFlag(domainFlagUID);
224 auto inner = flagField->xyzSize();
225 inner.expand(cell_idx_t(-1));
227 indexVectorAll.clear();
228 indexVectorInner.clear();
229 indexVectorOuter.clear();
231 auto flagWithGLayers = flagField->xyzSizeWithGhostLayer();
232 for (
auto it = flagField->beginWithGhostLayerXYZ(); it != flagField->end();
235 if (!isFlagSet(it, boundaryFlag))
237 if (flagWithGLayers.contains(it.x() + cell_idx_c(0),
238 it.y() + cell_idx_c(0),
239 it.z() + cell_idx_c(0)) &&
240 isFlagSet(it.neighbor(0, 0, 0, 0), domainFlag)) {
242 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
244 indexVectorAll.emplace_back(element);
245 if (
inner.contains(it.x(), it.y(), it.z()))
246 indexVectorInner.emplace_back(element);
248 indexVectorOuter.emplace_back(element);