10#ifndef PECLET_FLOW_MAC_BC_HPP
11#define PECLET_FLOW_MAC_BC_HPP
13#include <Kokkos_Core.hpp>
19using BExec = Kokkos::DefaultExecutionSpace;
20using BMem = BExec::memory_space;
21using BField = Kokkos::View<double*, BMem>;
34 strides[2] =
static_cast<long>(ext.
x) * ext.
y;
40 double wc,
int fold) {
41 const int bf = (s == 0) ? g : (na - g);
45 for (
int ia = 0;
ia < g; ++
ia)
48 for (
int ia = na - g + 1;
ia < na; ++
ia)
52 for (
int ia = 0;
ia < g; ++
ia)
55 for (
int ia = na - g;
ia < na; ++
ia)
59 for (
int ia = 0;
ia < g; ++
ia)
62 for (
int ia = na - g;
ia < na; ++
ia)
76 const int b = (a + 1) % 3, c = (a + 2) % 3;
78 const int na =
dims[a];
84 const long base =
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc;
86 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(
ia) *
sa); };
111 const int b = (a + 1) % 3, c = (a + 2) % 3;
113 const int na =
dims[a];
115 Kokkos::parallel_for(
117 const long base =
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc;
118 for (
int k = 0; k <
J.n; ++k) {
120 const double wc = (q.prof.extent(0) > 0)
121 ? q.prof((
static_cast<long>(p0) * q.profNc +
p1) * 3 + q.comp)
123 auto at = [&](
int ia) ->
double& {
return q.f(base +
static_cast<long>(
ia) *
sa); };
147 const int b = (a + 1) % 3, c = (a + 2) % 3;
149 const int na =
dims[a];
150 const int bf = (s == 0) ? g : (na - g);
152 Kokkos::parallel_for(
155 const long base =
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc;
156 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(
ia) *
sa); };
158 for (
int ia = 0;
ia < g; ++
ia)
161 for (
int ia = na - g;
ia < na; ++
ia)
174 const int b = (a + 1) % 3, c = (a + 2) % 3;
176 const int na =
dims[a];
178 Kokkos::parallel_for(
179 "peclet::flow::bc_mirror_ghost",
MD(
space, {0, 0}, {
dims[b],
dims[c]}),
181 const long base =
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc;
182 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(
ia) *
sa); };
184 for (
int ia = 0;
ia < g; ++
ia)
187 for (
int ia = na - g;
ia < na; ++
ia)
206 const int b = (a + 1) % 3, c = (a + 2) % 3;
208 const int na =
dims[a];
211 Kokkos::parallel_for(
214 const long base =
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc;
216 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(
ia) *
sa); };
218 for (
int ia = 0;
ia < g; ++
ia)
221 for (
int ia = na - g;
ia < na; ++
ia)
222 at(
ia) = 2.0 *
wc -
at(2 * (na - g) - 1 -
ia);
231 const double pin = f(base +
static_cast<long>(
bic) *
sa);
232 for (
int ia = lo;
ia <= hi; ++
ia)
233 f(base +
static_cast<long>(
ia) *
sa) = pin;
238 for (
int ia = lo;
ia <= hi; ++
ia)
239 phi(base + (
long)
ia *
sa) = 0.0;
251 const int b = (a + 1) % 3, c = (a + 2) % 3;
253 const int na =
dims[a];
254 const int bic = (s == 0) ? g : (na - g - 1);
255 const int lo = (s == 0) ? 0 : (na - g), hi = (s == 0) ? (g - 1) : (na - 1);
257 Kokkos::parallel_for(
258 "peclet::flow::bc_neumann_ghost",
MD(
space, {0, 0}, {
dims[b],
dims[c]}),
271 const int b = (a + 1) % 3, c = (a + 2) % 3;
273 const int na =
dims[a];
275 Kokkos::parallel_for(
278 const long base =
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc;
279 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(
ia) *
sa); };
281 const int src = (comp == a) ? g + 1 : g;
282 const int last = (comp == a) ? g : g - 1;
283 const double v = fold ? 0.0 :
at(src);
287 const int src = na - g - 1;
288 const double v = fold ? 0.0 :
at(src);
289 for (
int ia = na - g;
ia < na; ++
ia)
302 const int b = (a + 1) % 3, c = (a + 2) % 3;
304 const int bic = (s == 0) ? g : (
dims[a] - g - 1);
306 Kokkos::parallel_for(
310 static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc +
static_cast<long>(
bic) *
sa;
322 const int b = (a + 1) % 3, c = (a + 2) % 3;
324 const int na =
dims[a];
325 const int lo = (s == 0) ? 0 : (na - g), hi = (s == 0) ? (g - 1) : (na - 1);
327 Kokkos::parallel_for(
328 "peclet::flow::bc_zero_p_ghost",
MD(
space, {0, 0}, {
dims[b],
dims[c]}),
346 const int b = (a + 1) % 3, c = (a + 2) % 3;
349 Kokkos::parallel_for(
350 "peclet::flow::bc_correct_outflow",
MD(
space, {0, 0}, {
dims[b],
dims[c]}),
372 bool harmonic,
double wa = 1.0) {
377 const int b = (a + 1) % 3, c = (a + 2) % 3;
380 Kokkos::parallel_for(
381 "peclet::flow::bc_correct_outflow_var",
MD(
space, {0, 0}, {
dims[b],
dims[c]}),
384 const double ra = rho(
bf), rb = rho(
bf -
sa);
388 const double rf = harmonic ? (2.0 *
ra * rb / (
ra + rb)) : (0.5 * (
ra + rb));
407 const int b = (a + 1) % 3, c = (a + 2) % 3;
409 const int bf =
dims[a] - g, nb =
dims[b] - 2 * g, nc =
dims[c] - 2 * g;
411 Kokkos::parallel_for(
412 "peclet::flow::bc_save_high_face",
MD(
space, {0, 0}, {nb, nc}),
414 dst((
long)p0 + (
long)
p1 * nb) =
415 src((
long)(p0 + g) *
sb + (
long)(
p1 + g) * sc + (
long)
bf *
sa);
423 const int b = (a + 1) % 3, c = (a + 2) % 3;
425 const int bf =
dims[a] - g, nb =
dims[b] - 2 * g, nc =
dims[c] - 2 * g;
427 Kokkos::parallel_for(
428 "peclet::flow::bc_restore_high_face",
MD(
space, {0, 0}, {nb, nc}),
430 dst((
long)(p0 + g) *
sb + (
long)(
p1 + g) * sc + (
long)
bf *
sa) =
431 src((
long)p0 + (
long)
p1 * nb);
443 const int b = (a + 1) % 3, c = (a + 2) % 3;
445 const int bf = (s == 0) ? g : (
dims[a] - g);
447 Kokkos::parallel_for(
450 oa(
static_cast<long>(p0) *
sb +
static_cast<long>(
p1) * sc +
static_cast<long>(
bf) *
sa) =
void axisDims(B3 ext, int(&dims)[3], long(&strides)[3])
void velFaceColumn(const At &at, int na, int g, int a, int s, int comp, double wc, int fold)
void bcNeumannGhostCell(const FV &f, long base, long sa, int bic, int lo, int hi)
void bcCorrectOutflow(BField f, BField phi, B3 ext, int g, int a, double wa=1.0)
void bcRestoreHighFacePlaneInner(BField dst, BField src, B3 ext, int g, int a)
void bcSetOpenness(BField oa, B3 ext, int g, int a, int s, double val)
void bcZeroPressureGhost(BField phi, B3 ext, int g, int a, int s)
void bcZeroOpenness(BField oa, B3 ext, int g, int a, int s)
void bcDiffusionFold(BField dcorr, BField brhs, B3 ext, int g, int a, int s, double dval, double bval)
void bcVelocityColocated(BField f, B3 ext, int g, int a, int s, double wall, int comp=0, BField prof=BField(), int prof_nc=0)
void bcSaveHighFacePlaneInner(BField dst, BField src, B3 ext, int g, int a)
void bcZeroPressureGhostCell(const FV &phi, long base, long sa, int lo, int hi)
void bcVelocityComp(BField f, B3 ext, int g, int a, int s, int comp, double wall, int fold, BField prof=BField(), int prof_nc=0)
void bcMirrorGhost(BField f, B3 ext, int g, int a, int s)
Kokkos::View< double *, BMem > BField
void bcVelocityFaces(const BcVelFaces &J, B3 ext, int g, int a, int fold)
void bcCorrectOutflowVar(BField f, BField phi, BField rho, double rho0, B3 ext, int g, int a, bool harmonic, double wa=1.0)
void bcOutflowComp(BField f, B3 ext, int g, int a, int s, int comp, int fold)
Kokkos::DefaultExecutionSpace BExec
void bcNeumannGhost(BField f, B3 ext, int g, int a, int s)
void bcSlipComp(BField f, B3 ext, int g, int a, int s, int comp, int fold)
flow — the multidimensional iteration policies: iteration order follows storage.
static constexpr int kMax
Kokkos::View< float *, IMem > FV