For faster services, inquiry about  new assignments submission or  follow ups on your assignments please text us/call us on +1 (251) 265-5102

WhatsApp Widget

General rocket propulsion description

1 Introduction
1.1 General rocket propulsion description
This topic will focus on liquid-fuelled chemical rocket engines for space access. Other types such
as electrical engines won’t be addressed. This technology is the main candidate considered right
now for the future of space access for many reasons: safety, reusability, reliability, performance,
etc.
However the general principle remains the same. In what follows, we will address both propulsion and thermodynamic aspects of this technology. Rockets are an integrated system: the vehicle’s propulsion requirements constrain choices of the propulsion system, and the propulsion
system places constraints on the vehicle design. In a rocket propelled vehicle, a mass, carried on
the vehicle, is accelerated and ejected at the back of the vehicle to produce thrust and increase or
maintain the kinetic energy of the vehicle.
Unlike other atmospheric propulsion systems, such as turbojets or ramjets, rocket powered vehicles carry both the fuel and the oxidiser. As a consequence, compared with air-breathing technologies, where the oxidiser is taken from the ambient atmosphere, rocket powered vehicles can
operate in vacuum (this comes at the price of the vehicle being much heavier, with most of the
mass being fuel and oxidiser). As such, rocket engines have been the propulsion system of preference for use in space.
Rockets engine are a way to achieve hypersonic exhaust velocities while maintaining high thrust
values which also enable hypersonic atmospheric flight. In thermal rocket engines, the high velocities obtained at the exhaust originates from heat addition to the flow by a combustion process.
All the propellants, both fuel and oxidiser, are carried in the vehicle. In what follows, we will
first go through a brief description of the key technological elements composing a rocket powered
vehicle. We will then focus on giving a first order analysis of rocket engine thermodynamics by
introducing the key propulsive properties and key performance indices. We will then focus on the
detailed first order analysis of the engine thermodynamic and discuss the effect of its key parameters on its performances. In a last part, we will look in the thermodynamic analysis of the pumps
which are the most critical sub-systems of the engine and discuss second order elements of the
engine. Most of the discussion and example will focus on launcher size engines.
1.2 Liquid-fuelled chemical rocket engine powered vehicle description
Rocket vehicle powered by liquid-fuelled chemical engine can be broken down in 6 key elements
as per Figure 1 below.
Figure 1 Diagram of a typical rocket vehicle powered by a liquid-fuelled chemical engine [adapted
from Wikipedia].
2
• 1 and 2 are the tanks for both fuel and oxidiser. As seen in Topic 6, to achieve adequate
energetic density, the propellants are most of the time stored in liquid state, which for O2,
CH4, H2, implies that there are cooldown to cryogenic temperature and, therefore, most
often, self-pressurised.
• 3 are the pump systems that pressurised the propellant inside the combustion chamber. On
launcher size engines, the mass flow is often in fractions of a ton to several tons per second
and the pressure requirements are in the order of one to several hundred of bars. This puts
incredibly high requirements on the propellant pumping system. To achieve the pumps are
turbomachines called turbopumps. Turbopumps are turbomachines which compressor side
is a pump that compresses the liquid coming from the tanks and feed it to the combustion
chamber at high pressure. The turbine side is, in most cases, fed by burnt gases issued
from a separate smaller combustion chamber which reactants are, in most cases, also coming
from the main tanks. For instance on the F-1 engine (that powered the Saturn V flights to
the Moon) the total mass flow per engine is 2.6 t/s, a single turbine powered both the RP-
1 (kerosene like fuel) and the liquid oxygen pumps and reached a brake power of 53 146
horsepower. For comparison purposes, one of the largest aircraft engines, the GE90-94B
generates 93 700 shaft horsepower.
• 4 is the combustion chamber in which isobaric (subsonic) combustion happen at high pressure. As we will see afterwards, the pressure inside the combustion chamber is deliberately
high so high overall engine performances can be achieved. As seen in Topic 6, the combustion products can reach temperature over 3000 K. This coupled to the high pressure required
put extremes constraints on the overall design of those chamber and for launcher size engine
when the operating duration reaches minutes, the cooling of the wall must be integrated in
the design. For instance on the F-1 engine, the fuel flowed through cooling channel around
the combustion chamber, the throat and the nozzle to cool them down.
• 5 is the engine throat. The throat is downstream of the combustion chamber, and is the
dimension that restrict the flow through the engine so that pressure builds up in the chamber.
Through the throat, the flow of hot products accelerates from subsonic speeds to reach Mach
= 1.
• 6 is the nozzle and exhaust plume. The flow exit the throat and enter the nozzle, which in
most cases is of diverging cross-section. The flow then expands and accelerates to supersonic
and hypersonic velocities depending mostly on the nozzle length.
3
The accurate calculations of the engine performances must incorporate all element of the system.
An example of detailed calculation extracted from a literature article is given below on Figure 2.
Figure 2 Results of a detailed calculation for a fully-staged engine architecture with regenerative liquid oxygen cooling of the nozzle [Nikischenko et al. Improving the performance of
LOX/kerosene upper stage rocket engines, 2017].
In this Topic, we’ll focus on making first order calculations of the performances of the key element
of the engine. First order calculations can be made by just considering what is happening starting
from the combustion chamber to the end of the nozzle (element 1 of Figure 2), making assumption
on the expansion process. As they are critical to thIn the last part of the Topic, we will address the
calculation of the turbopumps.
2 Key propulsive properties and performance indicators
We will first introduce the key propulsive properties then discuss their variation as a function of
engine parameters.
2.1 Thrust
Raw thrust As stated in the introduction, the purpose of the engine is to produce thrust. That
thrust is used to accelerate a vehicle to higher velocities. From Topic 1, recall that the net thrust F
generated by a rocket engine is
F = m˙ · Ve + Ae · (Pe – Pa)
Where m˙ is the total mass flow going through the exhaust cross section Ae and Ve the velocity of
the products at the exhaust plane. Pe is the pressure at the exhaust plane and Pa is the ambient
pressure.
4
The thrust is dependant on engine size (extensive parameter). For parametric analysis it can be
useful to put it in a specific form to get it independent of the engine size.
Specific thrust As also introduced in Topic 5, the specific thrust fs is the thrust divided by the
total mass flow going through the engine.
fs = F

= Ve + Ae

· (Pe – Pa)
Recall that at the exhaust plane, the mass flow reads
m˙ = re · Ae · Ve
So that

Ae 1

=
re · Ve
Hence the specific thrust is independent of the engine size and its expression reads
fs = Ve + 1
re · Ve · (Pe – Pa)
Note that the specific thrust is homogeneous in unit to a velocity [m/s].
2.2 Impulse
Raw impulse The objective of a rocket engine is to change the momentum of the vehicle. When
a thrust F is applied to a vehicle of mass m, it changes the momentum of the vehicle
F = d(m · V)
dt
Where V is the velocity of the vehicle. Indeed this is common to every propulsion system, jet
engines, turboprop, etc, although rocket engine is particular for several reasons. For instance,
when performing orbital lunch, the run time is usually short, often given in minutes or seconds,
as such, one integrate the above over the burn time to recover the total change of momentum
induced by the engine.
Z0t F(t)dt = m(t) · V(t)
Note that this is only the raw contribution of the engine to the change of momentum. To recover
the net variation of momentum, one is to include the entire set of forces applied to the vehicle such
as gravity, drag, etc.
The left term of the previous equation is called impulse and noted I
5
I = Z0t F(t)dt
The impulse as the thrust is dependant on the size of the engine. As such it is useful to make it
independent of the engine size.
Specific impulse To do so, one divides the impulse by the integral of the mass flow multiplied by
the gravity constant g0 = 9.81N/kg, for unit homogeneity purposes, so that the force is converted
into kg. The specific impulse Isp reads
I
sp =
R0t Fdt
g0 · R0t mdt ˙
If the thrust and mass flow are constant, the specific impulse simplifies as
I
sp =
F
g0 · m˙
Which as a function of the specific thrust simply reads
I
sp =
1g0
· fs
Hence the specific impulse is independent of the size of the engine. Note that the Isp, pronounced
“Eye’S’P”, is often used to characterise a propellant mixture and is homogeneous to a duration
[s]. Note that the Isp is very similar to a specific consumption but is preferred why it comes to
characterise rocket engine. The Isp is, given a kilogram of mixture burnt and expelled, the amount
of time the engine applies one kilogram of force (in Earth gravity).
2.3 Efficiencies
Efficiencies are usually not used to characterise engine performances and people prefer them Isp
but it provides a good insight on the efficiency of the energy conversion process of the engine.
Power in and powers out The raw power Pth input of the engine is the product of the enthalpy
of reaction DrH released by the combustion multiplied by the mass flow of reactants reacting.
Pth = DrH · m˙
The engine raw mechanical output is a jet of gas which kinetic power Pjet reads
P
jet =
1 2
· m˙ · V2
e
The final mechanical output of the engine is a power transmitted to the vehicle Pvehicle. It is the
product of the vehicle’s velocity V times the thrust F generated by the engine
6
Pvehicle = V · F
One can also define a residual jet power Pres based on the velocity difference between that of the
jet and that of the vehicle
Pres = 1
2 · m˙ · (Ve – V)2
Internal (thermodynamic) efficiency The ratio of Pjet by Pth is the internal efficiency of the engine hin which reads
hin =
P
jet
Pth =
12
·
V2
e
DrH
hin describes the efficiency with which, through acceleration in a nozzle, the heating power released from an isobaric combustion is converted into jet kinetic power.
Propulsive efficiency The propulsion efficiency hP is the ratio of Pvehicle by the total mechanical
power, which is the sum of the jet residual energy Pjet and of Pvehicle and reads
hP =
Pvehicle
Pvehicle + Pres
When the pressure term of the thrust is small, F ≈ m˙ · Ve and hP can be rewritten

