Example #1
0
        /// <summary>
        /// Computes the required takeoff distance.
        /// </summary>
        /// <exception cref="Exception"></exception>
        public static double TakeOffDistanceMeter(AirbusPerfTable t, TOParameters p)
        {
            var tables = GetTables(t, p);

            if (tables.Count == 0)
            {
                throw new Exception("No data for selected flaps");
            }
            var pressAlt      = ConversionTools.PressureAltitudeFt(p.RwyElevationFt, p.QNH);
            var inverseTables = tables.Select(x => GetInverseTable(x, pressAlt, t, p));
            var distancesFt   = inverseTables.Select(x =>
                                                     x.ValueAt(p.WeightKg * 0.001 * Constants.KgLbRatio))
                                .ToArray();

            var d = (distancesFt.Length == 1) ?
                    distancesFt[0] :
                    Interpolate1D.Interpolate(
                tables.Select(x => x.IsaOffset).ToArray(),
                distancesFt,
                IsaOffset(p));

            // The slope and wind correction is not exactly correct according to
            // performance xml file comments. However, the table itsel is probably
            // not that precise anyways.
            return(Constants.FtMeterRatio * (d - SlopeAndWindCorrectionFt(d, t, p)));
        }
Example #2
0
        /// <summary>
        /// Flaps and brake settings can be overriden.
        /// </summary>
        /// <exception cref="Exception">Unexpected error</exception>
        public static double LandingDistanceMeter(CalculatorData d,
                                                  string flaps = null, string brake = null)
        {
            var p = d.Parameters;
            var t = d.Table;

            if (flaps == null)
            {
                flaps = t.AllFlaps()[p.FlapsIndex];
            }
            if (brake == null)
            {
                brake = t.AllBrakes()[p.BrakeIndex];
            }

            // Matching table
            var m = t.Entries.Where(x => x.Flaps == flaps && x.Autobrake == brake)
                    .First();

            var weight1000LB = p.WeightKG / 1000 * Constants.KgLbRatio;

            var(table, elevation, head, tail, reverser) = p.SurfaceCondition == 0
                ? (m.Dry, m.ElevationDry, m.HeadwindDry, m.TailwindDry, m.BothReversersDry)
                : (m.Wet, m.ElevationWet, m.HeadwindWet, m.TailwindWet, m.BothReversersWet);

            var len = table.ValueAt(weight1000LB);
            var alt = ConversionTools.PressureAltitudeFt(p.ElevationFT, p.QNH);

            len *= 1 + alt / 1000 * elevation / 100;
            len *= 1 + (p.HeadwindKts >= 0 ?
                        (-head * p.HeadwindKts / 10) :
                        (tail * -p.HeadwindKts / 10)) / 100;
            len *= 1 - (p.Reverser == 1 ? reverser : 0) / 100;
            len *= 1 + (p.AppSpeedIncrease / 5) * (m.Speed5Knots / 100);
            return(len * Constants.FtMeterRatio * t.Multiplier);
        }
Example #3
0
 private double RwyPressureAltFt()
 {
     return(ConversionTools.PressureAltitudeFt(para.RwyElevationFt, para.QNH));
 }