92 const std::shared_ptr<StructuredBlockForest> &blocks,
94 std::function<
float(
const Cell &,
95 const shared_ptr<StructuredBlockForest> &, IBlock &)>
97 : elementInitaliser(dirichletCallback),
fieldID(fieldID_) {
98 auto createIdxVector = [](IBlock *
const, StructuredBlockStorage *
const) {
101 indexVectorID = blocks->addStructuredBlockData<
IndexVectors>(
102 createIdxVector,
"IndexField_Dirichlet_single_precision");
134 ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID,
135 FlagUID domainFlagUID) {
136 for (
auto &
block : *blocks)
137 fillFromFlagField<FlagField_T>(blocks, &
block, flagFieldID,
138 boundaryFlagUID, domainFlagUID);
143 IBlock *
block, ConstBlockDataID flagFieldID,
144 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
150 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
152 if (!(flagField->flagExists(boundaryFlagUID) &&
153 flagField->flagExists(domainFlagUID)))
156 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
157 auto domainFlag = flagField->getFlag(domainFlagUID);
159 auto inner = flagField->xyzSize();
160 inner.expand(cell_idx_t(-1));
162 indexVectorAll.clear();
163 indexVectorInner.clear();
164 indexVectorOuter.clear();
166 auto flagWithGLayers = flagField->xyzSizeWithGhostLayer();
167 for (
auto it = flagField->beginWithGhostLayerXYZ(); it != flagField->end();
170 if (!isFlagSet(it, boundaryFlag))
172 if (flagWithGLayers.contains(it.x() + cell_idx_c(0),
173 it.y() + cell_idx_c(0),
174 it.z() + cell_idx_c(0)) &&
175 isFlagSet(it.neighbor(0, 0, 0, 0), domainFlag)) {
177 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
178 float InitialisatonAdditionalData =
179 elementInitaliser(
Cell(it.x(), it.y(), it.z()), blocks, *
block);
180 element.value = InitialisatonAdditionalData;
181 indexVectorAll.emplace_back(element);
182 if (
inner.contains(it.x(), it.y(), it.z()))
183 indexVectorInner.emplace_back(element);
185 indexVectorOuter.emplace_back(element);