20#ifndef PECLET_FLOW_SCALAR_TRANSPORT_HPP
21#define PECLET_FLOW_SCALAR_TRANSPORT_HPP
23#include <Kokkos_Core.hpp>
54 int bc[6] = {0, 0, 0, 0, 0, 0};
55 double bcVal[6] = {0, 0, 0, 0, 0, 0};
74 std::shared_ptr<ScalarCutState>
cut;
98 double wx = 1.0,
double wy = 1.0,
double wz = 1.0) {
101 Kokkos::parallel_for(
102 "peclet::flow::scalar_build_diff_vark",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
104 const long sx = 1, sy = e.x, sz = (
long)e.x * e.y;
106 const double ki = kc(i);
107 const bool mi = mask(i) > 0.5;
126 AC(i) = rcp(i) * idt +
te +
tw +
tn + ts +
tt + tb;
136 Kokkos::parallel_for(
137 "peclet::flow::scalar_build_rhs_heat",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
139 const long i = (
long)
lx + (
long)
ly * e.x + (
long)
lz * (
long)e.x * e.y;
140 b(i) = rcp(i) * idt * cOld(i);
151 Kokkos::parallel_for(
152 "peclet::flow::scalar_mask_stencil",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
154 const long i = (
long)
lx + (
long)
ly * e.x + (
long)
lz * (
long)e.x * e.y;
155 if (!(mask(i) > 0.5))
172 Kokkos::parallel_for(
173 "peclet::flow::scalar_mask_rhs",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
175 const long i = (
long)
lx + (
long)
ly * e.x + (
long)
lz * (
long)e.x * e.y;
176 if (!(mask(i) > 0.5))
203 double thMax,
C3 e,
int g,
double wx = 1.0,
double wy = 1.0,
204 double wz = 1.0, vof::VofMetric gm = vof::VofMetric{}) {
205 const double wa[3] = {wx, wy, wz};
207 using MD = MDRange3<CCExec>;
208 Kokkos::parallel_for(
209 "peclet::flow::scalar_mask_gfm", MD(space, {g, g, g}, {
e.x -
g,
e.y -
g,
e.z -
g}),
210 KOKKOS_LAMBDA(
int lx,
int ly,
int lz) {
211 const long sx = 1, sy =
e.x, sz = (long)
e.x *
e.y;
212 const long i = (long)lx + (
long)ly * sy + (long)lz * sz;
216 const long st[3] = {sx, sy, sz};
217 const double kd = useK ?
kc(i) : Dconst;
218 double acc = 0.0, dac = 0.0;
219 for (
int d = 0;
d < 3; ++
d)
220 for (
int sgn = -1; sgn <= 1; sgn += 2) {
221 const long j =
i + (long)sgn * st[d];
222 if (!(mask(j) > 0.5))
225 const double of = (
d == 0) ? ((sgn < 0) ?
ox(i) :
ox(
i + sx))
226 : (
d == 1) ? ((sgn < 0) ? oy(
i) : oy(
i + sy))
227 : ((sgn < 0) ? oz(
i) : oz(
i + sz));
230 const double nvec[3] = {gnx(j), gny(j), gnz(j)};
233 const double coef = kd * wa[
d] * of / th;
237 : (
d == 1) ? ((sgn < 0) ? AS : AN)
238 : ((sgn < 0) ? AB : AT);
241 dac += coef * tgam(j);
270 double wx = 1.0,
double wy = 1.0,
double wz = 1.0,
271 vof::VofMetric gm = vof::VofMetric{}) {
272 const double wa[3] = {wx, wy, wz};
274 using MD = MDRange3<CCExec>;
275 Kokkos::parallel_for(
276 "peclet::flow::scalar_mask_gfm2", MD(space, {g, g, g}, {
e.x -
g,
e.y -
g,
e.z -
g}),
277 KOKKOS_LAMBDA(
int lx,
int ly,
int lz) {
278 const long sx = 1, sy =
e.x, sz = (long)
e.x *
e.y;
279 const long i = (long)lx + (
long)ly * sy + (long)lz * sz;
283 const long st[3] = {sx, sy, sz};
284 const double kd = useK ?
kc(i) : Dconst;
285 double acc = 0.0, dac = 0.0;
286 for (
int d = 0;
d < 3; ++
d)
287 for (
int sgn = -1; sgn <= 1; sgn += 2) {
288 const long j =
i + (long)sgn * st[d];
289 if (!(mask(j) > 0.5))
291 const double of = (
d == 0) ? ((sgn < 0) ?
ox(i) :
ox(
i + sx))
292 : (
d == 1) ? ((sgn < 0) ? oy(
i) : oy(
i + sy))
293 : ((sgn < 0) ? oz(
i) : oz(
i + sz));
294 const double nvec[3] = {gnx(j), gny(j), gnz(j)};
295 const double kj = useKappa ? kap(j) : 0.0;
299 : (
d == 1) ? ((sgn < 0) ? AS : AN)
300 : ((sgn < 0) ? AB : AT);
301 CCField bandB = (
d == 0) ? ((sgn < 0) ? AE : AW)
302 : (
d == 1) ? ((sgn < 0) ? AN : AS)
303 : ((sgn < 0) ? AT : AB);
304 const long jb =
i - (long)sgn * st[d];
305 const double bb = bandB(i);
306 const bool behind = !(mask(jb) > 0.5) && (bb != 0.0);
308 const double coef = kd * wa[
d] * of *
row.aGamma;
311 dac += coef * tgam(j);
312 if (behind &&
row.aBehind != 1.0) {
313 acc += -(
row.aBehind - 1.0) * bb;
314 bandB(i) =
row.aBehind * bb;
326 Kokkos::parallel_for(
327 "peclet::flow::scalar_gfm_rhs",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
329 const long i = (
long)
lx + (
long)
ly * e.x + (
long)
lz * (
long)e.x * e.y;
345 double D,
double idt,
C3 e,
int g,
double wx = 1.0,
346 double wy = 1.0,
double wz = 1.0) {
350 Kokkos::parallel_for(
351 "peclet::flow::scalar_build_diff",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
353 const long sx = 1, sy = e.x, sz = (
long)e.x * e.y;
355 const double tw =
Dx * ox(i),
te =
Dx * ox(i +
sx);
356 const double ts =
Dy * oy(i),
tn =
Dy * oy(i + sy);
357 const double tb =
Dz * oz(i),
tt =
Dz * oz(i + sz);
375 Kokkos::parallel_for(
376 "peclet::flow::scalar_build_rhs",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
378 const long sx = 1, sy = e.x, sz = (
long)e.x * e.y;
383 for (
int fd = 0;
fd < 3; ++
fd) {
384 const long s = (
fd == 0) ?
sx : (
fd == 1) ? sy : sz;
388 const double om =
Of(i), op =
Of(i + s);
389 const double cLL = cOld(i - 2 * s),
cL = cOld(i - s),
cR = cOld(i),
cRR = cOld(i + s),
390 cRRR = cOld(i + 2 * s);
395 }
else if (scheme == 2) {
404 b(i) = idt * cOld(i) - adv;
flow — portable (Kokkos) cut-cell pressure-operator face openness from an SDF.
double pcFaceConductivity(double ki, double kj, bool mi, bool mj)
Face conductivity of the variable-coefficient energy operator, k(C) arithmetic in the colour with ONE...
PcGfmRow pcGfmRow(double theta, bool behind, int order)
double pcGfmThetaKAniso(double phiC, const double n[3], int d, double s, double kappa, double thetaMin, double thetaMax, const VofMetric &g)
The same on an ANISOTROPIC cell (Phase 3, flow/doc/anisotropic_vof.md §7, V5.3).
void scalarMaskRhs(CCField b, CCField c, CCConst mask, CCConst val, C3 e, int g)
void scalarMaskGfm2(CCField AC, CCField AW, CCField AE, CCField AS, CCField AN, CCField AB, CCField AT, CCField gfmB, CCConst ox, CCConst oy, CCConst oz, CCConst mask, CCConst tgam, CCConst gnx, CCConst gny, CCConst gnz, CCConst gphi, CCConst kap, CCConst kc, double Dconst, bool useK, double thMin, double thMax, int order, bool useKappa, C3 e, int g, double wx=1.0, double wy=1.0, double wz=1.0, vof::VofMetric gm=vof::VofMetric{})
void scalarBuildDiffusionOpen(CCField AC, CCField AW, CCField AE, CCField AS, CCField AN, CCField AB, CCField AT, CCConst ox, CCConst oy, CCConst oz, double D, double idt, C3 e, int g, double wx=1.0, double wy=1.0, double wz=1.0)
void scalarAddGfmRhs(CCField b, CCConst gfmB, CCConst mask, C3 e, int g)
void scalarMaskGfm(CCField AC, CCField AW, CCField AE, CCField AS, CCField AN, CCField AB, CCField AT, CCField gfmB, CCConst ox, CCConst oy, CCConst oz, CCConst mask, CCConst tgam, CCConst gnx, CCConst gny, CCConst gnz, CCConst gphi, CCConst kc, double Dconst, bool useK, double thMin, double thMax, C3 e, int g, double wx=1.0, double wy=1.0, double wz=1.0, vof::VofMetric gm=vof::VofMetric{})
void scalarMaskStencil(CCField AC, CCField AW, CCField AE, CCField AS, CCField AN, CCField AB, CCField AT, CCConst mask, C3 e, int g)
Kokkos::View< double *, CCMem > CCField
Kokkos::DefaultExecutionSpace CCExec
void scalarBuildDiffusionVarK(CCField AC, CCField AW, CCField AE, CCField AS, CCField AN, CCField AB, CCField AT, CCConst ox, CCConst oy, CCConst oz, CCConst kc, CCConst rcp, CCConst mask, double idt, C3 e, int g, double wx=1.0, double wy=1.0, double wz=1.0)
void scalarBuildRhsHeat(CCField b, CCConst cOld, CCConst rcp, double idt, C3 e, int g)
Kokkos::View< const double *, CCMem > CCConst
void scalarBuildRhs(CCField b, CCConst cOld, CCConst U, CCConst V, CCConst W, CCConst ox, CCConst oy, CCConst oz, double idt, int scheme, C3 e, int g)
double fou_flux(double L, double R, double vel)
double tvd(double LL, double L, double R, double RR, double vel)
double sou(double LL, double L, double R, double RR, double vel)
flow — VoF phase change (Part II, rungs P0/P1): the container-free kernel set.
flow — the multidimensional iteration policies: iteration order follows storage.
flow — portable (Kokkos) staggered MAC momentum advection (Koren TVD + FOU).
std::shared_ptr< ScalarCutState > cut
static constexpr double AC
static constexpr double U