ESPResSo
Extensible Simulation Package for Research on Soft Matter Systems
Loading...
Searching...
No Matches
FixedFlux_single_precision.h
Go to the documentation of this file.
1//======================================================================================================================
2//
3// This file is part of waLBerla. waLBerla is free software: you can
4// redistribute it and/or modify it under the terms of the GNU General Public
5// License as published by the Free Software Foundation, either version 3 of
6// the License, or (at your option) any later version.
7//
8// waLBerla is distributed in the hope that it will be useful, but WITHOUT
9// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11// for more details.
12//
13// You should have received a copy of the GNU General Public License along
14// with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
15//
16//! \\file FixedFlux_single_precision.h
17//! \\author pystencils
18//======================================================================================================================
19
20// kernel generated with pystencils v1.3.7+13.gdfd203a, lbmpy
21// v1.3.7+10.gd3f6236, sympy v1.12.1, lbmpy_walberla/pystencils_walberla from
22// waLBerla commit 191cf58b16b96d1d2f050dcbd9e88443995b2222
23
24#pragma once
25#include "core/DataTypes.h"
26#include "core/logging/Logging.h"
27
28#include "blockforest/StructuredBlockForest.h"
29#include "core/debug/Debug.h"
30#include "domain_decomposition/BlockDataID.h"
31#include "domain_decomposition/IBlock.h"
32#include "field/FlagField.h"
33#include "field/GhostLayerField.h"
34
35#include <functional>
36#include <memory>
37#include <vector>
38
39#ifdef __GNUC__
40#define RESTRICT __restrict__
41#elif _MSC_VER
42#define RESTRICT __restrict
43#else
44#define RESTRICT
45#endif
46
47#ifdef WALBERLA_BUILD_WITH_HALF_PRECISION_SUPPORT
48using walberla::half;
49#endif
50
51namespace walberla {
52namespace pystencils {
53
55public:
56 struct IndexInfo {
57 int32_t x;
58 int32_t y;
59 int32_t z;
60 int32_t dir;
61 float flux_0;
62 float flux_1;
63 float flux_2;
64 IndexInfo(int32_t x_, int32_t y_, int32_t z_, int32_t dir_)
65 : x(x_), y(y_), z(z_), dir(dir_), flux_0(), flux_1(), flux_2() {}
66 bool operator==(const IndexInfo &o) const {
67 return x == o.x && y == o.y && z == o.z && dir == o.dir &&
68 floatIsEqual(flux_0, o.flux_0) && floatIsEqual(flux_1, o.flux_1) &&
69 floatIsEqual(flux_2, o.flux_2);
70 }
71 };
72
74 public:
75 using CpuIndexVector = std::vector<IndexInfo>;
76
77 enum Type { ALL = 0, INNER = 1, OUTER = 2, NUM_TYPES = 3 };
78
79 IndexVectors() = default;
80 bool operator==(IndexVectors const &other) const {
81 return other.cpuVectors_ == cpuVectors_;
82 }
83
84 auto &indexVector(Type t) { return cpuVectors_[t]; }
85 auto const &indexVector(Type t) const { return cpuVectors_[t]; }
87 return cpuVectors_[t].empty() ? nullptr : cpuVectors_[t].data();
88 }
89
90 void syncGPU() {}
91
92 private:
93 std::vector<CpuIndexVector> cpuVectors_{NUM_TYPES};
94 };
95
97 const std::shared_ptr<StructuredBlockForest> &blocks, BlockDataID fluxID_,
98 std::function<Vector3<float>(const Cell &,
99 const shared_ptr<StructuredBlockForest> &,
100 IBlock &)> &fluxCallback)
101 : elementInitaliser(fluxCallback), fluxID(fluxID_) {
102 auto createIdxVector = [](IBlock *const, StructuredBlockStorage *const) {
103 return new IndexVectors();
104 };
105 indexVectorID = blocks->addStructuredBlockData<IndexVectors>(
106 createIdxVector, "IndexField_FixedFlux_single_precision");
107 }
108
109 void run(IBlock *block);
110
111 void operator()(IBlock *block) { run(block); }
112
113 void inner(IBlock *block);
114
115 void outer(IBlock *block);
116
117 Vector3<float> getForce(IBlock * /*block*/) {
118
119 WALBERLA_ABORT(
120 "Boundary condition was not generated including force calculation.")
121 return Vector3<float>(float_c(0.0));
122 }
123
124 std::function<void(IBlock *)> getSweep() {
125 return [this](IBlock *b) { this->run(b); };
126 }
127
128 std::function<void(IBlock *)> getInnerSweep() {
129 return [this](IBlock *b) { this->inner(b); };
130 }
131
132 std::function<void(IBlock *)> getOuterSweep() {
133 return [this](IBlock *b) { this->outer(b); };
134 }
135
136 template <typename FlagField_T>
137 void fillFromFlagField(const std::shared_ptr<StructuredBlockForest> &blocks,
138 ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID,
139 FlagUID domainFlagUID) {
140 for (auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt)
141 fillFromFlagField<FlagField_T>(blocks, &*blockIt, flagFieldID,
142 boundaryFlagUID, domainFlagUID);
143 }
144
145 template <typename FlagField_T>
146 void fillFromFlagField(const shared_ptr<StructuredBlockForest> &blocks,
147 IBlock *block, ConstBlockDataID flagFieldID,
148 FlagUID boundaryFlagUID, FlagUID domainFlagUID) {
149 auto *indexVectors = block->getData<IndexVectors>(indexVectorID);
150 auto &indexVectorAll = indexVectors->indexVector(IndexVectors::ALL);
151 auto &indexVectorInner = indexVectors->indexVector(IndexVectors::INNER);
152 auto &indexVectorOuter = indexVectors->indexVector(IndexVectors::OUTER);
153
154 auto *flagField = block->getData<FlagField_T>(flagFieldID);
155
156 if (!(flagField->flagExists(boundaryFlagUID) &&
157 flagField->flagExists(domainFlagUID)))
158 return;
159
160 auto boundaryFlag = flagField->getFlag(boundaryFlagUID);
161 auto domainFlag = flagField->getFlag(domainFlagUID);
162
163 auto inner = flagField->xyzSize();
164 inner.expand(cell_idx_t(-1));
165
166 indexVectorAll.clear();
167 indexVectorInner.clear();
168 indexVectorOuter.clear();
169
170 for (auto it = flagField->beginWithGhostLayerXYZ(
171 cell_idx_c(flagField->nrOfGhostLayers() - 1));
172 it != flagField->end(); ++it) {
173 if (!isFlagSet(it, domainFlag))
174 continue;
175
176 if (isFlagSet(it.neighbor(0, 0, 0, 0), boundaryFlag)) {
177 auto element = IndexInfo(it.x(), it.y(), it.z(), 0);
178 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
179 Cell(it.x() + 0, it.y() + 0, it.z() + 0), blocks, *block);
180 element.flux_0 = InitialisatonAdditionalData[0];
181 element.flux_1 = InitialisatonAdditionalData[1];
182 element.flux_2 = InitialisatonAdditionalData[2];
183 indexVectorAll.emplace_back(element);
184 if (inner.contains(it.x(), it.y(), it.z()))
185 indexVectorInner.emplace_back(element);
186 else
187 indexVectorOuter.emplace_back(element);
188 }
189 }
190
191 for (auto it = flagField->beginWithGhostLayerXYZ(
192 cell_idx_c(flagField->nrOfGhostLayers() - 1));
193 it != flagField->end(); ++it) {
194 if (!isFlagSet(it, domainFlag))
195 continue;
196
197 if (isFlagSet(it.neighbor(0, 1, 0, 0), boundaryFlag)) {
198 auto element = IndexInfo(it.x(), it.y(), it.z(), 1);
199 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
200 Cell(it.x() + 0, it.y() + 1, it.z() + 0), blocks, *block);
201 element.flux_0 = InitialisatonAdditionalData[0];
202 element.flux_1 = InitialisatonAdditionalData[1];
203 element.flux_2 = InitialisatonAdditionalData[2];
204 indexVectorAll.emplace_back(element);
205 if (inner.contains(it.x(), it.y(), it.z()))
206 indexVectorInner.emplace_back(element);
207 else
208 indexVectorOuter.emplace_back(element);
209 }
210 }
211
212 for (auto it = flagField->beginWithGhostLayerXYZ(
213 cell_idx_c(flagField->nrOfGhostLayers() - 1));
214 it != flagField->end(); ++it) {
215 if (!isFlagSet(it, domainFlag))
216 continue;
217
218 if (isFlagSet(it.neighbor(0, -1, 0, 0), boundaryFlag)) {
219 auto element = IndexInfo(it.x(), it.y(), it.z(), 2);
220 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
221 Cell(it.x() + 0, it.y() + -1, it.z() + 0), blocks, *block);
222 element.flux_0 = InitialisatonAdditionalData[0];
223 element.flux_1 = InitialisatonAdditionalData[1];
224 element.flux_2 = InitialisatonAdditionalData[2];
225 indexVectorAll.emplace_back(element);
226 if (inner.contains(it.x(), it.y(), it.z()))
227 indexVectorInner.emplace_back(element);
228 else
229 indexVectorOuter.emplace_back(element);
230 }
231 }
232
233 for (auto it = flagField->beginWithGhostLayerXYZ(
234 cell_idx_c(flagField->nrOfGhostLayers() - 1));
235 it != flagField->end(); ++it) {
236 if (!isFlagSet(it, domainFlag))
237 continue;
238
239 if (isFlagSet(it.neighbor(-1, 0, 0, 0), boundaryFlag)) {
240 auto element = IndexInfo(it.x(), it.y(), it.z(), 3);
241 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
242 Cell(it.x() + -1, it.y() + 0, it.z() + 0), blocks, *block);
243 element.flux_0 = InitialisatonAdditionalData[0];
244 element.flux_1 = InitialisatonAdditionalData[1];
245 element.flux_2 = InitialisatonAdditionalData[2];
246 indexVectorAll.emplace_back(element);
247 if (inner.contains(it.x(), it.y(), it.z()))
248 indexVectorInner.emplace_back(element);
249 else
250 indexVectorOuter.emplace_back(element);
251 }
252 }
253
254 for (auto it = flagField->beginWithGhostLayerXYZ(
255 cell_idx_c(flagField->nrOfGhostLayers() - 1));
256 it != flagField->end(); ++it) {
257 if (!isFlagSet(it, domainFlag))
258 continue;
259
260 if (isFlagSet(it.neighbor(1, 0, 0, 0), boundaryFlag)) {
261 auto element = IndexInfo(it.x(), it.y(), it.z(), 4);
262 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
263 Cell(it.x() + 1, it.y() + 0, it.z() + 0), blocks, *block);
264 element.flux_0 = InitialisatonAdditionalData[0];
265 element.flux_1 = InitialisatonAdditionalData[1];
266 element.flux_2 = InitialisatonAdditionalData[2];
267 indexVectorAll.emplace_back(element);
268 if (inner.contains(it.x(), it.y(), it.z()))
269 indexVectorInner.emplace_back(element);
270 else
271 indexVectorOuter.emplace_back(element);
272 }
273 }
274
275 for (auto it = flagField->beginWithGhostLayerXYZ(
276 cell_idx_c(flagField->nrOfGhostLayers() - 1));
277 it != flagField->end(); ++it) {
278 if (!isFlagSet(it, domainFlag))
279 continue;
280
281 if (isFlagSet(it.neighbor(0, 0, 1, 0), boundaryFlag)) {
282 auto element = IndexInfo(it.x(), it.y(), it.z(), 5);
283 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
284 Cell(it.x() + 0, it.y() + 0, it.z() + 1), blocks, *block);
285 element.flux_0 = InitialisatonAdditionalData[0];
286 element.flux_1 = InitialisatonAdditionalData[1];
287 element.flux_2 = InitialisatonAdditionalData[2];
288 indexVectorAll.emplace_back(element);
289 if (inner.contains(it.x(), it.y(), it.z()))
290 indexVectorInner.emplace_back(element);
291 else
292 indexVectorOuter.emplace_back(element);
293 }
294 }
295
296 for (auto it = flagField->beginWithGhostLayerXYZ(
297 cell_idx_c(flagField->nrOfGhostLayers() - 1));
298 it != flagField->end(); ++it) {
299 if (!isFlagSet(it, domainFlag))
300 continue;
301
302 if (isFlagSet(it.neighbor(0, 0, -1, 0), boundaryFlag)) {
303 auto element = IndexInfo(it.x(), it.y(), it.z(), 6);
304 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
305 Cell(it.x() + 0, it.y() + 0, it.z() + -1), blocks, *block);
306 element.flux_0 = InitialisatonAdditionalData[0];
307 element.flux_1 = InitialisatonAdditionalData[1];
308 element.flux_2 = InitialisatonAdditionalData[2];
309 indexVectorAll.emplace_back(element);
310 if (inner.contains(it.x(), it.y(), it.z()))
311 indexVectorInner.emplace_back(element);
312 else
313 indexVectorOuter.emplace_back(element);
314 }
315 }
316
317 for (auto it = flagField->beginWithGhostLayerXYZ(
318 cell_idx_c(flagField->nrOfGhostLayers() - 1));
319 it != flagField->end(); ++it) {
320 if (!isFlagSet(it, domainFlag))
321 continue;
322
323 if (isFlagSet(it.neighbor(-1, 1, 0, 0), boundaryFlag)) {
324 auto element = IndexInfo(it.x(), it.y(), it.z(), 7);
325 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
326 Cell(it.x() + -1, it.y() + 1, it.z() + 0), blocks, *block);
327 element.flux_0 = InitialisatonAdditionalData[0];
328 element.flux_1 = InitialisatonAdditionalData[1];
329 element.flux_2 = InitialisatonAdditionalData[2];
330 indexVectorAll.emplace_back(element);
331 if (inner.contains(it.x(), it.y(), it.z()))
332 indexVectorInner.emplace_back(element);
333 else
334 indexVectorOuter.emplace_back(element);
335 }
336 }
337
338 for (auto it = flagField->beginWithGhostLayerXYZ(
339 cell_idx_c(flagField->nrOfGhostLayers() - 1));
340 it != flagField->end(); ++it) {
341 if (!isFlagSet(it, domainFlag))
342 continue;
343
344 if (isFlagSet(it.neighbor(1, 1, 0, 0), boundaryFlag)) {
345 auto element = IndexInfo(it.x(), it.y(), it.z(), 8);
346 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
347 Cell(it.x() + 1, it.y() + 1, it.z() + 0), blocks, *block);
348 element.flux_0 = InitialisatonAdditionalData[0];
349 element.flux_1 = InitialisatonAdditionalData[1];
350 element.flux_2 = InitialisatonAdditionalData[2];
351 indexVectorAll.emplace_back(element);
352 if (inner.contains(it.x(), it.y(), it.z()))
353 indexVectorInner.emplace_back(element);
354 else
355 indexVectorOuter.emplace_back(element);
356 }
357 }
358
359 for (auto it = flagField->beginWithGhostLayerXYZ(
360 cell_idx_c(flagField->nrOfGhostLayers() - 1));
361 it != flagField->end(); ++it) {
362 if (!isFlagSet(it, domainFlag))
363 continue;
364
365 if (isFlagSet(it.neighbor(-1, -1, 0, 0), boundaryFlag)) {
366 auto element = IndexInfo(it.x(), it.y(), it.z(), 9);
367 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
368 Cell(it.x() + -1, it.y() + -1, it.z() + 0), blocks, *block);
369 element.flux_0 = InitialisatonAdditionalData[0];
370 element.flux_1 = InitialisatonAdditionalData[1];
371 element.flux_2 = InitialisatonAdditionalData[2];
372 indexVectorAll.emplace_back(element);
373 if (inner.contains(it.x(), it.y(), it.z()))
374 indexVectorInner.emplace_back(element);
375 else
376 indexVectorOuter.emplace_back(element);
377 }
378 }
379
380 for (auto it = flagField->beginWithGhostLayerXYZ(
381 cell_idx_c(flagField->nrOfGhostLayers() - 1));
382 it != flagField->end(); ++it) {
383 if (!isFlagSet(it, domainFlag))
384 continue;
385
386 if (isFlagSet(it.neighbor(1, -1, 0, 0), boundaryFlag)) {
387 auto element = IndexInfo(it.x(), it.y(), it.z(), 10);
388 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
389 Cell(it.x() + 1, it.y() + -1, it.z() + 0), blocks, *block);
390 element.flux_0 = InitialisatonAdditionalData[0];
391 element.flux_1 = InitialisatonAdditionalData[1];
392 element.flux_2 = InitialisatonAdditionalData[2];
393 indexVectorAll.emplace_back(element);
394 if (inner.contains(it.x(), it.y(), it.z()))
395 indexVectorInner.emplace_back(element);
396 else
397 indexVectorOuter.emplace_back(element);
398 }
399 }
400
401 for (auto it = flagField->beginWithGhostLayerXYZ(
402 cell_idx_c(flagField->nrOfGhostLayers() - 1));
403 it != flagField->end(); ++it) {
404 if (!isFlagSet(it, domainFlag))
405 continue;
406
407 if (isFlagSet(it.neighbor(0, 1, 1, 0), boundaryFlag)) {
408 auto element = IndexInfo(it.x(), it.y(), it.z(), 11);
409 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
410 Cell(it.x() + 0, it.y() + 1, it.z() + 1), blocks, *block);
411 element.flux_0 = InitialisatonAdditionalData[0];
412 element.flux_1 = InitialisatonAdditionalData[1];
413 element.flux_2 = InitialisatonAdditionalData[2];
414 indexVectorAll.emplace_back(element);
415 if (inner.contains(it.x(), it.y(), it.z()))
416 indexVectorInner.emplace_back(element);
417 else
418 indexVectorOuter.emplace_back(element);
419 }
420 }
421
422 for (auto it = flagField->beginWithGhostLayerXYZ(
423 cell_idx_c(flagField->nrOfGhostLayers() - 1));
424 it != flagField->end(); ++it) {
425 if (!isFlagSet(it, domainFlag))
426 continue;
427
428 if (isFlagSet(it.neighbor(0, -1, 1, 0), boundaryFlag)) {
429 auto element = IndexInfo(it.x(), it.y(), it.z(), 12);
430 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
431 Cell(it.x() + 0, it.y() + -1, it.z() + 1), blocks, *block);
432 element.flux_0 = InitialisatonAdditionalData[0];
433 element.flux_1 = InitialisatonAdditionalData[1];
434 element.flux_2 = InitialisatonAdditionalData[2];
435 indexVectorAll.emplace_back(element);
436 if (inner.contains(it.x(), it.y(), it.z()))
437 indexVectorInner.emplace_back(element);
438 else
439 indexVectorOuter.emplace_back(element);
440 }
441 }
442
443 for (auto it = flagField->beginWithGhostLayerXYZ(
444 cell_idx_c(flagField->nrOfGhostLayers() - 1));
445 it != flagField->end(); ++it) {
446 if (!isFlagSet(it, domainFlag))
447 continue;
448
449 if (isFlagSet(it.neighbor(-1, 0, 1, 0), boundaryFlag)) {
450 auto element = IndexInfo(it.x(), it.y(), it.z(), 13);
451 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
452 Cell(it.x() + -1, it.y() + 0, it.z() + 1), blocks, *block);
453 element.flux_0 = InitialisatonAdditionalData[0];
454 element.flux_1 = InitialisatonAdditionalData[1];
455 element.flux_2 = InitialisatonAdditionalData[2];
456 indexVectorAll.emplace_back(element);
457 if (inner.contains(it.x(), it.y(), it.z()))
458 indexVectorInner.emplace_back(element);
459 else
460 indexVectorOuter.emplace_back(element);
461 }
462 }
463
464 for (auto it = flagField->beginWithGhostLayerXYZ(
465 cell_idx_c(flagField->nrOfGhostLayers() - 1));
466 it != flagField->end(); ++it) {
467 if (!isFlagSet(it, domainFlag))
468 continue;
469
470 if (isFlagSet(it.neighbor(1, 0, 1, 0), boundaryFlag)) {
471 auto element = IndexInfo(it.x(), it.y(), it.z(), 14);
472 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
473 Cell(it.x() + 1, it.y() + 0, it.z() + 1), blocks, *block);
474 element.flux_0 = InitialisatonAdditionalData[0];
475 element.flux_1 = InitialisatonAdditionalData[1];
476 element.flux_2 = InitialisatonAdditionalData[2];
477 indexVectorAll.emplace_back(element);
478 if (inner.contains(it.x(), it.y(), it.z()))
479 indexVectorInner.emplace_back(element);
480 else
481 indexVectorOuter.emplace_back(element);
482 }
483 }
484
485 for (auto it = flagField->beginWithGhostLayerXYZ(
486 cell_idx_c(flagField->nrOfGhostLayers() - 1));
487 it != flagField->end(); ++it) {
488 if (!isFlagSet(it, domainFlag))
489 continue;
490
491 if (isFlagSet(it.neighbor(0, 1, -1, 0), boundaryFlag)) {
492 auto element = IndexInfo(it.x(), it.y(), it.z(), 15);
493 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
494 Cell(it.x() + 0, it.y() + 1, it.z() + -1), blocks, *block);
495 element.flux_0 = InitialisatonAdditionalData[0];
496 element.flux_1 = InitialisatonAdditionalData[1];
497 element.flux_2 = InitialisatonAdditionalData[2];
498 indexVectorAll.emplace_back(element);
499 if (inner.contains(it.x(), it.y(), it.z()))
500 indexVectorInner.emplace_back(element);
501 else
502 indexVectorOuter.emplace_back(element);
503 }
504 }
505
506 for (auto it = flagField->beginWithGhostLayerXYZ(
507 cell_idx_c(flagField->nrOfGhostLayers() - 1));
508 it != flagField->end(); ++it) {
509 if (!isFlagSet(it, domainFlag))
510 continue;
511
512 if (isFlagSet(it.neighbor(0, -1, -1, 0), boundaryFlag)) {
513 auto element = IndexInfo(it.x(), it.y(), it.z(), 16);
514 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
515 Cell(it.x() + 0, it.y() + -1, it.z() + -1), blocks, *block);
516 element.flux_0 = InitialisatonAdditionalData[0];
517 element.flux_1 = InitialisatonAdditionalData[1];
518 element.flux_2 = InitialisatonAdditionalData[2];
519 indexVectorAll.emplace_back(element);
520 if (inner.contains(it.x(), it.y(), it.z()))
521 indexVectorInner.emplace_back(element);
522 else
523 indexVectorOuter.emplace_back(element);
524 }
525 }
526
527 for (auto it = flagField->beginWithGhostLayerXYZ(
528 cell_idx_c(flagField->nrOfGhostLayers() - 1));
529 it != flagField->end(); ++it) {
530 if (!isFlagSet(it, domainFlag))
531 continue;
532
533 if (isFlagSet(it.neighbor(-1, 0, -1, 0), boundaryFlag)) {
534 auto element = IndexInfo(it.x(), it.y(), it.z(), 17);
535 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
536 Cell(it.x() + -1, it.y() + 0, it.z() + -1), blocks, *block);
537 element.flux_0 = InitialisatonAdditionalData[0];
538 element.flux_1 = InitialisatonAdditionalData[1];
539 element.flux_2 = InitialisatonAdditionalData[2];
540 indexVectorAll.emplace_back(element);
541 if (inner.contains(it.x(), it.y(), it.z()))
542 indexVectorInner.emplace_back(element);
543 else
544 indexVectorOuter.emplace_back(element);
545 }
546 }
547
548 for (auto it = flagField->beginWithGhostLayerXYZ(
549 cell_idx_c(flagField->nrOfGhostLayers() - 1));
550 it != flagField->end(); ++it) {
551 if (!isFlagSet(it, domainFlag))
552 continue;
553
554 if (isFlagSet(it.neighbor(1, 0, -1, 0), boundaryFlag)) {
555 auto element = IndexInfo(it.x(), it.y(), it.z(), 18);
556 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
557 Cell(it.x() + 1, it.y() + 0, it.z() + -1), blocks, *block);
558 element.flux_0 = InitialisatonAdditionalData[0];
559 element.flux_1 = InitialisatonAdditionalData[1];
560 element.flux_2 = InitialisatonAdditionalData[2];
561 indexVectorAll.emplace_back(element);
562 if (inner.contains(it.x(), it.y(), it.z()))
563 indexVectorInner.emplace_back(element);
564 else
565 indexVectorOuter.emplace_back(element);
566 }
567 }
568
569 for (auto it = flagField->beginWithGhostLayerXYZ(
570 cell_idx_c(flagField->nrOfGhostLayers() - 1));
571 it != flagField->end(); ++it) {
572 if (!isFlagSet(it, domainFlag))
573 continue;
574
575 if (isFlagSet(it.neighbor(1, 1, 1, 0), boundaryFlag)) {
576 auto element = IndexInfo(it.x(), it.y(), it.z(), 19);
577 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
578 Cell(it.x() + 1, it.y() + 1, it.z() + 1), blocks, *block);
579 element.flux_0 = InitialisatonAdditionalData[0];
580 element.flux_1 = InitialisatonAdditionalData[1];
581 element.flux_2 = InitialisatonAdditionalData[2];
582 indexVectorAll.emplace_back(element);
583 if (inner.contains(it.x(), it.y(), it.z()))
584 indexVectorInner.emplace_back(element);
585 else
586 indexVectorOuter.emplace_back(element);
587 }
588 }
589
590 for (auto it = flagField->beginWithGhostLayerXYZ(
591 cell_idx_c(flagField->nrOfGhostLayers() - 1));
592 it != flagField->end(); ++it) {
593 if (!isFlagSet(it, domainFlag))
594 continue;
595
596 if (isFlagSet(it.neighbor(-1, 1, 1, 0), boundaryFlag)) {
597 auto element = IndexInfo(it.x(), it.y(), it.z(), 20);
598 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
599 Cell(it.x() + -1, it.y() + 1, it.z() + 1), blocks, *block);
600 element.flux_0 = InitialisatonAdditionalData[0];
601 element.flux_1 = InitialisatonAdditionalData[1];
602 element.flux_2 = InitialisatonAdditionalData[2];
603 indexVectorAll.emplace_back(element);
604 if (inner.contains(it.x(), it.y(), it.z()))
605 indexVectorInner.emplace_back(element);
606 else
607 indexVectorOuter.emplace_back(element);
608 }
609 }
610
611 for (auto it = flagField->beginWithGhostLayerXYZ(
612 cell_idx_c(flagField->nrOfGhostLayers() - 1));
613 it != flagField->end(); ++it) {
614 if (!isFlagSet(it, domainFlag))
615 continue;
616
617 if (isFlagSet(it.neighbor(1, -1, 1, 0), boundaryFlag)) {
618 auto element = IndexInfo(it.x(), it.y(), it.z(), 21);
619 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
620 Cell(it.x() + 1, it.y() + -1, it.z() + 1), blocks, *block);
621 element.flux_0 = InitialisatonAdditionalData[0];
622 element.flux_1 = InitialisatonAdditionalData[1];
623 element.flux_2 = InitialisatonAdditionalData[2];
624 indexVectorAll.emplace_back(element);
625 if (inner.contains(it.x(), it.y(), it.z()))
626 indexVectorInner.emplace_back(element);
627 else
628 indexVectorOuter.emplace_back(element);
629 }
630 }
631
632 for (auto it = flagField->beginWithGhostLayerXYZ(
633 cell_idx_c(flagField->nrOfGhostLayers() - 1));
634 it != flagField->end(); ++it) {
635 if (!isFlagSet(it, domainFlag))
636 continue;
637
638 if (isFlagSet(it.neighbor(-1, -1, 1, 0), boundaryFlag)) {
639 auto element = IndexInfo(it.x(), it.y(), it.z(), 22);
640 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
641 Cell(it.x() + -1, it.y() + -1, it.z() + 1), blocks, *block);
642 element.flux_0 = InitialisatonAdditionalData[0];
643 element.flux_1 = InitialisatonAdditionalData[1];
644 element.flux_2 = InitialisatonAdditionalData[2];
645 indexVectorAll.emplace_back(element);
646 if (inner.contains(it.x(), it.y(), it.z()))
647 indexVectorInner.emplace_back(element);
648 else
649 indexVectorOuter.emplace_back(element);
650 }
651 }
652
653 for (auto it = flagField->beginWithGhostLayerXYZ(
654 cell_idx_c(flagField->nrOfGhostLayers() - 1));
655 it != flagField->end(); ++it) {
656 if (!isFlagSet(it, domainFlag))
657 continue;
658
659 if (isFlagSet(it.neighbor(1, 1, -1, 0), boundaryFlag)) {
660 auto element = IndexInfo(it.x(), it.y(), it.z(), 23);
661 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
662 Cell(it.x() + 1, it.y() + 1, it.z() + -1), blocks, *block);
663 element.flux_0 = InitialisatonAdditionalData[0];
664 element.flux_1 = InitialisatonAdditionalData[1];
665 element.flux_2 = InitialisatonAdditionalData[2];
666 indexVectorAll.emplace_back(element);
667 if (inner.contains(it.x(), it.y(), it.z()))
668 indexVectorInner.emplace_back(element);
669 else
670 indexVectorOuter.emplace_back(element);
671 }
672 }
673
674 for (auto it = flagField->beginWithGhostLayerXYZ(
675 cell_idx_c(flagField->nrOfGhostLayers() - 1));
676 it != flagField->end(); ++it) {
677 if (!isFlagSet(it, domainFlag))
678 continue;
679
680 if (isFlagSet(it.neighbor(-1, 1, -1, 0), boundaryFlag)) {
681 auto element = IndexInfo(it.x(), it.y(), it.z(), 24);
682 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
683 Cell(it.x() + -1, it.y() + 1, it.z() + -1), blocks, *block);
684 element.flux_0 = InitialisatonAdditionalData[0];
685 element.flux_1 = InitialisatonAdditionalData[1];
686 element.flux_2 = InitialisatonAdditionalData[2];
687 indexVectorAll.emplace_back(element);
688 if (inner.contains(it.x(), it.y(), it.z()))
689 indexVectorInner.emplace_back(element);
690 else
691 indexVectorOuter.emplace_back(element);
692 }
693 }
694
695 for (auto it = flagField->beginWithGhostLayerXYZ(
696 cell_idx_c(flagField->nrOfGhostLayers() - 1));
697 it != flagField->end(); ++it) {
698 if (!isFlagSet(it, domainFlag))
699 continue;
700
701 if (isFlagSet(it.neighbor(1, -1, -1, 0), boundaryFlag)) {
702 auto element = IndexInfo(it.x(), it.y(), it.z(), 25);
703 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
704 Cell(it.x() + 1, it.y() + -1, it.z() + -1), blocks, *block);
705 element.flux_0 = InitialisatonAdditionalData[0];
706 element.flux_1 = InitialisatonAdditionalData[1];
707 element.flux_2 = InitialisatonAdditionalData[2];
708 indexVectorAll.emplace_back(element);
709 if (inner.contains(it.x(), it.y(), it.z()))
710 indexVectorInner.emplace_back(element);
711 else
712 indexVectorOuter.emplace_back(element);
713 }
714 }
715
716 for (auto it = flagField->beginWithGhostLayerXYZ(
717 cell_idx_c(flagField->nrOfGhostLayers() - 1));
718 it != flagField->end(); ++it) {
719 if (!isFlagSet(it, domainFlag))
720 continue;
721
722 if (isFlagSet(it.neighbor(-1, -1, -1, 0), boundaryFlag)) {
723 auto element = IndexInfo(it.x(), it.y(), it.z(), 26);
724 Vector3<float> InitialisatonAdditionalData = elementInitaliser(
725 Cell(it.x() + -1, it.y() + -1, it.z() + -1), blocks, *block);
726 element.flux_0 = InitialisatonAdditionalData[0];
727 element.flux_1 = InitialisatonAdditionalData[1];
728 element.flux_2 = InitialisatonAdditionalData[2];
729 indexVectorAll.emplace_back(element);
730 if (inner.contains(it.x(), it.y(), it.z()))
731 indexVectorInner.emplace_back(element);
732 else
733 indexVectorOuter.emplace_back(element);
734 }
735 }
736
737 indexVectors->syncGPU();
738 }
739
740private:
741 void run_impl(IBlock *block, IndexVectors::Type type);
742
743 BlockDataID indexVectorID;
744
745 std::function<Vector3<float>(
746 const Cell &, const shared_ptr<StructuredBlockForest> &, IBlock &)>
747 elementInitaliser;
748
749public:
750 BlockDataID fluxID;
751};
752
753} // namespace pystencils
754} // namespace walberla
Definition Cell.hpp:96
void fillFromFlagField(const std::shared_ptr< StructuredBlockForest > &blocks, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID)
void fillFromFlagField(const shared_ptr< StructuredBlockForest > &blocks, IBlock *block, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID)
FixedFlux_single_precision(const std::shared_ptr< StructuredBlockForest > &blocks, BlockDataID fluxID_, std::function< Vector3< float >(const Cell &, const shared_ptr< StructuredBlockForest > &, IBlock &)> &fluxCallback)
static double * block(double *p, std::size_t index, std::size_t size)
Definition elc.cpp:176
\file PackInfoPdfDoublePrecision.cpp \author pystencils
IndexInfo(int32_t x_, int32_t y_, int32_t z_, int32_t dir_)