Esempio n. 1
0
 def test_limit_chamber_length(self):
     """test limit chamber length"""
     
     # 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, LchmMin=100.0)
     
     G.summ_print()
     self.assertAlmostEqual(G.Lcham, 100, places=1)
Esempio n. 2
0
 def test_check_nozzle_contour(self):
     """test check nozzle contour"""
     # Apollo SPS
     geomObj = Geometry(Rthrt=1,
                CR=2.5, eps=62.5,  pcentBell=75, 
                RupThroat=1.5, RdwnThroat=1.0, RchmConv=1.0, cham_conv_deg=30,
                LchmOvrDt=3.10, LchmMin=2.0, LchamberInp=None)
     
     noz = geomObj.getNozObj()
     noz.plot_geom( do_show=False, save_to_png=False )
     
     self.assertAlmostEqual(noz.angCone, 19.709, places=2)
Esempio n. 3
0
    def test_check_FFC_Isp_values(self):
        """test check FFC Isp values"""

        geomObj = Geometry(Rthrt=1,
                           CR=2.5,
                           eps=62.5,
                           pcentBell=75,
                           RupThroat=1.5,
                           RdwnThroat=1.0,
                           RchmConv=1.0,
                           cham_conv_deg=30,
                           LchmOvrDt=3.10,
                           LchmMin=2.0,
                           LchamberInp=None)

        effObj = Efficiencies()
        effObj.set_const(
            'ERE', 0.98)  # don't know injector details so set effERE=0.98

        # It's an ablative chamber, so some FFC (fuel film cooling) is required... guess about 10%
        C = CoreStream(geomObj=geomObj,
                       effObj=effObj,
                       pcentFFC=10.0,
                       Pamb=0.001,
                       oxName='N2O4',
                       fuelName='A50',
                       MRcore=1.6,
                       Pc=100)

        C.reset_attr('Pc', 100)

        self.assertAlmostEqual(C('IspDel'), 325.64723, places=2)
        self.assertAlmostEqual(C('IspODE'), 338.9201, places=2)
        self.assertAlmostEqual(C('IspODF'), 320.4940, places=2)
Esempio n. 4
0
    def __init__(
            self,
            geomObj=Geometry(),
            effObj=Efficiencies(),  #ERE=0.98, Noz=0.97), 
            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,
            ignore_noz_sep=False):

        self.geomObj = geomObj
        self.effObj = effObj
        self.oxName = oxName
        self.fuelName = fuelName
        self.MRcore = MRcore
        self.Pc = Pc
        self.Pamb = Pamb  # ambient pressure
        self.noz_mode = ''
        self.CdThroat = CdThroat

        self.CdThroat_method = 'default'
        self.ignore_noz_sep = ignore_noz_sep  # ignore any nozzle separation

        self.adjCstarODE = adjCstarODE  # may want to adjust ODE cstar value
        self.adjIspIdeal = adjIspIdeal  # may want to adjust ODE and ODF Isp values

        # make CEA object
        self.ceaObj = CEA_Obj(oxName=oxName, fuelName=fuelName)

        # ... if pcentFFC > 0.0, then there's barrier cooling
        if pcentFFC > 0.0:
            self.add_barrier = True
        else:
            self.add_barrier = False

        # barrier might need some performance parameters from CoreStream
        self.calc_cea_perf_params()

        if self.add_barrier:
            self.barrierObj = BarrierStream(self, pcentFFC=pcentFFC, ko=ko)
        else:
            self.barrierObj = None

        self.evaluate()

        # get input descriptions and units from doc string
        self.inp_descD, self.inp_unitsD, self.is_inputD = get_desc_and_units(
            self.__doc__)
