private IPlanNode NextPlanNode(IPlanNode prev, IPlanNode old) { var ff = fuelData.ClimbFuelFlow(prev.GrossWt); var stepDis = prev.Distance(prev.NextPlanNodeCoordinate); var stepTime = stepDis / prev.Gs * 60.0; var stepFuel = stepTime * ff; var climbGrad = fuelData.ClimbGradient(prev.GrossWt); var climbRate = climbGrad * prev.Ktas / 60.0 * NmFtRatio; var alt = Math.Min(prev.Alt + stepTime * climbRate, old.Alt); var grossWt = prev.GrossWt - stepFuel; var fuelOnBoard = prev.FuelOnBoard - stepFuel; var timeRemaining = prev.TimeRemaining - stepTime; return(GetNode(old, alt, grossWt, fuelOnBoard, timeRemaining)); }
/// <exception cref="ArgumentException">Invalid vertical mode.</exception> private double FuelFlow(double grossWt, VerticalMode mode) { switch (mode) { case VerticalMode.Climb: return(fuelData.ClimbFuelFlow(grossWt)); case VerticalMode.Cruise: return(fuelData.CruiseFuelFlow(grossWt)); case VerticalMode.Descent: return(fuelData.DescentFuelFlow(grossWt)); default: throw new ArgumentException(); } }