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 );