diff --git a/VectoCommon/VectoCommon/Utils/SIExtensionMetods.cs b/VectoCommon/VectoCommon/Utils/SIExtensionMetods.cs new file mode 100644 index 0000000000000000000000000000000000000000..e7ee6be73107d20a678cc25c25d23979e77f10a4 --- /dev/null +++ b/VectoCommon/VectoCommon/Utils/SIExtensionMetods.cs @@ -0,0 +1,20 @@ +namespace TUGraz.VectoCommon.Utils { + public static class SIExtensionMetods + { + /// <summary> + /// Returns a default value if the SI object is null. + /// </summary> + /// <typeparam name="T">The SI Type.</typeparam> + /// <param name="self">The SI Instance.</param> + /// <param name="defaultValue">The default value.</param> + /// <returns>If self is null, the default value as SI-Type is returned. Otherwise self is returned.</returns> + /// <code> + /// NewtonMeter t = null; + /// var x = t.DefaultIfNull(0); + /// </code> + public static T DefaultIfNull<T>(this T self, double defaultValue) where T : SIBase<T> + { + return self ?? defaultValue.SI<T>(); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index 9757ba1c4eaa3f3f4be1b79d169de068e25f4913..44cae83e6e8b26d901084bb7120bdb95a145df2d 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -110,6 +110,11 @@ namespace TUGraz.VectoCore.OutputData string GetColumnName(FuelData.Entry fuelData, ModalResultField mrf); void Reset(); + + Second Duration { get; } + + Meter Distance { get; } + KilogramPerWattSecond VehicleLineCorrectionFactor(FuelData.Entry fuel); } public static class ModalDataContainerExtensions @@ -123,23 +128,7 @@ namespace TUGraz.VectoCore.OutputData { return data.GetValues<T>(field).Min(); } - - /// <summary> - /// Returns a default value if the SI object is null. - /// </summary> - /// <typeparam name="T">The SI Type.</typeparam> - /// <param name="self">The SI Instance.</param> - /// <param name="defaultValue">The default value.</param> - /// <returns>If self is null, the default value as SI-Type is returned. Otherwise self is returned.</returns> - /// <code> - /// NewtonMeter t = null; - /// var x = t.DefaultIfNull(0); - /// </code> - public static T DefaultIfNull<T>(this T self, double defaultValue) where T : SIBase<T> - { - return self ?? defaultValue.SI<T>(); - } - + public static MeterPerSquareSecond AccelerationsPositive(this IModalDataContainer data) { return data.GetValues<MeterPerSquareSecond>(ModalResultField.acc) @@ -163,7 +152,7 @@ namespace TUGraz.VectoCore.OutputData dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()) }) .Sum(x => x.a > 0.125 ? x.dt : 0.SI<Second>()).DefaultIfNull(0); - return 100 * (accelerationTimeShare / data.Duration()).Cast<Scalar>(); + return 100 * (accelerationTimeShare / data.Duration).Cast<Scalar>(); } public static Scalar DecelerationTimeShare(this IModalDataContainer data) @@ -173,7 +162,7 @@ namespace TUGraz.VectoCore.OutputData dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()) }) .Sum(x => x.a < -0.125 ? x.dt : 0.SI<Second>()).DefaultIfNull(0); - return 100 * (decelerationTimeShare / data.Duration()).Cast<Scalar>(); + return 100 * (decelerationTimeShare / data.Duration).Cast<Scalar>(); } public static Scalar CruiseTimeShare(this IModalDataContainer data) @@ -185,7 +174,7 @@ namespace TUGraz.VectoCore.OutputData }) .Sum(x => x.v >= 0.1.KMPHtoMeterPerSecond() && x.a.IsBetween(-0.125, 0.125) ? x.dt : 0.SI<Second>()) .DefaultIfNull(0); - return 100 * (cruiseTime / data.Duration()).Cast<Scalar>(); + return 100 * (cruiseTime / data.Duration).Cast<Scalar>(); } public static Scalar StopTimeShare(this IModalDataContainer data) @@ -195,12 +184,12 @@ namespace TUGraz.VectoCore.OutputData dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()) }) .Sum(x => x.v < 0.1.KMPHtoMeterPerSecond() ? x.dt : 0.SI<Second>()) ?? 0.SI<Second>(); - return 100 * (stopTime / data.Duration()).Cast<Scalar>(); + return 100 * (stopTime / data.Duration).Cast<Scalar>(); } public static MeterPerSquareSecond AccelerationAverage(this IModalDataContainer data) { - return data.TimeIntegral<MeterPerSecond>(ModalResultField.acc) / data.Duration(); + return data.TimeIntegral<MeterPerSecond>(ModalResultField.acc) / data.Duration; } public static Meter AltitudeDelta(this IModalDataContainer data) @@ -263,34 +252,6 @@ namespace TUGraz.VectoCore.OutputData return data.TimeIntegral<WattSecond>(ModalResultField.P_TC_loss); } - public static Second Duration(this IModalDataContainer data) - { - var time = data.GetValues<Second>(ModalResultField.time).ToList(); - var dt = data.GetValues<Second>(ModalResultField.simulationInterval).ToList(); - if (time.Count == 1) { - return time.First(); - } - return time.Max() - time.Min() + dt.First() / 2 + dt.Last() / 2; - } - - public static Meter Distance(this IModalDataContainer data) - { - var max = data.GetValues<Meter>(ModalResultField.dist).LastOrDefault() ?? 0.SI<Meter>(); - var first = data.GetValues( - r => new { - dist = r.Field<Meter>(ModalResultField.dist.GetName()), - vact = r.Field<MeterPerSecond>(ModalResultField.v_act.GetName()), - acc = r.Field<MeterPerSquareSecond>(ModalResultField.acc.GetName()), - dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()) - }).First(); - var min = 0.SI<Meter>(); - if (first != null && first.vact != null && first.acc != null && first.dt != null) { - min = first.dist - first.vact * first.dt - first.acc * first.dt * first.dt / 2.0; - } - - return max == null || min == null ? null : max - min; - } - public static WattSecond WorkTotalMechanicalBrake(this IModalDataContainer data) { return data.TimeIntegral<WattSecond>(ModalResultField.P_brake_loss); @@ -345,18 +306,18 @@ namespace TUGraz.VectoCore.OutputData public static Watt PowerWheelPositive(this IModalDataContainer data) { - return data.WorkWheelsPos() / data.Duration(); + return data.WorkWheelsPos() / data.Duration; } public static KilogramPerSecond FuelConsumptionPerSecond(this IModalDataContainer data, ModalResultField mrf, FuelData.Entry fuelData) { - return data.TimeIntegral<Kilogram>(data.GetColumnName(fuelData, mrf)) / data.Duration(); + return data.TimeIntegral<Kilogram>(data.GetColumnName(fuelData, mrf)) / data.Duration; } public static KilogramPerMeter FuelConsumptionPerMeter(this IModalDataContainer data, ModalResultField mrf, FuelData.Entry fuelData) { - var distance = data.Distance(); + var distance = data.Distance; if (distance == null || distance.IsEqual(0)) { return null; } @@ -377,15 +338,15 @@ namespace TUGraz.VectoCore.OutputData .Zip(simulationIntervals, (value, dt) => new { Dt = dt, Value = value * dt }) .Where(v => v.Value > 0).ToList(); if (values.Any()) { - return values.Sum(v => v.Value) / Duration(data); + return values.Sum(v => v.Value) / data.Duration; } return 0.SI<Watt>(); } public static MeterPerSecond Speed(this IModalDataContainer data) { - var distance = Distance(data); - var duration = Duration(data); + var distance = data.Distance; + var duration = data.Duration; if (distance == null || duration == null || duration.IsEqual(0)) { return null; } @@ -430,7 +391,7 @@ namespace TUGraz.VectoCore.OutputData { var integral = data.GetValues(x => x.Field<PerSecond>(ModalResultField.n_eng_avg.GetName()).Value() * x.Field<Second>(ModalResultField.simulationInterval.GetName()).Value()).Sum(); - return (integral / Duration(data).Value()).SI<PerSecond>(); + return (integral / data.Duration.Value()).SI<PerSecond>(); } public static PerSecond MaxEngineSpeed(this IModalDataContainer data) @@ -445,7 +406,7 @@ namespace TUGraz.VectoCore.OutputData tEng = x.Field<NewtonMeter>(ModalResultField.T_eng_fcmap.GetName()).DefaultIfNull(0), dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()) }).Sum(x => x.tMax.IsEqual(x.tEng, 5.SI<NewtonMeter>()) ? x.dt : 0.SI<Second>()) ?? 0.SI<Second>(); - return 100 * sum / Duration(data); + return 100 * sum / data.Duration; } /// <summary> @@ -490,7 +451,7 @@ namespace TUGraz.VectoCore.OutputData dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()) }) .Sum(x => x.DrivingBehavior == DrivingBehavior.Coasting ? x.dt : 0.SI<Second>()) ?? 0.SI<Second>(); - return 100 * sum / Duration(data); + return 100 * sum / data.Duration; } public static Scalar BrakingTimeShare(this IModalDataContainer data) @@ -500,7 +461,7 @@ namespace TUGraz.VectoCore.OutputData dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()) }) .Sum(x => x.DrivingBehavior == DrivingBehavior.Braking ? x.dt : 0.SI<Second>()) ?? 0.SI<Second>(); - return 100 * sum / Duration(data); + return 100 * sum / data.Duration; } public static Dictionary<uint, Scalar> TimeSharePerGear(this IModalDataContainer data, uint gearCount) @@ -519,7 +480,7 @@ namespace TUGraz.VectoCore.OutputData retVal[entry.Gear] += entry.dt.Value(); } - var duration = Duration(data).Value(); + var duration = data.Duration.Value(); for (uint i = 0; i <= gearCount; i++) { retVal[i] = 100 * retVal[i] / duration; } diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index 21ee99f4c1a3bb59587b4fe624d58da4848f8d4f..59e5ef8c01639d4186192e9c6512a85eceffba79 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -57,15 +57,20 @@ namespace TUGraz.VectoCore.OutputData private Exception SimException; protected internal readonly Dictionary<FuelData.Entry, Dictionary<ModalResultField, DataColumn>> FuelColumns = new Dictionary<FuelData.Entry, Dictionary<ModalResultField, DataColumn>>(); + private Second _duration; + private Meter _distance; public static readonly IList<ModalResultField> FuelConsumptionSignals = new[] { ModalResultField.FCMap, ModalResultField.FCNCVc, ModalResultField.FCWHTCc, ModalResultField.FCAAUX, ModalResultField.FCEngineStopStart, ModalResultField.FCFinal }; - public int JobRunId { get; private set; } - public string RunName { get; private set; } - public string CycleName { get; private set; } + private readonly Dictionary<String, SI> _timeIntegrals = new Dictionary<string, SI>(); + private readonly Dictionary<FuelType, KilogramPerWattSecond> _vehicleLine = new Dictionary<FuelType, KilogramPerWattSecond>(); + + public int JobRunId { get; } + public string RunName { get; } + public string CycleName { get; } public string RunSuffix { get; private set; } public bool WriteModalResults { get; set; } @@ -145,6 +150,37 @@ namespace TUGraz.VectoCore.OutputData { Data.Rows.Clear(); CurrentRow = Data.NewRow(); + ClearAggregateResults(); + } + + public Second Duration + { + get { return _duration ?? (_duration = CalcDuration()); } + } + + public Meter Distance + { + get { return _distance ?? (_distance = CalcDistance()); } + } + + public KilogramPerWattSecond VehicleLineCorrectionFactor(FuelData.Entry fuel) + { + if (_vehicleLine.ContainsKey(fuel.FuelType)) { + return _vehicleLine[fuel.FuelType]; + } + + double k, d, r; + VectoMath.LeastSquaresFitting( + GetValues( + x => x.Field<bool>(ModalResultField.IgnitionOn.GetName()) + ? new Point( + x.Field<SI>(ModalResultField.P_eng_fcmap.GetName()).Value(), + x.Field<SI>(GetColumnName(fuel, ModalResultField.FCFinal)).Value()) + : null).Where(x => x != null && x.Y > 0), + out k, out d, out r); + _vehicleLine[fuel.FuelType] = k.SI<KilogramPerWattSecond>(); + + return _vehicleLine[fuel.FuelType]; } public bool HasTorqueConverter { get; set; } @@ -153,6 +189,42 @@ namespace TUGraz.VectoCore.OutputData { Data.Rows.Add(CurrentRow); CurrentRow = Data.NewRow(); + ClearAggregateResults(); + } + + protected virtual void ClearAggregateResults() + { + _duration = null; + _distance = null; + _timeIntegrals.Clear(); + } + + protected virtual Second CalcDuration() + { + var time = GetValues<Second>(ModalResultField.time).ToList(); + var dt = GetValues<Second>(ModalResultField.simulationInterval).ToList(); + if (time.Count == 1) { + return time.First(); + } + return time.Last() - time.First() + dt.First() / 2 + dt.Last() / 2; + } + + protected virtual Meter CalcDistance() + { + var max = GetValues<Meter>(ModalResultField.dist).LastOrDefault() ?? 0.SI<Meter>(); + var first = GetValues( + r => new { + dist = r.Field<Meter>(ModalResultField.dist.GetName()), + vact = r.Field<MeterPerSecond>(ModalResultField.v_act.GetName()), + acc = r.Field<MeterPerSquareSecond>(ModalResultField.acc.GetName()), + dt = r.Field<Second>(ModalResultField.simulationInterval.GetName()) + }).First(); + var min = 0.SI<Meter>(); + if (first != null && first.vact != null && first.acc != null && first.dt != null) { + min = first.dist - first.vact * first.dt - first.acc * first.dt * first.dt / 2.0; + } + + return max == null || min == null ? null : max - min; } public IList<FuelData.Entry> FuelData @@ -332,11 +404,15 @@ namespace TUGraz.VectoCore.OutputData public T TimeIntegral<T>(ModalResultField field, Func<SI, bool> filter = null) where T : SIBase<T> { + return TimeIntegral<T>(field.GetName(), filter); } public T TimeIntegral<T>(string field, Func<SI, bool> filter = null) where T : SIBase<T> { + if (filter == null && _timeIntegrals.ContainsKey(field)) { + return (T)_timeIntegrals[field]; + } var result = 0.0; var idx = Data.Columns.IndexOf(field); for (var i = 0; i < Data.Rows.Count; i++) { @@ -349,7 +425,12 @@ namespace TUGraz.VectoCore.OutputData } } - return result.SI<T>(); + var retVal = result.SI<T>(); + ; + if (filter == null) { + _timeIntegrals[field] = retVal; + } + return retVal; } public IEnumerable<T> GetValues<T>(ModalResultField key) diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index b0dd779eb32f235d2cd8e855aca79dc65d06b512..6ee490abeaab00df8457b621979fa18206b18a6d 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -476,10 +476,10 @@ namespace TUGraz.VectoCore.OutputData row[VEHICLE_FUEL_TYPE] = string.Join(", ", modData.FuelData.Select(x => x.GetLabel())); - var totalTime = modData.Duration(); + var totalTime = modData.Duration; row[TIME] = (ConvertedSI)totalTime; - var distance = modData.Distance(); + var distance = modData.Distance; if (distance != null) { row[DISTANCE] = distance.ConvertToKiloMeter(); } @@ -529,8 +529,8 @@ namespace TUGraz.VectoCore.OutputData var workWHREl = modData.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr); var workWhrMech = - workWHREl / DeclarationData.AlternaterEfficiency; - var distance = modData.Distance(); - var duration = modData.Duration(); + var distance = modData.Distance; + var duration = modData.Duration; var kilogramCO2PerMeter = 0.SI<KilogramPerMeter>(); @@ -567,17 +567,11 @@ namespace TUGraz.VectoCore.OutputData var fcModSum = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel); - double k, d, r; - VectoMath.LeastSquaresFitting( - modData.GetValues( - x => x.Field<bool>(ModalResultField.IgnitionOn.GetName()) - ? new Point( - x.Field<SI>(ModalResultField.P_eng_fcmap.GetName()).Value(), x.Field<SI>(modData.GetColumnName(fuel, ModalResultField.FCFinal)).Value()) - : null).Where(x => x != null && x.Y > 0), - out k, out d, out r); - - var correction = k.SI<KilogramPerWattSecond>(); - + var correction = 0.SI<KilogramPerWattSecond>(); + if (!workWhrMech.IsEqual(0) || !workESS.IsEqual(0)) { + correction = modData.VehicleLineCorrectionFactor(fuel); + } + row[FcCol(K_VEHLINE, suffix)] = correction.ConvertToGramPerKiloWattHour(); var fcWHRCorr = fcModSum + correction * workWhrMech; diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index 9ccb6507191660a97a3415fec175c81f2013aa46..6dbd53c4d0454d45c5b41b56c501f31f19291c4d 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -140,7 +140,7 @@ namespace TUGraz.VectoCore.OutputData.XML EngineSpeedDrivingAvg = (entriesDriving.Sum(x => (x.nEng * x.dt).Value()) / drivingTime.Value()).SI<PerSecond>(); EngineSpeedDrivingMin = entriesDriving.Min(x => x.nEng); EngineSpeedDrivingMax = entriesDriving.Max(x => x.nEng); - Distance = data.Distance(); + Distance = data.Distance; var workESS = data.WorkAuxiliariesDuringEngineStop() + data.WorkEngineStart(); var workWHRel = data.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr); @@ -153,14 +153,11 @@ namespace TUGraz.VectoCore.OutputData.XML foreach (var entry in data.FuelData) { var col = data.GetColumnName(entry, ModalResultField.FCFinal); var fcSum = data.TimeIntegral<Kilogram>(col); - //FuelConsumptionTotal[entry.FuelType] = fcSum; - double k, d, s; - VectoMath.LeastSquaresFitting( - data.GetValues( - x => x.Field<bool>(ModalResultField.IgnitionOn.GetName()) ? new Point( - x.Field<SI>(ModalResultField.P_eng_fcmap.GetName()).Value(), x.Field<SI>(data.GetColumnName(entry, ModalResultField.FCFinal)).Value()) : null).Where(x => x != null && x.Y > 0), - out k, out d, out s); - var correction = k.SI<KilogramPerWattSecond>(); + + var correction = 0.SI<KilogramPerWattSecond>(); + if (!(workWhrMech + workESS).IsEqual(0)) { + correction = data.VehicleLineCorrectionFactor(entry); + } var fcTotalcorr = fcSum + correction * (workESS + workWhrMech); FuelConsumptionFinal[entry.FuelType] = fcTotalcorr; CO2Total += fcTotalcorr * entry.CO2PerFuelWeight; diff --git a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs index 1fd1402451127c21c88d69c0869cad08f0da72c5..2adaff9b179671424d381012ac888449934c40cf 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs @@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.OutputData.XML } var aux = data.Auxiliaries.FirstOrDefault(x => x.Key == Constants.Auxiliaries.IDs.Fan); - AverageFanPower = data.AuxiliaryWork(aux.Value) / data.Duration(); + AverageFanPower = data.AuxiliaryWork(aux.Value) / data.Duration; var cycleEntries = runData.Cycle.Entries.Pairwise().Select( x => new { PWheel = x.Item1.PWheel > 0 ? x.Item1.PWheel : 0.SI<Watt>(), diff --git a/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs b/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs index 64a4dcc89a5b64e358e7782cf660f6787a1c043b..7455f66961e44cd8ef50487348fa42c3bc394624 100644 --- a/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs +++ b/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs @@ -134,7 +134,7 @@ namespace TUGraz.VectoCore.Tests.Integration // restore data table before assertions modContainer.Data = modData; var fuel = modContainer.FuelData.First(); - var distance = modContainer.Distance(); + var distance = modContainer.Distance; var fcFinal = modContainer.FuelConsumptionPerMeter(ModalResultField.FCFinal, fuel); var fcVolumePerMeter = fuel.FuelDensity == null ? null : (fcFinal / fuel.FuelDensity) diff --git a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs index 465a206490d6ccfe68f064f793f46fc5222641df..fe1d6cccacb24e2a6a2ffac58eb6fac7a6285bf8 100644 --- a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs +++ b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs @@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Reports var totalTime = 50.SI<Second>(); var expected = initalSpeed * totalTime + acc / 2.0 * totalTime * totalTime; - Assert.AreEqual(expected.Value(), modData.Distance().Value(), 1e-6); + Assert.AreEqual(expected.Value(), modData.Distance.Value(), 1e-6); } diff --git a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs index edf11e45d24f8c0908a9e3d6895911579dce6086..db2db47f984c89af49c29341d8b8ac91cf9d8b3d 100644 --- a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs +++ b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs @@ -111,8 +111,8 @@ namespace TUGraz.VectoCore.Tests.Reports var sumData = VectoCSVFile.Read("testsumcalc_fixed.vsum", false, true); // duration: 500s, distance: 500m - Assert.AreEqual(500, modData.Duration().Value()); - Assert.AreEqual(500, modData.Distance().Value()); + Assert.AreEqual(500, modData.Duration.Value()); + Assert.AreEqual(500, modData.Distance.Value()); // 3kW * 500s => to kWh Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_air [kWh]"), 1e-3); diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index dee1955b346a66150ca5b34af0570309486e07c7..d63486729b67928f3cfe0ecfc5fbf5851c9ebb09 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -49,8 +49,10 @@ namespace TUGraz.VectoCore.Tests.Utils internal class MockModalDataContainer : IModalDataContainer { protected Dictionary<FuelData.Entry, Dictionary<ModalResultField, DataColumn>> FuelColumns = new Dictionary<FuelData.Entry, Dictionary<ModalResultField, DataColumn>>(); + private Second _duration; + private Meter _distance; + - public MockModalDataContainer() { Data = new ModalResults(); @@ -221,6 +223,21 @@ namespace TUGraz.VectoCore.Tests.Utils } + public Second Duration + { + get { return _duration; } + } + + public Meter Distance + { + get { return _distance; } + } + + public KilogramPerWattSecond VehicleLineCorrectionFactor(FuelData.Entry fuel) + { + return 0.SI<KilogramPerWattSecond>(); + } + public string RunName { get; set; } public string CycleName { get; set; } public string RunSuffix { get; set; }