Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/aerospace/atmospheric_reentry.tex
51 views
unlisted
1
\documentclass[a4paper, 11pt]{article}
2
\usepackage[utf8]{inputenc}
3
\usepackage[T1]{fontenc}
4
\usepackage{amsmath, amssymb}
5
\usepackage{graphicx}
6
\usepackage{siunitx}
7
\usepackage{booktabs}
8
\usepackage{algorithm2e}
9
\usepackage{subcaption}
10
\usepackage[makestderr]{pythontex}
11
12
% Theorem environments for research paper style
13
\newtheorem{definition}{Definition}
14
\newtheorem{theorem}{Theorem}
15
\newtheorem{remark}{Remark}
16
17
\title{Atmospheric Reentry Analysis: Heat Flux, Trajectory, and Ablation Modeling\\
18
\large A Comprehensive Study of Ballistic and Lifting Reentry Profiles}
19
\author{Aerospace Systems Division\\Computational Science Templates}
20
\date{\today}
21
22
\begin{document}
23
\maketitle
24
25
\begin{abstract}
26
This research paper presents a comprehensive analysis of atmospheric reentry dynamics for spacecraft vehicles. We develop and compare ballistic and lifting reentry trajectories, computing time histories of altitude, velocity, deceleration, and stagnation-point heat flux. The analysis includes an exponential atmospheric model, Sutton-Graves heat flux correlation, and a simplified ablation model for thermal protection system sizing. Multiple entry angles and ballistic coefficients are evaluated to determine optimal reentry profiles for human-rated and cargo vehicles.
27
\end{abstract}
28
29
\section{Introduction}
30
Atmospheric reentry is one of the most challenging phases of space flight, subjecting vehicles to extreme thermal and mechanical loads. The kinetic energy of an orbiting spacecraft must be dissipated through aerodynamic drag and converted to heat, much of which is transferred to the vehicle surface. Understanding the physics of reentry is essential for thermal protection system (TPS) design and crew safety.
31
32
\begin{definition}[Ballistic Coefficient]
33
The ballistic coefficient characterizes a vehicle's resistance to atmospheric drag:
34
\begin{equation}
35
\beta = \frac{m}{C_D A}
36
\end{equation}
37
where $m$ is vehicle mass, $C_D$ is drag coefficient, and $A$ is reference area. Higher $\beta$ results in faster descent and higher heating rates.
38
\end{definition}
39
40
\section{Mathematical Framework}
41
42
\subsection{Equations of Motion}
43
For planar reentry, the equations of motion in a rotating frame are:
44
\begin{align}
45
\frac{dV}{dt} &= -\frac{\rho V^2}{2\beta} - g\sin\gamma \label{eq:velocity}\\
46
\frac{d\gamma}{dt} &= \frac{1}{V}\left[\left(\frac{V^2}{r} - g\right)\cos\gamma + \frac{L}{m}\right] \label{eq:flight_path}\\
47
\frac{dh}{dt} &= V\sin\gamma \label{eq:altitude}\\
48
\frac{dr_d}{dt} &= \frac{V\cos\gamma \cdot R_E}{R_E + h} \label{eq:range}
49
\end{align}
50
where $V$ is velocity, $\gamma$ is flight path angle (negative for descent), $h$ is altitude, and $r_d$ is downrange distance.
51
52
\subsection{Atmospheric Model}
53
We employ an exponential atmosphere:
54
\begin{equation}
55
\rho(h) = \rho_0 \exp\left(-\frac{h}{H}\right)
56
\end{equation}
57
with scale height $H \approx 8.5$ km for Earth's lower atmosphere.
58
59
\subsection{Heating Relations}
60
61
\begin{theorem}[Sutton-Graves Correlation]
62
The convective heat flux at the stagnation point of a blunt body is:
63
\begin{equation}
64
\dot{q}_s = C \sqrt{\frac{\rho}{r_n}} V^3
65
\end{equation}
66
where $C = 1.83 \times 10^{-4}$ W$\cdot$m$^{-1.5}$/(kg$^{0.5}$m$^{-3}$s$^{-3}$) and $r_n$ is the nose radius.
67
\end{theorem}
68
69
The total heat load is the integral over the trajectory:
70
\begin{equation}
71
Q = \int_0^{t_f} \dot{q}_s \, dt
72
\end{equation}
73
74
\subsection{Ablation Model}
75
For ablative TPS, the surface recession rate is:
76
\begin{equation}
77
\dot{s} = \frac{\dot{q}_s - \sigma T_w^4}{H_{eff}}
78
\end{equation}
79
where $H_{eff}$ is the effective heat of ablation and $T_w$ is the wall temperature.
80
81
\section{Computational Analysis}
82
83
\begin{pycode}
84
import numpy as np
85
from scipy.integrate import odeint, cumtrapz
86
import matplotlib.pyplot as plt
87
plt.rc('text', usetex=True)
88
plt.rc('font', family='serif')
89
90
np.random.seed(42)
91
92
# Physical constants
93
g0 = 9.81 # Sea-level gravity (m/s^2)
94
R_earth = 6.371e6 # Earth radius (m)
95
rho_0 = 1.225 # Sea level density (kg/m^3)
96
H = 8500 # Scale height (m)
97
sigma = 5.67e-8 # Stefan-Boltzmann constant
98
99
# Atmospheric density model
100
def density(h):
101
return rho_0 * np.exp(-np.maximum(0, h) / H)
102
103
# Gravity model
104
def gravity(h):
105
return g0 * (R_earth / (R_earth + h))**2
106
107
# Equations of motion for ballistic reentry
108
def reentry_dynamics(state, t, beta, L_D_ratio=0):
109
V, gamma, h, r_d = state
110
if h < 0 or V < 100:
111
return [0, 0, 0, 0]
112
113
rho = density(h)
114
g = gravity(h)
115
r = R_earth + h
116
117
# Aerodynamic forces
118
q_bar = 0.5 * rho * V**2 # Dynamic pressure
119
D_m = q_bar / beta # Drag acceleration
120
L_m = D_m * L_D_ratio # Lift acceleration
121
122
# Derivatives
123
dVdt = -D_m - g * np.sin(gamma)
124
dgammadt = (1/V) * ((V**2/r - g) * np.cos(gamma) + L_m)
125
dhdt = V * np.sin(gamma)
126
dr_d_dt = V * np.cos(gamma) * R_earth / r
127
128
return [dVdt, dgammadt, dhdt, dr_d_dt]
129
130
# Heat flux calculation (Sutton-Graves)
131
def compute_heat_flux(rho, V, r_n):
132
C = 1.83e-4
133
return C * np.sqrt(rho / r_n) * V**3 / 1e6 # MW/m^2
134
135
# Vehicle configurations
136
vehicles = {
137
'Capsule': {'m': 5000, 'Cd': 1.3, 'A': 12.0, 'r_n': 2.5, 'L_D': 0.3},
138
'Shuttle': {'m': 80000, 'Cd': 0.9, 'A': 250.0, 'r_n': 1.5, 'L_D': 1.2},
139
'Lifting Body': {'m': 8000, 'Cd': 0.4, 'A': 20.0, 'r_n': 0.5, 'L_D': 2.0}
140
}
141
142
# Entry angles to study
143
entry_angles = [-1.0, -2.0, -3.0, -5.0] # degrees
144
145
# Initial conditions
146
V0 = 7800 # m/s (orbital velocity)
147
h0 = 120000 # m (entry interface)
148
149
# Time span
150
t = np.linspace(0, 800, 2000)
151
152
# Store results
153
all_results = {}
154
155
# Simulate for all vehicles (with nominal entry angle)
156
nominal_angle = -2.0
157
for name, params in vehicles.items():
158
beta = params['m'] / (params['Cd'] * params['A'])
159
gamma0 = np.deg2rad(nominal_angle)
160
state0 = [V0, gamma0, h0, 0]
161
162
sol = odeint(reentry_dynamics, state0, t, args=(beta, params['L_D']))
163
V, gamma, h, r_d = sol.T
164
165
# Compute derived quantities
166
rho = density(h)
167
decel = rho * V**2 / (2 * beta * g0) # in g's
168
q_dot = compute_heat_flux(rho, V, params['r_n'])
169
170
# Total heat load
171
Q_total = np.trapz(q_dot * 1e6, t) # J/m^2
172
173
# Find peaks
174
valid = h > 0
175
if np.any(valid):
176
peak_decel_idx = np.argmax(decel)
177
peak_heat_idx = np.argmax(q_dot)
178
else:
179
peak_decel_idx = peak_heat_idx = 0
180
181
all_results[name] = {
182
'V': V, 'gamma': gamma, 'h': h, 'r_d': r_d,
183
'decel': decel, 'q_dot': q_dot, 'beta': beta,
184
'peak_decel': decel[peak_decel_idx],
185
'peak_decel_time': t[peak_decel_idx],
186
'peak_decel_alt': h[peak_decel_idx],
187
'peak_heat': q_dot[peak_heat_idx],
188
'peak_heat_time': t[peak_heat_idx],
189
'Q_total': Q_total / 1e6 # MJ/m^2
190
}
191
192
# Entry angle comparison for capsule
193
capsule_params = vehicles['Capsule']
194
beta_capsule = capsule_params['m'] / (capsule_params['Cd'] * capsule_params['A'])
195
angle_results = {}
196
197
for angle in entry_angles:
198
gamma0 = np.deg2rad(angle)
199
state0 = [V0, gamma0, h0, 0]
200
sol = odeint(reentry_dynamics, state0, t, args=(beta_capsule, capsule_params['L_D']))
201
V, gamma, h, r_d = sol.T
202
203
rho = density(h)
204
decel = rho * V**2 / (2 * beta_capsule * g0)
205
q_dot = compute_heat_flux(rho, V, capsule_params['r_n'])
206
207
angle_results[angle] = {
208
'h': h, 'decel': decel, 'q_dot': q_dot,
209
'peak_decel': np.max(decel),
210
'peak_heat': np.max(q_dot)
211
}
212
213
# Create comprehensive visualization
214
fig = plt.figure(figsize=(14, 12))
215
216
# Plot 1: Altitude profiles for different vehicles
217
ax1 = fig.add_subplot(2, 3, 1)
218
colors = plt.cm.Set1(np.linspace(0, 0.6, len(vehicles)))
219
for (name, res), color in zip(all_results.items(), colors):
220
valid = res['h'] > 0
221
ax1.plot(t[valid], res['h'][valid]/1000, linewidth=2, color=color, label=name)
222
ax1.set_xlabel('Time (s)')
223
ax1.set_ylabel('Altitude (km)')
224
ax1.set_title('Altitude Profiles')
225
ax1.legend(fontsize=8)
226
ax1.grid(True, alpha=0.3)
227
228
# Plot 2: Velocity profiles
229
ax2 = fig.add_subplot(2, 3, 2)
230
for (name, res), color in zip(all_results.items(), colors):
231
valid = res['h'] > 0
232
ax2.plot(t[valid], res['V'][valid]/1000, linewidth=2, color=color, label=name)
233
ax2.set_xlabel('Time (s)')
234
ax2.set_ylabel('Velocity (km/s)')
235
ax2.set_title('Velocity Profiles')
236
ax2.legend(fontsize=8)
237
ax2.grid(True, alpha=0.3)
238
239
# Plot 3: Deceleration profiles
240
ax3 = fig.add_subplot(2, 3, 3)
241
for (name, res), color in zip(all_results.items(), colors):
242
valid = res['h'] > 0
243
ax3.plot(t[valid], res['decel'][valid], linewidth=2, color=color, label=name)
244
ax3.set_xlabel('Time (s)')
245
ax3.set_ylabel('Deceleration (g)')
246
ax3.set_title('Deceleration Loads')
247
ax3.legend(fontsize=8)
248
ax3.grid(True, alpha=0.3)
249
250
# Plot 4: Heat flux comparison
251
ax4 = fig.add_subplot(2, 3, 4)
252
for (name, res), color in zip(all_results.items(), colors):
253
valid = res['h'] > 0
254
ax4.plot(t[valid], res['q_dot'][valid], linewidth=2, color=color, label=name)
255
ax4.fill_between(t[valid], 0, res['q_dot'][valid], alpha=0.2, color=color)
256
ax4.set_xlabel('Time (s)')
257
ax4.set_ylabel(r'Heat Flux (MW/m$^2$)')
258
ax4.set_title('Stagnation Point Heating')
259
ax4.legend(fontsize=8)
260
ax4.grid(True, alpha=0.3)
261
262
# Plot 5: Entry angle effects
263
ax5 = fig.add_subplot(2, 3, 5)
264
angle_colors = plt.cm.plasma(np.linspace(0.2, 0.8, len(entry_angles)))
265
for angle, color in zip(entry_angles, angle_colors):
266
res = angle_results[angle]
267
valid = res['h'] > 0
268
ax5.plot(t[valid], res['q_dot'][valid], linewidth=2, color=color,
269
label=f'$\\gamma_0 = {angle}^\\circ$')
270
ax5.set_xlabel('Time (s)')
271
ax5.set_ylabel(r'Heat Flux (MW/m$^2$)')
272
ax5.set_title('Entry Angle Effects (Capsule)')
273
ax5.legend(fontsize=8)
274
ax5.grid(True, alpha=0.3)
275
276
# Plot 6: Performance summary
277
ax6 = fig.add_subplot(2, 3, 6)
278
names = list(all_results.keys())
279
peak_decels = [all_results[n]['peak_decel'] for n in names]
280
peak_heats = [all_results[n]['peak_heat'] for n in names]
281
282
x = np.arange(len(names))
283
width = 0.35
284
285
bars1 = ax6.bar(x - width/2, peak_decels, width, label='Peak Decel (g)',
286
color='steelblue', alpha=0.8)
287
ax6_twin = ax6.twinx()
288
bars2 = ax6_twin.bar(x + width/2, peak_heats, width,
289
label=r'Peak $\dot{q}$ (MW/m$^2$)', color='coral', alpha=0.8)
290
291
ax6.set_xlabel('Vehicle Type')
292
ax6.set_ylabel('Peak Deceleration (g)', color='steelblue')
293
ax6_twin.set_ylabel(r'Peak Heat Flux (MW/m$^2$)', color='coral')
294
ax6.set_xticks(x)
295
ax6.set_xticklabels(names, rotation=15)
296
ax6.set_title('Peak Values Comparison')
297
ax6.legend(loc='upper left', fontsize=8)
298
ax6_twin.legend(loc='upper right', fontsize=8)
299
300
plt.tight_layout()
301
plt.savefig('atmospheric_reentry_plot.pdf', bbox_inches='tight', dpi=150)
302
print(r'\begin{center}')
303
print(r'\includegraphics[width=\textwidth]{atmospheric_reentry_plot.pdf}')
304
print(r'\end{center}')
305
plt.close()
306
307
# Best vehicle for human rating (lowest decel)
308
human_rated = min(all_results.items(), key=lambda x: x[1]['peak_decel'])
309
human_name = human_rated[0]
310
human_decel = human_rated[1]['peak_decel']
311
\end{pycode}
312
313
\section{Computational Algorithm}
314
315
\begin{algorithm}[H]
316
\SetAlgoLined
317
\KwIn{Initial state $[V_0, \gamma_0, h_0]$, vehicle parameters $\beta, r_n, L/D$}
318
\KwOut{Time histories of $V(t), h(t), \dot{q}(t)$, peak values}
319
Initialize state vector\;
320
\For{each time step}{
321
Compute atmospheric density $\rho(h)$\;
322
Compute gravity $g(h)$\;
323
\tcc{Aerodynamic accelerations}
324
$D/m \leftarrow \rho V^2 / (2\beta)$\;
325
$L/m \leftarrow (D/m) \cdot (L/D)$\;
326
\tcc{Equations of motion}
327
Integrate equations (\ref{eq:velocity})-(\ref{eq:range})\;
328
\tcc{Heat flux}
329
$\dot{q}_s \leftarrow C\sqrt{\rho/r_n} V^3$\;
330
Store results\;
331
}
332
Compute peak deceleration and heat flux\;
333
Compute total heat load $Q = \int \dot{q} \, dt$\;
334
\Return{Trajectory data, thermal loads}
335
\caption{Atmospheric Reentry Simulation}
336
\end{algorithm}
337
338
\section{Results and Discussion}
339
340
\subsection{Vehicle Comparison}
341
342
\begin{pycode}
343
# Generate results table
344
print(r'\begin{table}[h]')
345
print(r'\centering')
346
print(r'\caption{Reentry Performance Comparison}')
347
print(r'\begin{tabular}{lccccc}')
348
print(r'\toprule')
349
print(r'Vehicle & $\beta$ & Peak Decel & Peak $\dot{q}$ & $t_{peak}$ & Total $Q$ \\')
350
print(r' & (kg/m$^2$) & (g) & (MW/m$^2$) & (s) & (MJ/m$^2$) \\')
351
print(r'\midrule')
352
for name in vehicles.keys():
353
res = all_results[name]
354
print(f"{name} & {res['beta']:.0f} & {res['peak_decel']:.1f} & {res['peak_heat']:.2f} & {res['peak_heat_time']:.0f} & {res['Q_total']:.1f} \\\\")
355
print(r'\bottomrule')
356
print(r'\end{tabular}')
357
print(r'\end{table}')
358
\end{pycode}
359
360
\subsection{Key Observations}
361
362
\begin{remark}[Vehicle Configuration Trade-offs]
363
The Shuttle configuration experiences the longest reentry duration due to its high L/D ratio, which reduces peak heating but increases total heat load. The capsule configuration experiences the highest peak deceleration but shortest heating duration.
364
\end{remark}
365
366
The \py{human_name} configuration achieves the lowest peak deceleration of \py{f"{human_decel:.1f}"} g, making it most suitable for human-rated missions (typically requiring $<$ 10 g).
367
368
\subsection{Entry Angle Sensitivity}
369
370
\begin{pycode}
371
# Entry angle table
372
print(r'\begin{table}[h]')
373
print(r'\centering')
374
print(r'\caption{Entry Angle Effects on Capsule Performance}')
375
print(r'\begin{tabular}{ccc}')
376
print(r'\toprule')
377
print(r'Entry Angle & Peak Decel & Peak $\dot{q}$ \\')
378
print(r'(degrees) & (g) & (MW/m$^2$) \\')
379
print(r'\midrule')
380
for angle in entry_angles:
381
res = angle_results[angle]
382
print(f"{angle} & {res['peak_decel']:.1f} & {res['peak_heat']:.2f} \\\\")
383
print(r'\bottomrule')
384
print(r'\end{tabular}')
385
print(r'\end{table}')
386
\end{pycode}
387
388
\begin{remark}[Entry Corridor]
389
Shallow entry angles reduce peak heating but extend the heating duration and increase total heat load. Steep entry angles cause excessive deceleration. The entry corridor is bounded by skip-out (too shallow) and structural limits (too steep).
390
\end{remark}
391
392
\subsection{Thermal Protection Implications}
393
394
For the capsule with $\gamma_0 = -2^\circ$:
395
\begin{itemize}
396
\item Peak heat flux: \py{f"{all_results['Capsule']['peak_heat']:.2f}"} MW/m$^2$
397
\item Peak heating occurs at $t = $ \py{f"{all_results['Capsule']['peak_heat_time']:.0f}"} s
398
\item Altitude at peak heating: \py{f"{all_results['Capsule']['peak_decel_alt']/1000:.1f}"} km
399
\item Total heat load: \py{f"{all_results['Capsule']['Q_total']:.1f}"} MJ/m$^2$
400
\end{itemize}
401
402
\section{Ablation Analysis}
403
404
For an ablative heat shield with $H_{eff} = 30$ MJ/kg and density $\rho_{TPS} = 1500$ kg/m$^3$:
405
\begin{equation}
406
\text{Minimum TPS thickness} = \frac{Q}{\rho_{TPS} \cdot H_{eff}}
407
\end{equation}
408
409
\begin{pycode}
410
# TPS sizing
411
H_eff = 30e6 # J/kg
412
rho_TPS = 1500 # kg/m^3
413
Q_total = all_results['Capsule']['Q_total'] * 1e6 # J/m^2
414
thickness_min = Q_total / (rho_TPS * H_eff) * 1000 # mm
415
safety_factor = 2.0
416
thickness_design = thickness_min * safety_factor
417
\end{pycode}
418
419
For the capsule configuration:
420
\begin{itemize}
421
\item Minimum ablator thickness: \py{f"{thickness_min:.1f}"} mm
422
\item Design thickness (SF = 2.0): \py{f"{thickness_design:.1f}"} mm
423
\end{itemize}
424
425
\section{Limitations and Extensions}
426
427
\subsection{Model Limitations}
428
\begin{enumerate}
429
\item \textbf{2D trajectory}: Neglects out-of-plane maneuvers and Earth rotation
430
\item \textbf{Exponential atmosphere}: Does not capture density variations with latitude/season
431
\item \textbf{Constant aerodynamics}: $C_D$ and $L/D$ vary with Mach and Reynolds numbers
432
\item \textbf{Simplified heating}: Neglects radiative heating and real-gas effects
433
\item \textbf{No ablation coupling}: Surface recession not coupled back to aerodynamics
434
\end{enumerate}
435
436
\subsection{Possible Extensions}
437
\begin{itemize}
438
\item 6-DOF simulation with attitude dynamics
439
\item Knudsen number effects in rarefied upper atmosphere
440
\item Real-gas thermochemistry for shock layer
441
\item Coupled ablation-aerothermal analysis
442
\item Monte Carlo trajectory dispersion analysis
443
\end{itemize}
444
445
\section{Conclusion}
446
This analysis demonstrates the critical trade-offs in atmospheric reentry vehicle design:
447
\begin{itemize}
448
\item Higher L/D ratios reduce peak g-loads but extend heating duration
449
\item Larger nose radii reduce peak heat flux (spreading over larger area)
450
\item Entry angle selection is constrained by the entry corridor
451
\item The \py{human_name} configuration with peak deceleration of \py{f"{human_decel:.1f}"} g is most suitable for crew return
452
\end{itemize}
453
454
The computational methods provide a foundation for preliminary TPS sizing and mission design.
455
456
\section*{Further Reading}
457
\begin{itemize}
458
\item Anderson, J. D. (2006). \textit{Hypersonic and High-Temperature Gas Dynamics}. AIAA.
459
\item Sutton, K., \& Graves, R. A. (1971). A general stagnation-point convective-heating equation for arbitrary gas mixtures. NASA TR R-376.
460
\item Tauber, M. E., \& Sutton, K. (1991). Stagnation-point radiative heating relations for Earth and Mars entries. Journal of Spacecraft and Rockets.
461
\end{itemize}
462
463
\end{document}
464
465