hP = F · V = 2
F · V + )2

1
2 · F · Ve · (1 – VVe 2 + Ve
V · (1 – VVe )2
hP describes the efficiency with which, through the ejection of a jet of propellant of a certain kinetic
energy, the vehicle is propelled with a certain power.
7
[1]: import numpy as np
import matplotlib.pyplot as plt
vRatioEns = np.linspace(1e-3,1,100) # V/Ve
propulsionEfficiencyEns=[]
for vRatio in vRatioEns:
propulsionEfficiency=2/(2+1/vRatio*(1-vRatio)**2)
propulsionEfficiencyEns.append(propulsionEfficiency)
fig, ax1 = plt.subplots(1,1,figsize=(10,5))
ax1.plot(vRatioEns,propulsionEfficiencyEns)
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
plt.xlabel(‘Velocity ratio $V/V_e$ [-]’,fontsize=16)
plt.ylabel(‘Propulsion efficiency [-]’,fontsize=16)
plt.show()
When the vehicle velocity is equal to the velocity of the exhaust gas, the residual energy of the jet
is equal to 0, the efficiency is then equal to 1. If the vehicle is standing still, for instance at take-off,
the propulsion efficiency is null.
Thermopropulsive efficiency The thermopropulsive efficiency hTP is the product of hin by hP
hTP = hin · hP
Those engine properties depends on the properties of the combustion chamber and boundary
conditions such as the external pressure. In what follows, part III, we will perform one calculation,
from the combustion to the end of the expansion process before making parametric variations in
part IV.
8
3 Combustion and expansion calculations
The performance of the engine, depends to first order on what happens starting from the combustion chamber, to when the propellants leave the nozzle (parts 4, 5 and 6 of Figure 1). We will first
address and discuss the combustion part and then the expansion part.
Figure 3 Top: Diagram of a typical liquid-fuelled chemical rocket engine [adapted from Wikipedia]
Bottom: Temperature field extracted from a Large Eddy Simulation of the mixing, combustion and
exhaust of a rocket engine [EPEEC website].
Combustion The purpose of the combustion chamber is to achieve the conversion of the quite
massive flow of propellant flowing through the engine into burnt product, which after expansion will generate the thrust. Before getting into the thermodynamic analysis, which will be an
extreme simplification, it is interesting to get a glance at the realities of the extremely complex
physics happening inside the engine. The combustion chamber features some of the most complex engineering problems to date: highly turbulent multiphase combustion at high pressure with
complex fuels, combustion instabilities, heat transfer to the walls, extreme mechanical stresses, supersonic and hypersonic flows. Capturing this physics numerically with CFD is still an extremely
complex challenge, especially for large engines. The above simulation result field is representative of state-of-the art simulations of an experimental engine from DLR, having 6.7 kg/s total
mass flow of propellant and generating 25 kN of thrust. This makes the design of high performance combustion chambers extremely challenging. Note that the mesh is extremely large and
includes hundreds of millions of elements with the purpose of understanding pressure instabilities, simulating one millisecond of operation of the engine requires millions of CPU hours.
9
From a thermodynamic point of view, the phenomena can be extremely simplified and still yield
extremely valuable results. Getting back, to the simplified schematic of Figure 3, fuel (m˙o) and
oxidiser (m˙ f ) flow (respectively 1 and 2 on Figure 3) from the turbopump through the injection
plate (3 on Figure 3). At that point, both the fuel and oxidiser can be either gaseous, liquid or
supercritical depending on the engine architecture, injection pressure and cooling strategies. Fuel
and oxidiser mix inside the combustion chamber (4 on Figure 3), forming a total mass flow of m˙
and burn. Depending on their initial state when injected, the propellants may have to evaporate
before the combustion happens. The burnt gases then flow towards the throat (5 on Figure 3)
where they accelerate to Mach = 1 and then to higher Mach number in the diverging nozzle (6 on
Figure 3).
As seen above, in a real combustor, the propellants are injected separately and the resulting mixture is highly not premixed, and non-ideal mixing leads to the combustion happening at different
equivalence ratios, or including burnt gases. This can lead to the heat released being less than
the ideal one predicted by the premixed combustion. For simplicity’s sake, we will assume for
combustion that the mixture is premixed at the overall Mixture Ratio (MR) defined from the total
oxidiser fuel and oxidiser mass flow:
MR = mo
mf
Physically, as the combustion starts, the throat restricts the flows and the pressure in the chamber
increases as the total temperature of the flow rises as a result of the combustion. This can for
instance being seen on experimental pressure traces of Figure 4 (note the bump of pressure is due
to having the starting torch turned off so that the following plateau phase is steady state).
Figure 4 Example of signals acquired during a test fire of a small-scale experimental rocket engine [Boust et al. Combustion Performance of Green Storable Bi-Propellants for Space Propulsion,
2018].
Topic 6 introduced all the elements required to analyse the thermodynamics of the combustion
happening inside the engine. Let us consider for instance the combustion as it happened in the
engine of the Space Shuttle (SSME). A mixture of hydrogen (H2) and oxygen (O2) of mixture ratio
of 6 at a pressure of 207 bars for a total flow of 518 kg/s. Note that for an hydrogen/oxygen
10
mixture, the stoichiometric mixture ratio is of 8 (8 kg of oxygen for 1 kg of hydrogen). hence the
SSME operates slightly rich (ER = 1.33)
[2]: import numpy as np
import cantera as ct
mixture=ct.Solution(‘gri30_highT.cti’)
mdot=518 #kg/s
MR=6
p0=207e5 #Pa
T0=300 # note that the temperature here is arbitrary for the sake of the example
Y0=’H2:1;O2:’+str(MR) # mass fraction at the mixture ratio
mixture.TPY=T0,p0,Y0 # initialising the mixture state
mixture.equilibrate(‘HP’) # adiabatic isobaric combustion
h0=mixture.enthalpy_mass
T,p,Y=mixture.TPY
hReactants = mixture.enthalpy_mass
mixture.equilibrate(‘HP’) # adiabatic and isobaric combustion
Tproducts = mixture.T
mixture.TP = T0,p0 # Cool the products back to the initial temperature to␣
,!evaluate the heat of combustion
hProducts = mixture.enthalpy_mass # Enthalpy at equilibrium flame composition,␣
,!initial temperature and pressure
drh = (hProducts – hReactants) # Determine the heat of combustion (J/kg)
Pth = – drh*mdot # Engine thermal power is heat of combustion (per unit mass of␣
,!reactants) multiplied by reactant mass flow rate
print(‘The combustion temperature at a pressure of %.0f bar and mixture ratio of␣
,!%.1f is of %.0f K.’ % (p0/1e5,MR,T))
print(‘The raw thermal engine power output is of %.2f GW.’ % (Pth/1e9))
The combustion temperature at a pressure of 207 bar and mixture ratio of 6.0 is
of 3731 K.
The raw thermal engine power output is of 5.79 GW.
As seen in Topic 6, the mixture ratio will influence the combustion temperature. For hydrogen for
instance, one gets the following.
[3]: import matplotlib.pyplot as plt
MR_set=np.arange(4,16,0.025)
drh_set=[]
T_set=[]
for MR in MR_set:
Y0=’H2:1;O2:’+str(MR) # mass fraction at the mixture ratio
mixture.TPY = T0,p0,Y0
hReactants = mixture.enthalpy_mass
mixture.equilibrate(‘HP’) # adiabatic and isobaric combustion
Tproducts = mixture.T
11
mixture.TP = T0,p0
hProducts = mixture.enthalpy_mass
drh = (hProducts – hReactants)/1e6
drh_set.append(drh)
T_set.append(Tproducts)
fig, ax1 = plt.subplots(1,1,figsize=(10,6))
plt.subplots_adjust(wspace=0.5)
color = ‘tab:blue’
ax1.set_xlabel(‘Rich mixture ratio $longleftrightarrow$ Lean mixture ratio␣
,![-]’, fontsize=16)
ax1.set_ylabel(‘Absolute value of enthalpy of reaction (MJ/kg)’, color=color,␣
,!fontsize=13)
ax1.plot(MR_set,np.multiply(drh_set,-1), color=color)
ylim=ax1.get_ylim()
ax1.plot([8,8],[0,12],color=’black’,linestyle=’–‘) # stoichiometry
ax1.plot([6,6],[0,12],color=’green’,linestyle=’–‘) # ssme value
ax1.set_ylim(ylim)
ax1.tick_params(axis=’y’, labelcolor=color, labelsize=14)
ax1.tick_params(axis=’x’, labelsize=14)
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color = ‘tab:red’
ax2.set_ylabel(‘Temperature (K)’, color=color, fontsize=16) # we already␣
,!handled the x-label with ax1
ax2.plot(MR_set,T_set, color=color)
ax2.tick_params(axis=’y’, labelcolor=color, labelsize=14)
12
Note that the mixture of the SSME is slightly rich, however, that equivalence ratio is not that of
maximum temperature which would lead to higher performances. There are several practical
reasons for operating at richer equivalence ratio. The main one is to help maintain the structural
integrity of the chamber. The combustion chamber wall are submitted to high temperature, and
to prevent their fast oxidisation and likely combustion, some of the fuel is diverted to the walls
(the injection of the fuel is spatially stratified) so that the mixture is richer near the wall and leaner
towards the center.
Combustion sets a boundary condition for the following expansion of the mixture through the
throat and the nozzle.
Expansion The burnt mixture flows from the end of the combustion chamber towards a converging section where the flow accelerates to reach a local Mach = 1 at the throat. As seen in Topic
5, the first difficulty to find the sonic properties is that the sound speed depends on the static
temperature, which depends on the velocity of the flow hence the need for an iterative method to
determine the sonic velocity in the flow when working with Cantera. The adding difficulty with
a reacting flow is that, as temperature varies during the expansion, the composition of the burnt
products can vary as well. In what follows, we will see how to resolve that problem and how to
compute the local properties along the expansion, starting with these at the throat.
Throat condition As seen in Topic 5, the velocity during a supersonic expansion can be expressed as
Ve = q2 · (h0 – h (Tx, Xx))
Where the index x is the state at the section x, and the index 0 the stagnation condition upstream of
the throat from the combustion chamber. Note that the flow in the combustion chamber is largely
subsonic so that the total temperature can be approximated as the static temperature resulting
from combustion. So that h0 is known and h (Tx, Xx), the enthalpy of the expanded products
remains to be calculated.
In an ideal expansion process, the expansion is isentropic. In reality, they are many phenomena
happening that would lead to an non-isentropic expansion (heat transfer by convection on the
walls or radiation, shocks, wall friction, etc). However, these non-idealities won’t be addressed in
this Topic and the expansion will be supposed ideal hence isentropic. As mentioned before, one
of the additional difficulties of working with reactive flows is that their composition can change
during the expansion. A way to solve things while keeping the complexity low, would be to
solve the 1-D flow expansion with varying cross-section as a function of x and a detailed chemical
kinetic mechanism. However this solution is still complex to implement, and won’t be addressed
here.
Instead of solving the dynamics, what is usually done in first cut calculations is making two assumptions. Those two assumptions come down from comparing the chemical reactions characteristic times to that of the flow (for instance the duration it takes for a particle to travel through
the nozzle). The first one is that the chemical reactions specific times are way longer than the flow
ones so that one can make the assumption that the chemistry is frozen. That assumption is often
referred to in the literature as “frozen chemistry”. The second one is the other way around, and, is
13
that the chemical reactions specific times are way shorter than the flow ones so that one can make
the assumption that the chemistry is at equilibrium at all time. That assumption is often referred
to in the literature as “shifting equilibrium”. For the purpose of calculating those states, we will
reuse the expansion function introduced in Topic 7. Those functions can already be used for the
frozen chemistry case and must be updated for the shifting equilibrium
[4]: from scipy.optimize import root
def soundSpeed(gas,chem):
import math
s0=gas.s
p0=gas.P
if chem==1:
rtol=1.0e-6
maxiter=5000
gas.equilibrate(‘SP’, rtol=rtol, maxiter=maxiter)
r0=gas.density
p1=p0*1.0001
gas.SP=s0,p1
if chem==1:
gas.equilibrate(‘SP’, rtol=rtol, maxiter=maxiter)
c=math.sqrt((p1-p0)/(gas.density-r0))
gas.SP=s0,p0
return c
def diffChoking(throatPressure,gas,chem):
import math
initialEntropy,initialPressure,initialComposition=gas.SPX # Store the␣
,!initial thermodynamic state
stagnationEnthalpy=gas.enthalpy_mass
gas.SP = gas.entropy_mass,throatPressure # isentropic expansion to the␣
,!guessed throat pressure
if chem == 1: # if chemistry is shifting-equilibrium, equilibrate (at␣
,!constant entropy and pressure)
rtol=1.0e-6
maxiter=5000
gas.equilibrate(‘SP’) # find the equilibrium composition
specificKineticEnergy=stagnationEnthalpy-gas.enthalpy_mass # first-law␣
,!energy balance V^2/2 = h0 – h
velocity=math.sqrt(2*specificKineticEnergy)
c=soundSpeed(gas,chem)
gas.SPX=initialEntropy,initialPressure,initialComposition # Update gas back␣
,!to initial state
error=c-velocity
return error
def reversibleChokedConditions(gas,chem):
import math
14
stagnationEnthalpy=gas.enthalpy_mass
sol=root(diffChoking,[gas.P*0.5],args=(gas,chem))
throatPressure=sol[‘x’]
gas.SP=gas.entropy_mass,throatPressure
if chem == 1:
rtol=1.0e-6
maxiter=5000
gas.equilibrate(‘SP’)
velocity=math.sqrt(2*(stagnationEnthalpy-gas.enthalpy_mass))
return gas,velocity
mixture.TPY=T,p,Y
mixture,VFC=reversibleChokedConditions(mixture,chem=0)
pSonicFC=mixture.P
rhoFC=mixture.density
TsonicFC=mixture.T
mixture.TPY=T,p,Y
mixture,VSE=reversibleChokedConditions(mixture,chem=1)
pSonicSE=mixture.P
rhoSE=mixture.density
TsonicSE=mixture.T
print(‘The condition at the throat for a frozen chemistry are rho = %.3f kg/m3,␣
,!T = %.1f K, V = %.1f m/s’ % (rhoFC,TsonicFC,VFC))
print(‘The condition at the throat for a shifting equilibrium are rho = %.3f kg/
,!m3, T = %.1f K, V = %.1f m/s’ % (rhoSE,TsonicSE,VSE))
The condition at the throat for a frozen chemistry are rho = 5.564 kg/m3, T =
3399.1 K, V = 1586.0 m/s
The condition at the throat for a shifting equilibrium are rho = 5.536 kg/m3, T
= 3516.5 K, V = 1569.3 m/s
The chamber total pressure, temperature, mass flow and throat cross-section are related to each
other, and fixing three of them will fix the remaining one. During design, the pressure is most
often specified as a target so that the size of the engine can be computed. Based on the SSME
properties, we can also assess the throat size by using the above functions. Recall that the mass
flow through the engine is constant and reads at a position x along the engine,
m˙ = r(x) · V(x) · A(x)
Knowing condition at the throat and the mass flow we can thus deduce the throat area and diameter.
Athroat = m˙
r(throat) · V(throat)
Therefore we can directly deduce the ideal throat of the SSME.
15
[5]: A_throatFC=mdot/(rhoFC*VFC)
d_throatFC=(A_throatFC*4/np.pi)**(1/2) # A = (pi*d^2)/4
A_throatSE=mdot/(rhoSE*VSE)
d_throatSE=(A_throatSE*4/np.pi)**(1/2)
relDiffHyp=(d_throatFC-d_throatSE)/d_throatSE
relDiffReal=(0.26162-d_throatSE)/0.26162
print(‘The diameter of the throat is %.1f mm under frozen chemistry assumption␣
,!and %.1f mm under shifting equilibrium assumption (%.1f %% relative␣
,!difference). Note that this is consistent with the real value which is of 261.
,!62 mm (10.3 inches), %.1f %% relative difference with the SE calculation.’ %␣
,!(d_throatFC*1e3,d_throatSE*1e3,relDiffHyp*1e2,relDiffReal*1e2))
The diameter of the throat is 273.4 mm under frozen chemistry assumption and
275.5 mm under shifting equilibrium assumption (-0.8 % relative difference).
Note that this is consistent with the real value which is of 261.62 mm (10.3
inches), -5.3 % relative difference with the SE calculation.
Note that the throat dimension we computed is very similar independently of the chemistry hypothesis made to compute it. Also it is consistent that is slightly smaller. For the same throat size,
non-idealities (heat losses, wall frictions, etc) in the engine will bring down the pressure measured
in the chamber. Hence a smaller throat is needed to obtain the same chamber pressure.
Nozzle expansion After the throat, the flow accelerates to supersonic speeds. Physically the
flow expands to supersonic velocity due to the increase of cross-section in the nozzle. However
in our calculations, we will specify the pressure and then deduce the required area to achieve the
expansion. Let us compute the properties (temperature, Mach number, velocity) of the expansion
through the nozzle from the pressure equal to the sonic pressure down to a near-vacuum pressure
for both chemical evolutions extremes (frozen chemistry and shifting equilibrium).
[6]: # first we define the function use to calculate the expansion
def reversibleConvergingNozzle(gas,pe,chem):
h0=gas.enthalpy_mass
gas.SP=gas.entropy_mass,pe
if chem == 1:
gas.equilibrate(‘SP’,rtol=1e-6,maxiter=5000)
V=(2*(h0-gas.enthalpy_mass))**(1/2)
return gas,V
# then let us define the set of pressure to expand the flow to, and the set of␣
,!data to export (in dictionaries)
from math import floor, log
pMin=4 # minimum expansion equal to low vacuum pressure
pa=1e5
expansionSolutions=
“FC”:
“chem”:0,
“pressure”: np.logspace(pMin,floor(log(pSonicFC,10)),100),
16
“density”:[],
“temperature”:[],
“mach”:[],
“velocity”:[],
“specThrust”:[]
,
“SE”:
“chem”:1,
“pressure”: np.logspace(pMin,floor(log(pSonicSE,10)),100),
“density”:[],
“temperature”:[],
“mach”:[],
“velocity”:[],
“specThrust”:[]

