Beispiel #1
0
 public static ServiceVolumeTableFDOT ChangeTestParameterValue(ServiceVolumeTableFDOT Table, string testParameter, float testParameterValue)
 {
     if (testParameter == "g / C")
     {
         Table.Signal.EffGreenToCycleLengthRatio = testParameterValue;
     }
     else if (testParameter == "Posted Speed")
     {
         Table.Roadway.PostedSpeedMPH = (byte)testParameterValue;
     }
     else if (testParameter == "Pct. Heavy Vehicles")
     {
         Table.Traffic.PctHeavyVeh = testParameterValue;
     }
     else if (testParameter == "Base Sat Flow")
     {
         Table.Traffic.BaseSatFlow = (int)testParameterValue;
     }
     else if (testParameter == "Segment Length")
     {
         Table.Roadway.SegmentLengthFt     = (int)testParameterValue;
         Table.Roadway.ArterialLenghtFt    = Table.Roadway.NumSegments * Table.Roadway.SegmentLengthFt;
         Table.Roadway.FacilityLengthMiles = Table.Roadway.ArterialLenghtFt / 5280;
     }
     return(Table);
 }
 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();
 }
        /*private void bgwRunServiceVolsCalcs_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
         * {
         *  Project = new ProjectData(AnalysisMode.Planning);
         *
         *  string testParameter = this.cboTestParameter.Text;
         *  float[] testParameterBoundaries = ServiceVolumeArterialInputs.GetTestParameterValues(testParameter);
         *  List<ServiceVolumes> serviceVolResults = new List<ServiceVolumes>();
         *
         *  for (float iterateBoundary = testParameterBoundaries[0]; iterateBoundary <= testParameterBoundaries[1]; iterateBoundary += testParameterBoundaries[2])
         *  {
         *      ServiceVolumes SerVols = new ServiceVolumes(iterateBoundary, testParameter);
         *      ServiceVolumeArterialInputs InputsOneLane = new ServiceVolumeArterialInputs(false, testParameter, iterateBoundary);
         *      ServiceVolumeArterialInputs InputsMultiLane = new ServiceVolumeArterialInputs(true, testParameter, iterateBoundary);
         *      this.lblIteration.Text = "Iteration: " + Math.Round(iterateBoundary,2).ToString();
         *      CalcsServiceVolumes.ServiceVolsAuto(Project, SerVols, InputsOneLane, InputsMultiLane);
         *      serviceVolResults.Add(SerVols);
         *  }
         *  //e.Cancel = true;
         *  ServiceVolResultsOutput.WriteServiceVolResultsData("Service Volume Outputs.csv", serviceVolResults);
         *
         *  //ServiceVolumeArterialInputs InputsOneLane = new ServiceVolumeArterialInputs(false, TestParameter, 0);
         *  //ServiceVolumeArterialInputs InputsMultiLane = new ServiceVolumeArterialInputs(true, TestParameter, 0);
         *  //CalcsServiceVolumes.ServiceVolsAuto(Project, SerVols, InputsOneLane, InputsMultiLane);
         * }*/

        private void bgwRunServiceVolsCalcs_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            if (SerVolTables.Count == 0)
            {
                MessageBox.Show("Please read in a Service Volumes Input File first.");
            }
            else
            {
                Project = new ProjectData(AnalysisMode.Planning);

                string  testParameter                   = this.cboTestParameter.Text;
                float[] testParameterBoundaries         = ServiceVolumeArterialInputs.GetTestParameterValues(testParameter);
                int     numberOfTestParmsPerTable       = (int)(((testParameterBoundaries[1] - testParameterBoundaries[0]) / testParameterBoundaries[2]) + 1);
                List <ServiceVolumes> serviceVolResults = new List <ServiceVolumes>();

                foreach (SerVolTablesByClass SerVolTablesForClasses in SerVolTables)
                {
                    foreach (SerVolTablesByMultiLane SerVolTablesForNumLanes in SerVolTablesForClasses.SerVolTablesMultiLane)
                    {
                        for (float iterateBoundary = testParameterBoundaries[0]; iterateBoundary <= testParameterBoundaries[1]; iterateBoundary += testParameterBoundaries[2])
                        {
                            ServiceVolumes SerVols = new ServiceVolumes(iterateBoundary, testParameter, SerVolTablesForClasses.ArtAreaType, SerVolTablesForNumLanes.ArtClass);

                            SerVolTablesForNumLanes.SerVolTables[0] = ServiceVolumeTableFDOT.ChangeTestParameterValue(SerVolTablesForNumLanes.SerVolTables[0], testParameter, iterateBoundary);
                            SerVolTablesForNumLanes.SerVolTables[1] = ServiceVolumeTableFDOT.ChangeTestParameterValue(SerVolTablesForNumLanes.SerVolTables[1], testParameter, iterateBoundary);
                            this.lblIteration.Text = "Iteration: " + Math.Round(iterateBoundary, 2).ToString();
                            CalcsServiceVolumes.ServiceVolsAutoNew(Project, SerVols, SerVolTablesForNumLanes.SerVolTables[0], SerVolTablesForNumLanes.SerVolTables[1]);
                            serviceVolResults.Add(SerVols);
                        }
                    }
                }

                ServiceVolResultsOutput.WriteServiceVolResultsDataNew("Service Volume Outputs.csv", serviceVolResults, numberOfTestParmsPerTable);
                MessageBox.Show("Calculations Finished! Please check out the \"Service Volume Outputs.csv\" file.");
            }
        }
        /// <summary>
        /// Creates the Service Volumes for an arterial based on input parameters.
        /// </summary>
        /// <param name="Project"></param>
        /// <param name="SerVol"></param>
        /// <param name="inputsOneLane"></param>
        /// <param name="inputsMultiLane"></param>

        /*public static void ServiceVolsAuto(ProjectData Project, ServiceVolumes SerVol, ServiceVolumeArterialInputs
         * inputsOneLane, ServiceVolumeArterialInputs inputsMultiLane)
         * {
         *
         *  float NumberOfLoops = 5 * 5;  //This accounts for LOS and Lanes, does not account for volume increments; Type is float just to avoid extra cast in calculations below
         *  int LoopCounter = 0;
         *  frmMain.bgwRunServiceVolsCalcs.ReportProgress(0);
         *
         *  ArterialData Arterial = new ArterialData();
         *  for (int lanes = 0; lanes < 5; lanes++) // 2,4,6,8,*
         *  {
         *      int vol = 40; // Starting volume (volume entering upstream of first intersection)
         *      bool threshExceeded = false;
         *
         *      // Variable access points
         *
         *      ServiceVolumeArterialInputs inputsForArterialCreation = inputsOneLane;
         *      if (lanes > 0)
         *          inputsForArterialCreation = inputsMultiLane;
         *
         *      if (lanes != 4)
         *          Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, vol, lanes + 1);
         *      else
         *          Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, vol);
         *
         *      for (int LOSlevel = 0; LOSlevel < 5; LOSlevel++) // LOS A-E
         *      {
         *          LoopCounter++;
         *
         *          int[] ServiceVolsArray;
         *          do
         *          {
         *              CreateArterial_FDOTSerVols.ChangeArterialVolume(ref Arterial, vol);
         *              Arterial.TestSerVol = vol;
         *              CalcsArterial.CalcResults(Project, ref Arterial);
         *
         *              if (!Arterial.OverCapacity)
         *              {
         *                  // Check whether LOS speed threshold has been exceeded
         *                  if (Arterial.Results.AverageSpeed < Arterial.Thresholds.Speed[LOSlevel])  // Avg. speed below LOS threshold speed
         *                  {
         *                      vol -= 10;
         *                      threshExceeded = true;
         *                      if (vol <= 0)
         *                      {
         *                          vol = 10;
         *                          SerVol.PkDirVol[lanes, LOSlevel] = -1;
         *                          SerVol.BothDirVol[lanes, LOSlevel] = -1;
         *                          SerVol.AADT[lanes, LOSlevel] = -1;
         *                          SerVol.Found[lanes, LOSlevel] = true;
         *                      }
         *                  }
         *                  else
         *                  {
         *                      if (threshExceeded == false) // Threshold not exceeded, increment volume
         *                      {
         *                          if ((Arterial.Results.AverageSpeed - Arterial.Thresholds.Speed[LOSlevel]) > 5)
         *                              vol += (30 * (lanes + 1) * (LOSlevel + 1));
         *                          else
         *                              vol += 10;
         *                      }
         *                      else // Threshold exceeded, record volume for LOS level
         *                      {
         *                          if (LOSlevel > 0)
         *                              ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]);
         *                          else
         *                              ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1);
         *                          SerVol.PkDirVol[lanes, LOSlevel] = ServiceVolsArray[0];
         *                          SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1];
         *                          SerVol.AADT[lanes, LOSlevel] = ServiceVolsArray[2];
         *                          SerVol.Found[lanes, LOSlevel] = true;
         *                          vol += 10; // Increment volume for start of next LOS level
         *                          threshExceeded = false;
         *                      }
         *                  }
         *              }
         *              else  // Check to see if there is a constraining intersection due to (v/c * PHF) > 1
         *              {
         *                  vol -= 10; // Return to the previous non-capacity-constrained volume
         *                  for (int capCheckLOSlevel = LOSlevel + 1; capCheckLOSlevel < 5; capCheckLOSlevel++) // LOS A-E
         *                  {
         *                      SerVol.PkDirVol[lanes, capCheckLOSlevel] = -2;
         *                      SerVol.BothDirVol[lanes, capCheckLOSlevel] = -2;
         *                      SerVol.AADT[lanes, capCheckLOSlevel] = -2;
         *                      SerVol.Found[lanes, capCheckLOSlevel] = true;
         *                  }
         *                  if (LOSlevel > 0)
         *                      ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]);
         *                  else
         *                      ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1);
         *                  SerVol.PkDirVol[lanes, LOSlevel] = ServiceVolsArray[0];
         *                  SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1];
         *                  SerVol.AADT[lanes, LOSlevel] = ServiceVolsArray[2];
         *                  SerVol.Found[lanes, LOSlevel] = true;
         *              }
         *          }
         *          while (SerVol.Found[lanes, LOSlevel] == false);     //loop until service vol reached for given LOS
         *          if (Arterial.OverCapacity)
         *          {
         *              LoopCounter = 5 * (lanes + 1);
         *              frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero)));
         *              break;
         *          }
         *          frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero)));
         *      } // BP here to view service volumes by LOS
         *  } // BP here to view service volumes by number of lanes
         * } // BP here to view all service volumes*/

        public static void ServiceVolsAutoNew(ProjectData Project, ServiceVolumes SerVol, ServiceVolumeTableFDOT inputsOneLane, ServiceVolumeTableFDOT inputsMultiLane)
        {
            float NumberOfLoops = 5 * 5;  //This accounts for LOS and Lanes, does not account for volume increments; Type is float just to avoid extra cast in calculations below
            int   LoopCounter   = 0;

            frmMain.bgwRunServiceVolsCalcs.ReportProgress(0);

            ArterialData Arterial = new ArterialData();

            for (int lanes = 0; lanes < 5; lanes++) // 2,4,6,8,*
            {
                int  vol            = 40;           // Starting volume (volume entering upstream of first intersection)
                bool threshExceeded = false;

                // Variable access points

                ServiceVolumeTableFDOT inputsForArterialCreation = inputsOneLane;
                if (lanes > 0)
                {
                    inputsForArterialCreation = inputsMultiLane;
                }

                if (lanes != 4)
                {
                    Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, Project.AnalMode, vol, lanes + 1);
                }
                else
                {
                    Arterial = CreateArterial_FDOTSerVols.NewArterial(inputsForArterialCreation, Project.AnalMode, vol);
                }

                for (int LOSlevel = 0; LOSlevel < 5; LOSlevel++) // LOS A-E
                {
                    LoopCounter++;

                    int[] ServiceVolsArray;
                    do
                    {
                        CreateArterial_FDOTSerVols.ChangeArterialVolume(ref Arterial, vol);
                        Arterial.TestSerVol = vol;
                        CalcsArterial.CalcResults(Project, ref Arterial);

                        if (!Arterial.OverCapacity)
                        {
                            // Check whether LOS speed threshold has been exceeded
                            if (Arterial.Results.AverageSpeed < Arterial.Thresholds.Speed[LOSlevel])  // Avg. speed below LOS threshold speed
                            {
                                vol           -= 10;
                                threshExceeded = true;
                                if (vol <= 0)
                                {
                                    vol = 10;
                                    SerVol.PkDirVol[lanes, LOSlevel]   = -1;
                                    SerVol.BothDirVol[lanes, LOSlevel] = -1;
                                    SerVol.AADT[lanes, LOSlevel]       = -1;
                                    SerVol.Found[lanes, LOSlevel]      = true;
                                }
                            }
                            else
                            {
                                if (threshExceeded == false) // Threshold not exceeded, increment volume
                                {
                                    if ((Arterial.Results.AverageSpeed - Arterial.Thresholds.Speed[LOSlevel]) > 5)
                                    {
                                        vol += (30 * (lanes + 1) * (LOSlevel + 1));
                                    }
                                    else
                                    {
                                        vol += 10;
                                    }
                                }
                                else // Threshold exceeded, record volume for LOS level
                                {
                                    //vol += 10;
                                    if (LOSlevel > 0)
                                    {
                                        ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]);
                                    }
                                    else
                                    {
                                        ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1);
                                    }
                                    SerVol.PkDirVol[lanes, LOSlevel]   = ServiceVolsArray[0];
                                    SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1];
                                    SerVol.AADT[lanes, LOSlevel]       = ServiceVolsArray[2];
                                    SerVol.Found[lanes, LOSlevel]      = true;
                                    vol           += 10; // Increment volume for start of next LOS level
                                    threshExceeded = false;
                                }
                            }
                        }
                        else  // Check to see if there is a constraining intersection due to (v/c * PHF) > 1
                        {
                            vol -= 10; // Return to the previous non-capacity-constrained volume
                            for (int capCheckLOSlevel = LOSlevel + 1; capCheckLOSlevel < 5; capCheckLOSlevel++) // LOS A-E
                            {
                                SerVol.PkDirVol[lanes, capCheckLOSlevel]   = -2;
                                SerVol.BothDirVol[lanes, capCheckLOSlevel] = -2;
                                SerVol.AADT[lanes, capCheckLOSlevel]       = -2;
                                SerVol.Found[lanes, capCheckLOSlevel]      = true;
                            }
                            if (LOSlevel > 0)
                            {
                                ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, SerVol.PkDirVol[lanes, LOSlevel - 1]);
                            }
                            else
                            {
                                ServiceVolsArray = SetServiceVolumes(vol, Project.Period, Arterial.Dfactor, Arterial.Kfactor, LOSlevel, -1);
                            }
                            SerVol.PkDirVol[lanes, LOSlevel]   = ServiceVolsArray[0];
                            SerVol.BothDirVol[lanes, LOSlevel] = ServiceVolsArray[1];
                            SerVol.AADT[lanes, LOSlevel]       = ServiceVolsArray[2];
                            SerVol.Found[lanes, LOSlevel]      = true;
                        }
                    }while (SerVol.Found[lanes, LOSlevel] == false);     //loop until service vol reached for given LOS
                    threshExceeded = false;
                    if (Arterial.OverCapacity)
                    {
                        LoopCounter = 5 * (lanes + 1);
                        frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero)));
                        break;
                    }
                    frmMain.bgwRunServiceVolsCalcs.ReportProgress((int)(Math.Round(LoopCounter / NumberOfLoops * 100, 0, MidpointRounding.AwayFromZero)));
                } // BP here to view service volumes by LOS
            }     // BP here to view service volumes by number of lanes
        }         // BP here to view all service volumes
        public static ArterialData NewArterial(ServiceVolumeTableFDOT arterialInputs, AnalysisMode ProjectAnalMode, float analysisDirectionDemandVol = 800, int numLanes = 2)
        {
            arterialInputs.Signal.EffGreen     = arterialInputs.Signal.CalcEffectiveGreen(arterialInputs.Signal.EffGreenToCycleLengthRatio, arterialInputs.Signal.CycleLengthSec);
            arterialInputs.Signal.EffGreenLeft = arterialInputs.Signal.CalcEffectiveGreen(0.1f, arterialInputs.Signal.CycleLengthSec);
            List <SegmentData> Segments        = new List <SegmentData>();
            IntersectionData   newIntersection = CreateIntersection(numLanes, arterialInputs.Signal.CycleLengthSec, arterialInputs.SerVolAreaType, ProjectAnalMode);

            newIntersection.Signal.ControlType = arterialInputs.Signal.SigType;
            LinkData newLink;
            float    segmentLength;

            for (int intIndex = 0; intIndex < arterialInputs.Roadway.NumIntersections; intIndex++)
            {
                if (intIndex == 0)
                {
                    segmentLength = 0;
                }
                else
                {
                    segmentLength = arterialInputs.Roadway.ArterialLenghtFt / (arterialInputs.Roadway.NumIntersections - 1);
                }

                newLink = new LinkData(segmentLength - newIntersection.CrossStreetWidth, numLanes, arterialInputs.Roadway.PostedSpeedMPH, arterialInputs.Roadway.PropCurbRightSide, arterialInputs.Roadway.Median);
                Segments.Add(new SegmentData(intIndex, newLink, newIntersection, arterialInputs.SerVolAreaType, arterialInputs.Roadway.PostedSpeedMPH, newIntersection.CrossStreetWidth));
            }

            ArterialData newArterial = new ArterialData(arterialInputs, Segments);

            ChangeArterialVolume(ref newArterial, analysisDirectionDemandVol);

            // Calcs Arterial code
            foreach (SegmentData segment in newArterial.Segments)
            {
                foreach (ApproachData approach in segment.Intersection.Approaches)
                {
                    approach.PctLeftTurns  = arterialInputs.Traffic.PctLeftTurns;
                    approach.PctRightTurns = arterialInputs.Traffic.PctRightTurns;
                    foreach (LaneGroupData laneGroup in approach.LaneGroups)
                    {
                        if (laneGroup.Type == LaneMovementsAllowed.LeftOnly)
                        {
                            laneGroup.SignalPhase.GreenEffectiveSec = arterialInputs.Signal.EffGreenLeft;
                            laneGroup.TurnBayLeftLengthFeet         = arterialInputs.Roadway.TurnBayLeftLengthFeet;
                        }
                        else
                        {
                            laneGroup.SignalPhase.GreenEffectiveSec = arterialInputs.Signal.EffGreen;
                        }
                        laneGroup.BaseSatFlow      = arterialInputs.Traffic.BaseSatFlow;
                        laneGroup.PctHeavyVehicles = arterialInputs.Traffic.PctHeavyVeh;
                        laneGroup.ArvType          = arterialInputs.Signal.ArvType;
                        float[] PlatoonRatioValues = new float[] { 0.333f, 0.667f, 1.0f, 1.333f, 1.667f, 2.0f };
                        laneGroup.PlatoonRatio   = PlatoonRatioValues[laneGroup.ArvType - 1];
                        laneGroup.PeakHourFactor = arterialInputs.Traffic.PHF;
                    }
                }
            }
            newArterial.Thresholds.Delay  = newArterial.Thresholds.GetLOSBoundaries_Delay(newArterial.Area);
            newArterial.Thresholds.Speed  = newArterial.Thresholds.GetLOSBoundaries_Speed(arterialInputs.Roadway.PostedSpeedMPH);
            newArterial.AnalysisTravelDir = arterialInputs.Roadway.AnalysisTravelDir;

            return(newArterial);
        }
        public static SerVolTablesByMultiLane CreateServiceVolTableFDOT(AreaType SerVolAreaType, ArterialClass ArtClass)
        {
            ServiceVolumeTableFDOT SerVolTableSingleLane = new ServiceVolumeTableFDOT(SerVolAreaType, ArtClass, false);
            ServiceVolumeTableFDOT SerVolTableMultiLane  = new ServiceVolumeTableFDOT(SerVolAreaType, ArtClass, true);

            // Sample Structure:
            // public RoadwayData(bool multiLane, byte postedSpeedMPH, byte freeFlowSpeedMPH, MedianType median, TerrainType terrain, bool exclusiveLeftTurns, bool exclusiveRightTurns, byte facilityLengthMiles, byte numIntersections, byte accessPointsPerMile)

            switch (SerVolAreaType)
            {
            case AreaType.LargeUrbanized:     // Urbanized: Tables 1, 4, 7
                switch (ArtClass)
                {
                case ArterialClass.ClassI:
                    SerVolTableSingleLane.Roadway = new RoadwayData(45, 50, MedianType.None, TerrainType.Level, true, false, 2, 5, 2);
                    SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.55f, 1.0f, 1950, 1.0f, 12, 12);
                    SerVolTableSingleLane.Signal  = new SignalData(4, 3, SigControlType.CoordinatedActuated, 120, 0.44f);

                    SerVolTableMultiLane.Roadway = new RoadwayData(50, 55, MedianType.Restrictive, TerrainType.Level, true, false, 2, 5, 2);
                    SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.56f, 1.0f, 1950, 1.0f, 12, 12);
                    SerVolTableMultiLane.Signal  = new SignalData(4, 3, SigControlType.CoordinatedActuated, 150, 0.45f);
                    break;

                case ArterialClass.ClassII:
                    SerVolTableSingleLane.Roadway = new RoadwayData(30, 35, MedianType.None, TerrainType.Level, true, false, 1.9f, 11, 2);
                    SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.565f, 1.0f, 1950, 1.0f, 12, 12);
                    SerVolTableSingleLane.Signal  = new SignalData(10, 4, SigControlType.CoordinatedActuated, 120, 0.44f);

                    SerVolTableMultiLane.Roadway = new RoadwayData(30, 35, MedianType.Restrictive, TerrainType.Level, true, false, 1.8f, 11, 2);
                    SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.56f, 1.0f, 1950, 1.0f, 12, 12);
                    SerVolTableMultiLane.Signal  = new SignalData(10, 4, SigControlType.CoordinatedActuated, 120, 0.44f);
                    break;
                }
                break;

            case AreaType.Transitioning:     // Transitioning / Urban: Tables 2, 5, 8
                switch (ArtClass)
                {
                case ArterialClass.ClassI:
                    SerVolTableSingleLane.Roadway = new RoadwayData(45, 50, MedianType.None, TerrainType.Level, true, false, 1.8f, 6, 2);
                    SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.55f, 1.0f, 1950, 2.0f, 12, 12);
                    SerVolTableSingleLane.Signal  = new SignalData(5, 4, SigControlType.CoordinatedActuated, 120, 0.44f);

                    SerVolTableMultiLane.Roadway = new RoadwayData(50, 55, MedianType.Restrictive, TerrainType.Level, true, false, 2, 5, 2);
                    SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.57f, 1.0f, 1950, 3.0f, 12, 12);
                    SerVolTableMultiLane.Signal  = new SignalData(4, 3, SigControlType.CoordinatedActuated, 150, 0.45f);
                    break;

                case ArterialClass.ClassII:
                    SerVolTableSingleLane.Roadway = new RoadwayData(30, 35, MedianType.None, TerrainType.Level, true, false, 2, 11, 2);
                    SerVolTableSingleLane.Traffic = new TrafficData(0.09f, 0.57f, 1.0f, 1950, 2.0f, 12, 12);
                    SerVolTableSingleLane.Signal  = new SignalData(10, 4, SigControlType.CoordinatedActuated, 120, 0.44f);

                    SerVolTableMultiLane.Roadway = new RoadwayData(30, 35, MedianType.Restrictive, TerrainType.Level, true, false, 2, 11, 2);
                    SerVolTableMultiLane.Traffic = new TrafficData(0.09f, 0.565f, 1.0f, 1950, 3.0f, 12, 12);
                    SerVolTableMultiLane.Signal  = new SignalData(10, 4, SigControlType.CoordinatedActuated, 150, 0.45f);
                    break;
                }
                break;

            case AreaType.RuralDeveloped:     // Rural Developed / Undeveloped: Tables 3, 6, 9. No arterial class differentiation
                SerVolTableSingleLane.Roadway = new RoadwayData(45, 50, MedianType.None, TerrainType.Level, true, false, 1.9f, 6, 2);
                SerVolTableSingleLane.Traffic = new TrafficData(0.095f, 0.55f, 1.0f, 1950, 3.0f, 12, 12);
                SerVolTableSingleLane.Signal  = new SignalData(5, 3, SigControlType.CoordinatedActuated, 90, 0.44f);

                SerVolTableMultiLane.Roadway = new RoadwayData(45, 50, MedianType.Restrictive, TerrainType.Level, true, false, 2.2f, 7, 2);
                SerVolTableMultiLane.Traffic = new TrafficData(0.095f, 0.55f, 1.0f, 1950, 3.0f, 12, 12);
                SerVolTableMultiLane.Signal  = new SignalData(6, 3, SigControlType.CoordinatedActuated, 90, 0.44f);
                break;
            }
            return(new SerVolTablesByMultiLane(ArtClass, SerVolTableSingleLane, SerVolTableMultiLane));
        }