proptools Documentation

Similar documents
AAE SOLID ROCKET PROPULSION (SRP) SYSTEMS

Rocket Propulsion. Combustion chamber Throat Nozzle

Technology of Rocket

Richard Nakka's Experimental Rocketry Web Site

3. Write a detailed note on the following thrust vector control methods:

Multistage Rocket Performance Project Two

11.1 Survey of Spacecraft Propulsion Systems

Contents. Preface... xvii

Design And Analysis Of Thrust Chamber Of A Cryogenic Rocket Engine S. Senthilkumar 1, Dr. P. Maniiarasan 2,Christy Oomman Jacob 2, T.

Rocket Thermodynamics

Section 4.1: Introduction to Jet Propulsion. MAE Propulsion Systems II

Rocket Propulsion Prof. K. Ramamurthi Department of Mechanical Engineering Indian Institute of Technology, Madras

Rocket Propulsion Overview

Rocket Propulsion Prof. K. Ramamurthi Department of Mechanical Engineering Indian Institute of Technology, Madras

IX. COMPRESSIBLE FLOW. ρ = P

Rocket Dynamics. Forces on the Rocket

Please welcome for any correction or misprint in the entire manuscript and your valuable suggestions kindly mail us

Propulsion Systems Design

Solid Rocket Motor Internal Ballistics Using a. Least-Distance Surface-Regression Method

Propulsion Systems Design MARYLAND. Rocket engine basics Solid rocket motors Liquid rocket engines. Hybrid rocket engines Auxiliary propulsion systems

Propulsion Systems Design MARYLAND. Rocket engine basics Survey of the technologies Propellant feed systems Propulsion systems design

Applied Thermodynamics - II

CONTENTS Real chemistry e ects Scramjet operating envelope Problems

Rockets, Missiles, and Spacecrafts

Propulsion Systems Design MARYLAND. Rocket engine basics Survey of the technologies Propellant feed systems Propulsion systems design

An introduction to the plasma state in nature and in space

PROPULSIONE SPAZIALE. Chemical Rocket Propellant Performance Analysis

GAS DYNAMICS AND JET PROPULSION

Jet Aircraft Propulsion Prof. Bhaskar Roy Prof. A.M. Pradeep Department of Aerospace Engineering

IV. Rocket Propulsion Systems. A. Overview

MARYLAND. Rocket engine basics Survey of the technologies Propellant feed systems Propulsion systems design U N I V E R S I T Y O F

Review of Fundamentals - Fluid Mechanics

Homework 2, part 2! ii) Calculate and plot design spike contour,

Unified Propulsion Quiz May 7, 2004

Jet Propulsion. Lecture Ujjwal K Saha, Ph. D. Department of Mechanical Engineering Indian Institute of Technology Guwahati

1. (a) Describe the difference between over-expanded, under-expanded and ideallyexpanded

Rocket Propulsion Basics Thrust

Rocket propulsion Prof. K. Ramamurthi Department of Mechanical Engineering Indian Institute of Technology, Madras. Lecture 09 Theory of Nozzles

AAE COMBUSTION AND THERMOCHEMISTRY

Computational Fluid Dynamics Analysis of Advanced Rocket Nozzle

Rocket Propulsion Prof. K. Ramamurthi Department of Mechanical Engineering Indian Institute of Technology, Madras

The Turbofan cycle. Chapter Turbofan thrust

Jet Aircraft Propulsion Prof. Bhaskar Roy Prof A M Pradeep Department of Aerospace Engineering Indian Institute of Technology, Bombay

Homework # cm. 11 cm cm. 100 cm. MAE Propulsion Systems, II

Design and Optimization of De Lavel Nozzle to Prevent Shock Induced Flow Separation

A Computational Study on the Thrust Performance of a Supersonic Pintle Nozzle

Departures from Ideal Performance for Conical Nozzles and Bell Nozzles, Straight-Cut Throats and Rounded Throats Charles E. Rogers

Applied Gas Dynamics Flow With Friction and Heat Transfer

Propulsion Systems Design

BravoSat: Optimizing the Delta-V Capability of a CubeSat Mission. with Novel Plasma Propulsion Technology ISSC 2013

One-Dimensional Isentropic Flow

Introduction. In general, gases are highly compressible and liquids have a very low compressibility. COMPRESSIBLE FLOW

AEROSPACE ENGINEERING DEPARTMENT. Second Year - Second Term ( ) Fluid Mechanics & Gas Dynamics