for hypothesis in expansionSolutions:
VSet=[]
MSet=[]
TSet=[]
rhoSet=[]
specThrustSet=[]
for pe in expansionSolutions[hypothesis][‘pressure’]:
mixture.TPY=T,p,Y
chem=expansionSolutions[hypothesis][‘chem’]
mixture,V=reversibleConvergingNozzle(mixture,pe,chem=chem)
c=soundSpeed(mixture,chem)
specThrust=V+1/(mixture.density*V)*(pe-pa)
VSet.append(V)
MSet.append(V/c)
TSet.append(mixture.T)
rhoSet.append(mixture.density)
specThrustSet.append(specThrust)
expansionSolutions[hypothesis].update(“density”:rhoSet)
expansionSolutions[hypothesis].update(“temperature”:TSet)
expansionSolutions[hypothesis].update(“mach”:MSet)
expansionSolutions[hypothesis].update(“velocity”:VSet)
expansionSolutions[hypothesis].update(“specThrust”:specThrustSet)
[7]: fig, ax1 = plt.subplots(1,3,figsize=(25,6))
plt.subplots_adjust(wspace=0.3)
# velocity and mach number
plt.sca(ax1[0])
ax1[0].set_xlabel(‘Pressure (bar)’, fontsize=16)
ax1[0].set_ylabel(‘Velocity (m/s)’, color=color, fontsize=16)
17
ax1[0].plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/
,!1e5),expansionSolutions[‘FC’][‘velocity’], color=’red’,label=’Frozen␣
,!Chemistry’)
ax1[0].plot(np.multiply(expansionSolutions[‘SE’][‘pressure’],1/
,!1e5),expansionSolutions[‘SE’][‘velocity’], color=’blue’,label=’Shifting␣
,!Equilibrium’)
ax1[0].legend()
plt.xscale(‘log’)
ax1[0].invert_xaxis()
ax1[0].tick_params(axis=’y’, labelcolor=color, labelsize=12)
ax1[0].tick_params(axis=’x’, labelsize=12)
ax2 = ax1[0].twinx()
rel=np.divide(np.add(expansionSolutions[‘FC’][‘velocity’],np.
,!multiply(expansionSolutions[‘SE’][‘velocity’],-1)),expansionSolutions[‘SE’][‘velocity’])
ax2.plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/1e5),np.
,!multiply(rel,100), color=’black’,linestyle=’–‘)
ax2.set_ylabel(r’$ fracV_FC-V_SEV_SE (%) $’, fontsize=16)
plt.sca(ax1[1])
ax1[1].set_xlabel(‘Pressure (bar)’, fontsize=16)
ax1[1].set_ylabel(‘Mach number [-]’, color=color, fontsize=16)
ax1[1].plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/
,!1e5),expansionSolutions[‘FC’][‘mach’], color=’red’,label=’Frozen Chemistry’)
ax1[1].plot(np.multiply(expansionSolutions[‘SE’][‘pressure’],1/
,!1e5),expansionSolutions[‘SE’][‘mach’], color=’blue’,label=’Shifting␣
,!Equilibrium’)
ax1[1].legend()
plt.xscale(‘log’)
ax1[1].tick_params(axis=’y’, labelcolor=color, labelsize=12)
ax1[1].tick_params(axis=’x’, labelsize=12)
ax1[1].invert_xaxis()
ax2 = ax1[1].twinx()
rel=np.divide(np.add(expansionSolutions[‘FC’][‘mach’],np.
,!multiply(expansionSolutions[‘SE’][‘mach’],-1)),expansionSolutions[‘SE’][‘mach’])
ax2.plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/1e5),np.
,!multiply(rel,100), color=’black’,linestyle=’–‘)
ax2.set_ylabel(r’$ fracM_FC-M_SEM_SE (%) $’, fontsize=16)
plt.sca(ax1[2])
ax1[2].set_xlabel(‘Pressure (bar)’, fontsize=16)
ax1[2].set_ylabel(‘Temperature (K)’, color=color, fontsize=16)
ax1[2].plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/
,!1e5),expansionSolutions[‘FC’][‘temperature’], color=’red’,label=’Frozen␣
,!Chemistry’)
18
ax1[2].plot(np.multiply(expansionSolutions[‘SE’][‘pressure’],1/
,!1e5),expansionSolutions[‘SE’][‘temperature’], color=’blue’,label=’Shifting␣
,!Equilibrium’)
ax1[2].legend()
ax1[2].tick_params(axis=’y’, labelcolor=color, labelsize=12)
ax1[2].tick_params(axis=’x’, labelsize=12)
ax1[2].invert_xaxis()
plt.xscale(‘log’)
ax2 = ax1[2].twinx()
rel=np.divide(np.add(expansionSolutions[‘FC’][‘temperature’],np.
,!multiply(expansionSolutions[‘SE’][‘temperature’],-1)),expansionSolutions[‘SE’][‘temperature’]
ax2.plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/1e5),np.
,!multiply(rel,100), color=’black’,linestyle=’–‘)
ax2.set_ylabel(r’$ fracT_FC-T_SET_SE (%) $’, fontsize=16)
plt.show()
The effect of chemical equilibrium during the expansion comes from the static temperature drop.
The drop in static temperature brings the dissociated elements (i.e. H, O, CO, etc) in recombining into lower heat of formation elements (i.e. H2O, CO2). Hence the SE temperature expansion
are slightly higher (5 at throat to below 20 % for near vacuum pressures). The resulting exhaust
temperature is slightly higher in the case of SE than in the case of FC.
We can then compute the effect of the chemistry expansion on the specific impulse.
[8]: fig, ax1 = plt.subplots(1,1,figsize=(10,5))
# velocity and mach number
plt.sca(ax1)
ax1.set_xlabel(‘Pressure (bar)’, fontsize=16)
ax1.set_ylabel(r’$I_sp (s)$’, color=color, fontsize=16)
ax1.plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/1e5),np.
,!divide(expansionSolutions[‘FC’][‘specThrust’],9.81), color=’red’,label=’Frozen␣
,!Chemistry’)
ax1.plot(np.multiply(expansionSolutions[‘SE’][‘pressure’],1/1e5),np.
,!divide(expansionSolutions[‘SE’][‘specThrust’],9.81),␣
,!color=’blue’,label=’Shifting Equilibrium’)
19
ax1.legend()
ax1.invert_xaxis()
ax1.tick_params(axis=’y’, labelcolor=color, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
ax2 = ax1.twinx()
rel=np.divide(np.add(expansionSolutions[‘FC’][‘specThrust’],np.
,!multiply(expansionSolutions[‘SE’][‘specThrust’],-1)),expansionSolutions[‘SE’][‘specThrust’])
ax2.plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/1e5),np.
,!multiply(rel,100), color=’black’,linestyle=’–‘)
ax2.set_ylabel(r’$ fracI_sp,FC-I_sp,SEI_sp,SE (%) $’, fontsize=16)
plt.xscale(‘log’)
plt.show()
In turn, the Isp is also slightly higher for the SE chemistry than for the FC. The ideal performances
of the engine thus lies in-between those two values. Note that, as mentioned above, the expansion
is driven by the increase of area ratio. Using the properties calculated before, we can, given a
certain mass flow, compute the area and the associated nozzle radius for which those properties
are reached in an engine.
[9]: for hypothesis in expansionSolutions:
ASet=[]
RSet=[]
for ii,rho in enumerate(expansionSolutions[hypothesis][‘density’]):
V=expansionSolutions[hypothesis][‘velocity’][ii]
A=mdot/(rho*V)
r=(A*4/np.pi)**(1/2)
ASet.append(A)
RSet.append(r)
expansionSolutions[hypothesis].update(“area”:ASet)
20
expansionSolutions[hypothesis].update(“radius”:RSet)
fig, ax1 = plt.subplots(1,1,figsize=(10,5))
pressurePos=np.nonzero(np.flipud(np.
,!multiply(expansionSolutions[‘SE’][‘radius’],2))>=2.3)[0][0]
pressureSSME=np.flipud(expansionSolutions[‘SE’][‘pressure’])[pressurePos]/1e5
# velocity and mach number
plt.sca(ax1)
ax1.set_xlabel(‘Pressure (bar)’, fontsize=16)
ax1.set_ylabel(r’$Diameter , (m)$’, fontsize=16)
ax1.plot(np.multiply(expansionSolutions[‘FC’][‘pressure’],1/1e5),np.
,!multiply(expansionSolutions[‘FC’][‘radius’],2),color=’red’,label=’Frozen␣
,!Chemistry’)
ax1.plot(np.multiply(expansionSolutions[‘SE’][‘pressure’],1/1e5),np.
,!multiply(expansionSolutions[‘SE’][‘radius’],2),
color=’blue’,label=’Shifting Equilibrium’)
ax1.plot([1e2,pressureSSME],[2.3,2.3],color=’black’,linestyle=’–‘)
ax1.plot([pressureSSME,pressureSSME],[0,2.3],color=’black’,linestyle=’–‘)
ax1.set_ylim([0,7])
ax1.set_xlim([1e-1,1e2])
ax1.legend()
plt.xscale(‘log’)
ax1.invert_xaxis()
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
The higher the pressure expansion, the larger the nozzle has to be. The actual nozzle of the SSME
21
is roughly 2.3 m in diameter which means, according to our ideal calculation, that it is optimised
for a pressure slightly higher than the atmospheric pressure (1.3 bar).
Now that we laid out the tools to compute the performance of an engine, we are going to discuss
the effect of engine parameters (chamber pressure, mixture ratio) and flight parameters on the key
performances indicators.
4 Effect of engine parameters and flight altitude on performance
An engine is designed primarily to provide a certain amount of thrust over a certain amount of
time at a certain efficiency. In a first part of what follows we will discuss the effect of the main
parameters of the engine on the performances. In a second part we will analyse the influence of
the variation of flight altitude on the engine performances.
4.1 Influence of engines parameters on sea level thrust
The parameters of interests that will be discussed are pressure, mixture and the effect of variation
of mixture ratio on the I
sp and on the internal efficiency at sea level (ambient exhaust pressure
≈ 1 bar).
Effect of the pressure In choked conditions and for a given pressure and combustion temperature, the mass flow through the engine is limited by the throat area. To understand that statement
better, recall that through the engine, the mass flow is equal to
m˙ = r · V · A
If the flow is choked, the mass flow is known at the throat where Mach = 1.
m˙ = rM=1 · VM=1 · Athroat
from Topic 5 that the product of the density by velocity is for an ideal gas, with constant g
rM=1 · VM=1 = r0 · 1 + g -2 1
-1
g-1 –
12
· pg · r · T0
rM=1 · VM=1 = ppT00 · rgr · 1 + g -2 1g–11 – 12
Hence in a choked flow of an ideal gas with constant g, the mass flux is proportional to the upstream chamber total pressure and decreases with the square root of the temperature. Therefore to
maintain the same mass flow are higher pressure, one must decrease the size of the engine throat.
However as we will be investigating specific value, this variation won’t impact our parametric
pressure analysis. For all cases, the nozzle is supposed adapted, meaning, as discussed previously, the final pressure pe is equal to that of the ambient pressure so that the thrust doesn’t have
any pressure terms and the specific thrust is equal to the exhaust velocity. The case below is run
22
at the mixture ratio, 6, of the SSME for a mixture of hydrogen/oxygen. The expansion pressure is
that at sea level (roughly ≈ 1bar)
[10]: chamberPressureSet=np.multiply(np.logspace(1,3,100),1e5)
chamberPressureSet=chamberPressureSet[:80] # reduce maximum pressure to ~400 bar
VSet=[]
chamberPressureResults=
“FC”:
“chem”:0,
,
“SE”:
“chem”:1,

