10#ifndef PECLET_FLOW_MAC_BC_HPP
11#define PECLET_FLOW_MAC_BC_HPP
13#include <Kokkos_Core.hpp>
17using BExec = Kokkos::DefaultExecutionSpace;
18using BMem = BExec::memory_space;
19using BField = Kokkos::View<double*, BMem>;
26KOKKOS_INLINE_FUNCTION
void axisDims(
B3 ext,
int (&dims)[3],
long (&strides)[3]) {
32 strides[2] =
static_cast<long>(ext.
x) * ext.
y;
44 const int b = (a + 1) % 3, c = (a + 2) % 3;
45 const long sa = strides[a], sb = strides[b], sc = strides[c];
46 const int na = dims[a];
47 const int bf = (s == 0) ? g : (na - g);
50 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
52 "peclet::flow::bc_vel", MD(space, {0, 0}, {dims[b], dims[c]}), KOKKOS_LAMBDA(
int p0,
int p1) {
53 const long base =
static_cast<long>(p0) * sb +
static_cast<long>(p1) * sc;
54 const double wc = hasProf ? prof((
static_cast<long>(p0) * prof_nc + p1) * 3 + comp) : wall;
55 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(ia) * sa); };
59 for (
int ia = 0; ia < g; ++ia)
60 at(ia) = 2.0 * wc - at(2 * bf - ia);
62 for (
int ia = na - g + 1; ia < na; ++ia)
63 at(ia) = 2.0 * wc - at(2 * bf - ia);
66 for (
int ia = 0; ia < g; ++ia)
69 for (
int ia = na - g; ia < na; ++ia)
73 for (
int ia = 0; ia < g; ++ia)
74 at(ia) = 2.0 * wc - at(2 * bf - 1 - ia);
76 for (
int ia = na - g; ia < na; ++ia)
77 at(ia) = 2.0 * wc - at(2 * bf - 1 - ia);
96 const int b = (a + 1) % 3, c = (a + 2) % 3;
97 const long sa = strides[a], sb = strides[b], sc = strides[c];
98 const int na = dims[a];
99 const bool hasProf = prof.extent(0) > 0;
100 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
101 Kokkos::parallel_for(
102 "peclet::flow::bc_vel_coloc", MD(space, {0, 0}, {dims[b], dims[c]}),
103 KOKKOS_LAMBDA(
int p0,
int p1) {
104 const long base =
static_cast<long>(p0) * sb +
static_cast<long>(p1) * sc;
105 const double wc = hasProf ? prof((
static_cast<long>(p0) * prof_nc + p1) * 3 + comp) : wall;
106 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(ia) * sa); };
108 for (
int ia = 0; ia < g; ++ia)
109 at(ia) = 2.0 * wc - at(2 * g - 1 - ia);
111 for (
int ia = na - g; ia < na; ++ia)
112 at(ia) = 2.0 * wc - at(2 * (na - g) - 1 - ia);
125 const int b = (a + 1) % 3, c = (a + 2) % 3;
126 const long sa = strides[a], sb = strides[b], sc = strides[c];
127 const int na = dims[a];
128 const int bic = (s == 0) ? g : (na - g - 1);
129 const int lo = (s == 0) ? 0 : (na - g), hi = (s == 0) ? (g - 1) : (na - 1);
130 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
131 Kokkos::parallel_for(
132 "peclet::flow::bc_neumann_ghost", MD(space, {0, 0}, {dims[b], dims[c]}),
133 KOKKOS_LAMBDA(
int p0,
int p1) {
134 const long base =
static_cast<long>(p0) * sb +
static_cast<long>(p1) * sc;
135 const double pin = f(base +
static_cast<long>(bic) * sa);
136 for (
int ia = lo; ia <= hi; ++ia)
137 f(base +
static_cast<long>(ia) * sa) = pin;
147 const int b = (a + 1) % 3, c = (a + 2) % 3;
148 const long sa = strides[a], sb = strides[b], sc = strides[c];
149 const int na = dims[a];
150 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
151 Kokkos::parallel_for(
152 "peclet::flow::bc_outflow", MD(space, {0, 0}, {dims[b], dims[c]}),
153 KOKKOS_LAMBDA(
int p0,
int p1) {
154 const long base =
static_cast<long>(p0) * sb +
static_cast<long>(p1) * sc;
155 auto at = [&](
int ia) ->
double& {
return f(base +
static_cast<long>(ia) * sa); };
157 const int src = (comp == a) ? g + 1 : g;
158 const int last = (comp == a) ? g : g - 1;
159 const double v = fold ? 0.0 : at(src);
160 for (
int ia = 0; ia <= last; ++ia)
163 const int src = na - g - 1;
164 const double v = fold ? 0.0 : at(src);
165 for (
int ia = na - g; ia < na; ++ia)
178 const int b = (a + 1) % 3, c = (a + 2) % 3;
179 const long sa = strides[a], sb = strides[b], sc = strides[c];
180 const int bic = (s == 0) ? g : (dims[a] - g - 1);
181 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
182 Kokkos::parallel_for(
183 "peclet::flow::bc_fold", MD(space, {0, 0}, {dims[b], dims[c]}),
184 KOKKOS_LAMBDA(
int p0,
int p1) {
186 static_cast<long>(p0) * sb +
static_cast<long>(p1) * sc +
static_cast<long>(bic) * sa;
198 const int b = (a + 1) % 3, c = (a + 2) % 3;
199 const long sa = strides[a], sb = strides[b], sc = strides[c];
200 const int na = dims[a];
201 const int lo = (s == 0) ? 0 : (na - g), hi = (s == 0) ? (g - 1) : (na - 1);
202 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
203 Kokkos::parallel_for(
204 "peclet::flow::bc_zero_p_ghost", MD(space, {0, 0}, {dims[b], dims[c]}),
205 KOKKOS_LAMBDA(
int p0,
int p1) {
206 const long base = (long)p0 * sb + (
long)p1 * sc;
207 for (
int ia = lo; ia <= hi; ++ia)
208 phi(base + (
long)ia * sa) = 0.0;
220 const int b = (a + 1) % 3, c = (a + 2) % 3;
221 const long sa = strides[a], sb = strides[b], sc = strides[c];
222 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
223 Kokkos::parallel_for(
224 "peclet::flow::bc_correct_outflow", MD(space, {0, 0}, {dims[b], dims[c]}),
225 KOKKOS_LAMBDA(
int p0,
int p1) {
226 const long bf = (long)p0 * sb + (
long)p1 * sc + (long)(dims[a] - g) * sa;
227 f(bf) -= phi(bf) - phi(bf - sa);
239 const int b = (a + 1) % 3, c = (a + 2) % 3;
240 const long sa = strides[a], sb = strides[b], sc = strides[c];
241 const int bf = (s == 0) ? g : (dims[a] - g);
242 using MD = Kokkos::MDRangePolicy<BExec, Kokkos::Rank<2>>;
243 Kokkos::parallel_for(
244 "peclet::flow::bc_setopen", MD(space, {0, 0}, {dims[b], dims[c]}),
245 KOKKOS_LAMBDA(
int p0,
int p1) {
246 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 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 bcCorrectOutflow(BField f, BField phi, B3 ext, int g, int a)
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)
Kokkos::View< double *, BMem > BField
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)