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)

_images/chamber_geometry.jpg

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)
_images/ssme_geom.png

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.

_images/entrained_ffc.jpg

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