127 const std::shared_ptr<StructuredBlockForest> &blocks,
128 BlockDataID fieldID_,
129 std::function<
double(
const Cell &,
130 const shared_ptr<StructuredBlockForest> &, IBlock &)>
132 : elementInitaliser(dirichletCallback),
fieldID(fieldID_) {
133 auto createIdxVector = [](IBlock *
const, StructuredBlockStorage *
const) {
136 indexVectorID = blocks->addStructuredBlockData<
IndexVectors>(
137 createIdxVector,
"IndexField_Dirichlet_double_precision_CUDA");
171 ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID,
172 FlagUID domainFlagUID) {
173 for (
auto &
block : *blocks)
174 fillFromFlagField<FlagField_T>(blocks, &
block, flagFieldID,
175 boundaryFlagUID, domainFlagUID);
180 IBlock *
block, ConstBlockDataID flagFieldID,
181 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
187 auto *flagField =
block->getData<FlagField_T>(flagFieldID);
189 if (!(flagField->flagExists(boundaryFlagUID) &&
190 flagField->flagExists(domainFlagUID)))
193 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
194 auto domainFlag = flagField->getFlag(domainFlagUID);
196 auto inner = flagField->xyzSize();
197 inner.expand(cell_idx_t(-1));
199 indexVectorAll.clear();
200 indexVectorInner.clear();
201 indexVectorOuter.clear();
203 auto flagWithGLayers = flagField->xyzSizeWithGhostLayer();
204 for (
auto it = flagField->beginWithGhostLayerXYZ(); it != flagField->end();
207 if (!isFlagSet(it, boundaryFlag))
209 if (flagWithGLayers.contains(it.x() + cell_idx_c(0),
210 it.y() + cell_idx_c(0),
211 it.z() + cell_idx_c(0)) &&
212 isFlagSet(it.neighbor(0, 0, 0, 0), domainFlag)) {
214 auto element =
IndexInfo(it.x(), it.y(), it.z(), 0);
215 double InitialisatonAdditionalData =
216 elementInitaliser(
Cell(it.x(), it.y(), it.z()), blocks, *
block);
217 element.value = InitialisatonAdditionalData;
218 indexVectorAll.emplace_back(element);
219 if (
inner.contains(it.x(), it.y(), it.z()))
220 indexVectorInner.emplace_back(element);
222 indexVectorOuter.emplace_back(element);