How to stop sonic flow decelerating on a suction face
Any blade operating at a positive angle of attack will accelerate its flow over the suction face, which eventually will slow down. When that flow has been above Mach 1.0 at the leading edge of the blade, then at some point it will slow down to being subsonic, and a normal shockwave will form.
To avoid the formation of that shockwave, it’s desirable to accelerate the flow at the trailing edge, something which can be done by what appears to be a relatively simple method, however, a significant devil is definitely in the details.
Adding Energy at the Trailing Edge
Energy needs to be imparted to the trailing edge by some means, and this can be done by adding momentum, such as an active flow injection, which is rather complex to engineer on a rotating device; alternatively, it can be done by more passive means, like introducing vortex structures to promote a directed acceleration of the local flow.
The industry has known how to do this in principle since 1934, something which was rediscovered in 1974 and first written about in English words in 1978. We know of this method by a variety of names, all of them describing a simple vortex generator:
- Wicker bill
- Gurney Flap
- Gurney Tab
- Lift Enhancement Tab
- MiTEs
- etc.
Each of these devices establishes a transverse vortex structure of two vortices which alter the flow condition at the trailing edge of the foil. They also share common characteristic outcomes on performance:
- They always increase lift
- They increase drag at low angles of attack
- They are adverse to Lift/Drag ratios at low angles of attack
- They can improve Lift/Drag ratios at high angles of attack
Trailing edge enhancements are generally considered to be low speed, low angle devices, with the exception of a closely related device known as the divergent trailing edge, or DTE. DTEs are found on the MD-11 aircraft wing, and they slightly delay the onset of drag divergence of the airfoil section.
On the surface of it, adding a trailing edge modification to a (prop/fan)blade would appear to be a bad idea, as propulsion blades are invariably rotating at very high speeds, they have sonic flow conditions, and they operate normally at low angles of attack because efficiency is dependent on maximum Lift/Drag being achieved. And that would be the case, except for the following equations that have been gathering dust for over a century (apart from their application in a number of niche engineering disciplines).
We’ve shown it to be possible to alter the flow on a blade and achieve significant, beneficial changes in lift and drag on a blade.
The missing math
“Don’t let the flow decelerate below Mach 1.0”
And this is what we do.
When flow velocity is greater than Mach 1.0 across the entire area of the suction face, no compression will occur, and no normal shockwave will form.
Yes, oblique shock structures can be found at the leading edge, and there’s interesting stuff going on at the trailing edge, but these turn out to be relatively straight forward.
When a “normal shockwave” is removed, what then happens? Well, see image below:
What is visible here is that the left engine has been modified with a deltaBurn modification, whereas the right engine is in standard condition. Of note is that the left engine was due to have modules retired; fuel flow for equal thrust was 5% higher than the right engine, and EGT was 22 C higher in the range 600-750C.
The image below is a screen capture of a continuous video of this flight.

The rest of this story is that removal of shockwaves reduces vibration. In the case above, the engine was showing rather high vibration at 4.5 units. Once modified, the observed vibration droped by ~50%. This is not an aberration, it simply is an effect that occurs on propellers, helicopter rotors, and fan blades when modified with our STCs.
velocity changes


In Python:
def pm_nu(M, gamma=1.4):
if M < 1: raise ValueError(“M must be ≥ 1 for Prandtl–Meyer.”)
a = math.sqrt((gamma+1)/(gamma-1))
t = math.sqrt((gamma-1)/(gamma+1) * (MM-1)) A = math.sqrt(MM – 1)
return a*math.atan(t) – math.atan(A)
def dnu_dM(M, gamma=1.4):
A = math.sqrt(M*M – 1)
T = math.sqrt((gamma-1)/(gamma+1) * (M*M-1))
term1 = math.sqrt((gamma+1)/(gamma-1)) * ((gamma-1)/(gamma+1)) * (M/T) / (1+TT) term2 = (M/A) / (1 + AA)
return term1 – term2
def mach_after_expansion(M0, theta, gamma=1.4, iters=12, tol=1e-10):
target = pm_nu(M0, gamma) + theta
# Good initial guess (small-angle linearization)
M = max(1.0001, M0 + theta / max(dnu_dM(M0, gamma), 1e-8))
for _ in range(iters):
f = pm_nu(M, gamma) – target
df = dnu_dM(M, gamma)
step = f/df
M -= step
if abs(step) < tol: break
return M
-oOo-
Back to:
Further reading: