Vapor Power Cycles (Rankine) | Thermodynamics with Python | Skill-Lync Resources

50% OFF - Ends Soon!

Lesson 7 of 13 35 min

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

See All Tools
ProcessComponentWhat happensIdeal assumption
1 → 2PumpCompress saturated liquid to boiler pressureIsentropic
2 → 3BoilerAdd heat; produce (super)heated vaporConstant pressure
3 → 4TurbineExpand vapor, produce workIsentropic
4 → 1CondenserReject heat; condense to saturated liquidConstant 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

See Program Details
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

See His Journey

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%.

🎯 3,000+ Engineers Placed
Sponsored
Harshal Sukenkar

Harshal

Fiat Chrysler

Abhishek

Abhishek

TATA ELXSI

Srinithin

Srinithin

Xitadel

Ranjith

Ranjith

Core Automotive

Gaurav Jadhav

Gaurav

Automotive Company

Bino K Biju

Bino

Design Firm

Aseem Shrivastava

Aseem

EV Company

Puneet

Puneet

Automotive Company

Vishal Kumar

Vishal

EV Startup

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

ChangeEffect on efficiencySide effect
↑ Boiler pressureIncreases $\eta$Lowers exit quality (more moisture)
↑ Superheat temperatureIncreases $\eta$Raises exit quality (good)
↓ Condenser pressureIncreases $\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.

3,000+ Engineers Placed in Top Companies
Career Growth

3,000+ Engineers Placed in Top Companies

Join the ranks of successful engineers at Bosch, Tata, L&T, and 500+ hiring partners.