Ideal Rankine Cycle with feedwater heater calculations#

How to calculate the thernal efficiency of an Ideal Rankine Cycle with feedwater heaters using Python and PYroMat

The problem#

Consider a regenerative cycle using steam as the working fluid. Steam leaves the boiler and enters the turbine at 4 MPa, \(\text{400}^\circ\text{C}\). After expansion to 400 kPa, some of the steam is extracted from the turbine to heat the feedwater in an open FWH. The pressure in the FWH is 400 kPa, and the water leaving it is saturated liquid at 400 kPa. The steam not extracted expands to 10 kPa. Determine the cycle efficiency.

../../_images/ideal-rankine-cycle-regen-problem-image.png

Looking at the mass flow of steam entering and exiting the turbine:

\[y = \dot{m}_6/\dot{m}_5\]

and thus $dot{m}_6$ can be written as a function of \(\dot{m}_5\):

\[\dot{m}_6 = y\dot{m}_5\]

Similarly \(\dot{m}_7\) can be written as:

\[\dot{m}_7=(1-y)\dot{m}_5\]

and

\[\dot{m}_7=(1-y)\dot{m}_5=\dot{m}_1=\dot{m}_2\]

Initiate PYroMat#

import pyromat as pm
import numpy as np

pm.config["unit_pressure"] = "kPa"
pm.config["def_p"] = 100

mp_water = pm.get("mp.H2O") # <-- for multi-phase water properties

To solve this problem we consider a control surface around the pump, the boiler, the turbine, and the condenser.

The low pressure pump#

First, let us consider the low pressure pump:

p1 = 10 # <-- given
p2 = 400 # <-- given

v1 = 1/mp_water.ds(p=p1)[0]

w_pump1 = v1*(p2-p1)
h2 = h1+w_pump1
print(f"Work required by pump 1: {round(float(w_pump1),1)} kJ/kg")
Work required by pump 1: 0.4 kJ/kg

The turbine#

Next, let’s consider the turbine:

p5 = 4000 # <-- given
T5 = 400+273.15 # K <-- given
h5 = mp_water.h(p=p5, T=T5)
s5 = mp_water.s(p=p5, T=T5)

s6 =s5
p6 = 400 # <-- given
T6, x6 = mp_water.T_s(s=s6, p=p6, quality=True)
h6 = mp_water.h(x=x6, p=p6)

print(f"Quality of bled steam: {round(float(x6),4)}")
Quality of bled steam: 0.9757

The feedwater heater#

Now, let’s consider the feedwater heater:

p3 = 400 # <-- given
h3 = mp_water.hs(p=p3)[0]

The energy conservation equation for the FWH is:

\[y(h_6)+(1-y)h_2 = h_3\]

This can be re-arranged to solve \(y\) explicitly:

\[y = \frac{h_2 - h_3}{h_2 - h_6}\]
y = (h2-h3)/(h2-h6)
print(f"y = {round(float(y),4)}")
y = 0.1654

Work done by turbine#

We can now calculate the work extracted by the turbine:

p7 = p1
s7 = s5
T7, x7 = mp_water.T_s(s=s7, p=p7, quality=True)
h7 = mp_water.h(x=x7, p=p7)
w_t = h5 - y*h6 - (1-y)*h7
print(f"Work generated by turbine: {round(float(w_t),1)} kJ/kg")
Work generated by turbine: 980.4 kJ/kg

The high pressure pump#

Next, let’s consider the high pressure pump:

p4 = 4000 # <-- given
v3 = 1/mp_water.ds(p=p3)[0]
w_pump2 = v3*(p4-p3)
print(f"Work required by pump 2: {round(float(w_pump2),1)} kJ/kg")
Work required by pump 2: 3.9 kJ/kg

The boiler#

Finally, we can consider the boiler:

h4 = h3 + w_pump2
q_H = h5-h4
print(f"Heat input by boiler: {round(float(q_H),1)} kJ/kg")
Heat input by boiler: 2605.9 kJ/kg

Thermal efficiency#

We can now calculate the thermal efficiency with

\[\eta_{th}=\frac{w_{net}}{q_H}\]
eta_th = (w_t - w_pump1*(1-y) - w_pump2)/q_H*100
print(f"Thermal efficiency is: {round(float(eta_th),2)}%")
Thermal efficiency is: 37.46%