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
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)