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
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:
co-authored by
Claude Fable 5.1
parent
0215c7d6a5
commit
4c000266d9
@@ -88,6 +88,9 @@ pub struct FaceResidual {
|
||||
pub r: f64,
|
||||
/// Between two fringe cells (else fringe–hole).
|
||||
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, i−1) | (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),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user