MR=6
pa=1e5
for hypothesis in expansionSolutions:
VSet=[]
drhSet=[]
etaIntSet=[]
for pcc in chamberPressureSet:
T0=300
Y0=’H2:1;O2:’+str(MR) # mass fraction at the mixture ratio
mixture.TPY=T0,pcc,Y0 # initializing the mixture state
mixture.equilibrate(‘HP’)
T,p,Y=mixture.TPY
h0=mixture.enthalpy_mass
mixture.TP=T0,pcc
h1=mixture.enthalpy_mass
drh=-(h1-h0)
mixture.TPY=T,p,Y
chem=expansionSolutions[hypothesis][‘chem’]
mixture,V=reversibleConvergingNozzle(mixture,pa,chem=chem)
etaInt=0.5*V**2/drh
etaIntSet.append(etaInt)
VSet.append(V)
drhSet.append(drh)
expansionSolutions[hypothesis].update(“velocity”:VSet)
expansionSolutions[hypothesis].update(“enthalpyOfReaction”:drhSet)
expansionSolutions[hypothesis].update(“internalEfficiency”:etaIntSet)
fig, ax1 = plt.subplots(1,1,figsize=(10,5))
plt.sca(ax1)
ax1.set_xlabel(‘Pressure [bar]’, fontsize=16)
ax1.set_ylabel(r’$I_sp [s]$’, fontsize=16)
23
plt.plot(np.multiply(chamberPressureSet,1/1e5),np.
,!multiply(expansionSolutions[‘FC’][‘velocity’],1/9.81),label=’Frozen␣
,!Chemistry’,color=’red’)
plt.plot(np.multiply(chamberPressureSet,1/1e5),np.
,!multiply(expansionSolutions[‘SE’][‘velocity’],1/9.81),label=’Shifting␣
,!Equilibrium’,color=’blue’)
ax1.legend()
plt.xscale(‘log’)
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
plt.show()
fig, ax1 = plt.subplots(1,1,figsize=(10,5))
plt.sca(ax1)
ax1.set_xlabel(‘Pressure [bar]’, fontsize=16)
ax1.set_ylabel(r’$eta_int , [-]$’, fontsize=16)
plt.plot(np.multiply(chamberPressureSet,1/
,!1e5),expansionSolutions[‘FC’][‘internalEfficiency’],label=’Frozen␣
,!Chemistry’,color=’red’)
plt.plot(np.multiply(chamberPressureSet,1/
,!1e5),expansionSolutions[‘SE’][‘internalEfficiency’],label=’Shifting␣
,!Equilibrium’,color=’blue’)
ax1.legend()
plt.xscale(‘log’)
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
plt.show()
24
Both the I
sp and the internal efficiency increase steadily with increased combustion chamber pressure. Hence high engine performance require high chamber pressure. However the higher the
pressure, the higher the stress exerted on the material, is. Note that the internal efficiency, which
is equivalent to a thermodynamic efficiency, is extremely high for instance compared with values
obtained from aircraft gas turbines. Note that higher pressure increases the gap of performances
between shifting equilibrium and frozen chemistry. For instance, the SSME operating at a chamber pressure of roughly 200 bar has an ideal internal efficiency comprised between 72 % and 78 %.
For comparison, most recent aircraft (Brayton) gas turbine ideal operates with a compression ratio
of 60, which gives an ideal efficiency of cycle around 45 %. However, turbofans exhibits extremely
higher Isp than rockets. For instance the GE CF6 reports an Isp of near 6000 s compared to the 366 s
at sea level of the SSME.
Effect of the mixture and composition Propulsion performances does not make everything,
for different reasons such as density, but also temperature, handling and price, different fuels
are currently used for rocket propulsion. In what follows, we’ll investigate the influence of the
mixture, on both the Isp and the internal efficiency. The fuel considered are CH4, ethanol (C2H6O)
and n-dodecane (C12H26), the oxidiser considered will be O2. n-dodecane is a close equivalent of
RP – 1 which is the grade of kerosene used in rocket. For simplicity’s sake, note that all mixtures
will be considered pre-vaporized before injection in the combustion chamber. First we’ll add the
species missing to the GRI3.0 (ethanol and n-dodecane).
[11]: import cantera as ct
ethanol = ct.Species(‘C2H6O’, ‘C:2, H:6, O:1’)
ethanol.thermo = ct.NasaPoly2(300, 5000, 101325,
(1000, #mid point characterisation between the two␣
,!temperature
5.76535800E-01, 2.89451200E-02, -1.61002000E-05,␣
,!#300-1000K temperature 7 coeffs
25
3.59164100E-09, 0.00000000E+00, -2.96359500E+04,
2.27081300E+01,
4.34717120E+00, 1.86288000E-02, -6.77946700E-06,␣
,!#1000-5000K temperature 7 coeffs
8.16592600E-10, 0.00000000E+00, -3.06615743E+04,
3.24247304E+00))
ndodecane = ct.Species(‘C12H26’, ‘C:12, H:26’)
ndodecane.thermo = ct.NasaPoly2(300, 5000, 101325,
(1391.00, #mid point characterisation between the two␣
,!temperature
-2.62181594E+00, 1.47237711E-01, -9.43970271E-05,
3.07441268E-08, -4.03602230E-12, -4.00654253E+04,
5.00994626E+01,
3.85095037E+01, 5.63550048E-02, -1.91493200E-05,
2.96024862E-09, -1.71244150E-13, -5.48843465E+04,
-1.72670922E+02))
mixture = ct.Solution(‘gri30_highT.xml’)
mixture.add_species(ethanol)
mixture.add_species(ndodecane)
We will investigate the impact of composition and equivalence ratio on the Isp and the internal
efficiency for an engine with an adapted nozzle, running at sea level. The engine pressure will be
set at 200 bar. We can compute the stoichiometric ratio for each fuel based on the generic equation
below.
CxHy + (x + 0.25 y – 0.5 z) O2 ! x CO2 + 0.5y H2O
The stoichiometric mixture ratio reads
MRst = 32 · x + 0.25 y – 0.5 z
12 x + y
[12]: # We will dynamically construction of dictionary to store the result information
fuelSet=[‘H2′,’CH4′,’C2H6O’,’C12H26′]
mixtureResults=dict()
hypothesisSet=[‘SE’,’FC’]
fuelColor=[‘blue’,’green’,’orange’,’red’]
for ii,fuel in enumerate(fuelSet):
nC=mixture.n_atoms(fuel,’C’)
nH=mixture.n_atoms(fuel,’H’)
nO=mixture.n_atoms(fuel,’O’)
nO2=nC+0.25*nH-0.5*nO
MR_st=32*nO2/(12*nC+nH)
subDict=”FC”:”chem”:0,’linestyle’:’–‘,”SE”:”chem”:1,’linestyle’:’-‘
26
subDict.update(‘nO2’:nO2)
subDict.update(‘MR_st’:MR_st)
subDict.update(‘color’:fuelColor[ii])
mixtureResults.update(fuel:subDict)
[13]: ER_set=np.arange(0.5,2,0.025)
for fuel in fuelSet:
p0=200e5 # Pa
T0=300 # K
for hypothesis in hypothesisSet:
VSet=[]
drhSet=[]
etaIntSet=[]
nO2=mixtureResults[fuel][‘nO2’]
for ER in ER_set:
X0=fuel+’:’+str(ER)+’;O2:’+str(nO2)
mixture.TPX = T0,p0,X0
h0=mixture.enthalpy_mass
mixture.equilibrate(‘HP’)
T,p,X=mixture.TPX
mixture.TP=T0,p0
h1=mixture.enthalpy_mass
drh=-(h1-h0)
mixture.TPX=T,p,X
chem=mixtureResults[fuel][hypothesis][‘chem’]
mixture,V=reversibleConvergingNozzle(mixture,pa,chem=chem)
etaInt=0.5*V**2/drh
etaIntSet.append(etaInt)
VSet.append(V)
drhSet.append(drh)
mixtureResults[fuel][hypothesis].update(“velocity”:VSet)
mixtureResults[fuel][hypothesis].update(“enthalpyOfReaction”:drhSet)
mixtureResults[fuel][hypothesis].update(“internalEfficiency”:etaIntSet)
[14]: fig, ax1 = plt.subplots(1,1,figsize=(10,5))
plt.sca(ax1)
ax1.set_xlabel(‘Equivalence ratio [-]’, fontsize=16)
ax1.set_ylabel(r’$I_sp [s]$’, fontsize=16)
for fuel in fuelSet:
for hypothesis in hypothesisSet:
ls=mixtureResults[fuel][hypothesis][‘linestyle’]
color=mixtureResults[fuel][‘color’]
plt.plot(ER_set,np.
,!multiply(mixtureResults[fuel][hypothesis][‘velocity’],1/9.81),label=fuel+’␣
,!’+hypothesis,color=color,linestyle=ls)
ax1.legend()
ax1.tick_params(axis=’y’, labelsize=12)
27
ax1.tick_params(axis=’x’, labelsize=12)
plt.show()
fig, ax1 = plt.subplots(1,1,figsize=(10,5))
plt.sca(ax1)
ax1.set_xlabel(‘Equivalence ratio [-]’, fontsize=16)
ax1.set_ylabel(r’$eta_int , [-]$’, fontsize=16)
for fuel in fuelSet:
for hypothesis in hypothesisSet:
ls=mixtureResults[fuel][hypothesis][‘linestyle’]
color=mixtureResults[fuel][‘color’]
plt.
,!plot(ER_set,mixtureResults[fuel][hypothesis][‘internalEfficiency’],label=fuel+’␣
,!’+hypothesis,color=color,linestyle=ls)
ax1.legend()
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
plt.show()
28
Rockets usually operate at stoichiometric to rich equivalence ratios (recall the SSME is at ER ≈
1.3). Switching to heavier hydrocarbons reduces the Isp by roughly 100 s down to around 300 s
which is what makes hydrogen really attractive as a fuel. Regardless of the equivalence ratio and
the mixture, the Isp is still better for shifting equilibrium than for frozen chemistry, for the reason explained before that shifting equilibrium recombines products when the flow reaches lower
temperature during the expansion in the nozzle. The internal efficiency is rather independent
(variation of up to a few percent) of the equivalence ratio for SE expansions. Note that the internal efficiency depends on both the exhaust velocity, and on the heat release during combustion.
Heat release during combustion is similar for both so the effect comes from the exhaust velocity.
To look in more details to where that variation comes from, one could extract the main species
concentrations and make a similar analysis as that performed in the combustion Topic. For frozen
expansion, the internal efficiency is steadily increasing towards richer mixture. That effect comes
from the fact that, although as seen on the Isp trend, the exhaust velocity (which recall for adapted
expansion is proportional to the Isp) is decreasing towards higher ER, the heat release is also decreasing for higher ER, but at a higher rate than that of the exhaust velocity.
4.2 Influence of flight parameters engine parameters: analysis on a real flight trajectory
Rockets are used to achieve flight from the ground to orbit. During the operation the engine leave
the atmosphere. Doing so, the ambient conditions vary and, as seen previously, that variation
will impact the performances of the engine. An actual engine has usually a rather fixed nozzle
geometry. Note that some engine have nozzle which end size can vary, but it add to the weight
and complexity of the engine. For the sake of the example, we will assume that the geometry of
the engine is constant. The vehicle trajectory followed is that of a Falcon 9 developed by SpaceX
during the launch of the satellite SAOCOM 1A. The data was recovered online through systematic
reading of the launch video. In the analysis, we will follow the variation of performances of the
first stage (the second one operates in vacuum). The Falcon 9 is powered by 9 Merlin 1D engines.
29
The first stage of the Falcon 9 is carrying mox = 287 400 kg of liquid oxygen and mkero =123 500 kg
of kerosene. The engine nozzle expansion area ratio is of 16:1. The vehicle total thrust is of 7607kN
at sea level. Hence the per engine thrust is of 845.2kN. Assuming the engines are powered are
constant mixture ratio, can be approximated as
MR = mox
mkero
=
287400
123500 = 2.327
We will assume that the RP-1 is n-dodecane and compute first the nozzle dimension as done
before on the SSME. The chamber pressure is of 97 bar. The Isp is of 282 s hence the mass flow is of
305.52 kg/s
[15]: Y0=’C12H26:1;O2:2.327′
T0=300 # K
p0=97e5 # Pa
AreaRatio=16
mdot=305.52 # kg/s
mixture.TPY=T0,p0,Y0
mixture.equilibrate(‘HP’)
mixture,VSE=reversibleChokedConditions(mixture,chem=0)
pSonicSE=mixture.P
rhoSE=mixture.density
TsonicSE=mixture.T
A_throatSE=mdot/(rhoSE*VSE)
d_throatSE=(A_throatSE*4/np.pi)**(1/2)
A_nozzleSE=A_throatSE*AreaRatio
d_nozzleSE=(A_nozzleSE*4/np.pi)**(1/2)
print(‘The diameter of the throat is %.1f mm under shifting equilibrium␣
,!assumption.’ % (d_throatSE*1e3))
print(‘The area of the end of the nozzle is thus of %.3f m² under shifting␣
,!equilibrium assumption which gives a nozzle diameter of %.1f mm.’ %␣
,!(A_nozzleSE,d_nozzleSE*1e3))
The diameter of the throat is 269.6 mm under shifting equilibrium assumption.
The area of the end of the nozzle is thus of 0.913 m² under shifting equilibrium
assumption which gives a nozzle diameter of 1078.2 mm.
Note that SpaceX reports an engine diameter of 0.92 m which is 17 % smaller than the value we
computed. That difference is likely explained by the non-idealities which we don’t afford for in
this calculation. To compute the expansion pressure for a given geometry, we need to code a
function that will take as an input the mass flow and the exhaust area, and the exhaust pressure
and root find over it.
[16]: def reversibleConvergingNozzle(gas,pe,chem):
h0=gas.enthalpy_mass
gas.SP=gas.entropy_mass,pe
if chem == 1:
gas.equilibrate(‘SP’,rtol=1e-6,maxiter=5000)
30
V=(2*(h0-gas.enthalpy_mass))**(1/2)
return gas,V
def expansionPressure(pe,gas,mdot,Ae,chem):
T,p,Y=gas.TPY
gas,V=reversibleConvergingNozzle(gas,pe,chem)
mdotCalc=gas.density*Ae*V
res=mdot-mdotCalc
gas.TPY=T,p,Y
return res
mixture.TPY=T0,p0,Y0
mixture.equilibrate(‘HP’)
chem=0
sol=root(expansionPressure,1e5,args=(mixture,mdot,A_nozzleSE,chem))
pe=sol[‘x’]
print(‘The expansion pressure computed is of %.3f bar which means the plume of␣
,!the exhaust is slightly overexpanded (pressure under the ambient pressure).␣
,!Note that the same computation with the area slightly lower suggested by the␣
,!SpaceX value yield a pressure around 0.8 bar.’ % (pe/1e5))
The expansion pressure computed is of 0.580 bar which means the plume of the
exhaust is slightly overexpanded (pressure under the ambient pressure). Note
that the same computation with the area slightly lower suggested by the SpaceX
value yield a pressure around 0.8 bar.
The engine, could there have been designed to be adapted at sea level and the discrepancy being
explained by the fact that we don’t account for non-idealities in our calculations. Note that we can
check the consistency of the results by computing the thrust again.
[17]: mixture.TPY=T0,p0,Y0
mixture.equilibrate(‘HP’)
gas,V=reversibleConvergingNozzle(mixture,pe,chem)
pa=1e5
F=mdot*V+A_nozzleSE*(pe-pa)
print(‘The thrust computed is of %.2f kN under frozen chemistry assumption.’ %␣
,!(F/1e3))
The thrust computed is of 890.63 kN under frozen chemistry assumption.
The thrust computed is 5.1 % higher (890.63 kN) than the values given by the manufacturer. Now
let us look at the evolution of the performances along the first stage trajectory. The trajectory
is imported and reported below. The main engine cut-off is at 142 s on this launch because the
booster was recovered, note that for launch when the booster is deliberately not recovered, the
burn duration can be slightly longer with engine throttled down. The total fuel capacity of the
booster allows for a burn duration at full throttle of 149.4 s Using the atmosphere model toolbox
introduced in Topic 7 we can thus derive the pressure as a function of the burn time.
31
[18]: f=open(“SAOCOM_1A.txt”, “r”)
rawData=f.read()
data=rawData.split(“n”)
parsedData=[]
for line in data:
lineS=line.split(“t”)
valS=[]
for val in lineS:
valS.append(float(val))
parsedData.append(valS)
trajectory=np.transpose(np.array(parsedData))
from fluids import atmosphere
pAltitude=[]
for altitude in trajectory[2]:
properties = atmosphere.ATMOSPHERE_1976(altitude*1e3)
pAltitude.append(properties.P/1e5)
fig, ax1 = plt.subplots(1,1,figsize=(10,5))
ax1.plot(trajectory[0],trajectory[2])
ax1.plot([142,142],[0,140])
ax1.set_ylim([0,140])
ax1.set_xlim([0,500])
ax1.set_xlabel(‘Time (s)’, fontsize=16)
ax1.set_ylabel(‘Altitude (km)’, fontsize=16)
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color = ‘tab:red’
ax2.set_ylabel(‘Ambient pressure (bar)’, color=color, fontsize=16) # we already␣
,!handled the x-label with ax1
ax2.plot(trajectory[0],pAltitude, color=color)
ax2.tick_params(axis=’y’, labelcolor=color, labelsize=14)
plt.show()
—————————————————————————
FileNotFoundError Traceback (most recent call last)
<ipython-input-18-02e8a472320b> in <module>
—-> 1 f=open(“SAOCOM_1A.txt”, “r”)
2 rawData=f.read()
3 data=rawData.split(“n”)
4 parsedData=[]
5 for line in data:
32
FileNotFoundError: [Errno 2] No such file or directory: ‘SAOCOM_1A.txt’
[ ]: from IPython.lib.display import YouTubeVideo
YouTubeVideo(‘vr_C6LQ7mHc’)
We can then compute the variation of thrust along the trajectory which is rather straightforward.
[ ]: endBurn=4255
FSet=[]
for pa in pAltitude[:endBurn]:
F=mdot*V+A_nozzleSE*(pe-pa*1e5)
FSet.append(F)
[ ]: fig, ax1 = plt.subplots(1,1,figsize=(10,5))
ax1.plot(trajectory[0],trajectory[2])
ax1.plot([142,142],[0,140])
ax1.set_ylim([0,140])
ax1.set_xlim([0,500])
ax1.set_xlabel(‘Time (s)’, fontsize=16)
ax1.set_ylabel(‘Altitude (km)’, fontsize=16)
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color=’tab:red’
ax2.set_ylabel(‘Thrust (kN)’, color=color, fontsize=16) # we already handled␣
,!the x-label with ax1
ax2.plot(trajectory[0][:endBurn],np.multiply(FSet,1/1e3), color=color)
ax2.tick_params(axis=’y’, labelcolor=color, labelsize=14)
plt.show()
Exercise
Compute the variation of nozzle exhaust section so that the engine nozzle would be adapted all
the way through the engine burn. Through the trajectory, compute the ratio between the actual
thrust and the theoretical thrust the engine could achieve if the nozzle was adapted.
The exhaust velocity is dependent on the engine geometry which is constant over the burn (if the
engine is not throttled). Thus, thrust increases with altitude as the pressure term decreases. On
this engine, the difference in thrust between sea level and vacuum is 10%. Note that the engine
specific thrust although it increases, is not optimal by design and could be increase for instance if
the area was to be increase for the pressure to be lowered as the vehicle altitude increase and the
outside pressure decreases. The recording of trajectory also provides the velocity of the vehicle.
We can finally compute the variation of propulsion efficiency and the overall efficiency of the
engine as a function of the flight duration.
33
[ ]: #calculation of internal efficiency
mixture.TPY=T0,p0,Y0
mixture.equilibrate(‘HP’)
h0=mixture.enthalpy_mass
mixture.TP=T0,p0
h1=mixture.enthalpy_mass
drh=-(h1-h0)
etaInt=0.5*V**2/drh
print(‘The internal efficiency of the Merlin 1D is constant and of %.1f %% under␣
,!frozen chemistry assumption.’ % (etaInt*1e2))
etaPropSet=[]
for ii,pa in enumerate(pAltitude[:endBurn]):
V_vehicle=trajectory[1][ii]
P_vehicle=FSet[ii]*V_vehicle
P_residual=0.5*(V-V_vehicle)**2
etaProp=P_vehicle/(P_vehicle+P_residual)
etaPropSet.append(etaProp)
[ ]: fig, ax1 = plt.subplots(1,1,figsize=(10,5))
ax1.plot(trajectory[0],trajectory[1])
ax1.set_xlim([-5,150])
ax1.set_xlabel(‘Time (s)’, fontsize=16)
ax1.set_ylabel(‘Velocity (m/s)’, fontsize=16)
ax1.tick_params(axis=’y’, labelsize=12)
ax1.tick_params(axis=’x’, labelsize=12)
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color=’tab:red’
ax2.set_ylabel(‘Overall efficiency (%)’, color=color, fontsize=16) # we already␣
,!handled the x-label with ax1
ax2.plot(trajectory[0][:endBurn],np.multiply(etaPropSet,1e2*etaInt), color=color)
ax2.tick_params(axis=’y’, labelcolor=color, labelsize=14)
plt.show()
As the vehicle accelerates, the propulsive efficiency increases to reach a plateau very early in the
ascent. Around 20 s the increase drastically decreases and then plateau. Although their specific
impulses is really low, rockets uses the fuel in a very efficiency manner. The reason behind rockets
having low specific impulses is that the oxidizer must be carried in the vehicle. This makes the design of air-breathing rocket engines attractive, as the evolution in the dense atmosphere, basically
the first 100 s, where the thrust need is the highest could be done at Isp closer to that of a turbojet
(in the thousands of seconds).
Before wrapping up the Topic 9 we will address in a final part the first cut design calculations of
the turbopumps.
34
5 Analysis of a turbopump and engine architectures
Beside the combustion chamber, one of the most critical part in making a rocket is to achieve
the massive mass flow required to feed the combustion chamber and achieve the required thrust.
Turbopumps is a turbomachines where the pump is entrained by a turbine. The turbine is fed by
a dedicated combustion chamber. There are many different turbopumps architectures existing in
the literature. The objective of this subsection is to show that with all the tools provided during
this course, the calculation of the evolution of the fluids through the entire engine is possible.
Figure 5 Example of turbopump integration. Single turbine driving both fuel and oxidizer. The
turbine is fed by a pre-burner running of a rich combustion. All burnt gases are injected into the
combustion chamber.
In this one we will focus the calculation on an engine with a single turbopump, 1+2+3 on Figure
5, driving both the liquid oxygen pump, 3 on Figure 5, and the fuel (liquid methane pump), 1 on
Figure 5. The turbine, 2 on Figure 5, is fed by a rich combustion done in a pre-combustor, 4 on
Figure 5. The combustion products are diluted with the entire fuel flow to drop the temperature
lower so that the thermal stress on the turbine blade is reduced. All burnt gases are mixed with
the fuel flow and injected into the combustion chamber, 7 on Figure 5. Let us assume that both
fuel and oxidiser are compressed up to the same pressure and that the pressure drops through
the pipes, manifolds and injectors until the combustion chamber, is roughly 300 bar. First let us
assume that the oxygen and methane are both stored at a pressure of 3 bar at liquid saturation.
Let’s consider specification similar to SpaceX LOX/LCH4 Raptor engine. The thrust is 2200 kN,
the sea level I
sp is 330 s hence the total mass flow is 680 kg/s. The mixture ratio is 3.55 so that the
total flow of methane is 150 kg/s and the total flow of oxygen is 530 kg/s. The chamber pressure
is 300 bar. We will assume that the compressions in the turbopumps and the expansion in the
turbine are isentropic.
35
[ ]: LO2 = ct.Oxygen()
LCH4 = ct.Methane()
p0=3e5
pcomp=600e5
mdot=[0,0]
mdot[0]=150 # kg/s
mdot[1]=530 # kg/s
LO2.PX=p0,0
LCH4.PX=p0,0
h0=[0,0]
workCompressionSpec=[0,0]
h0[0]=LO2.enthalpy_mass
h0[1]=LCH4.enthalpy_mass
LO2.SP=LO2.entropy_mass,pcomp
LCH4.SP=LCH4.entropy_mass,pcomp
workCompressionSpec[0]=LO2.enthalpy_mass-h0[0] # specific work required for the␣
,!compression of the liquid oxygen
workCompressionSpec[1]=LCH4.enthalpy_mass-h0[1] # specific work required for the␣
,!compression of the liquid methane
totalCompressionPower=mdot[0]*workCompressionSpec[0]+mdot[1]*workCompressionSpec[1]
print(‘The total power required for compression of the total mass flow is %.2f␣
,!MW.’ % (totalCompressionPower/1e6))
Hence assuming there is no transmission loss on the axis, the power required in the turbine is
83.95 MW. The flow going through the turbine is the sum of the total fuel mass flow and of the
small oxygen amount required to sustain combustion.
m˙ = m˙ ox,6 + m˙ pre-comb,7
The pre-combustor mass flow is

