Exemple #1
0
class CEA():
    def __init__(self, fuel, oxidiser, chamber_pressure):
        """[summary]
		Calcualtes hot gas properties using CEA and converts to SI units. If errors occur with FORTRAN, resart and try again!
		:param chamber_pressure in [Pa]
		:type fuel = string
		:type oxidiser = string
		"""
        self.chamber_pressure = chamber_pressure
        self.imperial_pressure = 0.000145038 * self.chamber_pressure  #conversion to psia
        self.ispObj = CEA_Obj(oxName=oxidiser, fuelName=fuel)
        self.ispObj.get_full_cea_output()

    def chamber_gas_properties(self, mixture_ratio, expansion_ratio):
        self.Cp, self.visc, self.cond, self.Pr = self.ispObj.get_Chamber_Transport(
            Pc=self.imperial_pressure, MR=mixture_ratio, frozen=1)
        self.MW, self.gamma = self.ispObj.get_Chamber_MolWt_gamma(
            Pc=self.imperial_pressure, MR=mixture_ratio, eps=expansion_ratio)

    def throat_gas_properties(self, mixture_ratio, expansion_ratio):
        self.Cp, self.visc, self.cond, self.Pr = self.ispObj.get_Throat_Transport(
            Pc=self.imperial_pressure, MR=mixture_ratio, frozen=1)
        self.MW, self.gamma = self.ispObj.get_Throat_MolWt_gamma(
            Pc=self.imperial_pressure, MR=mixture_ratio, eps=expansion_ratio)

    def exit_gas_properties(self, mixture_ratio, expansion_ratio):
        self.Cp, self.visc, self.cond, self.Pr = self.ispObj.get_Exit_Transport(
            Pc=self.imperial_pressure, MR=mixture_ratio, frozen=1)
        self.MW, self.gamma = self.ispObj.get_exit_MolWt_gamma(
            Pc=self.imperial_pressure, MR=mixture_ratio, eps=expansion_ratio)

    def metric_cea_output(self, location, mixture_ratio, expansion_ratio):
        if location == 'chamber':
            self.chamber_gas_properties(mixture_ratio, expansion_ratio)
        elif location == 'throat':
            self.throat_gas_properties(mixture_ratio, expansion_ratio)
        elif location == 'exit':
            self.exit_gas_properties(mixture_ratio, expansion_ratio)
        else:
            raise ValueError(
                'Invalid location, use "chamber," "throat" or "exit"')

        self.isp, self.cstar, _ = self.ispObj.getFrozen_IvacCstrTc(
            Pc=self.imperial_pressure, MR=mixture_ratio, eps=expansion_ratio)

        self.cstar = self.cstar * 0.3048  # coversion to m/s
        self.mole_fractions = self.ispObj.get_SpeciesMoleFractions(
            Pc=self.imperial_pressure,
            MR=mixture_ratio,
            eps=expansion_ratio,
            frozen=0,
            frozenAtThroat=0,
            min_fraction=5e-05)
        self.Cp = self.Cp * 4186.8  # coversion to J/gk/K
        self.mu = self.visc * 0.0001  # coversion to Pa*s
        self.k = self.cond * 418.4e-3  # coversion to W/m/K
        self.T_static = self.ispObj.get_Tcomb(
            Pc=self.imperial_pressure,
            MR=mixture_ratio) * 0.555556  # coversion to K
Exemple #2
0
    def test_mole_fraction_species_conc_w_fac(self):
        """test mole fraction species concentration with finite area combustor"""

        C = CEA_Obj(oxName='LOX', fuelName='LH2', fac_CR=2.5)

        molWtD, massFracD = C.get_SpeciesMoleFractions(Pc=1000.0,
                                                       MR=6.0,
                                                       eps=40.0,
                                                       frozen=0,
                                                       frozenAtThroat=0)
        self.assertEqual(len(massFracD), 8)
        self.assertEqual(len(molWtD), 8)
        s = '  '.join(['%7.5f' % mf for mf in massFracD["H2O"]])
        self.assertEqual(s, "0.66590  0.66670  0.68697  0.75598")

        molWtD, massFracD = C.get_SpeciesMoleFractions(Pc=1000.0,
                                                       MR=6.0,
                                                       eps=40.0,
                                                       frozen=1,
                                                       frozenAtThroat=0)
        self.assertEqual(len(massFracD), 8)
        self.assertEqual(len(molWtD), 8)
        s = '  '.join(['%7.5f' % mf for mf in massFracD["H2O"]])
        self.assertEqual(s, "0.66590  0.66590  0.66590  0.66590")

        molWtD, massFracD = C.get_SpeciesMoleFractions(Pc=1000.0,
                                                       MR=6.0,
                                                       eps=40.0,
                                                       frozen=1,
                                                       frozenAtThroat=1)
        self.assertEqual(len(massFracD), 8)
        self.assertEqual(len(molWtD), 8)
        s = '  '.join(['%7.5f' % mf for mf in massFracD["H2O"]])
        self.assertEqual(s, "0.66590  0.66670  0.68697  0.68697")

        del C
