embedded3 S2-7b: the curved instrument's per-wall operator probe (curved_operator_probe) and RTX_E3_CURVED_SCHEME; host prototype RTX_E3_WALL_FOOT=centroid (the shear closure's wall velocity at the foot from the open part's CENTROID, not the face centre — on a rotating wall the two feet are ½h(1−α) apart: rigid-mode probe residual 4.5× smaller, the rotating wall's offset −0.022 → ±0.002 h, its cut pressure zeroth → first order); default off, device refuses it
CI / Clippy Check (push) Failing after 4s
CI / Format Check (push) Failing after 4s
Performance Benchmarks / Run Benchmarks (push) Failing after 6s
CI / Build (ubuntu-latest) (push) Failing after 5s
Documentation / Build User Guide (push) Successful in 5s
CI / Build CPU-Only (Explicit) (push) Failing after 1m0s
Documentation / Build API Documentation (push) Failing after 1m2s
CI / Build (macos-latest) (push) Canceled after 0s
CI / Test (macos-latest) (push) Canceled after 0s
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Python Bindings (maturin) (macos-latest) (push) Canceled after 0s
CI / Python Bindings (maturin) (ubuntu-latest) (push) Canceled after 0s
CI / WASM Build + Size Check (push) Canceled after 0s
CI / Distributed Training Tests (push) Canceled after 0s
CI / CI Success (push) Canceled after 0s

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
Omar Sobh
2026-09-20 08:48:41 -05:00
co-authored by Claude Fable 5.1
parent 599023d786
commit 7fffbb1301
6 changed files with 197 additions and 6 deletions
@@ -224,6 +224,7 @@ impl Mask {
wall_exchange_foot: false,
conv_sides_exact: false,
wall_flux_true_normal: false,
wall_foot_centroid: false,
grad_weights: None,
diffusion_centroid: false,
face_shifts: None,
@@ -120,12 +120,21 @@ impl Solver {
let ec = e(c);
let cell_minus = add(p, ec, -1);
let cell_plus = p;
let ub = mask.surface_velocity_at(body, x, c, t_old);
let shift0 = mask.face_shift(c, p);
// S2-7b: the wall velocity at the foot from the open part's centroid.
let foot_of = |q: [i64; 3], xq: [f64; 3]| -> [f64; 3] {
if mask.wall_foot_centroid {
let sq = mask.face_shift(c, q);
[xq[0] + sq[0], xq[1] + sq[1], xq[2] + sq[2]]
} else {
xq
}
};
let ub = mask.surface_velocity_at(body, foot_of(p, x), c, t_old);
let mut mass_out = 0.0;
let mut conv = 0.0;
let mut diff = 0.0;
let shift0 = mask.face_shift(c, p);
// The implicit exchange with solid neighbour faces (S2-5).
let (mut wall_implicit, mut wall_rhs) = (0.0, 0.0);
for d in 0..3 {
@@ -251,7 +260,7 @@ impl Solver {
return 0.0;
}
let cvq = mask.cv_geometry(c, q);
let ubq = mask.surface_velocity_at(body, lat.face_position(c, q), c, t_old);
let ubq = mask.surface_velocity_at(body, foot_of(q, lat.face_position(c, q)), c, t_old);
// Explicit, with a coefficient ∝ 1/d_f: take the gradient from
// the faces at least TRANSVERSE_DISTANCE_FLOOR h off the wall —
// a FULL neighbour too, over its own distance along the cut
@@ -180,7 +180,8 @@ impl DeviceStep {
assert!(
!solver.params.wall_exchange_foot
&& !solver.params.conv_sides_exact
&& !solver.params.wall_flux_true_normal,
&& !solver.params.wall_flux_true_normal
&& !solver.params.wall_foot_centroid,
"the axis-foot exchange / exact convective sides (S2-7b) are host prototypes: the device kernels do not carry them"
);
assert!(
@@ -181,6 +181,13 @@ pub struct Parameters {
/// of a rotating or flexing wall. `RTX_E3_WALL_FLUX=true`; the device
/// refuses it.
pub wall_flux_true_normal: bool,
/// HOST PROTOTYPE (S2-7b, moving walls): the shear closure's wall velocity
/// at the foot of the normal from the face's open-part CENTROID (where
/// its value lives) instead of from the face centre — the two feet are
/// ½h(1 α) apart along the wall, an O(Ωh) velocity error over d_f on a
/// rotating or flexing wall (zero on a wall at rest or in translation).
/// `RTX_E3_WALL_FOOT=centroid`; the device refuses it.
pub wall_foot_centroid: bool,
/// S2-5: the cross-direction diffusion between two faces over the
/// distance between their OPEN-PART CENTROIDS (a cut face's velocity
/// is its open part's mean, ½h(1 α) off the face centre along the
@@ -226,6 +233,7 @@ impl Default for Parameters {
wall_exchange_foot: std::env::var("RTX_E3_WALL_EXCHANGE").is_ok_and(|v| v == "axisfoot"),
conv_sides_exact: std::env::var("RTX_E3_CONV_SIDES").is_ok_and(|v| v == "exact"),
wall_flux_true_normal: std::env::var("RTX_E3_WALL_FLUX").is_ok_and(|v| v == "true"),
wall_foot_centroid: std::env::var("RTX_E3_WALL_FOOT").is_ok_and(|v| v == "centroid"),
pressure_centroid: std::env::var("RTX_E3_PRESSURE_CENTROID").is_ok_and(|v| v == "1"),
momentum_volume_tiled: std::env::var("RTX_E3_MOMENTUM_VOLUME")
.is_ok_and(|v| v == "tiled"),
@@ -375,6 +383,7 @@ impl Solver {
m.wall_exchange_foot = self.params.wall_exchange_foot;
m.conv_sides_exact = self.params.conv_sides_exact;
m.wall_flux_true_normal = self.params.wall_flux_true_normal;
m.wall_foot_centroid = self.params.wall_foot_centroid;
m.diffusion_centroid = self.params.diffusion_centroid;
if self.params.diffusion_centroid {
m.compute_face_shifts();
@@ -119,6 +119,7 @@ pub struct Mask {
pub(super) wall_exchange_foot: bool,
pub(super) conv_sides_exact: bool,
pub(super) wall_flux_true_normal: bool,
pub(super) wall_foot_centroid: bool,
/// The centroid prototype's pressure-gradient weights per u / v / w face.
/// The centroid-distance cross diffusion (S2-5).
pub(super) diffusion_centroid: bool,
@@ -550,6 +551,7 @@ impl Mask {
wall_exchange_foot: false,
conv_sides_exact: false,
wall_flux_true_normal: false,
wall_foot_centroid: false,
grad_weights: None,
diffusion_centroid: false,
face_shifts: None,