pre-comb,7 = m˙ ox,5 + m˙ f uel = m˙ ox,5 + m˙ f uel,comb + m˙ f uel,dilution
We will adjust the mass flow burning through the pre-combustion chamber so that the power output of the turbine is equal to that required for compression. We will assume that the combustion
in the pre-combustor happens at the stoechiometry and is then rapidly diluted with fuel. So that
the total mass flow through the pre-combustor reads

pre-comb,7 = m˙ ox,5 + m˙ f uel = m˙ comb + m˙ f uel,dilution
With
m˙ comb = (1 + 1
4) · m˙ ox,5
Note that the compressed liquid methane will boil through the pre-combustor. Let us compute
the methane enthalpy of evaporation to bring it to 300K.
36
[ ]: hLiq=LCH4.enthalpy_mass
LCH4.TP=300,pcomp
hVap=LCH4.enthalpy_mass
dHvap=hVap-hLiq
We will now create a function to determine the fraction of the flow going through the precombustor that must burns so that the turbopumps can operate at steady state.
[ ]: T0=300
pcc=300e5
X0=’CH4:1;O2:2′
mixture.TPX=T0,pcomp,X0
mixture.equilibrate(‘HP’)
fuel=ct.Solution(‘gri30_highT.cti’)
hComb=mixture.enthalpy_mass
# mixing the fuel flow with the combustion products
Y=mixture.Y
Ydiluted=[]
X0=’CH4:1′
mixture.TPX=T0,pcomp,X0
hDilution=mixture.enthalpy_mass
Ydilution=mixture.Y
def determinePreCombFlow(mdotComb,gas,totalCompressionPower,dHvap):
Ydiluted=[]
totalFlow=mdotComb+mdot[0]-mdotComb/5 # total flow going through the␣
,!pre-combustor
for yy,sY in enumerate(Y): # mixing of burn products and fuel flow
Ydiluted.append((mdotComb*Y[yy]+(mdot[0]-mdotComb/4)*Ydilution[yy])/
,!totalFlow) # in composition
Hdiluted=(mdotComb*(hComb-dHvap)+(mdot[0]-mdotComb/4)*(hDilution-dHvap))/
,!totalFlow # and enthalpy accounting for the methane flow evaporation
mixture.HPY=Hdiluted,pcomp,Ydiluted
h0=mixture.enthalpy_mass
mixture.SP=mixture.entropy_mass,pcc # isentropic expansion in the turbine
h1=mixture.enthalpy_mass
turbinePower=(h0-h1)*totalFlow
res=totalCompressionPower-turbinePower
return(res)
sol = root(determinePreCombFlow,[5],args=(gas,totalCompressionPower,dHvap))
TturbineInlet = mixture.T
mdotCombTotal=sol[‘x’]
mdotCombOx=mdotCombTotal*4/5
mdotCombMethane=mdotCombTotal*1/5
37
print(‘The total mass flow that burns through the pre-combustion chamber is %.1f␣
,!kg/s.’ % (mdotCombTotal))
print(‘The mass flow of oxygen that burns through the pre-combustion chamber is␣
,!%.1f kg/s, %.1f %% of the total oxygen flow. ‘ % (mdotCombOx,mdotCombOx/
,!mdot[1]*100))
print(‘The mass flow of methane that burns through the pre-combustion chamber is␣
,!%.1f kg/s, %.1f %% of the total methane flow. ‘ %␣
,!(mdotCombMethane,mdotCombMethane/mdot[0]*100))
print(‘The turbine inlet temperature is %.0f K.’ % (TturbineInlet))
Under the assumption we provided, roughly 12 % of the propellant flow is burnt in the combustion chamber. Note that in many engines the fuel is also used to cooldown the combustion
chamber so that it might even enter the pre-combustor in a prevaporized state meaning that less
propellant is required to burn in the pre-combustor to obtain the same work output on the turbine.
To go further
By mixing the pre-combustor exhaust with the main flow of liquid oxygen coming from the turbopump, compute the adiabatic combustion temperature in the main combustion chamber. Deduce the throat diameter and performance of the engine for an adapted nozzle.
6 Conclusion
In the Topic 9 we have learn how to implement the first cut calculation for the performances of a
rocket engine focusing on chemical liquid fuelled ones. The key parameters introduced are that
featured in the literature to describe most engines such as the thrust, F, specific thrust,fs, specific
impulse, Isp, and internal and propulsive efficiencies. We then look at the details of calculation
of the combustion applying what was learnt in Topic 6. The combustion products are expanded
through the nozzle and we discussed in details the implication of the evolution of the chemistry
during the expansion and how it affects the engine performances. We also discussed how to relate
the thermodynamic along the nozzle, to key properties such as mass flow rate and throat and
nozzle sizes. We then discussed the effect on performances, of varying the fuel and of the flight
trajectory. Finally, we gave an example of calculation of the thermodynamic sizing of a turbopump
integrated into the engine cycle.
38
Exercises
A simple engine to “test the water”
You are tasked with designing an engine with a thrust at sea level of 1000 kN with an adapted
nozzle. The engine will run with LOX and LCH4 at a chamber pressure of 250 bar.
1. Compute the required mass flow to generate the required thrust depending on the equivalence ratio of the combustion.
2. Compute the respective Isp at sea level
3. Compute the size of the engines at the throat and the dimension of the nozzle (expansion
ratio and diameter).
Recall the expression of thrust
F = m˙ · Ve
F = m˙ · Ve(MR, pe)
F = m˙ · Ve(MR, pe = pa = 1 bar)
[10]: import cantera as ct
import numpy as np
mixture=ct.Solution(‘gri30_highT.cti’)
p0=250e5
T0=300
pa=1e5
pe=1e5
F=1000*1e3
# CH4 + 2O2 -> 1CO2 + 2H2O
# MRst = 32*2/(1*(12+4)) = 32/16*2 = 4
LO2 = ct.Oxygen()
LCH4 = ct.Methane()
p0=3e5
LO2.PX=p0,0
LCH4.PX=p0,0
hLiq=LCH4.enthalpy_mass
LCH4.TP=300,p0
hVap=LCH4.enthalpy_mass
dHvapCH4=hVap-hLiq
hLiq=LO2.enthalpy_mass
LO2.TP=300,p0
hVap=LO2.enthalpy_mass
dHvapO2=hVap-hLiq
39
def reversibleConvergingNozzle(gas,pe,chem):
h0=gas.enthalpy_mass
gas.SP=gas.entropy_mass,pe
if chem == 1:
gas.equilibrate(‘SP’,rtol=1e-6,maxiter=5000)
V=(2*(h0-gas.enthalpy_mass))**(1/2)
return gas,V
expansionSolutions=
“FC”:
“chem”:0
,
“SE”:
“chem”:1

