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(); }