Source code for pyatmos.utils.atmosphere_vectorized

"""
Contains the following atmospheric functions:

 - density = atm_density(alt, mach)
 - mach = atm_mach(alt, velocity)
 - velocity = atm_velocity(alt, mach)
 - pressure = atm_pressure(alt)
 - temperature = atm_temperature(alt)
 - sos = atm_speed_of_sound(alt)
 - mu = atm_dynamic_viscosity_mu(alt)
 - nu = atm_kinematic_viscosity_nu(alt)
 - eas = atm_equivalent_airspeed(alt, mach)

All the default units are in English units because the source equations
are in English units.
"""
from __future__ import print_function, absolute_import
import sys
import numpy as np

from .atmosphere import atm_temperature, _log_pressure, _equivalent_airspeed, atm_pressure
from .unitless import speed_of_sound
from .unit_conversion import (
    convert_velocity, convert_density,
    _rankine_to_temperature_units, _psfs_to_dvisc_units, _ft2s_to_kvisc_units,
    _altitude_factor, _pressure_factor, _velocity_factor,
)


[docs]def atm_pressure_array(alt, alt_units='ft', pressure_units='psf'): # type : (Any, str, str) -> np.ndarray """Gets the pressure as a numpy array""" alt_ft = alt * _altitude_factor(alt_units, 'ft') ln_pressure = np.array([_log_pressure(alti) for alti in alt_ft]) press_psf = np.exp(ln_pressure) return press_psf * _pressure_factor('psf', pressure_units)
[docs]def atm_temperature_array(alt, alt_units='ft', temperature_units='R'): # type : (Any, str, str) -> np.ndarray """Gets the temperature as a numpy array""" temp_rankine = np.array([atm_temperature(alti, alt_units=alt_units, temperature_units='R') for alti in alt]) return temp_rankine * _rankine_to_temperature_units(temperature_units)
[docs]def atm_speed_of_sound_array(alt, alt_units='ft', velocity_units='ft/s', gamma=1.4): # type : (Any, str, str, float) -> np.ndarray """Gets the speed of sound as a numpy array""" T = atm_temperature_array(alt, alt_units=alt_units, temperature_units='R') a = speed_of_sound(T, R=1716., gamma=gamma) factor = _velocity_factor('ft/s', velocity_units) # ft/s to m/s a2 = a * factor return a2
[docs]def atm_density_array(alt, R=1716., alt_units='ft', density_units='slug/ft^3'): # type : (Any, float, str, str) -> np.ndarray """Gets the density as a numpy array""" alt = np.asarray(alt) alt_ft = alt * _altitude_factor(alt_units, 'ft') p = atm_pressure_array(alt_ft) T = atm_temperature_array(alt_ft) rho = p / (R * T) rho2 = convert_density(rho, 'slug/ft^3', density_units) return rho2
[docs]def atm_dynamic_viscosity_mu_array(alt, alt_units='ft', visc_units='(lbf*s)/ft^2'): # type : (Any, str, str) -> np.ndarray """Gets the dynamic viscosity as a numpy array""" alt = np.asarray(alt) alt_ft = alt * _altitude_factor(alt_units, 'ft') T = atm_temperature_array(alt_ft) # R mu = sutherland_viscoscity_array(T) # (lbf*s)/ft^2 factor = _psfs_to_dvisc_units(visc_units) return mu * factor
[docs]def atm_kinematic_viscosity_nu_array(alt, alt_units='ft', visc_units='ft^2/s'): # type : (Any, str, str) -> np.ndarray """Gets the kinematic viscosity as a numpy array""" alt = np.asarray(alt) alt_ft = alt * _altitude_factor(alt_units, 'ft') rho = atm_density_array(alt_ft) mu = atm_dynamic_viscosity_mu_array(alt_ft) nu = mu / rho # ft^2/s factor = _ft2s_to_kvisc_units(alt_units, visc_units) return nu * factor
[docs]def sutherland_viscoscity_array(T): # type: (np.ndarray) -> np.ndarray """Gets the Sutherland viscosity as a numpy array""" viscosity = 2.27E-8 * (T ** 1.5) / (T + 198.6) ilow = np.where(T < 225.)[0] if len(ilow): viscosity[ilow] = 8.0382436E-10 * T[ilow] ihigh = np.where(T > 5400)[0] if len(ihigh): sys.stderr.write('WARNING: viscosity - Temperature is too large ' '(T>5400 R) Tmax=%s\n' % T[ihigh].max()) return viscosity
[docs]def atm_equivalent_airspeed_array(alt, mach, alt_units='ft', eas_units='ft/s'): # type : (Any, Any, str, str) -> np.ndarray """Gets the equivalent airspeed as a numpy array""" if isinstance(alt, float): pressi = atm_pressure(alt, alt_units=alt_units) p_psf = pressi * np.ones(len(mach), dtype=mach.dtype) else: alt = np.asarray(alt) alt_ft = alt * _altitude_factor(alt_units, 'ft') p_psf = atm_pressure_array(alt_ft) eas_fts = _equivalent_airspeed(mach, p_psf) eas2 = convert_velocity(eas_fts, 'ft/s', eas_units) return eas2