diff --git a/VectoCommon/VectoCommon/Models/GearboxType.cs b/VectoCommon/VectoCommon/Models/GearboxType.cs index 0bc52ce93732ad34707c7c988a750afac9d69fab..753c5b89187216f39f4bb227ff6366848df01c19 100644 --- a/VectoCommon/VectoCommon/Models/GearboxType.cs +++ b/VectoCommon/VectoCommon/Models/GearboxType.cs @@ -44,7 +44,8 @@ namespace TUGraz.VectoCommon.Models ATSerial, // Automatic Transmission ATPowerSplit, //Custom, - DrivingCycle + DrivingCycle, + NoGeabox } public static class GearBoxTypeHelper diff --git a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs index 553964b2fb4420b37f3712f47c8d4b32315d1f0b..9937f64cb79325c45164ad4cfa589356c50d87a7 100644 --- a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs +++ b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs @@ -128,7 +128,13 @@ namespace TUGraz.VectoCommon.Utils return value == null ? null : new ConvertedSI(value.Value() * Kilo * Kilo, "g/km"); } - public static ConvertedSI ConvertToGramPerKiloWattHour(this SpecificFuelConsumption value) + public static ConvertedSI ConvertToKiloWattHourPerKiloMeter(this JoulePerMeter value) + { + return new ConvertedSI(value.Value() / 3600, "kWh/km"); + } + + + public static ConvertedSI ConvertToGramPerKiloWattHour(this SpecificFuelConsumption value) { return new ConvertedSI(value.Value() * 3600e6, "g/kWh"); } diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index a826bf8aedd7c74cb93b6a4138930ddfabbe230e..1196f6c3232019969ca024b7aeadce8bd89c22a8 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -125,6 +125,12 @@ namespace TUGraz.VectoCore.OutputData void AddElectricMotor(PowertrainPosition pos); KilogramPerWattSecond VehicleLineSlope(IFuelProperties fuel); bool HasCombustionEngine { get; } + WattSecond TotalElectricMotorWorkDrive(PowertrainPosition emPos); + WattSecond TotalElectricMotorWorkRecuperate(PowertrainPosition emPos); + PerSecond ElectricMotorAverageSpeed(PowertrainPosition emPos); + double BatteryStartSoC(); + double BatteryEndSoC(); + WattSecond BatteryLoss(); } public static class ModalDataContainerExtensions diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index 1eb813683a7d916ed5a3566569162eed27deca0a..b70dec11062203bb7ce7fb0376695ac4724e14b4 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -82,8 +82,11 @@ namespace TUGraz.VectoCore.OutputData private readonly Dictionary<FuelType, KilogramPerWattSecond> _engLine = new Dictionary<FuelType, KilogramPerWattSecond>(); private readonly Dictionary<FuelType, KilogramPerWattSecond> _vehLine = new Dictionary<FuelType, KilogramPerWattSecond>(); private List<PowertrainPosition> ElectricMotors = new List<PowertrainPosition>(); + private Dictionary<PowertrainPosition, WattSecond> _eEmDrive = new Dictionary<PowertrainPosition, WattSecond>(); + private Dictionary<PowertrainPosition, WattSecond> _eEmRecuperate = new Dictionary<PowertrainPosition, WattSecond>(); + //private Dictionary<PowertrainPosition, WattSecond> _eEmDrive = new Dictionary<PowertrainPosition, WattSecond>(); - public int JobRunId { get; } + public int JobRunId { get; } public string RunName { get; } public string CycleName { get; } public string RunSuffix { get; private set; } @@ -234,6 +237,56 @@ namespace TUGraz.VectoCore.OutputData public bool HasCombustionEngine { get; set; } + public WattSecond TotalElectricMotorWorkDrive(PowertrainPosition emPos) + { + if (!ElectricMotors.Contains(emPos)) { + return null; + } + + if (!_eEmDrive.ContainsKey(emPos)) { + _eEmDrive[emPos] = TimeIntegral<WattSecond>( + string.Format(ModalResultField.P_electricMotor_mech_.GetCaption(), emPos.GetName()), x => x < 0); + } + + return -_eEmDrive[emPos]; + } + + public WattSecond TotalElectricMotorWorkRecuperate(PowertrainPosition emPos) + { + if (!ElectricMotors.Contains(emPos)) { + return null; + } + + if (!_eEmRecuperate.ContainsKey(emPos)) { + _eEmRecuperate[emPos] = TimeIntegral<WattSecond>( + string.Format(ModalResultField.P_electricMotor_mech_.GetCaption(), emPos.GetName()), x => x > 0); ; + } + + return _eEmRecuperate[emPos]; + } + + public PerSecond ElectricMotorAverageSpeed(PowertrainPosition emPos) + { + var integral = GetValues(x => x.Field<PerSecond>(string.Format(ModalResultField.n_electricMotor_.GetCaption(), emPos.GetName())).Value() * + x.Field<Second>(ModalResultField.simulationInterval.GetName()).Value()).Sum(); + return (integral / Duration.Value()).SI<PerSecond>(); + } + + public double BatteryStartSoC() + { + return Data.AsEnumerable().Cast<DataRow>().First().Field<SI>(ModalResultField.BatteryStateOfCharge.GetName()).Value() * 100; + } + + public double BatteryEndSoC() + { + return Data.AsEnumerable().Cast<DataRow>().Last().Field<SI>(ModalResultField.BatteryStateOfCharge.GetName()).Value() * 100; + } + + public WattSecond BatteryLoss() + { + return TimeIntegral<WattSecond>(ModalResultField.P_battery_loss); + } + public void CalculateAggregateValues() { var duration = Duration; diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index f899c7307eb83191d9368040fae8241f40ebf550..1cc92de1fd344a9e662301688c9b1f1ebd6964b3 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -35,6 +35,7 @@ using System.Data; using System.Linq; using System.Runtime.CompilerServices; using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; @@ -270,7 +271,10 @@ namespace TUGraz.VectoCore.OutputData [MethodImpl(MethodImplOptions.Synchronized)] protected DataRow GetResultRow(IModalDataContainer modData, VectoRunData runData) { - UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); + if (modData.HasCombustionEngine) { + UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); + } + var row = Table.NewRow(); Table.Rows.Add(row); return row; @@ -296,7 +300,7 @@ namespace TUGraz.VectoCore.OutputData cargoVolume = runData.VehicleData.CargoVolume; vehicleLoading = runData.VehicleData.Loading; - gearCount = (uint)runData.GearboxData.Gears.Count; + gearCount = (uint?)runData.GearboxData?.Gears.Count ?? 0u; passengerCount = runData.VehicleData.PassengerCount; } @@ -319,7 +323,14 @@ namespace TUGraz.VectoCore.OutputData if (modData.HasCombustionEngine) { WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume, passengerCount, runData); - } + } else { + if (runData.ElectricMachinesData.Count > 0) { + var col = Table.Columns.Add(Fields.ElectricEnergyConsumptionPerKm, typeof(ConvertedSI)); + col.SetOrdinal(Table.Columns[Fields.CO2_KM].Ordinal); + row[Fields.ElectricEnergyConsumptionPerKm] = + (-modData.TimeIntegral<WattSecond>(ModalResultField.P_battery_terminal) / modData.Distance).Cast<JoulePerMeter>().ConvertToKiloWattHourPerKiloMeter(); + } + } if (runData.Mission?.MissionType == MissionType.VerificationTest) { var fuelsWhtc = runData.EngineData.Fuels.Select( @@ -347,8 +358,9 @@ namespace TUGraz.VectoCore.OutputData row[Fields.COASTING_TIME_SHARE] = (ConvertedSI)modData.CoastingTimeShare(); row[Fields.BRAKING_TIME_SHARE] = (ConvertedSI)modData.BrakingTimeShare(); - row[Fields.NUM_ICE_STARTS] = (ConvertedSI)modData.NumICEStarts().SI<Scalar>(); - + if (runData.EngineData != null) { + row[Fields.NUM_ICE_STARTS] = (ConvertedSI)modData.NumICEStarts().SI<Scalar>(); + } if (gearCount <= 0) { return; @@ -359,7 +371,7 @@ namespace TUGraz.VectoCore.OutputData - private static void WriteFuelconsumptionEntries( + private void WriteFuelconsumptionEntries( IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, CubicMeter cargoVolume, double? passengers, VectoRunData runData) { @@ -596,8 +608,11 @@ namespace TUGraz.VectoCore.OutputData row[Fields.MAX_SPEED] = (ConvertedSI)modData.MaxSpeed().AsKmph.SI<Scalar>(); row[Fields.MAX_ACCELERATION] = (ConvertedSI)modData.MaxAcceleration(); row[Fields.MAX_DECELERATION] = (ConvertedSI)modData.MaxDeceleration(); - row[Fields.AVG_ENGINE_SPEED] = (ConvertedSI)modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); - row[Fields.MAX_ENGINE_SPEED] = (ConvertedSI)modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); + if (runData.EngineData != null) { + row[Fields.AVG_ENGINE_SPEED] = (ConvertedSI)modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); + row[Fields.MAX_ENGINE_SPEED] = (ConvertedSI)modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); + } + row[Fields.AVERAGE_POS_ACC] = (ConvertedSI)modData.AverageAccelerationBelowTargetSpeed(); if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) { var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare; @@ -628,7 +643,7 @@ namespace TUGraz.VectoCore.OutputData var eGbxOut = modData.TimeIntegral<WattSecond>(gbxOutSignal, x => x > 0); row[Fields.AVERAGE_GEARBOX_EFFICIENCY] = eGbxIn.IsEqual(0, 1e-9) ? 0 : (eGbxOut / eGbxIn).Value(); - if (runData.GearboxData.Type.AutomaticTransmission()) { + if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission()) { var eTcIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_TC_in, x => x > 0); var eTcOut = eGbxIn; row[Fields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP] = eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value(); @@ -662,7 +677,7 @@ namespace TUGraz.VectoCore.OutputData row[Fields.AVERAGE_AXLEGEAR_EFFICIENCY] = eAxlIn.IsEqual(0, 1e-9) ? 0 : (eAxlOut / eAxlIn).Value(); } - private static void WriteWorkEntries(IModalDataContainer modData, DataRow row, VectoRunData runData) + private void WriteWorkEntries(IModalDataContainer modData, DataRow row, VectoRunData runData) { row[Fields.E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertToKiloWattHour(); row[Fields.E_FCMAP_NEG] = (-modData.TotalEngineWorkNegative()).ConvertToKiloWattHour(); @@ -700,7 +715,35 @@ namespace TUGraz.VectoCore.OutputData row[Fields.E_AUX_ESS_MECH] = modData.WorkAuxiliariesDuringEngineStop().ConvertToKiloWattHour(); row[Fields.E_ICE_START] = modData.WorkEngineStart().ConvertToKiloWattHour(); - } + + foreach (var em in runData.ElectricMachinesData) { + var emColumns = new List<Tuple<string, ConvertedSI>>() { + Tuple.Create(Fields.E_EM_DRIVE_FORMAT, modData.TotalElectricMotorWorkDrive(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.E_EM_RECUPERATE_FORMAT, modData.TotalElectricMotorWorkRecuperate(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.E_EM_AVG_SPEED_FORMAT, modData.ElectricMotorAverageSpeed(em.Item1).ConvertToRoundsPerMinute()), + }; + foreach (var entry in emColumns) { + var colName = string.Format(entry.Item1, em.Item1.GetName()); + if (!Table.Columns.Contains(colName)) { + var col = Table.Columns.Add(colName, typeof(ConvertedSI)); + col.SetOrdinal(Table.Columns[Fields.E_GRAD].Ordinal + 1); + } + row[colName] = entry.Item2; + } + } + + if (runData.BatteryData != null) { + var col = Table.Columns.Add(Fields.BatteryEndSoC, typeof(double)); + col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal); + col = Table.Columns.Add(Fields.BatteryStartSoC, typeof(double)); + col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal); + col = Table.Columns.Add(Fields.E_BAT_LOSS, typeof(ConvertedSI)); + col.SetOrdinal(Table.Columns[Fields.P_WHEEL].Ordinal); + row[Fields.BatteryStartSoC] = modData.BatteryStartSoC(); + row[Fields.BatteryEndSoC] = modData.BatteryEndSoC(); + row[Fields.E_BAT_LOSS] = modData.BatteryLoss().ConvertToKiloWattHour(); + } + } private void WriteFullPowertrain(VectoRunData runData, DataRow row) { @@ -735,7 +778,8 @@ namespace TUGraz.VectoCore.OutputData private static void WriteVehicleData(VectoRunData runData, DataRow row) { var data = runData.VehicleData; - var gbxType = runData.GearboxData.Type; + //if (runData.VehicleData.b) + var gbxType = runData.GearboxData?.Type ?? GearboxType.NoGeabox; row[Fields.VEHICLE_MANUFACTURER] = data.Manufacturer; row[Fields.VIN_NUMBER] = data.VIN; @@ -774,6 +818,9 @@ namespace TUGraz.VectoCore.OutputData private static void WriteEngineData(CombustionEngineData data, DataRow row) { + if (data == null) { + return; + } row[Fields.ENGINE_MANUFACTURER] = data.Manufacturer; row[Fields.ENGINE_MODEL] = data.ModelName; row[Fields.ENGINE_CERTIFICATION_NUMBER] = data.CertificationNumber; @@ -819,7 +866,10 @@ namespace TUGraz.VectoCore.OutputData private static void WriteAxlegearData(AxleGearData data, DataRow row) { - row[Fields.AXLE_MANUFACTURER] = data.Manufacturer; + if (data == null) { + return; + } + row[Fields.AXLE_MANUFACTURER] = data.Manufacturer; row[Fields.AXLE_MODEL] = data.ModelName; row[Fields.AXLE_RATIO] = (ConvertedSI)data.AxleGear.Ratio.SI<Scalar>(); row[Fields.AXLEGEAR_CERTIFICATION_METHOD] = data.CertificationMethod.GetName(); @@ -896,7 +946,10 @@ namespace TUGraz.VectoCore.OutputData private static void WriteGearboxData(GearboxData data, DataRow row) { - row[Fields.GEARBOX_MANUFACTURER] = data.Manufacturer; + if (data == null) { + return; + } + row[Fields.GEARBOX_MANUFACTURER] = data.Manufacturer; row[Fields.GEARBOX_MODEL] = data.ModelName; row[Fields.GEARBOX_TYPE] = data.Type; row[Fields.GEARBOX_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues @@ -1059,7 +1112,9 @@ namespace TUGraz.VectoCore.OutputData public const string FCFINAL_LiterPer100M3KM = "FC-Final{0} [l/100m³km]"; public const string FCFINAL_LiterPer100PassengerKM = "FC-Final{0} [l/100Pkm]"; - public const string CO2_KM = "CO2 [g/km]"; + public const string ElectricEnergyConsumptionPerKm = "E_el_tot [kWh/km]"; + + public const string CO2_KM = "CO2 [g/km]"; public const string CO2_TKM = "CO2 [g/tkm]"; public const string CO2_M3KM = "CO2 [g/m³km]"; public const string CO2_PKM = "CO2 [g/Pkm]"; @@ -1187,6 +1242,15 @@ namespace TUGraz.VectoCore.OutputData public const string AIRDRAG_CERTIFICATION_METHOD = "AirDrag certification option"; public const string AVERAGE_POS_ACC = "a_avg_acc"; + + public const string E_EM_DRIVE_FORMAT = "E_EM_{0}_propel [kWh]"; + public const string E_EM_RECUPERATE_FORMAT = "E_EM_{0}_recuperation [kWh]"; + public const string E_EM_AVG_SPEED_FORMAT = "n_EM_{0}_avg [rpm]"; + + public const string BatteryStartSoC = "Battery Start SoC [%]"; + public const string BatteryEndSoC = "Battery end SoC [%]"; + public const string E_BAT_LOSS = "E_Batt_loss [kWh]"; + } - } + } } diff --git a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs index fa9f3f26b725c207d2ad632a427d7c5597692b75..5f77730eb2de32457353f7ef9c5eb2ad44cacf22 100644 --- a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs @@ -106,10 +106,10 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var modFilename = string.Format("SimpleBatteryElectric-B4_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl); - - var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + var run = job.Runs.First().Run; + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; var data = run.GetContainer().RunData; //File.WriteAllText( @@ -141,10 +141,10 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var modFilename = string.Format("SimpleBatteryElectric-B4_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); - - var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + var run = job.Runs.First().Run; + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; run.Run(); Assert.IsTrue(run.FinishedWithoutErrors); @@ -175,23 +175,26 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; - var modFilename = string.Format("SimpleParallelHybrid-B4_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); + var modFilename = string.Format("SimpleParallelHybrid-B4_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); + var run = job.Runs.First().Run; + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; - var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; - - var data = run.GetContainer().RunData; + //var data = run.GetContainer().RunData; //File.WriteAllText( // $"{modFilename}.json", // JsonConvert.SerializeObject(data, Formatting.Indented)); - run.Run(); + //run.Run(); + job.Execute(); + job.WaitFinished(); Assert.IsTrue(run.FinishedWithoutErrors); + Assert.IsTrue(modData.Rows.Count > 0); - Assert.IsTrue(modData.Rows.Count > 0); - GraphWriter.Write(modFilename); + + GraphWriter.Write(modFilename + ".vmod"); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -229,9 +232,9 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var modFilename = string.Format("SimpleBatteryElectric-B3_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl); - + var run = job.Runs.First().Run; var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; var data = run.GetContainer().RunData; @@ -264,9 +267,9 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var modFilename = string.Format("SimpleBatteryElectric-B3_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); - + var run = job.Runs.First().Run; var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; run.Run(); @@ -298,11 +301,12 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric const bool largeMotor = true; - var modFilename = string.Format("SimpleParallelHybrid-B3_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); + var modFilename = string.Format("SimpleParallelHybrid-B3_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl); const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true); + var run = job.Runs.First().Run; var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; var data = run.GetContainer().RunData; @@ -312,7 +316,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric run.Run(); Assert.IsTrue(run.FinishedWithoutErrors); - + job.WaitFinished(); Assert.IsTrue(modData.Rows.Count > 0); GraphWriter.Write(modFilename); } @@ -321,19 +325,26 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric // ================================================= - public static VectoRun CreateEngineeringRun( - DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, int count, double ratio, bool largeMotor = false, - SummaryDataContainer sumData = null, double pAuxEl = 0, Kilogram payload = null) + public static JobContainer CreateEngineeringRun( + DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, int count, double ratio, bool largeMotor = false, double pAuxEl = 0, Kilogram payload = null) { + var fileWriter = new FileOutputWriter(Path.GetFileNameWithoutExtension(modFileName)); + var sumData = new SummaryDataContainer(fileWriter); + var jobContainer = new JobContainer(sumData); var container = CreateBatteryElectricPowerTrain( - cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, count, ratio, largeMotor, sumData, pAuxEl, pos, payload); - return new DistanceRun(container); + cycleData, modFileName, fileWriter, sumData, initialSoc, count, ratio, largeMotor, pAuxEl, pos, payload); + + var run = new DistanceRun(container); + jobContainer.AddRun(run); + return jobContainer; } - public static VehicleContainer CreateBatteryElectricPowerTrain(DrivingCycleData cycleData, string modFileName, - double initialBatCharge, int count, double ratio, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, Kilogram payload = null) + public static VehicleContainer CreateBatteryElectricPowerTrain(DrivingCycleData cycleData, + string modFileName, FileOutputWriter fileWriter, SummaryDataContainer sumData, + double initialBatCharge, int count, double ratio, bool largeMotor, double pAuxEl, PowertrainPosition pos, + Kilogram payload = null) { - var fileWriter = new FileOutputWriter(modFileName); + var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), }; var modData = new ModalDataContainer( modFileName, new IFuelProperties[] { FuelData.Diesel }, fileWriter, @@ -388,11 +399,13 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric runData.AxleGearData = axleGearData; runData.GearboxData = gearboxData; } + var container = new VehicleContainer( ExecutionMode.Engineering, modData, x => { sumData?.Write(x, 1, 1, runData); }); + container.RunData = runData; - - var es = new ElectricSystem(container); + + var es = new ElectricSystem(container); var battery = new Battery(container, batteryData); battery.Initialize(initialBatCharge); diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs index c9c19209bd39204ba3dc65ba2744471902bbe5e8..99c43ad99f277da0702b2efda609ec344875cafa 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs @@ -85,21 +85,24 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid const bool largeMotor = true; - var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); + var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP2; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; - run.Run(); - Assert.IsTrue(run.FinishedWithoutErrors); + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); Assert.IsTrue(modData.Rows.Count > 0); - GraphWriter.Write(modFilename); + GraphWriter.Write(modFilename + ".vmod"); } [ @@ -135,10 +138,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP2; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -188,10 +192,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP2; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -203,8 +208,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid run.Run(); Assert.IsTrue(run.FinishedWithoutErrors); - - Assert.IsTrue(modData.Rows.Count > 0); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(modData.Rows.Count > 0); GraphWriter.Write(modFilename); } @@ -256,10 +262,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P2_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP2; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); //var strategy = (DelegateParallelHybridStrategy)hybridController.Strategy; //Assert.NotNull(strategy); @@ -309,10 +316,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -347,10 +355,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -380,10 +389,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); //var strategy = (DelegateParallelHybridStrategy)hybridController.Strategy; //Assert.NotNull(strategy); @@ -422,8 +432,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P3_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP3; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); + var run = job.Runs.First().Run; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); @@ -477,10 +488,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P4_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); const PowertrainPosition pos = PowertrainPosition.HybridP4; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -515,10 +527,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P4_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP4; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; @@ -548,10 +561,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var modFilename = string.Format("SimpleParallelHybrid-P4_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); const PowertrainPosition pos = PowertrainPosition.HybridP4; - var run = CreateEngineeringRun( + var job = CreateEngineeringRun( cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true); + var run = job.Runs.First().Run; - var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; Assert.NotNull(hybridController); //var strategy = (DelegateParallelHybridStrategy)hybridController.Strategy; //Assert.NotNull(strategy); @@ -567,12 +581,16 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid // ================================================= - public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, double ratio, bool largeMotor = false, - SummaryDataContainer sumData = null, double pAuxEl = 0, Kilogram payload = null) + public static JobContainer CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, double ratio, bool largeMotor = false, double pAuxEl = 0, Kilogram payload = null) { - var container = CreateParallelHybridPowerTrain( + var fileWriter = new FileOutputWriter(Path.GetFileNameWithoutExtension(modFileName)); + var sumData = new SummaryDataContainer(fileWriter); + var jobContainer = new JobContainer(sumData); + var container = CreateParallelHybridPowerTrain( cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload); - return new DistanceRun(container); + var run = new DistanceRun(container); + jobContainer.AddRun(run); + return jobContainer; } public static VectoRun CreateConventionalEngineeringRun(DrivingCycleData cycleData, string modFileName, diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index a8c1d2980902cb3467ec7abcc60569b4bcba2099..8e0636dc002b0266839f87aebc2dd7122cdec113 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -271,6 +271,35 @@ namespace TUGraz.VectoCore.Tests.Utils } public bool HasCombustionEngine { get; set; } + public WattSecond TotalElectricMotorWorkDrive(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + + public WattSecond TotalElectricMotorWorkRecuperate(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + + public PerSecond ElectricMotorAverageSpeed(PowertrainPosition emPos) + { + throw new NotImplementedException(); + } + + public double BatteryStartSoC() + { + throw new NotImplementedException(); + } + + public double BatteryEndSoC() + { + throw new NotImplementedException(); + } + + public WattSecond BatteryLoss() + { + throw new NotImplementedException(); + } public string RunName { get; set; } public string CycleName { get; set; }