From 9aa5fd71b2831ac0fec23c8b4853ed7da6137085 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <quaritsch@ivt.tugraz.at> Date: Thu, 9 Mar 2023 16:06:09 +0100 Subject: [PATCH] copy code from 'old' rundata factories into mockup rundata factories to avoid the 'new' architecture-dependent rundata creation (too complex in the mockup) --- .../CompletedBusRunDataFactory.cs | 108 ++++++++++++++++++ .../MockupLorryVectoRunDataFactory.cs | 75 ++++++++++-- .../PrimaryBusMockupRunDataFactory.cs | 88 ++++++++++++-- .../Models/Declaration/DeclarationData.cs | 1 + 4 files changed, 256 insertions(+), 16 deletions(-) diff --git a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs index e48b0d75a9..c45182cb41 100644 --- a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -47,6 +48,66 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories // return base.VectoRunDataHeavyBusCompleted(); //} + protected override IEnumerable<VectoRunData> GetNextRun() + { + var InputDataProvider = DataProvider.MultistageJobInputData; + if (InputDataProvider.JobInputData.PrimaryVehicle.Vehicle.ExemptedVehicle) { + return new[] { GetExemptedVectoRunData() }; + } + return VectoRunDataHeavyBusCompleted(); + } + + protected virtual VectoRunData GetExemptedVectoRunData() + { + var InputDataProvider = DataProvider.MultistageJobInputData; + return new VectoRunData() { + Exempted = true, + VehicleData = new VehicleData() { + ModelName = CompletedVehicle.Model, + Manufacturer = CompletedVehicle.Manufacturer, + ManufacturerAddress = CompletedVehicle.ManufacturerAddress, + VIN = CompletedVehicle.VIN, + LegislativeClass = CompletedVehicle.LegislativeClass, + RegisteredClass = CompletedVehicle.RegisteredClass, + VehicleCode = CompletedVehicle.VehicleCode, + CurbMass = CompletedVehicle.CurbMassChassis, + GrossVehicleMass = CompletedVehicle.GrossVehicleMassRating, + ZeroEmissionVehicle = PrimaryVehicle.ZeroEmissionVehicle, + MaxNetPower1 = PrimaryVehicle.MaxNetPower1, + InputData = CompletedVehicle + }, + Report = Report, + Mission = new Mission() { + MissionType = MissionType.ExemptedMission + }, + InputData = InputDataProvider + }; + } + + protected virtual IEnumerable<VectoRunData> VectoRunDataHeavyBusCompleted() + { + var InputDataProvider = DataProvider.MultistageJobInputData; + if (InputDataProvider.JobInputData.PrimaryVehicle.Vehicle.VehicleType == + VectoSimulationJobType.BatteryElectricVehicle) { + foreach (var vectoRunData in CreateVectoRunDataForMissions(0, "")) + yield return vectoRunData; + } else { + var engineModes = InputDataProvider.JobInputData.PrimaryVehicle.Vehicle.Components.EngineInputData + ?.EngineModes; + + for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) { + var fuelMode = "single fuel mode"; + if (engineModes[modeIdx].Fuels.Count > 1) { + fuelMode = "dual fuel mode"; + } + + foreach (var vectoRunData in CreateVectoRunDataForMissions(modeIdx, fuelMode)) + yield return vectoRunData; + } + } + } + + protected override VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int modeIdx) { var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); @@ -106,6 +167,53 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories //return base.CreateVectoRunDataSpecific(mission, loading, modeIdx); } + private IEnumerable<VectoRunData> CreateVectoRunDataForMissions(int modeIdx, string fuelMode) + { + var InputDataProvider = DataProvider.MultistageJobInputData; + foreach (var mission in _segmentCompletedBus.Missions) { + foreach (var loading in mission.Loadings) { + var simulationRunData = CreateVectoRunDataSpecific(mission, loading, modeIdx); + if (simulationRunData != null) { + yield return simulationRunData; + } + + var primarySegment = GetPrimarySegment(PrimaryVehicle); + var primaryMission = primarySegment.Missions.Where( + m => { + return m.BusParameter.DoubleDecker == + CompletedVehicle.VehicleCode.IsDoubleDeckerBus() && + m.MissionType == mission.MissionType && + m.BusParameter.FloorType == CompletedVehicle.VehicleCode.GetFloorType(); + }).First(); + simulationRunData = CreateVectoRunDataGeneric( + primaryMission, + new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>(loading.Key, + primaryMission.Loadings[loading.Key]), + primarySegment, modeIdx); + + var primaryResult = InputDataProvider.JobInputData.PrimaryVehicle.GetResult( + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + if (primaryResult == null || !primaryResult.ResultStatus.Equals("success")) { + throw new VectoException( + "Failed to find results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3}. Make sure PIF and completed vehicle data match!", + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + } + + if (primaryResult.ResultStatus != "success") { + throw new VectoException( + "Simulation results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3} not finished successfully.", + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + } + + simulationRunData.PrimaryResult = primaryResult; + + yield return simulationRunData; + } + } + } protected override VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int modeIdx) { var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); diff --git a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs index 2e5ee9ccd7..7ed4d67fad 100644 --- a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/MockupLorryVectoRunDataFactory.cs @@ -32,10 +32,16 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories //protected override IDeclarationDataAdapter DataAdapter { get; } protected override IEnumerable<VectoRunData> GetNextRun() { - var nextRun = base.GetNextRun(); - + if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle) { + yield return CreateVectoRunData(InputDataProvider.JobInputData.Vehicle, 0, null, new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>()); + } else { + foreach (var vectoRunData in VectoRunDataTruckNonExempted()) { + yield return vectoRunData; + } + } - return nextRun; + // var nextRun = base.GetNextRun(); + //return nextRun; } protected override void InitializeReport() @@ -61,6 +67,61 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories Report.InitializeReport(powertrainConfig); } + private IEnumerable<VectoRunData> VectoRunDataTruckNonExempted() + { + switch (InputDataProvider.JobInputData.JobType) { + case VectoSimulationJobType.ConventionalVehicle: + case VectoSimulationJobType.ParallelHybridVehicle: + case VectoSimulationJobType.SerialHybridVehicle: + case VectoSimulationJobType.IEPC_S: + case VectoSimulationJobType.IHPC: + return VectoRunDataConventionalTruckNonExempted(); + case VectoSimulationJobType.BatteryElectricVehicle: + case VectoSimulationJobType.IEPC_E: + return VectoRunDataBatteryElectricVehicle(); + case VectoSimulationJobType.EngineOnlySimulation: + break; + default: + throw new ArgumentOutOfRangeException(); + } + return VectoRunDataConventionalTruckNonExempted(); + + } + + private IEnumerable<VectoRunData> VectoRunDataBatteryElectricVehicle() + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + foreach (var mission in _segment.Missions) { + foreach (var loading in mission.Loadings) { + var simulationRunData = CreateVectoRunData(vehicle, 0, mission, loading); + yield return simulationRunData; + } + + } + } + + private IEnumerable<VectoRunData> VectoRunDataConventionalTruckNonExempted() + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + + var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData; + var engineModes = engine.EngineModes; + + for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) { + foreach (var mission in _segment.Missions) { + if (mission.MissionType.IsEMS() && + engine.RatedPowerDeclared.IsSmaller(DeclarationData.MinEnginePowerForEMS)) { + continue; + } + + foreach (var loading in mission.Loadings) { + var simulationRunData = CreateVectoRunData(vehicle, modeIdx, mission, loading); + yield return simulationRunData; + } + } + } + } + protected virtual VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) { @@ -115,11 +176,11 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories - //protected override void Initialize() - //{ - // _segment = GetSegment(InputDataProvider.JobInputData.Vehicle); + protected override void Initialize() + { + _segment = GetSegment(InputDataProvider.JobInputData.Vehicle); - //} + } #endregion diff --git a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs index e92d7347c7..ca96eb3116 100644 --- a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs +++ b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/PrimaryBusMockupRunDataFactory.cs @@ -30,6 +30,75 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories #region Overrides of AbstractDeclarationVectoRunDataFactory + protected override IEnumerable<VectoRunData> GetNextRun() + { + if (InputDataProvider.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle) { + if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle) { + yield return CreateVectoRunData(InputDataProvider.JobInputData.Vehicle, null, + new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>(), 0); + } else { + foreach (var vectoRunData in VectoRunDataHeavyBusPrimary()) { + yield return vectoRunData; + } + } + } + + foreach (var entry in new List<VectoRunData>()) { + yield return entry; + } + } + + private IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() + { + switch (InputDataProvider.JobInputData.JobType) { + case VectoSimulationJobType.ConventionalVehicle: + case VectoSimulationJobType.ParallelHybridVehicle: + case VectoSimulationJobType.SerialHybridVehicle: + return VectoRunDataConventionalHeavyBusPrimaryNonExempted(); + case VectoSimulationJobType.BatteryElectricVehicle: + return VectoRunDataBatteryElectricHeavyBusPrimaryNonExempted(); + case VectoSimulationJobType.EngineOnlySimulation: + break; + default: + throw new ArgumentOutOfRangeException(); + } + return VectoRunDataConventionalHeavyBusPrimaryNonExempted(); + } + + private IEnumerable<VectoRunData> VectoRunDataBatteryElectricHeavyBusPrimaryNonExempted() + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + foreach (var mission in _segment.Missions) { + foreach (var loading in mission.Loadings) { + var simulationRunData = CreateVectoRunData(vehicle, mission, loading, 0); + if (simulationRunData == null) { + continue; + } + yield return simulationRunData; + } + + } + } + + private IEnumerable<VectoRunData> VectoRunDataConventionalHeavyBusPrimaryNonExempted() + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + var engine = vehicle.Components.EngineInputData; + var engineModes = engine.EngineModes; + + for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) { + foreach (var mission in _segment.Missions) { + foreach (var loading in mission.Loadings) { + var simulationRunData = CreateVectoRunData(vehicle, mission, loading, modeIdx); + if (simulationRunData == null) { + continue; + } + yield return simulationRunData; + } + } + } + } + protected override void Initialize() { _segment = GetSegment(InputDataProvider.JobInputData.Vehicle); @@ -47,14 +116,14 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories var vehicle = InputDataProvider.JobInputData.Vehicle; if (vehicle.ExemptedVehicle) { - powertrainConfig = CreateVectoRunData(vehicle, 0, null, - new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>()); + powertrainConfig = CreateVectoRunData(vehicle, null, + new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>(), 0); } else { powertrainConfig = _segment.Missions.Select( mission => CreateVectoRunData( - vehicle, 0, mission, mission.Loadings.First())) + vehicle, mission, mission.Loadings.First(), 0)) .FirstOrDefault(x => x != null); } @@ -63,9 +132,10 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories #region Overrides of DeclarationModePrimaryBusVectoRunDataFactory - protected virtual VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, - Mission mission, - KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, + Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, + int? modeIdx, + VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable) { VectoRunData runData; @@ -233,17 +303,17 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories } - public static CombustionEngineData CreateMockupEngineData(IVehicleDeclarationInputData vehicleData, int modeIdx, TankSystem? tankSystem = null) + public static CombustionEngineData CreateMockupEngineData(IVehicleDeclarationInputData vehicleData, int? modeIdx, TankSystem? tankSystem = null) { var engine = vehicleData.Components.EngineInputData; - if (engine == null) + if (engine == null || modeIdx == null) { return null; } var engineModes = engine.EngineModes; - var engineMode = engineModes[modeIdx]; + var engineMode = engineModes[modeIdx.Value]; var fuels = new List<CombustionEngineFuelData>(); foreach (var fuel in engineMode.Fuels) { diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 60af99fbde..83ff1956e1 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -490,6 +490,7 @@ namespace TUGraz.VectoCore.Models.Declaration case BusHVACSystemConfiguration.Unknown: case BusHVACSystemConfiguration.Configuration0: throw new VectoException($"Invalid HVAC Configuration {hvacConfigurationInput}"); + case BusHVACSystemConfiguration.Configuration1 when !hasDriverHP && !hasPassengerHP: return BusHVACSystemConfiguration.Configuration1; -- GitLab