1.1 Atmosphere Structure
Earth's atmosphere is divided into distinct layers based on temperature variations with altitude. Each layer has unique characteristics that determine weather, climate, and the propagation of electromagnetic radiation.
Vertical Layers of the Atmosphere
Troposphere (0-12 km)
Contains 75% of atmospheric mass. Temperature decreases with altitude at ~6.5°C/km (lapse rate). All weather occurs here.
Stratosphere (12-50 km)
Temperature increases with altitude due to ozone absorption of UV. Very stable, few clouds. Contains the ozone layer.
Mesosphere (50-85 km)
Temperature decreases again. Coldest part of the atmosphere (~-90°C at mesopause). Meteors burn up here.
Thermosphere (85-600 km)
Temperature increases dramatically (up to 2000°C) but low density. Aurora occur here. ISS orbits in this region.
Barometric Formula
$$p(z) = p_0 \exp\left(-\frac{z}{H}\right)$$
where H = scale height ≈ 8.5 km
The scale height is defined as:
$$H = \frac{R_d T}{g} = \frac{k_B T}{mg}$$
Rd = 287 J/(kg·K) for dry air, g = 9.81 m/s², T = temperature
Python: Atmospheric Profile
#!/usr/bin/env python3
"""
atmosphere_structure.py - Plot standard atmosphere temperature and pressure profiles
Run: python3 atmosphere_structure.py
Requires: pip install numpy matplotlib
"""
import numpy as np
import matplotlib.pyplot as plt
# Constants
g = 9.81 # m/s^2
R = 287.0 # J/(kg·K) for dry air
p0 = 101325 # Pa at sea level
T0 = 288.15 # K at sea level
# Standard atmosphere layers (altitude in km, lapse rate in K/km)
layers = [
(0, 11, -6.5), # Troposphere
(11, 20, 0), # Tropopause
(20, 32, 1.0), # Lower stratosphere
(32, 47, 2.8), # Upper stratosphere
(47, 51, 0), # Stratopause
(51, 71, -2.8), # Mesosphere lower
(71, 85, -2.0), # Mesosphere upper
]
def standard_atmosphere(z_km):
"""Calculate T and p at altitude z (km)"""
z = z_km * 1000 # Convert to meters
T = T0
p = p0
z_prev = 0
for z_bot, z_top, lapse in layers:
z_bot_m, z_top_m = z_bot * 1000, z_top * 1000
if z <= z_bot_m:
break
dz = min(z, z_top_m) - z_bot_m
L = lapse / 1000 # K/m
if L == 0:
# Isothermal layer
p = p * np.exp(-g * dz / (R * T))
else:
T_new = T + L * dz
p = p * (T_new / T) ** (-g / (R * L))
T = T_new
if z <= z_top_m:
break
return T, p
# Generate profile
altitudes = np.linspace(0, 85, 500)
temps = np.array([standard_atmosphere(z)[0] for z in altitudes])
pressures = np.array([standard_atmosphere(z)[1] for z in altitudes])
# Plot
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 8))
# Temperature profile
ax1.plot(temps - 273.15, altitudes, 'r-', linewidth=2)
ax1.axhline(y=11, color='gray', linestyle='--', alpha=0.5, label='Tropopause')
ax1.axhline(y=50, color='gray', linestyle='-.', alpha=0.5, label='Stratopause')
ax1.axhline(y=85, color='gray', linestyle=':', alpha=0.5, label='Mesopause')
ax1.set_xlabel('Temperature (°C)', fontsize=12)
ax1.set_ylabel('Altitude (km)', fontsize=12)
ax1.set_title('Temperature Profile', fontsize=14)
ax1.grid(True, alpha=0.3)
ax1.legend()
ax1.set_xlim(-100, 20)
# Pressure profile
ax2.semilogx(pressures / 100, altitudes, 'b-', linewidth=2)
ax2.set_xlabel('Pressure (hPa)', fontsize=12)
ax2.set_ylabel('Altitude (km)', fontsize=12)
ax2.set_title('Pressure Profile', fontsize=14)
ax2.grid(True, alpha=0.3, which='both')
plt.tight_layout()
plt.savefig('atmosphere_structure.png', dpi=150, bbox_inches='tight')
plt.show()
print("Saved as atmosphere_structure.png")Standard Atmosphere Values
| Altitude (km) | Temperature (K) | Pressure (hPa) | Density (kg/m³) |
|---|---|---|---|
| 0 | 288.15 | 1013.25 | 1.225 |
| 5 | 255.65 | 540.20 | 0.736 |
| 10 | 223.15 | 264.36 | 0.413 |
| 20 | 216.65 | 55.29 | 0.089 |
| 50 | 270.65 | 0.80 | 0.001 |