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