Esempio n. 5
0
    def test_overall_Isp_efficiency(self):
        """test overall Isp efficiency"""

        G = Geometry(Rthrt=5.978,
                     CR=2.5,
                     eps=62.5,
                     pcentBell=75,
                     RupThroat=1.5,
                     RdwnThroat=1.0,
                     RchmConv=1.0,
                     cham_conv_deg=30,
                     LchmOvrDt=3.10,
                     LchmMin=2.0,
                     LchamberInp=None)

        C = CoreStream(geomObj=G,
                       effObj=Efficiencies(ERE=0.98, Noz=0.96515),
                       pcentFFC=10.0,
                       oxName='N2O4',
                       fuelName='A50',
                       MRcore=1.6,
                       Pc=100,
                       Pamb=0.0)

        I = Injector(
            C,
            Tox=None,
            Tfuel=None,
            elemEm=0.8,
            fdPinjOx=0.25,
            fdPinjFuel=0.25,
            dpOxInp=None,
            dpFuelInp=None,
            setNelementsBy=
            'acoustics',  # can be "acoustics", "elem_density", "input"
            elemDensInp=5,
            NelementsInp=100,
            OxOrfPerEl=1.0,
            FuelOrfPerEl=1.0,
            lolFuelElem=True,
            setAcousticFreqBy='mode',  # can be "mode" or "freq"
            desAcousMode='2T',
            desFreqInp=5000,
            CdOxOrf=0.75,
            CdFuelOrf=0.75,
            dropCorrOx=0.33,
            dropCorrFuel=0.33,
            DorfMin=0.008,
            LfanOvDorfOx=20.0,
            LfanOvDorfFuel=20.0)

        self.assertAlmostEqual(I('MolWtOx'), 92.011, places=1)
Esempio n. 6
0
 def __init__(self, name='PI Thruster', geomObj=Geometry(), ERE=0.98,
              oxName='N2O4', fuelName='MMH', MRcore=1.9, Pc=500,
              isRegenCham=0, noz_regen_eps=1.0, calc_CdThroat=True): 
 
     # create a perfect injector CoreStream
     coreObj = CoreStream( geomObj=geomObj, 
                           effObj=Efficiencies(ERE=ERE), 
                           oxName=oxName, fuelName=fuelName, 
                           MRcore=MRcore, Pc=Pc)
     
     self.R = RocketThruster( name=name,
              coreObj=coreObj, injObj=None, 
              isRegenCham=isRegenCham, noz_regen_eps=noz_regen_eps, 
              calc_CdThroat=calc_CdThroat)