Exemple #3
0
    def test_mole_fraction_species_concentration(self):
        """test mole fraction species concentration"""

        C = CEA_Obj(oxName='LOX', fuelName='LH2')

        molWtD, massFracD = C.get_SpeciesMoleFractions(Pc=1000.0,
                                                       MR=6.0,
                                                       eps=40.0,
                                                       frozen=0,
                                                       frozenAtThroat=0)
        self.assertEqual(len(massFracD), 8)
        self.assertEqual(len(molWtD), 8)
        s = '  '.join(['%7.5f' % mf for mf in massFracD["H2O"]])
        self.assertEqual(s, "0.66590  0.66590  0.68751  0.75598")

        molWtD, massFracD = C.get_SpeciesMoleFractions(Pc=1000.0,
                                                       MR=6.0,
                                                       eps=40.0,
                                                       frozen=1,
                                                       frozenAtThroat=0)
        self.assertEqual(len(massFracD), 8)
        self.assertEqual(len(molWtD), 8)
        s = '  '.join(['%7.5f' % mf for mf in massFracD["H2O"]])
        self.assertEqual(s, "0.66590  0.66590  0.66590  0.66590")

        molWtD, massFracD = C.get_SpeciesMoleFractions(Pc=1000.0,
                                                       MR=6.0,
                                                       eps=40.0,
                                                       frozen=1,
                                                       frozenAtThroat=1)
        self.assertEqual(len(massFracD), 8)
        self.assertEqual(len(molWtD), 8)
        s = '  '.join(['%7.5f' % mf for mf in massFracD["H2O"]])
        self.assertEqual(s, "0.66590  0.66590  0.68751  0.68751")

        del C
def engine_adiabatic(P_cc, P_e, n_ps, T_cc, F_th, eta_nz, ox, fuel, ofr, r_cc):
    step, P, T, rho, kappa, h, u, c, M, r = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    cea = CEA_Obj(fuelName=fuel, oxName=ox)
    mix_cc = prune_cc_products(
        cea.get_SpeciesMoleFractions(Pc=psi(P_cc), MR=ofr)[1])
    eng = np.zeros((10, n_ps + 1))
    eng[step, :] = np.arange(0, n_ps + 1)
    eng[P, :] = P_cc - ((P_cc - P_e) / n_ps) * eng[0, :]
    eng[T, 0] = cea.get_Temperatures(Pc=psi(P_cc), MR=ofr)[0] * (5 / 9)
    #print(eng[T,0])
    #print(psi(eng[P,0]))
    eng[rho, 0] = thermo.get_rho(eng[P, 0], eng[T, 0], mix_cc)
    eng[kappa, 0] = thermo.get_kappa(eng[P, 0], eng[T, 0], mix_cc)
    eng[h, 0] = thermo.mass_mixer(mix_cc, eng[P, 0], 'P', eng[T, 0], 'T', 'H')
    eng[u, 0] = 0
    eng[c, 0] = thermo.get_speed_of_sound(eng[P, 0], eng[T, 0], mix_cc)
    eng[M, 0] = eng[u, 0] / eng[c, 0]
    eng[r, 0] = r_cc
    for i in tqdm(eng[step, :]):
        i = int(i)
        if (i != 0):
            eng[T, i] = thermo.isentrop_temp_press(eng[kappa,
                                                       i - 1], eng[T, i - 1],
                                                   eng[P, i - 1], eng[P, i])
            eng[rho, i] = thermo.get_rho(eng[P, i], eng[T, i], mix_cc)
            eng[kappa, i] = thermo.get_kappa(eng[P, i], eng[T, i], mix_cc)
            eng[h, i] = thermo.mass_mixer(mix_cc, eng[P, i], 'P', eng[T, i],
                                          'T', 'H')
            eng[u,
                i] = ((eng[h, i - 1] - eng[h, i]) * 2 + eng[u, i - 1]**2)**0.5
            eng[c, i] = thermo.get_speed_of_sound(eng[P, i], eng[T, i], mix_cc)
            eng[M, i] = eng[u, i] / eng[c, i]
    m_dot = F_th / eng[u, -1]
    #print(mix_cc)
    eng[u, 0] = m_dot / (eng[rho, 0] * eng[r, 0]**2 * math.pi)
    for i in eng[step, :]:
        i = int(i)
        if (i != 0):
            eng[u,
                i] = ((eng[h, i - 1] - eng[h, i]) * 2 + eng[u, i - 1]**2)**0.5
            eng[M, i] = eng[u, i] / eng[c, i]
    eng[r, :] = np.vectorize(lambda u, rho:
                             (m_dot / (math.pi * u * rho))**0.5)(eng[u, :],
                                                                 eng[rho, :])
    print(m_dot)
    return eng
