diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 07a8260d7c5428089abbe57312462f173907e79c..25a0c00bb53ba2a31204cb5eb3ced7b8dfd8d938 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -379,7 +379,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode) { - return _hybridStrategyDataAdapter.CreateHybridStrategyParameters(runDataBatteryData, runDataSuperCapData); + return _hybridStrategyDataAdapter.CreateHybridStrategyParameters(runDataBatteryData, runDataSuperCapData, ovcMode); } #endregion diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs index 1c0b18f08629a4bd8534d96d2bb60c537cee724f..e0925f8116eb024e9dc0612772e354fb437b2723 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using NLog.Targets; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; @@ -17,7 +18,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen public class ParallelHybridStrategyParameterDataAdapter : HybridStrategyDataAdapter { - public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, SuperCapData superCap) + public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, + SuperCapData superCap, VectoRunData.OvcHevMode ovcMode) { if (batterySystemData == null && superCap == null) { return null; @@ -39,13 +41,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen superCap.MaxVoltage.Value(); } - //TODO Move to DeclarationData.Hybridstrategy.Parallel + + + //var equivalenceFactor = DeclarationData.HevStrategyParameters. + result.AuxReserveTime = 0.SI<Second>(); result.AuxReserveChargeTime = 0.SI<Second>(); result.MinICEOnTime = 10.SI<Second>(); result.ICEStartPenaltyFactor = 0.1; result.CostFactorSOCExponent = 1; + + return result; diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 0f24809961fc59e5c507f50e86cfcdd1b1e93371..f5cfc1572816563c11293ace7e1adb22016aab8b 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -93,6 +93,9 @@ namespace TUGraz.VectoCore.Models.Declaration public static readonly PTOTransmission PTOTransmission = new PTOTransmission(); + public static readonly HEVStrategyParameters InitEquivalenceFactors = new HEVStrategyParametersLorry(); + //public static readonly HEVStrategyParameters InitEquivalenceFactorsBus = new HEVStrategyParametersBus(); + public static readonly double ElectricMachineDefaultMechanicalTransmissionEfficiency = 1; //public static MeterPerSecond CycleSpeedLimit; public const double LossMapExtrapolationFactor = 6; diff --git a/VectoCore/VectoCore/Models/Declaration/InitEquivalenceFactors.cs b/VectoCore/VectoCore/Models/Declaration/InitEquivalenceFactors.cs new file mode 100644 index 0000000000000000000000000000000000000000..ab6574630cfc39a5bf1feb01d095c4bc08d20d8e --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/InitEquivalenceFactors.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using Ninject.Infrastructure.Language; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider.v24; +using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.CIFWriter; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class HEVStrategyParametersLorry : HEVStrategyParameters + { + public HEVStrategyParametersLorry() : base("Lorry") { } + } + + public class HEVStrategyParametersBus : HEVStrategyParameters + { + public HEVStrategyParametersBus() : base("Bus") { } + } + + public abstract class HEVStrategyParameters + { + + private Dictionary<int, InitEquivalenceFactors> _initEquivalenceFactors = + new Dictionary<int, InitEquivalenceFactors>(3); + + private IList<int> socRanges = new List<int>{ 10, 20, 40 }; + + protected HEVStrategyParameters(string vehicle) + { + + foreach(var range in socRanges) + { + _initEquivalenceFactors.Add(range, new InitEquivalenceFactors(range, vehicle)); + } + } + + /// <summary> + /// Looks up the initial equivalence factor. + /// </summary> + /// <param name="mission"></param> + /// <param name="hdvClass"></param> + /// <param name="loading"></param> + /// <param name="socRange">If the SOC range of the vehicle to be simulated differs from the given SOC ranges, use the values from the given SCOC ranges that are closest to the SOC range of the vehicle </param> + /// <returns></returns> + public double LookupEquivalenceFactor(MissionType mission, VehicleClass hdvClass, LoadingType loading, + double socRange) + { + var range = socRanges.MinBy((i => Math.Abs(socRange - i))); + return _initEquivalenceFactors[range].LookupEquivalenceFactor(mission, hdvClass, loading); + } + + private sealed class InitEquivalenceFactors : LookupData<string, InitEquivalenceFactors.Entry> + { + private string ResourceIdFormatString = DeclarationData.DeclarationDataResourcePrefix + ".HEVParameters.{1}.HEV_Strategy_Parameters_fequiv_{0}soc.csv"; + private string _resourceId; + protected override string ResourceId => _resourceId; // todo rename csv file... + + + /// <summary> + /// + /// </summary> + /// <param name="socRange">"20, 40, 10"</param> + /// <param name="vehicleType">"Lorry" or "Bus"</param> + public InitEquivalenceFactors(int socRange, string vehicleType) : base() + { + _resourceId = string.Format(ResourceIdFormatString, socRange, vehicleType); + ReadData(); //call again here because the base constructor doesn't consider the updated ResourceId + } + public double LookupEquivalenceFactor(MissionType mission, VehicleClass hdvClass, LoadingType loading) + { + var entry = Lookup(hdvClass.GetClassNumber()).cycleDict[mission]; + + switch (loading) + { + case LoadingType.LowLoading: + return entry.Item1; + case LoadingType.ReferenceLoad: + return entry.Item2; + default: + throw new ArgumentOutOfRangeException(nameof(loading), loading, null); + } + } + + public override Entry Lookup(string key) + { + return base.Lookup(key.RemoveWhitespace()); + } + + protected override void ParseData(DataTable table) + { + var vehicleClasses = table.Rows.Cast<DataRow>().Select(row => row.Field<string>("vehiclegroup")); + + + var cycleEntries = table.Rows.Cast<DataRow>().Select(row => new CycleEntry + { + VehicleGroup = row.Field<string>("vehiclegroup").RemoveWhitespace(), + LongHaul = SplitStringToDoubleTuple(row.Field<string>("longhaul")), + RegionalDelivery = SplitStringToDoubleTuple(row.Field<string>("regionaldelivery")), + UrbanDelivery = SplitStringToDoubleTuple(row.Field<string>("urbandelivery")), + MunicipalUtility = SplitStringToDoubleTuple(row.Field<string>("municipalutility")), + Construction = SplitStringToDoubleTuple(row.Field<string>("construction")) + }); + + + foreach (var cycleEntry in cycleEntries) + { + foreach (string vehClass in cycleEntry.VehicleGroup.Split('/')) + { + var newEntry = new Entry + { + VehicleGroup = vehClass, + cycleDict = new Dictionary<MissionType, Tuple<double, double>>() + }; + + newEntry.cycleDict.Add(MissionType.LongHaul, cycleEntry.LongHaul); + newEntry.cycleDict.Add(MissionType.RegionalDelivery, cycleEntry.RegionalDelivery); + newEntry.cycleDict.Add(MissionType.UrbanDelivery, cycleEntry.UrbanDelivery); + newEntry.cycleDict.Add(MissionType.MunicipalUtility, cycleEntry.MunicipalUtility); + newEntry.cycleDict.Add(MissionType.Construction, cycleEntry.Construction); + + Data.Add(newEntry.VehicleGroup, newEntry); + } + } + } + + public struct CycleEntry + { + public string VehicleGroup; + public Tuple<double, double> LongHaul; + public Tuple<double, double> RegionalDelivery; + public Tuple<double, double> UrbanDelivery; + public Tuple<double, double> MunicipalUtility; + public Tuple<double, double> Construction; + + } + + public struct Entry + { + public string VehicleGroup; + public Dictionary<MissionType, Tuple<double, double>> cycleDict; + } + + + private Tuple<double, double> SplitStringToDoubleTuple(string input) + { + var arr = input.Split('/'); + return input.IsNullOrEmpty() ? Tuple.Create(0.0, 0.0) : Tuple.Create(Convert.ToDouble(arr[0]), Convert.ToDouble(arr[1])); + } + } + } + +} + + + + + + diff --git a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_10soc.csv b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_10soc.csv new file mode 100644 index 0000000000000000000000000000000000000000..5340fb6daad117de8547e75ed4eca8e5a6ae1285 --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_10soc.csv @@ -0,0 +1,15 @@ +vehiclegroup , longhaul , regionaldelivery , urbandelivery , municipalutility , construction +53 , , 2.6/2.3 , 2.7/2.3 , , +54 , , 2.6/2.3 , 2.7/2.3 , , +1s , , 2.6/2.3 , 2.7/2.3 , , +1 , , 2.6/2.3 , 2.7/2.3 , , +2 , 0.1/0.1 , 2.6/2.3 , 2.7/2.3 , , +3 , , 2.6/2.3 , 2.7/2.3 , , +4 , 1.4/1.3 , 2.2/2.6 , 1.9/2.3 , 2.1/2.1 , 2.1/2.1 +5 , 1.4/1.3 , 2.2/2.6 , 1.9/2.3 , , 2.1/2.1 +9 , 1.4/1.3 , 2.2/2.6 , , 2.1/2.1 , 2.1/2.1 +10 , 1.4/1.3 , 2.2/2.6 , , , 2.1/2.1 +11 , 1.4/1.3 , 2.2/2.6 , , 2.1/2.1 , 2.1/2.1 +12 , 1.4/1.3 , 2.2/2.6 , , , 2.1/2.1 +16 , , , , , 2.1/2.1 + diff --git a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_20soc.csv b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_20soc.csv new file mode 100644 index 0000000000000000000000000000000000000000..96dbaeb5869e88f54958a7f789039cbd34874fc2 --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_20soc.csv @@ -0,0 +1,14 @@ +vehiclegroup ,longhaul ,regionaldelivery ,urbandelivery ,municipalutility ,construction +53 , ,2.8/2.5 ,2.7/2.6 , , +54 , ,2.8/2.5 ,2.7/2.6 , , +1s , ,2.8/2.5 ,2.7/2.6 , , +1 , ,2.8/2.5 ,2.7/2.6 , , +2 ,1.9/2.4 ,2.8/2.5 ,2.7/2.6 , , +3 , ,2.8/2.5 ,2.7/2.6 , , +4 ,1.8/1.6 ,2.4/2.7 ,2.1/2.5 ,2.1/2.1 ,2.1/2.1 +5 ,1.8/1.6 ,2.4/2.7 ,2.1/2.5 , ,2.1/2.1 +9 ,1.8/1.6 ,2.4/2.7 , ,2.1/2.1 ,2.1/2.1 +10 ,1.8/1.6 ,2.4/2.7 , , ,2.1/2.1 +11 ,1.8/1.6 ,2.4/2.7 , ,2.1/2.1 ,2.1/2.1 +12 ,1.8/1.6 ,2.4/2.7 , , ,2.1/2.1 +16 , , , , ,2.1/2.1 diff --git a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_40soc.csv b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_40soc.csv new file mode 100644 index 0000000000000000000000000000000000000000..aa52ea9aaf5a6c26df3cdeea2ddec22514fc2c2a --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Bus/HEV_Strategy_Parameters_fequiv_40soc.csv @@ -0,0 +1,14 @@ +vehiclegroup , longhaul , regionaldelivery , urbandelivery , municipalutility , construction +53 , , 2.8/2.6 , 2.8/2.7 , , +54 , , 2.8/2.6 , 2.8/2.7 , , +1s , , 2.8/2.6 , 2.8/2.7 , , +1 , , 2.8/2.6 , 2.8/2.7 , , +2 , 2/2.2 , 2.8/2.6 , 2.8/2.7 , , +3 , , 2.8/2.6 , 2.8/2.7 , , +4 , 2/1.8 , 2.4/2.8 , 2.1/2.5 , 2.1/2.1 , 2.1/2.1 +5 , 2/1.8 , 2.4/2.8 , 2.1/2.5 , , 2.1/2.1 +9 , 2/1.8 , 2.4/2.8 , , 2.1/2.1 , 2.1/2.1 +10 , 2/1.8 , 2.4/2.8 , , , 2.1/2.1 +11 , 2/1.8 , 2.4/2.8 , , 2.1/2.1 , 2.1/2.1 +12 , 2/1.8 , 2.4/2.8 , , , 2.1/2.1 +16 , , , , , 2.1/2.1 diff --git a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_10soc.csv b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_10soc.csv index f1453c0e9f79e11873096583594416e6f7bb925b..5340fb6daad117de8547e75ed4eca8e5a6ae1285 100644 --- a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_10soc.csv +++ b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_10soc.csv @@ -1,4 +1,4 @@ -.vehiclegroup , longhaul , regionaldelivery , urbandelivery , municipalutility , construction +vehiclegroup , longhaul , regionaldelivery , urbandelivery , municipalutility , construction 53 , , 2.6/2.3 , 2.7/2.3 , , 54 , , 2.6/2.3 , 2.7/2.3 , , 1s , , 2.6/2.3 , 2.7/2.3 , , diff --git a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_20soc.csv b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_20soc.csv index 49f4079da5113b3edfe8cc0d54b12157018cc3cf..96dbaeb5869e88f54958a7f789039cbd34874fc2 100644 --- a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_20soc.csv +++ b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_20soc.csv @@ -1,4 +1,4 @@ -.vehiclegroup ,longhaul ,regionaldelivery ,urbandelivery ,municipalutility ,construction +vehiclegroup ,longhaul ,regionaldelivery ,urbandelivery ,municipalutility ,construction 53 , ,2.8/2.5 ,2.7/2.6 , , 54 , ,2.8/2.5 ,2.7/2.6 , , 1s , ,2.8/2.5 ,2.7/2.6 , , diff --git a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_40soc.csv b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_40soc.csv index 8bc39e2ab8400790cdd01209adad0f25cdf56d87..aa52ea9aaf5a6c26df3cdeea2ddec22514fc2c2a 100644 --- a/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_40soc.csv +++ b/VectoCore/VectoCore/Resources/Declaration/HEVParameters/Lorry/HEV_Strategy_Parameters_fequiv_40soc.csv @@ -1,4 +1,4 @@ -.vehiclegroup , longhaul , regionaldelivery , urbandelivery , municipalutility , construction +vehiclegroup , longhaul , regionaldelivery , urbandelivery , municipalutility , construction 53 , , 2.8/2.6 , 2.8/2.7 , , 54 , , 2.8/2.6 , 2.8/2.7 , , 1s , , 2.8/2.6 , 2.8/2.7 , , diff --git a/VectoCore/VectoCoreTest/Models/Declaration/HevStrategyParametersTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/HevStrategyParametersTest.cs index 8120573d5992ec1c70a343a82d15338e4e5eca54..727e20bd75596e8f05a5ab1aa4bb670bf1cc9c26 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/HevStrategyParametersTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/HevStrategyParametersTest.cs @@ -23,29 +23,54 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration } private const string HevStrategyParamFile = @"TestData\Cycles\HEV_Strategy_Parameters_fequiv_40soc_Lorries.csv"; [TestCase] - public void TestHevStrategyParametersInput() + public void TestHevStrategyParametersInputLorry() { - var lookup = new HEVStrategyParameters(); - Assert.IsTrue(lookup.Entries.Count > 0); + Assert.DoesNotThrow(() => new HEVStrategyParametersLorry()); + } - [TestCase] - public void TestHevStrategyLookup() + public void TestHevStrategyParametersInputBus() { - LookupAndAssert(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 2.0); + Assert.DoesNotThrow(() => new HEVStrategyParametersBus()); + + } + + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 2.00, 40)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 2.20, 40)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 1.9, 20)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 2.40, 20)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 0.10, 10)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 0.10, 10)] + - LookupAndAssert(MissionType.UrbanDelivery, VehicleClass.Class4, LoadingType.ReferenceLoad, 2.50); - LookupAndAssert(MissionType.UrbanDelivery, VehicleClass.Class4, LoadingType.LowLoading, 2.10); + //Lookup in nearest table + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 2.00, 90)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 2.20, 90)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 1.9, 21)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 2.40, 21)] - LookupAndAssert(MissionType.LongHaul, VehicleClass.Class3, LoadingType.LowLoading, 0); + //Currently looks up in the soc 20 csv, change if needed and remove the other testcase + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 2.00, 30)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 2.20, 30)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 1.9, 30)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 2.40, 30)] + + + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.LowLoading, 0.10, 10)] + [TestCase(MissionType.LongHaul, VehicleClass.Class2, LoadingType.ReferenceLoad, 0.10, 10)] + + + public void TestHevStrategyLookup(MissionType missionType, VehicleClass vehicleClass, LoadingType loadingType, double expected, int socRange) + { + LookupAndAssert(missionType, vehicleClass, loadingType, expected,socRange); } - private void LookupAndAssert(MissionType mission, VehicleClass hdvClass, LoadingType loading, double expected) + private void LookupAndAssert(MissionType mission, VehicleClass hdvClass, LoadingType loading, double expected, int socRange) { - var feq = DeclarationData.HevStrategyParameters.LookupEquivalenceFactor(mission, hdvClass, - loading); + var feq = DeclarationData.InitEquivalenceFactors.LookupEquivalenceFactor(mission, hdvClass, + loading, socRange); Assert.IsTrue(feq.IsEqual(expected)); }