embedded3 S2-5: the exchange route mirrors the predictor's centroid spacing toward solid neighbours (operator = box back to the box's own error)
CI / Build (macos-latest) (push) Waiting to run
CI / Test (macos-latest) (push) Blocked by required conditions
CI / Test (ubuntu-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (macos-latest) (push) Blocked by required conditions
CI / Python Bindings (maturin) (ubuntu-latest) (push) Blocked by required conditions
CI / WASM Build + Size Check (push) Blocked by required conditions
CI / Distributed Training Tests (push) Blocked by required conditions
CI / CI Success (push) Blocked by required conditions
CI / Build CPU-Only (Explicit) (push) Failing after 4s
Documentation / Build API Documentation (push) Failing after 5s
Documentation / Build User Guide (push) Successful in 4s
CI / Format Check (push) Failing after 11s
CI / Clippy Check (push) Failing after 46s
CI / Build (ubuntu-latest) (push) Failing after 2m1s
Performance Benchmarks / Run Benchmarks (push) Successful in 2m34s

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
Omar Sobh
2026-09-18 11:01:27 -05:00
co-authored by Claude Fable 5.1
parent fdfb6da769
commit 37086300ba
@@ -72,6 +72,7 @@ impl Mask {
} }
let cv = self.cv_geometry(c, p); let cv = self.cv_geometry(c, p);
let u0 = vals[c][idx]; let u0 = vals[c][idx];
let shift0 = self.face_shift(c, p);
let cell_minus = add(p, ec, -1); let cell_minus = add(p, ec, -1);
let cell_plus = p; let cell_plus = p;
for d in 0..3 { for d in 0..3 {
@@ -99,6 +100,17 @@ impl Mask {
0.5 * (flux(cell_minus) + flux(cell_plus)) * a_d, 0.5 * (flux(cell_minus) + flux(cell_plus)) * a_d,
) )
}; };
// The spacing the predictor uses toward a solid
// neighbour (its shift is zero): the centroid
// spacing in a cross direction (S2-5), else the
// exchange distance.
let solid_spacing = |sign: f64| -> f64 {
if self.diffusion_centroid && d != c && !self.wall_exchange_axis {
(h[d] - sign * shift0[d]).clamp(0.25 * h[d], 2.0 * h[d])
} else {
self.exchange_delta(&cv, d)
}
};
// Plus side: a prescribed neighbour face. // Plus side: a prescribed neighbour face.
if let Some(fp) = lat.face(c, add(p, ed, 1)) { if let Some(fp) = lat.face(c, add(p, ed, 1)) {
if kind(c, fp) != FaceKind::Fluid { if kind(c, fp) != FaceKind::Fluid {
@@ -112,8 +124,7 @@ impl Mask {
}; };
let u_face = upwind(m_plus, u0, un) + delta; let u_face = upwind(m_plus, u0, un) + delta;
let on_fluid = -rho * m_plus * (u_face - u0) let on_fluid = -rho * m_plus * (u_face - u0)
+ mu * cv.ap[d][1] * a_d * (un - u0) + mu * cv.ap[d][1] * a_d * (un - u0) / solid_spacing(1.0);
/ self.exchange_delta(&cv, d);
force[c] -= on_fluid; force[c] -= on_fluid;
} }
} }
@@ -130,8 +141,7 @@ impl Mask {
}; };
let u_face = upwind(m_minus, ud, u0) + delta; let u_face = upwind(m_minus, ud, u0) + delta;
let on_fluid = rho * m_minus * (u_face - u0) let on_fluid = rho * m_minus * (u_face - u0)
+ mu * cv.ap[d][0] * a_d * (ud - u0) + mu * cv.ap[d][0] * a_d * (ud - u0) / solid_spacing(-1.0);
/ self.exchange_delta(&cv, d);
force[c] -= on_fluid; force[c] -= on_fluid;
} }
} }