private NextPlanNodeParameter GetNextPara(IPlanNode node) { // Compute verical mode. double optCrzAlt = fuelData.OptCruiseAlt(node.GrossWt); double heading = HeadingCalculation.Heading(node.PrevWaypoint, node); double atcAllowedAlt = altProvider.ClosestAlt(node, heading, optCrzAlt); double targetAlt = Min(atcAllowedAlt, maxAlt); double altDiff = node.Alt - targetAlt; VerticalMode mode = GetMode(altDiff); // Time to next waypoint. double disToNextWpt = node.Distance(node.PrevWaypoint); double timeToNextWpt = disToNextWpt / node.Gs * 60.0; // Time to target altitude. // ClimbRate is positve for climbs and negative for descents. double climbGrad = ClimbGradient(node.GrossWt, mode); double climbRate = climbGrad * node.Ktas / 60.0 * NmFtRatio; bool isCruising = Abs(altDiff) < AltDiffCriteria; double timeToTargetAlt = isCruising ? double.PositiveInfinity : altDiff / climbRate; double[] times = { timeToNextWpt, DeltaT, timeToTargetAlt }; int minIndex = times.MinIndex(); double stepTime = times[minIndex]; Type nodeType = minIndex == 0 ? typeof(RouteNode) : typeof(IntermediateNode); return(new NextPlanNodeParameter(mode, nodeType, stepTime, climbRate)); }
public static double EstimatedCrzAlt(this FuelDataItem item, double distance, double landingWt) { var grossWt = item.EstimatedAvgWt(distance, landingWt); var lim = item.DistanceLimitedAltitude(distance, grossWt); var opt = item.OptCruiseAlt(grossWt); return(Math.Min(lim, opt)); }
private double Kias(double grossWt, double alt) { if (alt <= 10000.0) { return(250.0); } var cruiseKias = fuelData.CruiseKias(grossWt); var optAlt = fuelData.OptCruiseAlt(grossWt); var optCruiseKtas = Ktas(cruiseKias, optAlt); var kias = fuelData.ClimbKias; var ktas = Ktas(kias, alt); return(ktas > optCruiseKtas?KtasToKcas(optCruiseKtas, alt) : kias); }
public static double EstimatedAvgWt(this FuelDataItem item, double distance, double landingWt) { double grossWt = landingWt; const int iteration = 2; for (int i = 0; i < iteration; i++) { var alt = item.OptCruiseAlt(grossWt); var ktas = Ktas(item.CruiseKias(grossWt), alt); var time = distance / ktas * 60.0; var ff = item.CruiseFuelFlow(grossWt); grossWt = landingWt + ff * time / 2.0; } return(grossWt); }