Esempio n. 7
0
 def test_SSME_Geometry(self):
     """test SSME 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)
     self.assertAlmostEqual(G.Vcham, 2192.66, places=1)
     self.assertAlmostEqual(G.pcentBell, 80.6341, places=3)
     
     G.plot_geometry(title='Geometry', png_name='', do_show=False, show_grid=True)
     
     G.reset_attr('Rthrt', 2.0)
     self.assertAlmostEqual(G('Rthrt'), 2, places=1)
Esempio n. 8
0
    def test_check_Isp_values(self):
        """test check Isp values"""

        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)

        self.assertAlmostEqual(C('IspAmb'), 251.9288, places=2)
        self.assertAlmostEqual(C('IspDel'), 345.2795, places=2)
        self.assertAlmostEqual(C('IspODE'), 363.2227, places=2)
        self.assertAlmostEqual(C('IspODF'), 334.1623, places=2)

        C.reset_CdThroat(C.CdThroat)
        C.reset_attr('Pamb', C.Pexit + 0.06, re_evaluate=True)
        C.reset_attr('Pamb', C.Pexit, re_evaluate=True)
        C.reset_attr('Pamb', 15, re_evaluate=True)
Esempio n. 9
0
"""
Create an HTML summary page and launch webbrowser to show summary.
"""
import webbrowser
import os

from rocketisp.geometry import Geometry
from rocketisp.efficiencies import Efficiencies
from rocketisp.stream_tubes import CoreStream
from rocketisp.rocket_isp import RocketThruster

# create CoreStream with area ratio=375:1, Pc=137, FFC=30% and effERE=0.99
C = CoreStream(geomObj=Geometry(eps=375),
               effObj=Efficiencies(ERE=0.99),
               pcentFFC=30,
               oxName='N2O4',
               fuelName='N2H4',
               MRcore=1.26,
               Pc=137,
               Pamb=0)

# instantiate RocketThruster
R = RocketThruster(name='100 lbf Aerojet HiPAT R-4D', coreObj=C)

R.scale_Rt_to_Thrust(100, Pamb=0.0)
#R.summ_print()

fsave = 'hipat_at_opt_mr.html'
fOut = open(fsave, 'w')
fOut.write(R.get_html_file_str())
fOut.close()
Esempio n. 10
0
"""
Apollo SPS, Aerojet AJ10-137 (Apollo Service Module Engine)
Create an HTML summary page and launch webbrowser to show it.
"""
import webbrowser
import os
from rocketisp.rocket_isp import RocketThruster
from rocketisp.geometry import Geometry
from rocketisp.stream_tubes import CoreStream
from rocketisp.efficiencies import Efficiencies

# create basic Geometry. 
# Use "place-holder" of 1 inch for throat radius... correct later with "scale_Rt_to_Thrust"
geomObj = Geometry(Rthrt=1,
                   CR=2.5, eps=62.5,  pcentBell=72.3, 
                   RupThroat=1.5, RdwnThroat=1.0, RchmConv=1.0, cham_conv_deg=30,
                   LchmOvrDt=3.10, LchmMin=2.0, LchamberInp=None)
                   
effObj = Efficiencies()
effObj.set_const('ERE', 0.98) # don't know injector details so set effERE=0.98

# It's an ablative chamber, so some FFC (fuel film cooling) is required... guess about 15%
core = CoreStream( geomObj=geomObj, effObj=effObj, pcentFFC=15.0,
                   oxName='N2O4', fuelName='A50',  MRcore=1.6, Pc=100 )
             
R = RocketThruster(name='Apollo SPS',coreObj=core)

# scale geometry to give 20,500 lbf of thrust for current conditions
R.scale_Rt_to_Thrust( 20500 , Pamb=0.0  )

# figure out best mixture ratio to run the engine.
Esempio n. 11
0
def calc_ODE_ODK_FROZ_isp(oxName='N2O4',
                          fuelName='MMH',
                          Pc=1000.0,
                          eps=10.0,
                          pcentBell=80.0,
                          Fvac=1000.0,
                          NumRuns=20,
                          do_show=True):

    # ============ use RocketCEA to find MR range ===================
    mc = MR_Temperature_Limits(oxName=oxName,
                               fuelName=fuelName,
                               PcNominal=Pc,
                               epsNominal=eps)

    mr_peak = MR_Peak_At_EpsPc(
        mc,
        pc=Pc,
        eps=eps,
        ispType='CEAODE',  # ispType can be CEAODE, CEAFROZEN
        NterpSize=100)

    print('Peak IspODE=%g sec at MR =' % mr_peak.ispPeak, mr_peak.mrPeak)
    print()
    print('MR at 97% Isp (on low  side) =',
          mr_peak.calc_mrLow_minus_NPcentIsp())
    print('MR at 97% Isp (on high side) =',
          mr_peak.calc_mrHigh_minus_NPcentIsp())

    mr_lo = round(
        mr_peak.mrLeftOfPeak -
        (mr_peak.mrRightOfPeak - mr_peak.mrLeftOfPeak) / 10.0, 2)
    mr_hi = round(mr_peak.mrRightOfPeak, 2)
    delMR = (mr_hi - mr_lo) / (NumRuns - 1)

    # ===============================

    geomObj = Geometry(Rthrt=5.868 / 2,
                       CR=2.5,
                       eps=eps,
                       pcentBell=pcentBell,
                       RupThroat=1.5,
                       RdwnThroat=1.0,
                       RchmConv=1.0,
                       cham_conv_deg=30,
                       LchmOvrDt=3.10,
                       LchmMin=2.0,
                       LchamberInp=16)

    core = CoreStream(geomObj,
                      oxName=oxName,
                      fuelName=fuelName,
                      MRcore=1.6,
                      Pc=Pc)

    R = RocketThruster(name='sample', coreObj=core, injObj=None)

    ispodeL = []
    ispodkL = []
    ispodfL = []
    mrL = []

    MR = mr_lo
    for _ in range(NumRuns):
        mrL.append(MR)

        core.reset_attr('MRcore', MR, re_evaluate=True)
        R.scale_Rt_to_Thrust(Fvac, Pamb=0.0, use_scipy=False)

        ispodeL.append(R.coreObj.IspODE)
        ispodkL.append(R.coreObj.IspODK)
        ispodfL.append(R.coreObj.IspODF)

        MR += delMR

    # ======= find peaks ======
    mr_ode_terp = InterpProp(mrL, ispodeL)
    mr_ode_Peak, isp_ode_peak = gold_search_max(mr_ode_terp,
                                                mrL[0],
                                                mrL[-1],
                                                tol=1.0e-5)

    mr_odk_terp = InterpProp(mrL, ispodkL)
    mr_odk_Peak, isp_odk_peak = gold_search_max(mr_odk_terp,
                                                mrL[0],
                                                mrL[-1],
                                                tol=1.0e-5)

    mr_odf_terp = InterpProp(mrL, ispodfL)
    mr_odf_Peak, isp_odf_peak = gold_search_max(mr_odf_terp,
                                                mrL[0],
                                                mrL[-1],
                                                tol=1.0e-5)

    fig, ax = plt.subplots(figsize=(8, 6))

    plt.plot(mrL, ispodeL, label='IspODE', color=COLORL[0])
    plt.plot(mrL, ispodkL, label='IspODK', color=COLORL[1])
    plt.plot(mrL, ispodfL, label='IspODF', color=COLORL[2])

    # show  ========= optimum MR difference ========
    def span_mrpeak(isL):
        minpt = min(isL)
        maxpt = max(isL)
        span = maxpt - minpt
        return [maxpt - 0.8 * span, maxpt]

    plt.plot([mr_ode_Peak, mr_ode_Peak],
             span_mrpeak(ispodeL),
             '--',
             label='MRode=%.2f' % mr_ode_Peak,
             linewidth=2,
             color=COLORL[0])
    plt.plot([mr_odk_Peak, mr_odk_Peak],
             span_mrpeak(ispodkL),
             '--',
             label='MRodk=%.2f' % mr_odk_Peak,
             linewidth=2,
             color=COLORL[1])
    plt.plot([mr_odf_Peak, mr_odf_Peak],
             span_mrpeak(ispodfL),
             '--',
             label='MRodf=%.2f' % mr_odf_Peak,
             linewidth=2,
             color=COLORL[2])

    isp_odk_peak = abs(isp_odk_peak)
    plt.text(mr_odk_Peak,
             isp_odk_peak,
             '%i' % int(isp_odk_peak),
             ha='left',
             va='bottom',
             transform=ax.transData,
             color=COLORL[1])

    plt.legend()

    plt.ylabel('Isp (sec)')
    plt.xlabel('Mixture Ratio')

    plt.title( "%s/%s RocketIsp ODE ODK ODF\nFvac=%.0f lbf, Pc=%.0f psia, AR=%.0f:1, %%Bell=%.0f%%"%\
               (oxName, fuelName, Fvac, Pc, eps, pcentBell))

    png_name = 'odekf_%s_%s_Fvac%g_Pc%g_eps%g.png' % (oxName, fuelName, Fvac,
                                                      Pc, eps)
    plt.savefig(png_name, dpi=120)

    if do_show:
        plt.show()
Esempio n. 12
0
        return '\n'.join(sL)


if __name__ == '__main__':
    from rocketisp.geometry import Geometry

    from rocketisp.injector import Injector
    from rocketisp.efficiencies import Efficiencies

    geomObj = Geometry(Rthrt=5.868 / 2,
                       CR=2.5,
                       eps=150,
                       pcentBell=80,
                       RupThroat=1.5,
                       RdwnThroat=1.0,
                       RchmConv=1.0,
                       cham_conv_deg=30,
                       LchmOvrDt=3.10,
                       LchmMin=2.0,
                       LchamberInp=16)

    effObj = Efficiencies()
    #effObj.set_const('ERE', 0.98)

    core = CoreStream(geomObj,
                      effObj,
                      oxName='N2O4',
                      fuelName='MMH',
                      MRcore=1.85,
                      Pc=150,
Esempio n. 13
0
wdotOx = xxx  # lbm/sec

cstarEff = xxx
cstar = xxx  # ft/sec
Isp = 421  # sec
IspSL = 200  # sec
cstarODE = xxx / 12.0  # ft/sec
eps = 25
CR = 2.5

geomObj = Geometry(Rthrt=Rthrt,
                   CR=CR,
                   eps=eps,
                   pcentBell=80,
                   RupThroat=1.0,
                   RdwnThroat=0.392,
                   RchmConv=1.5,
                   cham_conv_deg=30,
                   LchmOvrDt=2.5,
                   LchmMin=2.0,
                   LchamberInp=None)

effObj = Efficiencies()
effObj.set_const('ERE', 0.99)

core = CoreStream(geomObj,
                  effObj,
                  oxName='LOX',
                  fuelName='LH2',
                  MRcore=MRcore,
                  Pc=Pc)
Esempio n. 14
0
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)
G.summ_print()
Esempio n. 15
0
eps=61
CdThroat = 0.975 # from: RL10_modeling.pdf

import sys
import os

sys.path.insert(0, os.path.abspath("../../"))  # needed to find rocketisp development version

from rocketisp.rocket_isp import RocketThruster
from rocketisp.geometry import Geometry
from rocketisp.stream_tubes import CoreStream
from rocketisp.efficiencies import Efficiencies
from rocketisp.examples.compare_vals import compare_header, compare
    
geomObj = Geometry(Rthrt=Rthrt,
                   CR=(5.131/2.4724)**2, eps=eps,  pcentBell=70, 
                   RupThroat=1.5, RdwnThroat=1.0, RchmConv=1.0, cham_conv_deg=30,
                   LchmOvrDt=2.4842/2, LchmMin=2.0, LchamberInp=15.0)
                   
effObj = Efficiencies()
effObj.set_const('ERE', 0.9892 )

core = CoreStream( geomObj, effObj, oxName='LOX', fuelName='LH2',  MRcore=MRcore,
                   Pc=Pc, CdThroat=CdThroat)
             
R = RocketThruster(name='RL10',coreObj=core, injObj=None, calc_CdThroat=False, 
                   noz_regen_eps=eps)
             
R.scale_Rt_to_Thrust( Fvac, Pamb=0.0 , use_scipy=False )

compare_header()
compare('Fvacuum',Fvac, core('FvacTotal'))
Esempio n. 16
0
from rocketisp.geometry import Geometry
from rocketisp.examples.perfect_injector import PerfInjThruster

PI = PerfInjThruster(name='PI HiPAT',
                     geomObj=Geometry(eps=375),
                     ERE=0.99,
                     oxName='N2O4',
                     fuelName='N2H4',
                     MRcore=1.2,
                     Pc=137,
                     isRegenCham=0,
                     noz_regen_eps=1.0,
                     calc_CdThroat=True)

PI.scale_Rt_to_Thrust(ThrustLbf=100.0, Pamb=0.0)

MRcore_opt = PI.set_to_optimum_MR()
print('w/o FFC, MRcore_opt = %g' % MRcore_opt)

PI.summ_print()
Esempio n. 17
0
Pc = 3225 # 2994 # psia
wdotFuel =  xxx # lbm/sec
wdotOx   = xxx # lbm/sec

cstarEff = xxx
cstar = xxx # ft/sec
Isp = 452.3 # sec
IspSL = 366 # sec
cstarODE = xxx / 12.0 # ft/sec
eps = 77.5
CR = 3.0
Lnoz = 121 # in


geomObj = Geometry(Rthrt=Rthrt,
                   CR=CR, eps=eps,  pcentBell=80, LnozInp=Lnoz,
                   RupThroat=1.0, RdwnThroat=0.392, RchmConv=1.73921, cham_conv_deg=25.42,
                   LchmOvrDt=2.4842/2, LchmMin=2.0, LchamberInp=None)
                   
effObj = Efficiencies()
effObj.set_const('ERE', 0.99 )

core = CoreStream( geomObj, effObj, oxName='LOX', fuelName='LH2',  MRcore=MRcore, Pc=Pc)
             

R = RocketThruster(name='SSME, RS-25',coreObj=core, injObj=None, pulse_sec=float('inf'), pulse_quality=0.8)
             
R.scale_Rt_to_Thrust( Fvac , Pamb=0.0  , use_scipy=False )

compare_header()
compare('Fvacuum',Fvac, core('FvacTotal'))
compare('Isp Vacuum', Isp, core('IspDel'))
Esempio n. 18
0
print('Peak IspODE=%g sec at MR =' % mr_peak.ispPeak, mr_peak.mrPeak)
print()
print('MR at 97% Isp (on low  side) =', mr_peak.calc_mrLow_minus_NPcentIsp())
print('MR at 97% Isp (on high side) =', mr_peak.calc_mrHigh_minus_NPcentIsp())

mr_lo = round(
    mr_peak.mrLeftOfPeak -
    (mr_peak.mrRightOfPeak - mr_peak.mrLeftOfPeak) / 10.0, 2)
mr_hi = round(mr_peak.mrRightOfPeak, 2)
print('mr_lo =', mr_lo)
print('mr_hi =', mr_hi)

# =========== create RocketIsp structures
# create CoreStream with area ratio=375:1, Pc=137, FFC=30% and effERE=0.99
C = CoreStream(geomObj=Geometry(eps=eps),
               effObj=Efficiencies(ERE=1.0, Div=1.0, BL=1.0, TP=1.0),
               pcentFFC=0,
               oxName=oxName,
               fuelName=fuelName,
               MRcore=mr_lo,
               Pc=Pc,
               Pamb=0)

# instantiate RocketThruster
R = RocketThruster(name='Sample Thruster', coreObj=C)
R.scale_Rt_to_Thrust(ThrustLbf=Fvac, Pamb=0.0)
#R.summ_print()
# =========================================================
# generate data
ispodeL = []  # list of IspODE  (one-dimensional equilibrium)
Esempio n. 19
0
effCstar = .975
cstarODE = cstar / effCstar

effCfFrozen = 1.01 # based on FROZEN Isp
eps = 40
CR = 1.6
Lcham = 26 # in
At = 98.6 # in**2
Rt = (At / pi)**0.5
#print( 'Calculated MR =', wdOx / wdFuel )

dpOxInp=160
dpFuelInp=100

geomObj = Geometry(Rthrt=Rt,
                   CR=CR, eps=eps,  pcentBell=pcentBell, 
                   RupThroat=0.5, RdwnThroat=1.0, RchmConv=0.5, cham_conv_deg=30,
                   LchmOvrDt=3, LchmMin=2.0, LchamberInp=Lcham)
                   
effObj = Efficiencies()
effObj.set_const('ERE', 0.975 )

core = CoreStream( geomObj, effObj, oxName=oxName, fuelName=fuelName,  MRcore=MR,
             Pc=Pc, Pamb=14.7, CdThroat=1.0, 
             adjCstarODE=0.992801, adjIspIdeal=1.01876)

C = RocketThruster(name='Huzel A-2',coreObj=core, injObj=None, calc_CdThroat=False)
             
#C.scale_Rt_to_Thrust( Fvac, Pamb=0 , use_scipy=False )

compare_header()