/// <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))); }
/// <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); }
private double RwyPressureAltFt() { return(ConversionTools.PressureAltitudeFt(para.RwyElevationFt, para.QNH)); }