Wind Tunnel Model Design (aerodynamics/wind-tunnel/wind-tunnel-model-design)
Use when the task is designing the scale model and the test setup for a
wind tunnel campaign on an aircraft configuration, the pre-test design
step that fixes the model geometry and the loads the installation must
carry before any runs. The model scale is driven by the smaller of two
geometric constraints, the test section blockage limit and the span
clearance to the walls; the model reference dimensions follow from the
scale; the model Reynolds number at the maximum tunnel speed is compared
with the full-scale flight Reynolds number; and the maximum test
dynamic pressure and the resulting model load are used to rate the force
balance and to size the model support sting. The leaf pairs with the
post-test siblings: aerodynamics/wind-tunnel/windtunnel-data-reduction
reduces the raw balance readings into coefficients after the runs, and
aerodynamics/wind-tunnel/windtunnel-wall-corrections corrects measured
coefficients for the test section boundaries; this leaf stops at the
pre-test design and reports a Reynolds mismatch flag rather than a
corrected result.
The module constants BLOCKAGE_MAX (0.05), SPAN_CLEARANCE (0.8) and
STING_ALLOWABLE_STRESS_PA (800 MPa) are documented typical values only:
they are program and test specific inputs, and every function and the
analyze pass accept explicit overrides. NACA TR-824 frames the
compressible-flow context the tunnel operates in; the relations below
are standard low-speed model sizing and load estimation methodology,
summary-only. Pure Python stdlib, deterministic, offline.
Domain quick reference
- Test section area: A_test = w * h (test_section_area).
- Blockage-limited scale: lambda_blockage = sqrt(blockage_max *
A_test / S_full), the scale at which the model wing area equals
blockage_max times the test section area (scale_from_blockage).
- Span-limited scale: lambda_span = (w * clearance) / b_full, the
largest model that keeps the span inside the available fraction of
the section width (scale_from_span).
- Chosen scale: lambda = min(lambda_blockage, lambda_span)
(choose_scale). The dict also carries model_wing_area = S_full *
lambda^2, model_mac = c_full * lambda, model_span = b_full * lambda,
blockage_ratio = S_model / A_test and blocked_ok (the blockage limit
is inclusive). choose_scale takes the full-scale MAC as its fifth
argument so the model chord is reported; the scale selection itself
depends only on the areas and the span.
- Model Reynolds number: Re_model = rho * V * c_model / mu, rho and mu
at sea level by default (reynolds_model).
- Reynolds ratio: Re_model / Re_full (reynolds_ratio). The analyze
pass reports "reynolds-matched" when the ratio is at least 0.5 and
"reynolds-mismatch" below; this is an engineering flag about the
tunnel capability, not a pass/fail gate on the campaign.
- Maximum dynamic pressure: q = 0.5 * rho * Vmax^2.
- Model load at the maximum test lift coefficient: L = q * S_model *
CL_max_test (model_load_N), the load the balance must carry.
- Balance rating: "balance-ok" when L <= balance_capacity_N, else
"balance-overload" (balance_verdict).
- Sting sizing: M = L * sting_arm, then d = (32 * M / (pi *
sigma_allow))^(1/3) for the solid circular sting section
(sting_diameter_m).
- One-call pass: analyze(inputs) returns the scale selection, model
dimensions, blockage ratio, model Reynolds number and ratio, dynamic
pressure, load, balance verdict, sting bending moment and diameter in
a single dict.
- Units are SI throughout: m, m2, m/s, Pa, N, N m, kg/(m s).
Workflow
- Gather the test section geometry (test_section_width_m,
test_section_height_m, or the area directly), the full-scale
reference data (full_span_m, full_wing_area_m2, full_mac_m,
full_reynolds), the tunnel maximum speed, and the program specific
inputs: max_test_cl (default 1.4), balance_capacity_N, sting_arm_m,
sting_allowable_stress_pa, blockage_max and clearance when they
differ from the documented typicals.
- Confirm the test section area with test_section_area, or pass
test_section_area_m2 to skip the product.
- Select the scale with choose_scale and read lambda, the model wing
area, MAC and span, the blockage_ratio and blocked_ok from the
returned dict; when the span limit binds the model is smaller than
the blockage limit allows.
- Check the tunnel Reynolds capability: reynolds_model at the maximum
tunnel speed, then reynolds_ratio against the full-scale flight
condition. A ratio below 0.5 flags reynolds-mismatch, the usual
low-speed outcome for a large transport, and is reported as a
limitation of the campaign, not an error.
- Compute q = 0.5 * rho * Vmax^2 and the model load at the maximum
test lift coefficient with model_load_N, then rate the balance with
balance_verdict.
- Size the sting: the bending moment is the model load times the sting
arm (model quarter chord to the sting mount); sting_diameter_m gives
the solid circular section diameter at the allowable stress.
- For the complete setup in one call, run analyze(inputs) and read the
whole dict; it applies the same sequence and validates every input.
- Confirm the deterministic checks with the contract test
scripts/test_wind_tunnel_model_design.py.
Worked example
A 2.44 m square test section (area 5.9536 m2) for a full-scale
transport: span 34.0 m, wing area 122.6 m2, MAC 4.2 m, full-scale
Reynolds number 3.0e7. Tunnel maximum speed 80 m/s, max_test_cl 1.4,
balance capacity 5000 N, sting arm 0.35 m, sting allowable stress
800 MPa, default blockage_max 0.05 and clearance 0.8.
- scale_from_blockage: sqrt(0.05 * 5.9536 / 122.6) = 0.04927, the
blockage-limited scale.
- scale_from_span: (2.44 * 0.8) / 34.0 = 0.05741. The chosen scale is
the smaller, lambda = 0.04927.
- Model dimensions: wing area 122.6 * 0.04927^2 = 0.29761 m2, MAC
4.2 * 0.04927 = 0.20693 m, span 34.0 * 0.04927 = 1.6752 m.
- Blockage ratio: 0.29761 / 5.9536 = 0.04999, within the 0.05 limit,
so blocked_ok. The module carries full precision (scale 0.049275,
model area 0.29768 m2), which lands the ratio on the limit and the
reported anchors within their contract tolerances.
- Model Reynolds at 80 m/s: 1.225 * 80 * 0.20693 / 1.789e-5 = 1.1337e6.
Ratio to the full-scale condition: 1.1337e6 / 3.0e7 = 0.03779, far
below 0.5, so reynolds_limitation is "reynolds-mismatch": the
low-speed model runs at 3.8% of the flight Reynolds number.
- Dynamic pressure: q = 0.5 * 1.225 * 80^2 = 3920 Pa. Model load at
max_test_cl 1.4: 3920 * 0.29761 * 1.4 = 1633.3 N, against a 5000 N
balance, so the verdict is balance-ok (a 1000 N balance would read
balance-overload).
- Sting: bending moment 1633.3 * 0.35 = 571.7 N m; diameter
(32 * 571.7 / (pi * 800e6))^(1/3) = 0.01938 m = 19.38 mm at 800 MPa.
Verification
- Confirm choose_scale on the worked example returns scale 0.04927
within 1e-4, model area 0.29761 m2 within 1e-4, model MAC 0.20693 m
within 1e-4 and model span 1.6752 m within 2e-4 (the published span
anchor is computed from the scale truncated to five decimals).
- Confirm reynolds_model returns 1.1337e6 within 1e3, the ratio 0.03779
within 1e-4, and analyze reports "reynolds-mismatch".
- Confirm model_load_N returns 1633.3 N within 1 N and
balance_verdict gives "balance-ok" at 5000 N capacity and
"balance-overload" at 1000 N.
- Confirm sting_diameter_m returns 0.01938 m within 0.01 mm.
- Confirm every non-positive width, height, area, span, MAC, Reynolds
number, tunnel speed, lift coefficient, balance capacity, sting arm
and allowable stress raises ValueError, in the individual functions
and in analyze.
- Run the contract test offline: python3
scripts/test_wind_tunnel_model_design.py (35 tests, deterministic,
exit 0).
Related leaves
- aerodynamics/wind-tunnel/windtunnel-data-reduction: reduces the raw
balance and pressure measurements into coefficients after the runs,
with the tare and uncertainty steps this pre-test leaf does not do.
- aerodynamics/wind-tunnel/windtunnel-wall-corrections: applies the
closed-wall corrections to the measured coefficients, the post-test
counterpart of the pre-test blockage budget fixed here.
Pitfalls
- Taking the blockage limit as the scale without checking the span
clearance: choose_scale returns the smaller of lambda_blockage and
lambda_span, and in the worked example the span limit would allow
0.05741 while blockage binds at 0.04927 - the reverse case binds on
span, so report which constraint drove the choice.
- Treating a reynolds-mismatch flag as a campaign error: a ratio below
0.5 (0.03779 in the worked example) is the usual low-speed outcome
for a large transport and is reported as a tunnel-capability
limitation, not a pass/fail gate on the model.
- Overriding the documented typical constants without checking the
program: BLOCKAGE_MAX, SPAN_CLEARANCE and STING_ALLOWABLE_STRESS_PA
are test-specific inputs with defaults; each function and analyze
accept explicit overrides, so pass program values rather than
assuming the defaults hold.
- Rating the balance on the cruise load: the load that must be carried
is q * S_model * CL_max_test at the maximum test lift coefficient
(1633 N in the example), and a 1000 N balance reads balance-overload
even though the 5000 N rating passes.
- Sizing the sting on force alone: the bending moment is the model load
times the sting arm (quarter chord to mount), and the diameter comes
from that moment at the allowable stress - an arm change alters the
diameter even at fixed load.
- Quoting the rounded scale anchors: the module carries full precision
(scale 0.049275 vs the published 0.04927) so the round-trip dimension
checks land within tolerance; do not truncate inputs to the published
anchors before calling.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_wind_tunnel_model_design.py
The test covers the worked example anchors (scale 0.04927, model wing
area 0.29761 m2, MAC 0.20693 m, span 1.6752 m, blockage ratio 0.04999,
model Reynolds 1.1337e6, Reynolds ratio 0.03779, load 1633.3 N, sting
diameter 19.38 mm), scale selection as the minimum of the blockage and
span limits with exact dimension round trips, the span-limited case,
the balance overload verdict, the reynolds-matched flag above a 0.5
ratio, the default max_test_cl, the direct test section area input,
determinism of the analyze pass, and ValueError rejection of every
non-positive input class.
Compliance
- Standards referenced, not reproduced: NACA TR-824 is named for the
compressible-flow context only; the sizing relations above are
standard low-speed wind tunnel methodology, summary-only per
standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: wind-tunnel-model-design3description: Use when you must design the wind tunnel model and the test setup for a wind tunnel campaign on an aircraft configuration: select the model scale as the smaller of the test section blockage limit and the span clearance, compute the model wing area, span and mean aerodynamic chord from the scale, check the model Reynolds number at the maximum tunnel speed against the full scale flight Reynolds number and report the Reynolds mismatch, estimate the maximum dynamic pressure and the model load at the maximum test lift coefficient, rate the force balance capacity against that load, and size the model support sting for the bending moment. Produces the chosen scale, model reference dimensions, blockage ratio, Reynolds ratio, balance verdict and sting diameter that gate the model build. Trigger: wind tunnel model design, model scale selection, blockage ratio, reynolds mismatch, force balance rating, sting sizing, test section.4license: Apache-2.05---67# Wind Tunnel Model Design (aerodynamics/wind-tunnel/wind-tunnel-model-design)89Use when the task is designing the scale model and the test setup for a10wind tunnel campaign on an aircraft configuration, the pre-test design11step that fixes the model geometry and the loads the installation must12carry before any runs. The model scale is driven by the smaller of two13geometric constraints, the test section blockage limit and the span14clearance to the walls; the model reference dimensions follow from the15scale; the model Reynolds number at the maximum tunnel speed is compared16with the full-scale flight Reynolds number; and the maximum test17dynamic pressure and the resulting model load are used to rate the force18balance and to size the model support sting. The leaf pairs with the19post-test siblings: aerodynamics/wind-tunnel/windtunnel-data-reduction20reduces the raw balance readings into coefficients after the runs, and21aerodynamics/wind-tunnel/windtunnel-wall-corrections corrects measured22coefficients for the test section boundaries; this leaf stops at the23pre-test design and reports a Reynolds mismatch flag rather than a24corrected result.2526The module constants BLOCKAGE_MAX (0.05), SPAN_CLEARANCE (0.8) and27STING_ALLOWABLE_STRESS_PA (800 MPa) are documented typical values only:28they are program and test specific inputs, and every function and the29analyze pass accept explicit overrides. NACA TR-824 frames the30compressible-flow context the tunnel operates in; the relations below31are standard low-speed model sizing and load estimation methodology,32summary-only. Pure Python stdlib, deterministic, offline.3334## Domain quick reference3536- Test section area: A_test = w * h (test_section_area).37- Blockage-limited scale: lambda_blockage = sqrt(blockage_max *38 A_test / S_full), the scale at which the model wing area equals39 blockage_max times the test section area (scale_from_blockage).40- Span-limited scale: lambda_span = (w * clearance) / b_full, the41 largest model that keeps the span inside the available fraction of42 the section width (scale_from_span).43- Chosen scale: lambda = min(lambda_blockage, lambda_span)44 (choose_scale). The dict also carries model_wing_area = S_full *45 lambda^2, model_mac = c_full * lambda, model_span = b_full * lambda,46 blockage_ratio = S_model / A_test and blocked_ok (the blockage limit47 is inclusive). choose_scale takes the full-scale MAC as its fifth48 argument so the model chord is reported; the scale selection itself49 depends only on the areas and the span.50- Model Reynolds number: Re_model = rho * V * c_model / mu, rho and mu51 at sea level by default (reynolds_model).52- Reynolds ratio: Re_model / Re_full (reynolds_ratio). The analyze53 pass reports "reynolds-matched" when the ratio is at least 0.5 and54 "reynolds-mismatch" below; this is an engineering flag about the55 tunnel capability, not a pass/fail gate on the campaign.56- Maximum dynamic pressure: q = 0.5 * rho * Vmax^2.57- Model load at the maximum test lift coefficient: L = q * S_model *58 CL_max_test (model_load_N), the load the balance must carry.59- Balance rating: "balance-ok" when L <= balance_capacity_N, else60 "balance-overload" (balance_verdict).61- Sting sizing: M = L * sting_arm, then d = (32 * M / (pi *62 sigma_allow))^(1/3) for the solid circular sting section63 (sting_diameter_m).64- One-call pass: analyze(inputs) returns the scale selection, model65 dimensions, blockage ratio, model Reynolds number and ratio, dynamic66 pressure, load, balance verdict, sting bending moment and diameter in67 a single dict.68- Units are SI throughout: m, m2, m/s, Pa, N, N m, kg/(m s).6970## Workflow71721. Gather the test section geometry (test_section_width_m,73 test_section_height_m, or the area directly), the full-scale74 reference data (full_span_m, full_wing_area_m2, full_mac_m,75 full_reynolds), the tunnel maximum speed, and the program specific76 inputs: max_test_cl (default 1.4), balance_capacity_N, sting_arm_m,77 sting_allowable_stress_pa, blockage_max and clearance when they78 differ from the documented typicals.792. Confirm the test section area with test_section_area, or pass80 test_section_area_m2 to skip the product.813. Select the scale with choose_scale and read lambda, the model wing82 area, MAC and span, the blockage_ratio and blocked_ok from the83 returned dict; when the span limit binds the model is smaller than84 the blockage limit allows.854. Check the tunnel Reynolds capability: reynolds_model at the maximum86 tunnel speed, then reynolds_ratio against the full-scale flight87 condition. A ratio below 0.5 flags reynolds-mismatch, the usual88 low-speed outcome for a large transport, and is reported as a89 limitation of the campaign, not an error.905. Compute q = 0.5 * rho * Vmax^2 and the model load at the maximum91 test lift coefficient with model_load_N, then rate the balance with92 balance_verdict.936. Size the sting: the bending moment is the model load times the sting94 arm (model quarter chord to the sting mount); sting_diameter_m gives95 the solid circular section diameter at the allowable stress.967. For the complete setup in one call, run analyze(inputs) and read the97 whole dict; it applies the same sequence and validates every input.988. Confirm the deterministic checks with the contract test99 scripts/test_wind_tunnel_model_design.py.100101## Worked example102103A 2.44 m square test section (area 5.9536 m2) for a full-scale104transport: span 34.0 m, wing area 122.6 m2, MAC 4.2 m, full-scale105Reynolds number 3.0e7. Tunnel maximum speed 80 m/s, max_test_cl 1.4,106balance capacity 5000 N, sting arm 0.35 m, sting allowable stress107800 MPa, default blockage_max 0.05 and clearance 0.8.108109- scale_from_blockage: sqrt(0.05 * 5.9536 / 122.6) = 0.04927, the110 blockage-limited scale.111- scale_from_span: (2.44 * 0.8) / 34.0 = 0.05741. The chosen scale is112 the smaller, lambda = 0.04927.113- Model dimensions: wing area 122.6 * 0.04927^2 = 0.29761 m2, MAC114 4.2 * 0.04927 = 0.20693 m, span 34.0 * 0.04927 = 1.6752 m.115- Blockage ratio: 0.29761 / 5.9536 = 0.04999, within the 0.05 limit,116 so blocked_ok. The module carries full precision (scale 0.049275,117 model area 0.29768 m2), which lands the ratio on the limit and the118 reported anchors within their contract tolerances.119- Model Reynolds at 80 m/s: 1.225 * 80 * 0.20693 / 1.789e-5 = 1.1337e6.120 Ratio to the full-scale condition: 1.1337e6 / 3.0e7 = 0.03779, far121 below 0.5, so reynolds_limitation is "reynolds-mismatch": the122 low-speed model runs at 3.8% of the flight Reynolds number.123- Dynamic pressure: q = 0.5 * 1.225 * 80^2 = 3920 Pa. Model load at124 max_test_cl 1.4: 3920 * 0.29761 * 1.4 = 1633.3 N, against a 5000 N125 balance, so the verdict is balance-ok (a 1000 N balance would read126 balance-overload).127- Sting: bending moment 1633.3 * 0.35 = 571.7 N m; diameter128 (32 * 571.7 / (pi * 800e6))^(1/3) = 0.01938 m = 19.38 mm at 800 MPa.129130## Verification131132- Confirm choose_scale on the worked example returns scale 0.04927133 within 1e-4, model area 0.29761 m2 within 1e-4, model MAC 0.20693 m134 within 1e-4 and model span 1.6752 m within 2e-4 (the published span135 anchor is computed from the scale truncated to five decimals).136- Confirm reynolds_model returns 1.1337e6 within 1e3, the ratio 0.03779137 within 1e-4, and analyze reports "reynolds-mismatch".138- Confirm model_load_N returns 1633.3 N within 1 N and139 balance_verdict gives "balance-ok" at 5000 N capacity and140 "balance-overload" at 1000 N.141- Confirm sting_diameter_m returns 0.01938 m within 0.01 mm.142- Confirm every non-positive width, height, area, span, MAC, Reynolds143 number, tunnel speed, lift coefficient, balance capacity, sting arm144 and allowable stress raises ValueError, in the individual functions145 and in analyze.146- Run the contract test offline: python3147 scripts/test_wind_tunnel_model_design.py (35 tests, deterministic,148 exit 0).149150## Related leaves151152- aerodynamics/wind-tunnel/windtunnel-data-reduction: reduces the raw153 balance and pressure measurements into coefficients after the runs,154 with the tare and uncertainty steps this pre-test leaf does not do.155- aerodynamics/wind-tunnel/windtunnel-wall-corrections: applies the156 closed-wall corrections to the measured coefficients, the post-test157 counterpart of the pre-test blockage budget fixed here.158159## Pitfalls160161- Taking the blockage limit as the scale without checking the span162 clearance: choose_scale returns the smaller of lambda_blockage and163 lambda_span, and in the worked example the span limit would allow164 0.05741 while blockage binds at 0.04927 - the reverse case binds on165 span, so report which constraint drove the choice.166- Treating a reynolds-mismatch flag as a campaign error: a ratio below167 0.5 (0.03779 in the worked example) is the usual low-speed outcome168 for a large transport and is reported as a tunnel-capability169 limitation, not a pass/fail gate on the model.170- Overriding the documented typical constants without checking the171 program: BLOCKAGE_MAX, SPAN_CLEARANCE and STING_ALLOWABLE_STRESS_PA172 are test-specific inputs with defaults; each function and analyze173 accept explicit overrides, so pass program values rather than174 assuming the defaults hold.175- Rating the balance on the cruise load: the load that must be carried176 is q * S_model * CL_max_test at the maximum test lift coefficient177 (1633 N in the example), and a 1000 N balance reads balance-overload178 even though the 5000 N rating passes.179- Sizing the sting on force alone: the bending moment is the model load180 times the sting arm (quarter chord to mount), and the diameter comes181 from that moment at the allowable stress - an arm change alters the182 diameter even at fixed load.183- Quoting the rounded scale anchors: the module carries full precision184 (scale 0.049275 vs the published 0.04927) so the round-trip dimension185 checks land within tolerance; do not truncate inputs to the published186 anchors before calling.187188## Behavior contract (gate 3)189190Run the deterministic contract test (stdlib unittest, offline):191192 python3 scripts/test_wind_tunnel_model_design.py193194The test covers the worked example anchors (scale 0.04927, model wing195area 0.29761 m2, MAC 0.20693 m, span 1.6752 m, blockage ratio 0.04999,196model Reynolds 1.1337e6, Reynolds ratio 0.03779, load 1633.3 N, sting197diameter 19.38 mm), scale selection as the minimum of the blockage and198span limits with exact dimension round trips, the span-limited case,199the balance overload verdict, the reynolds-matched flag above a 0.5200ratio, the default max_test_cl, the direct test section area input,201determinism of the analyze pass, and ValueError rejection of every202non-positive input class.203204## Compliance205206- Standards referenced, not reproduced: NACA TR-824 is named for the207 compressible-flow context only; the sizing relations above are208 standard low-speed wind tunnel methodology, summary-only per209 standards-map.yaml.210- compliance: STANDARDS-REF, gated: false.