public static void IntersectionCalcs(IntersectionData intersection, AreaType area)
        {
            foreach (ApproachData approach in intersection.Approaches)
            {
                foreach (LaneGroupData laneGroup in approach.LaneGroups)
                {
                    if (laneGroup.Type == LaneMovementsAllowed.LeftOnly || laneGroup.Type == LaneMovementsAllowed.ThruAndLeftTurnBay)
                    {
                        approach.LeftTurnBayExists = true;
                    }
                    else if (laneGroup.Type == LaneMovementsAllowed.RightOnly || laneGroup.Type == LaneMovementsAllowed.ThruAndRightTurnBay)
                    {
                        approach.RightTurnBayExists = true;
                    }
                }

                approach.Results = new ResultsIntersectionApproachData(intersection.Signal.CycleLengthSec);
                approach.Results.ControlDelay = 0;
                approach.DemandVolume         = 0;

                foreach (LaneGroupData laneGroup in approach.LaneGroups)
                {
                    laneGroup.AnalysisResults = new ResultsIntersectionLaneGroupData();

                    if (laneGroup.DischargeVolume > 0)
                    {
                        laneGroup.PortionOnGreen = Math.Min(Math.Min(laneGroup.PlatoonRatio, 2) * laneGroup.SignalPhase.GreenEffectiveSec / intersection.Signal.CycleLengthSec, 1); // includes green
                    }
                    else
                    {
                        laneGroup.PortionOnGreen = 0;
                    }

                    laneGroup.AnalysisResults.SatFlowRate = SatFlowRateCalculations.HCM2016(area, laneGroup.NumLanes, 12, laneGroup.PctHeavyVehicles, laneGroup.Type, laneGroup.PctLeftTurns, laneGroup.PctRightTurns, approach.PctGrade, laneGroup.BaseSatFlow);

                    laneGroup.SignalPhase.gC = laneGroup.SignalPhase.GreenEffectiveSec / intersection.Signal.CycleLengthSec; //Equation 19-16

                    laneGroup.AnalysisResults.CapacityPerLane = SignalCalcs.Capacity(laneGroup.AnalysisResults.SatFlowRate.AdjustedValueVehHrLane, laneGroup.SignalPhase.gC, laneGroup.NumLanes);
                    laneGroup.AnalysisResults.vcRatio         = SignalCalcs.vcRatio(laneGroup.AnalysisFlowRate, laneGroup.AnalysisResults.CapacityPerLane);

                    laneGroup.AnalysisResults.OverCap = SignalCalcs.OverCapacityCheck(laneGroup.AnalysisResults.vcRatio, laneGroup.PeakHourFactor);

                    //if (laneGroup.AnalysisResults.OverCap)
                    //    Arterial.OverCapacity = true;

                    ThresholdData LOSthresholds = new ThresholdData(area);

                    float PrevVC = 0;
                    laneGroup.AnalysisResults.SignalControlParms = SignalCalcs.SigDelay(intersection.Signal.ControlType, intersection.Signal.CycleLengthSec, laneGroup.SignalPhase.gC, laneGroup.ArvType, laneGroup.AnalysisFlowRate, laneGroup.AnalysisResults.SatFlowRate.AdjustedValueVehHrLane, laneGroup.NumLanes, laneGroup.AnalysisResults.CapacityPerLane, laneGroup.AnalysisResults.vcRatio, PrevVC, laneGroup.PortionOnGreen, laneGroup.NemaMvmtID);
                    laneGroup.AnalysisResults.LOS = SignalCalcs.LOSintersection(laneGroup.AnalysisResults.SignalControlParms.AvgOverallDelay, LOSthresholds.Delay);     //determine intersection LOS, as a function of signal delay

                    approach.Results.ControlDelay += (laneGroup.AnalysisFlowRate * laneGroup.AnalysisResults.SignalControlParms.AvgOverallDelay) / approach.DemandVolume;
                    approach.DemandVolume         += laneGroup.AnalysisFlowRate;
                }

                intersection.DemandVolumeVehPerHr += approach.DemandVolume;
                intersection.Results.ControlDelay += ((approach.Results.ControlDelay * approach.DemandVolume) / intersection.DemandVolumeVehPerHr);
            }
        }
 public SegmentData(int id, LinkData link, IntersectionData intersection, AreaType SerVolAreaType, int BaseFFS, int upstreamIntersectionWidth)
 {
     _id           = id;
     _link         = link;
     _intersection = intersection;
     _thresholds   = new ThresholdData(SerVolAreaType, BaseFFS);
     _results      = new ResultsSegmentData();
     _upstreamIntersectionWidth = upstreamIntersectionWidth;
     _lengthFt = link.LengthFt + upstreamIntersectionWidth;
 }
 public ArterialData(ServiceVolumeTableFDOT Inputs, List <SegmentData> segments)
 {
     _artName     = "";
     _from        = "";
     _to          = "";
     _lengthMiles = Inputs.Roadway.FacilityLengthMiles;
     _dir         = Inputs.Roadway.AnalysisTravelDir;
     _area        = Inputs.SerVolAreaType;
     _class       = Inputs.Class;
     _segments    = segments;
     _Dfactor     = Inputs.Traffic.DFactor;
     _Kfactor     = Inputs.Traffic.KFactor;
     _thresholds  = new ThresholdData();
     _results     = new ResultsArterialData();
 }
        /// <summary>
        /// Constructor for creating an Arterial for use with Service Volumes.
        /// </summary>
        /// <param name="area"></param>
        /// <param name="classification"></param>
        /// <param name="analysisTravelDir"></param>
        /// <param name="segments"></param>
        /// <param name="KFactor"></param>
        /// <param name="DFactor"></param>
        public ArterialData(AreaType area, ArterialClass classification, TravelDirection analysisTravelDir, List <SegmentData> segments, float KFactor, float DFactor)
        {
            //SetDefaultValues();

            //_segments = new List<SegmentData>();

            _artName     = "";
            _from        = "";
            _to          = "";
            _lengthMiles = 0;
            _dir         = analysisTravelDir;
            _area        = area;
            _class       = classification;
            _segments    = segments;
            _Dfactor     = DFactor;
            _Kfactor     = KFactor;
            _thresholds  = new ThresholdData();
            _results     = new ResultsArterialData();
        }
        /// <summary>
        /// Constructor for creating an Arterial without using Service Volumes.
        /// </summary>
        /// <param name="area"></param>
        /// <param name="classification"></param>
        /// <param name="analysisTravelDir"></param>
        /// <param name="segments"></param>
        public ArterialData(AreaType area, ArterialClass classification, TravelDirection analysisTravelDir, List <SegmentData> segments)
        {
            //SetDefaultValues();

            //_segments = new List<SegmentData>();

            _artName     = "";
            _from        = "";
            _to          = "";
            _lengthMiles = 0;
            _dir         = analysisTravelDir;
            _area        = area;
            _class       = classification;
            _segments    = segments;
            _Dfactor     = 0.5f;
            _Kfactor     = 0.1f;
            _thresholds  = new ThresholdData();
            _results     = new ResultsArterialData();

            //_class = ParmRanges.ArtClassDefault[Convert.ToInt32(_area)];
            //_Kfactor = ParmRanges.KfactDefault[Convert.ToInt32(_area)];
            //_Dfactor = ParmRanges.DfactDefault[Convert.ToInt32(_area)];
            //_maxSerVol = ParmRanges.MaxSerVol[Convert.ToInt32(_area)];  //for other urbanized
        }
        /**** Constructors ****/

        /// <summary>
        /// Parameterless constructor needed for XML de/serialization. Do not use.
        /// </summary>
        public ArterialData()
        {
            //Parameterless constructor needed for XML de/serialization
            _thresholds = new ThresholdData();
        }
 /// <summary>
 /// Parameterless constructor needed for XML de/serialization. Do not use.
 /// </summary>
 public SegmentData()
 {
     //Parameterless constructor needed for XML de/serialization
     _thresholds = new ThresholdData();
     _results    = new ResultsSegmentData();
 }