Lecture with Numerical Examples of Ramjet, Pulsejet and Scramjet

Rocket Propulsion. Reacting Flow Issues

The ramjet cycle. Chapter Ramjet flow field

Chapter 17. For the most part, we have limited our consideration so COMPRESSIBLE FLOW. Objectives

Design and Performance Characteristics of a Rocket Using Potassium Nitrate and Sucrose as Propellants

Fluid Mechanics - Course 123 COMPRESSIBLE FLOW

SOLID ROCKET MOTOR INTERNAL BALLISTICS SIMULATION USING DIFFERENT BURNING RATE MODELS

Chapter 7 Rocket Propulsion Physics

Rocket Propulsion Prof. K. Ramamurthi Department of Mechanical Engineering Indian Institute of Technology, Madras

AME 436. Energy and Propulsion. Lecture 15 Propulsion 5: Hypersonic propulsion

Altitude Dependence of Rocket Motor Performance

Compressible Flow. Professor Ugur GUVEN Aerospace Engineer Spacecraft Propulsion Specialist

Lecture-2. One-dimensional Compressible Fluid Flow in Variable Area

Thermal Radiation Studies for an Electron-Positron Annihilation Propulsion System

SOLUTIONS MANUAL. ROCKET PROPULSION ELEMENTS, 8 th EDITION. By George P. Sutton and Oscar Biblarz. Published by John Wiley & Sons, Inc.

How Small Can a Launch Vehicle Be?

Chapter 1 Introduction and Basic Concepts

MONTANA STATE UNIVERSITY DEPARTMENT OF MECHANICAL ENGINEERING. EMEC 426 Thermodynamics of Propulsion Systems. Spring 2017

ROCKET PROPULSION. the pressure of the ambient atmosphere, P e. their ejection speed. Thrust is specified either at sea level or in a vacuum.

CHAPTER 5 MASS AND ENERGY ANALYSIS OF CONTROL VOLUMES

CONCEPTS AND DEFINITIONS. Prepared by Engr. John Paul Timola

Solar Thermal Propulsion

Lecture1: Characteristics of Hypersonic Atmosphere

Jet Aircraft Propulsion Prof. Bhaskar Roy Prof. A M Pradeep Department of Aerospace Engineering Indian Institute of Technology, Bombay

6.1 Propellor e ciency

Gasdynamics 1-D compressible, inviscid, stationary, adiabatic flows

MagBeam: R. Winglee, T. Ziemba, J. Prager, B. Roberson, J Carscadden Coherent Beaming of Plasma. Separation of Power/Fuel from Payload

EVALUATION OF THE BEHAVIOUR OF STEAM EXPANDED IN A SET OF NOZZLES, IN A GIVEN TEMPERATURE

Satellite Orbital Maneuvers and Transfers. Dr Ugur GUVEN

Modelling Nozzle throat as Rocket exhaust

Notes #4a MAE 533, Fluid Mechanics

Engineering Thermodynamics. Chapter 1. Introductory Concepts and Definition

Civil aeroengines for subsonic cruise have convergent nozzles (page 83):

DEVELOPMENT OF A ONE DIMENSIONAL ANALYSIS PROGRAM FOR SCRAMJET AND RAMJET FLOWPATHS

Basic Ascent Performance Analyses

LAUNCH SYSTEMS. Col. John Keesee. 5 September 2003

Mass Estimating Relationships MARYLAND. Review of iterative design approach Mass Estimating Relationships (MERs) Sample vehicle design analysis

MONTANA STATE UNIVERSITY DEPARTMENT OF MECHANICAL ENGINEERING. EMEC 426 Thermodynamics of Propulsion Systems. Spring 2018

Introduction to Chemical Engineering Thermodynamics. Chapter 7. KFUPM Housam Binous CHE 303

PROTEAN : Neutral Entrainment Thruster Demonstration

SPC 407 Sheet 2 - Solution Compressible Flow - Governing Equations


Physics 122, Fall September 2012

Introduction to Aerospace Engineering

Initial Trajectory and Atmospheric Effects

UNIFIED ENGINEERING Fall 2003 Ian A. Waitz

IAC-13,C4,P,44.p1,x17254 THE DYNAMIC OPERATON OF A HIGH Q EMDRIVE MICROWAVE THRUSTER. Roger Shawyer C.Eng. MIET. FRAeS. SPR Ltd UK

Transcription:

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