proptools Documentation Release 0.0.0 Matthew Vernacchia Feb 17, 2019
Contents 1 Tutorials 3 1.1 Nozzle Flow............................................... 3 1.2 Solid-Propellant Rocket Motors..................................... 19 1.3 Electric Propulsion Basics........................................ 29 2 Package contents 35 2.1 proptools................................................. 35 Bibliography 59 Python Module Index 61 i
ii
Proptools is a Python package for preliminary design of rocket propulsion systems. Proptools provides implementations of equations for nozzle flow, turbo-machinery and rocket structures. The project aims to cover most of the commonly used equations in Rocket Propulsion Elements by George Sutton and Oscar Biblarz and Modern Engineering for Design of Liquid-Propellant Rocket Engines by Dieter Huzel and David Huang. Proptools can be used as a desktop calculator: >> from proptools import nozzle >> p_c = 10e6; p_e = 100e3; gamma = 1.2; m_molar = 20e-3; T_c = 3000. >> C_f = nozzle.thrust_coef(p_c, p_e, gamma) >> c_star = nozzle.c_star(gamma, m_molar, T_c) >> I_sp = C_f * c_star / nozzle.g >> print "The engine's ideal sea level specific impulse is {:.1f} seconds.".format(i_ sp) The engine's ideal sea level specific impulse is 288.7 seconds. Proptools can also be used as a library in other propulsion design and analysis software. It is distributed under a MIT License and can be used in commercial projects. Contents 1
2 Contents
CHAPTER 1 Tutorials 1.1 Nozzle Flow Nozzle flow theory can predict the thrust and specific impulse of a rocket engine. The following example predicts the performance of an engine which operates at chamber pressure of 10 MPa, chamber temperature of 3000 K, and has 100 mm diameter nozzle throat. """Estimate specific impulse, thrust and mass flow.""" from math import pi from proptools import nozzle # Declare engine design parameters p_c = 10e6 # Chamber pressure [units: pascal] p_e = 100e3 # Exit pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] m_molar = 20e-3 # Exhaust molar mass [units: kilogram mole**1] T_c = 3000. # Chamber temperature [units: kelvin] A_t = pi * (0.1 / 2)**2 # Throat area [units: meter**2] # Predict engine performance C_f = nozzle.thrust_coef(p_c, p_e, gamma) # Thrust coefficient [units: dimensionless] c_star = nozzle.c_star(gamma, m_molar, T_c) # Characteristic velocity [units: meter second**-1] I_sp = C_f * c_star / nozzle.g # Specific impulse [units: second] F = A_t * p_c * C_f # Thrust [units: newton] m_dot = A_t * p_c / c_star # Propellant mass flow [units: kilogram second**-1] print 'Specific impulse = {:.1f} s'.format(i_sp) print 'Thrust = {:.1f} kn'.format(f * 1e-3) print 'Mass flow = {:.1f} kg s**-1'.format(m_dot) Output: 3
Specific impulse = 288.7 s Thrust = 129.2 kn Mass flow = 45.6 kg s**-1 The rest of this page derives the nozzle flow theory, and demonstrates other features of proptools.nozzle. 1.1.1 Ideal Nozzle Flow The purpose of a rocket is to generate thrust by expelling mass at high velocity. The rocket nozzle is a flow device which accelerates gas to high velocity before it is expelled from the vehicle. The nozzle accelerates the gas by converting some of the gas s thermal energy into kinetic energy. Ideal nozzle flow is a simplified model of the aero- and thermo-dynamic behavior of fluid in a nozzle. The ideal model allows us to write algebraic relations between an engine s geometry and operating conditions (e.g. throat area, chamber pressure, chamber temperature) and its performance (e.g. thrust and specific impulse). These equations are fundamental tools for the preliminary design of rocket propulsion systems. The assumptions of the ideal model are: 1. The fluid flowing through the nozzle is gaseous. 2. The gas is homogeneous, obeys the ideal gas law, and is calorically perfect. Its molar mass (M) and heat capacities (c p, c v ) are constant throughout the fluid, and do not vary with temperature. 3. There is no heat transfer to or from the gas. Therefore, the flow is adiabatic. The specific enthalpy h is constant throughout the nozzle. 4. There are no viscous effects or shocks within the gas or at its boundaries. Therefore, the flow is reversible. If the flow is both adiabatic and reversible, it is isentropic: the specific entropy s is constant throughout the nozzle. 5. The flow is steady; d dt = 0. 6. The flow is quasi one dimensional. The flow state varies only in the axial direction of the nozzle. 7. The flow velocity is axially directed. 8. The flow does not react in the nozzle. The chemical equilibrium established in the combustion chamber does not change as the gas flows through the nozzle. This assumption is known as frozen flow. These assumptions are usually acceptably accurate for preliminary design work. Most rocket engines perform within 1% to 6% of the ideal model predictions [RPE]. 1.1.2 Isentropic Relations Under the assumption of isentropic flow and calorically perfect gas, there are several useful relations between fluid states. These relations depend on the heat capacity ratio, γ = c p /c v. Consider two gas states, 1 and 2, which are isentropically related (s 1 = s 2 ). The states pressure, temperature and density ratios are related: p 1 p 2 = ( ρ1 ρ 2 ) γ = ( T1 T 2 ) γ γ 1 4 Chapter 1. Tutorials
Stagnation state Now consider the relation between static and stagnation states in a moving fluid. The stagnation state is the state a moving fluid would reach if it were isentropically decelerated to zero velocity. The stagnation enthalpy h 0 is the sum of the static enthalpy and the specific kinetic energy: h 0 = h + 1 2 v2 For a calorically perfect gas, T = h/c p, and the stagnation temperature is: T 0 = T + v2 2c p It is helpful to write the fluid properties in terms of the Mach number M, instead of the velocity. Mach number is the velocity normalized by the local speed of sound, a = γrt. In terms of Mach number, the stagnation temperature is: ( T 0 = T 1 + γ 1 ) M 2 2 Because the static and stagnation states are isentropically related, p0 p = ( T 0 is: ( p 0 = p 1 + γ 1 ) γ M 2 γ 1 2 Use proptools to plot the stagnation state variables against Mach number: """Plot isentropic relations.""" import numpy as np from matplotlib import pyplot as plt from proptools import isentropic M = np.logspace(-1, 1) gamma = 1.2 T ) γ γ 1. Therefore, the stagnation pressure plt.loglog(m, 1 / isentropic.stag_temperature_ratio(m, gamma), label='$t / T_0$') plt.loglog(m, 1 / isentropic.stag_pressure_ratio(m, gamma), label='$p / p_0$') plt.loglog(m, 1 / isentropic.stag_density_ratio(m, gamma), label='$\\rho / \\rho_0$') plt.xlabel('mach number [-]') plt.ylabel('static / stagnation [-]') plt.title('isentropic flow relations for $\gamma={:.2f}$'.format(gamma)) plt.xlim(0.1, 10) plt.ylim([1e-3, 1.1]) plt.axvline(x=1, color='grey', linestyle=':') plt.legend(loc='lower left') plt.show() Exit velocity The exit velocity of the exhaust gas is the fundamental measure of efficiency for rocket propulsion systems, as the rocket equation shows. We can now show a basic relation between the exit velocity and the combustion conditions of the rocket. First, use the conservation of energy to relate the velocity at any two points in the flow: v 2 = 2(h 1 h 2 ) + v1 2 1.1. Nozzle Flow 5
10 0 Isentropic flow relations for = 1.20 Static / stagnation [-] 10 1 10 2 10 3 T/T 0 p/p 0 / 0 10 1 10 0 10 1 Mach number [-] 6 Chapter 1. Tutorials
We can replace the enthalpy difference with an expression of the pressures and temperatures, using the isentropic relations. ( v 2 = 2γ ( ) γ 1 ) γ 1 RT p2 γ 1 1 + v1 2 Set state 1 to be the conditions in the combustion chamber: T 1 = T c, p 1 = p c, v 1 0. Set state 2 to be the state at the nozzle exit: p 2 = p e, v 2 = v e. This gives the exit velocity: ( v e = 2γ ( ) γ 1 ) γ 1 RT pe γ c 1 p c ( = 2γ γ 1 R T ( ) γ 1 ) c pe γ 1 M where R = 8.314 J mol -1 K -1 is the universal gas constant and M is the molar mass of the exhaust gas. Temperature and molar mass have the most significant effect on exit velocity. To maximize exit velocity, a rocket should burn propellants which yield a high flame temperature and low molar mass exhaust. This is why many rockets burn hydrogen and oxygen: they yield a high flame temperature, and the exhaust (mostly H 2 and H 2 O) is of low molar mass. The pressure ratio p e /p c is usually quite small. As the pressure ratio goes to zero, the exit vleocity approaches its maximum for a given T c, M and γ. p e p c 0 1 If p e p c, the pressures have a weak effect on exit velocity. ( pe p c p 1 p c ) γ 1 γ The heat capacity ratio γ has a weak effect on exit velocity. Decreasing γ increases exit velocity. Use proptools to find the exit velocity of the example engine: """Estimate exit velocity.""" from proptools import isentropic # Declare engine design parameters p_c = 10e6 # Chamber pressure [units: pascal] p_e = 100e3 # Exit pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] m_molar = 20e-3 # Exhaust molar mass [units: kilogram mole**1] T_c = 3000. # Chamber temperature [units: kelvin] # Compute the exit velocity v_e = isentropic.velocity(v_1=0, p_1=p_c, T_1=T_c, p_2=p_e, gamma=gamma, m_molar=m_ molar) print 'Exit velocity = {:.0f} m s**-1'.format(v_e) 1 Exit velocity = 2832 m s**-1 1.1.3 Mach-Area Relation Using the isentropic relations, we can find how the Mach number of the flow varies with the cross sectional area of the nozzle. This allows the design of a nozzle geometry which will accelerate the flow the high speeds needed for rocket propulsion. 1.1. Nozzle Flow 7
Start with the conservation of mass. Because the flow is quasi- one dimensional, the mass flow through every crosssection of the nozzle must be the same: m = Avρ = const where A is the cross-sectional area of the nozzle flow passage (normal to the flow axis). To conserve mass, the ratio of areas between any two points along the nozzle axis must be: A 1 A 2 = v 2ρ 2 v 1 ρ 1 Use the isentropic relations to write the velocity and density in terms of Mach number, and simplify: A 1 A 2 = M 2 M 1 ( 1 + γ 1 2 M ) γ+1 1 2 2(γ 1) 1 + γ 1 2 M 2 2 We can use proptools to plot Mach-Area relation. Let M 2 = 1 and plot A 1 /A 2 vs M 1 : """Plot the Mach-Area relation.""" import numpy as np from matplotlib import pyplot as plt from proptools import nozzle M_1 = np.linspace(0.1, 10) # Mach number [units: dimensionless] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] area_ratio = nozzle.area_from_mach(m_1, gamma) plt.loglog(m_1, area_ratio) plt.xlabel('mach number $M_1$ [-]') plt.ylabel('area ratio $A_1 / A_2$ [-]') plt.title('mach-area relation for $M_2 = 1$') plt.ylim([1, 1e3]) plt.show() We see that the nozzle area has a minimum at M = 1. At subsonic speeds, Mach number increases as the area is decreased. At supersonic speeds (M > 1), Mach number increases as area increases. For a flow passage to accelerate gas from subsonic to supersonic speeds, it must first decrease in area, then increase in area. Therefore, most rocket nozzles have a convergent-divergent shape. Larger expansions of the divergent section lead to higher exit Mach numbers. 1.1.4 Choked Flow The station of minimum area in a converging-diverging nozzle is known as the nozzle throat. If the pressure ratio across the nozzle is at least: ( ) γ p c γ + 1 γ 1 > 1.8 p e 2 then the flow at the throat will be sonic (M = 1) and the flow in the diverging section will be supersonic. The velocity at the throat is: v t = 2γ γrt t = γ + 1 RT c The mass flow at the sonic throat (i.e. through the nozzle) is: ( γ 2 m = A t v t ρ t = A t p c γrtc γ + 1 ) γ+1 2(γ 1) 8 Chapter 1. Tutorials
10 3 Mach-Area relation for M 2 = 1 Area ratio A1/A2 [-] 10 2 10 1 10 0 10 1 10 0 10 1 Mach number M 1 [-] 1.1. Nozzle Flow 9
Fig. 1: The typical converging-diverging shape of rocket nozzles is shown in this cutaway of the Thiokol C-1 engine. Image credit: Smithsonian Institution, National Air and Space Museum 10 Chapter 1. Tutorials
Notice that the mass flow does not depend on the exit pressure. If the exit pressure is sufficiently low to produce sonic flow at the throat, the nozzle is choked and further decreases in exit pressure will not alter the mass flow. Increasing the chamber pressure increases the density at the throat, and therefore will increase the mass flow which can fit through the throat. Increasing the chamber temperature increases the throat velocity but decreases the density by a larger amount; the net effect is to decrease mass flow as 1/ T c. Use proptools to compute the mass flow of the example engine: """Check that the nozzle is choked and find the mass flow.""" from math import pi from proptools import nozzle # Declare engine design parameters p_c = 10e6 # Chamber pressure [units: pascal] p_e = 100e3 # Exit pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] m_molar = 20e-3 # Exhaust molar mass [units: kilogram mole**1] T_c = 3000. # Chamber temperature [units: kelvin] A_t = pi * (0.1 / 2)**2 # Throat area [units: meter**2] # Check choking if nozzle.is_choked(p_c, p_e, gamma): print 'The flow is choked' # Compute the mass flow [units: kilogram second**-1] m_dot = nozzle.mass_flow(a_t, p_c, T_c, gamma, m_molar) print 'Mass flow = {:.1f} kg s**-1'.format(m_dot) The flow is choked Mass flow = 45.6 kg s**-1 1.1.5 Thrust The thrust force of a rocket engine is equal to the momentum flow out of the nozzle plus a pressure force at the nozzle exit: F = mv e + (p e p a )A e where p a is the ambient pressure and A e is the nozzle exit area. We can rewrite this in terms of the chamber pressure: ( ) γ+1 ( ( ) γ 1 ) F = A t p 2γ2 2 γ 1 pe γ c 1 + (p e p a )A e γ 1 γ + 1 Note that thrust depends only on γ and the nozzle pressures and areas; not chamber temperature. Use proptools to plot thrust versus chamber pressure for the example engine: """Plot thrust vs chmaber pressure.""" p c import numpy as np from matplotlib import pyplot as plt from proptools import nozzle (continues on next page) 1.1. Nozzle Flow 11
(continued from previous page) p_c = np.linspace(1e6, 20e6) # Chamber pressure [units: pascal] p_e = 100e3 # Exit pressure [units: pascal] p_a = 100e3 # Ambient pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] A_t = np.pi * (0.1 / 2)**2 # Throat area [units: meter**2] # Compute thrust [units: newton] F = nozzle.thrust(a_t, p_c, p_e, gamma) plt.plot(p_c * 1e-6, F * 1e-3) plt.xlabel('chamber pressure $p_c$ [MPa]') plt.ylabel('thrust $F$ [kn]') plt.title('thrust vs chamber pressure at $p_e = p_a = {:.0f}$ kpa'.format(p_e * 1e-3)) plt.show() Thrust vs chamber pressure at p e = p a = 100 kpa 250 200 Thrust F [kn] 150 100 50 0 2.5 5.0 7.5 10.0 12.5 15.0 17.5 20.0 Chamber pressure p c [MPa] Note that thrust is almost linear in chamber pressure. We can also explore the variation of thrust with ambient pressure for fixed p c, p e : """Plot thrust vs ambient pressure.""" import numpy as np from matplotlib import pyplot as plt import skaero.atmosphere.coesa as atmo (continues on next page) 12 Chapter 1. Tutorials
from proptools import nozzle (continued from previous page) p_c = 10e6 # Chamber pressure [units: pascal] p_e = 100e3 # Exit pressure [units: pascal] p_a = np.linspace(0, 100e3) # Ambient pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] A_t = np.pi * (0.1 / 2)**2 # Throat area [units: meter**2] # Compute thrust [units: newton] F = nozzle.thrust(a_t, p_c, p_e, gamma, p_a=p_a, er=nozzle.er_from_p(p_c, p_e, gamma)) ax1 = plt.subplot(111) plt.plot(p_a * 1e-3, F * 1e-3) plt.xlabel('ambient pressure $p_a$ [kpa]') plt.ylabel('thrust $F$ [kn]') plt.suptitle('thrust vs ambient pressure at $p_c = {:.0f}$ MPa, $p_e = {:.0f}$ kpa'. format( p_c *1e-6, p_e * 1e-3)) # Add altitude on second axis ylim = plt.ylim() ax2 = ax1.twiny() new_tick_locations = np.array([100, 75, 50, 25, 1]) ax2.set_xlim(ax1.get_xlim()) ax2.set_xticks(new_tick_locations) def tick_function(p): """Map atmospheric pressure [units: kilopascal] to altitude [units: kilometer].""" h_table = np.linspace(84e3, 0) # altitude [units: meter] p_table = atmo.pressure(h_table) # atmo pressure [units: pascal] return np.interp(p * 1e3, p_table, h_table) * 1e-3 ax2.set_xticklabels(['{:.0f}'.format(h) for h in tick_function(new_tick_locations)]) ax2.set_xlabel('altitude [km]') ax2.tick_params(axis='y', direction='in', pad=-25) plt.subplots_adjust(top=0.8) plt.show() 1.1.6 Thrust coefficient We can normalize thrust by A t p c to give a non-dimensional measure of nozzle efficiency, which is independent of engine size or power level. This is the thrust coefficient, C F : C F F A t p c For an ideal nozzle, the thrust coefficient is: ( ) γ+1 ( C F = 2γ2 2 γ 1 1 γ 1 γ + 1 ( pe p c ) γ 1 ) γ + p e p a A e p c A t Note that C F is independent of the combustion temperature or the engine size. It depends only on the heat capacity ratio, nozzle pressures, and expansion ratio (A e /A t ). Therefore, C F is a figure of merit for the nozzle expansion 1.1. Nozzle Flow 13
process. It can be used to compare the efficiency of different nozzle designs on different engines. Values of C F are generally between 0.8 and 2.2, with higher values indicating better nozzle performance. 1.1.7 Expansion Ratio The expansion ratio is an important design parameter which affects nozzle efficiency. It is the ratio of exit area to throat area: ε A e A t The expansion ratio appears directly in the equation for thrust coefficient. The expansion ratio also allows the nozzle designer to set the exit pressure. The relation between expansion ratio and pressure ratio can be found from mass conservation and the isentropic relations: ε = A e = ρ tv t A t ρ e v e ( = γ + 1 2 ) 1 This relation is implemented in proptools: γ 1 ( p e p c ) 1 γ γ + 1 γ 1 ( 1 ( pe """Compute the expansion ratio for a given pressure ratio.""" from proptools import nozzle p c ) γ 1 ) γ 1 p_c = 10e6 p_e = 100e3 gamma = 1.2 # Chamber pressure [units: pascal] # Exit pressure [units: pascal] # Exhaust heat capacity ratio [units: dimensionless] # Solve for the expansion ratio [units: dimensionless] exp_ratio = nozzle.er_from_p(p_c, p_e, gamma) print 'Expansion ratio = {:.1f}'.format(exp_ratio) Expansion ratio = 11.9 We can also solve the inverse problem: """Compute the pressure ratio from a given expansion ratio.""" from scipy.optimize import fsolve from proptools import nozzle p_c = 10e6 # Chamber pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] exp_ratio = 11.9 # Expansion ratio [units: dimensionless] # Solve for the exit pressure [units: pascal]. p_e = p_c * nozzle.pressure_from_er(exp_ratio, gamma) print 'Exit pressure = {:.0f} kpa'.format(p_e * 1e-3) Exit pressure = 100 kpa 14 Chapter 1. Tutorials
Let us plot the effect of expansion ratio on thrust coefficient: """Effect of expansion ratio on thrust coefficient.""" import numpy as np from matplotlib import pyplot as plt from proptools import nozzle p_c = 10e6 # Chamber pressure [units: pascal] p_a = 100e3 # Ambient pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] p_e = np.linspace(0.4 * p_a, 2 * p_a) # Exit pressure [units: pascal] # Compute the expansion ratio and thrust coefficient for each p_e exp_ratio = nozzle.er_from_p(p_c, p_e, gamma) C_F = nozzle.thrust_coef(p_c, p_e, gamma, p_a=p_a, er=exp_ratio) # Compute the matched (p_e = p_a) expansion ratio exp_ratio_matched = nozzle.er_from_p(p_c, p_a, gamma) plt.plot(exp_ratio, C_F) plt.axvline(x=exp_ratio_matched, color='grey') plt.annotate('matched $p_e = p_a$, $\epsilon = {:.1f}$'.format(exp_ratio_matched), xy=(exp_ratio_matched - 0.7, 1.62), xytext=(exp_ratio_matched - 0.7, 1.62), color='black', fontsize=10, rotation=90 ) plt.xlabel('expansion ratio $\\epsilon = A_e / A_t$ [-]') plt.ylabel('thrust coefficient $C_F$ [-]') plt.title('$c_f$ vs expansion ratio at $p_c = {:.0f}$ MPa, $p_a = {:.0f}$ kpa'.format( p_c *1e-6, p_a * 1e-3)) plt.show() The thrust coefficient is maximized at the matched expansion condition, where p e = p a. Therefore, nozzle designers select the expansion ratio based on the ambient pressure which the engine is expected to operate in. Small expansion ratios are used for space launch boosters or tactical missiles, which operate at low altitudes (high ambient pressure). Large expansion ratios are used for second stage or orbital maneuvering engines, which operate in the vacuum of space. The following plot shows C F vs altitude for our example engine with two different nozzles: a small nozzle suited to a first stage application (blue curve) and a large nozzle for a second stage (orange curve). Compare these curves to the performance of a hypothetical matched nozzle, which expands to p e = p a at every altitude. The fixed-expansion nozzles perform well at their design altitude, but have lower C F than a matched nozzle at all other altitudes. """Plot C_F vs altitude.""" import numpy as np from matplotlib import pyplot as plt import skaero.atmosphere.coesa as atmo from proptools import nozzle p_c = 10e6 # Chamber pressure [units: pascal] gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] p_e_1 = 100e3 # Nozzle exit pressure, 1st stage [units: pascal] exp_ratio_1 = nozzle.er_from_p(p_c, p_e_1, gamma) # Nozzle expansion ratio [units: dimensionless] p_e_2 = 15e3 # Nozzle exit pressure, 2nd stage [units: pascal] exp_ratio_2 = nozzle.er_from_p(p_c, p_e_2, gamma) # Nozzle expansion ratio [units: dimensionless] (continues on next page) 1.1. Nozzle Flow 15
C F vs expansion ratio at p c = 10 MPa, p a = 100 kpa 1.64 Thrust coefficient CF [-] 1.63 1.62 1.61 1.60 matched pe = pa, = 11.9 7.5 10.0 12.5 15.0 17.5 20.0 22.5 Expansion ratio = A e /A t [-] 16 Chapter 1. Tutorials
Fig. 2: This illustration shows two variants of an engine family, one designed for a first stage booster (left) and the other for a second stage (right). The first stage (e.g. sea level) engine has a smaller expansion ratio than the second stage (e.g. vacuum) engine. Image credit: shadowmage. 1.1. Nozzle Flow 17
(continued from previous page) alt = np.linspace(0, 84e3) p_a = atmo.pressure(alt) # Altitude [units: meter] # Ambient pressure [units: pascal] # Compute the thrust coeffieicient of the fixed-area nozzle, 1st stage [units: dimensionless] C_F_fixed_1 = nozzle.thrust_coef(p_c, p_e_1, gamma, p_a=p_a, er=exp_ratio_1) # Compute the thrust coeffieicient of the fixed-area nozzle, 2nd stage [units: dimensionless] C_F_fixed_2 = nozzle.thrust_coef(p_c, p_e_2, gamma, p_a=p_a, er=exp_ratio_2) # Compute the thrust coeffieicient of a variable-area matched nozzle [units: dimensionless] C_F_matched = nozzle.thrust_coef(p_c, p_a, gamma) plt.plot(alt * 1e-3, C_F_fixed_1, label='1st stage $\\epsilon_1 = {:.1f}$'.format(exp_ ratio_1)) plt.plot(alt[0.4 * p_a < p_e_2] * 1e-3, C_F_fixed_2[0.4 * p_a < p_e_2], label='2nd stage $\\epsilon_2 = {:.1f}$'.format(exp_ratio_2)) plt.plot(alt * 1e-3, C_F_matched, label='matched', color='grey', linestyle=':') plt.xlabel('altitude [km]') plt.ylabel('thrust coefficient $C_F$ [-]') plt.title('effect of altitude on nozzle performance') plt.legend() plt.show() 1.1.8 Characteristic velocity We can define another performance parameter which captures the effects of the combustion gas which is supplied to the nozzle. This is the characteristic velocity, c * : For an ideal rocket, the characteristic velocity is: c * A tp c m ( c * γrtc γ + 1 = γ 2 ) γ+1 2(γ 1) The characteristic velocity depends only on the exhaust properties (γ, R) and the combustion temperature. It is therefore a figure of merit for the combustion process and propellants. c * is independent of the nozzle expansion process. The ideal c * of the example engine is: """Ideal characteristic velocity.""" from proptools import nozzle gamma = 1.2 # Exhaust heat capacity ratio [units: dimensionless] m_molar = 20e-3 # Exhaust molar mass [units: kilogram mole**1] T_c = 3000. # Chamber temperature [units: kelvin] # Compute the characteristic velocity [units: meter second**-1] c_star = nozzle.c_star(gamma, m_molar, T_c) print 'Ideal characteristic velocity = {:.0f} m s**-1'.format(c_star) 18 Chapter 1. Tutorials
Ideal characteristic velocity = 1722 m s**-1 1.1.9 Specific Impulse Finally, we arrive at specific impulse, the most important performance parameter of a rocket engine. The specific impulse is the ratio of thrust to the rate of propellant consumption: I sp F mg 0 For historical reasons, specific impulse is normalized by the constant g 0 = 9.807 m s -2, and has units of seconds. For an ideal rocket at matched exit pressure, I sp = v 2 /g 0. The specific impulse measures the fuel efficiency of a rocket engine. The specific impulse and propellant mass fraction together determine the delta-v capability of a rocket. Specific impulse is the product of the thrust coefficient and the characteristic velocity. The overall efficiency of the engine (I sp ) depends on both the combustion gas (c * ) and the efficiency of the nozzle expansion process (C F ). I sp = c* C F g 0 1.2 Solid-Propellant Rocket Motors Solid propellant rocket motors store propellant as a solid grain within the combustion chamber. When the motor is ignited, the surfaces of the propellant grain burn and produce hot gas, which is expelled from the chamber through a nozzle to produce thrust. However, in most solid rocket motors, no mechanism exists to control the chamber pressure and thrust during flight. Rather, the chamber pressure of a solid rocket motor arises from an equilibrium between exhaust generation from combustion and exhaust discharge through the nozzle. The rest of this page reviews the fundamentals solid propellants, and demonstrates the use of proptools.solid to predict the performance of a solid rocket motor. 1.2.1 Applications of Solid Rocket Motors Compared to liquid-propellant rocket engines, solid propellant motors are mechanically simpler, require less support equipment and time to prepare for launch, and can be stored for long times loaded and ready for launch. Therefore, solid motors are preferred for most military applications, which may need to be fired from mobile launchers (e.g. tactical missiles) or be quickly ready for launch after many years of storage (e.g. strategic missiles). The mechanical simplicity of solid motors is also favors their use in some space-launch applications. 1.2.2 Propellant Ingredients Chemical requirements of solid propellants A solid propellant contains both fuel and oxidizer mixed together. This is different from most other combustion systems, where the fuel and oxidizer are only mixed just before combustion (e.g. internal combustion engines, torches, liquid bi-propellant rocket engines). This poses a chemistry challenge: the propellant ingredients must react energetically with each other, but also be safely stored and handled while mixed together. Clearly, a formulation which 1.2. Solid-Propellant Rocket Motors 19
spontaneously ignites during mixing has no practical value as a storable solid propellant. A propellant must also not ignite when exposed to mechanical shock, heat or electrostatic discharges during handling. A propellant which is resistant to these accidental ignition sources is said to have low sensitivity. In chemical terms, low sensitivity roughly requires that the combustion reaction have high activation energy. A further difference between solid rocket motors and most other combustion devices is that the motor contains all its propellant in the combustion chamber, rather than gradually injecting it as it is to be burned. This means that the rate of propellant consumption is not governed by a throttle or injector, but by the chemical dynamics of the combustion reaction. The propellant must burn at a stable and predictable rate. Ingredient sets which react very quickly may be useful as explosives, but not as propellants. In summary, the choice of ingredients must produce a solid propellant which: 1. stores a large amount of chemical potential energy, and reacts to provide hot gas for propulsion 2. is resistant to accidental ignition during production, storage and handling 3. burns at a stable and predictable rate Ammonium perchlorate composite propellant Ammonium perchlorate composite propellant (APCP) is the most-used solid propellant composition in space launch applications (e.g. the Space Shuttle s Reusable Solid Rocket Motor, Orbital ATK s Star motor series). APCP is energetic (up to ~270 seconds of specific impulse), is resistant to accidental ignition, and will burn stably in a properly designed motor. APCP contains a solid oxidizer (ammonium perchlorate) and (optionally) a powdered metal fuel, held together by a rubber-like binder. Ammonium perchlorate is a crystalline solid, which divided into small particles (10 to 500 μm) and dispersed though the propellant. During combustion, the ammonium perchlorate decomposes to produce a gas rich in oxidizing species. A polymer matrix, the binder, binds the oxidizer particles together, giving the propellant mechanical strength. The binder serves as a fuel, giving off hydrocarbon vapors during combustion. Additional fuel may be added as hot-burning metal powder dispersed in the binder. 1.2.3 Combustion Process The combustion process of a composite propellant has many steps, and the flame structure is complex. Although the propellant is a solid, important reactions, including combustion of the fuel with the oxidizer, occur in the gas phase. A set of flames hover over the surface of the burning propellant. These flames transfer heat to the propellant surface, causing its solid components to decompose into gases. The gaseous decomposition products contain fuel vapor and oxidizing species, which supply the flames with reactants. Importantly, the combustion process contains a feedback loop. Heat from the flames vaporizes the surface, and vapor from the surface provides fuel and oxidizer to the flames. The rate at which this process proceeds depends on chemical kinetics, mass transfer, and heat transfer within the combustion zone. Importantly, the feedback rate depends on pressure. As we will see in the next section, the rate of propellant combustion determines the chamber pressure and thrust of a solid rocket motor. Effect of pressure on burn rate The flame structure described above causes the propellant to burn faster at higher pressures. At higher pressures, the gas phase is denser, causing reactions and diffusion to proceed more quickly. This moves the flame structure closer to the surface. The closer flames and denser conducing medium enhance heat transfer to the surface, which drives more decomposition, increasing the burn rate. 20 Chapter 1. Tutorials
Fig. 3: A composite propellant consists of crystalline oxidizer particles, and possibly a metal fuel powder, dispersed in a polymer binder. 1.2. Solid-Propellant Rocket Motors 21
Fig. 4: The typical flame structure of composite propellant combustion. Heat from the flames decomposes the ammonium perchlorate and binder, which in turn supply oxidizing (AP) and fuel (binder) gases to the flames. 22 Chapter 1. Tutorials
Although this dependence is complicated, it can be empirically described by Vieille s Law, which relates the burn rate r to the chamber pressure p c via two parameters: r = a(p c ) n r is the rate at which the surface regresses, and has units of velocity. a is the burn rate coefficient, which has units of [velocity (pressure) -n ]. n is the unitless burn rate exponent. The model parameters a, n must be determined by combustion experiments on the propellant. 1.2.4 Motor Internal Ballistics The study of propellant combustion and fluid dynamics within a rocket motor is called internal ballistics. Internal ballistics can be used to estimate the chamber pressure and thrust of a motor. Equilibrium chamber pressure The operating chamber pressure of a solid motor is set by an equilibrium between exhaust generation from combustion and exhaust discharge through the nozzle. The chamber pressure of a solid rocket motor is related to the mass of combustion gas in the chamber by the Ideal Gas Law: p c = mrt c 1 V c where R is the specific gas constant of the combustion gases in the chamber, T c is their temperature, and V c is the chamber volume. Gas mass is added to the chamber by burning propellant, and mass flows out of the chamber through the nozzle. The rate of change of the chamber gas mass is: dm dt = m combustion m nozzle Ideal nozzle theory relates the mass flow through the nozzle to the chamber pressure and the Characteristic velocity: The rate of gas addition from combustion is: m nozzle = p ca t c * m combustion = A b ρ s r(p c ) where :math: A_b is the burn area of the propellant, ρ s is the density of the solid propellant, and r(p c ) is the burn rate (a function of chamber pressure). At the equilibrium chamber pressure where the inflow and outflow rates are equal: dm dt = m combustion m nozzle = 0 A b ρ s r(p c ) = p ca t c * p c = A b A t ρ s c * r(p c ) = Kρ s c * r(p c ) where K A b A t is ratio of burn area to throat area. If the propellant burn rate is well-modeled by Vieille s Law, the equilibrium chamber pressure can be solved for in closed form: p c = (Kρ s c * a) 1 1 n Consider an example motor. The motor burns a relatively slow-burning propellant with the following properties: 1.2. Solid-Propellant Rocket Motors 23
Burn rate exponent of 0.5, and a burn rate of 2.54 mm s -1 at 6.9 MPa Exhaust ratio of specific heats of 1.26 Characteristic velocity of 1209 m s -1 Solid density of 1510 kg m -3 The motor has a burn area of 1.25 m 2, and a throat area of 839 mm 2 (diameter of 33 mm). Plot the combustion and nozzle mass flow rates versus pressure: """Illustrate the chamber pressure equilibrium of a solid rocket motor.""" from matplotlib import pyplot as plt import numpy as np p_c = np.linspace(1e6, 10e6) # Chamber pressure [units: pascal]. # Propellant properties gamma = 1.26 # Exhaust gas ratio of specific heats [units: dimensionless]. rho_solid = 1510. # Solid propellant density [units: kilogram meter**-3]. n = 0.5 # Propellant burn rate exponent [units: dimensionless]. a = 2.54e-3 * (6.9e6)**(-n) # Burn rate coefficient, such that the propellant # burns at 2.54 mm s**-1 at 6.9 MPa [units: meter second**-1 pascal**-n]. c_star = 1209. # Characteristic velocity [units: meter second**-1]. # Motor geometry A_t = 839e-6 # Throat area [units: meter**2]. A_b = 1.25 # Burn area [units: meter**2]. # Compute the nozzle mass flow rate at each chamber pressure. # [units: kilogram second**-1]. m_dot_nozzle = p_c * A_t / c_star # Compute the combustion mass addition rate at each chamber pressure. # [units: kilogram second**-1]. m_dot_combustion = A_b * rho_solid * a * p_c**n # Plot the mass rates plt.plot(p_c * 1e-6, m_dot_nozzle, label='nozzle') plt.plot(p_c * 1e-6, m_dot_combustion, label='combustion') plt.xlabel('chamber pressure [MPa]') plt.ylabel('mass rate [kg / s]') # Find where the mass rates are equal (e.g. the equilibrium). i_equil = np.argmin(abs(m_dot_combustion - m_dot_nozzle)) m_dot_equil = m_dot_nozzle[i_equil] p_c_equil = p_c[i_equil] # Plot the equilibrium point. plt.scatter(p_c_equil * 1e-6, m_dot_equil, marker='o', color='black', label= 'Equilibrium') plt.axvline(x=p_c_equil * 1e-6, color='grey', linestyle='--') plt.title('chamber pressure: stable equilibrium, $n =$ {:.1f}'.format(n)) plt.legend() plt.show() The nozzle and combustion mass flow rates are equal at 6.9 MPa: this is the equilibrium pressure of the motor. This 24 Chapter 1. Tutorials
7 6 Chamber pressure: stable equilibrium, n = 0.5 Nozzle Combustion Equilibrium Mass rate [kg / s] 5 4 3 2 1 2 4 6 8 10 Chamber pressure [MPa] 1.2. Solid-Propellant Rocket Motors 25
equilibrium is stable: At lower pressures, the combustion mass addition rate is higher than the nozzle outflow rate, so the mass of gas in the chamber will increase and the pressure will rise to the equilibrium value. At higher pressures, the combustion mass addition rate is lower than the nozzle outflow rate, so the mass of gas in the chamber will decrease and the pressure will fall to the equilibrium value. In general, a stable equilibrium pressure will exist for propellants with n < 1 (i.e. burn rate is sub-linear in pressure). We can use proptools to quickly find the chamber pressure and thrust of the example motor: """Find the chamber pressure and thrust of a solid rocket motor.""" from proptools import solid, nozzle # Propellant properties gamma = 1.26 # Exhaust gas ratio of specific heats [units: dimensionless]. rho_solid = 1510. # Solid propellant density [units: kilogram meter**-3]. n = 0.5 # Propellant burn rate exponent [units: dimensionless]. a = 2.54e-3 * (6.9e6)**(-n) # Burn rate coefficient, such that the propellant # burns at 2.54 mm s**-1 at 6.9 MPa [units: meter second**-1 pascal**-n]. c_star = 1209. # Characteristic velocity [units: meter second**-1]. # Motor geometry A_t = 839e-6 # Throat area [units: meter**2]. A_b = 1.25 # Burn area [units: meter**2]. # Nozzle exit pressure [units: pascal]. p_e = 101e3 # Compute the chamber pressure [units: pascal]. p_c = solid.chamber_pressure(a_b / A_t, a, n, rho_solid, c_star) # Compute the sea level thrust [units: newton]. F = nozzle.thrust(a_t, p_c, p_e, gamma) print 'Chamber pressure = {:.1f} MPa'.format(p_c * 1e-6) print 'Thrust (sea level) = {:.1f} kn'.format(f * 1e-3) Chamber pressure = 6.9 MPa Thrust (sea level) = 9.1 kn Burn area evolution and thrust curves In most propellant grain geometries, the burn area of the propellant grain changes as the flame front advances and propellant is consumed. This change in burn area causes the chamber pressure and thrust to change during the burn. The variation of thrust (or chamber pressure) with time is called a thrust curve. Thrust curves are classified as regressive (decreasing with time), neutral or progressive (increasing with time). If we know how the burn area A b varies with the flame front progress distance x, we can use proptools to predict the thrust curve. For example, consider a cylindrical propellant with a hollow circular core. The core radius r in is 0.15 m, the outer radius r out is 0.20 m, and the length L is 1.0 m. The burn area is given by: A b (x) = 2π(r in + x)l 26 Chapter 1. Tutorials
Fig. 5: Dimensions of the example cylindrical propellant grain. Assume that the propellant properties are the same as in the previous example. The nozzle throat area is still 839 mm 2, and the nozzle expansion area ratio is 8. """Plot the thrust curve of a solid rocket motor with a cylindrical propellant grain." "" from matplotlib import pyplot as plt import numpy as np from proptools import solid # Grain geometry (Clinder with circular port) r_in = 0.15 # Grain inner radius [units: meter]. r_out = 0.20 # Grain outer radius [units: meter]. length = 1.0 # Grain length [units: meter]. # Propellant properties gamma = 1.26 # Exhaust gas ratio of specific heats [units: dimensionless]. rho_solid = 1510. # Solid propellant density [units: kilogram meter**-3]. n = 0.5 # Propellant burn rate exponent [units: dimensionless]. a = 2.54e-3 * (6.9e6)**(-n) # Burn rate coefficient, such that the propellant # burns at 2.54 mm s**-1 at 6.9 MPa [units: meter second**-1 pascal**-n]. c_star = 1209. # Characteristic velocity [units: meter second**-1]. # Nozzle geometry A_t = 839e-6 # Throat area [units: meter**2]. A_e = 8 * A_t # Exit area [units: meter**2]. p_a = 101e3 # Ambeint pressure during motor firing [units: pascal]. # Burning surface evolution x = np.linspace(0, r_out - r_in) # Flame front progress steps [units: meter]. A_b = 2 * np.pi * (r_in + x) * length # Burn area at each flame progress step [units: meter**2]. # Compute thrust curve. t, p_c, F = solid.thrust_curve(a_b, x, A_t, A_e, p_a, a, n, rho_solid, c_star, gamma) # Plot results. ax1 = plt.subplot(2, 1, 1) (continues on next page) 1.2. Solid-Propellant Rocket Motors 27
plt.plot(t, p_c * 1e-6) plt.ylabel('chamber pressure [MPa]') (continued from previous page) ax2 = plt.subplot(2, 1, 2) plt.plot(t, F * 1e-3) plt.ylabel('thrust, sea level [kn]') plt.xlabel('time [s]') plt.setp(ax1.get_xticklabels(), visible=false) plt.tight_layout() plt.subplots_adjust(hspace=0) plt.show() Chamber pressure [MPa] Thrust, sea level [kn] 7.0 6.5 6.0 5.5 5.0 4.5 4.0 9 8 7 6 5 0 5 10 15 20 Time [s] Note that the pressure and thrust increase with time (the thrust curve is progressive). This grain has a progressive thrust curve because the burn area increases with x as the flame front moves outward from the initial core. Solid motor designers have devised a wide variety of grain geometries to achieve different thrust curves. 28 Chapter 1. Tutorials
Fig. 6: Various grains and their thrust curves. Reprinted from Richard Nakka s rocketry page. 1.3 Electric Propulsion Basics 1.3.1 Electrostatic Thrust Generation Like all rockets, electric thrusters generate thrust by expelling mass at high velocity. In electric (electrostatic) propulsion, a high-velocity jet is produced by accelerating charged particles through an electric potential. The propellant medium in electrostatic thrusters is a plasma consisting of electrons and positively charged ions. The plasma is usually produced by ionizing a gas via electron bombardment. The electric fields within the thruster are configured such that there is a large potential drop between the plasma generation region and the thruster exit. When ions exit the thruster, the are accelerated to high velocities by the electrostatic force. If the ions fall through a beam potential of V b, they will leave the thruster with a velocity q v e = 2V b where q is the ion charge and m i is the ion mass. The thrust produced by the ion flow is where I b is the ion beam current. F = v e m ( q = 2V b m i = I b 2V b m i q m i ) ( ) mi q I b 1.3. Electric Propulsion Basics 29
The ideal specific impulse of an electrostatic thruster is: I sp = v e g 0 = 1 2V b g 0 As an example, use proptools to compute the thrust and specific impulse of singly charged Xenon ions with a beam voltage of 1000 V and a beam current of 1 A: """Example electric propulsion thrust and specific impulse calculation.""" from proptools import electric, constants V_b = 1000. # Beam voltage [units: volt]. I_b = 1. # Beam current [units: ampere]. F = electric.thrust(i_b, V_b, electric.m_xe) I_sp = electric.specific_impulse(v_b, electric.m_xe) m_dot = F / (I_sp * constants.g) print 'Thrust = {:.1f} mn'.format(f * 1e3) print 'Specific Impulse = {:.0f} s'.format(i_sp) print 'Mass flow = {:.2f} mg s^-1'.format(m_dot * 1e6) q m i Thrust = 52.2 mn Specific Impulse = 3336 s Mass flow = 1.59 mg s^-1 This example illustrates the typical performance of electric propulsion systems: low thrust, high specific impulse, and low mass flow. 1.3.2 Advantages over Chemical Propulsion Electric propulsion is appealing because it enables higher specific impulse than chemical propulsion. The specific impulse of a chemical rocket depends on velocity to which a nozzle flow can be accelerated. This velocity is limited by the finite energy content of the working gas. In contrast, the particles leaving an electric thruster can be accelerated to very high velocities if sufficient electrical power is available. In a chemical rocket, the kinetic energy of the exhaust gas is supplied by thermal energy released in a combustion reaction. For example, in the stoichiometric combustion of H 2 and O 2 releases an energy per particle of 4.01 10 19 J, or 2.5 ev. If all of the released energy were converted into kinetic energy of the exhaust jet, the maximum possible exhaust velocity would be: E v e = 2 = 5175 ms 1 m H2O corresponding to a maximum specific impulse of about 530 s. In practice, the most efficient flight engines have specific impulses of 450 to 500 s. With electric propulsion, much higher energies per particle are possible. If we accelerate (singly) charged particles through a potential of 1000 V, the jet kinetic energy will be 1000 ev per ion. This is 400 times more energy per particle than is possible with chemical propulsion (or, for similar particle masses, 20 times higher specific impulse). Specific impulse in excess of 10,000 s is feasible with electric propulsion. 30 Chapter 1. Tutorials
1.3.3 Power and Efficiency In an electric thruster, the energy to accelerate the particles in the jet must be supplied by an external source. Typically solar panels supply this electrical power, but some future concepts might use nuclear reactors. The available power limits the thrust and specific impulse of an electric thruster. The kinetic power of the jet is given by: P jet = F 2 2 m where m is the jet mass flow. Increasing thrust with increasing mass flow (i.e. increasing I sp ) will increase the kinetic power of the jet. The power input required by the thruster (P in ) is somewhat higher than the jet power. The ratio of the jet and input power is the total efficiency of the thruster, η T : The total efficiency depends on several factors: η T P jet P in 1. Thrust losses due to beam divergence. This loss is proportional to the cosine of the average beam divergence half-angle. 2. Thrust losses due to doubly charged ions in the beam. This loss is a function of the doubles-to-singles current ratio, I ++ /I + 3. Thrust losses due to propellant gas escaping the thruster without being ionized. The fraction of the propellant mass flow which is ionized and enters the beam is the mass utilization efficiency, η m. 4. Electrical losses incurred in ion generation, power conversion, and powering auxiliary thruster components. These losses are captured by the electrical efficiency, η e = I bv b P in Use proptools to compute the efficiency and required power of the example thruster. Assume that the beam divergence is cos(10xb0), the double ion current fraction is 10%, the mass utilization efficiency is 90%, and the electrical efficiency is 85%: """Example electric propulsion power calculation.""" import numpy as np from proptools import electric F = 52.2e-3 # Thrust [units: newton]. m_dot = 1.59e-6 # Mass flow [units: kilogram second**-1]. # Compute the jet power [units: watt]. P_jet = electric.jet_power(f, m_dot) # Compute the total efficiency [units: dimensionless]. eta_t = electric.total_efficiency( divergence_correction=np.cos(np.deg2rad(10)), double_fraction=0.1, mass_utilization=0.9, electrical_efficiency=0.85) # Compute the input power [units: watt]. P_in = P_jet / eta_t print 'Jet power = {:.0f} W'.format(P_jet) print 'Total efficiency = {:.3f}'.format(eta_T) print 'Input power = {:.0f} W'.format(P_in) 1.3. Electric Propulsion Basics 31
Jet power = 857 W Total efficiency = 0.703 Input power = 1219 W The overall efficiency of the thruster is about 70%. The required input power could be supplied by a few square meters of solar panels (at 1 AU from the sun). The power, thrust, and specific impulse of a thruster are related by: F P in = 2η T g 0 I sp Thus, for a power-constrained system the propulsion designer faces a trade-off between thrust and specific impulse. """Plot the thrust, power, Isp trade-off.""" from matplotlib import pyplot as plt import numpy as np from proptools import electric eta_t = 0.7 # Total efficiency [units: dimensionless]. I_sp = np.linspace(1e3, 7e3) # Specific impulse [units: second]. ax1 = plt.subplot(111) for P_in in [2e3, 1e3, 500]: T = P_in * electric.thrust_per_power(i_sp, eta_t) plt.plot(i_sp, T * 1e3, label='$p_{{in}} = {:.1f}$ kw'.format(p_in * 1e-3)) plt.xlim([1e3, 7e3]) plt.ylim([0, 290]) plt.xlabel('specific impulse [s]') plt.ylabel('thrust [mn]') plt.legend() plt.suptitle('thrust, Power and $I_{sp}$ (70% efficient thruster)') plt.grid(true) # Add thrust/power on second axis. ax2 = ax1.twiny() new_tick_locations = ax1.get_xticks() ax2.set_xlim(ax1.get_xlim()) ax2.set_xticks(new_tick_locations) ax2.set_xticklabels(['{:.0f}'.format(tp * 1e6) for tp in electric.thrust_per_power(new_tick_locations, eta_t)]) ax2.set_xlabel('thrust/power [$\\mathrm{mn \\, kw^{-1}}$]') ax2.tick_params(axis='y', direction='in', pad=-25) plt.subplots_adjust(top=0.8) plt.show() 1.3.4 Optimal Specific Impulse For electrically propelled spacecraft, there is an optimal specific impulse which will maximize the payload mass fraction of a given mission. While increasing specific impulse decreases the required propellant mass, it also increases the required power at a particular thrust level, which increases the mass of the power supply. The optimal specific impulse minimizes the combined mass of the propellant and power supply. 32 Chapter 1. Tutorials
Thrust, Power and I sp (70% efficient thruster) Thrust/power [mnkw 1 ] 143 71 48 36 29 24 20 250 P in = 2.0 kw P in = 1.0 kw P in = 0.5 kw 200 Thrust [mn] 150 100 50 0 1000 2000 3000 4000 5000 6000 7000 Specific impulse [s] 1.3. Electric Propulsion Basics 33
The optimal specific impulse depends on several factors: 1. The mission thrust duration, t m. Longer thrust durations reduce the required thrust (if the same total impulse or v is to be delivered), and therefore reduce the power and power supply mass at a given I sp. Therefore, longer thrust durations increase the optimal I sp. 2. The specific mass of the power supply, α. This is the ratio of power supply mass to power, and is typically 20 to 200 kg kw -1 for solar-electric systems. The specific impulse optimization assumes that power supply mass is linear with respect to power. Increasing the specific mass reduces the optimal I sp. 3. The total efficiency of the thruster. 4. The v of the mission. Higher v (in a fixed time window) requires more thrust, and therefore leads to a lower optimal I sp. Consider an example mission to circularize the orbit of a geostationary satellite launched onto a elliptical transfer orbit. Assume that the low-thrust circularization maneuver requires a v of 2 km s -1 over 100 days. The thruster is 70% efficient and the power supply specific mass is 50 kg kw -1 : """Example calculation of optimal specific impulse for an electrically propelled spacecraft.""" from proptools import electric dv = 2e3 # Delta-v [units: meter second**-1]. t_m = 100 * 24 * 60 * 60 # Thrust duration [units: second]. eta_t = 0.7 # Total efficiency [units: dimensionless]. specific_mass = 50e-3 # Specific mass of poower supply [units: kilogram watt**-1]. I_sp = electric.optimal_isp_delta_v(dv, eta_t, t_m, specific_mass) print 'Optimal specific impulse = {:.0f} s'.format(i_sp) Optimal specific impulse = 1482 s For the mathematical details of specific impulse optimization, see [Lozano]. 34 Chapter 1. Tutorials