rtx-cfd: the deformed-tip outline chooses the flat / semicircle branch against the UNDEFORMED half-thickness — at the semicircle setting the deformed tip's radius breathes by nanometres and flipped the topology (143 → 144 points) within the first steps of the P6-b ny 41 cap-12 release at every α; pin: the point count is fixed under ± 1e-6 thickness breathing at h 10 / 6.6 mm and ny 41, semicircle and flat
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 / Format Check (push) Failing after 6s
Performance Benchmarks / Run Benchmarks (push) Failing after 6s
CI / Build (ubuntu-latest) (push) Failing after 7s
CI / Clippy Check (push) Failing after 7s
Documentation / Build User Guide (push) Successful in 17s
Documentation / Build API Documentation (push) Failing after 22s
CI / Build CPU-Only (Explicit) (push) Failing after 1m8s
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 / Format Check (push) Failing after 6s
Performance Benchmarks / Run Benchmarks (push) Failing after 6s
CI / Build (ubuntu-latest) (push) Failing after 7s
CI / Clippy Check (push) Failing after 7s
Documentation / Build User Guide (push) Successful in 17s
Documentation / Build API Documentation (push) Failing after 22s
CI / Build CPU-Only (Explicit) (push) Failing after 1m8s
Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01YJPeT6WA2e7YvAnS875AHL
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
c3dbd5040a
commit
1c98156653
@@ -952,9 +952,16 @@ pub fn cylinder_flag_outline_deformed_tip(
|
|||||||
let mut pts: Vec<[f64; 2]> = Vec::new();
|
let mut pts: Vec<[f64; 2]> = Vec::new();
|
||||||
// 1. Top edge: from the arc's top end toward the root, along the top
|
// 1. Top edge: from the arc's top end toward the root, along the top
|
||||||
// polyline (given tip → root) from arclength `radius` to x = x_f.
|
// polyline (given tip → root) from arclength `radius` to x = x_f.
|
||||||
// The corner radius: `radius` (the semicircle) or the flat tip's.
|
// The corner radius: `radius` (the semicircle) or the flat tip's. The
|
||||||
let rc = tip_corner.min(radius).max(0.0);
|
// branch is chosen against the UNDEFORMED half-thickness `t`, never the
|
||||||
let flat = rc < radius - 1e-12;
|
// deformed tip's `radius` (which breathes by nanometres under the FEA's
|
||||||
|
// deformation and flipped the topology at the semicircle setting).
|
||||||
|
let flat = tip_corner < t - 1e-9;
|
||||||
|
let rc = if flat {
|
||||||
|
tip_corner.min(radius).max(0.0)
|
||||||
|
} else {
|
||||||
|
radius
|
||||||
|
};
|
||||||
// Corner arc centres and the tangent points on the faces.
|
// Corner arc centres and the tangent points on the faces.
|
||||||
let c_top = [
|
let c_top = [
|
||||||
tc[0] - rc * axis[0] - rc * normal[0],
|
tc[0] - rc * axis[0] - rc * normal[0],
|
||||||
|
|||||||
@@ -25,7 +25,14 @@ const FILLET: f64 = 0.5 * 0.41 / 41.0;
|
|||||||
const CORNER: f64 = 0.0025;
|
const CORNER: f64 = 0.0025;
|
||||||
|
|
||||||
fn edges(a: f64, nx: usize, ny: usize) -> FlagEdges {
|
fn edges(a: f64, nx: usize, ny: usize) -> FlagEdges {
|
||||||
|
edges_breathing(a, nx, ny, 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The flag's edges with the thickness scaled by `1 + eps` (the FEA's
|
||||||
|
/// deformed tip is never exactly `t` thick).
|
||||||
|
fn edges_breathing(a: f64, nx: usize, ny: usize, eps: f64) -> FlagEdges {
|
||||||
let len = X1 - X0;
|
let len = X1 - X0;
|
||||||
|
let th = T * (1.0 + eps);
|
||||||
let centre = |x: f64| {
|
let centre = |x: f64| {
|
||||||
let xi = (x - X0) / len;
|
let xi = (x - X0) / len;
|
||||||
let y = a * xi * xi * (3.0 - xi) / 2.0;
|
let y = a * xi * xi * (3.0 - xi) / 2.0;
|
||||||
@@ -35,7 +42,7 @@ fn edges(a: f64, nx: usize, ny: usize) -> FlagEdges {
|
|||||||
let edge = |x: f64, side: f64| -> [f64; 2] {
|
let edge = |x: f64, side: f64| -> [f64; 2] {
|
||||||
let (y, dy) = centre(x);
|
let (y, dy) = centre(x);
|
||||||
let n = (1.0 + dy * dy).sqrt();
|
let n = (1.0 + dy * dy).sqrt();
|
||||||
[x - side * T * dy / n, CENTRE[1] + y + side * T / n]
|
[x - side * th * dy / n, CENTRE[1] + y + side * th / n]
|
||||||
};
|
};
|
||||||
let m = 2 * nx;
|
let m = 2 * nx;
|
||||||
let bottom: Vec<[f64; 2]> = (0..=m)
|
let bottom: Vec<[f64; 2]> = (0..=m)
|
||||||
@@ -234,3 +241,47 @@ fn flat_tip_patch_builds_straight_and_bent_cold_and_warm() -> CfdResult<()> {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The semicircle setting (`tip_corner = t`) must keep its topology when
|
||||||
|
/// the deformed tip is a few nanometres thicker or thinner than `t` (the
|
||||||
|
/// P6-b ny 41 cap-12 marches died at every α on "topology changed
|
||||||
|
/// 143x12 -> 144x12" within the first steps of the release — the flat /
|
||||||
|
/// semicircle branch was chosen against the DEFORMED half-thickness).
|
||||||
|
#[test]
|
||||||
|
fn semicircle_setting_keeps_its_topology_under_thickness_breathing() {
|
||||||
|
for &h in &[0.01, 0.41 / 41.0, 0.41 / 62.0] {
|
||||||
|
let n0 = outline_breathing(0.0, h, T, 0.0).len();
|
||||||
|
for &eps in &[-1e-6, -1e-9, 1e-12, 1e-9, 1e-6, 1e-4] {
|
||||||
|
for &a in &[0.0, 1e-5, -1e-5, 0.08] {
|
||||||
|
let n = outline_breathing(a, h, T, eps).len();
|
||||||
|
assert_eq!(n, n0, "h = {h}, eps = {eps:e}, a = {a}: {n} points vs {n0}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The flat tip is insensitive too.
|
||||||
|
let f0 = outline_breathing(0.0, h, CORNER, 0.0).len();
|
||||||
|
for &eps in &[-1e-6, 1e-6, 1e-4] {
|
||||||
|
assert_eq!(
|
||||||
|
outline_breathing(0.0, h, CORNER, eps).len(),
|
||||||
|
f0,
|
||||||
|
"flat, h = {h}, eps = {eps:e}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn outline_breathing(a: f64, h: f64, corner: f64, eps: f64) -> Vec<[f64; 2]> {
|
||||||
|
cylinder_flag_outline_deformed_tip(
|
||||||
|
CENTRE,
|
||||||
|
R,
|
||||||
|
T,
|
||||||
|
&edges_breathing(a, 35, 2, eps),
|
||||||
|
X1,
|
||||||
|
FILLET,
|
||||||
|
3,
|
||||||
|
16,
|
||||||
|
h,
|
||||||
|
1.15,
|
||||||
|
corner,
|
||||||
|
)
|
||||||
|
.0
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user