embedded3: GuessBasis re-export behind the cuda feature (the host-only build broke); A2 build: no convective exchange with prescribed faces (RTX_E3_EXCHANGE_CONVECTION=off, host + device bit 10, load route consistent)
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 / Build (macos-latest) (push) Waiting to run
CI / Build CPU-Only (Explicit) (push) Failing after 4s
Documentation / Build API Documentation (push) Failing after 4s
Documentation / Build User Guide (push) Successful in 5s
CI / Format Check (push) Failing after 12s
CI / Clippy Check (push) Failing after 37s
CI / Build (ubuntu-latest) (push) Failing after 2m48s
Performance Benchmarks / Run Benchmarks (push) Successful in 4m4s
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 / Build (macos-latest) (push) Waiting to run
CI / Build CPU-Only (Explicit) (push) Failing after 4s
Documentation / Build API Documentation (push) Failing after 4s
Documentation / Build User Guide (push) Successful in 5s
CI / Format Check (push) Failing after 12s
CI / Clippy Check (push) Failing after 37s
CI / Build (ubuntu-latest) (push) Failing after 2m48s
Performance Benchmarks / Run Benchmarks (push) Successful in 4m4s
Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
d7250bc4cf
commit
77ecc54b24
@@ -235,14 +235,20 @@ __device__ double cut_face_update(const E3Params& g, const E3Ptrs& f, const E3Cu
|
|||||||
(void)n; (void)x;
|
(void)n; (void)x;
|
||||||
/* convection through the plus face */
|
/* convection through the plus face */
|
||||||
double u_plus, delta_plus;
|
double u_plus, delta_plus;
|
||||||
if (f_up1 >= 0) {
|
/* bit 10 of wall_order (A2): a prescribed neighbour face exchanges no convective momentum */
|
||||||
|
const int* opn = c == 0 ? m.open_u : (c == 1 ? m.open_v : m.open_w);
|
||||||
|
int presc_up = (g.wall_order & 1024) && f_up1 >= 0 && !opn[f_up1];
|
||||||
|
int presc_dn = (g.wall_order & 1024) && f_dn1 >= 0 && !opn[f_dn1];
|
||||||
|
if (presc_up) { u_plus = u0; delta_plus = 0.0; }
|
||||||
|
else if (f_up1 >= 0) {
|
||||||
if (g.scheme == SCHEME_UPWIND) delta_plus = 0.0;
|
if (g.scheme == SCHEME_UPWIND) delta_plus = 0.0;
|
||||||
else if (m_plus >= 0.0) delta_plus = face_corr3(g.scheme, f_dn1 >= 0, dn1, u0, up1);
|
else if (m_plus >= 0.0) delta_plus = face_corr3(g.scheme, f_dn1 >= 0, dn1, u0, up1);
|
||||||
else delta_plus = face_corr3(g.scheme, f_up2 >= 0, up2, up1, u0);
|
else delta_plus = face_corr3(g.scheme, f_up2 >= 0, up2, up1, u0);
|
||||||
u_plus = upwind3(m_plus, u0, up1);
|
u_plus = upwind3(m_plus, u0, up1);
|
||||||
} else { u_plus = upwind3(m_plus, u0, beyond_p); delta_plus = 0.0; }
|
} else { u_plus = upwind3(m_plus, u0, beyond_p); delta_plus = 0.0; }
|
||||||
double u_minus, delta_minus;
|
double u_minus, delta_minus;
|
||||||
if (f_dn1 >= 0) {
|
if (presc_dn) { u_minus = u0; delta_minus = 0.0; }
|
||||||
|
else if (f_dn1 >= 0) {
|
||||||
if (g.scheme == SCHEME_UPWIND) delta_minus = 0.0;
|
if (g.scheme == SCHEME_UPWIND) delta_minus = 0.0;
|
||||||
else if (m_minus >= 0.0) delta_minus = face_corr3(g.scheme, f_dn2 >= 0, dn2, dn1, u0);
|
else if (m_minus >= 0.0) delta_minus = face_corr3(g.scheme, f_dn2 >= 0, dn2, dn1, u0);
|
||||||
else delta_minus = face_corr3(g.scheme, f_up1 >= 0, up1, u0, dn1);
|
else delta_minus = face_corr3(g.scheme, f_up1 >= 0, up1, u0, dn1);
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ impl Mask {
|
|||||||
diffusion_transverse: false,
|
diffusion_transverse: false,
|
||||||
distance_floor_fine: false,
|
distance_floor_fine: false,
|
||||||
wall_advancing: false,
|
wall_advancing: false,
|
||||||
|
exchange_convection_off: false,
|
||||||
wall_exchange_axis: false,
|
wall_exchange_axis: false,
|
||||||
grad_weights: None,
|
grad_weights: None,
|
||||||
diffusion_centroid: false,
|
diffusion_centroid: false,
|
||||||
|
|||||||
@@ -191,7 +191,9 @@ impl Mask {
|
|||||||
scheme.face_correction(up2, un, u0)
|
scheme.face_correction(up2, un, u0)
|
||||||
};
|
};
|
||||||
let u_face = upwind(m_plus, u0, un) + delta;
|
let u_face = upwind(m_plus, u0, un) + delta;
|
||||||
|
if !self.exchange_convection_off {
|
||||||
convective[c] -= -rho * m_plus * (u_face - u0);
|
convective[c] -= -rho * m_plus * (u_face - u0);
|
||||||
|
}
|
||||||
force[c] -=
|
force[c] -=
|
||||||
mu * cv.ap[d][1] * a_d * (un - u0) / solid_spacing(1.0);
|
mu * cv.ap[d][1] * a_d * (un - u0) / solid_spacing(1.0);
|
||||||
}
|
}
|
||||||
@@ -208,7 +210,9 @@ impl Mask {
|
|||||||
scheme.face_correction(up1, u0, ud)
|
scheme.face_correction(up1, u0, ud)
|
||||||
};
|
};
|
||||||
let u_face = upwind(m_minus, ud, u0) + delta;
|
let u_face = upwind(m_minus, ud, u0) + delta;
|
||||||
|
if !self.exchange_convection_off {
|
||||||
convective[c] -= rho * m_minus * (u_face - u0);
|
convective[c] -= rho * m_minus * (u_face - u0);
|
||||||
|
}
|
||||||
force[c] -=
|
force[c] -=
|
||||||
mu * cv.ap[d][0] * a_d * (ud - u0) / solid_spacing(-1.0);
|
mu * cv.ap[d][0] * a_d * (ud - u0) / solid_spacing(-1.0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ mod hierarchy;
|
|||||||
mod pcg;
|
mod pcg;
|
||||||
mod problem;
|
mod problem;
|
||||||
|
|
||||||
|
#[cfg(feature = "cuda")]
|
||||||
pub use device_cg::GuessBasis;
|
pub use device_cg::GuessBasis;
|
||||||
pub use export::{LevelExport, export_hierarchy, vcycle_f32_reference};
|
pub use export::{LevelExport, export_hierarchy, vcycle_f32_reference};
|
||||||
pub use hierarchy::Hierarchy;
|
pub use hierarchy::Hierarchy;
|
||||||
|
|||||||
@@ -163,7 +163,19 @@ impl Solver {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Convection through the plus face.
|
// Convection through the plus face.
|
||||||
|
// A2: a prescribed neighbour face exchanges no convective momentum.
|
||||||
|
let prescribed = |q: [i64; 3]| -> bool {
|
||||||
|
mask.exchange_convection_off
|
||||||
|
&& lat.face(c, q).is_some_and(|f| {
|
||||||
|
(match c {
|
||||||
|
0 => mask.u_kind(f),
|
||||||
|
1 => mask.v_kind(f),
|
||||||
|
_ => mask.w_kind(f),
|
||||||
|
}) != super::super::wall::FaceKind::Fluid
|
||||||
|
})
|
||||||
|
};
|
||||||
let (u_plus, delta_plus) = match up1 {
|
let (u_plus, delta_plus) = match up1 {
|
||||||
|
Some(_) if prescribed(add(p, ed, 1)) => (u0, 0.0),
|
||||||
Some(un) => {
|
Some(un) => {
|
||||||
let delta = if scheme == ConvectionScheme::Upwind {
|
let delta = if scheme == ConvectionScheme::Upwind {
|
||||||
0.0
|
0.0
|
||||||
@@ -177,6 +189,7 @@ impl Solver {
|
|||||||
None => (Self::upwind(m_plus, u0, beyond(true)), 0.0),
|
None => (Self::upwind(m_plus, u0, beyond(true)), 0.0),
|
||||||
};
|
};
|
||||||
let (u_minus, delta_minus) = match dn1 {
|
let (u_minus, delta_minus) = match dn1 {
|
||||||
|
Some(_) if prescribed(add(p, ed, -1)) => (u0, 0.0),
|
||||||
Some(ud) => {
|
Some(ud) => {
|
||||||
let delta = if scheme == ConvectionScheme::Upwind {
|
let delta = if scheme == ConvectionScheme::Upwind {
|
||||||
0.0
|
0.0
|
||||||
|
|||||||
@@ -304,7 +304,9 @@ impl DeviceStep {
|
|||||||
)
|
)
|
||||||
+ 256 * i32::from(self.solver.params.distance_floor_fine)
|
+ 256 * i32::from(self.solver.params.distance_floor_fine)
|
||||||
// bit 9: the advancing-wall friction closure (A3-i).
|
// bit 9: the advancing-wall friction closure (A3-i).
|
||||||
+ 512 * i32::from(self.solver.params.wall_advancing),
|
+ 512 * i32::from(self.solver.params.wall_advancing)
|
||||||
|
// bit 10: no convective exchange with prescribed faces (A2).
|
||||||
|
+ 1024 * i32::from(self.solver.params.exchange_convection_off),
|
||||||
dx: g.dx,
|
dx: g.dx,
|
||||||
dy: g.dy,
|
dy: g.dy,
|
||||||
dz: g.dz,
|
dz: g.dz,
|
||||||
|
|||||||
@@ -120,6 +120,12 @@ pub struct Parameters {
|
|||||||
/// normal to itself sets up (thinner than a cell on the fast flag). f(0) = 1
|
/// normal to itself sets up (thinner than a cell on the fast flag). f(0) = 1
|
||||||
/// exactly: static cases unchanged. `RTX_E3_WALL_ADVANCING=1`.
|
/// exactly: static cases unchanged. `RTX_E3_WALL_ADVANCING=1`.
|
||||||
pub wall_advancing: bool,
|
pub wall_advancing: bool,
|
||||||
|
/// A2: no convective momentum exchange with a PRESCRIBED neighbour face —
|
||||||
|
/// the flux through a control-volume side that adjoins one advects the
|
||||||
|
/// volume's own value (the upwinded exchange was a first-order momentum
|
||||||
|
/// sink the wall collected: 4 % of the flag's drag at ny 62).
|
||||||
|
/// `RTX_E3_EXCHANGE_CONVECTION=off`.
|
||||||
|
pub exchange_convection_off: bool,
|
||||||
/// The diffusive exchange of a fluid face with a SOLID neighbour face
|
/// The diffusive exchange of a fluid face with a SOLID neighbour face
|
||||||
/// over the axis distance to the wall, `δ = min(h, d_f/|n_d|)`, and
|
/// over the axis distance to the wall, `δ = min(h, d_f/|n_d|)`, and
|
||||||
/// implicit — instead of the full `h`, which places the no-slip value
|
/// implicit — instead of the full `h`, which places the no-slip value
|
||||||
@@ -171,6 +177,8 @@ impl Default for Parameters {
|
|||||||
distance_floor_fine: std::env::var("RTX_E3_DISTANCE_FLOOR")
|
distance_floor_fine: std::env::var("RTX_E3_DISTANCE_FLOOR")
|
||||||
.map_or(true, |v| v != "coarse"),
|
.map_or(true, |v| v != "coarse"),
|
||||||
wall_advancing: std::env::var("RTX_E3_WALL_ADVANCING").is_ok_and(|v| v == "1"),
|
wall_advancing: std::env::var("RTX_E3_WALL_ADVANCING").is_ok_and(|v| v == "1"),
|
||||||
|
exchange_convection_off: std::env::var("RTX_E3_EXCHANGE_CONVECTION")
|
||||||
|
.is_ok_and(|v| v == "off"),
|
||||||
wall_exchange_axis: std::env::var("RTX_E3_WALL_EXCHANGE").is_ok_and(|v| v == "axis"),
|
wall_exchange_axis: std::env::var("RTX_E3_WALL_EXCHANGE").is_ok_and(|v| v == "axis"),
|
||||||
pressure_centroid: std::env::var("RTX_E3_PRESSURE_CENTROID").is_ok_and(|v| v == "1"),
|
pressure_centroid: std::env::var("RTX_E3_PRESSURE_CENTROID").is_ok_and(|v| v == "1"),
|
||||||
// ON by default since S2-5 (`=0` reproduces the records before it).
|
// ON by default since S2-5 (`=0` reproduces the records before it).
|
||||||
@@ -311,6 +319,7 @@ impl Solver {
|
|||||||
self.params.diffusion_transverse && self.params.diffusion_centroid;
|
self.params.diffusion_transverse && self.params.diffusion_centroid;
|
||||||
m.distance_floor_fine = self.params.distance_floor_fine;
|
m.distance_floor_fine = self.params.distance_floor_fine;
|
||||||
m.wall_advancing = self.params.wall_advancing;
|
m.wall_advancing = self.params.wall_advancing;
|
||||||
|
m.exchange_convection_off = self.params.exchange_convection_off;
|
||||||
m.diffusion_centroid = self.params.diffusion_centroid;
|
m.diffusion_centroid = self.params.diffusion_centroid;
|
||||||
if self.params.diffusion_centroid {
|
if self.params.diffusion_centroid {
|
||||||
m.compute_face_shifts();
|
m.compute_face_shifts();
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ pub struct Mask {
|
|||||||
pub(super) diffusion_transverse: bool,
|
pub(super) diffusion_transverse: bool,
|
||||||
pub(super) distance_floor_fine: bool,
|
pub(super) distance_floor_fine: bool,
|
||||||
pub(super) wall_advancing: bool,
|
pub(super) wall_advancing: bool,
|
||||||
|
pub(super) exchange_convection_off: bool,
|
||||||
/// The axis-distance implicit wall exchange (S2-5).
|
/// The axis-distance implicit wall exchange (S2-5).
|
||||||
pub(super) wall_exchange_axis: bool,
|
pub(super) wall_exchange_axis: bool,
|
||||||
/// The centroid prototype's pressure-gradient weights per u / v / w face.
|
/// The centroid prototype's pressure-gradient weights per u / v / w face.
|
||||||
@@ -531,6 +532,7 @@ impl Mask {
|
|||||||
diffusion_transverse: false,
|
diffusion_transverse: false,
|
||||||
distance_floor_fine: false,
|
distance_floor_fine: false,
|
||||||
wall_advancing: false,
|
wall_advancing: false,
|
||||||
|
exchange_convection_off: false,
|
||||||
wall_exchange_axis: false,
|
wall_exchange_axis: false,
|
||||||
grad_weights: None,
|
grad_weights: None,
|
||||||
diffusion_centroid: false,
|
diffusion_centroid: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user