class CEA_Obj(object):
    """
    RocketCEA wraps the NASA FORTRAN CEA code to calculate Isp, cstar, and Tcomb
    
    This object wraps the English unit version of CEA_Obj to enable desired user units.    
    """
    def __init__(self,
                 propName='',
                 oxName='',
                 fuelName='',
                 useFastLookup=0,
                 makeOutput=0,
                 isp_units='sec',
                 cstar_units='ft/sec',
                 pressure_units='psia',
                 temperature_units='degR',
                 sonic_velocity_units='ft/sec',
                 enthalpy_units='BTU/lbm',
                 density_units='lbm/cuft',
                 specific_heat_units='BTU/lbm degR',
                 viscosity_units='millipoise',
                 thermal_cond_units='mcal/cm-K-s',
                 fac_CR=None,
                 make_debug_prints=False):
        """::
        
        #: RocketCEA wraps the NASA FORTRAN CEA code to calculate Isp, cstar, and Tcomb
        #: This object wraps the English unit version of CEA_Obj to enable desired user units.
        #: Same as CEA_Obj with standard units except, input and output units can be specified.
        #:  parameter             default             options
        #: isp_units            = 'sec',         # N-s/kg, m/s, km/s
        #: cstar_units          = 'ft/sec',      # m/s
        #: pressure_units       = 'psia',        # MPa, KPa, Pa, Bar, Atm, Torr
        #: temperature_units    = 'degR',        # K, C, F
        #: sonic_velocity_units = 'ft/sec',      # m/s
        #: enthalpy_units       = 'BTU/lbm',     # J/g, kJ/kg, J/kg, kcal/kg, cal/g
        #: density_units        = 'lbm/cuft',    # g/cc, sg, kg/m^3
        #: specific_heat_units  = 'BTU/lbm degR' # kJ/kg-K, cal/g-C, J/kg-K (# note: cal/g K == BTU/lbm degR)
        #: viscosity_units      = 'millipoise'   # lbf-sec/sqin, lbf-sec/sqft, lbm/ft-sec, poise, centipoise
        #: thermal_cond_units   = 'mcal/cm-K-s'  # millical/cm-degK-sec, BTU/hr-ft-degF, BTU/s-in-degF, cal/s-cm-degC, W/cm-degC
        #: fac_CR, Contraction Ratio of finite area combustor (None=infinite)
        #: if make_debug_prints is True, print debugging info to terminal.
        """

        self.isp_units = isp_units
        self.cstar_units = cstar_units
        self.pressure_units = pressure_units
        self.temperature_units = temperature_units
        self.sonic_velocity_units = sonic_velocity_units
        self.enthalpy_units = enthalpy_units
        self.density_units = density_units
        self.specific_heat_units = specific_heat_units
        self.viscosity_units = viscosity_units
        self.thermal_cond_units = thermal_cond_units
        self.fac_CR = fac_CR

        # Units objects for input/output (e.g. Pc and Pamb)
        self.Pc_U = get_units_obj('psia', pressure_units)

        # units of output quantities
        self.isp_U = get_units_obj('sec', isp_units)
        self.cstar_U = get_units_obj('ft/sec', cstar_units)
        self.temperature_U = get_units_obj('degR', temperature_units)
        self.sonic_velocity_U = get_units_obj('ft/sec', sonic_velocity_units)
        self.enthalpy_U = get_units_obj('BTU/lbm', enthalpy_units)
        self.density_U = get_units_obj('lbm/cuft', density_units)
        self.specific_heat_U = get_units_obj('BTU/lbm degR',
                                             specific_heat_units)
        self.viscosity_U = get_units_obj('millipoise', viscosity_units)
        self.thermal_cond_U = get_units_obj('mcal/cm-K-s', thermal_cond_units)

        self.cea_obj = CEA_Obj_default(propName=propName,
                                       oxName=oxName,
                                       fuelName=fuelName,
                                       useFastLookup=useFastLookup,
                                       makeOutput=makeOutput,
                                       fac_CR=fac_CR,
                                       make_debug_prints=make_debug_prints)
        self.desc = self.cea_obj.desc

    def get_IvacCstrTc(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        IspVac, Cstar, Tcomb = self.cea_obj.get_IvacCstrTc(Pc=Pc,
                                                           MR=MR,
                                                           eps=eps)

        IspVac = self.isp_U.dval_to_uval(IspVac)
        Cstar = self.cstar_U.dval_to_uval(Cstar)
        Tcomb = self.temperature_U.dval_to_uval(Tcomb)

        return IspVac, Cstar, Tcomb

    def getFrozen_IvacCstrTc(self,
                             Pc=100.0,
                             MR=1.0,
                             eps=40.0,
                             frozenAtThroat=0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        IspFrozen, Cstar, Tcomb = self.cea_obj.getFrozen_IvacCstrTc(
            Pc=Pc, MR=MR, eps=eps, frozenAtThroat=frozenAtThroat)
        IspFrozen = self.isp_U.dval_to_uval(IspFrozen)
        Cstar = self.cstar_U.dval_to_uval(Cstar)
        Tcomb = self.temperature_U.dval_to_uval(Tcomb)

        return IspFrozen, Cstar, Tcomb

    def get_IvacCstrTc_exitMwGam(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        IspVac, Cstar, Tcomb, mw, gam = self.cea_obj.get_IvacCstrTc_exitMwGam(
            Pc=Pc, MR=MR, eps=eps)

        IspVac = self.isp_U.dval_to_uval(IspVac)
        Cstar = self.cstar_U.dval_to_uval(Cstar)
        Tcomb = self.temperature_U.dval_to_uval(Tcomb)

        return IspVac, Cstar, Tcomb, mw, gam

    def get_IvacCstrTc_ChmMwGam(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        IspVac, Cstar, Tcomb, mw, gam = self.cea_obj.get_IvacCstrTc_ChmMwGam(
            Pc=Pc, MR=MR, eps=eps)

        IspVac = self.isp_U.dval_to_uval(IspVac)
        Cstar = self.cstar_U.dval_to_uval(Cstar)
        Tcomb = self.temperature_U.dval_to_uval(Tcomb)

        return IspVac, Cstar, Tcomb, mw, gam

    def get_IvacCstrTc_ThtMwGam(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        IspVac, Cstar, Tcomb, mw, gam = self.cea_obj.get_IvacCstrTc_ThtMwGam(
            Pc=Pc, MR=MR, eps=eps)

        IspVac = self.isp_U.dval_to_uval(IspVac)
        Cstar = self.cstar_U.dval_to_uval(Cstar)
        Tcomb = self.temperature_U.dval_to_uval(Tcomb)

        return IspVac, Cstar, Tcomb, mw, gam

    def __call__(self, Pc=100.0, MR=1.0, eps=40.0):
        return self.get_Isp(Pc=Pc, MR=MR, eps=eps)

    def get_Isp(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        IspVac = self.cea_obj.get_Isp(Pc=Pc, MR=MR, eps=eps)
        IspVac = self.isp_U.dval_to_uval(IspVac)

        return IspVac

    def get_Cstar(self, Pc=100.0, MR=1.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Cstar = self.cea_obj.get_Cstar(Pc=Pc, MR=MR)
        Cstar = self.cstar_U.dval_to_uval(Cstar)
        return Cstar

    def get_Tcomb(self, Pc=100.0, MR=1.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Tcomb = self.cea_obj.get_Tcomb(Pc=Pc, MR=MR)
        Tcomb = self.temperature_U.dval_to_uval(Tcomb)
        return Tcomb

    def get_PcOvPe(self, Pc=100.0, MR=1.0, eps=40.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_PcOvPe(Pc=Pc, MR=MR, eps=eps)

    def get_eps_at_PcOvPe(self, Pc=100.0, MR=1.0, PcOvPe=1000.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_eps_at_PcOvPe(Pc=Pc, MR=MR, PcOvPe=PcOvPe)

    def get_Throat_PcOvPe(self, Pc=100.0, MR=1.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_Throat_PcOvPe(Pc=Pc, MR=MR)

    def get_MachNumber(self, Pc=100.0, MR=1.0, eps=40.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_MachNumber(Pc=Pc, MR=MR, eps=eps)

    def get_Temperatures(self,
                         Pc=100.0,
                         MR=1.0,
                         eps=40.0,
                         frozen=0,
                         frozenAtThroat=0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        tempList = self.cea_obj.get_Temperatures(Pc=Pc,
                                                 MR=MR,
                                                 eps=eps,
                                                 frozen=frozen,
                                                 frozenAtThroat=frozenAtThroat)

        for i, T in enumerate(tempList):
            tempList[i] = self.temperature_U.dval_to_uval(T)
        return tempList  # Tc, Tthroat, Texit

    def get_SonicVelocities(self, Pc=100.0, MR=1.0, eps=40.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        sonicList = self.cea_obj.get_SonicVelocities(Pc=Pc, MR=MR, eps=eps)

        for i, S in enumerate(sonicList):
            sonicList[i] = self.sonic_velocity_U.dval_to_uval(S)
        return sonicList  # Chamber, Throat, Exit

    def get_Chamber_SonicVel(self, Pc=100.0, MR=1.0, eps=40.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        sonicVel = self.cea_obj.get_Chamber_SonicVel(Pc=Pc, MR=MR, eps=eps)

        sonicVel = self.sonic_velocity_U.dval_to_uval(sonicVel)
        return sonicVel

    def get_Enthalpies(self, Pc=100.0, MR=1.0, eps=40.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia

        hList = self.cea_obj.get_Enthalpies(Pc=Pc, MR=MR, eps=eps)
        for i, H in enumerate(hList):
            hList[i] = self.enthalpy_U.dval_to_uval(H)

        return hList

    def get_SpeciesMassFractions(self,
                                 Pc=100.0,
                                 MR=1.0,
                                 eps=40.0,
                                 frozen=0,
                                 frozenAtThroat=0,
                                 min_fraction=0.000005):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia

        molWtD, massFracD = self.cea_obj.get_SpeciesMassFractions(
            Pc=Pc,
            MR=MR,
            eps=eps,
            frozenAtThroat=frozenAtThroat,
            min_fraction=min_fraction)
        return molWtD, massFracD

    def get_SpeciesMoleFractions(self,
                                 Pc=100.0,
                                 MR=1.0,
                                 eps=40.0,
                                 frozen=0,
                                 frozenAtThroat=0,
                                 min_fraction=0.000005):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia

        molWtD, moleFracD = self.cea_obj.get_SpeciesMoleFractions(
            Pc=Pc,
            MR=MR,
            eps=eps,
            frozenAtThroat=frozenAtThroat,
            min_fraction=min_fraction)
        return molWtD, moleFracD

    def get_Chamber_H(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        H = self.cea_obj.get_Chamber_H(Pc=Pc, MR=MR, eps=eps)
        return self.enthalpy_U.dval_to_uval(H)

    def get_Densities(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        dList = self.cea_obj.get_Densities(Pc=Pc, MR=MR, eps=eps)

        for i, d in enumerate(dList):
            dList[i] = self.density_U.dval_to_uval(d)

        return dList

    def get_Chamber_Density(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        H = self.cea_obj.get_Chamber_Density(Pc=Pc, MR=MR, eps=eps)
        return self.density_U.dval_to_uval(H)

    def get_HeatCapacities(self, Pc=100.0, MR=1.0, eps=40.0, frozen=0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        cpList = self.cea_obj.get_HeatCapacities(Pc=Pc,
                                                 MR=MR,
                                                 eps=eps,
                                                 frozen=frozen)

        for i, cp in enumerate(cpList):
            cpList[i] = self.specific_heat_U.dval_to_uval(cp)

        return cpList

    def get_Chamber_Cp(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Cp = self.cea_obj.get_Chamber_Cp(Pc=Pc, MR=MR, eps=eps)
        return self.specific_heat_U.dval_to_uval(Cp)

    def get_Throat_Isp(self, Pc=100.0, MR=1.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Isp = self.cea_obj.get_Throat_Isp(Pc=Pc, MR=MR)
        Isp = self.isp_U.dval_to_uval(Isp)

        return Isp

    def get_Chamber_MolWt_gamma(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_Chamber_MolWt_gamma(Pc=Pc, MR=MR, eps=eps)

    def get_Throat_MolWt_gamma(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_Throat_MolWt_gamma(Pc=Pc, MR=MR, eps=eps)

    def get_exit_MolWt_gamma(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_exit_MolWt_gamma(Pc=Pc, MR=MR, eps=eps)

    def get_eqratio(self, Pc=100.0, MR=1.0, eps=40.0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        return self.cea_obj.get_eqratio(Pc=Pc, MR=MR, eps=eps)

    def getMRforER(self, ERphi=None, ERr=None):
        return self.cea_obj.getMRforER(ERphi=ERphi, ERr=ERr)

    def get_description(self):
        return self.cea_obj.get_description()

    def estimate_Ambient_Isp(self,
                             Pc=100.0,
                             MR=1.0,
                             eps=40.0,
                             Pamb=14.7,
                             frozen=0,
                             frozenAtThroat=0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Pamb = self.Pc_U.uval_to_dval(Pamb)  # convert user units to psia
        IspAmb, mode = self.cea_obj.estimate_Ambient_Isp(
            Pc=Pc,
            MR=MR,
            eps=eps,
            Pamb=Pamb,
            frozen=frozen,
            frozenAtThroat=frozenAtThroat)

        IspAmb = self.isp_U.dval_to_uval(IspAmb)

        return IspAmb, mode

    def get_PambCf(self, Pamb=14.7, Pc=100.0, MR=1.0, eps=40.0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Pamb = self.Pc_U.uval_to_dval(Pamb)  # convert user units to psia

        CFcea, CF, mode = self.cea_obj.get_PambCf(Pamb=Pamb,
                                                  Pc=Pc,
                                                  MR=MR,
                                                  eps=eps)

        return CFcea, CF, mode

    def getFrozen_PambCf(self,
                         Pamb=0.0,
                         Pc=100.0,
                         MR=1.0,
                         eps=40.0,
                         frozenAtThroat=0):
        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Pamb = self.Pc_U.uval_to_dval(Pamb)  # convert user units to psia

        CFcea, CFfrozen, mode = self.cea_obj.getFrozen_PambCf(
            Pamb=Pamb, Pc=Pc, MR=MR, eps=eps, frozenAtThroat=frozenAtThroat)

        return CFcea, CFfrozen, mode

    def get_Chamber_Transport(self, Pc=100.0, MR=1.0, eps=40.0, frozen=0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Cp, visc, cond, Prandtl = self.cea_obj.get_Chamber_Transport(
            Pc=Pc, MR=MR, eps=eps, frozen=frozen)

        #Cp = Cp * 8314.51 / 4184.0  # convert into BTU/lbm degR
        Cp = self.specific_heat_U.dval_to_uval(Cp)
        visc = self.viscosity_U.dval_to_uval(visc)
        cond = self.thermal_cond_U.dval_to_uval(cond)

        return Cp, visc, cond, Prandtl

    def get_Throat_Transport(self, Pc=100.0, MR=1.0, eps=40.0, frozen=0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Cp, visc, cond, Prandtl = self.cea_obj.get_Throat_Transport(
            Pc=Pc, MR=MR, eps=eps, frozen=frozen)

        #Cp = Cp * 8314.51 / 4184.0  # convert into BTU/lbm degR
        Cp = self.specific_heat_U.dval_to_uval(Cp)
        visc = self.viscosity_U.dval_to_uval(visc)
        cond = self.thermal_cond_U.dval_to_uval(cond)

        return Cp, visc, cond, Prandtl

    def get_Exit_Transport(self, Pc=100.0, MR=1.0, eps=40.0, frozen=0):

        Pc = self.Pc_U.uval_to_dval(Pc)  # convert user units to psia
        Cp, visc, cond, Prandtl = self.cea_obj.get_Exit_Transport(
            Pc=Pc, MR=MR, eps=eps, frozen=frozen)

        Cp = Cp * 8314.51 / 4184.0  # convert into BTU/lbm degR
        Cp = self.specific_heat_U.dval_to_uval(Cp)
        visc = self.viscosity_U.dval_to_uval(visc)
        cond = self.thermal_cond_U.dval_to_uval(cond)

        return Cp, visc, cond, Prandtl
from rocketcea.cea_obj import CEA_Obj

ispObj = CEA_Obj( oxName='LOX', fuelName='LH2')

for frozen, frozenAtThroat in [(0,0), (1,0), (1,1)]:
    molWtD, moleFracD = ispObj.get_SpeciesMoleFractions( Pc=1000.0, MR=6.0, eps=40.0, 
                                            frozen=frozen, frozenAtThroat=frozenAtThroat )
                                            
    print('   ROCKETCEA MOLE FRACTIONS (frozen=%i, frozenAtThroat=%i)'%(frozen, frozenAtThroat)  )
    for species, mfL in moleFracD.items():
        
        s = '  '.join( [ '%7.5f'%mf for mf in mfL ] )
        print( ' %-15s '%species, s, '  MW=%g'%molWtD[species] )
    print('='*55)
class AdiabaticEngine:

    step, P, T, rho, kappa, h, u, c, M, r = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

    def __init__(self,
                 fuel,
                 oxidizer,
                 P_cc,
                 P_e,
                 F_t,
                 ofr,
                 r_cc,
                 steps,
                 eta_n=1,
                 stepfactor=10):
        self.fuel = fuel
        self.oxidizer = oxidizer
        self.P_cc = P_cc
        self.P_e = P_e
        self.F_t = F_t
        self.ofr = ofr
        self.r_cc = r_cc
        self.steps = steps
        self.eta_n = eta_n
        self.p_steps = stepfactor * steps
        self.steps = steps

        self.p_data = np.zeros((10, self.p_steps + 1))

    def __repr__(self):
        pass

    def __str__(self):
        pass

    def generate(self, disable_tqdm=False):
        self.cea = CEA_Obj(fuelName=self.fuel, oxName=self.oxidizer)
        self.mix_cc = self.prune_combustion_products(
            self.cea.get_SpeciesMoleFractions(Pc=psi(self.P_cc),
                                              MR=self.ofr)[1])
        self.p_data[self.step, :] = np.arange(0, self.p_steps + 1)
        self.p_data[self.P, :] = self.P_cc - (
            (self.P_cc - self.P_e) / self.p_steps) * self.p_data[self.step, :]
        self.p_data[self.T,
                    0] = self.cea.get_Temperatures(Pc=psi(self.P_cc),
                                                   MR=self.ofr)[0] * (5 / 9)
        self.p_data[self.rho, 0] = thermo.get_rho(self.p_data[self.P, 0],
                                                  self.p_data[self.T,
                                                              0], self.mix_cc)
        self.p_data[self.kappa,
                    0] = thermo.get_kappa(self.p_data[self.P, 0],
                                          self.p_data[self.T, 0], self.mix_cc)
        self.p_data[self.h,
                    0] = thermo.mass_mixer(self.mix_cc, self.p_data[self.P, 0],
                                           'P', self.p_data[self.T,
                                                            0], 'T', 'H')
        self.p_data[self.u, 0] = 0
        self.p_data[self.c,
                    0] = thermo.get_speed_of_sound(self.p_data[self.P, 0],
                                                   self.p_data[self.T,
                                                               0], self.mix_cc)
        self.p_data[self.M,
                    0] = self.p_data[self.u, 0] / self.p_data[self.c, 0]
        self.p_data[self.r, 0] = self.r_cc

        for i in tqdm(self.p_data[self.step, 1:],
                      desc="Generating slices",
                      disable=disable_tqdm):
            i = int(i)
            self.p_data[1:, i] = self.__next_step(self.p_data[:, i - 1],
                                                  self.p_data[self.P, i])

        self.m_dot = self.F_t / self.p_data[self.u, -1]

        self.p_data[self.u,
                    0] = self.m_dot / (self.p_data[self.rho, 0] *
                                       self.p_data[self.r, 0]**2 * math.pi)

        for i in tqdm(self.p_data[self.step, 1:],
                      desc="Calculating velocities",
                      disable=disable_tqdm):
            i = int(i)
            self.p_data[self.u, i] = (
                (self.p_data[self.h, i - 1] - self.p_data[self.h, i]) * 2 +
                self.p_data[self.u, i - 1]**2)**0.5
            self.p_data[self.M,
                        i] = self.p_data[self.u, i] / self.p_data[self.c, i]
        self.p_data[self.r, :] = np.vectorize(
            lambda u, rho: (self.m_dot / (math.pi * u * rho))**0.5)(
                self.p_data[self.u, :], self.p_data[self.rho, :])

        delta = 1000
        self.t_step = 0
        for i in self.p_data[self.step, :]:
            i = int(i)
            if abs(self.p_data[self.M, i] - 1) < delta:
                delta = abs(self.p_data[self.M, i] - 1)
                self.t_step = i
        print(self.t_step)
        print(delta)

        self.r_e = self.p_data[self.r, -1]
        self.r_t = self.p_data[self.r, self.t_step]

    def __next_step(self, prev, P_now):
        T_now = thermo.isentrop_temp_press(prev[self.kappa], prev[self.T],
                                           prev[self.P], P_now)
        rho_now = thermo.get_rho(P_now, T_now, self.mix_cc)
        kappa_now = thermo.get_kappa(P_now, T_now, self.mix_cc)
        h_now = thermo.mass_mixer(self.mix_cc, P_now, 'P', T_now, 'T', 'H')
        u_now = ((prev[self.h] - h_now) * 2 + prev[self.u]**2)**0.5
        c_now = thermo.get_speed_of_sound(P_now, T_now, self.mix_cc)
        M_now = u_now / c_now

        return np.array(
            [P_now, T_now, rho_now, kappa_now, h_now, u_now, c_now, M_now, 0])

    def prune_combustion_products(self,
                                  cea_dict,
                                  cutoff=0.01,
                                  exclude=["*NO", "*O", "*OH", "*H"],
                                  pos=1):
        cp_dict = {}
        total = 0
        for key in cea_dict:
            if (cea_dict[key][pos] > cutoff) and not (key in exclude):
                cp_dict[key.strip('*')] = cea_dict[key][pos]
                total += cea_dict[key][pos]
        for key in cp_dict:
            cp_dict[key] = cp_dict[key] / total
        return cp_dict

    def matcher(self, nozzle):
        pass

    def quickset(self):
        pass
Exemple #8
0
from rocketcea.cea_obj import CEA_Obj

C = CEA_Obj(oxName='GOX', fuelName='GH2')
Pc = 40.0
eps = 5.0
MR = 5.0

molWtD, moleFracD = C.get_SpeciesMoleFractions(Pc=Pc, MR=MR, eps=eps)

print('   ROCKETCEA MOLE FRACTIONS')
for species, mfL in moleFracD.items():

    s = '  '.join(['%7.5f' % mf for mf in mfL])
    print(' %-15s ' % species, s, '  MW=%g' % molWtD[species])

print("""   CEA OUTPUT MOLE FRACTIONS
 *H               0.07147  0.06044  0.00962
 HO2              0.00001  0.00000  0.00000
 *H2              0.34261  0.34471  0.36428
 H2O              0.53522  0.55597  0.62354
 *O               0.00497  0.00332  0.00004
 *OH              0.04266  0.03344  0.00249
 *O2              0.00306  0.00212  0.00003
""")