2021-01-22 15:31:04 +08:00

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