Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }