R2-b/R3: embedded3_added_mass (the cut-cell added-mass pin, the overset instrument's parameters: n 64/128 C_m 1.087/1.127 vs the confined potential-flow 1.071 + Stokes 0.064 = 1.135, the overset's 1.097/1.127); flag tests: the capsule's tip inset (RTX_E3_FLAG_TIP_INSET, default FLAG_HALF — the apex ON the benchmark's tip A; every earlier record had it 10 mm beyond, =0 restores), root fillet knob RTX_E3_FLAG_FILLET (5 mm: no effect), the tip CSV column = the record's tip in recorded mode
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 / Format Check (push) Failing after 3s
CI / CI Success (push) Blocked by required conditions
Performance Benchmarks / Run Benchmarks (push) Failing after 4s
CI / Build (ubuntu-latest) (push) Failing after 4s
CI / Clippy Check (push) Failing after 4s
Documentation / Build User Guide (push) Successful in 5s
CI / Build CPU-Only (Explicit) (push) Failing after 58s
Documentation / Build API Documentation (push) Failing after 59s
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 / Format Check (push) Failing after 3s
CI / CI Success (push) Blocked by required conditions
Performance Benchmarks / Run Benchmarks (push) Failing after 4s
CI / Build (ubuntu-latest) (push) Failing after 4s
CI / Clippy Check (push) Failing after 4s
Documentation / Build User Guide (push) Successful in 5s
CI / Build CPU-Only (Explicit) (push) Failing after 58s
Documentation / Build API Documentation (push) Failing after 59s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
d9239961ad
commit
83922974d7
@@ -80,6 +80,45 @@ fn amplitude() -> f64 {
|
||||
env_f("RTX_E3_FLAG_AMP", AMP)
|
||||
}
|
||||
|
||||
/// R3: the root fillet radius (`RTX_E3_FLAG_FILLET`, metres; 0 = the sharp
|
||||
/// concave corner of the plain union; the overset outline carries 5 mm).
|
||||
fn root_fillet() -> f64 {
|
||||
env_f("RTX_E3_FLAG_FILLET", 0.0)
|
||||
}
|
||||
|
||||
/// R3 (2026-09-21): the capsule's tip inset (`RTX_E3_FLAG_TIP_INSET`,
|
||||
/// metres, default `FLAG_HALF`): the centreline polyline is shortened by
|
||||
/// this much along its last segment so the capsule's apex sits ON the
|
||||
/// benchmark's tip A (the overset outline's semicircle apex). Every flag
|
||||
/// record before this date had the apex 10 mm beyond A (`=0` restores
|
||||
/// them): at ny 62 on the recorded motion that was drag 253.3 → 240.0 and
|
||||
/// the lift swing 1,005 → 836 (the overset's 867).
|
||||
fn tip_inset() -> f64 {
|
||||
env_f("RTX_E3_FLAG_TIP_INSET", FLAG_HALF)
|
||||
}
|
||||
|
||||
/// Smooth union with a concave fillet of radius `r` (the plain `min` at r = 0).
|
||||
fn fillet_union(d1: f64, d2: f64, r: f64) -> f64 {
|
||||
if r > 0.0 && d1 < r && d2 < r {
|
||||
r - ((r - d1).powi(2) + (r - d2).powi(2)).sqrt()
|
||||
} else {
|
||||
d1.min(d2)
|
||||
}
|
||||
}
|
||||
|
||||
/// Pull the polyline's last point back by `inset` along its last segment.
|
||||
fn inset_last(pts: &mut [(f64, f64, f64, f64)], inset: f64) {
|
||||
if inset <= 0.0 || pts.len() < 2 {
|
||||
return;
|
||||
}
|
||||
let n = pts.len();
|
||||
let (ax, ay, _, _) = pts[n - 2];
|
||||
let (bx, by, bvx, bvy) = pts[n - 1];
|
||||
let len = ((bx - ax).powi(2) + (by - ay).powi(2)).sqrt();
|
||||
let f = (1.0 - inset / len).max(0.0);
|
||||
pts[n - 1] = (ax + f * (bx - ax), ay + f * (by - ay), bvx, bvy);
|
||||
}
|
||||
|
||||
/// Signed distance to the deflected flag's cross-section (a capsule
|
||||
/// around the centreline polyline of `n` segments) and the centreline's
|
||||
/// velocity at the closest point (transverse only in the analytic mode).
|
||||
@@ -101,6 +140,7 @@ fn flag_2d_recorded(rec: &Recorded, x: f64, y: f64, t: f64) -> (f64, (f64, f64))
|
||||
let mut c = cell.borrow_mut();
|
||||
if c.0.to_bits() != t.to_bits() {
|
||||
c.1 = rec.at(t, CY);
|
||||
inset_last(&mut c.1, tip_inset());
|
||||
c.0 = t;
|
||||
}
|
||||
let pts = &c.1;
|
||||
@@ -141,6 +181,14 @@ fn flag_2d_analytic(x: f64, y: f64, t: f64) -> (f64, f64) {
|
||||
let (d, v) = deflection(s, t);
|
||||
*p = (FLAG_X0 + s * FLAG_LEN, CY + d, v);
|
||||
}
|
||||
let inset = tip_inset();
|
||||
if inset > 0.0 {
|
||||
let (ax, ay, _) = c.1[N - 1];
|
||||
let (bx, by, bv) = c.1[N];
|
||||
let len = ((bx - ax).powi(2) + (by - ay).powi(2)).sqrt();
|
||||
let f = (1.0 - inset / len).max(0.0);
|
||||
c.1[N] = (ax + f * (bx - ax), ay + f * (by - ay), bv);
|
||||
}
|
||||
c.0 = t;
|
||||
}
|
||||
c.1
|
||||
@@ -273,7 +321,10 @@ fn flag_wake_on_the_device() {
|
||||
}
|
||||
});
|
||||
let cyl = move |x: f64, y: f64| ((x - CX).powi(2) + (y - CY).powi(2)).sqrt() - R_CYL;
|
||||
let body = Body::from_sdf(move |x, y, z, t| cyl(x, y).min(flag_3d(x, y, z, t, r_edge).0))
|
||||
let r_fillet = root_fillet();
|
||||
let body = Body::from_sdf(move |x, y, z, t| {
|
||||
fillet_union(cyl(x, y), flag_3d(x, y, z, t, r_edge).0, r_fillet)
|
||||
})
|
||||
.with_surface_velocity(move |x, y, z, t| {
|
||||
let (df, (vx, vy)) = flag_3d(x, y, z, t, r_edge);
|
||||
if df <= cyl(x, y) {
|
||||
@@ -295,7 +346,7 @@ fn flag_wake_on_the_device() {
|
||||
}
|
||||
solver.initialize(&mut field);
|
||||
println!(
|
||||
" flag wake ny {ny} (span {}; inflow {}, z sides {}): {nx}×{ny}×{nz} = {} cells, h {h:.4e}, dt {dt:.3e}, {periods} periods = {t_end:.3} s, {} steps",
|
||||
" flag wake ny {ny} (span {}; inflow {}, z sides {}; root fillet {:.4} m, tip inset {:.4} m): {nx}×{ny}×{nz} = {} cells, h {h:.4e}, dt {dt:.3e}, {periods} periods = {t_end:.3} s, {} steps",
|
||||
flag_span(),
|
||||
if slab_nz > 0 || inflow_2d { "2d" } else { "3d" },
|
||||
if slab_nz > 0 {
|
||||
@@ -305,6 +356,8 @@ fn flag_wake_on_the_device() {
|
||||
} else {
|
||||
"wall"
|
||||
},
|
||||
root_fillet(),
|
||||
tip_inset(),
|
||||
g.cells(),
|
||||
(t_end / dt).ceil() as usize
|
||||
);
|
||||
@@ -368,7 +421,13 @@ fn flag_wake_on_the_device() {
|
||||
let ft = mask
|
||||
.cut_wall_force(body, &field, RHO * NU, t)
|
||||
.expect("wall");
|
||||
let tip = deflection(1.0, t).0;
|
||||
// The tip's transverse deflection: the record's last station in
|
||||
// recorded mode (until 2026-09-21 this column held the analytic
|
||||
// first mode even then — R2's fits use the record directly).
|
||||
let tip = match recorded() {
|
||||
Some(rec) => rec.at(t, CY).last().map_or(0.0, |p| p.1 - CY),
|
||||
None => deflection(1.0, t).0,
|
||||
};
|
||||
if sample {
|
||||
println!(
|
||||
" t {t:7.4} (tip {tip:+.4}): drag/span {:.1} lift/span {:+.1} N/m (reconstructed {:.1} {:+.1}); total {:.3} {:+.3} N; residual {:.1e} CG {} fresh {}; [{:.0} s]",
|
||||
|
||||
Reference in New Issue
Block a user