From 3dcafd134fb4ef3ba7ad9d9b95c7b92c36108ae6 Mon Sep 17 00:00:00 2001 From: Omar Sobh Date: Sun, 20 Sep 2026 22:31:35 -0500 Subject: [PATCH] =?UTF-8?q?S2-9b:=20embedded3=5Fflag=5Fwake=20knobs=20RTX?= =?UTF-8?q?=5FE3=5FFLAG=5FINFLOW=3D2d=20(the=20slab's=202D=20parabola,=20u?= =?UTF-8?q?niform=20in=20z)=20and=20RTX=5FE3=5FFLAG=5FZSIDES=3Dslip=20(Sli?= =?UTF-8?q?pWall=20on=20z0/z1)=20=E2=80=94=20the=203D=20solver=20on=20the?= =?UTF-8?q?=202D=20problem=20reproduces=20the=20four-cell=20periodic=20sla?= =?UTF-8?q?b=20to=20the=20digit;=20the=203D-over-slab=20drag=20was=20the?= =?UTF-8?q?=20inflow=20convention?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- .../rtx-cfd/tests/embedded3_flag_wake.rs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/crates/specialized/rtx-cfd/tests/embedded3_flag_wake.rs b/crates/specialized/rtx-cfd/tests/embedded3_flag_wake.rs index 51dcec8..a2b4c09 100644 --- a/crates/specialized/rtx-cfd/tests/embedded3_flag_wake.rs +++ b/crates/specialized/rtx-cfd/tests/embedded3_flag_wake.rs @@ -200,6 +200,10 @@ fn flag_wake_on_the_device() { // flag as a 2D problem, minutes per rung: the instrument for the load routes' parts. let slab_nz = env_f("RTX_E3_FLAG_NZ", 0.0) as usize; let nz = if slab_nz > 0 { slab_nz } else { ny }; + // S2-9b: the 3D run with the slab's 2D inflow (uniform in z) and/or slip + // side walls — the decomposition of the 3D-over-slab drag. + let inflow_2d = std::env::var("RTX_E3_FLAG_INFLOW").is_ok_and(|v| v == "2d"); + let z_slip = std::env::var("RTX_E3_FLAG_ZSIDES").is_ok_and(|v| v == "slip"); let r_edge = h; // S2-9: with a recorded kinematics the period and the speed bound are the record's. let rec_period = env_f("RTX_E3_FLAG_KIN_PERIOD", 0.5225); @@ -233,6 +237,14 @@ fn flag_wake_on_the_device() { z1: Side::Periodic, ..Boundaries::default() } + } else if z_slip { + // S2-9b: slip side walls (the 3D solver on a spanwise-uniform problem). + Boundaries { + x1: Side::PressureOutlet, + z0: Side::SlipWall, + z1: Side::SlipWall, + ..Boundaries::default() + } } else { Boundaries { x1: Side::PressureOutlet, @@ -247,7 +259,7 @@ fn flag_wake_on_the_device() { }, ); let inflow_at = move |y: f64, z: f64| { - if slab_nz > 0 { + if slab_nz > 0 || inflow_2d { 6.0 * y * (H - y) / (H * H) } else { inflow(y, z) @@ -283,8 +295,16 @@ fn flag_wake_on_the_device() { } solver.initialize(&mut field); println!( - " flag wake ny {ny} (span {}): {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 {}): {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 { + "periodic" + } else if z_slip { + "slip" + } else { + "wall" + }, g.cells(), (t_end / dt).ceil() as usize );