Bow Shock Standoff Distance (aerodynamics/high-speed/bow-shock-standoff)
Use when the task is estimating the detached bow-shock standoff distance
on the stagnation streamline ahead of a blunt nose in supersonic and
hypersonic flow: the shock stands ahead of a sphere nose or a circular
cylinder leading edge rather than attaching to a sharp point, and the
shock-layer thickness between the nose and the shock sets the local
environment for pressure and heating trades. This leaf implements the
classical Billig-form standoff correlations for gamma = 1.4 in pure
Python, stdlib only: the sphere form for an axisymmetric nose and the
cylinder form for a two-dimensional leading edge, both as an exponential
of 1 over the freestream Mach squared. It pairs with
aerodynamics/high-speed/hypersonic-flow for the force coefficients of
the blunt body behind the shock and with
aerodynamics/high-speed/aerodynamic-heating, whose stagnation-point flux
scales with the same nose radius. The method is the standard engineering
estimate for the shock-layer geometry, not a CFD replacement.
Domain quick reference
- Sphere standoff ratio (axisymmetric nose): Delta / R = 0.143 *
exp(3.24 / M^2), with M the freestream Mach number, R the nose
radius and Delta the standoff distance of the detached shock ahead
of the stagnation point.
- Cylinder standoff ratio (two-dimensional leading edge): Delta / R =
0.386 * exp(4.67 / M^2). The coefficient is about 2.7 times the
sphere coefficient, so at the same Mach the cylinder shock layer is
the thicker one.
- Physical distance: Delta = (Delta / R) * R, so the standoff distance
scales linearly with the nose radius.
- Trends: the ratio is monotone decreasing in Mach (more compression
pushes the shock closer at higher Mach) and the cylinder ratio
exceeds the sphere ratio at every Mach above 1.
- High-Mach asymptote: as M grows, each ratio approaches its leading
coefficient from above, exp(3.24 / M^2) and exp(4.67 / M^2) both
tending to 1.
- Validity floor: the correlations are documented for freestream Mach
above about 1.5; the ratio grows without bound as M approaches 1,
where no detached bow shock exists.
- Units are SI throughout: M dimensionless, R and Delta in meters.
- NACA TR-824 frames the compressible-flow context; the standoff
relations above are standard engineering methodology, summary-only.
Workflow
- Fix the flight point and the nose geometry: record the freestream
Mach number M and the nose radius R in meters and pick the body,
sphere for an axisymmetric nose or cylinder for a two-dimensional
leading edge. Feed a Mach at or below 1 or a non-positive radius
and the functions reject the point with ValueError, because no
detached shock layer exists at or below Mach 1. (flight-point step)
- Evaluate the standoff ratio on the stagnation streamline with
standoff_ratio(mach, body), applying the Billig-form correlation:
0.143 * exp(3.24 / M^2) for the sphere or 0.386 * exp(4.67 / M^2)
for the cylinder. The output is the geometry-free ratio Delta / R.
(ratio-evaluation step)
- Convert the ratio to the physical standoff distance with
standoff_distance(mach, radius, body), Delta = (Delta / R) * R in
meters; the distance scales linearly with the nose radius.
(distance-conversion step)
- Run the trend checks with standoff_report(mach, radius, body):
decreasing_with_mach compares the ratio at M against the ratio at
1.1 * M and sphere_cylinder_order confirms that the cylinder ratio
exceeds the sphere ratio at this Mach. Both sanity flags gate the
blunt-body nose-radius trade and the shock-layer thickness
estimate. (trend-check step)
- Respect the validity floor: the correlations are documented for
freestream Mach above about 1.5, so a ratio computed below the
floor carries the floor caveat in the report and is never quoted
as a converged shock-layer size. (validity-floor step)
- Confirm the deterministic behavior and the non-physical input
rejection with the contract test scripts/test_bow_shock_standoff.py.
(contract-test step)
Worked example
A reentry or cruise nose at M = 8 and a blunt leading edge at M = 4:
- Sphere at M = 8: standoff_ratio(8.0) = 0.143 * exp(3.24 / 64) =
0.15043; with R = 0.5 m, standoff_distance(8.0, 0.5) = 0.07521 m.
- Sphere at M = 4: standoff_ratio(4.0) = 0.143 * exp(3.24 / 16) =
0.17510; with R = 0.5 m the standoff distance is 0.08755 m.
- Cylinder at M = 8: standoff_ratio(8.0, "cylinder") = 0.386 *
exp(4.67 / 64) = 0.41522; with R = 0.5 m the standoff distance is
0.20761 m.
- Cylinder at M = 4: standoff_ratio(4.0, "cylinder") = 0.386 *
exp(4.67 / 16) = 0.51683; with R = 0.5 m the standoff distance is
0.25841 m.
- Trend checks at M = 4, R = 0.5 m, sphere:
standoff_report(4.0, 0.5) returns ratio 0.17510, distance
0.08755 m, sphere_cylinder_order True (cylinder ratio 0.51683
exceeds the sphere ratio 0.17510) and decreasing_with_mach True
(the ratio at 4.4 is below the ratio at 4.0). The same flags hold
at M = 8, whose ratio 0.15043 sits below the M = 4 sphere ratio:
the standoff shrinks as Mach rises.
Verification
- Confirm standoff_ratio(8.0) returns 0.15043 within 1e-4 and
standoff_ratio(4.0) returns 0.17510 within 1e-4.
- Confirm standoff_ratio(8.0, "cylinder") returns 0.41522 within
1e-4 and standoff_ratio(4.0, "cylinder") returns 0.51683 within
1e-4.
- Confirm standoff_distance(8.0, 0.5) returns 0.07521 m within 1e-4
and that distance at R = 1.0 m is exactly twice the distance at
R = 0.5 m (linear scaling identity).
- Confirm the ratio is monotone decreasing: ratio at M = 6 below the
ratio at M = 4 for both bodies, and the cylinder ratio exceeds the
sphere ratio at M = 4 and M = 8.
- Confirm every non-physical input raises ValueError: mach 1.0,
mach 0.8, radius 0, negative radius, and the body string "wedge".
- Confirm standoff_report returns exactly the keys ratio, distance,
sphere_cylinder_order and decreasing_with_mach, and that two runs
at the same point agree (determinism).
- Run the contract test offline: python3
scripts/test_bow_shock_standoff.py (deterministic).
Related leaves
- aerodynamics/high-speed/hypersonic-flow: the modified Newtonian
force coefficients of the blunt body behind the shock.
- aerodynamics/high-speed/oblique-shock: attached shock turning on
sharp-nosed bodies, the regime where no detached standoff exists.
- aerodynamics/high-speed/normal-shock: the stagnation streamline
jump relations across the detached shock.
- aerodynamics/high-speed/aerodynamic-heating: stagnation-point
convective flux with nose-radius scaling, the companion trade to
the shock-layer thickness.
- aerodynamics/high-speed/flat-plate-skin-friction-heating: the
thin-boundary-layer alternative on slender surfaces.
Pitfalls
- Quoting a ratio at Mach near 1: the exponential form grows without
bound as M approaches 1 and the correlations are only documented
above about Mach 1.5, so a low-Mach ratio needs the validity floor
caveat (step 5 of the workflow).
- Feeding Mach at or below 1: no detached shock exists there, the
correlation is not defined, and the functions raise ValueError
rather than return a meaningless number.
- Using the sphere correlation for a two-dimensional leading edge or
the cylinder correlation for an axisymmetric nose: the cylinder
coefficient 0.386 is about 2.7 times the sphere coefficient 0.143,
so swapping the body inflates or deflates the shock layer by that
factor.
- Reporting the ratio as a distance: Delta / R is geometry-free and
dimensionless; the physical distance is the ratio times the nose
radius, so a 0.15043 ratio at R = 0.5 m is 0.07521 m, not
0.15043 m.
- Extending the gamma = 1.4 calibration: both exponentials use the
gamma = 1.4 constants, so applying them to a real-gas flow with a
different effective gamma needs a re-derived coefficient.
- Scaling the wrong radius: the distance is linear in the nose
radius, so halving the radius halves the standoff; keep the ratio
and the radius together in the report.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_bow_shock_standoff.py
The test covers the four worked-example anchors (sphere and cylinder
ratios at M = 8 and M = 4 within 1e-4 of the module outputs), the
standoff distance conversion at R = 0.5 m, the linear scaling
identity in radius, the monotone decrease of the ratio with Mach for
both bodies, the cylinder-over-sphere ordering at M = 4 and M = 8,
the exact standoff_report key set and flag values, determinism, and
ValueError rejection of Mach at or below 1, non-positive radii and
unknown body strings.
Compliance
- Standards referenced, not reproduced: NACA TR-824 is the
compressible-flow reference framework; the Billig-form standoff
correlations above are standard engineering methodology,
summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: bow-shock-standoff3description: Use when you must estimate the detached bow-shock standoff distance ahead of a blunt nose: compute the standoff ratio Delta over R with the classical Billig-form correlations for a sphere nose and a circular cylinder leading edge at gamma 1.4, convert the ratio to a physical standoff distance for a given nose radius, and report the trend checks that the standoff decreases with Mach and that the cylinder standoff exceeds the sphere standoff at the same Mach. Produces the standoff ratio, the standoff distance and the sanity flags that gate blunt-body nose-radius trades and shock-layer thickness estimates. Trigger: bow shock standoff, billig correlation, stagnation streamline, shock layer thickness, detached shock distance, blunt body nose radius.4license: Apache-2.05---67# Bow Shock Standoff Distance (aerodynamics/high-speed/bow-shock-standoff)89Use when the task is estimating the detached bow-shock standoff distance10on the stagnation streamline ahead of a blunt nose in supersonic and11hypersonic flow: the shock stands ahead of a sphere nose or a circular12cylinder leading edge rather than attaching to a sharp point, and the13shock-layer thickness between the nose and the shock sets the local14environment for pressure and heating trades. This leaf implements the15classical Billig-form standoff correlations for gamma = 1.4 in pure16Python, stdlib only: the sphere form for an axisymmetric nose and the17cylinder form for a two-dimensional leading edge, both as an exponential18of 1 over the freestream Mach squared. It pairs with19aerodynamics/high-speed/hypersonic-flow for the force coefficients of20the blunt body behind the shock and with21aerodynamics/high-speed/aerodynamic-heating, whose stagnation-point flux22scales with the same nose radius. The method is the standard engineering23estimate for the shock-layer geometry, not a CFD replacement.2425## Domain quick reference2627- Sphere standoff ratio (axisymmetric nose): Delta / R = 0.143 *28 exp(3.24 / M^2), with M the freestream Mach number, R the nose29 radius and Delta the standoff distance of the detached shock ahead30 of the stagnation point.31- Cylinder standoff ratio (two-dimensional leading edge): Delta / R =32 0.386 * exp(4.67 / M^2). The coefficient is about 2.7 times the33 sphere coefficient, so at the same Mach the cylinder shock layer is34 the thicker one.35- Physical distance: Delta = (Delta / R) * R, so the standoff distance36 scales linearly with the nose radius.37- Trends: the ratio is monotone decreasing in Mach (more compression38 pushes the shock closer at higher Mach) and the cylinder ratio39 exceeds the sphere ratio at every Mach above 1.40- High-Mach asymptote: as M grows, each ratio approaches its leading41 coefficient from above, exp(3.24 / M^2) and exp(4.67 / M^2) both42 tending to 1.43- Validity floor: the correlations are documented for freestream Mach44 above about 1.5; the ratio grows without bound as M approaches 1,45 where no detached bow shock exists.46- Units are SI throughout: M dimensionless, R and Delta in meters.47- NACA TR-824 frames the compressible-flow context; the standoff48 relations above are standard engineering methodology, summary-only.4950## Workflow51521. Fix the flight point and the nose geometry: record the freestream53 Mach number M and the nose radius R in meters and pick the body,54 sphere for an axisymmetric nose or cylinder for a two-dimensional55 leading edge. Feed a Mach at or below 1 or a non-positive radius56 and the functions reject the point with ValueError, because no57 detached shock layer exists at or below Mach 1. (flight-point step)582. Evaluate the standoff ratio on the stagnation streamline with59 standoff_ratio(mach, body), applying the Billig-form correlation:60 0.143 * exp(3.24 / M^2) for the sphere or 0.386 * exp(4.67 / M^2)61 for the cylinder. The output is the geometry-free ratio Delta / R.62 (ratio-evaluation step)633. Convert the ratio to the physical standoff distance with64 standoff_distance(mach, radius, body), Delta = (Delta / R) * R in65 meters; the distance scales linearly with the nose radius.66 (distance-conversion step)674. Run the trend checks with standoff_report(mach, radius, body):68 decreasing_with_mach compares the ratio at M against the ratio at69 1.1 * M and sphere_cylinder_order confirms that the cylinder ratio70 exceeds the sphere ratio at this Mach. Both sanity flags gate the71 blunt-body nose-radius trade and the shock-layer thickness72 estimate. (trend-check step)735. Respect the validity floor: the correlations are documented for74 freestream Mach above about 1.5, so a ratio computed below the75 floor carries the floor caveat in the report and is never quoted76 as a converged shock-layer size. (validity-floor step)776. Confirm the deterministic behavior and the non-physical input78 rejection with the contract test scripts/test_bow_shock_standoff.py.79 (contract-test step)8081## Worked example8283A reentry or cruise nose at M = 8 and a blunt leading edge at M = 4:8485- Sphere at M = 8: standoff_ratio(8.0) = 0.143 * exp(3.24 / 64) =86 0.15043; with R = 0.5 m, standoff_distance(8.0, 0.5) = 0.07521 m.87- Sphere at M = 4: standoff_ratio(4.0) = 0.143 * exp(3.24 / 16) =88 0.17510; with R = 0.5 m the standoff distance is 0.08755 m.89- Cylinder at M = 8: standoff_ratio(8.0, "cylinder") = 0.386 *90 exp(4.67 / 64) = 0.41522; with R = 0.5 m the standoff distance is91 0.20761 m.92- Cylinder at M = 4: standoff_ratio(4.0, "cylinder") = 0.386 *93 exp(4.67 / 16) = 0.51683; with R = 0.5 m the standoff distance is94 0.25841 m.95- Trend checks at M = 4, R = 0.5 m, sphere:96 standoff_report(4.0, 0.5) returns ratio 0.17510, distance97 0.08755 m, sphere_cylinder_order True (cylinder ratio 0.5168398 exceeds the sphere ratio 0.17510) and decreasing_with_mach True99 (the ratio at 4.4 is below the ratio at 4.0). The same flags hold100 at M = 8, whose ratio 0.15043 sits below the M = 4 sphere ratio:101 the standoff shrinks as Mach rises.102103## Verification104105- Confirm standoff_ratio(8.0) returns 0.15043 within 1e-4 and106 standoff_ratio(4.0) returns 0.17510 within 1e-4.107- Confirm standoff_ratio(8.0, "cylinder") returns 0.41522 within108 1e-4 and standoff_ratio(4.0, "cylinder") returns 0.51683 within109 1e-4.110- Confirm standoff_distance(8.0, 0.5) returns 0.07521 m within 1e-4111 and that distance at R = 1.0 m is exactly twice the distance at112 R = 0.5 m (linear scaling identity).113- Confirm the ratio is monotone decreasing: ratio at M = 6 below the114 ratio at M = 4 for both bodies, and the cylinder ratio exceeds the115 sphere ratio at M = 4 and M = 8.116- Confirm every non-physical input raises ValueError: mach 1.0,117 mach 0.8, radius 0, negative radius, and the body string "wedge".118- Confirm standoff_report returns exactly the keys ratio, distance,119 sphere_cylinder_order and decreasing_with_mach, and that two runs120 at the same point agree (determinism).121- Run the contract test offline: python3122 scripts/test_bow_shock_standoff.py (deterministic).123124## Related leaves125126- aerodynamics/high-speed/hypersonic-flow: the modified Newtonian127 force coefficients of the blunt body behind the shock.128- aerodynamics/high-speed/oblique-shock: attached shock turning on129 sharp-nosed bodies, the regime where no detached standoff exists.130- aerodynamics/high-speed/normal-shock: the stagnation streamline131 jump relations across the detached shock.132- aerodynamics/high-speed/aerodynamic-heating: stagnation-point133 convective flux with nose-radius scaling, the companion trade to134 the shock-layer thickness.135- aerodynamics/high-speed/flat-plate-skin-friction-heating: the136 thin-boundary-layer alternative on slender surfaces.137138## Pitfalls139140- Quoting a ratio at Mach near 1: the exponential form grows without141 bound as M approaches 1 and the correlations are only documented142 above about Mach 1.5, so a low-Mach ratio needs the validity floor143 caveat (step 5 of the workflow).144- Feeding Mach at or below 1: no detached shock exists there, the145 correlation is not defined, and the functions raise ValueError146 rather than return a meaningless number.147- Using the sphere correlation for a two-dimensional leading edge or148 the cylinder correlation for an axisymmetric nose: the cylinder149 coefficient 0.386 is about 2.7 times the sphere coefficient 0.143,150 so swapping the body inflates or deflates the shock layer by that151 factor.152- Reporting the ratio as a distance: Delta / R is geometry-free and153 dimensionless; the physical distance is the ratio times the nose154 radius, so a 0.15043 ratio at R = 0.5 m is 0.07521 m, not155 0.15043 m.156- Extending the gamma = 1.4 calibration: both exponentials use the157 gamma = 1.4 constants, so applying them to a real-gas flow with a158 different effective gamma needs a re-derived coefficient.159- Scaling the wrong radius: the distance is linear in the nose160 radius, so halving the radius halves the standoff; keep the ratio161 and the radius together in the report.162163## Behavior contract (gate 3)164165Run the deterministic contract test (stdlib unittest, offline):166167 python3 scripts/test_bow_shock_standoff.py168169The test covers the four worked-example anchors (sphere and cylinder170ratios at M = 8 and M = 4 within 1e-4 of the module outputs), the171standoff distance conversion at R = 0.5 m, the linear scaling172identity in radius, the monotone decrease of the ratio with Mach for173both bodies, the cylinder-over-sphere ordering at M = 4 and M = 8,174the exact standoff_report key set and flag values, determinism, and175ValueError rejection of Mach at or below 1, non-positive radii and176unknown body strings.177178## Compliance179180- Standards referenced, not reproduced: NACA TR-824 is the181 compressible-flow reference framework; the Billig-form standoff182 correlations above are standard engineering methodology,183 summary-only per standards-map.yaml.184- compliance: STANDARDS-REF, gated: false.