{-# 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) ]