diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 62eff09f779f67986dd0baba714daac7ec1d6cb0..5c750b659eeefd9c64ef088c9bcf531495193fa9 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -126,19 +126,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter axleData.Add(axle); } - axleData.AddRange(mission.TrailerAxleWeightDistribution.Select(tmp => { - var wheel = mission.TrailerType != TrailerType.None - ? DeclarationData.StandardBodies.Lookup(mission.TrailerType.ToString()).Wheels - : DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType); - return new Axle { - AxleType = AxleType.Trailer, - AxleWeightShare = tmp, - TwinTyres = DeclarationData.Trailer.TwinTyres, - RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, - TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = wheel.Inertia - }; + axleData.AddRange(mission.TrailerWheels.Select(trailerWheel => new Axle { + AxleType = AxleType.Trailer, + AxleWeightShare = mission.TrailerAxleWeightShare / mission.TrailerWheels.Count, + TwinTyres = DeclarationData.Trailer.TwinTyres, + RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, + TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), + Inertia = trailerWheel.Inertia })); + retVal.AxleData = axleData; return retVal; } diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index fab524d0b2b11e63baebfe5c0e9c0f76adf71f4a..125dccf9ec62b1e0d60f3fe1558421ecead1bf2b 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -119,8 +119,7 @@ namespace TUGraz.VectoCore.Models.Declaration public static HeatingVentilationAirConditioning HeatingVentilationAirConditioning { - get - { + get { return Instance()._heatingVentilationAirConditioning ?? (Instance()._heatingVentilationAirConditioning = new HeatingVentilationAirConditioning()); } @@ -222,7 +221,7 @@ namespace TUGraz.VectoCore.Models.Declaration public const double RollResistanceCoefficient = 0.00555; public const double TyreTestLoad = 37500; public const bool TwinTyres = false; - public const string WheelsType = "385/65 R 22.5"; + //public const string WheelsType = "385/65 R 22.5"; } public static class Engine diff --git a/VectoCore/VectoCore/Models/Declaration/Mission.cs b/VectoCore/VectoCore/Models/Declaration/Mission.cs index 7df3a8328840c6573bd95e35ff6c5d35fa547e7e..51f11b45b0fe23efbb79d6336928b2a3086ef521 100644 --- a/VectoCore/VectoCore/Models/Declaration/Mission.cs +++ b/VectoCore/VectoCore/Models/Declaration/Mission.cs @@ -65,7 +65,7 @@ namespace TUGraz.VectoCore.Models.Declaration public MissionType MissionType; public string CrossWindCorrectionParameters; public double[] AxleWeightDistribution; - public double[] TrailerAxleWeightDistribution; + public double TrailerAxleWeightShare; public Kilogram CurbWeight; public Kilogram BodyCurbWeight; @@ -73,6 +73,7 @@ namespace TUGraz.VectoCore.Models.Declaration public TrailerType TrailerType; public Kilogram TrailerCurbWeight; public Kilogram TrailerGrossVehicleWeight; + public List<Wheels.Entry> TrailerWheels; public Stream CycleFile; public SquareMeter DeltaCdA; @@ -98,6 +99,7 @@ namespace TUGraz.VectoCore.Models.Declaration { None, T1, - T2 + T2, + ST1 } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs index 99495073ea211e1f835cbda37cb8a6b99f7320e1..ee23b41fcd30233e6500a315bf52f1c017d8a02b 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segments.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs @@ -53,8 +53,7 @@ namespace TUGraz.VectoCore.Models.Declaration protected override string ErrorMessage { - get - { + get { return "ERROR: Could not find the declaration segment for vehicle. Category: {0}, AxleConfiguration: {1}, GrossVehicleWeight: {2}"; } @@ -135,12 +134,12 @@ namespace TUGraz.VectoCore.Models.Declaration ? DeclarationData.StandardBodies.Lookup(trailerField) : StandardBodies.Empty; - var semiTrailerField = row.Field<string>("semitrailer"); - var semiTrailer = !string.IsNullOrWhiteSpace(semiTrailerField) - ? DeclarationData.StandardBodies.Lookup(semiTrailerField) - : StandardBodies.Empty; + //var semiTrailerField = row.Field<string>("semitrailer"); + //var semiTrailer = !string.IsNullOrWhiteSpace(semiTrailerField) + // ? DeclarationData.StandardBodies.Lookup(semiTrailerField) + // : StandardBodies.Empty; - trailer += semiTrailer; + //trailer += semiTrailer; // limit gvw to MaxGVW (40t) var gvw = VectoMath.Min(grossVehicleWeight + trailer.GrossVehicleWeight, @@ -171,11 +170,12 @@ namespace TUGraz.VectoCore.Models.Declaration TrailerType = trailerType, TrailerCurbWeight = trailer.CurbWeight, TrailerGrossVehicleWeight = trailer.GrossVehicleWeight, + TrailerWheels = trailer.Wheels, + TrailerAxleWeightShare = GetTrailerAxleWeightDistribution(row, missionType), DeltaCdA = trailer.DeltaCrossWindArea, MinLoad = 0.SI<Kilogram>(), MaxLoad = maxLoad, RefLoad = refLoad, - TrailerAxleWeightDistribution = GetTrailerAxleWeightDistribution(row, missionType), CargoVolume = body.CargoVolume + trailer.CargoVolume, }; missions.Add(mission); @@ -191,15 +191,14 @@ namespace TUGraz.VectoCore.Models.Declaration return !string.IsNullOrWhiteSpace(row.Field<string>("traileraxles" + GetMissionSuffix(missionType))); } - private static double[] GetTrailerAxleWeightDistribution(DataRow row, MissionType missionType) + private static double GetTrailerAxleWeightDistribution(DataRow row, MissionType missionType) { var trailerAxles = - row.Field<string>("traileraxles" + GetMissionSuffix(missionType)).Split('/'); - if (!string.IsNullOrWhiteSpace(trailerAxles[0])) { - var count = int.Parse(trailerAxles[1]); - return (trailerAxles[0].ToDouble() / 100.0 / count).Repeat(count).ToArray(); + row.Field<string>("traileraxles" + GetMissionSuffix(missionType)); + if (!string.IsNullOrWhiteSpace(trailerAxles)) { + return trailerAxles.ToDouble() / 100.0; } - return new double[0]; + return 0; } private static double[] GetAxleWeightDistribution(DataRow row, MissionType missionType) diff --git a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs index 184bf9cb48a971f2b4cbbf6b1e93c56a9199cb84..ae624b047e1d890d2c5705a336c9816e8db60b97 100644 --- a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs +++ b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs @@ -29,6 +29,8 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; +using System.Collections.Generic; using System.Data; using System.Linq; using TUGraz.VectoCommon.Utils; @@ -42,7 +44,7 @@ namespace TUGraz.VectoCore.Models.Declaration public Kilogram GrossVehicleWeight; public SquareMeter DeltaCrossWindArea; public string Name; - public Wheels.Entry Wheels; + public List<Wheels.Entry> Wheels; public CubicMeter CargoVolume; public Kilogram MaxPayLoad @@ -51,7 +53,12 @@ namespace TUGraz.VectoCore.Models.Declaration } public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter deltaCrossWindArea, - Wheels.Entry wheels, CubicMeter volume) + Wheels.Entry wheels, int axleCount, CubicMeter volume) : + this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea, + wheels == null ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels, axleCount).ToList(), volume) {} + + private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter deltaCrossWindArea, + List<Wheels.Entry> wheels, CubicMeter volume) { Name = name; CurbWeight = curbWeight; @@ -61,13 +68,14 @@ namespace TUGraz.VectoCore.Models.Declaration CargoVolume = volume; } - public static StandardBody operator +(StandardBody first, StandardBody second) { + var wheels = new List<Wheels.Entry>(first.Wheels); + wheels.AddRange(second.Wheels); return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight, first.GrossVehicleWeight + second.GrossVehicleWeight, first.DeltaCrossWindArea + second.DeltaCrossWindArea, - null, first.CargoVolume + second.CargoVolume); + wheels, first.CargoVolume + second.CargoVolume); } } @@ -83,7 +91,7 @@ namespace TUGraz.VectoCore.Models.Declaration public sealed class StandardBodies : LookupData<string, StandardBody> { public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(), - 0.SI<SquareMeter>(), null, 0.SI<CubicMeter>()); + 0.SI<SquareMeter>(), null, 0, 0.SI<CubicMeter>()); protected override string ResourceId { @@ -110,6 +118,7 @@ namespace TUGraz.VectoCore.Models.Declaration !string.IsNullOrWhiteSpace(k.Field<string>("wheels")) ? DeclarationData.Wheels.Lookup(k.Field<string>("wheels")) : null, + Int32.Parse(k.Field<string>("axlecount")), k.ParseDouble("cargovolume").SI<CubicMeter>())) .ToDictionary(kv => kv.Name); } diff --git a/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs b/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs index 445158d5d7f742a5672671ed1efd8afa552fc294..4e49f6c4d4909b2cab65c3ea8c003d11f5f7b814 100644 --- a/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs @@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Tests.FileIO AssertHelper.AreRelativeEqual(0.40726954, runData.VehicleData.DynamicTyreRadius); Assert.AreEqual(VehicleClass.Class2, runData.VehicleData.VehicleClass); - Assert.AreEqual(3, runData.VehicleData.AxleData.Count); + Assert.AreEqual(4, runData.VehicleData.AxleData.Count); Assert.AreEqual(6, runData.VehicleData.AxleData[0].Inertia.Value(), Tolerance); Assert.AreEqual(true, runData.DriverData.LookAheadCoasting.Enabled); diff --git a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs index e138525b8b6a9ff7e0539096b41e8f8e442e6b5b..f815af87f54cec7a05ef8d29480ec3801dbcb236 100644 --- a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs +++ b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs @@ -169,6 +169,7 @@ namespace TUGraz.VectoCore.Tests.Integration private static VehicleData CreateVehicleData(Kilogram massExtra, Kilogram loading) { + var wheelsType = "385/65 R 22.5"; var axles = new List<Axle> { new Axle { AxleWeightShare = 0.2, @@ -191,21 +192,21 @@ namespace TUGraz.VectoCore.Tests.Integration TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType).Inertia + Inertia = DeclarationData.Wheels.Lookup(wheelsType).Inertia }, new Axle { AxleWeightShare = 0.55 / 3, TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType).Inertia + Inertia = DeclarationData.Wheels.Lookup(wheelsType).Inertia }, new Axle { AxleWeightShare = 0.55 / 3, TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType).Inertia + Inertia = DeclarationData.Wheels.Lookup(wheelsType).Inertia } }; return new VehicleData { diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs index 8d6791df5f7e2ba257a269ff0875ca0cc9813d13..07af7dae5f07f8496551ca4dc95f12d6786ddaa0 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs @@ -609,19 +609,19 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.225, 0.325 }, - trailerAxleWeightDistribution: new[] { 0.45 }, bodyCurbWeight: 1900, trailerCurbWeight: 3400, + trailerAxleWeightDistribution: 0.45, trailerAxleCount: 1, bodyCurbWeight: 1900, trailerCurbWeight: 3400, trailerType: TrailerType.T1, minLoad: 0, refLoad: 9813.2353, trailerGrossVehicleWeight: 10500, deltaCdA: 0.6, maxLoad: 11250); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 1900, trailerCurbWeight: 0, + trailerAxleWeightDistribution: 0, trailerAxleCount: 0, bodyCurbWeight: 1900, trailerCurbWeight: 0, trailerType: TrailerType.None, minLoad: 0, refLoad: 2984.1176, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 4150); AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.UrbanDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 1900, trailerCurbWeight: 0, + trailerAxleWeightDistribution: 0, trailerAxleCount: 0, bodyCurbWeight: 1900, trailerCurbWeight: 0, trailerType: TrailerType.None, minLoad: 0, refLoad: 2984.1176, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 4150); } @@ -648,13 +648,13 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.4, 0.6 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2000, trailerCurbWeight: 0, + trailerAxleWeightDistribution: 0, trailerAxleCount: 0, bodyCurbWeight: 2000, trailerCurbWeight: 0, trailerType: TrailerType.None, minLoad: 0, refLoad: 3811.7647, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 6150); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.UrbanDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.4, 0.6 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2000, trailerCurbWeight: 0, + trailerAxleWeightDistribution: 0, trailerAxleCount: 0, bodyCurbWeight: 2000, trailerCurbWeight: 0, trailerType: TrailerType.None, minLoad: 0, refLoad: 3811.7647, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 6150); } @@ -684,18 +684,18 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.2, 0.3 }, - trailerAxleWeightDistribution: new[] { 0.25, 0.25 }, bodyCurbWeight: 2100, trailerCurbWeight: 5400, + trailerAxleWeightDistribution: .5, trailerAxleCount: 3, bodyCurbWeight: 2100, trailerCurbWeight: 5400, trailerType: TrailerType.T2, minLoad: 0, refLoad: 14000, trailerGrossVehicleWeight: 18000, deltaCdA: 0.6, maxLoad: 21000); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2100, trailerCurbWeight: 0, + trailerAxleWeightDistribution: 0, trailerAxleCount: 0, bodyCurbWeight: 2100, trailerCurbWeight: 0, trailerType: TrailerType.None, minLoad: 0, refLoad: 4400, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 8400); AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.MunicipalUtility, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2100, trailerCurbWeight: 0, + trailerAxleWeightDistribution: 0, trailerAxleCount: 0, bodyCurbWeight: 2100, trailerCurbWeight: 0, trailerType: TrailerType.None, minLoad: 0, refLoad: 4400, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 8400); } @@ -724,19 +724,19 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.2, 0.25 }, - trailerAxleWeightDistribution: (0.55 / 3).Repeat(3).ToArray(), bodyCurbWeight: 0, trailerCurbWeight: 7500, - trailerType: TrailerType.None, minLoad: 0, refLoad: 19300, trailerGrossVehicleWeight: 24000, deltaCdA: 0, + trailerAxleWeightDistribution: 0.55, trailerAxleCount: 3, bodyCurbWeight: 0, trailerCurbWeight: 7500, + trailerType: TrailerType.ST1, minLoad: 0, refLoad: 19300, trailerGrossVehicleWeight: 24000, deltaCdA: 0, maxLoad: 25000); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.25, 0.25 }, - trailerAxleWeightDistribution: (0.5 / 3).Repeat(3).ToArray(), bodyCurbWeight: 0, trailerCurbWeight: 7500, - trailerType: TrailerType.None, minLoad: 0, refLoad: 12900, trailerGrossVehicleWeight: 24000, deltaCdA: 0, + trailerAxleWeightDistribution: 0.5, trailerAxleCount: 3, bodyCurbWeight: 0, trailerCurbWeight: 7500, + trailerType: TrailerType.ST1, minLoad: 0, refLoad: 12900, trailerGrossVehicleWeight: 24000, deltaCdA: 0, maxLoad: 25000); } public static void AssertMission(Mission m, dynamic vehicleData, MissionType missionType, string cosswindCorrection, - double[] axleWeightDistribution, double[] trailerAxleWeightDistribution, double bodyCurbWeight, + double[] axleWeightDistribution, double trailerAxleWeightDistribution, int trailerAxleCount, double bodyCurbWeight, double trailerCurbWeight, TrailerType trailerType, double minLoad, double refLoad, double maxLoad, double trailerGrossVehicleWeight, double deltaCdA) { @@ -745,9 +745,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration CollectionAssert.AreEqual(axleWeightDistribution, m.AxleWeightDistribution, "Axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", axleWeightDistribution), string.Join(",", m.AxleWeightDistribution)); - CollectionAssert.AreEqual(trailerAxleWeightDistribution, m.TrailerAxleWeightDistribution, + Assert.AreEqual(trailerAxleWeightDistribution, m.TrailerAxleWeightShare, "Trailer axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", trailerAxleWeightDistribution), - string.Join(",", m.TrailerAxleWeightDistribution)); + string.Join(",", m.TrailerAxleWeightShare)); Assert.AreEqual(bodyCurbWeight.SI<Kilogram>(), m.BodyCurbWeight); Assert.AreEqual(trailerCurbWeight.SI<Kilogram>(), m.TrailerCurbWeight); Assert.AreEqual(trailerType, m.TrailerType); @@ -802,7 +802,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var runs = dataReader.NextRun().ToList(); Assert.AreEqual(9, runs.Count); - var withT1 = new[] { 6.0, 6.0, 4.5 }; + var withT1 = new[] { 6.0, 6.0, 4.5, 4.5 }; CollectionAssert.AreEqual(withT1, runs[0].VehicleData.AxleData.Select(a => a.Inertia.Value())); CollectionAssert.AreEqual(withT1, runs[1].VehicleData.AxleData.Select(a => a.Inertia.Value())); CollectionAssert.AreEqual(withT1, runs[2].VehicleData.AxleData.Select(a => a.Inertia.Value()));