diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index e5cf42d04eaacf5e539e6b98cd967f89a1bfb294..1b0121772780738a9ae6f91a272785f03ec4ae72 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -314,9 +314,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private SerialHybridStrategyParameterDataAdapter _hybridStrategyParameterData = new SerialHybridStrategyParameterDataAdapter(); - - //protected ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); - + private readonly ElectricPTODataAdapter _ptoDataAdapter = new ElectricPTODataAdapter(); public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode, LoadingType loading, VehicleClass vehicleClass, MissionType missionType) @@ -331,15 +329,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public override PTOData CreatePTOCycleData(IGearboxDeclarationInputData gbx, IPTOTransmissionInputData pto) { - //throw new NotImplementedException(); - return null; + return _ptoDataAdapter.CreateDefaultPTOData(pto, gbx); } public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData, IGearboxDeclarationInputData gbx) { - //throw new NotImplementedException(); - return null; + return _ptoDataAdapter.CreatePTOTransmissionData(ptoData, gbx); } public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData) diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs index 32aeb3d276f3b86bdb8cfa67810555c5210840a1..64a5ce462c59592cb8214ce0930e09da03065688 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs @@ -28,6 +28,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen DrivingCycleDataReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOActivationCycle), CycleType.PTO, "PTO", false), TransmissionPowerDemand = DeclarationData.PTOTransmission.Lookup(DeclarationData.PTO.DefaultPTOTechnology).PowerDemand, + ConsumerType = PTOConsumerType.mechanical, }; } public virtual PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto, IGearboxDeclarationInputData gbx) @@ -39,6 +40,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen TransmissionPowerDemand = powerDemand, TransmissionType = pto.PTOTransmissionType, LossMap = PTOIdleLossMapReader.GetZeroLossMap(), + ConsumerType = PTOConsumerType.mechanical, }; } return null; @@ -66,6 +68,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen DrivingCycleDataReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultE_PTOActivationCycle), CycleType.EPTO, "PTO", false), TransmissionPowerDemand = powerDemand, + ConsumerType = PTOConsumerType.electrical, }; } @@ -84,6 +87,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen TransmissionPowerDemand = powerDemand, TransmissionType = pto.PTOTransmissionType, LossMap = PTOIdleLossMapReader.GetZeroLossMap(), + ConsumerType = PTOConsumerType.electrical, }; } 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 44e253a3679b34da1f3b0b63c837332e83f72a6d..6b129ea8295aa50b60c69c7c2451ee29087a7ceb 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs @@ -49,11 +49,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa { if (vehicle.OvcHev) { yield return CreateVectoRunData(vehicle, mission, loading, modeIdx, VectoRunData.OvcHevMode.ChargeDepleting); - - yield return CreateVectoRunData(vehicle, mission, loading, modeIdx, VectoRunData.OvcHevMode.ChargeSustaining); } else { - yield return CreateVectoRunData(vehicle, mission, loading, modeIdx); + yield return CreateVectoRunData(vehicle, mission, loading, modeIdx, VectoRunData.OvcHevMode.ChargeSustaining); } } } @@ -140,10 +138,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa var ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData); - var municipalPtoTransmissionData = DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData); + var municipalPtoData = DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData); runData.PTO = mission.MissionType == MissionType.MunicipalUtility - ? municipalPtoTransmissionData + ? municipalPtoData : ptoTransmissionData; diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/FollowUpOVCRunCreator.cs b/VectoCore/VectoCore/Models/Simulation/Impl/FollowUpOVCRunCreator.cs index 24788920221378f31ffea97c352741657c1f70be..1608063927fd6b1ce8bb3a8e889cd07933b659c5 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/FollowUpOVCRunCreator.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/FollowUpOVCRunCreator.cs @@ -46,7 +46,7 @@ public class NoFollowUpRunCreator : LoggingObject, IFollowUpRunCreator public bool RunAgain(Action<VectoRunData> runAgainAction, IVectoRun run, Action beforeNextRun) { - throw new NotImplementedException(); + return false; } #endregion @@ -79,6 +79,9 @@ public class NoFollowUpRunCreator : LoggingObject, IFollowUpRunCreator /// <return>true if the run is executed again, false otherwise</return> public bool RunAgain(Action<VectoRunData> runAgainAction, IVectoRun run, Action beforeNextRun) { + if (run.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.ChargeSustaining) { + return false; + } #pragma warning disable IDE0054 // Verbundzuweisung verwenden original_modfile_suffix = original_modfile_suffix ?? (original_modfile_suffix = run.GetContainer().RunData.ModFileSuffix); #pragma warning restore IDE0054 // Verbundzuweisung verwenden diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/IFollowUpRunCreatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/IFollowUpRunCreatorFactory.cs index 3c12d607a00b04f01ad7ee71981d49dc8f0c72fe..70df7f1dd077b2024c87660131514f2ae7dc1b98 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/IFollowUpRunCreatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/IFollowUpRunCreatorFactory.cs @@ -1,4 +1,5 @@ -using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCore.Models.Simulation.Data; namespace TUGraz.VectoCore.Models.Simulation.Impl { @@ -12,7 +13,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public IFollowUpRunCreator CreateFollowUpRunCreator(VectoRunData runData) { - if (runData.VehicleData.InputData.OvcHev) + if (runData.OVCMode == VectoRunData.OvcHevMode.ChargeSustaining && runData.JobType == VectoSimulationJobType.ParallelHybridVehicle) { return new FollowUpOvcRunCreator(); } diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 35679ec60a3564602a118c700ba204cd89a1b534..54d88d4605bee7476b0c0578b41490286e08fbe8 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -413,6 +413,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl /// </summary> private static IVehicleContainer BuildFullPowertrainParallelHybrid(VectoRunData data, IModalDataContainer modData, ISumData _sumWriter) { + if (data.SavedInDeclarationMode) { + throw new NotImplementedException(); + } if (_sumWriter == null) throw new ArgumentNullException(nameof(_sumWriter)); if (data.Cycle.CycleType != CycleType.DistanceBased) { @@ -661,7 +664,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl IEPTO epto = null; if (data.PTO?.PTOCycle != null) { - var pevPTOController = GetPEVIdleController(data.PTO, container); + var pevPTOController = GetPEV_SHEVIdleController(data.PTO, container); cycle.IdleController = pevPTOController; var eptoAux = new EPTO(pevPTOController); elAux.AddAuxiliary(eptoAux); @@ -807,7 +810,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl IEPTO epto = null; if (data.PTO?.PTOCycle != null) { - var pevPTOController = GetPEVIdleController(data.PTO, container); + var pevPTOController = GetPEV_SHEVIdleController(data.PTO, container); cycle.IdleController = pevPTOController; var eptoAux = new EPTO(pevPTOController); elAux.AddAuxiliary(eptoAux); @@ -1492,7 +1495,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ? engine.IdleController : new IdleControllerSwitcher(engine.IdleController, new PTOCycleController(container, pto.PTOCycle)); - private static IIdleControllerSwitcher GetPEVIdleController(PTOData pto, + private static IIdleControllerSwitcher GetPEV_SHEVIdleController(PTOData pto, IVehicleContainer container) => pto?.PTOCycle is null ? null : new EPTOCycleController(container, pto?.PTOCycle); diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index bf9811d66a72f9427f199ea951043490e8b1c917..90a67eae7f44f68ac4d55503ec08c011774cfb20 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -53,6 +53,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl { public class VehicleContainer : LoggingObject, IVehicleContainer, IPowertainInfo { + private List<Tuple<int, VectoSimulationComponent>> _components = new List<Tuple<int, VectoSimulationComponent>>(); @@ -111,7 +112,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ExecutionMode = executionMode; } - #region IVehicleContainer +#region IVehicleContainer public virtual IModalDataContainer ModalData => ModData; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/PTOData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/PTOData.cs index 9a8e832206fb856ad778e4d3428290e653566362..ef11bd54b7d75fa88ce22df84a1668d5cb90d655 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/PTOData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/PTOData.cs @@ -33,7 +33,7 @@ using TUGraz.VectoCommon.Utils; namespace TUGraz.VectoCore.Models.SimulationComponent.Data { - enum PTOConsumerType + public enum PTOConsumerType { mechanical, electrical @@ -53,5 +53,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public ILossMap LossMap; public DrivingCycleData PTOCycle; + public PTOConsumerType ConsumerType = PTOConsumerType.mechanical; } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs index 4ad1c9a5afc100cb43e297ce2984a56ebd893f78..c35467baaf1a64ffbda36b7bab040ff813dab166 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs @@ -57,7 +57,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public EngineAuxiliary(IVehicleContainer container) : base(container) { EngineStopStartUtilityFactor = 1; // container.RunData?.DriverData?.EngineStopStart?.UtilityFactorStandstill ?? double.NaN; - _writePTO = container.RunData?.PTO != null; + _writePTO = container.RunData?.PTO?.ConsumerType == PTOConsumerType.mechanical; } public IAuxPort Port() diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs index 96cb0be755c666e394cea10da2a1a6f6432d1eac..71b9e347951f84ee09f6a755dccb4c18306381f8 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs @@ -5,12 +5,16 @@ using System.Collections.Immutable; using System.IO; using System.Linq; -using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Ninject; using NUnit.Framework; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.FileIO.XML; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory; using TUGraz.VectoCore.OutputData; @@ -27,6 +31,10 @@ public class HeavyLorrySimulation private const string BASE_DIR = @"TestData\Integration\DeclarationMode\V24_DeclarationMode\"; + + + private const string HeavylorryGroup2HevS2XML = @"HeavyLorry\Group2_HEV_S2.xml"; + private const string HeavylorryGroup2HevS4XML = @"HeavyLorry\Group2_HEV_S4.xml"; private StandardKernel _kernel; private IXMLInputDataReader _xmlReader; @@ -44,7 +52,8 @@ public class HeavyLorrySimulation TestCase(@"HeavyLorry\PEV_heavyLorry_E3_realistic_municipal.xml"), TestCase(@"HeavyLorry\PEV_heavyLorry_AMT_E2_pto_transm.xml"), TestCase(@"HeavyLorry\PEV_heavyLorry_E4.xml"), - TestCase(@"HeavyLorry\Group2_HEV_S2.xml"), + TestCase(HeavylorryGroup2HevS2XML), + TestCase(HeavylorryGroup2HevS4XML), TestCase(@"HeavyLorry\Group5_HEV_P2_.xml"), TestCase(@"HeavyLorry\Group5_HEV_P3_ovc.xml")] [TestCase(@"HeavyLorry\HEV_heavy_lorry_S4_ovc.xml")] @@ -60,12 +69,9 @@ public class HeavyLorrySimulation public void RunSimulation(string jobFile, bool multiThreaded = true) { var filePath = Path.Combine(BASE_DIR, jobFile); - var dataProvider = _xmlReader.CreateDeclaration(filePath); - var fileWriter = new FileOutputWriter(filePath); - var runsFactory = SimulatorFactory.CreateSimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter); + var runsFactory = GetSimulatorFactory(filePath, out var dataProvider, out var fileWriter, out var summaryDataContainer); runsFactory.WriteModalResults = true; - var jobContainer = new JobContainer(new MockSumWriter()){}; - //var jobContainer = new JobContainer(new MockSumWriter()) { }; + var jobContainer = new JobContainer(summaryDataContainer){}; jobContainer.AddRuns(runsFactory); PrintRuns(jobContainer, null); @@ -81,7 +87,58 @@ public class HeavyLorrySimulation PrintFiles(fileWriter); } + private ISimulatorFactory GetSimulatorFactory(string filePath, out IDeclarationInputDataProvider dataProvider, + out FileOutputWriter fileWriter, out SummaryDataContainer sumWriter) + { + dataProvider = _xmlReader.CreateDeclaration(filePath); + fileWriter = new FileOutputWriter(filePath); + + var runsFactory = SimulatorFactory.CreateSimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter); + sumWriter = new MockSumWriter(); + runsFactory.SumData = sumWriter; + return runsFactory; + } + + + [Test] + public void HEVS4() + { + var simFactory = GetSimulatorFactory(Path.Combine(BASE_DIR, HeavylorryGroup2HevS4XML), out var dataProvider, + out var fileWriter, out var mockSumWriter); + + var runs = simFactory.SimulationRuns(); + foreach (var vectoRun in runs) { + var rd = vectoRun.GetContainer().RunData; + } + var container = runs.First().GetContainer(); + var runData = container.RunData; + + + + //Pneumatic system data test + + + + var ps = runData.Aux.Where(x => x.ID == Constants.Auxiliaries.IDs.PneumaticSystem).Single(); + Assume.That(ps.IsFullyElectric); + + + //Fully electric aux have a seperate electric power table + //Assume.That(ps.PowerDemandMech != ps.PowerDemandElectric * DeclarationData.AlternatorEfficiency); + + Assert.That(ps.ConnectToREESS); + + + + + } + + + + + [TestCase(@"HeavyLorry\HEV_heavy_lorry_S4_ovc.xml", 12)] + [TestCase(HeavylorryGroup2HevS2XML, 6)] [TestCase(@"HeavyLorry\Group5_HEV_P3_ovc.xml", 20)] public void OVCHevSimulationSingleRun(string jobFile, int nrRuns) { @@ -95,6 +152,8 @@ public class HeavyLorrySimulation runsFactory.SumData = sumWriter; var runs = runsFactory.SimulationRuns().ToList(); Assert.AreEqual(nrRuns, runs.Count); + + jobContainer.AddRun(runs.First(r => r.GetContainer().RunData.BatteryData.Batteries.Any(tuple => !tuple.Item2.ChargeSustainingBattery))); Assert.AreEqual(1, jobContainer.Runs.Count); jobContainer.Execute(false); @@ -105,6 +164,8 @@ public class HeavyLorrySimulation Assert.IsTrue(jobContainer.Runs.TrueForAll(runEntry => runEntry.Success)); PrintRuns(jobContainer, fileWriter); PrintFiles(fileWriter); + + } diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/AuxiliaryDataAdapterTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/AuxiliaryDataAdapterTest.cs index 9af6230e982c62df1694d681f8bcca58399db29b..f2a7641ba294ecdd886c915c7852708f1cc3946e 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/AuxiliaryDataAdapterTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/AuxiliaryDataAdapterTest.cs @@ -34,9 +34,7 @@ public class AuxiliaryDataAdapterTest Assert.That(ps.ConnectToREESS == fullyElectric); Assert.That(ps.IsFullyElectric == fullyElectric); - - - } + } [TestCase("Small + AMS", "", true, 0.0f, true, TestName = "PEV Fail 2")] [TestCase("Small + ESS", "", true, 0.0f, true, TestName = "PEV Fail 3")]