atmos 0.1.0.0 → 0.2.0.0
raw patch · 8 files changed
+478/−410 lines, 8 filesdep +HUnitdep +atmosdep +test-frameworkdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: HUnit, atmos, test-framework, test-framework-hunit
Dependency ranges changed: base
API changes (from Hackage documentation)
- Atmosphere: siAtmosphere' :: (Floating a, Ord a) => a -> Atmos a
- Atmosphere: usAtmosphere' :: (Floating a, Ord a) => a -> Atmos a
+ Atmosphere: atmosphere :: (Floating a, Ord a) => a -> (a, a, a)
+ Atmosphere: siAltitudeFromPressure :: (Floating a, Ord a) => a -> a
- Atmosphere: siAtmosphere :: (Floating a, Ord a) => a -> (a, a, a, a, a, a)
+ Atmosphere: siAtmosphere :: (Floating a, Ord a) => a -> Atmos a
- Atmosphere: usAtmosphere :: (Floating a, Ord a) => a -> (a, a, a, a, a, a)
+ Atmosphere: usAtmosphere :: (Floating a, Ord a) => a -> Atmos a
Files
- Atmosphere.hs +0/−10
- Atmosphere/Atmosphere.hs +0/−128
- Atmosphere/Constants.hs +0/−60
- Atmosphere/Tests.hs +0/−207
- atmos.cabal +16/−5
- src/Atmosphere.hs +149/−0
- src/Atmosphere/Constants.hs +69/−0
- tests/Tests.hs +244/−0
− Atmosphere.hs
@@ -1,10 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--module Atmosphere( siAtmosphere- , usAtmosphere- , Atmos(..)- , siAtmosphere'- , usAtmosphere'- ) where--import Atmosphere.Atmosphere
− Atmosphere/Atmosphere.hs
@@ -1,128 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--module Atmosphere.Atmosphere( Atmos(..)- , siAtmosphere- , usAtmosphere- , siAtmosphere'- , usAtmosphere'- , atmosphere- ) where--import Atmosphere.Constants--data Atmos a = Atmos { atmosTemperature :: a- , atmosPressure :: a- , atmosDensity :: a- , atmosSpeedOfSound :: a- , atmosViscosity :: a- , atmosKinematicViscosity :: a- }--{- |- atmosphere in SI units-- Input: altitude in meters- - Output: (pressure, density, speed of sound, viscosity, kinematic viscosity)-- > pressure - N/m^2- > density - kg/m^3- > speed of sound - m/s- > viscosity - N-s/m^2- > kinematic viscosity - m^2/s--}-siAtmosphere :: (Floating a, Ord a) => a -> (a,a,a,a,a,a)-siAtmosphere alt_m = (temp, pressure, density, asound, viscosity, kinematicViscosity)- where- alt_km = 0.001*alt_m- (sigma, delta, theta) = atmosphere alt_km- temp = _TZERO * theta- pressure = _PZERO * delta- density = _RHOZERO * sigma- asound = _AZERO * sqrt theta- viscosity = metricViscosity theta- kinematicViscosity = viscosity/density--{- |- atmosphere in imperial units- - Input: altitude in ft-- Output: (pressure, density, speed of sound, viscosity, kinematic viscosity)- - > pressure - lb/ft^2- > density - slugs/ft^3- > speed of sound - ft/s- > viscosity - slugs/(ft-s)- > kinematic viscosity - ft^2/s--}-usAtmosphere :: (Floating a, Ord a) => a -> (a,a,a,a,a,a)-usAtmosphere alt_ft = (temp, pressure, density, asound, viscosity, kinematicViscosity)- where- alt_km = 0.001*_FT2METERS*alt_ft- (sigma, delta, theta) = atmosphere alt_km- temp = _KELVIN2RANKINE*_TZERO*theta- pressure = _PZERO*delta/47.88- density = _RHOZERO*sigma/515.379- asound = (_AZERO/_FT2METERS)*sqrt theta- viscosity=(1.0/_PSF2NSM)*metricViscosity theta- kinematicViscosity = viscosity/density--metricViscosity :: (Floating a, Ord a) => a -> a-metricViscosity theta = _BETAVISC*sqrt(t*t*t)/(t+_SUTH)- where- t = theta * _TZERO---- | atmosphere in SI units with ADT output-siAtmosphere' :: (Floating a, Ord a) => a -> Atmos a-siAtmosphere' alt = Atmos temp pressure density asound viscosity kinematicViscosity- where- (temp, pressure, density, asound, viscosity, kinematicViscosity) = siAtmosphere alt----- | atmosphere in imperial units with ADT output-usAtmosphere' :: (Floating a, Ord a) => a -> Atmos a-usAtmosphere' alt = Atmos temp pressure density asound viscosity kinematicViscosity- where- (temp, pressure, density, asound, viscosity, kinematicViscosity) = usAtmosphere alt---{- |- Compute temperature, density, and pressure in standard atmosphere.-- Correct to 86 km. Only approximate thereafter.- - Input: alt geometric altitude, km.- - Output: (sigma, delta, theta)- - > sigma - density/sea-level standard density- > delta - pressure/sea-level standard pressure- > theta - temperature/sea-level std. temperature--}-atmosphere :: (Floating a, Ord a) => a -> (a,a,a)-atmosphere alt = (sigma, delta, theta)- where- _REARTH = 6369.0 -- radius of the Earth (km)- _GMR = 34.163195-- h = alt*_REARTH/(alt+_REARTH) -- geometric to geopotential altitude-- (htabI, tbase, ptabI, tgradI) = getI htpgTable- where- getI [htab'] = htab'- getI (htab0:htab1@(h',_,_,_):htabs)- | h > h' = getI (htab1:htabs)- | otherwise = htab0- getI [] = error "something went wrong"-- deltah = h - htabI -- height above local base- tlocal = tbase + tgradI*deltah -- local temperature- - theta = tlocal/_TZERO -- temperature ratio-- delta- | 0.0 == tgradI = ptabI*exp(-_GMR*deltah/tbase)- | otherwise = ptabI*(tbase/tlocal)**(_GMR/tgradI)- sigma = delta/theta-
− Atmosphere/Constants.hs
@@ -1,60 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--module Atmosphere.Constants( _FT2METERS- , _KELVIN2RANKINE- , _PSF2NSM- , _SCF2KCM- , _TZERO- , _PZERO- , _RHOZERO- , _AZERO- , _BETAVISC- , _SUTH- , htpgTable- ) where--import Data.List(zip4)--_FT2METERS :: (Ord a, Floating a) => a-_KELVIN2RANKINE :: (Ord a, Floating a) => a-_PSF2NSM :: (Ord a, Floating a) => a-_SCF2KCM :: (Ord a, Floating a) => a-_TZERO :: (Ord a, Floating a) => a-_PZERO :: (Ord a, Floating a) => a-_RHOZERO :: (Ord a, Floating a) => a-_AZERO :: (Ord a, Floating a) => a-_BETAVISC :: (Ord a, Floating a) => a-_SUTH :: (Ord a, Floating a) => a---- | mult. ft. to get meters (exact)-_FT2METERS = 0.3048--- | mult deg K to get deg R-_KELVIN2RANKINE = 1.8--- | mult lb/sq.ft to get sq.m-_PSF2NSM = 47.880258--- | mult slugs/cu.ft to get kg/cu.m-_SCF2KCM = 515.379--- | sea-level temperature, kelvins-_TZERO = 288.15--- | sea-level pressure, N/sq.m-_PZERO = 101325.0--- | sea-level density, kg/cu.m-_RHOZERO = 1.225--- | speed of sound at S.L. m/sec-_AZERO = 340.294--- | viscosity constant-_BETAVISC = 1.458E-6--- | Sutherland's constant, kelvins-_SUTH = 110.4---- | table of (height, temperature, pressure, temperature gradient) over altitude-htpgTable :: (Floating a, Ord a) => [(a,a,a,a)]-htpgTable = zip4 htab ttab ptab gtab- where- htab = [ 0.0, 11.0, 20.0, 32.0, 47.0- , 51.0, 71.0, 84.852 ]- ttab = [ _TZERO, 216.65, 216.65, 228.65, 270.65- , 270.65, 214.65, 186.946 ]- ptab = [ 1.0, 2.2336110E-1, 5.4032950E-2, 8.5666784E-3, 1.0945601E-3- , 6.6063531E-4, 3.9046834E-5, 3.68501E-6 ]- gtab = [ -6.5, 0.0, 1.0, 2.8, 0.0, -2.8, -2.0, 0.0 ]
− Atmosphere/Tests.hs
@@ -1,207 +0,0 @@-{-# OPTIONS_GHC -Wall #-}--module Atmosphere.Tests( run- , simpleAtmosVsAtmos- , checkSITable- , checkUSTable- ) where--import Atmosphere.Atmosphere--run :: IO ()-run = do- putStrLn $ "simple atmosphere == atmosphere: " ++ show (simpleAtmosVsAtmos < (1e-14 :: Double))- putStrLn $ "siAtmosphere = SI table: " ++ show (checkSITable < (1e-2 :: Double))- putStrLn $ "usAtmosphere = US table: " ++ show (checkUSTable < (1e-2 :: Double))--simpleAtmosVsAtmos :: (Floating a, Ord a, Enum a) => a-simpleAtmosVsAtmos = maximum [maxErr alt | alt <- [0,0.01..19.99]]- where- maxErr x = maximum (map abs [e0,e1,e2])- where- (e0,e1,e2) = err x- err x = (s1-s0, d1-d0, t1-t0)- where- (s0,d0,t0) = atmosphere x- (s1,d1,t1) = simpleAtmosphere x- - simpleAtmosphere alt = (sigma, delta, theta)- {-- Compute temperature, density, and pressure in simplified- standard atmosphere.- - Correct to 20 km. Only approximate thereafter.- - Input:- alt geometric altitude, km.- Return: (sigma, delta, theta)- sigma density/sea-level standard density- delta pressure/sea-level standard pressure- theta temperature/sea-level std. temperature- -}- where- _REARTH = 6369.0 -- radius of the Earth (km)- _GMR = 34.163195 -- gas constant- - h = alt*_REARTH/(alt+_REARTH) -- geometric to geopotential altitude- - (theta, delta)- -- troposphere- | h < 11.0 = ( (288.15 - 6.5*h)/288.15, theta**(_GMR/6.5) )- -- stratosphere- | h < 20.0 = (216.65/288.15, 0.2233611*exp(-_GMR*(h-11.0)/216.65))- | otherwise = error "simpleAtmosphere invalid higher than 20 km"- sigma = delta/theta- -checkSITable :: (Floating a, Ord a) => a-checkSITable = maximum $ map (maximum . map abs . siTabErr) siTable- where- siTabErr (alt, sigma, delta, theta, temp, press, dens, a, visc, kVisc) = ret- where- (sigma', delta', theta') = atmosphere alt- (temp', press', dens', a', visc', kVisc') = siAtmosphere (1000*alt)- - relErr (x,y) = (x - y)/x- ret = map relErr [ (sigma, sigma')- , (delta, delta')- , (theta, theta')- , (temp, temp')- , (press, press')- , (dens, dens')- , (a, a')- , (1e-6*visc, visc')- , (kVisc, kVisc')- ]--checkUSTable :: (Floating a, Ord a) => a-checkUSTable = maximum $ map (maximum . map abs . usTabErr) usTable- where- usTabErr (alt_kft, sigma, delta, theta, temp, press, dens, a, visc, kVisc) = ret- where- (sigma', delta', theta') = atmosphere (alt_kft/3.2808399)- (temp', press', dens', a', visc', kVisc') = usAtmosphere (1000*alt_kft)- - relErr (x,y) = (x - y)/x- ret = map relErr [ (sigma, sigma')- , (delta, delta')- , (theta, theta')- , (temp, temp')- , (press, press')- , (dens, dens')- , (a, a')- , (1e-6*visc, visc')- , (kVisc, kVisc')- ]--siTable :: Fractional a => [(a,a,a,a,a,a,a,a,a,a)]--- alt sigma delta theta temp press dens a visc k.visc--- Km K N/sq.m kg/cu.m m/sec kg/m-s sq.m/s-siTable = [ (-2, 1.2067E+00, 1.2611E+00, 1.0451, 301.2, 1.278E+05, 1.478E+00, 347.9, 18.51, 1.25E-05)- , ( 0, 1.0000E+00, 1.0000E+00, 1.0000, 288.1, 1.013E+05, 1.225E+00, 340.3, 17.89, 1.46E-05)- , ( 2, 8.2168E-01, 7.8462E-01, 0.9549, 275.2, 7.950E+04, 1.007E+00, 332.5, 17.26, 1.71E-05)- , ( 4, 6.6885E-01, 6.0854E-01, 0.9098, 262.2, 6.166E+04, 8.193E-01, 324.6, 16.61, 2.03E-05)- , ( 6, 5.3887E-01, 4.6600E-01, 0.8648, 249.2, 4.722E+04, 6.601E-01, 316.5, 15.95, 2.42E-05)- , ( 8, 4.2921E-01, 3.5185E-01, 0.8198, 236.2, 3.565E+04, 5.258E-01, 308.1, 15.27, 2.90E-05)- , (10, 3.3756E-01, 2.6153E-01, 0.7748, 223.3, 2.650E+04, 4.135E-01, 299.5, 14.58, 3.53E-05)- , (12, 2.5464E-01, 1.9146E-01, 0.7519, 216.7, 1.940E+04, 3.119E-01, 295.1, 14.22, 4.56E-05)- , (14, 1.8600E-01, 1.3985E-01, 0.7519, 216.7, 1.417E+04, 2.279E-01, 295.1, 14.22, 6.24E-05)- , (16, 1.3589E-01, 1.0217E-01, 0.7519, 216.7, 1.035E+04, 1.665E-01, 295.1, 14.22, 8.54E-05)- , (18, 9.9302E-02, 7.4662E-02, 0.7519, 216.7, 7.565E+03, 1.216E-01, 295.1, 14.22, 1.17E-04)- , (20, 7.2578E-02, 5.4569E-02, 0.7519, 216.7, 5.529E+03, 8.891E-02, 295.1, 14.22, 1.60E-04)- , (22, 5.2660E-02, 3.9945E-02, 0.7585, 218.6, 4.047E+03, 6.451E-02, 296.4, 14.32, 2.22E-04)- , (24, 3.8316E-02, 2.9328E-02, 0.7654, 220.6, 2.972E+03, 4.694E-02, 297.7, 14.43, 3.07E-04)- , (26, 2.7964E-02, 2.1597E-02, 0.7723, 222.5, 2.188E+03, 3.426E-02, 299.1, 14.54, 4.24E-04)- , (28, 2.0470E-02, 1.5950E-02, 0.7792, 224.5, 1.616E+03, 2.508E-02, 300.4, 14.65, 5.84E-04)- , (30, 1.5028E-02, 1.1813E-02, 0.7861, 226.5, 1.197E+03, 1.841E-02, 301.7, 14.75, 8.01E-04)- , (32, 1.1065E-02, 8.7740E-03, 0.7930, 228.5, 8.890E+02, 1.355E-02, 303.0, 14.86, 1.10E-03)- , (34, 8.0709E-03, 6.5470E-03, 0.8112, 233.7, 6.634E+02, 9.887E-03, 306.5, 15.14, 1.53E-03)- , (36, 5.9245E-03, 4.9198E-03, 0.8304, 239.3, 4.985E+02, 7.257E-03, 310.1, 15.43, 2.13E-03)- , (38, 4.3806E-03, 3.7218E-03, 0.8496, 244.8, 3.771E+02, 5.366E-03, 313.7, 15.72, 2.93E-03)- , (40, 3.2616E-03, 2.8337E-03, 0.8688, 250.4, 2.871E+02, 3.995E-03, 317.2, 16.01, 4.01E-03)- , (42, 2.4445E-03, 2.1708E-03, 0.8880, 255.9, 2.200E+02, 2.995E-03, 320.7, 16.29, 5.44E-03)- , (44, 1.8438E-03, 1.6727E-03, 0.9072, 261.4, 1.695E+02, 2.259E-03, 324.1, 16.57, 7.34E-03)- , (46, 1.3992E-03, 1.2961E-03, 0.9263, 266.9, 1.313E+02, 1.714E-03, 327.5, 16.85, 9.83E-03)- , (48, 1.0748E-03, 1.0095E-03, 0.9393, 270.6, 1.023E+02, 1.317E-03, 329.8, 17.04, 1.29E-02)- , (50, 8.3819E-04, 7.8728E-04, 0.9393, 270.6, 7.977E+01, 1.027E-03, 329.8, 17.04, 1.66E-02)- , (52, 6.5758E-04, 6.1395E-04, 0.9336, 269.0, 6.221E+01, 8.055E-04, 328.8, 16.96, 2.10E-02)- , (54, 5.2158E-04, 4.7700E-04, 0.9145, 263.5, 4.833E+01, 6.389E-04, 325.4, 16.68, 2.61E-02)- , (56, 4.1175E-04, 3.6869E-04, 0.8954, 258.0, 3.736E+01, 5.044E-04, 322.0, 16.40, 3.25E-02)- , (58, 3.2344E-04, 2.8344E-04, 0.8763, 252.5, 2.872E+01, 3.962E-04, 318.6, 16.12, 4.07E-02)- , (60, 2.5276E-04, 2.1668E-04, 0.8573, 247.0, 2.196E+01, 3.096E-04, 315.1, 15.84, 5.11E-02)- , (62, 1.9647E-04, 1.6468E-04, 0.8382, 241.5, 1.669E+01, 2.407E-04, 311.5, 15.55, 6.46E-02)- , (64, 1.5185E-04, 1.2439E-04, 0.8191, 236.0, 1.260E+01, 1.860E-04, 308.0, 15.26, 8.20E-02)- , (66, 1.1668E-04, 9.3354E-05, 0.8001, 230.5, 9.459E+00, 1.429E-04, 304.4, 14.97, 1.05E-01)- , (68, 8.9101E-05, 6.9593E-05, 0.7811, 225.1, 7.051E+00, 1.091E-04, 300.7, 14.67, 1.34E-01)- , (70, 6.7601E-05, 5.1515E-05, 0.7620, 219.6, 5.220E+00, 8.281E-05, 297.1, 14.38, 1.74E-01)- , (72, 5.0905E-05, 3.7852E-05, 0.7436, 214.3, 3.835E+00, 6.236E-05, 293.4, 14.08, 2.26E-01)- , (74, 3.7856E-05, 2.7635E-05, 0.7300, 210.3, 2.800E+00, 4.637E-05, 290.7, 13.87, 2.99E-01)- , (76, 2.8001E-05, 2.0061E-05, 0.7164, 206.4, 2.033E+00, 3.430E-05, 288.0, 13.65, 3.98E-01)- , (78, 2.0597E-05, 1.4477E-05, 0.7029, 202.5, 1.467E+00, 2.523E-05, 285.3, 13.43, 5.32E-01)- , (80, 1.5063E-05, 1.0384E-05, 0.6893, 198.6, 1.052E+00, 1.845E-05, 282.5, 13.21, 7.16E-01)- , (82, 1.0950E-05, 7.4002E-06, 0.6758, 194.7, 7.498E-01, 1.341E-05, 279.7, 12.98, 9.68E-01)- , (84, 7.9106E-06, 5.2391E-06, 0.6623, 190.8, 5.308E-01, 9.690E-06, 276.9, 12.76, 1.32E+00)- , (86, 5.6776E-06, 3.6835E-06, 0.6488, 186.9, 3.732E-01, 6.955E-06, 274.1, 12.53, 1.80E+00)- ]--usTable :: Fractional a => [(a,a,a,a,a,a,a,a,a,a)]--- alt sigma delta theta temp press dens a visc k.visc--- Kft degR lb/sq.ft s/cu.ft fps s/ft-s sq.ft/s-usTable = [ ( -5, 1.155E+00, 1.194E+00, 1.0344, 536.5, 2.528E+03, 2.745E-03, 1135.5, 0.384, 1.40E-04)- , ( 0, 1.000E+00, 1.000E+00, 1.0000, 518.7, 2.116E+03, 2.377E-03, 1116.5, 0.374, 1.57E-04)- , ( 5, 8.617E-01, 8.321E-01, 0.9656, 500.8, 1.761E+03, 2.048E-03, 1097.1, 0.364, 1.78E-04)- , ( 10, 7.386E-01, 6.878E-01, 0.9313, 483.0, 1.456E+03, 1.756E-03, 1077.4, 0.353, 2.01E-04)- , ( 15, 6.295E-01, 5.646E-01, 0.8969, 465.2, 1.195E+03, 1.496E-03, 1057.4, 0.343, 2.29E-04)- , ( 20, 5.332E-01, 4.599E-01, 0.8626, 447.4, 9.733E+02, 1.267E-03, 1036.9, 0.332, 2.62E-04)- , ( 25, 4.486E-01, 3.716E-01, 0.8283, 429.6, 7.863E+02, 1.066E-03, 1016.1, 0.322, 3.02E-04)- , ( 30, 3.747E-01, 2.975E-01, 0.7940, 411.8, 6.297E+02, 8.907E-04, 994.8, 0.311, 3.49E-04)- , ( 35, 3.106E-01, 2.360E-01, 0.7598, 394.1, 4.993E+02, 7.382E-04, 973.1, 0.300, 4.06E-04)- , ( 40, 2.471E-01, 1.858E-01, 0.7519, 390.0, 3.931E+02, 5.873E-04, 968.1, 0.297, 5.06E-04)- , ( 45, 1.945E-01, 1.462E-01, 0.7519, 390.0, 3.094E+02, 4.623E-04, 968.1, 0.297, 6.42E-04)- , ( 50, 1.531E-01, 1.151E-01, 0.7519, 390.0, 2.436E+02, 3.639E-04, 968.1, 0.297, 8.16E-04)- , ( 55, 1.205E-01, 9.063E-02, 0.7519, 390.0, 1.918E+02, 2.865E-04, 968.1, 0.297, 1.04E-03)- , ( 60, 9.492E-02, 7.137E-02, 0.7519, 390.0, 1.510E+02, 2.256E-04, 968.1, 0.297, 1.32E-03)- , ( 65, 7.475E-02, 5.620E-02, 0.7519, 390.0, 1.189E+02, 1.777E-04, 968.1, 0.297, 1.67E-03)- , ( 70, 5.856E-02, 4.429E-02, 0.7563, 392.2, 9.373E+01, 1.392E-04, 970.9, 0.298, 2.14E-03)- , ( 75, 4.591E-02, 3.496E-02, 0.7615, 395.0, 7.399E+01, 1.091E-04, 974.3, 0.300, 2.75E-03)- , ( 80, 3.606E-02, 2.765E-02, 0.7668, 397.7, 5.851E+01, 8.571E-05, 977.6, 0.302, 3.52E-03)- , ( 85, 2.837E-02, 2.190E-02, 0.7720, 400.4, 4.635E+01, 6.743E-05, 981.0, 0.304, 4.50E-03)- , ( 90, 2.236E-02, 1.738E-02, 0.7772, 403.1, 3.678E+01, 5.315E-05, 984.3, 0.305, 5.74E-03)- , ( 95, 1.765E-02, 1.381E-02, 0.7825, 405.9, 2.923E+01, 4.196E-05, 987.6, 0.307, 7.32E-03)- , (100, 1.396E-02, 1.100E-02, 0.7877, 408.6, 2.327E+01, 3.318E-05, 990.9, 0.309, 9.30E-03)- , (105, 1.106E-02, 8.769E-03, 0.7930, 411.3, 1.856E+01, 2.628E-05, 994.2, 0.310, 1.18E-02)- , (110, 8.691E-03, 7.011E-03, 0.8067, 418.4, 1.484E+01, 2.066E-05, 1002.7, 0.315, 1.52E-02)- , (115, 6.853E-03, 5.629E-03, 0.8213, 426.0, 1.191E+01, 1.629E-05, 1011.8, 0.319, 1.96E-02)- , (120, 5.427E-03, 4.537E-03, 0.8359, 433.6, 9.601E+00, 1.290E-05, 1020.8, 0.324, 2.51E-02)- , (125, 4.316E-03, 3.671E-03, 0.8506, 441.2, 7.768E+00, 1.026E-05, 1029.7, 0.329, 3.20E-02)- , (130, 3.446E-03, 2.981E-03, 0.8652, 448.8, 6.309E+00, 8.190E-06, 1038.5, 0.333, 4.07E-02)- , (135, 2.762E-03, 2.430E-03, 0.8798, 456.3, 5.142E+00, 6.565E-06, 1047.2, 0.338, 5.15E-02)- , (140, 2.222E-03, 1.987E-03, 0.8945, 463.9, 4.206E+00, 5.281E-06, 1055.9, 0.342, 6.48E-02)- , (145, 1.794E-03, 1.631E-03, 0.9091, 471.5, 3.452E+00, 4.264E-06, 1064.5, 0.347, 8.13E-02)- , (150, 1.454E-03, 1.343E-03, 0.9237, 479.1, 2.842E+00, 3.455E-06, 1073.0, 0.351, 1.02E-01)- , (155, 1.182E-03, 1.109E-03, 0.9383, 486.6, 2.347E+00, 2.809E-06, 1081.4, 0.356, 1.27E-01)- , (160, 9.769E-04, 9.176E-04, 0.9393, 487.2, 1.942E+00, 2.322E-06, 1082.0, 0.356, 1.53E-01)- , (165, 8.083E-04, 7.592E-04, 0.9393, 487.2, 1.607E+00, 1.921E-06, 1082.0, 0.356, 1.85E-01)- , (170, 6.716E-04, 6.282E-04, 0.9354, 485.2, 1.329E+00, 1.596E-06, 1079.8, 0.355, 2.22E-01)- , (175, 5.633E-04, 5.187E-04, 0.9208, 477.6, 1.098E+00, 1.339E-06, 1071.3, 0.350, 2.62E-01)- , (180, 4.712E-04, 4.270E-04, 0.9063, 470.1, 9.037E-01, 1.120E-06, 1062.8, 0.346, 3.09E-01)- , (185, 3.931E-04, 3.505E-04, 0.8917, 462.5, 7.417E-01, 9.343E-07, 1054.3, 0.341, 3.65E-01)- , (190, 3.269E-04, 2.868E-04, 0.8772, 455.0, 6.069E-01, 7.771E-07, 1045.6, 0.337, 4.34E-01)- , (195, 2.711E-04, 2.339E-04, 0.8626, 447.4, 4.949E-01, 6.444E-07, 1036.9, 0.332, 5.16E-01)- , (200, 2.241E-04, 1.901E-04, 0.8481, 439.9, 4.023E-01, 5.327E-07, 1028.2, 0.328, 6.16E-01)- , (205, 1.847E-04, 1.540E-04, 0.8336, 432.4, 3.258E-01, 4.390E-07, 1019.3, 0.323, 7.37E-01)- , (210, 1.517E-04, 1.242E-04, 0.8191, 424.8, 2.629E-01, 3.606E-07, 1010.4, 0.319, 8.84E-01)- , (215, 1.242E-04, 9.990E-05, 0.8045, 417.3, 2.114E-01, 2.951E-07, 1001.4, 0.314, 1.06E+00)- , (220, 1.013E-04, 8.001E-05, 0.7900, 409.8, 1.693E-01, 2.407E-07, 992.3, 0.309, 1.29E+00)- , (225, 8.230E-05, 6.383E-05, 0.7755, 402.2, 1.351E-01, 1.956E-07, 983.2, 0.305, 1.56E+00)- , (230, 6.663E-05, 5.071E-05, 0.7610, 394.7, 1.073E-01, 1.584E-07, 974.0, 0.300, 1.89E+00)- , (235, 5.372E-05, 4.011E-05, 0.7466, 387.2, 8.488E-02, 1.277E-07, 964.7, 0.295, 2.31E+00)- , (240, 4.295E-05, 3.160E-05, 0.7358, 381.6, 6.687E-02, 1.021E-07, 957.6, 0.292, 2.86E+00)- , (245, 3.421E-05, 2.482E-05, 0.7254, 376.3, 5.252E-02, 8.131E-08, 950.9, 0.288, 3.54E+00)- , (250, 2.716E-05, 1.942E-05, 0.7151, 370.9, 4.110E-02, 6.456E-08, 944.1, 0.285, 4.41E+00)- , (255, 2.150E-05, 1.515E-05, 0.7048, 365.5, 3.206E-02, 5.109E-08, 937.3, 0.281, 5.50E+00)- , (260, 1.696E-05, 1.177E-05, 0.6944, 360.2, 2.492E-02, 4.030E-08, 930.4, 0.278, 6.89E+00)- , (265, 1.333E-05, 9.118E-06, 0.6841, 354.8, 1.930E-02, 3.168E-08, 923.4, 0.274, 8.65E+00)- , (270, 1.044E-05, 7.034E-06, 0.6738, 349.5, 1.489E-02, 2.481E-08, 916.4, 0.270, 1.09E+01)- , (275, 8.148E-06, 5.406E-06, 0.6635, 344.1, 1.144E-02, 1.937E-08, 909.4, 0.267, 1.38E+01)- , (280, 6.335E-06, 4.138E-06, 0.6532, 338.8, 8.757E-03, 1.506E-08, 902.3, 0.263, 1.75E+01)- ]
atmos.cabal view
@@ -1,5 +1,5 @@ name: atmos-version: 0.1.0.0+version: 0.2.0.0 synopsis: 1976 US Standard Atmosphere description: { 1976 US Standard Atmosphere@@ -11,18 +11,29 @@ license: PublicDomain author: Greg Horn maintainer: gregmainland@gmail.com--- copyright: +copyright: (c) Greg Horn 2012-2014 category: Science build-type: Simple cabal-version: >=1.8 library+ hs-source-dirs: src exposed-modules: Atmosphere- other-modules: Atmosphere.Atmosphere- Atmosphere.Constants- Atmosphere.Tests+ other-modules: Atmosphere.Constants build-depends: base >= 4 && < 5+++test-suite unit-tests+ type: exitcode-stdio-1.0+ hs-source-dirs: tests+ main-is: Tests.hs+ build-depends: base >=4.6 && < 5+ , atmos+ , HUnit+ , test-framework+ , test-framework-hunit+ source-repository head type: git
+ src/Atmosphere.hs view
@@ -0,0 +1,149 @@+{-# OPTIONS_GHC -Wall #-}++module Atmosphere+ ( Atmos(..)+ , siAtmosphere+ , usAtmosphere+ , atmosphere+ , siAltitudeFromPressure+ ) where++import Atmosphere.Constants++data Atmos a = Atmos { atmosTemperature :: a+ , atmosPressure :: a+ , atmosDensity :: a+ , atmosSpeedOfSound :: a+ , atmosViscosity :: a+ , atmosKinematicViscosity :: a+ }++{- |+ atmosphere in SI units++ Input: altitude in meters++ Output: (pressure, density, speed of sound, viscosity, kinematic viscosity)++ > pressure - N/m^2+ > density - kg/m^3+ > speed of sound - m/s+ > viscosity - N-s/m^2+ > kinematic viscosity - m^2/s+-}+siAtmosphere :: (Floating a, Ord a) => a -> Atmos a+siAtmosphere alt_m =+ Atmos { atmosTemperature = temp+ , atmosPressure = pressure+ , atmosDensity = density+ , atmosSpeedOfSound = asound+ , atmosViscosity = viscosity+ , atmosKinematicViscosity = kinematicViscosity+ }+ where+ alt_km = 0.001*alt_m+ (sigma, delta, theta) = atmosphere alt_km+ temp = _TZERO * theta+ pressure = _PZERO * delta+ density = _RHOZERO * sigma+ asound = _AZERO * sqrt theta+ viscosity = metricViscosity theta+ kinematicViscosity = viscosity/density++{- |+ atmosphere in imperial units++ Input: altitude in ft++ Output: (pressure, density, speed of sound, viscosity, kinematic viscosity)++ > pressure - lb/ft^2+ > density - slugs/ft^3+ > speed of sound - ft/s+ > viscosity - slugs/(ft-s)+ > kinematic viscosity - ft^2/s+-}+usAtmosphere :: (Floating a, Ord a) => a -> Atmos a+usAtmosphere alt_ft =+ Atmos { atmosTemperature = temp+ , atmosPressure = pressure+ , atmosDensity = density+ , atmosSpeedOfSound = asound+ , atmosViscosity = viscosity+ , atmosKinematicViscosity = kinematicViscosity+ }+ where+ alt_km = 0.001*_FT2METERS*alt_ft+ (sigma, delta, theta) = atmosphere alt_km+ temp = _KELVIN2RANKINE*_TZERO*theta+ pressure = _PZERO*delta/47.88+ density = _RHOZERO*sigma/515.379+ asound = (_AZERO/_FT2METERS)*sqrt theta+ viscosity=(1.0/_PSF2NSM)*metricViscosity theta+ kinematicViscosity = viscosity/density++{- |+ Compute altitude at which the standard atmosphere has a certain pressure.++ Input: Pressure, N/m^2++ Output: Altitude in meters+-}+siAltitudeFromPressure :: (Floating a, Ord a) => a -> a+siAltitudeFromPressure pressureIn = 1000*alt+ where+ alt = _REARTH / (_REARTH/h - 1)+ deltaIn = pressureIn / _PZERO++ (htabI, tbase, ptabI, tgradI) = getI htpgTable+ where+ getI [htab'] = htab'+ getI (htab0:htab1@(_,_,delta',_):htabs)+ | deltaIn < delta' = getI (htab1:htabs)+ | otherwise = htab0+ getI [] = error "something went wrong"++ h+ | 0.0 == tgradI = htabI - tbase / _GMR * (log (deltaIn / ptabI))+ | otherwise = htabI + tbase/tgradI*((deltaIn/ptabI)**(-tgradI/_GMR) - 1)++metricViscosity :: (Floating a, Ord a) => a -> a+metricViscosity theta = _BETAVISC*sqrt(t*t*t)/(t+_SUTH)+ where+ t = theta * _TZERO++{- |+ Compute temperature, density, and pressure in standard atmosphere.++ Correct to 86 km. Only approximate thereafter.++ Input: alt geometric altitude, km.++ Output: (sigma, delta, theta)++ > sigma - density/sea-level standard density+ > delta - pressure/sea-level standard pressure+ > theta - temperature/sea-level std. temperature+-}+atmosphere :: (Floating a, Ord a) => a -> (a,a,a)+atmosphere alt = (sigma, delta, theta)+ where+ h = alt*_REARTH/(alt+_REARTH) -- geometric to geopotential altitude++ (htabI, tbase, ptabI, tgradI) = getI htpgTable+ where+ getI [htab'] = htab'+ getI (htab0:htab1@(h',_,_,_):htabs)+ | h > h' = getI (htab1:htabs)+ | otherwise = htab0+ getI [] = error "something went wrong"++ deltah = h - htabI -- height above local base+ tlocal = tbase + tgradI*deltah -- local temperature++ theta = tlocal/_TZERO -- temperature ratio++ delta+ | 0.0 == tgradI = ptabI*exp(-_GMR*deltah/tbase)+ | otherwise = ptabI*(tbase/tlocal)**(_GMR/tgradI)+ sigma = delta/theta
+ src/Atmosphere/Constants.hs view
@@ -0,0 +1,69 @@+{-# OPTIONS_GHC -Wall #-}++module Atmosphere.Constants+ ( _FT2METERS+ , _KELVIN2RANKINE+ , _PSF2NSM+ , _SCF2KCM+ , _TZERO+ , _PZERO+ , _RHOZERO+ , _AZERO+ , _BETAVISC+ , _SUTH+ , _REARTH+ , _GMR+ , htpgTable+ ) where++import Data.List( zip4 )++_FT2METERS :: (Ord a, Floating a) => a+_KELVIN2RANKINE :: (Ord a, Floating a) => a+_PSF2NSM :: (Ord a, Floating a) => a+_SCF2KCM :: (Ord a, Floating a) => a+_TZERO :: (Ord a, Floating a) => a+_PZERO :: (Ord a, Floating a) => a+_RHOZERO :: (Ord a, Floating a) => a+_AZERO :: (Ord a, Floating a) => a+_BETAVISC :: (Ord a, Floating a) => a+_SUTH :: (Ord a, Floating a) => a+_REARTH :: (Ord a, Floating a) => a+_GMR :: (Ord a, Floating a) => a++-- | mult. ft. to get meters (exact)+_FT2METERS = 0.3048+-- | mult deg K to get deg R+_KELVIN2RANKINE = 1.8+-- | mult lb/sq.ft to get sq.m+_PSF2NSM = 47.880258+-- | mult slugs/cu.ft to get kg/cu.m+_SCF2KCM = 515.379+-- | sea-level temperature, kelvins+_TZERO = 288.15+-- | sea-level pressure, N/sq.m+_PZERO = 101325.0+-- | sea-level density, kg/cu.m+_RHOZERO = 1.225+-- | speed of sound at S.L. m/sec+_AZERO = 340.294+-- | viscosity constant+_BETAVISC = 1.458E-6+-- | Sutherland's constant, kelvins+_SUTH = 110.4+-- | radius of the Earth, km+_REARTH = 6369.0+-- | gas constant+_GMR = 34.163195++-- | table of (height, temperature, pressure, temperature gradient) over altitude+htpgTable :: (Floating a, Ord a) => [(a,a,a,a)]+htpgTable = zip4 htab ttab ptab gtab+ where+ htab = [ 0.0, 11.0, 20.0, 32.0, 47.0+ , 51.0, 71.0, 84.852 ]+ ttab = [ _TZERO, 216.65, 216.65, 228.65, 270.65+ , 270.65, 214.65, 186.946 ]+ ptab = [ 1.0, 2.2336110E-1, 5.4032950E-2, 8.5666784E-3, 1.0945601E-3+ , 6.6063531E-4, 3.9046834E-5, 3.68501E-6 ]+ gtab = [ -6.5, 0.0, 1.0, 2.8, 0.0, -2.8, -2.0, 0.0 ]
+ tests/Tests.hs view
@@ -0,0 +1,244 @@+{-# OPTIONS_GHC -Wall #-}++module Main ( main ) where++import Test.Framework ( Test, defaultMain )+import Test.Framework.Providers.HUnit ( testCase )+import Test.HUnit ( assertBool )++import Atmosphere++main :: IO ()+main =+ defaultMain+ [ assertBool' "simple atmosphere == atmosphere"+ (simpleAtmosVsAtmos < (1e-14 :: Double))+ , assertBool' "siAtmosphere = SI table"+ (checkSITable < (1e-2 :: Double))+ , assertBool' "usAtmosphere = US table"+ (checkUSTable < (1e-2 :: Double))+ , assertBool' "siAltitudeFromPressure = SI table"+ (checkSITableInversePressure < (5e-3:: Double)) -- 5 m absolute+ , assertBool' "siAltitudeFromPressure is inverse"+ (checkSIInversePressure < (1e-9:: Double))+ , assertBool' "siAltitudeFromPressure is inverse (other direction)"+ (checkSIInversePressure' < (1e-9:: Double))+ ]++assertBool' :: String -> Bool -> Test+assertBool' name bool = testCase name (assertBool name bool)++checkSITableInversePressure :: (Floating a, Ord a) => a+checkSITableInversePressure = maximum $ map siTabErr siTable+ where+ siTabErr (alt, _, _, _, _, press, _, _, _, _) = abs (alt - alt')+ where+ alt' = (siAltitudeFromPressure press) / 1000++checkSIInversePressure :: (Floating a, Ord a, Enum a) => a+checkSIInversePressure = maximum $ map oneError [-5000,-4990..150000]+ where+ oneError alt = alt - alt'+ where+ p = atmosPressure (siAtmosphere alt)+ alt' = siAltitudeFromPressure p++checkSIInversePressure' :: (Floating a, Ord a, Enum a) => a+checkSIInversePressure' = maximum $ map oneError [0.05,0.2..150000]+ where+ oneError p = p - p'+ where+ p' = atmosPressure (siAtmosphere alt)+ alt = siAltitudeFromPressure p++simpleAtmosVsAtmos :: (Floating a, Ord a, Enum a) => a+simpleAtmosVsAtmos = maximum [maxErr alt | alt <- [0,0.01..19.99]]+ where+ maxErr x = maximum (map abs [e0,e1,e2])+ where+ (e0,e1,e2) = err x+ err x = (s1-s0, d1-d0, t1-t0)+ where+ (s0,d0,t0) = atmosphere x+ (s1,d1,t1) = simpleAtmosphere x++ simpleAtmosphere alt = (sigma, delta, theta)+ {-+ Compute temperature, density, and pressure in simplified+ standard atmosphere.++ Correct to 20 km. Only approximate thereafter.++ Input:+ alt geometric altitude, km.+ Return: (sigma, delta, theta)+ sigma density/sea-level standard density+ delta pressure/sea-level standard pressure+ theta temperature/sea-level std. temperature+ -}+ where+ _REARTH = 6369.0 -- radius of the Earth (km)+ _GMR = 34.163195 -- gas constant++ h = alt*_REARTH/(alt+_REARTH) -- geometric to geopotential altitude++ (theta, delta)+ -- troposphere+ | h < 11.0 = ( (288.15 - 6.5*h)/288.15, theta**(_GMR/6.5) )+ -- stratosphere+ | h < 20.0 = (216.65/288.15, 0.2233611*exp(-_GMR*(h-11.0)/216.65))+ | otherwise = error "simpleAtmosphere invalid higher than 20 km"+ sigma = delta/theta++checkSITable :: (Floating a, Ord a) => a+checkSITable = maximum $ map (maximum . map abs . siTabErr) siTable+ where+ siTabErr (alt, sigma, delta, theta, temp, press, dens, a, visc, kVisc) = ret+ where+ (sigma', delta', theta') = atmosphere alt+ Atmos temp' press' dens' a' visc' kVisc' = siAtmosphere (1000*alt)++ relErr (x,y) = (x - y)/x+ ret = map relErr [ (sigma, sigma')+ , (delta, delta')+ , (theta, theta')+ , (temp, temp')+ , (press, press')+ , (dens, dens')+ , (a, a')+ , (1e-6*visc, visc')+ , (kVisc, kVisc')+ ]++checkUSTable :: (Floating a, Ord a) => a+checkUSTable = maximum $ map (maximum . map abs . usTabErr) usTable+ where+ usTabErr (alt_kft, sigma, delta, theta, temp, press, dens, a, visc, kVisc) = ret+ where+ (sigma', delta', theta') = atmosphere (alt_kft/3.2808399)+ Atmos temp' press' dens' a' visc' kVisc' = usAtmosphere (1000*alt_kft)++ relErr (x,y) = (x - y)/x+ ret = map relErr [ (sigma, sigma')+ , (delta, delta')+ , (theta, theta')+ , (temp, temp')+ , (press, press')+ , (dens, dens')+ , (a, a')+ , (1e-6*visc, visc')+ , (kVisc, kVisc')+ ]++siTable :: Fractional a => [(a,a,a,a,a,a,a,a,a,a)]+-- alt sigma delta theta temp press dens a visc k.visc+-- Km K N/sq.m kg/cu.m m/sec kg/m-s sq.m/s+siTable = [ (-2, 1.2067E+00, 1.2611E+00, 1.0451, 301.2, 1.278E+05, 1.478E+00, 347.9, 18.51, 1.25E-05)+ , ( 0, 1.0000E+00, 1.0000E+00, 1.0000, 288.1, 1.013E+05, 1.225E+00, 340.3, 17.89, 1.46E-05)+ , ( 2, 8.2168E-01, 7.8462E-01, 0.9549, 275.2, 7.950E+04, 1.007E+00, 332.5, 17.26, 1.71E-05)+ , ( 4, 6.6885E-01, 6.0854E-01, 0.9098, 262.2, 6.166E+04, 8.193E-01, 324.6, 16.61, 2.03E-05)+ , ( 6, 5.3887E-01, 4.6600E-01, 0.8648, 249.2, 4.722E+04, 6.601E-01, 316.5, 15.95, 2.42E-05)+ , ( 8, 4.2921E-01, 3.5185E-01, 0.8198, 236.2, 3.565E+04, 5.258E-01, 308.1, 15.27, 2.90E-05)+ , (10, 3.3756E-01, 2.6153E-01, 0.7748, 223.3, 2.650E+04, 4.135E-01, 299.5, 14.58, 3.53E-05)+ , (12, 2.5464E-01, 1.9146E-01, 0.7519, 216.7, 1.940E+04, 3.119E-01, 295.1, 14.22, 4.56E-05)+ , (14, 1.8600E-01, 1.3985E-01, 0.7519, 216.7, 1.417E+04, 2.279E-01, 295.1, 14.22, 6.24E-05)+ , (16, 1.3589E-01, 1.0217E-01, 0.7519, 216.7, 1.035E+04, 1.665E-01, 295.1, 14.22, 8.54E-05)+ , (18, 9.9302E-02, 7.4662E-02, 0.7519, 216.7, 7.565E+03, 1.216E-01, 295.1, 14.22, 1.17E-04)+ , (20, 7.2578E-02, 5.4569E-02, 0.7519, 216.7, 5.529E+03, 8.891E-02, 295.1, 14.22, 1.60E-04)+ , (22, 5.2660E-02, 3.9945E-02, 0.7585, 218.6, 4.047E+03, 6.451E-02, 296.4, 14.32, 2.22E-04)+ , (24, 3.8316E-02, 2.9328E-02, 0.7654, 220.6, 2.972E+03, 4.694E-02, 297.7, 14.43, 3.07E-04)+ , (26, 2.7964E-02, 2.1597E-02, 0.7723, 222.5, 2.188E+03, 3.426E-02, 299.1, 14.54, 4.24E-04)+ , (28, 2.0470E-02, 1.5950E-02, 0.7792, 224.5, 1.616E+03, 2.508E-02, 300.4, 14.65, 5.84E-04)+ , (30, 1.5028E-02, 1.1813E-02, 0.7861, 226.5, 1.197E+03, 1.841E-02, 301.7, 14.75, 8.01E-04)+ , (32, 1.1065E-02, 8.7740E-03, 0.7930, 228.5, 8.890E+02, 1.355E-02, 303.0, 14.86, 1.10E-03)+ , (34, 8.0709E-03, 6.5470E-03, 0.8112, 233.7, 6.634E+02, 9.887E-03, 306.5, 15.14, 1.53E-03)+ , (36, 5.9245E-03, 4.9198E-03, 0.8304, 239.3, 4.985E+02, 7.257E-03, 310.1, 15.43, 2.13E-03)+ , (38, 4.3806E-03, 3.7218E-03, 0.8496, 244.8, 3.771E+02, 5.366E-03, 313.7, 15.72, 2.93E-03)+ , (40, 3.2616E-03, 2.8337E-03, 0.8688, 250.4, 2.871E+02, 3.995E-03, 317.2, 16.01, 4.01E-03)+ , (42, 2.4445E-03, 2.1708E-03, 0.8880, 255.9, 2.200E+02, 2.995E-03, 320.7, 16.29, 5.44E-03)+ , (44, 1.8438E-03, 1.6727E-03, 0.9072, 261.4, 1.695E+02, 2.259E-03, 324.1, 16.57, 7.34E-03)+ , (46, 1.3992E-03, 1.2961E-03, 0.9263, 266.9, 1.313E+02, 1.714E-03, 327.5, 16.85, 9.83E-03)+ , (48, 1.0748E-03, 1.0095E-03, 0.9393, 270.6, 1.023E+02, 1.317E-03, 329.8, 17.04, 1.29E-02)+ , (50, 8.3819E-04, 7.8728E-04, 0.9393, 270.6, 7.977E+01, 1.027E-03, 329.8, 17.04, 1.66E-02)+ , (52, 6.5758E-04, 6.1395E-04, 0.9336, 269.0, 6.221E+01, 8.055E-04, 328.8, 16.96, 2.10E-02)+ , (54, 5.2158E-04, 4.7700E-04, 0.9145, 263.5, 4.833E+01, 6.389E-04, 325.4, 16.68, 2.61E-02)+ , (56, 4.1175E-04, 3.6869E-04, 0.8954, 258.0, 3.736E+01, 5.044E-04, 322.0, 16.40, 3.25E-02)+ , (58, 3.2344E-04, 2.8344E-04, 0.8763, 252.5, 2.872E+01, 3.962E-04, 318.6, 16.12, 4.07E-02)+ , (60, 2.5276E-04, 2.1668E-04, 0.8573, 247.0, 2.196E+01, 3.096E-04, 315.1, 15.84, 5.11E-02)+ , (62, 1.9647E-04, 1.6468E-04, 0.8382, 241.5, 1.669E+01, 2.407E-04, 311.5, 15.55, 6.46E-02)+ , (64, 1.5185E-04, 1.2439E-04, 0.8191, 236.0, 1.260E+01, 1.860E-04, 308.0, 15.26, 8.20E-02)+ , (66, 1.1668E-04, 9.3354E-05, 0.8001, 230.5, 9.459E+00, 1.429E-04, 304.4, 14.97, 1.05E-01)+ , (68, 8.9101E-05, 6.9593E-05, 0.7811, 225.1, 7.051E+00, 1.091E-04, 300.7, 14.67, 1.34E-01)+ , (70, 6.7601E-05, 5.1515E-05, 0.7620, 219.6, 5.220E+00, 8.281E-05, 297.1, 14.38, 1.74E-01)+ , (72, 5.0905E-05, 3.7852E-05, 0.7436, 214.3, 3.835E+00, 6.236E-05, 293.4, 14.08, 2.26E-01)+ , (74, 3.7856E-05, 2.7635E-05, 0.7300, 210.3, 2.800E+00, 4.637E-05, 290.7, 13.87, 2.99E-01)+ , (76, 2.8001E-05, 2.0061E-05, 0.7164, 206.4, 2.033E+00, 3.430E-05, 288.0, 13.65, 3.98E-01)+ , (78, 2.0597E-05, 1.4477E-05, 0.7029, 202.5, 1.467E+00, 2.523E-05, 285.3, 13.43, 5.32E-01)+ , (80, 1.5063E-05, 1.0384E-05, 0.6893, 198.6, 1.052E+00, 1.845E-05, 282.5, 13.21, 7.16E-01)+ , (82, 1.0950E-05, 7.4002E-06, 0.6758, 194.7, 7.498E-01, 1.341E-05, 279.7, 12.98, 9.68E-01)+ , (84, 7.9106E-06, 5.2391E-06, 0.6623, 190.8, 5.308E-01, 9.690E-06, 276.9, 12.76, 1.32E+00)+ , (86, 5.6776E-06, 3.6835E-06, 0.6488, 186.9, 3.732E-01, 6.955E-06, 274.1, 12.53, 1.80E+00)+ ]++usTable :: Fractional a => [(a,a,a,a,a,a,a,a,a,a)]+-- alt sigma delta theta temp press dens a visc k.visc+-- Kft degR lb/sq.ft s/cu.ft fps s/ft-s sq.ft/s+usTable = [ ( -5, 1.155E+00, 1.194E+00, 1.0344, 536.5, 2.528E+03, 2.745E-03, 1135.5, 0.384, 1.40E-04)+ , ( 0, 1.000E+00, 1.000E+00, 1.0000, 518.7, 2.116E+03, 2.377E-03, 1116.5, 0.374, 1.57E-04)+ , ( 5, 8.617E-01, 8.321E-01, 0.9656, 500.8, 1.761E+03, 2.048E-03, 1097.1, 0.364, 1.78E-04)+ , ( 10, 7.386E-01, 6.878E-01, 0.9313, 483.0, 1.456E+03, 1.756E-03, 1077.4, 0.353, 2.01E-04)+ , ( 15, 6.295E-01, 5.646E-01, 0.8969, 465.2, 1.195E+03, 1.496E-03, 1057.4, 0.343, 2.29E-04)+ , ( 20, 5.332E-01, 4.599E-01, 0.8626, 447.4, 9.733E+02, 1.267E-03, 1036.9, 0.332, 2.62E-04)+ , ( 25, 4.486E-01, 3.716E-01, 0.8283, 429.6, 7.863E+02, 1.066E-03, 1016.1, 0.322, 3.02E-04)+ , ( 30, 3.747E-01, 2.975E-01, 0.7940, 411.8, 6.297E+02, 8.907E-04, 994.8, 0.311, 3.49E-04)+ , ( 35, 3.106E-01, 2.360E-01, 0.7598, 394.1, 4.993E+02, 7.382E-04, 973.1, 0.300, 4.06E-04)+ , ( 40, 2.471E-01, 1.858E-01, 0.7519, 390.0, 3.931E+02, 5.873E-04, 968.1, 0.297, 5.06E-04)+ , ( 45, 1.945E-01, 1.462E-01, 0.7519, 390.0, 3.094E+02, 4.623E-04, 968.1, 0.297, 6.42E-04)+ , ( 50, 1.531E-01, 1.151E-01, 0.7519, 390.0, 2.436E+02, 3.639E-04, 968.1, 0.297, 8.16E-04)+ , ( 55, 1.205E-01, 9.063E-02, 0.7519, 390.0, 1.918E+02, 2.865E-04, 968.1, 0.297, 1.04E-03)+ , ( 60, 9.492E-02, 7.137E-02, 0.7519, 390.0, 1.510E+02, 2.256E-04, 968.1, 0.297, 1.32E-03)+ , ( 65, 7.475E-02, 5.620E-02, 0.7519, 390.0, 1.189E+02, 1.777E-04, 968.1, 0.297, 1.67E-03)+ , ( 70, 5.856E-02, 4.429E-02, 0.7563, 392.2, 9.373E+01, 1.392E-04, 970.9, 0.298, 2.14E-03)+ , ( 75, 4.591E-02, 3.496E-02, 0.7615, 395.0, 7.399E+01, 1.091E-04, 974.3, 0.300, 2.75E-03)+ , ( 80, 3.606E-02, 2.765E-02, 0.7668, 397.7, 5.851E+01, 8.571E-05, 977.6, 0.302, 3.52E-03)+ , ( 85, 2.837E-02, 2.190E-02, 0.7720, 400.4, 4.635E+01, 6.743E-05, 981.0, 0.304, 4.50E-03)+ , ( 90, 2.236E-02, 1.738E-02, 0.7772, 403.1, 3.678E+01, 5.315E-05, 984.3, 0.305, 5.74E-03)+ , ( 95, 1.765E-02, 1.381E-02, 0.7825, 405.9, 2.923E+01, 4.196E-05, 987.6, 0.307, 7.32E-03)+ , (100, 1.396E-02, 1.100E-02, 0.7877, 408.6, 2.327E+01, 3.318E-05, 990.9, 0.309, 9.30E-03)+ , (105, 1.106E-02, 8.769E-03, 0.7930, 411.3, 1.856E+01, 2.628E-05, 994.2, 0.310, 1.18E-02)+ , (110, 8.691E-03, 7.011E-03, 0.8067, 418.4, 1.484E+01, 2.066E-05, 1002.7, 0.315, 1.52E-02)+ , (115, 6.853E-03, 5.629E-03, 0.8213, 426.0, 1.191E+01, 1.629E-05, 1011.8, 0.319, 1.96E-02)+ , (120, 5.427E-03, 4.537E-03, 0.8359, 433.6, 9.601E+00, 1.290E-05, 1020.8, 0.324, 2.51E-02)+ , (125, 4.316E-03, 3.671E-03, 0.8506, 441.2, 7.768E+00, 1.026E-05, 1029.7, 0.329, 3.20E-02)+ , (130, 3.446E-03, 2.981E-03, 0.8652, 448.8, 6.309E+00, 8.190E-06, 1038.5, 0.333, 4.07E-02)+ , (135, 2.762E-03, 2.430E-03, 0.8798, 456.3, 5.142E+00, 6.565E-06, 1047.2, 0.338, 5.15E-02)+ , (140, 2.222E-03, 1.987E-03, 0.8945, 463.9, 4.206E+00, 5.281E-06, 1055.9, 0.342, 6.48E-02)+ , (145, 1.794E-03, 1.631E-03, 0.9091, 471.5, 3.452E+00, 4.264E-06, 1064.5, 0.347, 8.13E-02)+ , (150, 1.454E-03, 1.343E-03, 0.9237, 479.1, 2.842E+00, 3.455E-06, 1073.0, 0.351, 1.02E-01)+ , (155, 1.182E-03, 1.109E-03, 0.9383, 486.6, 2.347E+00, 2.809E-06, 1081.4, 0.356, 1.27E-01)+ , (160, 9.769E-04, 9.176E-04, 0.9393, 487.2, 1.942E+00, 2.322E-06, 1082.0, 0.356, 1.53E-01)+ , (165, 8.083E-04, 7.592E-04, 0.9393, 487.2, 1.607E+00, 1.921E-06, 1082.0, 0.356, 1.85E-01)+ , (170, 6.716E-04, 6.282E-04, 0.9354, 485.2, 1.329E+00, 1.596E-06, 1079.8, 0.355, 2.22E-01)+ , (175, 5.633E-04, 5.187E-04, 0.9208, 477.6, 1.098E+00, 1.339E-06, 1071.3, 0.350, 2.62E-01)+ , (180, 4.712E-04, 4.270E-04, 0.9063, 470.1, 9.037E-01, 1.120E-06, 1062.8, 0.346, 3.09E-01)+ , (185, 3.931E-04, 3.505E-04, 0.8917, 462.5, 7.417E-01, 9.343E-07, 1054.3, 0.341, 3.65E-01)+ , (190, 3.269E-04, 2.868E-04, 0.8772, 455.0, 6.069E-01, 7.771E-07, 1045.6, 0.337, 4.34E-01)+ , (195, 2.711E-04, 2.339E-04, 0.8626, 447.4, 4.949E-01, 6.444E-07, 1036.9, 0.332, 5.16E-01)+ , (200, 2.241E-04, 1.901E-04, 0.8481, 439.9, 4.023E-01, 5.327E-07, 1028.2, 0.328, 6.16E-01)+ , (205, 1.847E-04, 1.540E-04, 0.8336, 432.4, 3.258E-01, 4.390E-07, 1019.3, 0.323, 7.37E-01)+ , (210, 1.517E-04, 1.242E-04, 0.8191, 424.8, 2.629E-01, 3.606E-07, 1010.4, 0.319, 8.84E-01)+ , (215, 1.242E-04, 9.990E-05, 0.8045, 417.3, 2.114E-01, 2.951E-07, 1001.4, 0.314, 1.06E+00)+ , (220, 1.013E-04, 8.001E-05, 0.7900, 409.8, 1.693E-01, 2.407E-07, 992.3, 0.309, 1.29E+00)+ , (225, 8.230E-05, 6.383E-05, 0.7755, 402.2, 1.351E-01, 1.956E-07, 983.2, 0.305, 1.56E+00)+ , (230, 6.663E-05, 5.071E-05, 0.7610, 394.7, 1.073E-01, 1.584E-07, 974.0, 0.300, 1.89E+00)+ , (235, 5.372E-05, 4.011E-05, 0.7466, 387.2, 8.488E-02, 1.277E-07, 964.7, 0.295, 2.31E+00)+ , (240, 4.295E-05, 3.160E-05, 0.7358, 381.6, 6.687E-02, 1.021E-07, 957.6, 0.292, 2.86E+00)+ , (245, 3.421E-05, 2.482E-05, 0.7254, 376.3, 5.252E-02, 8.131E-08, 950.9, 0.288, 3.54E+00)+ , (250, 2.716E-05, 1.942E-05, 0.7151, 370.9, 4.110E-02, 6.456E-08, 944.1, 0.285, 4.41E+00)+ , (255, 2.150E-05, 1.515E-05, 0.7048, 365.5, 3.206E-02, 5.109E-08, 937.3, 0.281, 5.50E+00)+ , (260, 1.696E-05, 1.177E-05, 0.6944, 360.2, 2.492E-02, 4.030E-08, 930.4, 0.278, 6.89E+00)+ , (265, 1.333E-05, 9.118E-06, 0.6841, 354.8, 1.930E-02, 3.168E-08, 923.4, 0.274, 8.65E+00)+ , (270, 1.044E-05, 7.034E-06, 0.6738, 349.5, 1.489E-02, 2.481E-08, 916.4, 0.270, 1.09E+01)+ , (275, 8.148E-06, 5.406E-06, 0.6635, 344.1, 1.144E-02, 1.937E-08, 909.4, 0.267, 1.38E+01)+ , (280, 6.335E-06, 4.138E-06, 0.6532, 338.8, 8.757E-03, 1.506E-08, 902.3, 0.263, 1.75E+01)+ ]