106 lines
4.3 KiB
Python
106 lines
4.3 KiB
Python
"""
|
|
The U.S. Standard Atmosphere 1976(USSA76) is an idealized, steady-state model of
|
|
mean annual conditions of Earth's atmosphere from the surface to 86 km at
|
|
latitude 45N, as it is assumed to exist during a period with moderate solar
|
|
activity.
|
|
"""
|
|
|
|
import numpy as np
|
|
|
|
from ..utils import Const
|
|
|
|
def lapse_tp(t_lower, p_lower, lr, h_lower, h_upper):
|
|
'''
|
|
Calculate the temperature and pressure at a given geopotential altitude above base of a specific layer.
|
|
The temperature is computed by the linear interpolation with the slope defined by lapse rates.
|
|
The pressure is computed from the hydrostatic equations and the perfect gas law.
|
|
See the detailed documentation in http://www.pdas.com/hydro.pdf
|
|
|
|
Usage:
|
|
[t_upper, p_upper] = lapse_tp(t_lower, p_lower, lr, h_lower, h_upper)
|
|
|
|
Inputs:
|
|
t_lower -> [float] temperature[K] at the lower boundary of the subset in the specific layer
|
|
p_lower -> [float] pressure[Pa] at the lower boundary of the subset in the specific layer
|
|
lr -> [float] lapse rate[K/m] for the specific layer
|
|
h_lower -> [float] geopotential altitude[m] at the lower boundary of the subset in the specific layer
|
|
h_upper -> [float] geopotential altitude[m] at the upper boundary of the subset in the specific layer
|
|
|
|
Outputs:
|
|
t1 -> [float] temperature[K] at the upper boundary of the subset in the specific layer
|
|
p1 -> [float] pressure[Pa] at the upper boundary of the subset in the specific layer
|
|
|
|
Reference: Public Domain Aeronautical Software(http://www.pdas.com/atmos.html)
|
|
https://gist.github.com/buzzerrookie/5b6438c603eabf13d07e
|
|
'''
|
|
R_air,g0 = Const.R_air,Const.g0
|
|
|
|
if lr == 0:
|
|
t_upper = t_lower
|
|
p_upper = p_lower * np.exp(-g0 / R_air / t_lower * (h_upper - h_lower)*1e3)
|
|
else:
|
|
t_upper = t_lower + lr * (h_upper - h_lower)
|
|
p_upper = p_lower * (t_upper / t_lower) ** (-g0 / (lr/1e3) / R_air)
|
|
|
|
return t_upper,p_upper
|
|
|
|
def ussa76(h):
|
|
'''
|
|
Implements the U.S. Standard Atmosphere 1976(USSA76) up to 86km.
|
|
The standard atmosphere is defined as a set of layers by specified geopotential altitudes and lapse rates.
|
|
The temperature is computed by linear interpolation with the slope defined by the lapse rate.
|
|
The pressure is computed from the hydrostatic equations and the perfect gas law; the density follows from the perfect gas law.
|
|
|
|
Usage:
|
|
[rho, T, P, C, eta, Kc] = ussa76(h)
|
|
|
|
Inputs:
|
|
h -> [float] geopotentail altitude, [km]
|
|
|
|
Outputs:
|
|
rho -> [float] density at a given altitude, [kg/m^3]
|
|
T -> [float] temperature ..., [K]
|
|
P -> [float] pressure ..., [Pa]
|
|
C -> [float] speed of sound ..., [m/s]
|
|
eta -> [float] dynamic viscosity ..., [kg/m/s]
|
|
Kc -> [float] thermal conductivity ..., [J/(m*s*K)]
|
|
|
|
Note: the geopotential altitude should be in [-0.610,84.852] km, otherwise the output will be extrapolated for those input altitudes.
|
|
|
|
Reference:
|
|
U.S. Standard Atmosphere, 1976, U.S. Government Printing Office, Washington, D.C.
|
|
Public Domain Aeronautical Software(http://www.pdas.com/atmos.html)
|
|
https://gist.github.com/buzzerrookie/5b6438c603eabf13d07e
|
|
https://ww2.mathworks.cn/help/aerotbx/ug/atmosisa.
|
|
http://www.braeunig.us/space/atmmodel.htm#USSA1976
|
|
'''
|
|
t0,p0,h0 = Const.t0,Const.p0,Const.h0
|
|
R_air,M0,gamma = Const.R_air,Const.M0,Const.gamma
|
|
|
|
# the lower atmosphere below 86km is separated into seven layers
|
|
geopotential_alt = [-np.inf, 11, 20, 32, 47, 51, 71, np.inf] # Geopotential altitudes above MSL, [km]
|
|
|
|
lr = np.array([-6.5, 0, 1, 2.8, 0, -2.8, -2]) # Lapse rate, [K/km]
|
|
|
|
for i in range(len(lr)):
|
|
if h <= geopotential_alt[i+1]:
|
|
T, P = lapse_tp(t0, p0, lr[i], h0, h)
|
|
break
|
|
else:
|
|
# if altitudes are greater than the first several layers, then it has to integeate these layers first.
|
|
t0, p0 = lapse_tp(t0, p0, lr[i], h0, geopotential_alt[i+1])
|
|
h0 = geopotential_alt[i+1]
|
|
|
|
# density
|
|
rho = P / (R_air * T)
|
|
|
|
# speed of sound
|
|
C = np.sqrt(gamma * R_air * T)
|
|
|
|
# dynamic viscosity by Sutherland's law
|
|
eta = 1.458e-6*T**1.5/(T+110.4)
|
|
|
|
# thermal conductivity
|
|
Kc = 2.64638e-3 * T ** 1.5 / (T + 245.4 * (10 ** (-12.0 / T)))
|
|
|
|
return rho,T,P,C,eta,Kc |