Models¶
In RocketIsp there are 5 objects that work together to model a liquid propellant rocket thruster:
1) Geometry - Holds all the major thrust chamber geometry values
2) Efficiencies - Holds all of the thrust chamber efficiencies
3) CoreStream - Models combustion gas stream tubes (both core and barrier)
4) Injector - Models injector physical features and calculates injector efficiencies
5) RocketThruster - Models the overall thruster Isp, thrust, mixture ratio, etc.
Note
The Injector object is often omitted from an analysis when the details of the injector are not known. Simply assuming an injector efficiency of 98 or 99 percent is usually representative of a modern injector.
Geometry¶
The Geometry object holds all the major thrust chamber geometry values. The code snippet below shows how to create a Geometry object, and the definition of all the parameters.
See the diagram below the parameter definitions for the physical location of the parameters on the thruster.
Note
Note that many of the parameters are dimensionless, such that if the throat radius (Rthrt) is changed, the rest of the geometry will scale appropriately.
from rocketisp.geometry import Geometry
G = Geometry( Rthrt=1, CR=2.5, eps=20, pcentBell=80, LnozInp=None,
RupThroat=1.5, RdwnThroat=1.0, RchmConv=1.0, cham_conv_deg=30,
LchmOvrDt=3.0, LchmMin=1.0, LchamberInp=None)
- Parameters
Rthrt (float) -- in, throat radius
CR (float) -- chamber contraction ratio (Ainj / Athroat)
eps (float) -- nozzle area ratio (Aexit / Athroat)
pcentBell (float) -- nozzle percent bell (Lnoz / L_15deg_cone)
LnozInp (float) -- in, user input nozzle length (will override pcentBell)
RupThroat (float) -- radius of curvature just upstream of throat (Rupstream / Rthrt)
RdwnThroat (float) -- radius of curvature just downstream of throat (Rdownstream / Rthrt)
RchmConv (float) -- radius of curvature at start of convergent section (Rconv / Rthrt)
cham_conv_deg (float) -- deg, half angle of conical convergent section
LchmOvrDt (float) -- ratio of chamber length to throat diameter (Lcham / Dthrt)
LchmMin (float) -- in, minimum chamber length (will override LchmOvrDt)
LchamberInp (float) -- in, user input value of chamber length (will override all other entries)
The Geometry object can be used in a stand-alone manner to generate a thruster inner profile. The following script will create the image shown below.
from rocketisp.geometry import Geometry
# SSME Geometry
G = Geometry(Rthrt=5.1527, CR=3.0, eps=77.5, LnozInp=121,
RupThroat=1.0, RdwnThroat=0.392, RchmConv=1.73921, cham_conv_deg=25.42,
LchmOvrDt=2.4842/2)
G.plot_geometry( title='SSME Profile', png_name='ssme_geom.png', show_grid=True)
Efficiencies¶
The various efficiencies that apply to a liquid propellant thruster are discussed at JANNAF Standard and Efficiencies.
The Efficiencies object collects and coordinates the individual efficiencies.
It does not calculate any individual efficiencies, however, it does combine all nozzle efficiencies into an overall nozzle efficiency; all chamber efficiencies into an overall chamber efficiency; and it combines the nozzle and chamber efficiencies into an overall Isp efficiency.
If the engine pulses, it also creates an overall pulsing efficiency.
Note
Unless specified otherwise, all efficiencies are set to 1.0
The most simple usage is shown in the python scripts below.
If the user would like to set the nozzle and chamber efficiencies to a constant, the following script can be employed.
from rocketisp.efficiencies import Efficiencies
E = Efficiencies( ERE=0.98, Noz=0.97 )
E.summ_print()
# creates the following output
............................ Efficiencies ............................
........................... Output ..................................
Isp = 0.95060 Overall Isp Efficiency
Noz = 0.97000 (constant) Nozzle Efficiency
ERE = 0.98000 (constant) Energy Release Efficiency of Chamber
......................................................................
Or perhaps simply set an overall Isp efficiency.
from rocketisp.efficiencies import Efficiencies
E = Efficiencies( Isp=0.95 )
E.summ_print()
# creates the following output
............................ Efficiencies ............................
.................... Output .........................................
Isp = 0.95000 (constant) Overall Isp Efficiency
......................................................................
In a more complete analysis, where both the nozzle and injector are fully analyzed, the following output is typical.
............................ Efficiencies ............................
.............................. Output ...............................
Isp = 0.94049 Overall Isp Efficiency
Noz = 0.97699 Nozzle Efficiency
ERE = 0.96264 Energy Release Efficiency of Chamber
..Nozzle..
Div = 0.99100 (simple fit eps=20, %bell=80) Divergence Efficiency of Nozzle
Kin = 0.99175 (MLP fit) Kinetic Efficiency of Nozzle
BL = 0.99406 (MLP fit) Boundary Layer Efficiency of Nozzle
..Chamber..
Mix = 0.99252 (mixAngle=1.73 deg) Inter-Element Mixing Efficiency of Injector
Em = 0.98800 (Rupe elemEm=0.8) Intra-Element Mixing Efficiency of Injector
Vap = 0.98167 (gen vaporized length) Vaporization Efficiency of Injector
......................................................................
........... Ignored Efficiencies ..........
TP: Two Phase Efficiency of Nozzle
HL: Heat Loss Efficiency of Chamber
...........................................
CoreStream¶
The CoreStream object assumes that all efficiencies have been set, either by the user or computed by an efficiency model. It uses those efficiencies along with the Geometry object to calculate overall thrust, Isp and flow rates.
A CoreStream object is created as shown below
C = CoreStream( geomObj=geomObj, effObj=effObj,
oxName='N2O4', fuelName='MMH', MRcore=1.9,
Pc=500, CdThroat=0.995, Pamb=0.0, adjCstarODE=1.0, adjIspIdeal=1.0,
pcentFFC=0.0, ko=0.035, i
The parameters in the CoreStream object are defined as…
- Parameters
geomObj (Geometry) -- Geometry that describes thruster
effObj (Efficiencies) -- Efficiencies object to hold individual efficiencies
oxName (str) -- name of oxidizer (e.g. N2O4, LOX)
fuelName (str) -- name of fuel (e.g. MMH, LH2)
MRcore (float) -- mixture ratio of core flow (ox flow rate / fuel flow rate)
Pc (float) -- psia, chamber pressure
CdThroat (float) -- Cd of throat (RocketThruster object may override if calc_CdThroat is True)
Pamb (float) -- psia, ambient pressure (for example sea level is 14.7 psia)
adjCstarODE (float) -- multiplier on NASA CEA code value of cstar ODE (default is 1.0)
adjIspIdeal (float) -- multiplier on NASA CEA code value of Isp ODE (default is 1.0)
pcentFFC (float) -- percent fuel film cooling (if > 0 then add BarrierStream)
ko (float) -- entrainment constant (passed to BarrierStream object, range from 0.03 to 0.06)
ignore_noz_sep (bool) -- flag to force nozzle flow separation to be ignored (USE WITH CAUTION)
Note
A CoreStream object is seldom used on its own. It is most useful when controlled by a RocketThruster object.
Some simple delivered Isp calculations can be performed with an isolated CoreStream object as shown in the following code, however, a CoreStream object is much more useful when controlled by a RocketThruster object.
In this simple, isolated CoreStream approach, the efficiencies of the chamber and nozzle are fixed values (ERE=0.98, Noz=0.97).
from rocketisp.geometry import Geometry
from rocketisp.efficiencies import Efficiencies
from rocketisp.stream_tubes import CoreStream
C = CoreStream( geomObj=Geometry(eps=35),
effObj=Efficiencies(ERE=0.98, Noz=0.97),
oxName='LOX', fuelName='CH4', MRcore=3.6,
Pc=500, Pamb=14.7)
for name in ['IspODE','IspDel','IspODF']:
print( '%8s ='%name, '%.1f'%C(name) )
print('%8s ='%'IspAmb','%.1f'%C('IspAmb'), C('noz_mode'))
# ----------- outputs ------------
IspODE = 363.2
IspDel = 345.3
IspODF = 334.2
IspAmb = 325.1 Separated (Psep=4.84056, epsSep=14.4921)
Notice in the above example that the nozzle will have separated flow at sea level. RocketIsp expects the nozzle to separate at any area ratio above 14.5:1.
BarrierStream¶
class BarrierStream:
def __init__(self, coreObj, pcentFFC=10.0, ko=0.035):
If fuel film cooling (FFC) has been specified with the CoreStream pcentFFC input, then a BarrierStream object is created automatically in order to calculate overall thruster mixture ratio, Isp and wall gas temperature. Engines that use ablative or radiation cooled chambers use FFC in order to achieve longer hardware lifetimes (although in some uncommon situations, short hardware lifetimes might be appropriate).
The mixture ratio of the barrier will be calculated as a mixture of the entrained core flow with the fuel film cooling flow. (In the MRbarrier equation below, wdot is flow rate.)
The engine delivered Isp will be the mass-averaged Isp values of the core and barrier flow rates.
The overall thruster MR will be less than MRcore… MRthruster = MRcore * (1 - %FFC/100)
The calculation of entrained core gases, comes from Combustion effects on film cooling, NASA-CR-135052. That model assumes two stream tubes, as shown in the illustration above, and uses the input, ko (typical range from 0.03 to 0.06) as the main input affecting entrainment.
As a general first estimate of ko, the default value of 0.035 is a good starting point. Note that Combustion effects on film cooling, NASA-CR-135052 recommends using test data to determine the best value.
RocketThruster¶
The RocketIsp object coordinates the Geometry, Efficiencies, CoreStream and Injector objects.
It does so in order to calculate delivered Isp for liquid rocket thrust chambers by the simplified JANNAF Standard method.
A RocketThruster object is created as shown below. Note that a CoreStream object and, optionally, an Injector object are part of the input.
R = RocketThruster(name='Rocket Thruster',
coreObj=CoreStream(), injObj=None, noz_regen_eps=1.0,
pulse_sec=float('inf'), pulse_quality=0.8,
isRegenCham=0, calc_CdThroat=True)
- Parameters
coreObj (CoreStream) -- CoreStream object
injObj (Injector) -- Injector object (optional)
noz_regen_eps (float) -- regen cooled nozzle area ratio
pulse_sec (float) -- duration of pulsing engine (default = infinity)
pulse_quality (float) -- on a scale of 0.0 to 1.0, how good is engine at pulsing
isRegenCham (bool) -- flag to indicate chamber is regen cooled
calc_CdThroat (bool) -- flag to trigger calc_CdThroat
A typical usage might look something like the following.
To rough out a 6000 lbf LOX/LH2 space engine. Let RocketThruster calculate the nozzle losses, but input a constant 99% for the chamber efficiency.
Use the method scale_Rt_to_Thrust in order to scale the geometry to give 6000 lbf of vacuum thrust (i.e. Pamb=0.0).
from rocketisp.geometry import Geometry
from rocketisp.efficiencies import Efficiencies
from rocketisp.stream_tubes import CoreStream
from rocketisp.rocket_isp import RocketThruster
C = CoreStream( geomObj=Geometry(eps=35),
effObj=Efficiencies(ERE=0.99),
oxName='LOX', fuelName='LH2', MRcore=6,
Pc=500, Pamb=0)
R = RocketThruster(name='Example 6K Thruster', coreObj=C)
R.scale_Rt_to_Thrust( 6000 , Pamb=0.0 )
R.summ_print()
The resulting summary print is:
============================== Example 6K Thruster ==============================
................................. Geometry .................................
.................................. Input ..................................
cham_conv_deg = 30.00 deg half angle of conical convergent section
CR = 2.5 chamber contraction ratio (Ainj / Athroat)
eps = 35 nozzle area ratio (Aexit / Athroat)
LchamberInp = None in user input value of chamber length (will override all other entries)
LchmMin = 1.000 in minimum chamber length (will override LchmOvrDt)
(2.540 cm, 0.083 ft)
LchmOvrDt = 3 ratio of chamber length to throat diameter (Lcham / Dthrt)
LnozInp = None in user input nozzle length (will override pcentBell)
pcentBell = 80 nozzle percent bell (Lnoz / L_15deg_cone)
RchmConv = 1 radius of curvature at start of convergent section (Rconv / Rthrt)
RdwnThroat = 1 radius of curvature just downstream of throat (Rdownstream / Rthrt)
Rthrt = 1.434 in throat radius
(3.643 cm, 0.120 ft)
RupThroat = 1.5 radius of curvature just upstream of throat (Rupstream / Rthrt)
............................................................................
............................... Output ....................................
Ainj = 16.153 in**2 area of injector
(104.211 cm**2)
At = 6.461 in**2 throat area
(41.684 cm**2)
Dexit = 16.968 in nozzle exit diameter
(43.100 cm, 1.414 ft)
Dinj = 4.535 in diameter of injector
(11.519 cm, 0.378 ft)
Dthrt = 2.868 in throat diameter
(7.285 cm, 0.239 ft)
entrance_angle = 33.39 deg nozzle initial expansion angle
exit_angle = 8.00 deg nozzle exit angle
Lcham_conv = 2.404 in length of convergent section of chamber
(6.107 cm, 0.200 ft)
Lcham_cyl = 6.200 in length of cylindrical section of chamber
(15.749 cm, 0.517 ft)
Lnoz = 21.049 in nozzle length
(53.465 cm, 1.754 ft)
Ltotal = 29.654 in nozzle + chamber length
(75.320 cm, 2.471 ft)
Rinj = 2.268 in radius of injector
(5.759 cm, 0.189 ft)
Vcham = 126.5 in**3 approximate chamber volume
(2072.4 cm**3)
............................................................................
......................... LOX/LH2 Core Stream Tube .........................
.................................. Input ..................................
adjCstarODE = 1 multiplier on NASA CEA code value of cstar ODE (default is 1.0)
adjIspIdeal = 1 multiplier on NASA CEA code value of Isp ODE (default is 1.0)
CdThroat = 0.990388 Cd of throat (RocketThruster object may override)
((MLP fit))
fuelName = LH2 name of fuel (e.g. MMH, LH2)
ignore_noz_sep = 0 flag to force nozzle flow separation to be ignored (USE WITH CAUTION)
MRcore = 6 mixture ratio of core flow (ox flow rate / fuel flow rate)
oxName = LOX name of oxidizer (e.g. N2O4, LOX)
Pamb = 0.00 psia ambient pressure (for example sea level is 14.7 psia)
(0.00 MPa, 0.00 atm, 0.00 bar)
Pc = 500.0 psia chamber pressure
(3.45 MPa, 34.02 atm, 34.47 bar)
............................................................................
............................... Output ....................................
CfAmbDel = 1.85727 delivered ambient thrust coefficient
CfVacDel = 1.85727 delivered vacuum thrust coefficient
CfVacIdeal = 1.91778 ideal vacuum thrust coefficient
cstarERE = 7440.2 ft/s delivered core cstar
(2267.8 m/s)
cstarODE = 7515.4 ft/s core ideal cstar
(2290.7 m/s)
FvacCore = 6000.0 lbf vacuum thrust due to core stream tube
(26689.3 N)
FvacTotal = 6000.0 lbf total vacuum thrust
(26689.3 N)
gammaChm = 1.13551 core gas ratio of specific heats (Cp/Cv)
IspDel = 433.66 sec <=== thruster delivered vacuum Isp ===>
(4252.77 N-sec/kg, 4.25 km/sec)
IspDel_core = 433.66 sec delivered Isp of core stream tube
(4252.77 N-sec/kg, 4.25 km/sec)
IspODE = 447.97 sec core one dimensional equilibrium Isp
(4393.04 N-sec/kg, 4.39 km/sec)
IspODF = 423.77 sec core frozen Isp
(4155.72 N-sec/kg, 4.16 km/sec)
IspODK = 444.57 sec core one dimensional kinetic Isp
(4359.73 N-sec/kg, 4.36 km/sec)
MRthruster = 6 total thruster mixture ratio')
MWchm = 13.354 g/gmole core gas molecular weight
Pexit = 1.3238 psia nozzle exit pressure
(0.01 MPa, 0.09 atm, 0.09 bar)
TcODE = 6129.2 degR ideal core gas temperature
(3405.1 degK, 3132.0 degC, 5669.5 degF)
wdotFl = 1.977 lbm/s total fuel flow rate
(0.897 kg/s)
wdotOx = 11.859 lbm/s total oxidizer flow rate
(5.379 kg/s)
wdotTot = 13.836 lbm/s total propellant flow rate (ox+fuel)
(6.276 kg/s)
............................................................................
Efficiencies
Output
Isp = 0.96807 Overall Isp Efficiency
Noz = 0.97785 Nozzle Efficiency
ERE = 0.99000 (constant) Energy Release Efficiency of Chamber
..Nozzle..
Div = 0.99237 (simple fit eps=35, %bell=80) Divergence Efficiency of Nozzle
Kin = 0.99242 (MLP fit) Kinetic Efficiency of Nozzle
BL = 0.99290 (MLP fit) Boundary Layer Efficiency of Nozzle
Ignored Efficiencies
TP: Two Phase Efficiency of Nozzle
Injector¶
The Injector object is more complex than the other 4 main objects (Geometry, Efficiencies, CoreStream and RocketThruster). Choices made for the Injector affect feed system pressures and pressure drops, chamber acoustics, combustion stability, size and type of injector elements, injection velocities and the combustor efficiencies for vaporization and propellant mixing within an element as well as between elements.
Note that the Injector object uses the companion project RocketProps to calculate oxidizer and fuel fluid properties based on the inlet propellant temperatures(Tox and Tfuel) as well as the pressure taken from the CoreStream object.
- Parameters
coreObj (CoreStream) -- CoreStream object
Tox (float) -- degR, temperature of oxidizer
Tfuel (float) -- degR, temperature of fuel
elemEm (float) -- intra-element Rupe mixing factor
fdPinjOx (float) -- fraction of Pc used as oxidizer injector pressure drop
fdPinjFuel (float) -- fraction of Pc used as fuel injector pressure drop
dpOxInp (None or float) -- input value of injector pressure drop for oxidizer (overrides fdPinjOx)
dpFuelInp (None or float) -- input value of injector pressure drop for fuel (overrides fdPinjFuel)
setNelementsBy (str) -- flag determines how to calculate number of elements ( "acoustics", "elem_density", "input")
elemDensInp (float) -- elem/in**2, input value for element density (setNelementsBy == "elem_density")
NelementsInp (float) -- input value for number of elements (setNelementsBy == "input")
OxOrfPerEl (float) -- number of oxidizer orifices per element
FuelOrfPerEl (float) -- number of fuel orifices per element
lolFuelElem (bool) -- flag for like-on-like fuel element (determines strouhal multiplier)
setAcousticFreqBy (str) -- flag indicating how to determnine design frequency. (can be "mode" or "freq")
desAcousMode (str or float) -- driving acoustic mode of injector OR acoustic mode multiplier (setNelementsBy=="acoustics" and setAcousticFreqBy=="mode")
desFreqInp (None or float) -- Hz, driving acoustic frequency of injector (sets D/V if setNelementsBy=="acoustics" and setAcousticFreqBy=="freq")
CdOxOrf (float) -- flow coefficient of oxidizer orifices
CdFuelOrf (float) -- flow coefficient of fuel orifices
dropCorrOx (float) -- oxidizer drop size multiplier
dropCorrFuel (float) -- fuel drop size multiplier
pcentFFC (float) -- percent fuel film cooling ( FFC flowrate / total fuel flowrate)
DorfMin (float) -- in, minimum orifice diameter (lower limit)
LfanOvDorfOx (float) -- fan length / oxidizer orifice diameter
LfanOvDorfFuel (float) -- fan length / fuel orifice diameter