Take-off Distance Required, Landing Distance Required
| import Data.Maybe | |
| cao_20_7_4 = (*1.15) | |
| kg_to_lb = (*2.2) | |
| ft_to_metre = (*0.3048) | |
| litre_to_kg_avgas = (*0.72) | |
| taxi_fuel_kg = 5 | |
| modrem x d = fromInteger (x `mod` d) / fromInteger d | |
| -- Calculate pressure altitude | |
| isatemp = 15 | |
| isapressure = 1013.25 | |
| pressure_altitude ele qnh = max 0 (fromIntegral ele + (isapressure - fromIntegral qnh) * 30) | |
| declared_temp da = isatemp - da / 500 | |
| -- Find the 4 numbers to interpolate | |
| -- nw ne | |
| -- sw se | |
| -- Calculate the proportion of the temperature to interpolate (0 >= temp_prop <= 1) | |
| -- Calculate the proportion of the pressure altutide to interpolate (0 >= pa_prop <= 1) | |
| data DistanceRequired = | |
| DistanceRequired { | |
| distance_required_ft | |
| :: Double | |
| , distance_required_ft_cao20_7_4 | |
| :: Double | |
| , distance_required_metre | |
| :: Double | |
| , distance_required_metre_cao20_7_4 | |
| :: Double | |
| } deriving (Eq, Show) | |
| f <<$>> DistanceRequired nw sw ne se = | |
| DistanceRequired (f nw) (f sw) (f ne) (f se) | |
| eachDistanceRequired f (DistanceRequired nw1 sw1 ne1 se1) (DistanceRequired nw2 sw2 ne2 se2) = | |
| DistanceRequired (f nw1 nw2) (f sw1 sw2) (f ne1 ne2) (f se1 se2) | |
| distanceRequired1 x = | |
| DistanceRequired x (cao_20_7_4 x) (ft_to_metre x) (cao_20_7_4 (ft_to_metre x)) | |
| grass gr clear50ft = | |
| let gr' = (*1.45) <<$>> gr | |
| t = eachDistanceRequired (+) (eachDistanceRequired (-) clear50ft gr) gr' | |
| in (gr', t) | |
| interpolate :: | |
| Double | |
| -> Double | |
| -> Double | |
| -> Double | |
| -> Double | |
| -> Double | |
| -> DistanceRequired | |
| interpolate nw sw ne se da temp = | |
| let temp_prop = modrem (round temp) 10 | |
| interpolate' a b prop = (a-b)*prop+b | |
| interpolate_temp a b = interpolate' a b temp_prop | |
| result = interpolate' (interpolate_temp se sw) (interpolate_temp ne nw) (modrem (round da) 1000) | |
| in distanceRequired1 result | |
| data Check a = | |
| Check a a | |
| deriving (Eq, Ord, Show) | |
| (===) :: | |
| a | |
| -> a | |
| -> Check a | |
| (===) = | |
| Check | |
| infixl 4 === | |
| v :: | |
| Check a | |
| -> a | |
| v (Check a _) = | |
| a | |
| check :: | |
| (Show a, Eq a) => | |
| Check a | |
| -> Maybe String | |
| check (Check a1 a2) = | |
| if a1 == a2 | |
| then Nothing | |
| else Just (concat [show a1, " /= ", show a2]) | |
| ---- | |
| ---- YBAF | |
| ybaf_declared_density = 1450 -- ft (winter) | |
| ybaf_ele = 65 -- ft | |
| ybaf_declared_density_height = ybaf_declared_density + ybaf_ele === 1515 | |
| ybaf_declared_temp = declared_temp (v ybaf_declared_density_height) === 11.97 | |
| ybaf_interpolate nw sw ne se = interpolate nw sw ne se (v ybaf_declared_density_height) (v ybaf_declared_temp) | |
| ---- YSPE | |
| yspe_declared_density = 1450 -- ft (winter) | |
| yspe_ele = 2934 -- ft | |
| yspe_declared_density_height = yspe_declared_density + yspe_ele === 4384 | |
| yspe_declared_temp = declared_temp (v yspe_declared_density_height) === 6.231999999999999 | |
| yspe_interpolate nw sw ne se = interpolate nw sw ne se (v yspe_declared_density_height) (v yspe_declared_temp) | |
| ---- | |
| -- TODR YBAF | |
| -- *2550lb* | |
| todr_ybaf_groundroll = ybaf_interpolate 1010 1110 1090 1195 === | |
| DistanceRequired { | |
| distance_required_ft = 1078.015 | |
| , distance_required_ft_cao20_7_4 = 1239.71725 | |
| , distance_required_metre = 328.578972 | |
| , distance_required_metre_cao20_7_4 = 377.8658178 | |
| } | |
| todr_ybaf_50ft = ybaf_interpolate 1720 1890 1850 2035 === | |
| DistanceRequired { | |
| distance_required_ft = 1835.095 | |
| , distance_required_ft_cao20_7_4 = 2110.35925 | |
| , distance_required_metre = 559.336956 | |
| , distance_required_metre_cao20_7_4 = 643.2374993999999 | |
| } | |
| -- LDR YSPE | |
| -- *2550lb* | |
| ldr_yspe_groundroll = yspe_interpolate 630 655 655 680 === | |
| DistanceRequired { | |
| distance_required_ft = 654.6 | |
| , distance_required_ft_cao20_7_4 = 752.79 | |
| , distance_required_metre = 199.52208000000002 | |
| , distance_required_metre_cao20_7_4 = 229.450392 | |
| } | |
| ldr_yspe_50ft = yspe_interpolate 1425 1460 1460 1500 === | |
| DistanceRequired { | |
| distance_required_ft = 1460.592 | |
| , distance_required_ft_cao20_7_4 = 1679.6808 | |
| , distance_required_metre = 445.18844160000003 | |
| , distance_required_metre_cao20_7_4 = 511.96670784 | |
| } | |
| -- TODR YSPE | |
| -- *2550lb* | |
| todr_yspe_groundroll = yspe_interpolate 1235 1355 1215 1335 === | |
| DistanceRequired { | |
| distance_required_ft = 1269.08 | |
| , distance_required_ft_cao20_7_4 = 1459.4419999999998 | |
| , distance_required_metre = 386.815584 | |
| , distance_required_metre_cao20_7_4 = 444.83792159999996 | |
| } | |
| todr_yspe_50ft = yspe_interpolate 2120 2345 2295 2545 === | |
| DistanceRequired { | |
| distance_required_ft = 2317.16 | |
| , distance_required_ft_cao20_7_4 = 2664.7339999999995 | |
| , distance_required_metre = 706.270368 | |
| , distance_required_metre_cao20_7_4 = 812.2109231999999 | |
| } | |
| -- LDR YBAF | |
| -- *2550lb* | |
| ldr_ybaf_groundroll = ybaf_interpolate 585 610 605 630 === | |
| DistanceRequired { | |
| distance_required_ft = 601.875 | |
| , distance_required_ft_cao20_7_4 = 692.15625 | |
| , distance_required_metre = 183.4515 | |
| , distance_required_metre_cao20_7_4 = 210.969225 | |
| } | |
| ldr_ybaf_50ft = ybaf_interpolate 1350 1385 1385 1420 === | |
| DistanceRequired { | |
| distance_required_ft = 1375.025 | |
| , distance_required_ft_cao20_7_4 = 1581.27875 | |
| , distance_required_metre = 419.10762000000005 | |
| , distance_required_metre_cao20_7_4 = 481.973763 | |
| } | |
| ---- | |
| ybaf_checks = | |
| [ | |
| ybaf_declared_density_height | |
| , ybaf_declared_temp | |
| ] | |
| yspe_checks = | |
| [ | |
| yspe_declared_density_height | |
| , yspe_declared_temp | |
| ] | |
| todr_ybaf_checks = | |
| [ | |
| todr_ybaf_groundroll | |
| , todr_ybaf_50ft | |
| ] | |
| ldr_yspe_checks = | |
| [ | |
| ldr_yspe_groundroll | |
| , ldr_yspe_50ft | |
| ] | |
| todr_yspe_checks = | |
| [ | |
| todr_yspe_groundroll | |
| , todr_yspe_50ft | |
| ] | |
| ldr_ybaf_checks = | |
| [ | |
| ldr_ybaf_groundroll | |
| , ldr_ybaf_50ft | |
| ] | |
| checks = | |
| concat | |
| [ | |
| ybaf_checks | |
| , yspe_checks | |
| ] | |
| todr_checks = | |
| concat | |
| [ | |
| todr_ybaf_checks | |
| , todr_yspe_checks | |
| ] | |
| ldr_checks = | |
| concat | |
| [ | |
| ldr_ybaf_checks | |
| , ldr_yspe_checks | |
| ] | |
| all_checks = | |
| map check checks ++ | |
| map check todr_checks ++ | |
| map check ldr_checks | |
| failed_checks = | |
| catMaybes all_checks |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment