class PerfInjThruster:
    
    
    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)
        
    def summ_print(self):
        self.R.summ_print()
    def scale_Rt_to_Thrust(self, ThrustLbf=500.0, Pamb=0.0, use_scipy=False):
        """
        Adjust throat size in order to get total thrust at specified ambient pressure exactly

        :param ThrustLbf: lbf, desired thrust at specified ambient pressure (Pamb)
        :param Pamb: psia, ambient pressure
        :param use_scipy: flag to indicate the need for more sophisticated root finder
        :type ThrustLbf: float
        :type Pamb: float
        :type use_scipy: bool
        :return: None
        :rtype: None        """

        self.R.scale_Rt_to_Thrust( ThrustLbf=ThrustLbf, Pamb=Pamb, use_scipy=use_scipy )
        
    def set_to_optimum_MR(self):
        """Starting with MR for ER=1 find max Isp MR"""
        C = self.R.coreObj # core object
        
        # get MR for equivalence ratio = 1
        MRstart = C.ceaObj.getMRforER( ERr=1.0 )
        
        MRlo = MRstart / 3.0
        MRhi = MRstart * 3.0
        
        def get_ispdel( MR ):
            C.reset_attr('MRcore', MR, re_evaluate=True)
            self.R.calc_all_eff()
            return C.IspDel
            
        MRopt, IspMax  = search_max(get_ispdel, MRlo, MRhi, tol=0.01)
        print('MRopt=%g, IspMax=%g sec'%(MRopt, IspMax) )
        # use MRopt to reset everything
        get_ispdel( MRopt )
        
        return MRopt
Exemple #2
0
    R = RocketThruster(name='Sample Thruster',
                       coreObj=C,
                       injObj=I,
                       pulse_sec=float('inf'),
                       pulse_quality=0.8)
    R.set_mr_to_max_ispdel()

    ispodeL = []  # list of IspODE  (one-dimensional equilibrium)
    ispodkL = []  # list of IspODK  (one-dimensional kinetic)
    ispdelL = []  # list of Isp thruster delivered

    MRsave = C.MRcore

    for mr in mrcoreL:
        R.coreObj.reset_attr('MRcore', mr, re_evaluate=True)
        R.calc_all_eff()

        ispodeL.append(R.coreObj.IspODE)
        ispodkL.append(R.coreObj.IspODK)
        ispdelL.append(R.coreObj.IspDel)

    R.coreObj.reset_attr('MRcore', MRsave, re_evaluate=True)
    R.calc_all_eff()

    ispD['ODE'] = ispodeL
    ispD['ODK'] = ispodkL
    ispD[elemEm] = ispdelL

# ODE Curve
mr_ode_terp = InterpProp(mrcoreL, ispodeL)
mr_ode_Peak, isp_ode_peak = search_max(mr_ode_terp, mrlo, mrhi, tol=1.0e-5)