rtx-cfd: overset momentum residual carries its pieces per ring face (time, convective, diffusive, pressure); overset_cfd1 offline probes on the saved fields — RTX_OVERSET_CFD1_FRONT dumps the cylinder-front faces by piece, RTX_OVERSET_CFD1_RAW re-evaluates the ring on the raw interpolated stamping without balance_fringe_fluxes (the balance is not the ring's source: +0.241 raw vs +0.247 balanced at ny = 41 upwind)
CI / Format Check (push) Canceled after 0s
CI / Clippy Check (push) Canceled after 0s
CI / Build (macos-latest) (push) Canceled after 0s
CI / Build (ubuntu-latest) (push) Canceled after 0s
Performance Benchmarks / Run Benchmarks (push) Canceled after 0s
CI / Test (macos-latest) (push) Canceled after 0s
CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Build CPU-Only (Explicit) (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
Documentation / Build API Documentation (push) Canceled after 0s
Documentation / Build User Guide (push) Canceled after 0s

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01X2GmJXeQ2njUecEKiJZ1G2
This commit is contained in:
Omar Sobh
2026-09-06 14:37:08 -07:00
co-authored by Claude Fable 5.1
parent 0215c7d6a5
commit 4c000266d9
2 changed files with 177 additions and 0 deletions
@@ -88,6 +88,9 @@ pub struct FaceResidual {
pub r: f64,
/// Between two fringe cells (else fringehole).
pub fringe_fringe: bool,
/// The pieces of `r` (N/m): unsteady, convective, diffusive, pressure
/// (`r = time + conv diff + pres`; upwind, interior faces).
pub pieces: [f64; 4],
}
/// The momentum residual by face class.
@@ -198,6 +201,55 @@ impl OversetPisoSolver {
};
let vol = dx * dy;
let mut prescribed = Vec::new();
let mu = self.background.config().viscosity;
let upw = |f: f64, a: f64, b: f64| if f >= 0.0 { a } else { b };
// The upwind predictor's pieces on an interior u face, × ρ·vol.
let u_pieces = |m: &crate::solvers::incompressible::flow_field::FlowField,
j: usize,
i: usize| {
let (u, v) = (&m.u_old, &m.v_old);
let ue = 0.5 * (u[(j, i)] + u[(j, i + 1)]);
let uw = 0.5 * (u[(j, i - 1)] + u[(j, i)]);
let vn = 0.5 * (v[(j + 1, i - 1)] + v[(j + 1, i)]);
let vs = 0.5 * (v[(j, i - 1)] + v[(j, i)]);
let conv = (ue * upw(ue, u[(j, i)], u[(j, i + 1)])
- uw * upw(uw, u[(j, i - 1)], u[(j, i)]))
/ dx
+ (vn * upw(vn, u[(j, i)], u[(j + 1, i)]) - vs * upw(vs, u[(j - 1, i)], u[(j, i)]))
/ dy;
let diff = (u[(j, i + 1)] - 2.0 * u[(j, i)] + u[(j, i - 1)]) / (dx * dx)
+ (u[(j + 1, i)] - 2.0 * u[(j, i)] + u[(j - 1, i)]) / (dy * dy);
let pres = (m.p[(j, i)] - m.p[(j, i - 1)]) / dx;
[
rho * (m.u[(j, i)] - m.u_old[(j, i)]) / dt * vol,
rho * conv * vol,
mu * diff * vol,
pres * vol,
]
};
let v_pieces = |m: &crate::solvers::incompressible::flow_field::FlowField,
j: usize,
i: usize| {
let (u, v) = (&m.u_old, &m.v_old);
let vn = 0.5 * (v[(j, i)] + v[(j + 1, i)]);
let vs = 0.5 * (v[(j - 1, i)] + v[(j, i)]);
let ue = 0.5 * (u[(j - 1, i + 1)] + u[(j, i + 1)]);
let uw = 0.5 * (u[(j - 1, i)] + u[(j, i)]);
let conv = (vn * upw(vn, v[(j, i)], v[(j + 1, i)])
- vs * upw(vs, v[(j - 1, i)], v[(j, i)]))
/ dy
+ (ue * upw(ue, v[(j, i)], v[(j, i + 1)]) - uw * upw(uw, v[(j, i - 1)], v[(j, i)]))
/ dx;
let diff = (v[(j + 1, i)] - 2.0 * v[(j, i)] + v[(j - 1, i)]) / (dy * dy)
+ (v[(j, i + 1)] - 2.0 * v[(j, i)] + v[(j, i - 1)]) / (dx * dx);
let pres = (m.p[(j, i)] - m.p[(j - 1, i)]) / dy;
[
rho * (m.v[(j, i)] - m.v_old[(j, i)]) / dt * vol,
rho * conv * vol,
mu * diff * vol,
pres * vol,
]
};
// u faces (j, i), i = 1..nx: cells (j, i1) | (j, i).
for j in 0..ny {
@@ -243,6 +295,7 @@ impl OversetPisoSolver {
i,
r,
fringe_fringe: w == CellClass::Fringe && e == CellClass::Fringe,
pieces: u_pieces(&m, j, i),
});
}
}
@@ -290,6 +343,7 @@ impl OversetPisoSolver {
i,
r,
fringe_fringe: s == CellClass::Fringe && n == CellClass::Fringe,
pieces: v_pieces(&m, j, i),
});
}
}