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