125 const std::shared_ptr<StructuredBlockForest> &blocks,
126 BlockDataID fieldID_,
127 std::function<
float(
const Cell &,
128 const shared_ptr<StructuredBlockForest> &, IBlock &)>
130 : elementInitaliser(dirichletCallback),
fieldID(fieldID_) {
131 auto createIdxVector = [](IBlock *
const, StructuredBlockStorage *
const) {
134 indexVectorID = blocks->addStructuredBlockData<
IndexVectors>(
135 createIdxVector,
"IndexField_Dirichlet_single_precision_CUDA");
169 ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID,
170 FlagUID domainFlagUID) {
171 for (
auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt)
172 fillFromFlagField<FlagField_T>(blocks, &*blockIt, flagFieldID,
173 boundaryFlagUID, domainFlagUID);
178 IBlock *
block, ConstBlockDataID flagFieldID,
179 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
185 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
187 if (!(flagField->flagExists(boundaryFlagUID) &&
188 flagField->flagExists(domainFlagUID)))
191 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
192 auto domainFlag = flagField->getFlag(domainFlagUID);
194 auto inner = flagField->xyzSize();
195 inner.expand(cell_idx_t(-1));
197 indexVectorAll.clear();
198 indexVectorInner.clear();
199 indexVectorOuter.clear();
201 auto flagWithGLayers = flagField->xyzSizeWithGhostLayer();
202 for (
auto it = flagField->beginWithGhostLayerXYZ(); it != flagField->end();
205 if (!isFlagSet(it, boundaryFlag))
207 if (flagWithGLayers.contains(it.x() + cell_idx_c(0),
208 it.y() + cell_idx_c(0),
209 it.z() + cell_idx_c(0)) &&
210 isFlagSet(it.neighbor(0, 0, 0, 0), domainFlag)) {
212 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
213 float InitialisatonAdditionalData =
214 elementInitaliser(
Cell(it.x(), it.y(), it.z()), blocks, *
block);
215 element.value = InitialisatonAdditionalData;
216 indexVectorAll.emplace_back(element);
217 if (
inner.contains(it.x(), it.y(), it.z()))
218 indexVectorInner.emplace_back(element);
220 indexVectorOuter.emplace_back(element);