.. models 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. .. code-block:: python 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) .. raw:: html
Parameters
.. _ref_to_geom_image: .. image:: ./_static/chamber_geometry.jpg :width: 69% 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. .. code-block:: python 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) .. image:: ./_static/ssme_geom.png Efficiencies ------------ The various efficiencies that apply to a liquid propellant thruster are discussed at :ref:`JANNAF Standard ` and :ref:`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. .. code-block:: python 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. .. code-block:: python 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. .. code-block:: python ............................ 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 .. code-block:: python 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... .. raw:: html
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). .. code-block:: python 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 ------------- .. code-block:: python 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. .. image:: ./_static/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. .. _ref_to_RocketThruster: 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 :ref:`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. .. code-block:: python 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) .. raw:: html
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). .. literalinclude:: ./_static/example_scripts/thruster_only.py The resulting summary print is: .. literalinclude:: ./_static/example_scripts/thruster_only.out .. _ref_to_Injector: 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. .. raw:: html
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