Guest User

Untitled

a guest
May 24th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.73 KB | None | 0 0
  1. import Data.Maybe
  2.  
  3. cao_20_7_4 = (*1.15)
  4. kg_to_lb = (*2.2)
  5. ft_to_metre = (*0.3048)
  6. litre_to_kg_avgas = (*0.72)
  7. taxi_fuel_kg = 5
  8. modrem x d = fromInteger (x `mod` d) / fromInteger d
  9.  
  10. -- Calculate pressure altitude
  11.  
  12. isatemp = 15
  13. isapressure = 1013.25
  14. pressure_altitude ele qnh = max 0 (fromIntegral ele + (isapressure - fromIntegral qnh) * 30)
  15. declared_temp da = isatemp - da / 500
  16.  
  17. -- Find the 4 numbers to interpolate
  18. -- nw ne
  19. -- sw se
  20. -- Calculate the proportion of the temperature to interpolate (0 >= temp_prop <= 1)
  21. -- Calculate the proportion of the pressure altutide to interpolate (0 >= pa_prop <= 1)
  22.  
  23. data DistanceRequired =
  24. DistanceRequired {
  25. distance_required_ft
  26. :: Double
  27. , distance_required_ft_cao20_7_4
  28. :: Double
  29. , distance_required_metre
  30. :: Double
  31. , distance_required_metre_cao20_7_4
  32. :: Double
  33. } deriving (Eq, Show)
  34.  
  35. f <<$>> DistanceRequired nw sw ne se =
  36. DistanceRequired (f nw) (f sw) (f ne) (f se)
  37.  
  38. eachDistanceRequired f (DistanceRequired nw1 sw1 ne1 se1) (DistanceRequired nw2 sw2 ne2 se2) =
  39. DistanceRequired (f nw1 nw2) (f sw1 sw2) (f ne1 ne2) (f se1 se2)
  40.  
  41. distanceRequired1 x =
  42. DistanceRequired x (cao_20_7_4 x) (ft_to_metre x) (cao_20_7_4 (ft_to_metre x))
  43.  
  44. grass gr clear50ft =
  45. let gr' = (*1.45) <<$>> gr
  46. t = eachDistanceRequired (+) (eachDistanceRequired (-) clear50ft gr) gr'
  47. in (gr', t)
  48.  
  49. interpolate ::
  50. Double
  51. -> Double
  52. -> Double
  53. -> Double
  54. -> Double
  55. -> Double
  56. -> DistanceRequired
  57. interpolate nw sw ne se da temp =
  58. let temp_prop = modrem (round temp) 10
  59. interpolate' a b prop = (a-b)*prop+b
  60. interpolate_temp a b = interpolate' a b temp_prop
  61. result = interpolate' (interpolate_temp se sw) (interpolate_temp ne nw) (modrem (round da) 1000)
  62. in distanceRequired1 result
  63.  
  64. data Check a =
  65. Check a a
  66. deriving (Eq, Ord, Show)
  67.  
  68. (===) ::
  69. a
  70. -> a
  71. -> Check a
  72. (===) =
  73. Check
  74.  
  75. infixl 4 ===
  76.  
  77. v ::
  78. Check a
  79. -> a
  80. v (Check a _) =
  81. a
  82.  
  83. check ::
  84. (Show a, Eq a) =>
  85. Check a
  86. -> Maybe String
  87. check (Check a1 a2) =
  88. if a1 == a2
  89. then Nothing
  90. else Just (concat [show a1, " /= ", show a2])
  91.  
  92. ----
  93.  
  94. ---- YBAF
  95.  
  96. ybaf_declared_density = 1450 -- ft (winter)
  97. ybaf_ele = 65 -- ft
  98. ybaf_declared_density_height = ybaf_declared_density + ybaf_ele === 1515
  99. ybaf_declared_temp = declared_temp (v ybaf_declared_density_height) === 11.97
  100. ybaf_interpolate nw sw ne se = interpolate nw sw ne se (v ybaf_declared_density_height) (v ybaf_declared_temp)
  101.  
  102. ---- YSPE
  103.  
  104. yspe_declared_density = 1450 -- ft (winter)
  105. yspe_ele = 2934 -- ft
  106. yspe_declared_density_height = yspe_declared_density + yspe_ele === 4384
  107. yspe_declared_temp = declared_temp (v yspe_declared_density_height) === 6.231999999999999
  108. yspe_interpolate nw sw ne se = interpolate nw sw ne se (v yspe_declared_density_height) (v yspe_declared_temp)
  109.  
  110. ----
  111.  
  112. -- TODR YBAF
  113. -- *2550lb*
  114.  
  115. todr_ybaf_groundroll = ybaf_interpolate 1010 1110 1090 1195 ===
  116. DistanceRequired {
  117. distance_required_ft = 1078.015
  118. , distance_required_ft_cao20_7_4 = 1239.71725
  119. , distance_required_metre = 328.578972
  120. , distance_required_metre_cao20_7_4 = 377.8658178
  121. }
  122.  
  123. todr_ybaf_50ft = ybaf_interpolate 1720 1890 1850 2035 ===
  124. DistanceRequired {
  125. distance_required_ft = 1835.095
  126. , distance_required_ft_cao20_7_4 = 2110.35925
  127. , distance_required_metre = 559.336956
  128. , distance_required_metre_cao20_7_4 = 643.2374993999999
  129. }
  130.  
  131. -- LDR YSPE
  132. -- *2550lb*
  133.  
  134. ldr_yspe_groundroll = yspe_interpolate 630 655 655 680 ===
  135. DistanceRequired {
  136. distance_required_ft = 654.6
  137. , distance_required_ft_cao20_7_4 = 752.79
  138. , distance_required_metre = 199.52208000000002
  139. , distance_required_metre_cao20_7_4 = 229.450392
  140. }
  141.  
  142. ldr_yspe_50ft = yspe_interpolate 1425 1460 1460 1500 ===
  143. DistanceRequired {
  144. distance_required_ft = 1460.592
  145. , distance_required_ft_cao20_7_4 = 1679.6808
  146. , distance_required_metre = 445.18844160000003
  147. , distance_required_metre_cao20_7_4 = 511.96670784
  148. }
  149.  
  150. -- TODR YSPE
  151. -- *2550lb*
  152.  
  153. todr_yspe_groundroll = yspe_interpolate 1235 1355 1215 1335 ===
  154. DistanceRequired {
  155. distance_required_ft = 1269.08
  156. , distance_required_ft_cao20_7_4 = 1459.4419999999998
  157. , distance_required_metre = 386.815584
  158. , distance_required_metre_cao20_7_4 = 444.83792159999996
  159. }
  160.  
  161. todr_yspe_50ft = yspe_interpolate 2120 2345 2295 2545 ===
  162. DistanceRequired {
  163. distance_required_ft = 2317.16
  164. , distance_required_ft_cao20_7_4 = 2664.7339999999995
  165. , distance_required_metre = 706.270368
  166. , distance_required_metre_cao20_7_4 = 812.2109231999999
  167. }
  168.  
  169. -- LDR YBAF
  170. -- *2550lb*
  171.  
  172. ldr_ybaf_groundroll = ybaf_interpolate 585 610 605 630 ===
  173. DistanceRequired {
  174. distance_required_ft = 601.875
  175. , distance_required_ft_cao20_7_4 = 692.15625
  176. , distance_required_metre = 183.4515
  177. , distance_required_metre_cao20_7_4 = 210.969225
  178. }
  179.  
  180. ldr_ybaf_50ft = ybaf_interpolate 1350 1385 1385 1420 ===
  181. DistanceRequired {
  182. distance_required_ft = 1375.025
  183. , distance_required_ft_cao20_7_4 = 1581.27875
  184. , distance_required_metre = 419.10762000000005
  185. , distance_required_metre_cao20_7_4 = 481.973763
  186. }
  187.  
  188.  
  189. ----
  190.  
  191. ybaf_checks =
  192. [
  193. ybaf_declared_density_height
  194. , ybaf_declared_temp
  195. ]
  196.  
  197. yspe_checks =
  198. [
  199. yspe_declared_density_height
  200. , yspe_declared_temp
  201. ]
  202.  
  203. todr_ybaf_checks =
  204. [
  205. todr_ybaf_groundroll
  206. , todr_ybaf_50ft
  207. ]
  208.  
  209. ldr_yspe_checks =
  210. [
  211. ldr_yspe_groundroll
  212. , ldr_yspe_50ft
  213. ]
  214.  
  215. todr_yspe_checks =
  216. [
  217. todr_yspe_groundroll
  218. , todr_yspe_50ft
  219. ]
  220.  
  221. ldr_ybaf_checks =
  222. [
  223. ldr_ybaf_groundroll
  224. , ldr_ybaf_50ft
  225. ]
  226.  
  227. checks =
  228. concat
  229. [
  230. ybaf_checks
  231. , yspe_checks
  232. ]
  233.  
  234. todr_checks =
  235. concat
  236. [
  237. todr_ybaf_checks
  238. , todr_yspe_checks
  239. ]
  240.  
  241. ldr_checks =
  242. concat
  243. [
  244. ldr_ybaf_checks
  245. , ldr_yspe_checks
  246. ]
  247.  
  248. all_checks =
  249. map check checks ++
  250. map check todr_checks ++
  251. map check ldr_checks
  252.  
  253. failed_checks =
  254. catMaybes all_checks
Add Comment
Please, Sign In to add comment