Compressible Flow & Aerodynamics
Level: 5 — Mastery (cross-domain: derivation, computation, coding) Time limit: 3 hours Total marks: 100
Use and for air unless otherwise stated. State all assumptions.
Question 1 — De Laval Nozzle Design & Shock Analysis (40 marks)
A converging–diverging nozzle is fed from a large reservoir at , . The throat area is and the exit area is . The nozzle exhausts into a back-pressure environment.
(a) Derive the area–velocity relation starting from the continuity, momentum (Euler), and isentropic sound-speed relations. Explain physically why a throat () is required to accelerate from subsonic to supersonic. (8 marks)
(b) Assuming isentropic, choked flow throughout, compute the supersonic design exit Mach number corresponding to . Then find the exit pressure , exit temperature , and the mass flow rate . (10 marks)
(c) Now suppose the back pressure is raised so that a normal shock stands in the diverging section at an area . Using the Rankine–Hugoniot relations, compute the Mach number just upstream of the shock, the downstream Mach number , the static pressure ratio , and the stagnation-pressure loss ratio across the shock. (14 marks)
(d) After the shock, the flow is subsonic and continues to decelerate isentropically to the exit. Explain qualitatively (with reference to and the new effective sonic throat ) how you would find the exit pressure, and state whether the nozzle is over- or under-expanded relative to part (b)'s design. (8 marks)
Question 2 — Oblique Shock / Expansion Solver (35 marks)
A supersonic flow at , , approaches a symmetric diamond (double-wedge) airfoil with a half-angle of at zero angle of attack.
(a) On the compression (leading) surface an oblique shock forms. Using the –– relation, determine the weak shock-wave angle for a flow deflection . Then find and behind the shock. (12 marks)
(b) At the shoulder (mid-chord) the flow turns by through a Prandtl–Meyer expansion fan. Using the Prandtl–Meyer function , find the Mach number and pressure on the rear (expansion) surface. (10 marks)
(c) Write a self-contained Python function solve_oblique(M1, theta_deg, gamma=1.4) that returns the weak-shock (in degrees) by numerically solving the –– relation, and a function prandtl_meyer(M, gamma=1.4) returning in degrees. Explain how your root-finder selects the weak rather than the strong solution. (8 marks)
(d) Explain, using your pressure results, why this diamond airfoil at zero incidence still produces wave drag but zero lift. Sketch the pressure distribution schematically. (5 marks)
Question 3 — Thin Airfoil & Finite Wing Theory (25 marks)
(a) State the thin-airfoil-theory result for lift per unit span of a cambered airfoil and show that for a symmetric airfoil the lift coefficient is (with in radians). Identify the zero-lift angle for a cambered plate. (8 marks)
(b) A finite elliptical wing has aspect ratio and operates at a lift coefficient . Compute the induced-drag coefficient . Then determine the effective 3-D lift-curve slope given the 2-D slope , using (elliptical, ). (9 marks)
(c) The same wing is re-designed with at the same . Compute the new and the percentage reduction in induced drag. Discuss the trade-off (structural weight, wave drag) that limits arbitrarily large aspect ratios, and relate the critical Mach number concept to why high-AR wings are avoided on transonic fighters. (8 marks)
Answer keyMark scheme & solutions
Question 1
(a) Area–velocity relation derivation (8 marks)
Continuity (steady, 1-D): . Log-differentiate: (2 marks)
Euler (momentum), inviscid, no body force: . (1 mark)
Isentropic sound speed: , so (2 marks)
Substitute (2) into (1): (2 marks)
Physical interpretation: For , : area must decrease to accelerate (). For , : area must increase to accelerate. To pass from subsonic to supersonic, must change sign, which requires at — i.e. a throat where sonic conditions occur. (1 mark)
(b) Supersonic design exit conditions (10 marks)
Area–Mach relation:
Solving the supersonic root gives . (4 marks)
Isentropic ratios at :
- (2 marks)
- (2 marks)
Mass flow (choked): . (2 marks)
(c) Normal shock at (14 marks)
Before the shock the flow is supersonic with . Supersonic root: (4 marks)
Rankine–Hugoniot downstream Mach: (3 marks)
Static pressure ratio: (3 marks)
Stagnation-pressure ratio (total-pressure loss): With : first bracket ; second bracket ; product ...
Correcting: — proper formula gives at (standard normal-shock table value). (4 marks)
Accept table value .
(d) Post-shock exit & expansion state (8 marks)
Across the shock, stagnation pressure drops but stagnation temperature is conserved; the entropy rise means the effective sonic area increases: . (3 marks)
Downstream, subsonic isentropic flow uses . The subsonic root gives , and . With : . (3 marks)
Compared with the design exit pressure of 64.4 kPa, the actual exit pressure is far higher → the flow has been compressed by the internal shock; relative to design (supersonic) operation the nozzle is over-expanded (back pressure too high for full supersonic expansion, forcing an internal shock). (2 marks)
Question 2
(a) Oblique shock, , (12 marks)
–– relation: Solving the weak root gives . (4 marks)
Normal component upstream: . (2 marks)
Downstream normal Mach: (3 marks)
Pressure: . (3 marks)
(b) Prandtl–Meyer expansion of (10 marks)
. (3 marks)
After turning : . Inverting gives . (3 marks)
Isentropic (stagnation pressure constant through expansion; from behind the shock): . (4 marks)
(c) Python solver (8 marks)
import numpy as np
from scipy.optimize import brentq
def prandtl_meyer(M, gamma=1.4):
if M < 1: raise ValueError("M must be >= 1")
g = gamma
term = np.sqrt((g+1)/(g-1))
nu = (term*np.arctan(np.sqrt((g-1)/(g+1)*(M**2-1)))
- np.arctan(np.sqrt(M**2-1)))
return np.degrees(nu)
def theta_beta_M(beta_rad, M1, theta_rad, gamma=1.4):
b, g = beta_rad, gamma
num = M1**2*np.sin(b)**2 - 1
den = M1**2*(g+np.cos(2*b)) + 2
return 2/np.tan(b)*num/den - np.tan(theta_rad)
def solve_oblique(M1, theta_deg, gamma=1.4):
th = np.radians(theta_deg)
mu = np.arcsin(1/M1) # Mach angle: lower bound
# weak solution lies between Mach angle and the theta_max angle (<~ 65 deg).
# Bracket just above mu up to ~65 deg and take the FIRST root -> weak.
beta = brentq(theta_beta_M, mu+1e-4, np.radians(65),
args=(M1, th, gamma))
return np.degrees(beta)
# solve_oblique(3.0, 10) -> ~27.4 ; prandtl_meyer(2.5) -> ~39.1*(6 mar