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