From 459051776514aed0b0675dd6b3b8febf742edb40 Mon Sep 17 00:00:00 2001 From: Michael Krisper <michael.krisper@tugraz.at> Date: Thu, 21 Jan 2016 21:42:15 +0100 Subject: [PATCH] added some checks for null in the sumwriter for pwheel mode --- .../Models/Simulation/Impl/JobContainer.cs | 2 +- .../Simulation/Impl/PowertrainBuilder.cs | 7 +- .../SimulationComponent/Impl/Gearbox.cs | 3 + .../Impl/PowertrainDrivingCycle.cs | 44 +++++-- VectoCore/OutputData/IModalDataContainer.cs | 108 ++++++++++++++---- VectoCore/OutputData/SummaryDataContainer.cs | 54 ++++++--- .../Models/Simulation/PwheelModeTests.cs | 2 +- 7 files changed, 166 insertions(+), 54 deletions(-) diff --git a/VectoCore/Models/Simulation/Impl/JobContainer.cs b/VectoCore/Models/Simulation/Impl/JobContainer.cs index b1ec85897a..7b7ea1959a 100644 --- a/VectoCore/Models/Simulation/Impl/JobContainer.cs +++ b/VectoCore/Models/Simulation/Impl/JobContainer.cs @@ -190,7 +190,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl { var stopWatch = Stopwatch.StartNew(); try { - Run.Run(_worker, (x => Progress = x)); + Run.Run(_worker, x => Progress = x); } catch (Exception ex) { Log.Error(ex, "Error during simulation run!"); ExecException = ex; diff --git a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index b8977e050a..d410b982de 100644 --- a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -15,6 +15,8 @@ */ using System; +using System.Collections.Generic; +using System.Linq; using TUGraz.VectoCore.Exceptions; using TUGraz.VectoCore.Models.Connector.Ports; using TUGraz.VectoCore.Models.Simulation.Data; @@ -58,7 +60,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var directAux = new Auxiliary(_container); directAux.AddDirect(cycle); - + cycle.InPort().Connect(directAux.OutPort()); var engine = new EngineOnlyCombustionEngine(_container, data.EngineData); @@ -69,7 +71,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl private VehicleContainer BuildPWheel(VectoRunData data) { - var cycle = new PowertrainDrivingCycle(_container, data.Cycle); + var cycle = new PWheelCycle(_container, data.Cycle, data.AxleGearData.Ratio, + data.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio)); var tmp = AddComponent(cycle, new AxleGear(_container, data.AxleGearData)); diff --git a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index dd0a8f2aad..3c972ec4d9 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -90,6 +90,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl #region ITnInProvider + [DebuggerHidden] public ITnInPort InPort() { return this; @@ -280,6 +281,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var response = NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), null); response.GearboxPowerRequest = outTorque * outAngularVelocity; + PreviousInAngularSpeed = DataBus.EngineIdleSpeed; + return response; } diff --git a/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs b/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs index 5eaef5b111..8a34c552ae 100644 --- a/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs +++ b/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs @@ -21,9 +21,8 @@ using TUGraz.VectoCore.Exceptions; using TUGraz.VectoCore.Models.Connector.Ports; using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.Simulation; -using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.Simulation.DataBus; using TUGraz.VectoCore.Models.SimulationComponent.Data; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.Utils; @@ -37,11 +36,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { protected DrivingCycleData Data; protected ITnOutPort NextComponent; - private IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; } - private IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; } + protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; } + protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; } protected Second AbsTime { get; set; } + /// <summary> + /// Initializes a new instance of the <see cref="PowertrainDrivingCycle"/> class. + /// </summary> + /// <param name="container">The container.</param> + /// <param name="cycle">The cycle.</param> public PowertrainDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) : base(container) { Data = cycle; @@ -80,8 +84,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl IResponse ISimulationOutPort.Request(Second absTime, Second dt) { - //todo: change to variable time steps - var index = (int)Math.Floor(absTime.Value()); + var index = (int)absTime.Value(); if (index >= Data.Entries.Count) { return new ResponseCycleFinished(); } @@ -91,8 +94,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public IResponse Initialize() { - var index = 0; - return NextComponent.Initialize(Data.Entries[index].Torque, Data.Entries[index].AngularVelocity); + AbsTime = Data.Entries.First().Time; + return NextComponent.Initialize(Data.Entries.First().Torque, Data.Entries.First().AngularVelocity); } public string CycleName @@ -128,8 +131,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void DoCommitSimulationStep() { - LeftSample.MoveNext(); - RightSample.MoveNext(); + if (RightSample.MoveNext()) { + LeftSample.MoveNext(); + } } #endregion @@ -145,14 +149,30 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } } - public class PWheelCycle : PowertrainDrivingCycle + public class PWheelCycle : PowertrainDrivingCycle, IDriverInfo { + /// <summary> + /// True if the angularVelocity at the wheels is 0. + /// </summary> + public bool VehicleStopped + { + get { return LeftSample.Current.AngularVelocity.IsEqual(0); } + } + + /// <summary> + /// Always Driving. + /// </summary> + public DrivingBehavior DrivingBehavior + { + get { return DrivingBehavior.Driving; } + } + public PWheelCycle(IVehicleContainer container, DrivingCycleData cycle, double axleRatio, IDictionary<uint, double> gears) : base(container, cycle) { gears[0] = 1; foreach (var entry in Data.Entries) { - entry.AngularVelocity *= axleRatio * gears[entry.Gear]; + entry.AngularVelocity = entry.AngularVelocity / (axleRatio * gears[entry.Gear]); entry.Torque = entry.PWheel / entry.AngularVelocity; } } diff --git a/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/OutputData/IModalDataContainer.cs index db2e1cd52a..42494dec60 100644 --- a/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/OutputData/IModalDataContainer.cs @@ -127,41 +127,65 @@ namespace TUGraz.VectoCore.OutputData public static MeterPerSquareSecond AccelerationsPositive3SecondAverage(this IModalDataContainer data) { - var acceleration3SecondAverage = AccelerationPer3Seconds(data); - return acceleration3SecondAverage.Where(x => x > 0.125).Average(); + try { + var acceleration3SecondAverage = AccelerationPer3Seconds(data); + return acceleration3SecondAverage.Where(x => x > 0.125).Average(); + } catch (NullReferenceException) { + return null; + } } public static MeterPerSquareSecond AccelerationNoise(this IModalDataContainer data) { - var avg = data.AccelerationAverage(); - var accelerationAverages = AccelerationPerSecond(data).ToList(); - var sqareAvg = accelerationAverages.Select(x => (x - avg) * (x - avg)).Sum() / accelerationAverages.Count; - return sqareAvg.Sqrt().Cast<MeterPerSquareSecond>(); + try { + var avg = data.AccelerationAverage(); + var accelerationAverages = AccelerationPerSecond(data).ToList(); + var sqareAvg = accelerationAverages.Select(x => (x - avg) * (x - avg)).Sum() / accelerationAverages.Count; + return sqareAvg.Sqrt().Cast<MeterPerSquareSecond>(); + } catch (NullReferenceException) { + return null; + } } public static MeterPerSquareSecond AverageAccelerations3SecondNegative(this IModalDataContainer data) { - var acceleration3SecondAverage = AccelerationPer3Seconds(data); - return acceleration3SecondAverage.Where(x => x < -0.125).Average(); + try { + var acceleration3SecondAverage = AccelerationPer3Seconds(data); + return acceleration3SecondAverage.Where(x => x < -0.125).Average(); + } catch (NullReferenceException) { + return null; + } } public static Scalar PercentAccelerationTime(this IModalDataContainer data) { - var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList(); - return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x > 0.125) / acceleration3SecondAverage.Count; + try { + var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList(); + return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x > 0.125) / acceleration3SecondAverage.Count; + } catch (NullReferenceException) { + return null; + } } public static Scalar PercentDecelerationTime(this IModalDataContainer data) { - var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList(); - return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x < -0.125) / acceleration3SecondAverage.Count; + try { + var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList(); + return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x < -0.125) / acceleration3SecondAverage.Count; + } catch (NullReferenceException) { + return null; + } } public static Scalar PercentCruiseTime(this IModalDataContainer data) { - var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList(); - return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x.IsBetween(-0.125, -0.125)) / - acceleration3SecondAverage.Count; + try { + var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList(); + return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x.IsBetween(-0.125, -0.125)) / + acceleration3SecondAverage.Count; + } catch (NullReferenceException) { + return null; + } } public static Scalar PercentStopTime(this IModalDataContainer data) @@ -184,8 +208,10 @@ namespace TUGraz.VectoCore.OutputData public static Meter AltitudeDelta(this IModalDataContainer data) { - return data.GetValues<Meter>(ModalResultField.altitude).Last() - - data.GetValues<Meter>(ModalResultField.altitude).First(); + var altitudes = data.GetValues<Meter>(ModalResultField.altitude).ToList(); + var first = altitudes.First(); + var last = altitudes.Last(); + return first == null || last == null ? null : last - first; } public static WattSecond PowerAccelerations(this IModalDataContainer data) @@ -220,7 +246,9 @@ namespace TUGraz.VectoCore.OutputData public static Meter Distance(this IModalDataContainer data) { - return (data.Max(ModalResultField.dist) - data.Min(ModalResultField.dist)).Cast<Meter>(); + var max = data.Max(ModalResultField.dist); + var min = data.Min(ModalResultField.dist); + return max == null || min == null ? null : (max - min).Cast<Meter>(); } public static WattSecond WorkTotalMechanicalBrake(this IModalDataContainer data) @@ -270,7 +298,11 @@ namespace TUGraz.VectoCore.OutputData public static KilogramPerMeter FuelConsumptionWHTCCorrected(this IModalDataContainer data) { - return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / data.Distance(); + var distance = data.Distance(); + if (distance == null) { + return null; + } + return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / distance; } public static KilogramPerSecond FuelConsumptionWHTCCorrectedPerSecond(this IModalDataContainer data) @@ -280,7 +312,11 @@ namespace TUGraz.VectoCore.OutputData public static KilogramPerMeter FuelConsumptionAuxStartStopCorrected(this IModalDataContainer data) { - return data.TimeIntegral<Kilogram>(ModalResultField.FCAUXc) / data.Distance(); + var distance = data.Distance(); + if (distance == null) { + return null; + } + return data.TimeIntegral<Kilogram>(ModalResultField.FCAUXc) / distance; } public static KilogramPerSecond FuelConsumptionAuxStartStopCorrectedPerSecond(this IModalDataContainer data) @@ -290,18 +326,31 @@ namespace TUGraz.VectoCore.OutputData public static KilogramPerMeter FuelConsumptionFinal(this IModalDataContainer data) { - return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / data.Distance(); + var distance = data.Distance(); + if (distance == null) { + return null; + } + return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / distance; } public static SI FuelConsumptionFinalLiterPer100Kilometer(this IModalDataContainer data) { - var fcVolumePerMeter = data.FuelConsumptionFinal() / Physics.FuelDensity; + var fuelConsumptionFinal = data.FuelConsumptionFinal(); + if (fuelConsumptionFinal == null) { + return null; + } + + var fcVolumePerMeter = fuelConsumptionFinal / Physics.FuelDensity; return fcVolumePerMeter.ConvertTo().Cubic.Dezi.Meter * 100.SI().Kilo.Meter; } public static KilogramPerMeter CO2PerMeter(this IModalDataContainer data) { - return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) * Physics.CO2PerFuelWeight / data.Distance(); + var distance = data.Distance(); + if (distance == null) { + return null; + } + return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) * Physics.CO2PerFuelWeight / distance; } public static SI FuelConsumptionLiterPer100Kilometer(this IModalDataContainer data) @@ -317,7 +366,11 @@ namespace TUGraz.VectoCore.OutputData public static KilogramPerMeter FuelConsumptionPerMeter(this IModalDataContainer data) { - return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) / data.Distance(); + var distance = data.Distance(); + if (distance == null) { + return null; + } + return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) / distance; } public static Watt EnginePowerNegativeAverage(this IModalDataContainer data) @@ -346,7 +399,12 @@ namespace TUGraz.VectoCore.OutputData public static MeterPerSecond Speed(this IModalDataContainer data) { - return Distance(data) / Duration(data); + var distance = Distance(data); + var duration = Duration(data); + if (distance == null || duration == null) { + return null; + } + return distance / duration; } public static WattSecond AuxiliaryWork(this IModalDataContainer data, DataColumn auxCol) diff --git a/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/OutputData/SummaryDataContainer.cs index 8627d371fa..7c936ff929 100644 --- a/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/OutputData/SummaryDataContainer.cs @@ -84,8 +84,8 @@ namespace TUGraz.VectoCore.OutputData private bool _engineOnly = true; protected SummaryDataContainer() {} - - + + private readonly IList<string> _auxColumns = new List<string>(); /// <summary> @@ -111,8 +111,7 @@ namespace TUGraz.VectoCore.OutputData } public virtual void Write(bool isEngineOnly, IModalDataContainer data, string jobFileName, string jobName, - string cycleFileName, - Kilogram vehicleMass, Kilogram vehicleLoading) + string cycleFileName, Kilogram vehicleMass, Kilogram vehicleLoading) { if (isEngineOnly) { WriteEngineOnly(data, jobFileName, jobName, cycleFileName); @@ -154,26 +153,55 @@ namespace TUGraz.VectoCore.OutputData row[CYCLE] = cycleFileName; row[STATUS] = data.RunStatus; row[TIME] = data.Duration(); - row[DISTANCE] = data.Distance().ConvertTo().Kilo.Meter; - row[SPEED] = data.Speed().ConvertTo().Kilo.Meter.Per.Hour; + + var distance = data.Distance(); + if (distance != null) { + row[DISTANCE] = distance.ConvertTo().Kilo.Meter; + } + + var speed = data.Speed(); + if (speed != null) { + row[SPEED] = speed.ConvertTo().Kilo.Meter.Per.Hour; + } + row[ALTITUDE] = data.AltitudeDelta(); row[PPOS] = data.EnginePowerPositiveAverage().ConvertTo().Kilo.Watt; row[PNEG] = data.EnginePowerNegativeAverage().ConvertTo().Kilo.Watt; - row[FCFINAL] = data.FuelConsumptionFinal().ConvertTo().Gramm.Per.Kilo.Meter; + + var fcfinal = data.FuelConsumptionFinal(); + if (fcfinal != null) { + row[FCFINAL] = fcfinal.ConvertTo().Gramm.Per.Kilo.Meter; + } row[FCFINAL_LITERPER100KM] = data.FuelConsumptionFinalLiterPer100Kilometer(); if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { row[FCFINAL_LITERPER100TKM] = data.FuelConsumptionFinalLiterPer100Kilometer() / vehicleLoading.ConvertTo().Ton; } row[FCMAP] = data.FuelConsumptionPerSecond().ConvertTo().Gramm.Per.Hour; - row[FCMAPKM] = data.FuelConsumptionPerMeter().ConvertTo().Gramm.Per.Kilo.Meter; + + + var fuelConsumptionPerMeter = data.FuelConsumptionPerMeter(); + if (fuelConsumptionPerMeter != null) { + row[FCMAPKM] = fuelConsumptionPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; + } row[FCAUXC] = data.FuelConsumptionAuxStartStopCorrectedPerSecond().ConvertTo().Gramm.Per.Hour; - row[FCAUXCKM] = data.FuelConsumptionAuxStartStopCorrected().ConvertTo().Gramm.Per.Kilo.Meter; + var fuelConsumptionAuxStartStopCorrected = data.FuelConsumptionAuxStartStopCorrected(); + if (fuelConsumptionAuxStartStopCorrected != null) { + row[FCAUXCKM] = fuelConsumptionAuxStartStopCorrected.ConvertTo().Gramm.Per.Kilo.Meter; + } row[FCWHTCC] = data.FuelConsumptionWHTCCorrectedPerSecond().ConvertTo().Gramm.Per.Hour; - row[FCWHTCCKM] = data.FuelConsumptionWHTCCorrected().ConvertTo().Gramm.Per.Kilo.Meter; - row[CO2KM] = data.CO2PerMeter().ConvertTo().Gramm.Per.Kilo.Meter; - if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { - row[CO2TKM] = data.CO2PerMeter().ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton; + var fuelConsumptionWHTCCorrected = data.FuelConsumptionWHTCCorrected(); + if (fuelConsumptionWHTCCorrected != null) { + row[FCWHTCCKM] = fuelConsumptionWHTCCorrected.ConvertTo().Gramm.Per.Kilo.Meter; } + + var kilogramPerMeter = data.CO2PerMeter(); + if (kilogramPerMeter != null) { + row[CO2KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; + if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { + row[CO2TKM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton; + } + } + row[PWHEELPOS] = data.PowerWheelPositive().ConvertTo().Kilo.Watt; row[PBRAKE] = data.PowerBrake().ConvertTo().Kilo.Watt; row[EPOSICE] = data.EngineWorkPositive().ConvertTo().Kilo.Watt.Hour; diff --git a/VectoCoreTest/Models/Simulation/PwheelModeTests.cs b/VectoCoreTest/Models/Simulation/PwheelModeTests.cs index 367cab60e4..8ee9fb2796 100644 --- a/VectoCoreTest/Models/Simulation/PwheelModeTests.cs +++ b/VectoCoreTest/Models/Simulation/PwheelModeTests.cs @@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation jobContainer.WaitFinished(); //todo MK-2016-01-20: add sumdata file for pwheel mode tests. - ResultFileHelper.TestSumFile(@"TestData\Results\Pwheel\Atego_ges.v2.vsum", @"Pwheel.vsum"); + ResultFileHelper.TestSumFile(@"TestData\Results\Pwheel\Atego_ges.v2.vsum", @"TestData\Jobs\Pwheel.vsum"); //todo MK-2016-01-20: add moddata file for pwheel mode tests. ResultFileHelper.TestModFile(@"TestData\Results\Pwheel\Atego_ges_Gear2_pt1_rep1_actual.vmod", -- GitLab