diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs index 222f26ef5a2e828a8b9b0150bdef4f268583c0c4..6a2af4a643cf18866833899ee902630f45b2f1ae 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricFullLoadCurveReader.cs @@ -30,13 +30,21 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData data.Columns[2].ColumnName = Fields.GenerationTorque; } - return new ElectricMotorFullLoadCurve( - (from DataRow row in data.Rows + var entries = (from DataRow row in data.Rows select new ElectricMotorFullLoadCurve.FullLoadEntry { MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad(), // / ratio, - FullDriveTorque = -row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count, // * ratio * efficiency, - FullGenerationTorque = -row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count, //* ratio / efficiency - }).ToList()); + FullDriveTorque = + -row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count, // * ratio * efficiency, + FullGenerationTorque = + -row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count, //* ratio / efficiency + }).OrderBy(x => x.MotorSpeed).ToList(); + + var duplicates = entries.GroupBy(x => x.MotorSpeed).Where(g => g.Count() > 1).Select(x => x.Key.AsRPM).ToList(); + if (duplicates.Any()) { + throw new VectoException( + $"EM full-load curve contains multiple entries for a single motor speed: {duplicates.Join()}"); + } + return new ElectricMotorFullLoadCurve(entries); } private static bool HeaderIsValid(DataColumnCollection dataColumns) diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorDragCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorDragCurveReader.cs index 0714cd6cbb899cd1e319951d64013d985ad82994..434444abfacfff5f6ddc2de20fbdaa6993a0ecbe 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorDragCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ElectricMotorDragCurveReader.cs @@ -23,10 +23,18 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData data.Columns[0].ColumnName = Fields.MotorSpeed; data.Columns[1].ColumnName = Fields.DragTorque; } - return new DragCurve(data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { + + var entries = data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad(), // / ratio, DragTorque = -x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() * count, // * ratio / efficiency - }).ToList()); + }).OrderBy(x => x.MotorSpeed).ToList(); + + var duplicates = entries.GroupBy(x => x.MotorSpeed).Where(g => g.Count() > 1).Select(x => x.Key.AsRPM).ToList(); + if (duplicates.Any()) { + throw new VectoException( + $"Drag curve contains multiple entries for a single motor speed: {duplicates.Join()}"); + } + return new DragCurve(entries); } private static bool HeaderIsValid(DataColumnCollection columns) diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCDragCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCDragCurveReader.cs index 06ab1f11507a639579c9e96aeb4d640f717da2fd..1abcc226de27ab11c0a10d78b5fd9ccf92d93808 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCDragCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCDragCurveReader.cs @@ -23,10 +23,17 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData data.Columns[0].ColumnName = Fields.MotorSpeed; data.Columns[1].ColumnName = Fields.DragTorque; } - return new DragCurve(data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { + + var entries = data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad() * ratio, DragTorque = -x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() * count / ratio // / efficiency - }).ToList()); + }).OrderBy(x => x.MotorSpeed).ToList(); + var duplicates = entries.GroupBy(x => x.MotorSpeed).Where(g => g.Count() > 1).Select(x => x.Key.AsRPM / ratio).ToList(); + if (duplicates.Any()) { + throw new VectoException( + $"Drag curve contains multiple entries for a single output speed: {duplicates.Join()}"); + } + return new DragCurve(entries); } private static bool HeaderIsValid(DataColumnCollection columns) diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCFullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCFullLoadCurveReader.cs index 0d89f874d44a2ce98811893ba8ce20bab1a1a322..9316f8ce01a61b79af3666471c8b8db3fcaa7140 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCFullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/IEPCFullLoadCurveReader.cs @@ -30,13 +30,20 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData data.Columns[2].ColumnName = Fields.GenerationTorque; } - return new ElectricMotorFullLoadCurve( - (from DataRow row in data.Rows - select new ElectricMotorFullLoadCurve.FullLoadEntry { - MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad() * ratio, - FullDriveTorque = -row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count / ratio, // * efficiency, - FullGenerationTorque = -row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count / ratio // / efficiency - }).ToList()); + var entries = (from DataRow row in data.Rows + select new ElectricMotorFullLoadCurve.FullLoadEntry { + MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad() * ratio, + FullDriveTorque = + -row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count / ratio, // * efficiency, + FullGenerationTorque = + -row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count / ratio // / efficiency + }).OrderBy(x => x.MotorSpeed).ToList(); + var duplicates = entries.GroupBy(x => x.MotorSpeed).Where(g => g.Count() > 1).Select(x => x.Key.AsRPM / ratio).ToList(); + if (duplicates.Any()) { + throw new VectoException( + $"IEPC full-load curve contains multiple entries for a single output speed: {duplicates.Join()}"); + } + return new ElectricMotorFullLoadCurve(entries); } private static bool HeaderIsValid(DataColumnCollection dataColumns) diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs index c5f337663dc1f98aaba94f925da5d5dd18b29a50..86c3cdaf5de7e4811343e61b776bc7af3c74d9c8 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs @@ -449,7 +449,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa protected override void AngleDriveAllowed(IVehicleDeclarationInputData inputData) { - if (inputData.Components.AngledriveInputData != null) + if (inputData.Components.AngledriveInputData != null && inputData.Components.AngledriveInputData.Type == AngledriveType.SeparateAngledrive) { throw new VectoException("Angledrive not allowed in pure electric vehicles"); } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs index 52db56dd89e8204f6264e309441d0f32cd02e525..150d3e33388e1b1f9b177edba63a08d1013bdc5d 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs @@ -187,7 +187,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa #endregion protected override void AngleDriveAllowed(IVehicleDeclarationInputData inputData) { - if (inputData.Components.AngledriveInputData != null) + if (inputData.Components.AngledriveInputData != null && inputData.Components.AngledriveInputData.Type == AngledriveType.SeparateAngledrive) { throw new VectoException("Angledrive not allowed in pure electric vehicles"); } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs index 19e5661026cafc498de2f125b0545e45971e8f13..65db8368992926b54f960cd7f93604bfa9498633 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs @@ -356,7 +356,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa protected override void AngleDriveAllowed(IVehicleDeclarationInputData inputData) { - if (inputData.Components.AngledriveInputData != null) + if (inputData.Components.AngledriveInputData != null && inputData.Components.AngledriveInputData.Type != AngledriveType.None) { throw new VectoException("Angledrive not allowed in serial hybrid vehicles"); } @@ -694,7 +694,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa protected override void AngleDriveAllowed(IVehicleDeclarationInputData inputData) { - if (inputData.Components.AngledriveInputData != null) + if (inputData.Components.AngledriveInputData != null && inputData.Components.AngledriveInputData.Type != AngledriveType.None) { throw new VectoException("Angledrive not allowed in pure electric vehicles"); } diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs index bc21149a29eda70a440f33b1cde99344bd10fea3..e55e2d6c0c4f376e8fd357b1dcbebbbc03d5df0f 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs @@ -162,9 +162,12 @@ public class PrimaryBusSimulation TestCase(@"FactorMethod/S-HEV/S2-HEV/P31_32_S2_HEV_nonSmartES_elecSP_mechFan.xml", 4, TestName = "2nd Amendment PrimaryBus FM S-HEV S2 nonSmartES_elecSP_mechFan 4"), ] - + // Testcase Stefan Present + [TestCase(@"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\P32_IEPC_Base.xml", -1, TestName = "PrimaryBus IEPC StefanP")] + [TestCase(@"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\P1_HEV_P32_NonOVC_ICE-I_Base.xml", -1, TestName = "PrimaryBus EffFactor StefanP")] public void PrimaryBusSimulationTest(string jobFile, int runIdx) { + TestMissionFilter()?.SetMissions((MissionType.Interurban, LoadingType.ReferenceLoad)); RunSimulationPrimary(jobFile, runIdx); } @@ -192,6 +195,10 @@ public class PrimaryBusSimulation TestName = "2nd Amendment CompletedBus Conventional SmartES_mechFan_mechSteer 32e_spez_Dim_HVAC"), ] + + [TestCase(@"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\P32_IEPC_Base.RSLT_VIF.xml", @"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\IEPC_32c_Base.xml", -1, true, TestName = "CompletedBus IEPC StefanP")] + [TestCase(@"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\P1_HEV_P32_NonOVC_ICE-I_Base.RSLT_VIF.xml", @"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\P1_HEV_32c_NonOVC_ICE-I_Base.xml", -1, true, TestName = "CompletedBus EffFactor StefanP")] + public void CompletedBusSimulationTest(string vifFile, string completed, int runIdx, bool full_sim = false) { if (full_sim) { @@ -249,7 +256,10 @@ public class PrimaryBusSimulation //TestCase(@"PrimaryBus/Exempted/exempted_primary_heavyBus.xml", @"exempted_completedBus_input_full.xml", 0, TestName = "2nd Amendment SingleBus Exempted"), // exempted single run not supported! ] - public void SingleBusSimulationTest(string jobFile, string completed, int runIdx) + + [TestCase(@"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\P32_IEPC_Base.xml", @"E:\QUAM\Downloads\HybridEquivFactor_IEPCAxle\IEPC_32c_Base.xml", -1, TestName = "SingleBus IEPC StefanP")] + + public void SingleBusSimulationTest(string jobFile, string completed, int runIdx) { RunSimulationSingle(jobFile, completed, runIdx); } @@ -394,11 +404,13 @@ public class PrimaryBusSimulation var dataProvider = JSONInputDataFactory.ReadJsonJob(singleJob); var fileWriter = new FileOutputWriter(singleJob); var simFactory = Kernel.Get<ISimulatorFactoryFactory>(); + var sumData = new SummaryDataContainer(fileWriter); - var runsFactory = simFactory.Factory(ExecutionMode.Declaration, dataProvider, fileWriter, null, null); + var runsFactory = simFactory.Factory(ExecutionMode.Declaration, dataProvider, fileWriter, null, null); //runsFactory.WriteModalResults = true; runsFactory.SerializeVectoRunData = true; - var jobContainer = new JobContainer(new SummaryDataContainer(fileWriter)) { }; + runsFactory.SumData = sumData; + var jobContainer = new JobContainer(sumData) { }; if (runIdx < 0) { jobContainer.AddRuns(runsFactory); @@ -486,11 +498,13 @@ public class PrimaryBusSimulation var filePath = Path.Combine(BASE_DIR, jobFile); var dataProvider = _xmlReader.CreateDeclaration(filePath); var fileWriter = new FileOutputWriter(filePath); + var sumData = new SummaryDataContainer(fileWriter); var simFactory = Kernel.Get<ISimulatorFactoryFactory>(); var runsFactory = simFactory.Factory(ExecutionMode.Declaration, dataProvider, fileWriter, null, null); runsFactory.WriteModalResults = true; runsFactory.SerializeVectoRunData = true; - var jobContainer = new JobContainer(new SummaryDataContainer(fileWriter)) { }; + runsFactory.SumData = sumData; + var jobContainer = new JobContainer(sumData) { }; //var jobContainer = new JobContainer(new MockSumWriter()) { }; var runs = runsFactory.SimulationRuns().ToList(); foreach (var vectoRun in runs) {