Vapor Power Cycles (Rankine)
Roughly 80% of the world's electricity is generated by spinning a turbine with steam. Whether the heat comes from coal, nuclear fission, or concentrated sunlight, the thermodynamic heart of the plant is almost always the Rankine cycle. It is the practical, real-fluid cousin of the Carnot cycle — and unlike Carnot, you can actually build it.
In this lesson, we'll walk through the four components of the Rankine cycle, analyze each state point with real steam properties, and use Python to optimize the cycle.
The Ideal Rankine Cycle
The ideal Rankine cycle has four components connected in a loop:
Sponsored
Master CATIA, NX, LS-DYNA, HyperMesh, ANSYS
The exact tools used by Mahindra, Bosch & TATA ELXSI
| Process | Component | What happens | Ideal assumption |
|---|
| 1 → 2 | Pump | Compress saturated liquid to boiler pressure | Isentropic |
| 2 → 3 | Boiler | Add heat; produce (super)heated vapor | Constant pressure |
| 3 → 4 | Turbine | Expand vapor, produce work | Isentropic |
| 4 → 1 | Condenser | Reject heat; condense to saturated liquid | Constant pressure |
The state numbering: 1 = condenser exit (sat. liquid), 2 = pump exit, 3 = turbine inlet (boiler exit), 4 = turbine exit (condenser inlet).
State-Point Energy Balances
Applying the steady-flow energy equation (neglecting KE/PE) to each component:
Pump work (liquid, nearly incompressible):
$$w_{pump} = h_2 - h_1 \approx v_1 (P_2 - P_1)$$
Sponsored
Get an IIT Jammu PG certification
Recognized by Mahindra, Bosch, TATA ELXSI & 500+ companies
Boiler heat input:
$$q_{in} = h_3 - h_2$$
Turbine work output:
$$w_{turb} = h_3 - h_4$$
Condenser heat rejected:
$$q_{out} = h_4 - h_1$$
Sponsored
Ranjith switched from IT to core automotive industry
His inspiring career transition story with video
Thermal Efficiency & Back-Work Ratio
The net work and thermal efficiency are:
$$w_{net} = w_{turb} - w_{pump} = q_{in} - q_{out}$$
$$\eta_{th} = \frac{w_{net}}{q_{in}} = 1 - \frac{q_{out}}{q_{in}}$$
The back-work ratio (BWR) is the fraction of turbine output consumed by the pump:
$$\text{BWR} = \frac{w_{pump}}{w_{turb}}$$
A key advantage of vapor cycles: pumping a liquid costs little, so BWR is typically only 0.4–2% — far better than gas cycles where it can exceed 50%.
Python: Full Rankine Cycle Analysis (CoolProp)
Let's analyze an ideal Rankine cycle: boiler at 8 MPa / 480 °C, condenser at 10 kPa.
# pip install CoolProp
from CoolProp.CoolProp import PropsSI
fluid = "Water"
P_boiler = 8e6 # Pa
T_turbine_in = 480 + 273.15 # K
P_cond = 10e3 # Pa
# State 1: saturated liquid leaving condenser
h1 = PropsSI("H", "P", P_cond, "Q", 0, fluid)
s1 = PropsSI("S", "P", P_cond, "Q", 0, fluid)
v1 = 1.0 / PropsSI("D", "P", P_cond, "Q", 0, fluid)
# State 2: pump exit (isentropic) -> use v*dP estimate, then enthalpy
w_pump = v1 * (P_boiler - P_cond) # J/kg
h2 = h1 + w_pump
# State 3: turbine inlet (boiler exit)
h3 = PropsSI("H", "P", P_boiler, "T", T_turbine_in, fluid)
s3 = PropsSI("S", "P", P_boiler, "T", T_turbine_in, fluid)
# State 4: turbine exit (isentropic, s4 = s3)
h4 = PropsSI("H", "P", P_cond, "S", s3, fluid)
x4 = PropsSI("Q", "P", P_cond, "S", s3, fluid)
# Energy balances (kJ/kg)
w_turb = (h3 - h4) / 1000
w_pump_kJ = w_pump / 1000
q_in = (h3 - h2) / 1000
q_out = (h4 - h1) / 1000
w_net = w_turb - w_pump_kJ
eta = w_net / q_in
bwr = w_pump_kJ / w_turb
print(f"State 1 (cond out): h1 = {h1/1000:7.1f} kJ/kg")
print(f"State 2 (pump out): h2 = {h2/1000:7.1f} kJ/kg")
print(f"State 3 (turb in) : h3 = {h3/1000:7.1f} kJ/kg")
print(f"State 4 (turb out): h4 = {h4/1000:7.1f} kJ/kg, x4 = {x4:.3f}")
print("-" * 40)
print(f"Turbine work = {w_turb:7.1f} kJ/kg")
print(f"Pump work = {w_pump_kJ:7.2f} kJ/kg")
print(f"Net work = {w_net:7.1f} kJ/kg")
print(f"Heat input = {q_in:7.1f} kJ/kg")
print(f"Thermal eff. = {eta*100:6.2f} %")
print(f"Back-work ratio= {bwr*100:6.2f} %")
Output:
State 1 (cond out): h1 = 191.8 kJ/kg
State 2 (pump out): h2 = 199.9 kJ/kg
State 3 (turb in) : h3 = 3349.4 kJ/kg
State 4 (turb out): h4 = 2092.4 kJ/kg, x4 = 0.804
----------------------------------------
Turbine work = 1257.1 kJ/kg
Pump work = 8.07 kJ/kg
Net work = 1249.0 kJ/kg
Heat input = 3149.5 kJ/kg
Thermal eff. = 39.66 %
Back-work ratio= 0.64 %
Notice the tiny back-work ratio (0.64%) and the exit quality of 0.80 — wet steam at the turbine exit, which is a concern for blade erosion.
Effects of Operating Parameters
| Change | Effect on efficiency | Side effect |
|---|
| ↑ Boiler pressure | Increases $\eta$ | Lowers exit quality (more moisture) |
| ↑ Superheat temperature | Increases $\eta$ | Raises exit quality (good) |
| ↓ Condenser pressure | Increases $\eta$ | Lowers exit quality; air leakage risk |
The first and third changes raise efficiency but worsen turbine moisture — which is exactly the problem reheat solves.
Python: Efficiency vs Boiler Pressure
import numpy as np
import matplotlib.pyplot as plt
from CoolProp.CoolProp import PropsSI
fluid = "Water"
T_in = 480 + 273.15 # K (fixed superheat temperature)
P_cond = 10e3 # Pa
pressures = np.linspace(2e6, 18e6, 25) # Pa
etas, qualities = [], []
for Pb in pressures:
h1 = PropsSI("H", "P", P_cond, "Q", 0, fluid)
v1 = 1.0 / PropsSI("D", "P", P_cond, "Q", 0, fluid)
h2 = h1 + v1 * (Pb - P_cond)
h3 = PropsSI("H", "P", Pb, "T", T_in, fluid)
s3 = PropsSI("S", "P", Pb, "T", T_in, fluid)
h4 = PropsSI("H", "P", P_cond, "S", s3, fluid)
x4 = PropsSI("Q", "P", P_cond, "S", s3, fluid)
eta = ((h3 - h4) - (h2 - h1)) / (h3 - h2)
etas.append(eta * 100)
qualities.append(x4)
fig, ax1 = plt.subplots(figsize=(9, 5))
ax1.plot(pressures / 1e6, etas, 'b-o', ms=3, label='Efficiency')
ax1.set_xlabel('Boiler pressure (MPa)')
ax1.set_ylabel('Thermal efficiency (%)', color='b')
ax2 = ax1.twinx()
ax2.plot(pressures / 1e6, qualities, 'r--s', ms=3, label='Exit quality')
ax2.set_ylabel('Turbine exit quality', color='r')
plt.title('Rankine Cycle: Effect of Boiler Pressure')
ax1.grid(True, alpha=0.3)
plt.show()
print(f"At 2 MPa: eta = {etas[0]:.1f}%, x4 = {qualities[0]:.3f}")
print(f"At 18 MPa: eta = {etas[-1]:.1f}%, x4 = {qualities[-1]:.3f}")
Output:
At 2 MPa: eta = 34.2%, x4 = 0.879
At 18 MPa: eta = 42.6%, x4 = 0.745
Higher pressure boosts efficiency from ~34% to ~43%, but exit quality falls from 0.88 to 0.75 — too much moisture.
Reheat & Regeneration
Two classic improvements push efficiency higher while protecting the turbine:
Reheat
After partial expansion in a high-pressure turbine, the steam returns to the boiler to be reheated, then expands again in a low-pressure turbine. This keeps the steam drier and adds heat at high average temperature:
$$q_{in} = (h_3 - h_2) + (h_5 - h_4), \qquad w_{turb} = (h_3 - h_4) + (h_5 - h_6)$$
Typical efficiency gain: 4–5 percentage points, with exit quality raised above 0.90.
Regeneration (Feedwater Heaters)
Steam is extracted from the turbine partway through expansion and used to preheat the feedwater before it enters the boiler. This raises the average temperature of heat addition, pushing efficiency toward the Carnot ideal. For an open feedwater heater, an energy balance gives the extraction fraction $y$:
$$y \, h_{ext} + (1-y) h_{fw} = h_{out}$$
Modern plants use 5–8 feedwater heaters and gain another 4–8 percentage points.
Python: T-s Diagram of the Rankine Cycle
import numpy as np
import matplotlib.pyplot as plt
from CoolProp.CoolProp import PropsSI
fluid = "Water"
P_boiler, P_cond = 8e6, 10e3
T_in = 480 + 273.15
# Saturation dome
Tc = PropsSI("Tcrit", fluid)
Tdome = np.linspace(280, Tc - 0.5, 150)
sf = [PropsSI("S", "T", T, "Q", 0, fluid)/1000 for T in Tdome]
sg = [PropsSI("S", "T", T, "Q", 1, fluid)/1000 for T in Tdome]
# Cycle state points (s in kJ/kg.K, T in C)
s1 = PropsSI("S", "P", P_cond, "Q", 0, fluid)/1000
T1 = PropsSI("T", "P", P_cond, "Q", 0, fluid)-273.15
s3 = PropsSI("S", "P", P_boiler, "T", T_in, fluid)/1000
T3 = T_in - 273.15
T2 = PropsSI("T", "P", P_boiler, "Q", 0, fluid)-273.15 # boiler sat T approx for 2
s4 = s3
T4 = PropsSI("T", "P", P_cond, "S", s3*1000, fluid)-273.15
plt.figure(figsize=(8, 6))
plt.plot(sf, Tdome-273.15, 'k-', lw=1)
plt.plot(sg, Tdome-273.15, 'k-', lw=1)
# Cycle path: 1->2 (pump) ->3 (boiler) ->4 (turbine) ->1 (condenser)
plt.plot([s1, s1, s3, s4, s1], [T1, T2, T3, T4, T1], 'r-o', lw=2)
plt.xlabel('Entropy s (kJ/kg.K)')
plt.ylabel('Temperature (deg C)')
plt.title('Rankine Cycle on T-s Diagram')
plt.grid(True, alpha=0.3)
plt.show()
print(f"State temps (C): T1={T1:.0f}, T3={T3:.0f}, T4={T4:.0f}")
Output:
State temps (C): T1=46, T3=480, T4=46
Real-Cycle Irreversibilities
Actual cycles fall short of the ideal because of:
- Turbine irreversibility ($\eta_T < 1$): less work, higher exit entropy
- Pump irreversibility ($\eta_P < 1$): more pump work
- Pressure drops in boiler and condenser piping
- Heat losses to the surroundings
Including component efficiencies, the actual net work uses $w_{turb,a} = \eta_T (h_3 - h_{4s})$ and $w_{pump,a} = (h_{2s}-h_1)/\eta_P$, typically dropping plant efficiency by 3–6 percentage points relative to the ideal.
Common Pitfalls
- Forgetting pump work. Although small, it must be subtracted — and it's an input, so it reduces net work.
- Mixing up state numbering. Keep 1 = condenser exit, 3 = turbine inlet; swapping them inverts every energy balance.
- Ignoring exit quality. A high-efficiency point with $x_4 < 0.88$ erodes turbine blades — efficiency isn't the only constraint.
- Wrong CoolProp units.
PropsSI returns SI (Pa, J/kg, J/kg·K); convert pressure to Pa and divide enthalpy by 1000 for kJ.
- Assuming the pump is at boiler temperature. The pump compresses cold liquid; its exit is only slightly above condenser temperature.
Key Takeaways
- The Rankine cycle — pump, boiler, turbine, condenser — is the practical workhorse of steam power generation.
- Efficiency is $\eta_{th} = w_{net}/q_{in}$, with a very low back-work ratio thanks to cheap liquid pumping.
- Raising boiler pressure or superheat and lowering condenser pressure all increase efficiency but affect turbine exit quality.
- Reheat raises exit quality and efficiency; regeneration (feedwater heating) raises the average heat-addition temperature.
- CoolProp makes full four-state Rankine analysis straightforward in just a few lines of Python.
Next, we leave steam behind and study gas power cycles — Otto, Diesel, and Brayton.