diff --git a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs index 234587ed79c907266b875081e82c8af61c4c8d80..90c7bc5adf9da51eb16a58ebc0e48889fa2b623c 100644 --- a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs +++ b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs @@ -78,6 +78,7 @@ namespace TUGraz.VectoCommon.InputData case PowertrainPosition.BatteryElectricE2: case PowertrainPosition.BatteryElectricE3: case PowertrainPosition.BatteryElectricE4: + case PowertrainPosition.IEPC: return true; default: return false; diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs index 7a964cfbe5c709a3fe11a5a68b1562643bacc8fc..3241e88cfe7e455c87fdd5b88e9cd0777a684b90 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs @@ -1148,7 +1148,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON tolerateMissing) { VehicleData = ReadVehicle(); - + if (Body[JsonKeys.Vehicle_EngineFile] != null) { + Engine = ReadEngine(); + } + if (Body[JsonKeys.Vehicle_GearboxFile] != null && !string.IsNullOrWhiteSpace(Body[JsonKeys.Vehicle_GearboxFile].Value<string>())) { AxleGear = ReadGearbox() as IAxleGearInputData; } @@ -1159,6 +1162,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON ? null : JSONInputDataFactory.ReadShiftParameters(Path.Combine(BasePath, Body.GetEx<string>("TCU")), false); + public override IHybridStrategyParameters HybridStrategyParameters => + Body["HybridStrategyParams"] == null + ? null : JSONInputDataFactory.ReadHybridStrategyParameters( + Path.Combine(BasePath, Body.GetEx<string>("HybridStrategyParams")), false); + public override VectoSimulationJobType JobType => VehicleData.VehicleType; } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index c740263f4c96a2910675341d99c8080d1eef5781..a009bb79ceb44a4dfc9e623c0af3dafec63a2158 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -82,13 +82,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl return GetSerialHybridRunData(); case VectoSimulationJobType.IEPC_E: return GetIEPCRunData(); + case VectoSimulationJobType.IEPC_S: + return GetIEPC_S_RunData(); default: throw new ArgumentOutOfRangeException($"Invalid JobType {InputDataProvider.JobInputData.JobType}"); } } - - private IEnumerable<VectoRunData> GetSerialHybridRunData() { var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData; @@ -343,6 +343,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } private IEnumerable<VectoRunData> GetIEPCRunData() + { + var axleGearRequired = AxleGearRequired(); + var dao = new EngineeringDataAdapter(); + foreach (var cycle in InputDataProvider.JobInputData.Cycles) { + yield return GetIEPCVectoRunData(axleGearRequired, cycle, dao); + } + } + + private bool AxleGearRequired() { var vehicle = InputDataProvider.JobInputData.Vehicle; var iepcInput = vehicle.Components.IEPCEngineeringInputData; @@ -352,10 +361,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl $"Axlegear reqhired for selected type of IEPC! DifferentialIncluded: {iepcInput.DifferentialIncluded}, DesignTypeWheelMotor: {iepcInput.DesignTypeWheelMotor}"); } - var numGearsPowermap = iepcInput.VoltageLevels.Select(x => Tuple.Create(x.VoltageLevel, x.PowerMap.Count)).ToArray(); + var numGearsPowermap = + iepcInput.VoltageLevels.Select(x => Tuple.Create(x.VoltageLevel, x.PowerMap.Count)).ToArray(); var gearCount = iepcInput.Gears.Count; var numGearsDrag = iepcInput.DragCurves.Count; - + if (numGearsPowermap.Any(x => x.Item2 != gearCount)) { throw new VectoException( $"Number of gears for voltage levels does not match! PowerMaps: {numGearsPowermap.Select(x => $"{x.Item1}: {x.Item2}").Join()}; Gear count: {gearCount}"); @@ -366,87 +376,128 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl $"Number of gears drag curve does not match gear count! DragCurve {numGearsDrag}; Gear count: {gearCount}"); } - foreach (var cycle in InputDataProvider.JobInputData.Cycles) { - var dao = new EngineeringDataAdapter(); - var driver = dao.CreateDriverData(InputDataProvider.DriverInputData); + return axleGearRequired; + } - var axlegearData = axleGearRequired && vehicle.Components.AxleGearInputData != null - ? dao.CreateAxleGearData(vehicle.Components.AxleGearInputData) - : null; - //new AxleGearData() { - // AxleGear = new TransmissionData() { - // Ratio = 1.0, - // LossMap = TransmissionLossMapReader.Create(1.0, 1.0, "DummyAxleGearIEPC") - // } - //}; + private IEnumerable<VectoRunData> GetIEPC_S_RunData() + { + var axleGearRequired = AxleGearRequired(); - var batteryData = dao.CreateBatteryData(vehicle.Components.ElectricStorage, vehicle.InitialSOC); - var supercapData = dao.CreateSuperCapData(vehicle.Components.ElectricStorage, vehicle.InitialSOC); + var vehicle = InputDataProvider.JobInputData.Vehicle; + var engine = vehicle.Components.EngineInputData; + if (engine == null) { + throw new VectoException("Combustion Engine is required for IEPC-S vehicle configurations"); + } + var engineModes = engine.EngineModes; - var averageVoltage = batteryData != null ? CalculateAverageVoltage(batteryData) : null; - var electricMachinesData = dao.CreateIEPCElectricMachines(vehicle.Components.IEPCEngineeringInputData, averageVoltage); - var powertrainPosition = electricMachinesData.First(e => e.Item1 != PowertrainPosition.GEN).Item1; - var retarderData = axleGearRequired - ? dao.CreateRetarderData(vehicle.Components.RetarderInputData, powertrainPosition) - : new RetarderData() { - Type = RetarderType.LossesIncludedInTransmission - }; + var dao = new EngineeringDataAdapter(); + for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) { + var engineMode = engineModes[modeIdx]; + foreach (var cycle in InputDataProvider.JobInputData.Cycles) { + var engineData = dao.CreateEngineData(vehicle, engineMode); + engineData.FuelMode = modeIdx; + + var runData = GetIEPCVectoRunData(axleGearRequired, cycle, dao); + var averageVoltage = CalculateAverageVoltage(runData.BatteryData); + + var electricMachinesData = dao.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, averageVoltage); - var gearshiftParams = dao.CreateGearshiftData(GearboxType.APTN, - InputDataProvider.DriverInputData.GearshiftInputData, - axlegearData?.AxleGear.Ratio ?? 1.0, null); - var tmpRunData = new VectoRunData() { - JobType = VectoSimulationJobType.IEPC_E, - GearboxData = new GearboxData() { - Type = GearboxType.APTN, - }, - GearshiftParameters = gearshiftParams, - ElectricMachinesData = electricMachinesData, - //VehicleData = dao.CreateVehicleData(vehicle) - }; - var tempVehicle = dao.CreateVehicleData(vehicle); - var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData)); - var gearboxData = dao.CreateIEPCGearboxData( - InputDataProvider, new VectoRunData() { - JobType = VectoSimulationJobType.IEPC_E, - VehicleData = tempVehicle, - AxleGearData = axlegearData, - ElectricMachinesData = electricMachinesData - }, tmpStrategy); + var hybridParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData, + engineData, runData.GearboxData); - var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode == - CrossWindCorrectionMode.VAirBetaLookupTable; - //var ptoTransmissionData = dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData); + foreach (var gear in runData.GearboxData.Gears.Keys) { + engineData.FullLoadCurves[gear] = engineData.FullLoadCurves[0]; + } + runData.JobType = VectoSimulationJobType.IEPC_S; + runData.EngineData = engineData; + runData.ElectricMachinesData.Add(electricMachinesData.First(x => x.Item1 == PowertrainPosition.GEN)); + runData.HybridStrategyParameters = hybridParameters; + yield return runData; + } + } + } - var drivingCycle = GetDrivingCycle(cycle, crossWindRequired); - var vehicleData = dao.CreateVehicleData(vehicle); - yield return new VectoRunData { - JobName = InputDataProvider.JobInputData.JobName, + private VectoRunData GetIEPCVectoRunData(bool axleGearRequired, ICycleData cycle, EngineeringDataAdapter dao) + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + + var driver = dao.CreateDriverData(InputDataProvider.DriverInputData); + + var axlegearData = axleGearRequired && vehicle.Components.AxleGearInputData != null + ? dao.CreateAxleGearData(vehicle.Components.AxleGearInputData) + : null; + + var batteryData = dao.CreateBatteryData(vehicle.Components.ElectricStorage, vehicle.InitialSOC); + var supercapData = dao.CreateSuperCapData(vehicle.Components.ElectricStorage, vehicle.InitialSOC); + + var averageVoltage = batteryData != null ? CalculateAverageVoltage(batteryData) : null; + var electricMachinesData = + dao.CreateIEPCElectricMachines(vehicle.Components.IEPCEngineeringInputData, averageVoltage); + var powertrainPosition = electricMachinesData.First(e => e.Item1 != PowertrainPosition.GEN).Item1; + var retarderData = axleGearRequired + ? dao.CreateRetarderData(vehicle.Components.RetarderInputData, powertrainPosition) + : new RetarderData() { + Type = RetarderType.LossesIncludedInTransmission + }; + + var gearshiftParams = dao.CreateGearshiftData(GearboxType.APTN, + InputDataProvider.DriverInputData.GearshiftInputData, + axlegearData?.AxleGear.Ratio ?? 1.0, null); + var tmpRunData = new VectoRunData() { + JobType = VectoSimulationJobType.IEPC_E, + GearboxData = new GearboxData() { + Type = GearboxType.APTN, + }, + GearshiftParameters = gearshiftParams, + ElectricMachinesData = electricMachinesData, + //VehicleData = dao.CreateVehicleData(vehicle) + }; + var tempVehicle = dao.CreateVehicleData(vehicle); + var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData)); + var gearboxData = dao.CreateIEPCGearboxData( + InputDataProvider, new VectoRunData() { JobType = VectoSimulationJobType.IEPC_E, - GearboxData = gearboxData, + VehicleData = tempVehicle, AxleGearData = axlegearData, - AngledriveData = null, - VehicleData = vehicleData, - AirdragData = dao.CreateAirdragData(vehicle.Components.AirdragInputData, vehicle), - DriverData = driver, - Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData), - BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData, VectoSimulationJobType.BatteryElectricVehicle), - Retarder = retarderData, - //PTO = ptoTransmissionData, - Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), - ExecutionMode = ExecutionMode.Engineering, - ElectricMachinesData = electricMachinesData, - //HybridStrategyParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters), - BatteryData = batteryData, - SuperCapData = supercapData, - SimulationType = SimulationType.DistanceCycle | SimulationType.MeasuredSpeedCycle | SimulationType.PWheel, - GearshiftParameters = gearshiftParams, - ElectricAuxDemand = InputDataProvider.JobInputData.Vehicle.Components.AuxiliaryInputData.Auxiliaries.ElectricPowerDemand, - }; - } + ElectricMachinesData = electricMachinesData + }, tmpStrategy); + + var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode == + CrossWindCorrectionMode.VAirBetaLookupTable; + //var ptoTransmissionData = dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData); + + var drivingCycle = GetDrivingCycle(cycle, crossWindRequired); + + var vehicleData = dao.CreateVehicleData(vehicle); + return new VectoRunData { + JobName = InputDataProvider.JobInputData.JobName, + JobType = VectoSimulationJobType.IEPC_E, + GearboxData = gearboxData, + AxleGearData = axlegearData, + AngledriveData = null, + VehicleData = vehicleData, + AirdragData = dao.CreateAirdragData(vehicle.Components.AirdragInputData, vehicle), + DriverData = driver, + Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData), + BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData, + VectoSimulationJobType.BatteryElectricVehicle), + Retarder = retarderData, + //PTO = ptoTransmissionData, + Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), + ExecutionMode = ExecutionMode.Engineering, + ElectricMachinesData = electricMachinesData, + //HybridStrategyParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters), + BatteryData = batteryData, + SuperCapData = supercapData, + SimulationType = SimulationType.DistanceCycle | SimulationType.MeasuredSpeedCycle | SimulationType.PWheel, + GearshiftParameters = gearshiftParams, + ElectricAuxDemand = InputDataProvider.JobInputData.Vehicle.Components.AuxiliaryInputData.Auxiliaries + .ElectricPowerDemand, + }; } + protected virtual IEnumerable<VectoRunData> GetConventionalVehicleRunData() { var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;