ER_set=np.linspace(0.4,2,50)
for hypothesis in expansionSolutions:
VSet=[]
MSet=[]
TSet=[]
rhoSet=[]
specThrustSet=[]
ispSet=[]
mdotSet=[]
for ER in ER_set:
X0=’CH4:’+ str(ER) + ‘,O2:2’ # mixture ratio stochio = 4
mixture.TPY=T0,p0,X0
mixture.equilibrate(‘HP’)
chem=expansionSolutions[hypothesis][‘chem’]
mixture,V=reversibleConvergingNozzle(mixture,pe,chem=chem)
specThrust=V+1/(mixture.density*V)*(pe-pa)
VSet.append(V)
rhoSet.append(mixture.density)
specThrustSet.append(specThrust)
isp=specThrust/9.81
ispSet.append(isp)
mdot=F/V
mdotSet.append(mdot)
expansionSolutions[hypothesis].update(“velocity”:VSet)
expansionSolutions[hypothesis].update(“isp”:ispSet)
expansionSolutions[hypothesis].update(“density”:rhoSet)
expansionSolutions[hypothesis].update(“mdot”:mdotSet)
40
[13]: import matplotlib.pyplot as plt
plt.plot(ER_set,expansionSolutions[‘FC’][‘mdot’],label=’FC’)
plt.plot(ER_set,expansionSolutions[‘SE’][‘mdot’],label=’SE’)
plt.xlabel(‘Equivalence ratio [-]’)
plt.ylabel(‘Mass flow (kg/s)’)
plt.legend()
plt.show()
Turbocharge the flow
Considering the same engine as before, you are now tasked to compute the thermodynamic parameters of the turbopumps. The architecture is two driving both the LOX and LCH4 pumps as
seen on Figure 6 below. The propellants will be stored at saturated liquid pressurised at 3 bar
in their respective tanks. The output pressure of the pumps is 500 bar for both propellants. The
pre-combustor of the oxygen pump operates in lean conditions and the main oxygen flow is going
through it, the outflow is injected inside the main combustion chamber. The pre-combustor of the
methane pump operates in rich conditions and the main methane flow is going through it, the
outflow is injected inside the main combustion chamber.
41
Figure 6 Double turbine (2 and 3) driving each their own pump (1 and 2). Both turbines are fed by
a pre-burner (5 and 6) running of respectively lean and rich combustion. All burnt gases are from
both pre-burners are injected into the combustion chamber.
For a given mixture ratio which you’ll chose and justify:
1. Compute the required power required on each pump to generate the required mass flow
and compression.
2. Compute the side flow required to achieve the required power output on each turbine.
3. Compute the new size of the engine considering the pressure chamber is still the same and
its associated new performances at sea level considering the nozzle is still adapted.
Pressure and engine size
Given a certain mass flow, the pressure in the chamber will affect the size of the throat therefore
the size of the nozzle. On the same engine as above, as a function of the chamber pressure, derive
the dependency of the nozzle expansion ratio (area of the end of nozzle divided by the area of the
throat). Discuss the effect on the design.
42

WhatsApp
Hello! Need help with your assignments?

For faster services, inquiry about  new assignments submission or  follow ups on your assignments please text us/call us on +1 (251) 265-5102

GRAB 30% OFF YOUR ORDER

X
GET YOUR PAPER DONE