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
46
using
walberla::half;
47
#endif
48
49
namespace
walberla
{
50
namespace
pystencils {
51
52
class
FixedFlux_double_precision
{
53
public
:
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
71
class
IndexVectors
{
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]; }
84
IndexInfo
*
pointerCpu
(
Type
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
94
FixedFlux_double_precision
(
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
738
private
:
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
747
public
:
748
BlockDataID
fluxID
;
749
};
750
751
}
// namespace pystencils
752
}
// namespace walberla
Cell
Definition
Cell.hpp:96
walberla::pystencils::FixedFlux_double_precision::IndexVectors
Definition
FixedFlux_double_precision.h:71
walberla::pystencils::FixedFlux_double_precision::IndexVectors::indexVector
auto & indexVector(Type t)
Definition
FixedFlux_double_precision.h:82
walberla::pystencils::FixedFlux_double_precision::IndexVectors::indexVector
auto const & indexVector(Type t) const
Definition
FixedFlux_double_precision.h:83
walberla::pystencils::FixedFlux_double_precision::IndexVectors::IndexVectors
IndexVectors()=default
walberla::pystencils::FixedFlux_double_precision::IndexVectors::CpuIndexVector
std::vector< IndexInfo > CpuIndexVector
Definition
FixedFlux_double_precision.h:73
walberla::pystencils::FixedFlux_double_precision::IndexVectors::pointerCpu
IndexInfo * pointerCpu(Type t)
Definition
FixedFlux_double_precision.h:84
walberla::pystencils::FixedFlux_double_precision::IndexVectors::operator==
bool operator==(IndexVectors const &other) const
Definition
FixedFlux_double_precision.h:78
walberla::pystencils::FixedFlux_double_precision::IndexVectors::syncGPU
void syncGPU()
Definition
FixedFlux_double_precision.h:88
walberla::pystencils::FixedFlux_double_precision::IndexVectors::Type
Type
Definition
FixedFlux_double_precision.h:75
walberla::pystencils::FixedFlux_double_precision::IndexVectors::NUM_TYPES
@ NUM_TYPES
Definition
FixedFlux_double_precision.h:75
walberla::pystencils::FixedFlux_double_precision::IndexVectors::INNER
@ INNER
Definition
FixedFlux_double_precision.h:75
walberla::pystencils::FixedFlux_double_precision::IndexVectors::OUTER
@ OUTER
Definition
FixedFlux_double_precision.h:75
walberla::pystencils::FixedFlux_double_precision::IndexVectors::ALL
@ ALL
Definition
FixedFlux_double_precision.h:75
walberla::pystencils::FixedFlux_double_precision
Definition
FixedFlux_double_precision.h:52
walberla::pystencils::FixedFlux_double_precision::getSweep
std::function< void(IBlock *)> getSweep()
Definition
FixedFlux_double_precision.h:122
walberla::pystencils::FixedFlux_double_precision::getForce
Vector3< double > getForce(IBlock *)
Definition
FixedFlux_double_precision.h:115
walberla::pystencils::FixedFlux_double_precision::run
void run(IBlock *block)
Definition
FixedFlux_double_precision.cpp:194
walberla::pystencils::FixedFlux_double_precision::outer
void outer(IBlock *block)
Definition
FixedFlux_double_precision.cpp:202
walberla::pystencils::FixedFlux_double_precision::inner
void inner(IBlock *block)
Definition
FixedFlux_double_precision.cpp:198
walberla::pystencils::FixedFlux_double_precision::fluxID
BlockDataID fluxID
Definition
FixedFlux_double_precision.h:748
walberla::pystencils::FixedFlux_double_precision::fillFromFlagField
void fillFromFlagField(const shared_ptr< StructuredBlockForest > &blocks, IBlock *block, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID)
Definition
FixedFlux_double_precision.h:144
walberla::pystencils::FixedFlux_double_precision::fillFromFlagField
void fillFromFlagField(const std::shared_ptr< StructuredBlockForest > &blocks, ConstBlockDataID flagFieldID, FlagUID boundaryFlagUID, FlagUID domainFlagUID)
Definition
FixedFlux_double_precision.h:135
walberla::pystencils::FixedFlux_double_precision::getOuterSweep
std::function< void(IBlock *)> getOuterSweep()
Definition
FixedFlux_double_precision.h:130
walberla::pystencils::FixedFlux_double_precision::operator()
void operator()(IBlock *block)
Definition
FixedFlux_double_precision.h:109
walberla::pystencils::FixedFlux_double_precision::getInnerSweep
std::function< void(IBlock *)> getInnerSweep()
Definition
FixedFlux_double_precision.h:126
walberla::pystencils::FixedFlux_double_precision::FixedFlux_double_precision
FixedFlux_double_precision(const std::shared_ptr< StructuredBlockForest > &blocks, BlockDataID fluxID_, std::function< Vector3< double >(const Cell &, const shared_ptr< StructuredBlockForest > &, IBlock &)> &fluxCallback)
Definition
FixedFlux_double_precision.h:94
stream
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
Definition
common_cuda.cu:34
block
static double * block(double *p, std::size_t index, std::size_t size)
Definition
elc.cpp:177
walberla
\file PackInfoPdfDoublePrecision.cpp \author pystencils
Definition
EKWalberla.hpp:38
walberla::pystencils::FixedFlux_double_precision::IndexInfo
Definition
FixedFlux_double_precision.h:54
walberla::pystencils::FixedFlux_double_precision::IndexInfo::flux_0
double flux_0
Definition
FixedFlux_double_precision.h:59
walberla::pystencils::FixedFlux_double_precision::IndexInfo::y
int32_t y
Definition
FixedFlux_double_precision.h:56
walberla::pystencils::FixedFlux_double_precision::IndexInfo::flux_1
double flux_1
Definition
FixedFlux_double_precision.h:60
walberla::pystencils::FixedFlux_double_precision::IndexInfo::z
int32_t z
Definition
FixedFlux_double_precision.h:57
walberla::pystencils::FixedFlux_double_precision::IndexInfo::flux_2
double flux_2
Definition
FixedFlux_double_precision.h:61
walberla::pystencils::FixedFlux_double_precision::IndexInfo::x
int32_t x
Definition
FixedFlux_double_precision.h:55
walberla::pystencils::FixedFlux_double_precision::IndexInfo::dir
int32_t dir
Definition
FixedFlux_double_precision.h:58
walberla::pystencils::FixedFlux_double_precision::IndexInfo::IndexInfo
IndexInfo(int32_t x_, int32_t y_, int32_t z_, int32_t dir_)
Definition
FixedFlux_double_precision.h:62
walberla::pystencils::FixedFlux_double_precision::IndexInfo::operator==
bool operator==(const IndexInfo &o) const
Definition
FixedFlux_double_precision.h:64
src
walberla_bridge
src
electrokinetics
generated_kernels
FixedFlux_double_precision.h
Generated on Thu Mar 5 2026 02:40:48 for ESPResSo by
1.9.8