Source code for skaero.atmosphere.coesa
# coding: utf-8
"""
COESA model.
Routines
--------
geometric_to_geopotential(z)
coesa(h)
Examples
--------
>>> from skaero.atmosphere import coesa
>>> h, T, p, rho = coesa.table(1000)
TODO
----
* Check geopotential temperature
* Move to OOP
"""
from __future__ import division, absolute_import
import numpy as np
R_Earth = 6369.0e3 # m
g_0p = 9.80665 # m / s^2
M_0 = 28.9644e-3 # kg / mol
Rs = 8.31432 # N m / (mol K)
[docs]def geometric_to_geopotential(z):
"""Returns geopotential altitude from geometric altitude.
Parameters
----------
z : array_like
Geometric altitude in meters.
Returns
-------
h : array_like
Geopotential altitude in meters.
"""
h = z * R_Earth / (z + R_Earth)
return h
[docs]def table(h):
"""Computes table of COESA atmosphere properties.
Returns temperature, pressure and density COESA values at the given
geopotential altitude.
Parameters
----------
h : array_like
Geopotential altitude given in meters.
Returns
-------
h : array_like
Given geopotential altitude in meters.
T : array_like
Temperature in Kelvin.
p : array_like
Pressure in Pascal.
rho : array_like
Density in kilograms per cubic meter.
Notes
-----
Based on the `U.S. 1976 Standard Atmosphere`_.
.. _`U.S. 1976 Standard Atmosphere`: http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770009539_1977009539.pdf
"""
# FIXME: Having these variables here feels like a total hack for me,
# and will be worse as soon as I add more layers. I need another module,
# or a class, or something.
h_0 = 0.0 # m
T_0 = 288.150 # K
p_0 = 101325.0 # Pa
L_0 = -6.5e-3 # K / m
# Is this actually molecular-scale temperature?
T = T_0 + L_0 * (h - h_0) # Linear relation for 0 < h < 11000
# TODO: Maybe use pressure ratio to be consistent w/ the COESA standard.
p = p_0 * (T_0 / (T_0 + L_0 * (h - h_0))) ** (g_0p * M_0 / (Rs * L_0))
rho = p * M_0 / (Rs * T)
return (
h,
T,
p,
rho)