/// <summary> /// Selects a runway with most headwind component. Returns its ident. /// </summary> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="InvalidOperationException">rwys is empty</exception> public static string MaxHeadwind(this IEnumerable <IRwyData> rwys, double windHeading) { return(rwys .Where(r => r.Heading.IsDouble()) .MaxBy(r => ConversionTools.HeadwindComponent( double.Parse(r.Heading), windHeading, 1.0)) .RwyIdent); }
/// <exception cref="InvalidUserInputException"></exception> public LandingParameters Validate() { var e = elements; double weightKg = 0.0; double rwyLengthMeter = 0.0; double elevationFt = 0.0; double headwindKts = 0.0; double slopePercent = 0.0; double tempCelsius = 0.0; double qnh = 0.0; double appSpeedIncrease = 0.0; int reverser = 0; int surfaceCondition = 0; int flapsIndex = 0; int brakeIndex = 0; try { weightKg = Convert.ToDouble(e.Weight.Text); if (e.WtUnit.SelectedIndex == 1) //LB { weightKg *= Constants.LbKgRatio; } if (weightKg < 0) { throw new InvalidUserInputException("Landing weight is not valid."); } } catch { throw new InvalidUserInputException("Landing weight is not valid."); } try { rwyLengthMeter = Convert.ToDouble(e.Length.Text); if (e.LengthUnit.SelectedIndex == 1) // FT { rwyLengthMeter *= Constants.FtMeterRatio; } if (rwyLengthMeter < 0) { throw new InvalidUserInputException("Runway length is not valid."); } } catch { throw new InvalidUserInputException("Runway length is not valid."); } try { elevationFt = Convert.ToDouble(e.Elevation.Text); if (elevationFt < -2000.0 || elevationFt > 20000.0) { throw new InvalidUserInputException("Runway elevation is not valid."); } } catch { throw new InvalidUserInputException("Runway elevation is not valid."); } try { headwindKts = ConversionTools.HeadwindComponent( Convert.ToDouble(e.RwyHeading.Text), Convert.ToDouble(e.WindDirection.Text), Convert.ToDouble(e.WindSpeed.Text)); } catch { throw new InvalidUserInputException("Wind entry is not valid."); } try { slopePercent = Convert.ToDouble(e.Slope.Text); } catch { throw new InvalidUserInputException("Runway slope is not valid."); } try { tempCelsius = Convert.ToDouble(e.Oat.Text); if (e.TempUnit.SelectedIndex == 1) // deg F { tempCelsius = ConversionTools.ToCelsius(tempCelsius); } } catch { throw new InvalidUserInputException("OAT is not valid."); } try { qnh = Convert.ToDouble(e.Pressure.Text); if (e.PressureUnit.SelectedIndex == 1) { qnh *= 1013.0 / 29.92; } if (qnh <900.0 | qnh> 1100.0) { throw new InvalidUserInputException("Altimeter setting is not valid."); } } catch { throw new InvalidUserInputException("Altimeter setting is not valid."); } try { appSpeedIncrease = double.Parse(e.AppSpeedIncrease.Text); } catch { throw new InvalidUserInputException("APP speed increase is not valid."); } try { reverser = e.Reverser.SelectedIndex; } catch { throw new InvalidUserInputException("Reverser selection is not valid."); } try { surfaceCondition = e.SurfCond.SelectedIndex; } catch { throw new InvalidUserInputException("Surface condition is not valid."); } flapsIndex = e.Flaps.SelectedIndex; brakeIndex = e.Brake.SelectedIndex; return(new LandingParameters( weightKg, rwyLengthMeter, elevationFt, headwindKts, slopePercent, tempCelsius, qnh, appSpeedIncrease, reverser, surfaceCondition, flapsIndex, brakeIndex)); }