diff --git a/VECTO/OutputData/JSONFileWriter.vb b/VECTO/OutputData/JSONFileWriter.vb index e9c79ce7289530d70c071c24d5c7710a2e68c6e3..ae1f75f1f9615357ff9232985d376b68200d48ae 100644 --- a/VECTO/OutputData/JSONFileWriter.vb +++ b/VECTO/OutputData/JSONFileWriter.vb @@ -42,9 +42,9 @@ Public Class JSONFileWriter body.Add("ModelName", eng.Model) - 'body.Add("Displacement", eng.Displacement.ConvertTo().Cubic.Centi.Meter.Value().ToString()) - 'body.Add("Displacement", eng.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter).Value().ToString()) - body.Add("Displacement", eng.Displacement.ConvertToCubicCentiMeter().Value().ToString()) + 'body.Add("Displacement", eng.Displacement.ConvertTo().Cubic.Centi.Meter.Value().ToString()) + 'body.Add("Displacement", eng.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter).Value().ToString()) + body.Add("Displacement", eng.Displacement.ConvertToCubicCentiMeter().ToString()) body.Add("IdlingSpeed", eng.IdleSpeed.AsRPM) body.Add("Inertia", eng.Inertia.Value()) @@ -202,44 +202,44 @@ Public Class JSONFileWriter torqueLimits.Add(entry.Gear().ToString(), entry.MaxTorque.Value().ToString()) Next - '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo().Ton.Value()}, - '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo(Unit.SI.Ton).Value()}, - '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo().Milli.Meter.Value()}, - '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo(Unit.SI.Milli.Meter).Value()}, - Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From { - {"SavedInDeclMode", Cfg.DeclMode}, - {"VehCat", vehicle.VehicleCategory.ToString()}, - {"LegislativeClass", vehicle.LegislativeClass.ToString()}, - {"CurbWeight", vehicle.CurbMassChassis.Value()}, - {"CurbWeightExtra", vehicle.CurbMassExtra.Value()}, - {"Loading", vehicle.Loading.Value()}, - {"MassMax", vehicle.GrossVehicleMassRating.ConvertToTon().Value()}, - {"rdyn", vehicle.DynamicTyreRadius.ConvertToMilliMeter().Value()}, - {"CdCorrMode", airdrag.CrossWindCorrectionMode.GetName()}, - {"CdCorrFile", - If((airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependentCorrectionFactor OrElse - airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.VAirBetaLookupTable) AndAlso - Not airdrag.CrosswindCorrectionMap Is Nothing, GetRelativePath(airdrag.CrosswindCorrectionMap.Source, basePath), - "") - }, - {"Retarder", retarderOut}, - {"Angledrive", angledriveOut}, - {"PTO", ptoOut}, - {"TorqueLimits", torqueLimits}, - {"IdlingSpeed", vehicle.EngineIdleSpeed.AsRPM}, - {"AxleConfig", New Dictionary(Of String, Object) From { - {"Type", vehicle.AxleConfiguration.GetName()}, - {"Axles", From axle In vehicle.Axles Select New Dictionary(Of String, Object) From { - {"Inertia", axle.Inertia.Value()}, - {"Wheels", axle.Wheels}, - {"AxleWeightShare", axle.AxleWeightShare}, - {"TwinTyres", axle.TwinTyres}, - {"RRCISO", axle.RollResistanceCoefficient}, - {"FzISO", axle.TyreTestLoad.Value()}, - {"Type", axle.AxleType.ToString()} - }}}}} - - If (Not IsNothing(airdrag.AirDragArea)) Then + '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo().Ton.Value()}, + '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo(Unit.SI.Ton).Value()}, + '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo().Milli.Meter.Value()}, + '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo(Unit.SI.Milli.Meter).Value()}, + Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From { + {"SavedInDeclMode", Cfg.DeclMode}, + {"VehCat", vehicle.VehicleCategory.ToString()}, + {"LegislativeClass", vehicle.LegislativeClass.ToString()}, + {"CurbWeight", vehicle.CurbMassChassis.Value()}, + {"CurbWeightExtra", vehicle.CurbMassExtra.Value()}, + {"Loading", vehicle.Loading.Value()}, + {"MassMax", vehicle.GrossVehicleMassRating.ConvertToTon()}, + {"rdyn", vehicle.DynamicTyreRadius.ConvertToMilliMeter()}, + {"CdCorrMode", airdrag.CrossWindCorrectionMode.GetName()}, + {"CdCorrFile", + If((airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependentCorrectionFactor OrElse + airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.VAirBetaLookupTable) AndAlso + Not airdrag.CrosswindCorrectionMap Is Nothing, GetRelativePath(airdrag.CrosswindCorrectionMap.Source, basePath), + "") + }, + {"Retarder", retarderOut}, + {"Angledrive", angledriveOut}, + {"PTO", ptoOut}, + {"TorqueLimits", torqueLimits}, + {"IdlingSpeed", vehicle.EngineIdleSpeed.AsRPM}, + {"AxleConfig", New Dictionary(Of String, Object) From { + {"Type", vehicle.AxleConfiguration.GetName()}, + {"Axles", From axle In vehicle.Axles Select New Dictionary(Of String, Object) From { + {"Inertia", axle.Inertia.Value()}, + {"Wheels", axle.Wheels}, + {"AxleWeightShare", axle.AxleWeightShare}, + {"TwinTyres", axle.TwinTyres}, + {"RRCISO", axle.RollResistanceCoefficient}, + {"FzISO", axle.TyreTestLoad.Value()}, + {"Type", axle.AxleType.ToString()} + }}}}} + + If (Not IsNothing(airdrag.AirDragArea)) Then body("CdA") = airdrag.AirDragArea.Value() End If If (Not IsNothing(vehicle.Height)) Then diff --git a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs index 55bdacd99acd952eb0db13fd596e8f2467825eef..02a521b0e0a39d7cc827a675602e5d25c954852d 100644 --- a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs +++ b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs @@ -273,8 +273,19 @@ namespace TUGraz.VectoCommon.Utils return self.ToString("F" + decimals.Value, CultureInfo.InvariantCulture); } - //[DebuggerStepThrough] - [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string ToXMLFormat(this ConvertedSI self, uint? decimals = null) + { + decimals = decimals ?? 2; + return ((double)self).ToString("F" + decimals.Value, CultureInfo.InvariantCulture); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static string ToMinSignificantDigits(this ConvertedSI self, uint? significant = null, uint? decimals = null) + { + return ToMinSignificantDigits((double)self, significant, decimals); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string ToMinSignificantDigits(this double self, uint? significant = null, uint? decimals = null) { significant = significant ?? 3; diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs index d59280b57d04f09509bc8893f52b132c7a429982..4f2186ef0ce080d4106b511ccc40c5df896f4cd8 100644 --- a/VectoCommon/VectoCommon/Utils/SI.cs +++ b/VectoCommon/VectoCommon/Utils/SI.cs @@ -140,6 +140,7 @@ namespace TUGraz.VectoCommon.Utils public class PerSquareSecond : SIBase<PerSquareSecond> { private static readonly int[] Units = { 0, 0, -2, 0, 0, 0, 0 }; + [DebuggerHidden] private PerSquareSecond(double val) : base(val, Units) { } @@ -219,6 +220,7 @@ namespace TUGraz.VectoCommon.Utils public class KilogramPerMeter : SIBase<KilogramPerMeter> { private static readonly int[] Units = { 1, -1, 0, 0, 0, 0, 0 }; + [DebuggerHidden] private KilogramPerMeter(double val) : base(val, Units) { } } @@ -807,8 +809,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerStepThrough] public static T Create(double val) { - if (val == 0) - { + if (val == 0) { return ZeroPrototype; } @@ -1004,21 +1005,16 @@ namespace TUGraz.VectoCommon.Utils Val = val; _units = units; - if (double.IsNaN(Val)) - { + if (double.IsNaN(Val)) { throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString()); } - if (double.IsInfinity(Val)) - { + if (double.IsInfinity(Val)) { throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString()); } } - public SI(UnitInstance si, double val = 0) : this(val * si.Factor, si.GetSIUnits()) - { - - } + public SI(UnitInstance si, double val = 0) : this(val * si.Factor, si.GetSIUnits()) { } /// <summary> /// Initializes a new instance of the <see cref="SI"/> class which copies the units from an already existing SI. @@ -1028,40 +1024,6 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] private SI(double val, SI unit) : this(val, unit._units) { } - [DebuggerHidden] - private SI(SI si, double factor, int[] unitsParam) - { - Val = si.Val / factor; - _units = unitsParam; - - if (double.IsNaN(Val)) - { - throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString()); - } - - if (double.IsInfinity(Val)) - { - throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString()); - } - } - - //public SI ConvertTo(UnitInstance si) - //{ - - // if (!SIUtils.CompareUnits(_units, si.GetSIUnits())) - // { - // throw new VectoException( - // "Unit missing. Conversion not possible. [{0}] does not contain a [{1}].", - // GetUnitString(_units), si.GetSIUnits()); - // } - - // var factorValue = si.Factor; - - - - // return new SI(this, unitsParam: si.GetSIUnits(), factor: factorValue); - //} - /// <summary> /// Casts the SI Unit to the concrete unit type (if the units allow such an cast). /// </summary> @@ -1071,8 +1033,7 @@ namespace TUGraz.VectoCommon.Utils { var si = ToBasicUnits(); var t = SIBase<T>.Create(si.Val); - if (!si.HasEqualUnit(t)) - { + if (!si.HasEqualUnit(t)) { throw new VectoException("SI Unit Conversion failed: From {0} to {1}", si, t); } return t; @@ -1127,8 +1088,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static SI operator +(SI si1, SI si2) { - if (!si1.HasEqualUnit(si2)) - { + if (!si1.HasEqualUnit(si2)) { throw new VectoException("Operator '+' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2); } @@ -1139,8 +1099,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static SI operator -(SI si1, SI si2) { - if (!si1.HasEqualUnit(si2)) - { + if (!si1.HasEqualUnit(si2)) { throw new VectoException("Operator '-' can only operate on SI Objects with the same unit. Got: {0} - {1}", si1, si2); } return new SI(si1.Val - si2.Val, si1); @@ -1173,18 +1132,14 @@ namespace TUGraz.VectoCommon.Utils public static SI operator /(SI si1, SI si2) { double result; - try - { - result = si1.Val / (si2.Val); + try { + result = si1.Val / si2.Val; // bad cases: Infinity = x / 0.0 (for x != 0), NaN = 0.0 / 0.0 - if (double.IsInfinity(result) || double.IsNaN(result)) - { + if (double.IsInfinity(result) || double.IsNaN(result)) { throw new DivideByZeroException(); } - } - catch (DivideByZeroException ex) - { + } catch (DivideByZeroException ex) { throw new VectoException( string.Format("Can not compute division by zero ([{0}] / 0[{1}])", si1.GetUnitString(), si2.GetUnitString()), ex); } @@ -1197,8 +1152,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static SI operator /(SI si1, double d) { - if (d.IsEqual(0)) - { + if (d.IsEqual(0)) { throw new VectoException(string.Format("Can not compute division by zero ([{0}] / 0)", si1.GetUnitString()), new DivideByZeroException()); } @@ -1208,20 +1162,18 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static SI operator /(double d, SI si1) { - if (si1.IsEqual(0)) - { + if (si1.IsEqual(0)) { throw new VectoException(string.Format("Can not compute division by zero (x / 0[{0}])", si1.GetUnitString()), new DivideByZeroException()); } - return new SI(d / (si1.Val), si1._units.Select(u => -u).ToArray()); + return new SI(d / si1.Val, si1._units.Select(u => -u).ToArray()); } [DebuggerHidden] public static bool operator <(SI si1, SI si2) { - if (!si1.HasEqualUnit(si2)) - { + if (!si1.HasEqualUnit(si2)) { throw new VectoException("Operator '<' can only operate on SI Objects with the same unit. Got: {0} < {1}", si1, si2); } return si1.Val < si2.Val; @@ -1236,8 +1188,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static bool operator >(SI si1, SI si2) { - if (!si1.HasEqualUnit(si2)) - { + if (!si1.HasEqualUnit(si2)) { throw new VectoException("Operator '>' can only operate on SI Objects with the same unit. Got: {0} > {1}", si1, si2); } return si1.Val > si2.Val; @@ -1264,8 +1215,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static bool operator <=(SI si1, SI si2) { - if (!si1.HasEqualUnit(si2)) - { + if (!si1.HasEqualUnit(si2)) { throw new VectoException("Operator '<=' can only operate on SI Objects with the same unit. Got: {0} <= {1}", si1, si2); } @@ -1281,8 +1231,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public static bool operator >=(SI si1, SI si2) { - if (!si1.HasEqualUnit(si2)) - { + if (!si1.HasEqualUnit(si2)) { throw new VectoException("Operator '>=' can only operate on SI Objects with the same unit. Got: {0} >= {1}", si1, si2); } @@ -1338,8 +1287,7 @@ namespace TUGraz.VectoCommon.Utils /// </summary> public string GetUnitString(int[] units = null) { - if (units == null) - { + if (units == null) { units = _units; } return Unit.GetUnitString(units); @@ -1352,8 +1300,7 @@ namespace TUGraz.VectoCommon.Utils private string ToString(string format) { - if (string.IsNullOrEmpty(format)) - { + if (string.IsNullOrEmpty(format)) { format = "F4"; } @@ -1384,17 +1331,15 @@ namespace TUGraz.VectoCommon.Utils /// </returns> public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) - { + if (ReferenceEquals(null, obj)) { return false; } - if (ReferenceEquals(this, obj)) - { + if (ReferenceEquals(this, obj)) { return true; } var other = obj as SI; - return other != null && Val.Equals(other.Val ) && HasEqualUnit(other); + return other != null && Val.Equals(other.Val) && HasEqualUnit(other); } /// <summary> @@ -1405,7 +1350,8 @@ namespace TUGraz.VectoCommon.Utils /// <returns></returns> public bool IsEqual(SI si, SI tolerance = null) { - return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) && Val.IsEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() )); + return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) && + Val.IsEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value()); } /// <summary> @@ -1417,7 +1363,7 @@ namespace TUGraz.VectoCommon.Utils [DebuggerHidden] public bool IsEqual(double val, double tolerance = DoubleExtensionMethods.Tolerance) { - return Val.IsEqual(val, tolerance); + return Val.IsEqual(val, tolerance); } /// <summary> @@ -1428,16 +1374,14 @@ namespace TUGraz.VectoCommon.Utils /// <returns></returns> public bool IsSmaller(SI si, SI tolerance = null) { - if (!HasEqualUnit(si)) - { + if (!HasEqualUnit(si)) { throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si); } - if (tolerance != null && !HasEqualUnit(tolerance)) - { + if (tolerance != null && !HasEqualUnit(tolerance)) { throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance); } - return Val.IsSmaller(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() )); + return Val.IsSmaller(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value()); } /// <summary> @@ -1448,12 +1392,11 @@ namespace TUGraz.VectoCommon.Utils /// <returns></returns> public bool IsSmaller(SI si, double tolerance) { - if (!HasEqualUnit(si)) - { + if (!HasEqualUnit(si)) { throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si); } - return Val.IsSmaller(si.Val, tolerance); + return Val.IsSmaller(si.Val, tolerance); } /// <summary> @@ -1464,16 +1407,14 @@ namespace TUGraz.VectoCommon.Utils /// <returns></returns> public bool IsSmallerOrEqual(SI si, SI tolerance = null) { - if (!HasEqualUnit(si)) - { + if (!HasEqualUnit(si)) { throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si); } - if (tolerance != null && !HasEqualUnit(tolerance)) - { + if (tolerance != null && !HasEqualUnit(tolerance)) { throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance); } - return Val.IsSmallerOrEqual(si.Val , tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value())); + return Val.IsSmallerOrEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value()); } /// <summary> @@ -1484,16 +1425,14 @@ namespace TUGraz.VectoCommon.Utils /// <returns></returns> public bool IsGreater(SI si, SI tolerance = null) { - if (!HasEqualUnit(si)) - { + if (!HasEqualUnit(si)) { throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si); } - if (tolerance != null && !HasEqualUnit(tolerance)) - { + if (tolerance != null && !HasEqualUnit(tolerance)) { throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance); } - return Val.IsGreater(si.Val , tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() )); + return Val.IsGreater(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value()); } /// <summary> @@ -1505,12 +1444,11 @@ namespace TUGraz.VectoCommon.Utils [DebuggerStepThrough] public bool IsGreater(SI si, double tolerance) { - if (!HasEqualUnit(si)) - { + if (!HasEqualUnit(si)) { throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si); } - return Val.IsGreater(si.Val , tolerance); + return Val.IsGreater(si.Val, tolerance); } /// <summary> @@ -1522,16 +1460,14 @@ namespace TUGraz.VectoCommon.Utils [DebuggerStepThrough] public bool IsGreaterOrEqual(SI si, SI tolerance = null) { - if (!HasEqualUnit(si)) - { + if (!HasEqualUnit(si)) { throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si); } - if (tolerance != null && !HasEqualUnit(tolerance)) - { + if (tolerance != null && !HasEqualUnit(tolerance)) { throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance); } - return Val.IsGreaterOrEqual(si.Val , tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() )); + return Val.IsGreaterOrEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value()); } /// <summary> @@ -1584,8 +1520,7 @@ namespace TUGraz.VectoCommon.Utils public override int GetHashCode() { - unchecked - { + unchecked { // ReSharper disable once NonReadonlyMemberInGetHashCode var hashCode = Val.GetHashCode(); hashCode = (hashCode * 397) ^ (_units != null ? _units.GetHashCode() : 0); @@ -1596,26 +1531,29 @@ namespace TUGraz.VectoCommon.Utils public int CompareTo(object obj) { var si = obj as SI; - if (si == null) - { + if (si == null) { return 1; } - if (!HasEqualUnit(si)) - { - //if (SIUtils.GetnumberofSIUnits(si.Units) >= SIUtils.GetnumberofSIUnits(Units)) - if (si._units.Sum<int>(n => Math.Abs(n)) >= _units.Sum<int>(n => Math.Abs(n))) - { - return -1; + if (!HasEqualUnit(si)) { + var sum1 = 0; + var sum2 = 0; + for (var i = 0; i < _units.Length; i++) { + sum1 = Math.Abs(si._units[i]); + sum2 = Math.Abs(_units[i]); } - return 1; + return sum1 >= sum2 ? 1 : -1; } - if (this > si) - { + if (this > si) { return 1; } - return this < si ? -1 : 0; + + if (this < si) { + return -1; + } + + return 0; } public static bool operator ==(SI left, SI right) @@ -1643,10 +1581,9 @@ namespace TUGraz.VectoCommon.Utils outputFactor = outputFactor ?? 1.0; showUnit = showUnit ?? false; - if (showUnit.Value) - { + if (showUnit.Value) { return (Val * outputFactor.Value).ToString("F" + decimals.Value, CultureInfo.InvariantCulture) + " [" + - GetUnitString() + "]"; + GetUnitString() + "]"; } return (Val * outputFactor.Value).ToString("F" + decimals.Value, CultureInfo.InvariantCulture); @@ -1674,7 +1611,7 @@ namespace TUGraz.VectoCommon.Utils public bool Equals(T x, T y) { - return x.IsEqual(y.Value(), _precision); + return y != null && x != null && x.IsEqual(y.Value(), _precision); } public int GetHashCode(T obj) @@ -1683,4 +1620,4 @@ namespace TUGraz.VectoCommon.Utils } } } -} +} \ No newline at end of file diff --git a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs index 3c025710a1c52c03e2c7b18360346b20f94f6a0b..ae8f969434f74336e91772dd4ca49e0bde650905 100644 --- a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs +++ b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs @@ -1,124 +1,130 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Globalization; namespace TUGraz.VectoCommon.Utils { - - //class: SummaryDataContainer : LoggingObject, IDisposable - //method: public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData) - // //row[DISTANCE] = distance.ConvertTo(Unit.SI.Kilo.Meter); - // row[DISTANCE] = distance.ConvertToKiloMeter(); - // row[CO2_TKM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / vehicleLoading.ConvertToTon(); - // row[SPEED] = speed.ConvertToKiloMeterPerHour(); - // row[CO2_KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter(); - // row[CO2_TKM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / vehicleLoading.ConvertToTon(); - // row[CO2_M3KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / cargoVolume; - // ConvertedSI ConvertToGrammPerHour(...) - // - // row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter(); - // ConvertedSI ConvertToKiloWattHour(..) - - //method: private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, - // row[FCFINAL_LITERPER100TKM] = fcPer100lkm / - // vehicleLoading.ConvertToTon(); - // -------------------- - // SI Data Type are used - public class ConvertedSI : SI + public class ConvertedSI { + private readonly double _value; + private readonly string _units; - private string _units; - //private double _value; - - public ConvertedSI(double value,UnitInstance ui,string units) :base(ui,value) + public ConvertedSI(double value, string units) { + _value = value; _units = units; - // _value = value; - } - //public override string ToString() - //{ - // return ToString(null); - //} - - //private string ToString(string format) - //{ - // if (string.IsNullOrEmpty(format)) - // { - // format = "F4"; - // } - - // return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:" + format + "} [{2}]", _value, format, _units); - //} - - //public static implicit operator SI(ConvertedSI convertedSI) - //{ - // return new SI(Unit.SI,convertedSI._value); - //} + } + + public static implicit operator double(ConvertedSI self) + { + return self._value; + } + + public static implicit operator ConvertedSI(SI self) + { + return new ConvertedSI(self.Value(), self.GetUnitString()); + } + + public override string ToString() + { + return _value.ToString(CultureInfo.InvariantCulture); // + " [" + _units + "]"; + } } public static class SIConvertExtensionMethods { + private const int Kilo = 1000; + private const int SecondsPerHour = 60 * 60; + public static ConvertedSI ConvertToGramm(this SI value) { - return new ConvertedSI(value.Value()*1000, Unit.SI.Kilo.Gramm, "g"); + return new ConvertedSI(value.Value() * Kilo, "g"); } public static ConvertedSI ConvertToTon(this SI value) { - return new ConvertedSI(value.Value() * 1000, Unit.SI.Kilo.Gramm, "Ton"); + return new ConvertedSI(value.Value() * Kilo, "Ton"); } public static ConvertedSI ConvertToKiloMeterPerHour(this SI value) { - return new ConvertedSI(value.Value() / 1000 *60*60 , Unit.SI.Kilo.Meter.Per.Hour, "km/h"); + return new ConvertedSI(value.Value() * SecondsPerHour / Kilo, "km/h"); } public static ConvertedSI ConvertToGrammPerKiloMeter(this SI value) { - return new ConvertedSI(value.Value() * 1000 / 1000, Unit.SI.Gramm.Per.Kilo.Meter, "g/km"); + return value == null ? null : new ConvertedSI(value.Value() * Kilo / Kilo, "g/km"); + } + + public static ConvertedSI ConvertToLiterPer100Kilometer(this SI value) + { + return new ConvertedSI(value.Value() * (10*10*10) / (100*1000), "l/100km"); + } + + public static ConvertedSI ConvertToLiterPer100TonKiloMeter(this SI value) + { + const int CubicMeterToLiter = 10 * 10 * 10; + const int MeterTo100KiloMeter = 100 * 1000; + const int KilogrammToTon = 1000; + return new ConvertedSI(value.Value() * CubicMeterToLiter / (MeterTo100KiloMeter * KilogrammToTon), "l/100tkm"); + } + + + + public static ConvertedSI ConvertToLiterPerCubicMeter100KiloMeter(this SI value) + { + const int CubicMeterToLiter = 10 * 10 * 10; + const int MeterTo100KiloMeter = 100 * 1000; + return new ConvertedSI(value.Value() * CubicMeterToLiter / MeterTo100KiloMeter, "l/100m^3km"); } + public static ConvertedSI ConvertToGrammPerHour(this SI value) { - return new ConvertedSI(value.Value() * 1000 / 60 / 60, Unit.SI.Gramm.Per.Hour, "g/h"); + return new ConvertedSI(value.Value() * Kilo / SecondsPerHour, "g/h"); } public static ConvertedSI ConvertToKiloMeter(this SI value) { - return new ConvertedSI(value.Value() / 1000, Unit.SI.Kilo.Meter, "km"); + return new ConvertedSI(value.Value() / Kilo, "km"); } public static ConvertedSI ConvertToCubicCentiMeter(this SI value) { - return new ConvertedSI(value.Value() * 100 * 100 * 100, Unit.SI.Cubic.Centi.Meter, "cm^3"); + return new ConvertedSI(value.Value() * 100 * 100 * 100, "cm^3"); } - public static ConvertedSI ConvertToKiloWattHour(this SI value) + public static ConvertedSI ConvertToGrammPerCubicMeterKiloMeter(this SI value) { - return new ConvertedSI(value.Value() / 1000/60/60, Unit.SI.Kilo.Watt.Hour, "kWh"); + return new ConvertedSI(value.Value() * Kilo / Kilo * Kilo / Kilo / Kilo / Kilo, "g/m^3km"); } - public static ConvertedSI ConvertToKiloWatt(this SI value) + + public static ConvertedSI ConvertToGrammPerTonKilometer(this SI value) { - return new ConvertedSI(value.Value() / 1000, Unit.SI.Kilo.Watt, "kW"); + return new ConvertedSI(value.Value() * Kilo / Kilo * Kilo, "g/tkm"); } - public static ConvertedSI ConvertToRoundsPerMinute(this SI value) + + public static ConvertedSI ConvertToLiterPer100KiloMeter(this SI value) { - return new ConvertedSI(value.Value() * 2 * Math.PI / 60, Unit.SI.Rounds.Per.Minute ,"rpm"); + return new ConvertedSI(value.Value() * 10 * 10 * 10 * 100 * Kilo, "l/100km"); } - public static ConvertedSI ConvertToKiloGrammPerSecond(this SI value) + + public static ConvertedSI ConvertToKiloWattHour(this SI value) { - return new ConvertedSI(value.Value() , Unit.SI.Kilo.Gramm.Per.Second, "kg/s"); + return new ConvertedSI(value.Value() / Kilo / SecondsPerHour, "kWh"); } - public static ConvertedSI ConvertToCubicDeziMeter(this SI value) + public static ConvertedSI ConvertToKiloWatt(this SI value) { - return new ConvertedSI(value.Value()*10*10*10, Unit.SI.Cubic.Dezi.Meter, "dm^3"); + return new ConvertedSI(value.Value() / Kilo, "kW"); } - public static ConvertedSI ConvertToRadianPerSecond(this SI value) + + public static ConvertedSI ConvertToRoundsPerMinute(this SI value) + { + return new ConvertedSI(value.Value() * 2 * Math.PI / 60, "rpm"); + } + public static ConvertedSI ConvertToCubicDeziMeter(this SI value) { - return new ConvertedSI(value.Value(), Unit.SI.Radian.Per.Second, "rps"); + return new ConvertedSI(value.Value() * 10 * 10 * 10, "dm^3"); } public static ConvertedSI ConvertToMilliMeter(this SI value) { - return new ConvertedSI(value.Value() * 1000, Unit.SI.Milli.Meter, "mm"); + return new ConvertedSI(value.Value() * Kilo, "mm"); } } } diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj index 86c6b32a5c717ddf7f24b5eedba7f2a9b464c5e2..a722dbc8eb38948911159856c9764f23cd01234d 100644 --- a/VectoCommon/VectoCommon/VectoCommon.csproj +++ b/VectoCommon/VectoCommon/VectoCommon.csproj @@ -90,6 +90,7 @@ <Compile Include="Utils\EnumHelper.cs" /> <Compile Include="Utils\IntExtensionMethods.cs" /> <Compile Include="Utils\SI.cs" /> + <Compile Include="Utils\SIConvertExtensionMethods.cs" /> <Compile Include="Utils\SIUtils.cs" /> <Compile Include="Utils\StringExtensionMethods.cs" /> <Compile Include="Utils\Validation.cs" /> diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs index b2ae45d7430964bd7fa43052334ff370c92bbb2e..298cfa6d6e5587029bcea8907e3a3d83ff0d352a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs @@ -88,30 +88,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine return new FuelConsumptionMap.Entry( engineSpeed: row.ParseDouble(0).RPMtoRad(), torque: row.ParseDouble(1).SI<NewtonMeter>(), - fuelConsumption: - //row.ParseDouble(2).SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>() - //row.ParseDouble(2).SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Cast<KilogramPerSecond>() - row.ParseDouble(2).SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Cast<KilogramPerSecond>() + fuelConsumption: row.ParseDouble(2).SI(Unit.SI.Gramm.Per.Hour).Cast<KilogramPerSecond>() ); } private static FuelConsumptionMap.Entry CreateFromColumNames(DataRow row) { return new FuelConsumptionMap.Entry( - //engineSpeed: row.ParseDouble(Fields.EngineSpeed).SI().Rounds.Per.Minute.Cast<PerSecond>(), - engineSpeed: row.ParseDouble(Fields.EngineSpeed).SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>(), - torque: row.ParseDouble(Fields.Torque).SI<NewtonMeter>(), - fuelConsumption: - row.ParseDouble(Fields.FuelConsumption) - .SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond() - .Cast<KilogramPerSecond>() - //row.ParseDouble(Fields.FuelConsumption) - // .SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI - // .Kilo.Gramm.Per.Second).Cast<KilogramPerSecond>() - //row.ParseDouble(Fields.FuelConsumption) - // .SI() - // .Gramm.Per.Hour.ConvertTo() - // .Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>() + engineSpeed: row.ParseDouble(Fields.EngineSpeed).RPMtoRad(), + torque: row.SI<NewtonMeter>(Fields.Torque), + fuelConsumption: row.ParseDouble(Fields.FuelConsumption).SI(Unit.SI.Gramm.Per.Hour).Cast<KilogramPerSecond>() ); } diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index 3ac16a694decc608092db9ba7c286ee7bba810f1..be66f46e050f65237b376c97305d68405bb7c59a 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -365,7 +365,7 @@ namespace TUGraz.VectoCore.OutputData return data.TimeIntegral<Kilogram>(ModalResultField.FCFinal) / distance; } - public static SI FuelConsumptionFinalLiterPer100Kilometer(this IModalDataContainer data) + public static SquareMeter FuelConsumptionFinalVolumePerMeter(this IModalDataContainer data) { var fuelConsumptionFinal = data.FuelConsumptionFinal(); if (fuelConsumptionFinal == null || data.FuelData.FuelDensity == null) { @@ -373,10 +373,7 @@ namespace TUGraz.VectoCore.OutputData } var fcVolumePerMeter = fuelConsumptionFinal / data.FuelData.FuelDensity; - // fcVolumePerMeter = [m^2] - //return fcVolumePerMeter.ConvertTo().Cubic.Dezi.Meter * 100.SI().Kilo.Meter; - //return fcVolumePerMeter.ConvertTo(Unit.SI.Cubic.Dezi.Meter) * 100.SI(Unit.SI.Kilo.Meter); - return fcVolumePerMeter.ConvertToCubicDeziMeter() * 100.SI(Unit.SI.Kilo.Meter); + return fcVolumePerMeter.Cast<SquareMeter>(); } public static KilogramPerMeter CO2PerMeter(this IModalDataContainer data) diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 1ad9ede4b3b2a08c44b9a8633a728c48e0f932ee..4be8313376835ccb2a758bd7f4c39f3042c43707 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -1,731 +1,642 @@ -/* -* This file is part of VECTO. -* -* Copyright © 2012-2017 European Union -* -* Developed by Graz University of Technology, -* Institute of Internal Combustion Engines and Thermodynamics, -* Institute of Technical Informatics -* -* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved -* by the European Commission - subsequent versions of the EUPL (the "Licence"); -* You may not use VECTO except in compliance with the Licence. -* You may obtain a copy of the Licence at: -* -* https://joinup.ec.europa.eu/community/eupl/og_page/eupl -* -* Unless required by applicable law or agreed to in writing, VECTO -* distributed under the Licence is distributed on an "AS IS" basis, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the Licence for the specific language governing permissions and -* limitations under the Licence. -* -* Authors: -* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology -* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology -* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology -* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology -* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology -* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology -*/ - -using System; -using System.Data; -using System.Linq; -using System.Runtime.CompilerServices; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Configuration; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.SimulationComponent.Data; - -// ReSharper disable MemberCanBePrivate.Global -- used by API! - -namespace TUGraz.VectoCore.OutputData -{ - public delegate void WriteSumData(IModalDataContainer data); - - /// <summary> - /// Class for the sum file in vecto. - /// </summary> - public class SummaryDataContainer : LoggingObject, IDisposable - { - // ReSharper disable InconsistentNaming - public const string INTERNAL_PREFIX = "INTERNAL"; - public const string SORT = INTERNAL_PREFIX + " Sorting"; - public const string JOB = "Job [-]"; - public const string INPUTFILE = "Input File [-]"; - public const string CYCLE = "Cycle [-]"; - public const string STATUS = "Status"; - public const string CURB_MASS = "Corrected Actual Curb Mass [kg]"; - public const string LOADING = "Loading [kg]"; - - public const string VEHICLE_MANUFACTURER = "Vehicle manufacturer [-]"; - public const string VIN_NUMBER = "VIN number"; - public const string VEHICLE_MODEL = "Vehicle model [-]"; - - public const string ENGINE_MANUFACTURER = "Engine manufacturer [-]"; - public const string ENGINE_MODEL = "Engine model [-]"; - public const string ENGINE_FUEL_TYPE = "Engine fuel type [-]"; - public const string ENGINE_WHTC_URBAN = "Engine WHTCUrban"; - public const string ENGINE_WHTC_RURAL = "Engine WHTCRural"; - public const string ENGINE_WHTC_MOTORWAY = "Engine WHTCMotorway"; - public const string ENGINE_BF_COLD_HOT = "Engine BFColdHot"; - public const string ENGINE_CF_REG_PER = "Engine CFRegPer"; - public const string ENGINE_ACTUAL_CORRECTION_FACTOR = "Engine actual CF"; - public const string ENGINE_RATED_POWER = "Engine rated power [kW]"; - public const string ENGINE_IDLING_SPEED = "Engine idling speed [rpm]"; - public const string ENGINE_RATED_SPEED = "Engine rated speed [rpm]"; - public const string ENGINE_DISPLACEMENT = "Engine displacement [ccm]"; - - public const string ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER = "total RRC [-]"; - public const string ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER = "weighted RRC w/o trailer [-]"; - - public const string GEARBOX_MANUFACTURER = "Gearbox manufacturer [-]"; - public const string GEARBOX_MODEL = "Gearbox model [-]"; - public const string GEARBOX_TYPE = "Gearbox type [-]"; - public const string GEAR_RATIO_FIRST_GEAR = "Gear ratio first gear [-]"; - public const string GEAR_RATIO_LAST_GEAR = "Gear ratio last gear [-]"; - - public const string TORQUECONVERTER_MANUFACTURER = "Torque converter manufacturer [-]"; - public const string TORQUECONVERTER_MODEL = "Torque converter model [-]"; - - public const string RETARDER_MANUFACTURER = "Retarder manufacturer [-]"; - public const string RETARDER_MODEL = "Retarder model [-]"; - public const string RETARDER_TYPE = "Retarder type [-]"; - - public const string ANGLEDRIVE_MANUFACTURER = "Angledrive manufacturer [-]"; - public const string ANGLEDRIVE_MODEL = "Angledrive model [-]"; - public const string ANGLEDRIVE_RATIO = "Angledrive ratio [-]"; - - public const string AXLE_MANUFACTURER = "Axle manufacturer [-]"; - public const string AXLE_MODEL = "Axle model [-]"; - public const string AXLE_RATIO = "Axle gear ratio [-]"; - - public const string AUX_TECH_FORMAT = "Auxiliary technology {0} [-]"; - - public const string HDV_CO2_VEHICLE_CLASS = "HDV CO2 vehicle class [-]"; - public const string TOTAL_VEHICLE_MASS = "Total vehicle mass [kg]"; - public const string CD_x_A_DECLARED = "Declared CdxA [m²]"; - public const string CD_x_A = "CdxA [m²]"; - //public const string ROLLING_RESISTANCE_COEFFICIENT = "weighed RRC [-]"; - public const string R_DYN = "r_dyn [m]"; - - public const string CARGO_VOLUME = "Cargo Volume [m³]"; - public const string TIME = "time [s]"; - public const string DISTANCE = "distance [km]"; - public const string SPEED = "speed [km/h]"; - public const string ALTITUDE_DELTA = "altitudeDelta [m]"; - - public const string FCMAP_H = "FC-Map [g/h]"; - public const string FCMAP_KM = "FC-Map [g/km]"; - public const string FCAUXC_H = "FC-AUXc [g/h]"; - public const string FCAUXC_KM = "FC-AUXc [g/km]"; - public const string FCWHTCC_H = "FC-WHTCc [g/h]"; - public const string FCWHTCC_KM = "FC-WHTCc [g/km]"; - public const string FCAAUX_H = "FC-AAUX [g/h]"; - public const string FCAAUX_KM = "FC-AAUX [g/km]"; - - public const string FCFINAL_H = "FC-Final [g/h]"; - public const string FCFINAL_KM = "FC-Final [g/km]"; - public const string FCFINAL_LITERPER100KM = "FC-Final [l/100km]"; - public const string FCFINAL_LITERPER100TKM = "FC-Final [l/100tkm]"; - public const string FCFINAL_LiterPer100M3KM = "FC-Final [l/100m³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 P_WHEEL_POS = "P_wheel_in_pos [kW]"; - public const string P_FCMAP_POS = "P_fcmap_pos [kW]"; - - public const string E_FORMAT = "E_{0} [kWh]"; - public const string E_AUX_FORMAT = "E_aux_{0} [kWh]"; - public const string E_AUX = "E_aux_sum [kWh]"; - - public const string E_AIR = "E_air [kWh]"; - public const string E_ROLL = "E_roll [kWh]"; - public const string E_GRAD = "E_grad [kWh]"; - public const string E_VEHICLE_INERTIA = "E_vehi_inertia [kWh]"; - public const string E_POWERTRAIN_INERTIA = "E_powertrain_inertia [kWh]"; - public const string E_BRAKE = "E_brake [kWh]"; - public const string E_GBX_LOSS = "E_gbx_loss [kWh]"; - public const string E_SHIFT_LOSS = "E_shift_loss [kWh]"; - public const string E_AXL_LOSS = "E_axl_loss [kWh]"; - public const string E_RET_LOSS = "E_ret_loss [kWh]"; - public const string E_TC_LOSS = "E_tc_loss [kWh]"; - public const string E_ANGLE_LOSS = "E_angle_loss [kWh]"; - public const string E_CLUTCH_LOSS = "E_clutch_loss [kWh]"; - public const string E_FCMAP_POS = "E_fcmap_pos [kWh]"; - public const string E_FCMAP_NEG = "E_fcmap_neg [kWh]"; - - public const string ACC = "a [m/s^2]"; - public const string ACC_POS = "a_pos [m/s^2]"; - public const string ACC_NEG = "a_neg [m/s^2]"; - - public const string ACC_TIMESHARE = "AccelerationTimeShare [%]"; - public const string DEC_TIMESHARE = "DecelerationTimeShare [%]"; - public const string CRUISE_TIMESHARE = "CruiseTimeShare [%]"; - public const string STOP_TIMESHARE = "StopTimeShare [%]"; - - public const string MAX_SPEED = "max. speed [km/h]"; - public const string MAX_ACCELERATION = "max. acc [m/s²]"; - public const string MAX_DECELERATION = "max. dec [m/s²]"; - public const string AVG_ENGINE_SPEED = "n_eng_avg [rpm]"; - public const string MAX_ENGINE_SPEED = "n_eng_max [rpm]"; - public const string NUM_GEARSHIFTS = "gear shifts [-]"; - public const string ENGINE_FULL_LOAD_TIME_SHARE = "Engine max. Load time share [%]"; - public const string COASTING_TIME_SHARE = "CoastingTimeShare [%]"; - public const string BRAKING_TIME_SHARE = "BrakingTImeShare [%]"; - - public const string TIME_SHARE_PER_GEAR_FORMAT = "Gear {0} TimeShare [%]"; - - public const string NUM_AXLES_DRIVEN = "Number axles vehicle driven [-]"; - public const string NUM_AXLES_NON_DRIVEN = "Number axles vehicle non-driven [-]"; - public const string NUM_AXLES_TRAILER = "Number axles trailer [-]"; - - // ReSharper restore InconsistentNaming - - internal readonly DataTable Table; - private readonly ISummaryWriter _sumWriter; - - - protected SummaryDataContainer() {} - - /// <summary> - /// Initializes a new instance of the <see cref="SummaryDataContainer"/> class. - /// </summary> - /// <param name="writer"></param> - public SummaryDataContainer(ISummaryWriter writer) - { - _sumWriter = writer; - - Table = new DataTable(); - - Table.Columns.AddRange(new[] { - Tuple.Create(SORT, typeof(int)), - Tuple.Create(JOB, typeof(string)), - Tuple.Create(INPUTFILE, typeof(string)), - Tuple.Create(CYCLE, typeof(string)), - Tuple.Create(STATUS, typeof(string)), - Tuple.Create(VEHICLE_MANUFACTURER, typeof(string)), - Tuple.Create(VIN_NUMBER, typeof(string)), - Tuple.Create(VEHICLE_MODEL, typeof(string)), - Tuple.Create(HDV_CO2_VEHICLE_CLASS, typeof(string)), - Tuple.Create(CURB_MASS, typeof(SI)), - Tuple.Create(LOADING, typeof(SI)), - Tuple.Create(TOTAL_VEHICLE_MASS, typeof(SI)), - Tuple.Create(ENGINE_MANUFACTURER, typeof(string)), - Tuple.Create(ENGINE_MODEL, typeof(string)), - Tuple.Create(ENGINE_FUEL_TYPE, typeof(string)), - Tuple.Create(ENGINE_RATED_POWER, typeof(SI)), - Tuple.Create(ENGINE_IDLING_SPEED, typeof(SI)), - Tuple.Create(ENGINE_RATED_SPEED, typeof(SI)), - Tuple.Create(ENGINE_DISPLACEMENT, typeof(SI)), - Tuple.Create(ENGINE_WHTC_URBAN, typeof(double)), - Tuple.Create(ENGINE_WHTC_RURAL, typeof(double)), - Tuple.Create(ENGINE_WHTC_MOTORWAY, typeof(double)), - Tuple.Create(ENGINE_BF_COLD_HOT, typeof(double)), - Tuple.Create(ENGINE_CF_REG_PER, typeof(double)), - Tuple.Create(ENGINE_ACTUAL_CORRECTION_FACTOR, typeof(double)), - Tuple.Create(CD_x_A_DECLARED, typeof(SI)), - Tuple.Create(CD_x_A, typeof(SI)), - Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)), - Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)), - Tuple.Create(R_DYN, typeof(SI)), - Tuple.Create(NUM_AXLES_DRIVEN, typeof(int)), - Tuple.Create(NUM_AXLES_NON_DRIVEN, typeof(int)), - Tuple.Create(NUM_AXLES_TRAILER, typeof(int)), - Tuple.Create(GEARBOX_MANUFACTURER, typeof(string)), - Tuple.Create(GEARBOX_MODEL, typeof(string)), - Tuple.Create(GEARBOX_TYPE, typeof(string)), - Tuple.Create(GEAR_RATIO_FIRST_GEAR, typeof(SI)), - Tuple.Create(GEAR_RATIO_LAST_GEAR, typeof(SI)), - Tuple.Create(TORQUECONVERTER_MANUFACTURER, typeof(string)), - Tuple.Create(TORQUECONVERTER_MODEL, typeof(string)), - Tuple.Create(RETARDER_MANUFACTURER, typeof(string)), - Tuple.Create(RETARDER_MODEL, typeof(string)), - Tuple.Create(RETARDER_TYPE, typeof(string)), - Tuple.Create(ANGLEDRIVE_MANUFACTURER, typeof(string)), - Tuple.Create(ANGLEDRIVE_MODEL, typeof(string)), - Tuple.Create(ANGLEDRIVE_RATIO, typeof(string)), - Tuple.Create(AXLE_MANUFACTURER, typeof(string)), - Tuple.Create(AXLE_MODEL, typeof(string)), - Tuple.Create(AXLE_RATIO, typeof(SI)), - Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), typeof(string)), - Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), typeof(string)), - Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition), - typeof(string)), - Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), typeof(string)), - Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), typeof(string)), - }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray()); - - Table.Columns.AddRange(new[] { - CARGO_VOLUME, - TIME, DISTANCE, - SPEED, ALTITUDE_DELTA, - FCMAP_H, FCMAP_KM, - FCAUXC_H, FCAUXC_KM, - FCWHTCC_H, FCWHTCC_KM, - FCAAUX_H, FCAAUX_KM, - FCFINAL_H, FCFINAL_KM, - FCFINAL_LITERPER100KM, FCFINAL_LITERPER100TKM, FCFINAL_LiterPer100M3KM, - CO2_KM, CO2_TKM, CO2_M3KM, - P_WHEEL_POS, P_FCMAP_POS, - E_FCMAP_POS, E_FCMAP_NEG, E_POWERTRAIN_INERTIA, - E_AUX, E_CLUTCH_LOSS, E_TC_LOSS, E_SHIFT_LOSS, E_GBX_LOSS, - E_RET_LOSS, E_ANGLE_LOSS, E_AXL_LOSS, E_BRAKE, E_VEHICLE_INERTIA, E_AIR, E_ROLL, E_GRAD, - ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE, - MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS, - STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE - }.Select(x => new DataColumn(x, typeof(SI))).ToArray()); - } - - /// <summary> - /// Finishes the summary data container (writes the data to the sumWriter). - /// </summary> - [MethodImpl(MethodImplOptions.Synchronized)] - public virtual void Finish() - { - if (_sumWriter != null) { - var view = new DataView(Table, "", SORT, DataViewRowState.CurrentRows).ToTable(); - var toRemove = - view.Columns.Cast<DataColumn>().Where(column => column.ColumnName.StartsWith(INTERNAL_PREFIX)).ToList(); - foreach (var dataColumn in toRemove) { - view.Columns.Remove(dataColumn); - } - _sumWriter.WriteSumData(view); - } - } - - /// <summary> - /// Writes the result of one run into the summary data container. - /// </summary> - [MethodImpl(MethodImplOptions.Synchronized)] - public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData) - { - var row = Table.NewRow(); - Table.Rows.Add(row); - - row[SORT] = jobNr * 1000 + runNr; - row[JOB] = string.Format("{0}-{1}", jobNr, runNr); //ReplaceNotAllowedCharacters(current); - row[INPUTFILE] = ReplaceNotAllowedCharacters(runData.JobName); - row[CYCLE] = ReplaceNotAllowedCharacters(runData.Cycle.Name + Constants.FileExtensions.CycleFile); - - row[STATUS] = modData.RunStatus; - - var vehicleLoading = 0.SI<Kilogram>(); - var cargoVolume = 0.SI<CubicMeter>(); - var gearCount = 0u; - if (runData.Cycle.CycleType != CycleType.EngineOnly) { - WriteFullPowertrain(runData, row); - - cargoVolume = runData.VehicleData.CargoVolume; - vehicleLoading = runData.VehicleData.Loading; - gearCount = (uint)runData.GearboxData.Gears.Count; - } - - - var totalTime = modData.Duration(); - row[TIME] = totalTime; - - var distance = modData.Distance(); - if (distance != null) { - //row[DISTANCE] = distance.ConvertTo().Kilo.Meter; - //row[DISTANCE] = distance.ConvertTo(Unit.SI.Kilo.Meter); - row[DISTANCE] = distance.ConvertToKiloMeter(); - - } - - var speed = modData.Speed(); - if (speed != null) { - //row[SPEED] = speed.ConvertTo().Kilo.Meter.Per.Hour; - //row[SPEED] = speed.ConvertTo(Unit.SI.Kilo.Meter.Per.Hour); - row[SPEED] = speed.ConvertToKiloMeterPerHour(); - } - - row[ALTITUDE_DELTA] = modData.AltitudeDelta(); - - WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume); - - var kilogramPerMeter = modData.CO2PerMeter(); - if (kilogramPerMeter != null) { - //row[CO2_KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; - //row[CO2_KM] = kilogramPerMeter.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter); - row[CO2_KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter(); - if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { - //row[CO2_TKM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton; - //row[CO2_TKM] = kilogramPerMeter.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter) / vehicleLoading.ConvertTo(Unit.SI.Ton); - row[CO2_TKM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / vehicleLoading.ConvertToTon(); - - } - if (cargoVolume > 0) { - //row[CO2_M3KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / cargoVolume; - //row[CO2_M3KM] = kilogramPerMeter.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter) / cargoVolume; - row[CO2_M3KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / cargoVolume; - - } - } - - //row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertTo().Kilo.Watt; - //row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertTo(Unit.SI.Kilo.Watt); - row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt(); - - //row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo().Kilo.Watt; - //row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo(Unit.SI.Kilo.Watt); - row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt(); - - WriteAuxiliaries(modData, row); - - WriteWorkEntries(modData, row); - - WritePerformanceEntries(modData, row); - - row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare(); - row[COASTING_TIME_SHARE] = modData.CoastingTimeShare(); - row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare(); - - if (gearCount <= 0) { - return; - } - - WriteGearshiftStats(modData, row, gearCount); - } - - private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, - CubicMeter cargoVolume) - { - //row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo().Gramm.Per.Hour; - //row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour); - row[FCMAP_H] = modData.FCMapPerSecond().ConvertToGrammPerHour(); - var fcMapPerMeter = modData.FCMapPerMeter(); - if (fcMapPerMeter != null) { - //row[FCMAP_KM] = fcMapPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; - } - - //row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo().Gramm.Per.Hour; - //row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour); - row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertToGrammPerHour(); - - var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop(); - row[FCAUXC_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionAuxStartStopCorrected); - - //row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo().Gramm.Per.Hour; - //row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour); - row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertToGrammPerHour(); - - var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC(); - row[FCWHTCC_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionWHTCCorrected); - - //row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo().Gramm.Per.Hour; - //row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour); - row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertToGrammPerHour(); - var fuelConsumptionAaux = modData.FuelConsumptionAAUX(); - row[FCAAUX_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionAaux); - - //row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo().Gramm.Per.Hour; - //row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour); - row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertToGrammPerHour(); - var fcfinal = modData.FuelConsumptionFinal(); - row[FCFINAL_KM] = FuelConsumptionAsGrammPerKiloMeter(fcfinal); - - var fcPer100lkm = modData.FuelConsumptionFinalLiterPer100Kilometer(); - row[FCFINAL_LITERPER100KM] = fcPer100lkm; - if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcPer100lkm != null) { - //row[FCFINAL_LITERPER100TKM] = fcPer100lkm / - // vehicleLoading.ConvertTo().Ton; - //row[FCFINAL_LITERPER100TKM] = fcPer100lkm / - // vehicleLoading.ConvertTo(Unit.SI.Ton); - row[FCFINAL_LITERPER100TKM] = fcPer100lkm / - vehicleLoading.ConvertToTon(); - } - if (cargoVolume > 0 && fcPer100lkm != null) { - row[FCFINAL_LiterPer100M3KM] = fcPer100lkm / cargoVolume; - } - } - - private static SI FuelConsumptionAsGrammPerKiloMeter(SI fc) - { - if (fc == null) { - return null; - } - //return fc.ConvertTo().Gramm.Per.Kilo.Meter; - //return fc.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter); - return fc.ConvertToGrammPerKiloMeter(); - } - - private void WriteAuxiliaries(IModalDataContainer modData, DataRow row) - { - foreach (var aux in modData.Auxiliaries) { - string colName; - if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) { - colName = string.Format(E_FORMAT, aux.Key); - } else { - colName = string.Format(E_AUX_FORMAT, aux.Key); - } - - if (!Table.Columns.Contains(colName)) { - var col = Table.Columns.Add(colName, typeof(SI)); - // move the new column to correct position - col.SetOrdinal(Table.Columns[E_AUX].Ordinal); - } - - //row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo().Kilo.Watt.Hour; - //row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo(Unit.SI.Kilo.Watt.Hour); - row[colName] = modData.AuxiliaryWork(aux.Value).ConvertToKiloWattHour(); - } - } - - private void WriteGearshiftStats(IModalDataContainer modData, DataRow row, uint gearCount) - { - row[NUM_GEARSHIFTS] = modData.GearshiftCount(); - var timeSharePerGear = modData.TimeSharePerGear(gearCount); - - for (uint i = 0; i <= gearCount; i++) { - var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i); - if (!Table.Columns.Contains(colName)) { - Table.Columns.Add(colName, typeof(SI)); - } - row[colName] = timeSharePerGear[i]; - } - } - - private void WritePerformanceEntries(IModalDataContainer modData, DataRow row) - { - row[ACC] = modData.AccelerationAverage(); - row[ACC_POS] = modData.AccelerationsPositive(); - row[ACC_NEG] = modData.AccelerationsNegative(); - var accTimeShare = modData.AccelerationTimeShare(); - row[ACC_TIMESHARE] = accTimeShare; - var decTimeShare = modData.DecelerationTimeShare(); - row[DEC_TIMESHARE] = decTimeShare; - var cruiseTimeShare = modData.CruiseTimeShare(); - row[CRUISE_TIMESHARE] = cruiseTimeShare; - var stopTimeShare = modData.StopTimeShare(); - row[STOP_TIMESHARE] = stopTimeShare; - - row[MAX_SPEED] = modData.MaxSpeed().AsKmph.SI<Scalar>(); - row[MAX_ACCELERATION] = modData.MaxAcceleration(); - row[MAX_DECELERATION] = modData.MaxDeceleration(); - row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); - row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); - if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) { - var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare; - if (!shareSum.IsEqual(100)) { - Log.Error( - "Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%", - accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false), - cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false), - shareSum.ToOutputFormat(1, null, false)); - } - } - } - - private static void WriteWorkEntries(IModalDataContainer modData, DataRow row) - { - row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertToKiloWattHour(); - row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertToKiloWattHour(); - row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertToKiloWattHour(); - row[E_AUX] = modData.WorkAuxiliaries().ConvertToKiloWattHour(); - row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertToKiloWattHour(); - row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertToKiloWattHour(); - row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertToKiloWattHour(); - row[E_GBX_LOSS] = modData.WorkGearbox().ConvertToKiloWattHour(); - row[E_RET_LOSS] = modData.WorkRetarder().ConvertToKiloWattHour(); - row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertToKiloWattHour(); - row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertToKiloWattHour(); - row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertToKiloWattHour(); - row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertToKiloWattHour(); - row[E_AIR] = modData.WorkAirResistance().ConvertToKiloWattHour(); - row[E_ROLL] = modData.WorkRollingResistance().ConvertToKiloWattHour(); - row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertToKiloWattHour(); - //row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo(Unit.SI.Kilo.Watt.Hour); - //row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_AUX] = modData.WorkAuxiliaries().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_AIR] = modData.WorkAirResistance().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_ROLL] = modData.WorkRollingResistance().ConvertTo(Unit.SI.Kilo.Watt.Hour); - // row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo(Unit.SI.Kilo.Watt.Hour); - //row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo().Kilo.Watt.Hour; - //row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo().Kilo.Watt.Hour; - //row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo().Kilo.Watt.Hour; - //row[E_AUX] = modData.WorkAuxiliaries().ConvertTo().Kilo.Watt.Hour; - //row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo().Kilo.Watt.Hour; - //row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo().Kilo.Watt.Hour; - //row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo().Kilo.Watt.Hour; - //row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo().Kilo.Watt.Hour; - //row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo().Kilo.Watt.Hour; - //row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo().Kilo.Watt.Hour; - //row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo().Kilo.Watt.Hour; - //row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo().Kilo.Watt.Hour; - //row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo().Kilo.Watt.Hour; - //row[E_AIR] = modData.WorkAirResistance().ConvertTo().Kilo.Watt.Hour; - //row[E_ROLL] = modData.WorkRollingResistance().ConvertTo().Kilo.Watt.Hour; - //row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo().Kilo.Watt.Hour; - } - - private void WriteFullPowertrain(VectoRunData runData, DataRow row) - { - row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer; - row[VIN_NUMBER] = runData.VehicleData.VIN; - row[VEHICLE_MODEL] = runData.VehicleData.ModelName; - - row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber(); - row[CURB_MASS] = runData.VehicleData.CurbWeight; - // - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>()); - row[LOADING] = runData.VehicleData.Loading; - row[CARGO_VOLUME] = runData.VehicleData.CargoVolume; - - row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight; - row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer; - row[ENGINE_MODEL] = runData.EngineData.ModelName; - row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel(); - row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null && runData.EngineData.RatedPowerDeclared > 0 - ? runData.EngineData.RatedPowerDeclared.ConvertToKiloWatt() - : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertToKiloWatt(); - //? runData.EngineData.RatedPowerDeclared.ConvertTo(Unit.SI.Kilo.Watt) - // : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo(Unit.SI.Kilo.Watt); - //? runData.EngineData.RatedPowerDeclared.ConvertTo().Kilo.Watt - //: runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt; - row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>(); - row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null && runData.EngineData.RatedSpeedDeclared > 0 - ? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>() - : runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>(); - //row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter; - //row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter); - row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter(); - - row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban; - row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural; - row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway; - row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor; - row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer; - row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor; - - row[CD_x_A_DECLARED] = runData.AirdragData.DeclaredAirdragArea; - row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea; - - row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] = - runData.VehicleData.RollResistanceCoefficientWithoutTrailer; - row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] = - runData.VehicleData.TotalRollResistanceCoefficient; - - row[R_DYN] = runData.VehicleData.DynamicTyreRadius; - - row[NUM_AXLES_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven); - row[NUM_AXLES_NON_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven); - row[NUM_AXLES_TRAILER] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer); - - row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer; - row[GEARBOX_MODEL] = runData.GearboxData.ModelName; - row[GEARBOX_TYPE] = runData.GearboxData.Type; - WriteGearboxData(runData, row); - - row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel(); - WriteRetarderData(runData, row); - - WriteAngledriveData(runData, row); - - row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer; - row[AXLE_MODEL] = runData.AxleGearData.ModelName; - row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>(); - - WriteAuxTechnologies(runData, row); - } - - private void WriteAuxTechnologies(VectoRunData runData, DataRow row) - { - foreach (var aux in runData.Aux) { - if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) { - continue; - } - var colName = string.Format(AUX_TECH_FORMAT, aux.ID); - - if (!Table.Columns.Contains(colName)) { - var col = Table.Columns.Add(colName, typeof(string)); - // move the new column to correct position - col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal); - } - - row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology); - } - } - - private static void WriteAngledriveData(VectoRunData runData, DataRow row) - { - if (runData.AngledriveData != null) { - row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer; - row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName; - row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio; - } else { - row[ANGLEDRIVE_MANUFACTURER] = "n.a."; - row[ANGLEDRIVE_MODEL] = "n.a."; - row[ANGLEDRIVE_RATIO] = "n.a."; - } - } - - private static void WriteRetarderData(VectoRunData runData, DataRow row) - { - if (runData.Retarder.Type.IsDedicatedComponent()) { - row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer; - row[RETARDER_MODEL] = runData.Retarder.ModelName; - } else { - row[RETARDER_MANUFACTURER] = "n.a."; - row[RETARDER_MODEL] = "n.a."; - } - } - - private static void WriteGearboxData(VectoRunData runData, DataRow row) - { - if (runData.GearboxData.Type.AutomaticTransmission()) { - row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio) - ? runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>() - : runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()) - : 0.SI<Scalar>(); - row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() - : 0.SI<Scalar>(); - row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer; - row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName; - } else { - row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>() - : 0.SI<Scalar>(); - row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() - : 0.SI<Scalar>(); - row[TORQUECONVERTER_MANUFACTURER] = "n.a."; - row[TORQUECONVERTER_MODEL] = "n.a."; - } - } - - private static string ReplaceNotAllowedCharacters(string text) - { - return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_'); - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected void Dispose(bool disposing) - { - if (disposing) { - Table.Dispose(); - } - } - } +/* +* This file is part of VECTO. +* +* Copyright © 2012-2017 European Union +* +* Developed by Graz University of Technology, +* Institute of Internal Combustion Engines and Thermodynamics, +* Institute of Technical Informatics +* +* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved +* by the European Commission - subsequent versions of the EUPL (the "Licence"); +* You may not use VECTO except in compliance with the Licence. +* You may obtain a copy of the Licence at: +* +* https://joinup.ec.europa.eu/community/eupl/og_page/eupl +* +* Unless required by applicable law or agreed to in writing, VECTO +* distributed under the Licence is distributed on an "AS IS" basis, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the Licence for the specific language governing permissions and +* limitations under the Licence. +* +* Authors: +* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology +* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology +* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology +* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology +* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology +* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology +*/ + +using System; +using System.Data; +using System.Linq; +using System.Runtime.CompilerServices; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +// ReSharper disable MemberCanBePrivate.Global -- used by API! + +namespace TUGraz.VectoCore.OutputData +{ + public delegate void WriteSumData(IModalDataContainer data); + + /// <summary> + /// Class for the sum file in vecto. + /// </summary> + public class SummaryDataContainer : LoggingObject, IDisposable + { + // ReSharper disable InconsistentNaming + public const string INTERNAL_PREFIX = "INTERNAL"; + + public const string SORT = INTERNAL_PREFIX + " Sorting"; + public const string JOB = "Job [-]"; + public const string INPUTFILE = "Input File [-]"; + public const string CYCLE = "Cycle [-]"; + public const string STATUS = "Status"; + public const string CURB_MASS = "Corrected Actual Curb Mass [kg]"; + public const string LOADING = "Loading [kg]"; + + public const string VEHICLE_MANUFACTURER = "Vehicle manufacturer [-]"; + public const string VIN_NUMBER = "VIN number"; + public const string VEHICLE_MODEL = "Vehicle model [-]"; + + public const string ENGINE_MANUFACTURER = "Engine manufacturer [-]"; + public const string ENGINE_MODEL = "Engine model [-]"; + public const string ENGINE_FUEL_TYPE = "Engine fuel type [-]"; + public const string ENGINE_WHTC_URBAN = "Engine WHTCUrban"; + public const string ENGINE_WHTC_RURAL = "Engine WHTCRural"; + public const string ENGINE_WHTC_MOTORWAY = "Engine WHTCMotorway"; + public const string ENGINE_BF_COLD_HOT = "Engine BFColdHot"; + public const string ENGINE_CF_REG_PER = "Engine CFRegPer"; + public const string ENGINE_ACTUAL_CORRECTION_FACTOR = "Engine actual CF"; + public const string ENGINE_RATED_POWER = "Engine rated power [kW]"; + public const string ENGINE_IDLING_SPEED = "Engine idling speed [rpm]"; + public const string ENGINE_RATED_SPEED = "Engine rated speed [rpm]"; + public const string ENGINE_DISPLACEMENT = "Engine displacement [ccm]"; + + public const string ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER = "total RRC [-]"; + public const string ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER = "weighted RRC w/o trailer [-]"; + + public const string GEARBOX_MANUFACTURER = "Gearbox manufacturer [-]"; + public const string GEARBOX_MODEL = "Gearbox model [-]"; + public const string GEARBOX_TYPE = "Gearbox type [-]"; + public const string GEAR_RATIO_FIRST_GEAR = "Gear ratio first gear [-]"; + public const string GEAR_RATIO_LAST_GEAR = "Gear ratio last gear [-]"; + + public const string TORQUECONVERTER_MANUFACTURER = "Torque converter manufacturer [-]"; + public const string TORQUECONVERTER_MODEL = "Torque converter model [-]"; + + public const string RETARDER_MANUFACTURER = "Retarder manufacturer [-]"; + public const string RETARDER_MODEL = "Retarder model [-]"; + public const string RETARDER_TYPE = "Retarder type [-]"; + + public const string ANGLEDRIVE_MANUFACTURER = "Angledrive manufacturer [-]"; + public const string ANGLEDRIVE_MODEL = "Angledrive model [-]"; + public const string ANGLEDRIVE_RATIO = "Angledrive ratio [-]"; + + public const string AXLE_MANUFACTURER = "Axle manufacturer [-]"; + public const string AXLE_MODEL = "Axle model [-]"; + public const string AXLE_RATIO = "Axle gear ratio [-]"; + + public const string AUX_TECH_FORMAT = "Auxiliary technology {0} [-]"; + + public const string HDV_CO2_VEHICLE_CLASS = "HDV CO2 vehicle class [-]"; + public const string TOTAL_VEHICLE_MASS = "Total vehicle mass [kg]"; + public const string CD_x_A_DECLARED = "Declared CdxA [m²]"; + + public const string CD_x_A = "CdxA [m²]"; + + //public const string ROLLING_RESISTANCE_COEFFICIENT = "weighed RRC [-]"; + public const string R_DYN = "r_dyn [m]"; + + public const string CARGO_VOLUME = "Cargo Volume [m³]"; + public const string TIME = "time [s]"; + public const string DISTANCE = "distance [km]"; + public const string SPEED = "speed [km/h]"; + public const string ALTITUDE_DELTA = "altitudeDelta [m]"; + + public const string FCMAP_H = "FC-Map [g/h]"; + public const string FCMAP_KM = "FC-Map [g/km]"; + public const string FCAUXC_H = "FC-AUXc [g/h]"; + public const string FCAUXC_KM = "FC-AUXc [g/km]"; + public const string FCWHTCC_H = "FC-WHTCc [g/h]"; + public const string FCWHTCC_KM = "FC-WHTCc [g/km]"; + public const string FCAAUX_H = "FC-AAUX [g/h]"; + public const string FCAAUX_KM = "FC-AAUX [g/km]"; + + public const string FCFINAL_H = "FC-Final [g/h]"; + public const string FCFINAL_KM = "FC-Final [g/km]"; + public const string FCFINAL_LITERPER100KM = "FC-Final [l/100km]"; + public const string FCFINAL_LITERPER100TKM = "FC-Final [l/100tkm]"; + public const string FCFINAL_LiterPer100M3KM = "FC-Final [l/100m³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 P_WHEEL_POS = "P_wheel_in_pos [kW]"; + public const string P_FCMAP_POS = "P_fcmap_pos [kW]"; + + public const string E_FORMAT = "E_{0} [kWh]"; + public const string E_AUX_FORMAT = "E_aux_{0} [kWh]"; + public const string E_AUX = "E_aux_sum [kWh]"; + + public const string E_AIR = "E_air [kWh]"; + public const string E_ROLL = "E_roll [kWh]"; + public const string E_GRAD = "E_grad [kWh]"; + public const string E_VEHICLE_INERTIA = "E_vehi_inertia [kWh]"; + public const string E_POWERTRAIN_INERTIA = "E_powertrain_inertia [kWh]"; + public const string E_BRAKE = "E_brake [kWh]"; + public const string E_GBX_LOSS = "E_gbx_loss [kWh]"; + public const string E_SHIFT_LOSS = "E_shift_loss [kWh]"; + public const string E_AXL_LOSS = "E_axl_loss [kWh]"; + public const string E_RET_LOSS = "E_ret_loss [kWh]"; + public const string E_TC_LOSS = "E_tc_loss [kWh]"; + public const string E_ANGLE_LOSS = "E_angle_loss [kWh]"; + public const string E_CLUTCH_LOSS = "E_clutch_loss [kWh]"; + public const string E_FCMAP_POS = "E_fcmap_pos [kWh]"; + public const string E_FCMAP_NEG = "E_fcmap_neg [kWh]"; + + public const string ACC = "a [m/s^2]"; + public const string ACC_POS = "a_pos [m/s^2]"; + public const string ACC_NEG = "a_neg [m/s^2]"; + + public const string ACC_TIMESHARE = "AccelerationTimeShare [%]"; + public const string DEC_TIMESHARE = "DecelerationTimeShare [%]"; + public const string CRUISE_TIMESHARE = "CruiseTimeShare [%]"; + public const string STOP_TIMESHARE = "StopTimeShare [%]"; + + public const string MAX_SPEED = "max. speed [km/h]"; + public const string MAX_ACCELERATION = "max. acc [m/s²]"; + public const string MAX_DECELERATION = "max. dec [m/s²]"; + public const string AVG_ENGINE_SPEED = "n_eng_avg [rpm]"; + public const string MAX_ENGINE_SPEED = "n_eng_max [rpm]"; + public const string NUM_GEARSHIFTS = "gear shifts [-]"; + public const string ENGINE_FULL_LOAD_TIME_SHARE = "Engine max. Load time share [%]"; + public const string COASTING_TIME_SHARE = "CoastingTimeShare [%]"; + public const string BRAKING_TIME_SHARE = "BrakingTImeShare [%]"; + + public const string TIME_SHARE_PER_GEAR_FORMAT = "Gear {0} TimeShare [%]"; + + public const string NUM_AXLES_DRIVEN = "Number axles vehicle driven [-]"; + public const string NUM_AXLES_NON_DRIVEN = "Number axles vehicle non-driven [-]"; + public const string NUM_AXLES_TRAILER = "Number axles trailer [-]"; + + // ReSharper restore InconsistentNaming + + internal readonly DataTable Table; + private readonly ISummaryWriter _sumWriter; + + + protected SummaryDataContainer() { } + + /// <summary> + /// Initializes a new instance of the <see cref="SummaryDataContainer"/> class. + /// </summary> + /// <param name="writer"></param> + public SummaryDataContainer(ISummaryWriter writer) + { + _sumWriter = writer; + + Table = new DataTable(); + + Table.Columns.AddRange(new[] { + Tuple.Create(SORT, typeof(int)), + Tuple.Create(JOB, typeof(string)), + Tuple.Create(INPUTFILE, typeof(string)), + Tuple.Create(CYCLE, typeof(string)), + Tuple.Create(STATUS, typeof(string)), + Tuple.Create(VEHICLE_MANUFACTURER, typeof(string)), + Tuple.Create(VIN_NUMBER, typeof(string)), + Tuple.Create(VEHICLE_MODEL, typeof(string)), + Tuple.Create(HDV_CO2_VEHICLE_CLASS, typeof(string)), + Tuple.Create(CURB_MASS, typeof(SI)), + Tuple.Create(LOADING, typeof(SI)), + Tuple.Create(TOTAL_VEHICLE_MASS, typeof(SI)), + Tuple.Create(ENGINE_MANUFACTURER, typeof(string)), + Tuple.Create(ENGINE_MODEL, typeof(string)), + Tuple.Create(ENGINE_FUEL_TYPE, typeof(string)), + Tuple.Create(ENGINE_RATED_POWER, typeof(ConvertedSI)), + Tuple.Create(ENGINE_IDLING_SPEED, typeof(SI)), + Tuple.Create(ENGINE_RATED_SPEED, typeof(SI)), + Tuple.Create(ENGINE_DISPLACEMENT, typeof(ConvertedSI)), + Tuple.Create(ENGINE_WHTC_URBAN, typeof(double)), + Tuple.Create(ENGINE_WHTC_RURAL, typeof(double)), + Tuple.Create(ENGINE_WHTC_MOTORWAY, typeof(double)), + Tuple.Create(ENGINE_BF_COLD_HOT, typeof(double)), + Tuple.Create(ENGINE_CF_REG_PER, typeof(double)), + Tuple.Create(ENGINE_ACTUAL_CORRECTION_FACTOR, typeof(double)), + Tuple.Create(CD_x_A_DECLARED, typeof(SI)), + Tuple.Create(CD_x_A, typeof(SI)), + Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)), + Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)), + Tuple.Create(R_DYN, typeof(SI)), + Tuple.Create(NUM_AXLES_DRIVEN, typeof(int)), + Tuple.Create(NUM_AXLES_NON_DRIVEN, typeof(int)), + Tuple.Create(NUM_AXLES_TRAILER, typeof(int)), + Tuple.Create(GEARBOX_MANUFACTURER, typeof(string)), + Tuple.Create(GEARBOX_MODEL, typeof(string)), + Tuple.Create(GEARBOX_TYPE, typeof(string)), + Tuple.Create(GEAR_RATIO_FIRST_GEAR, typeof(SI)), + Tuple.Create(GEAR_RATIO_LAST_GEAR, typeof(SI)), + Tuple.Create(TORQUECONVERTER_MANUFACTURER, typeof(string)), + Tuple.Create(TORQUECONVERTER_MODEL, typeof(string)), + Tuple.Create(RETARDER_MANUFACTURER, typeof(string)), + Tuple.Create(RETARDER_MODEL, typeof(string)), + Tuple.Create(RETARDER_TYPE, typeof(string)), + Tuple.Create(ANGLEDRIVE_MANUFACTURER, typeof(string)), + Tuple.Create(ANGLEDRIVE_MODEL, typeof(string)), + Tuple.Create(ANGLEDRIVE_RATIO, typeof(string)), + Tuple.Create(AXLE_MANUFACTURER, typeof(string)), + Tuple.Create(AXLE_MODEL, typeof(string)), + Tuple.Create(AXLE_RATIO, typeof(SI)), + Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), typeof(string)), + Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), typeof(string)), + Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition), + typeof(string)), + Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), typeof(string)), + Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), typeof(string)), + }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray()); + + Table.Columns.AddRange(new[] { + CARGO_VOLUME, + TIME, DISTANCE, + SPEED, ALTITUDE_DELTA, + FCMAP_H, FCMAP_KM, + FCAUXC_H, FCAUXC_KM, + FCWHTCC_H, FCWHTCC_KM, + FCAAUX_H, FCAAUX_KM, + FCFINAL_H, FCFINAL_KM, + FCFINAL_LITERPER100KM, FCFINAL_LITERPER100TKM, FCFINAL_LiterPer100M3KM, + CO2_KM, CO2_TKM, CO2_M3KM, + P_WHEEL_POS, P_FCMAP_POS, + E_FCMAP_POS, E_FCMAP_NEG, E_POWERTRAIN_INERTIA, + E_AUX, E_CLUTCH_LOSS, E_TC_LOSS, E_SHIFT_LOSS, E_GBX_LOSS, + E_RET_LOSS, E_ANGLE_LOSS, E_AXL_LOSS, E_BRAKE, E_VEHICLE_INERTIA, E_AIR, E_ROLL, E_GRAD, + ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE, + MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS, + STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE + }.Select(x => new DataColumn(x)).ToArray()); + } + + /// <summary> + /// Finishes the summary data container (writes the data to the sumWriter). + /// </summary> + [MethodImpl(MethodImplOptions.Synchronized)] + public virtual void Finish() + { + if (_sumWriter != null) { + var view = new DataView(Table, "", SORT, DataViewRowState.CurrentRows).ToTable(); + var toRemove = + view.Columns.Cast<DataColumn>().Where(column => column.ColumnName.StartsWith(INTERNAL_PREFIX)).ToList(); + foreach (var dataColumn in toRemove) { + view.Columns.Remove(dataColumn); + } + _sumWriter.WriteSumData(view); + } + } + + /// <summary> + /// Writes the result of one run into the summary data container. + /// </summary> + [MethodImpl(MethodImplOptions.Synchronized)] + public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData) + { + var row = Table.NewRow(); + Table.Rows.Add(row); + + row[SORT] = jobNr * 1000 + runNr; + row[JOB] = string.Format("{0}-{1}", jobNr, runNr); //ReplaceNotAllowedCharacters(current); + row[INPUTFILE] = ReplaceNotAllowedCharacters(runData.JobName); + row[CYCLE] = ReplaceNotAllowedCharacters(runData.Cycle.Name + Constants.FileExtensions.CycleFile); + + row[STATUS] = modData.RunStatus; + + var vehicleLoading = 0.SI<Kilogram>(); + var cargoVolume = 0.SI<CubicMeter>(); + var gearCount = 0u; + if (runData.Cycle.CycleType != CycleType.EngineOnly) { + WriteFullPowertrain(runData, row); + + cargoVolume = runData.VehicleData.CargoVolume; + vehicleLoading = runData.VehicleData.Loading; + gearCount = (uint)runData.GearboxData.Gears.Count; + } + + var totalTime = modData.Duration(); + row[TIME] = totalTime; + + var distance = modData.Distance(); + if (distance != null) { + row[DISTANCE] = distance.ConvertToKiloMeter(); + } + + var speed = modData.Speed(); + if (speed != null) { + row[SPEED] = speed.ConvertToKiloMeterPerHour(); + } + + row[ALTITUDE_DELTA] = modData.AltitudeDelta(); + + WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume); + + var kilogramPerMeter = modData.CO2PerMeter(); + if (kilogramPerMeter != null) { + row[CO2_KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter(); + if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { + row[CO2_TKM] = (kilogramPerMeter / vehicleLoading).ConvertToGrammPerTonKilometer(); + } + if (cargoVolume > 0) { + row[CO2_M3KM] = (kilogramPerMeter / cargoVolume).ConvertToGrammPerCubicMeterKiloMeter(); + } + } + + row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt(); + row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt(); + + WriteAuxiliaries(modData, row); + WriteWorkEntries(modData, row); + WritePerformanceEntries(modData, row); + + row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare(); + row[COASTING_TIME_SHARE] = modData.CoastingTimeShare(); + row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare(); + + if (gearCount <= 0) { + return; + } + + WriteGearshiftStats(modData, row, gearCount); + } + + private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, + CubicMeter cargoVolume) + { + row[FCMAP_H] = modData.FCMapPerSecond().ConvertToGrammPerHour(); + var fcMapPerMeter = modData.FCMapPerMeter(); + if (fcMapPerMeter != null) { + row[FCMAP_KM] = fcMapPerMeter.ConvertToGrammPerKiloMeter(); + } + + row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertToGrammPerHour(); + + var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop(); + row[FCAUXC_KM] = fuelConsumptionAuxStartStopCorrected.ConvertToGrammPerKiloMeter(); + row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertToGrammPerHour(); + + var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC(); + row[FCWHTCC_KM] = fuelConsumptionWHTCCorrected.ConvertToGrammPerKiloMeter(); + row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertToGrammPerHour(); + var fuelConsumptionAaux = modData.FuelConsumptionAAUX(); + row[FCAAUX_KM] = fuelConsumptionAaux.ConvertToGrammPerKiloMeter(); + + row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertToGrammPerHour(); + var fcfinal = modData.FuelConsumptionFinal(); + row[FCFINAL_KM] = fcfinal.ConvertToGrammPerKiloMeter(); + + var fcFinal = modData.FuelConsumptionFinalVolumePerMeter(); + row[FCFINAL_LITERPER100KM] = fcFinal.ConvertToLiterPer100Kilometer(); + if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcFinal != null) { + row[FCFINAL_LITERPER100TKM] = (fcFinal / vehicleLoading).ConvertToLiterPer100TonKiloMeter(); + } + if (cargoVolume > 0 && fcFinal != null) { + row[FCFINAL_LiterPer100M3KM] = (fcFinal / cargoVolume).ConvertToLiterPerCubicMeter100KiloMeter(); + } + } + + + private void WriteAuxiliaries(IModalDataContainer modData, DataRow row) + { + foreach (var aux in modData.Auxiliaries) { + string colName; + if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) { + colName = string.Format(E_FORMAT, aux.Key); + } else { + colName = string.Format(E_AUX_FORMAT, aux.Key); + } + + if (!Table.Columns.Contains(colName)) { + var col = Table.Columns.Add(colName, typeof(ConvertedSI)); + // move the new column to correct position + col.SetOrdinal(Table.Columns[E_AUX].Ordinal); + } + + row[colName] = modData.AuxiliaryWork(aux.Value).ConvertToKiloWattHour(); + } + } + + private void WriteGearshiftStats(IModalDataContainer modData, DataRow row, uint gearCount) + { + row[NUM_GEARSHIFTS] = modData.GearshiftCount(); + var timeSharePerGear = modData.TimeSharePerGear(gearCount); + + for (uint i = 0; i <= gearCount; i++) { + var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i); + if (!Table.Columns.Contains(colName)) { + Table.Columns.Add(colName, typeof(SI)); + } + row[colName] = timeSharePerGear[i]; + } + } + + private void WritePerformanceEntries(IModalDataContainer modData, DataRow row) + { + row[ACC] = modData.AccelerationAverage(); + row[ACC_POS] = modData.AccelerationsPositive(); + row[ACC_NEG] = modData.AccelerationsNegative(); + var accTimeShare = modData.AccelerationTimeShare(); + row[ACC_TIMESHARE] = accTimeShare; + var decTimeShare = modData.DecelerationTimeShare(); + row[DEC_TIMESHARE] = decTimeShare; + var cruiseTimeShare = modData.CruiseTimeShare(); + row[CRUISE_TIMESHARE] = cruiseTimeShare; + var stopTimeShare = modData.StopTimeShare(); + row[STOP_TIMESHARE] = stopTimeShare; + + row[MAX_SPEED] = modData.MaxSpeed().AsKmph.SI<Scalar>(); + row[MAX_ACCELERATION] = modData.MaxAcceleration(); + row[MAX_DECELERATION] = modData.MaxDeceleration(); + row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); + row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); + if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) { + var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare; + if (!shareSum.IsEqual(100)) { + Log.Error( + "Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%", + accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false), + cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false), + shareSum.ToOutputFormat(1, null, false)); + } + } + } + + private static void WriteWorkEntries(IModalDataContainer modData, DataRow row) + { + row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertToKiloWattHour(); + row[E_FCMAP_NEG] = (-modData.TotalEngineWorkNegative()).ConvertToKiloWattHour(); + row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertToKiloWattHour(); + row[E_AUX] = modData.WorkAuxiliaries().ConvertToKiloWattHour(); + row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertToKiloWattHour(); + row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertToKiloWattHour(); + row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertToKiloWattHour(); + row[E_GBX_LOSS] = modData.WorkGearbox().ConvertToKiloWattHour(); + row[E_RET_LOSS] = modData.WorkRetarder().ConvertToKiloWattHour(); + row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertToKiloWattHour(); + row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertToKiloWattHour(); + row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertToKiloWattHour(); + row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertToKiloWattHour(); + row[E_AIR] = modData.WorkAirResistance().ConvertToKiloWattHour(); + row[E_ROLL] = modData.WorkRollingResistance().ConvertToKiloWattHour(); + row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertToKiloWattHour(); + } + + private void WriteFullPowertrain(VectoRunData runData, DataRow row) + { + row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer; + row[VIN_NUMBER] = runData.VehicleData.VIN; + row[VEHICLE_MODEL] = runData.VehicleData.ModelName; + + row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber(); + row[CURB_MASS] = runData.VehicleData.CurbWeight; + row[LOADING] = runData.VehicleData.Loading; + row[CARGO_VOLUME] = runData.VehicleData.CargoVolume; + + row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight; + row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer; + row[ENGINE_MODEL] = runData.EngineData.ModelName; + row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel(); + row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null && runData.EngineData.RatedPowerDeclared > 0 + ? runData.EngineData.RatedPowerDeclared.ConvertToKiloWatt() + : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertToKiloWatt(); + row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>(); + row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null && runData.EngineData.RatedSpeedDeclared > 0 + ? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>() + : runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>(); + row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter(); + + row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban; + row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural; + row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway; + row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor; + row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer; + row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor; + + row[CD_x_A_DECLARED] = runData.AirdragData.DeclaredAirdragArea; + row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea; + + row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] = + runData.VehicleData.RollResistanceCoefficientWithoutTrailer; + row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] = + runData.VehicleData.TotalRollResistanceCoefficient; + + row[R_DYN] = runData.VehicleData.DynamicTyreRadius; + + row[NUM_AXLES_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven); + row[NUM_AXLES_NON_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven); + row[NUM_AXLES_TRAILER] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer); + + row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer; + row[GEARBOX_MODEL] = runData.GearboxData.ModelName; + row[GEARBOX_TYPE] = runData.GearboxData.Type; + WriteGearboxData(runData, row); + + row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel(); + WriteRetarderData(runData, row); + + WriteAngledriveData(runData, row); + + row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer; + row[AXLE_MODEL] = runData.AxleGearData.ModelName; + row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>(); + + WriteAuxTechnologies(runData, row); + } + + private void WriteAuxTechnologies(VectoRunData runData, DataRow row) + { + foreach (var aux in runData.Aux) { + if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) { + continue; + } + var colName = string.Format(AUX_TECH_FORMAT, aux.ID); + + if (!Table.Columns.Contains(colName)) { + var col = Table.Columns.Add(colName, typeof(string)); + // move the new column to correct position + col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal); + } + + row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology); + } + } + + private static void WriteAngledriveData(VectoRunData runData, DataRow row) + { + if (runData.AngledriveData != null) { + row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer; + row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName; + row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio; + } else { + row[ANGLEDRIVE_MANUFACTURER] = "n.a."; + row[ANGLEDRIVE_MODEL] = "n.a."; + row[ANGLEDRIVE_RATIO] = "n.a."; + } + } + + private static void WriteRetarderData(VectoRunData runData, DataRow row) + { + if (runData.Retarder.Type.IsDedicatedComponent()) { + row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer; + row[RETARDER_MODEL] = runData.Retarder.ModelName; + } else { + row[RETARDER_MANUFACTURER] = "n.a."; + row[RETARDER_MODEL] = "n.a."; + } + } + + private static void WriteGearboxData(VectoRunData runData, DataRow row) + { + var hasGears = runData.GearboxData.Gears.Count > 0; + var first = runData.GearboxData.Gears.FirstOrDefault().Value; + var last = runData.GearboxData.Gears.LastOrDefault().Value; + + if (runData.GearboxData.Type.AutomaticTransmission()) { + row[GEAR_RATIO_FIRST_GEAR] = hasGears + ? (double.IsNaN(first.Ratio) ? first.TorqueConverterRatio.SI<Scalar>() : first.Ratio.SI<Scalar>()) + : 0.SI<Scalar>(); + row[GEAR_RATIO_LAST_GEAR] = hasGears ? last.Ratio.SI<Scalar>() : 0.SI<Scalar>(); + row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer; + row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName; + } else { + row[GEAR_RATIO_FIRST_GEAR] = hasGears ? first.Ratio.SI<Scalar>() : 0.SI<Scalar>(); + row[GEAR_RATIO_LAST_GEAR] = hasGears ? last.Ratio.SI<Scalar>() : 0.SI<Scalar>(); + row[TORQUECONVERTER_MANUFACTURER] = "n.a."; + row[TORQUECONVERTER_MODEL] = "n.a."; + } + } + + private static string ReplaceNotAllowedCharacters(string text) + { + return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_'); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) + { + if (disposing) { + Table.Dispose(); + } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index 197ab9a745ee8b6bc71faa8124c5773e34164dca..d42ec6f41c5e8f5cb06c01cf437cdbe94a2978b4 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -178,16 +178,12 @@ namespace TUGraz.VectoCore.OutputData.XML new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"), //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value() //(result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value() - (result.FuelConsumptionTotal.ConvertToGramm() / result.Distance.ConvertToKiloMeter()).Value() - .ToMinSignificantDigits(3, 1)), + (result.FuelConsumptionTotal / result.Distance).ConvertToGrammPerKiloMeter().ToMinSignificantDigits(3, 1)), new XElement(tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"), //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / //(result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) / - (result.FuelConsumptionTotal.ConvertToGramm() / result.Distance.ConvertToKiloMeter() / - //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)), - //result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)), - result.Payload.ConvertToTon()).Value().ToMinSignificantDigits(3, 1)), + (result.FuelConsumptionTotal / result.Distance / result.Payload).ConvertToGrammPerTonKilometer().ToMinSignificantDigits(3, 1)), result.CargoVolume > 0 ? new XElement(tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"), @@ -252,7 +248,7 @@ namespace TUGraz.VectoCore.OutputData.XML retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"), //(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1))); //(result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value().ToMinSignificantDigits(3, 1))); - (result.CO2Total.ConvertToGramm() / result.Distance.ConvertToKiloMeter()).Value().ToMinSignificantDigits(3, 1))); + (result.CO2Total.ConvertToGramm() / result.Distance.ConvertToKiloMeter()).ToMinSignificantDigits(3, 1))); retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"), @@ -262,7 +258,7 @@ namespace TUGraz.VectoCore.OutputData.XML //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1))); //((result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1))); - result.Payload.ConvertToTon()).Value().ToMinSignificantDigits(3, 1))); + result.Payload.ConvertToTon()).ToMinSignificantDigits(3, 1))); if (result.CargoVolume > 0) { diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs index 73c04eccdb578257cda57d88fab1cb39895b6be5..90bca5633e0bb23338c5594e13493acd4a6723d6 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs @@ -1,77 +1,76 @@ -/* -* This file is part of VECTO. -* -* Copyright © 2012-2017 European Union -* -* Developed by Graz University of Technology, -* Institute of Internal Combustion Engines and Thermodynamics, -* Institute of Technical Informatics -* -* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved -* by the European Commission - subsequent versions of the EUPL (the "Licence"); -* You may not use VECTO except in compliance with the Licence. -* You may obtain a copy of the Licence at: -* -* https://joinup.ec.europa.eu/community/eupl/og_page/eupl -* -* Unless required by applicable law or agreed to in writing, VECTO -* distributed under the Licence is distributed on an "AS IS" basis, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the Licence for the specific language governing permissions and -* limitations under the Licence. -* -* Authors: -* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology -* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology -* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology -* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology -* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology -* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology -*/ - -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; -using NUnit.Framework; - -namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData -{ - [TestFixture] - public class FuelConsumptionMapTest - { - private const double Tolerance = 0.0001; - - [TestCase] - public void TestFuelConsumption_FixedPoints() - { - var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap"); - var lines = File.ReadAllLines(@"TestData\Components\24t Coach.vmap").Skip(1).ToArray(); - AssertMapValuesEqual(lines, map); - } - - [TestCase] - public void TestFuelConsumption_InterpolatedPoints() - { - var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap"); - var lines = File.ReadAllLines(@"TestData\Components\24t CoachInterpolated.vmap").Skip(1).ToArray(); - AssertMapValuesEqual(lines, map); - } - - private static void AssertMapValuesEqual(IReadOnlyList<string> lines, FuelConsumptionMap map) - { +/* +* This file is part of VECTO. +* +* Copyright © 2012-2017 European Union +* +* Developed by Graz University of Technology, +* Institute of Internal Combustion Engines and Thermodynamics, +* Institute of Technical Informatics +* +* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved +* by the European Commission - subsequent versions of the EUPL (the "Licence"); +* You may not use VECTO except in compliance with the Licence. +* You may obtain a copy of the Licence at: +* +* https://joinup.ec.europa.eu/community/eupl/og_page/eupl +* +* Unless required by applicable law or agreed to in writing, VECTO +* distributed under the Licence is distributed on an "AS IS" basis, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the Licence for the specific language governing permissions and +* limitations under the Licence. +* +* Authors: +* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology +* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology +* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology +* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology +* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology +* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology +*/ + +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using NUnit.Framework; + +namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData +{ + [TestFixture] + public class FuelConsumptionMapTest + { + private const double Tolerance = 0.0001; + + [TestCase] + public void TestFuelConsumption_FixedPoints() + { + var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap"); + var lines = File.ReadAllLines(@"TestData\Components\24t Coach.vmap").Skip(1).ToArray(); + AssertMapValuesEqual(lines, map); + } + + [TestCase] + public void TestFuelConsumption_InterpolatedPoints() + { + var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap"); + var lines = File.ReadAllLines(@"TestData\Components\24t CoachInterpolated.vmap").Skip(1).ToArray(); + AssertMapValuesEqual(lines, map); + } + + private static void AssertMapValuesEqual(IReadOnlyList<string> lines, FuelConsumptionMap map) + { for (var i = 1; i < lines.Count; i++) { - var entry = lines[i].Split(',').Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray(); - - //Assert.AreEqual(entry[2].SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(), - // map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); - //Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(), - // map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); - Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(), - map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); - } - } - } + var entry = lines[i].Split(',').Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray(); + + //Assert.AreEqual(entry[2].SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(), + // map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); + //Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(), + // map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); + Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).Value(), map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); + } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs index 9915ecd2cbc2885d09689b49cb88ca56ecb56885..4ca4427bf713664ab947e5537bf3d27786452e04 100644 --- a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs +++ b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs @@ -191,16 +191,14 @@ namespace TUGraz.VectoCore.Tests.Reports // ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value()); //Assert.AreEqual((dataProvider.EngineInputData.RatedPowerDeclared.ConvertTo(Unit.SI.Kilo.Watt).Value()), // ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value()); - Assert.AreEqual((dataProvider.EngineInputData.RatedPowerDeclared.ConvertToKiloWatt().Value()), - ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value()); + Assert.AreEqual(dataProvider.EngineInputData.RatedPowerDeclared.ConvertToKiloWatt(),((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value()); Assert.AreEqual(dataProvider.EngineInputData.RatedSpeedDeclared.AsRPM, ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_SPEED]).Value()); //Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertTo().Cubic.Centi.Meter.Value(), // ((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value()); //Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter).Value(), // ((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value()); - Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertToCubicCentiMeter().Value(), - ((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value()); + Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertToCubicCentiMeter(),((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value()); Assert.AreEqual(dataProvider.GearboxInputData.Manufacturer, sumRow[SummaryDataContainer.GEARBOX_MANUFACTURER]); Assert.AreEqual(dataProvider.GearboxInputData.Model, sumRow[SummaryDataContainer.GEARBOX_MODEL]); Assert.AreEqual(dataProvider.AxleGearInputData.Manufacturer, sumRow[SummaryDataContainer.AXLE_MANUFACTURER]); diff --git a/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs b/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs index e32f92d9889a7cfc00d1cc996af90fbcb21d37a1..b6244b31720b281701eb781b541ff5b801108713 100644 --- a/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs +++ b/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs @@ -1,134 +1,130 @@ -/* -* This file is part of VECTO. -* -* Copyright © 2012-2017 European Union -* -* Developed by Graz University of Technology, -* Institute of Internal Combustion Engines and Thermodynamics, -* Institute of Technical Informatics -* -* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved -* by the European Commission - subsequent versions of the EUPL (the "Licence"); -* You may not use VECTO except in compliance with the Licence. -* You may obtain a copy of the Licence at: -* -* https://joinup.ec.europa.eu/community/eupl/og_page/eupl -* -* Unless required by applicable law or agreed to in writing, VECTO -* distributed under the Licence is distributed on an "AS IS" basis, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the Licence for the specific language governing permissions and -* limitations under the Licence. -* -* Authors: -* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology -* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology -* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology -* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology -* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology -* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology -*/ - -using System; -using TUGraz.VectoCommon.Utils; +/* +* This file is part of VECTO. +* +* Copyright © 2012-2017 European Union +* +* Developed by Graz University of Technology, +* Institute of Internal Combustion Engines and Thermodynamics, +* Institute of Technical Informatics +* +* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved +* by the European Commission - subsequent versions of the EUPL (the "Licence"); +* You may not use VECTO except in compliance with the Licence. +* You may obtain a copy of the Licence at: +* +* https://joinup.ec.europa.eu/community/eupl/og_page/eupl +* +* Unless required by applicable law or agreed to in writing, VECTO +* distributed under the Licence is distributed on an "AS IS" basis, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the Licence for the specific language governing permissions and +* limitations under the Licence. +* +* Authors: +* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology +* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology +* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology +* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology +* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology +* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology +*/ + +using System; +using TUGraz.VectoCommon.Utils; using NUnit.Framework; -namespace TUGraz.VectoCore.Tests.Utils -{ - [TestFixture] - public class DoubleExtensionMethodTest - { - [TestCase] - public void DoubleExtensions_SI() - { - var val = 600.RPMtoRad(); - Assert.AreEqual(600 / 60 * 2 * Math.PI, val.Value()); - +namespace TUGraz.VectoCore.Tests.Utils +{ + [TestFixture] + public class DoubleExtensionMethodTest + { + [TestCase] + public void DoubleExtensions_SI() + { + var val = 600.RPMtoRad(); + Assert.AreEqual(600 / 60 * 2 * Math.PI, val.Value()); + Assert.IsTrue(0.SI<PerSecond>().HasEqualUnit(val)); - //var val2 = 1200.SI().Rounds.Per.Minute.ConvertTo().Radian.Per.Second.Cast<PerSecond>(); - //var val2 = 1200.SI(Unit.SI.Rounds.Per.Minute).ConvertTo(Unit.SI.Radian.Per.Second).Cast<PerSecond>(); - var val2 = 1200.SI(Unit.SI.Rounds.Per.Minute).ConvertToRadianPerSecond().Cast<PerSecond>(); + var val2 = 1200.SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>(); - val = val * 2; - Assert.AreEqual(val, val2); - - val2 = val2 / 2; - val = val / 2; + val = val * 2; + Assert.AreEqual(val, val2); + + val2 = val2 / 2; + val = val / 2; Assert.AreEqual(val, val2); - //Assert.AreEqual(600.SI().Rounds.Per.Minute.Cast<PerSecond>(), val2); Assert.AreEqual(600.SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>(), val2); - //Assert.AreEqual(600.SI().Rounds.Per.Minute.Cast<PerSecond>().Value(), val2.Value()); Assert.AreEqual(600.SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>().Value(), val2.Value()); - } - - [TestCase] - public void DoubleExtension_ComparisonOperators() - { - Assert.IsTrue(0.0.IsEqual(0.0)); - Assert.IsTrue(1.0.IsGreater(0.0)); - Assert.IsTrue(1.0.IsGreaterOrEqual(1.0)); - Assert.IsTrue(1.0.IsPositive()); - Assert.IsTrue(0.0.IsSmaller(1.0)); - Assert.IsTrue(1.0.IsSmallerOrEqual(1.0)); - - const double inTolerance = 1e-7; - Assert.IsTrue(0.0.IsEqual(inTolerance)); - Assert.IsTrue(inTolerance.IsEqual(0.0)); - Assert.IsTrue(0.0.IsEqual(-inTolerance)); - Assert.IsTrue((-inTolerance).IsEqual(0.0)); - - Assert.IsFalse(0.0.IsEqual(0.1)); - Assert.IsFalse(0.1.IsEqual(0.0)); - Assert.IsFalse(0.0.IsEqual(-0.1)); - Assert.IsFalse((-0.1).IsEqual(0.0)); - - Assert.IsTrue(1.002.IsGreater(1.0)); - Assert.IsTrue(1.001.IsGreater(1.0)); - Assert.IsFalse(1.0.IsGreater(1.0)); - Assert.IsFalse(0.999.IsGreater(1.0)); - - Assert.IsTrue(1.001.IsGreaterOrEqual(1.0)); - Assert.IsFalse(0.999.IsGreaterOrEqual(1.0)); - Assert.IsFalse(0.998.IsGreaterOrEqual(1.0)); - - Assert.IsTrue(0.001.IsPositive()); - Assert.IsTrue(0.0.IsPositive()); - Assert.IsTrue((-inTolerance).IsPositive()); - Assert.IsFalse((-0.001).IsPositive()); - Assert.IsFalse((-0.002).IsPositive()); - - Assert.IsTrue(0.998.IsSmaller(1.0)); - Assert.IsTrue(0.999.IsSmaller(1.0)); - Assert.IsFalse(1.0.IsSmaller(1.0)); - Assert.IsFalse(1.0011.IsSmaller(1.0)); - - Assert.IsTrue((1 + inTolerance).IsSmallerOrEqual(1.0)); - Assert.IsFalse(1.001.IsSmallerOrEqual(1.0)); - Assert.IsTrue(0.999.IsSmallerOrEqual(1.0)); - Assert.IsTrue(0.998.IsSmallerOrEqual(1.0)); - } - - [TestCase] - public void TestStringFormatting() - { - Assert.AreEqual("0.452", 0.452345.ToMinSignificantDigits(3, 1)); - Assert.AreEqual("4.52", 4.52345.ToMinSignificantDigits(3, 1)); - Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1)); - - Assert.AreEqual("0.0452", 0.0452345.ToMinSignificantDigits(3, 1)); - Assert.AreEqual("0.00452", 0.00452345.ToMinSignificantDigits(3, 1)); - - - Assert.AreEqual("-0.452", (-0.452345).ToMinSignificantDigits(3, 1)); - Assert.AreEqual("-4.52", (-4.52345).ToMinSignificantDigits(3, 1)); - Assert.AreEqual("-45.2", (-45.2345).ToMinSignificantDigits(3, 1)); - - Assert.AreEqual("-0.0452", (-0.0452345).ToMinSignificantDigits(3, 1)); - Assert.AreEqual("-0.00452", (-0.00452345).ToMinSignificantDigits(3, 1)); - - Assert.AreEqual("0.0", 0.0.ToMinSignificantDigits(3, 1)); - //Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1)); - } - } + } + + [TestCase] + public void DoubleExtension_ComparisonOperators() + { + Assert.IsTrue(0.0.IsEqual(0.0)); + Assert.IsTrue(1.0.IsGreater(0.0)); + Assert.IsTrue(1.0.IsGreaterOrEqual(1.0)); + Assert.IsTrue(1.0.IsPositive()); + Assert.IsTrue(0.0.IsSmaller(1.0)); + Assert.IsTrue(1.0.IsSmallerOrEqual(1.0)); + + const double inTolerance = 1e-7; + Assert.IsTrue(0.0.IsEqual(inTolerance)); + Assert.IsTrue(inTolerance.IsEqual(0.0)); + Assert.IsTrue(0.0.IsEqual(-inTolerance)); + Assert.IsTrue((-inTolerance).IsEqual(0.0)); + + Assert.IsFalse(0.0.IsEqual(0.1)); + Assert.IsFalse(0.1.IsEqual(0.0)); + Assert.IsFalse(0.0.IsEqual(-0.1)); + Assert.IsFalse((-0.1).IsEqual(0.0)); + + Assert.IsTrue(1.002.IsGreater(1.0)); + Assert.IsTrue(1.001.IsGreater(1.0)); + Assert.IsFalse(1.0.IsGreater(1.0)); + Assert.IsFalse(0.999.IsGreater(1.0)); + + Assert.IsTrue(1.001.IsGreaterOrEqual(1.0)); + Assert.IsFalse(0.999.IsGreaterOrEqual(1.0)); + Assert.IsFalse(0.998.IsGreaterOrEqual(1.0)); + + Assert.IsTrue(0.001.IsPositive()); + Assert.IsTrue(0.0.IsPositive()); + Assert.IsTrue((-inTolerance).IsPositive()); + Assert.IsFalse((-0.001).IsPositive()); + Assert.IsFalse((-0.002).IsPositive()); + + Assert.IsTrue(0.998.IsSmaller(1.0)); + Assert.IsTrue(0.999.IsSmaller(1.0)); + Assert.IsFalse(1.0.IsSmaller(1.0)); + Assert.IsFalse(1.0011.IsSmaller(1.0)); + + Assert.IsTrue((1 + inTolerance).IsSmallerOrEqual(1.0)); + Assert.IsFalse(1.001.IsSmallerOrEqual(1.0)); + Assert.IsTrue(0.999.IsSmallerOrEqual(1.0)); + Assert.IsTrue(0.998.IsSmallerOrEqual(1.0)); + } + + [TestCase] + public void TestStringFormatting() + { + Assert.AreEqual("0.452", 0.452345.ToMinSignificantDigits(3, 1)); + Assert.AreEqual("4.52", 4.52345.ToMinSignificantDigits(3, 1)); + Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1)); + + Assert.AreEqual("0.0452", 0.0452345.ToMinSignificantDigits(3, 1)); + Assert.AreEqual("0.00452", 0.00452345.ToMinSignificantDigits(3, 1)); + + + Assert.AreEqual("-0.452", (-0.452345).ToMinSignificantDigits(3, 1)); + Assert.AreEqual("-4.52", (-4.52345).ToMinSignificantDigits(3, 1)); + Assert.AreEqual("-45.2", (-45.2345).ToMinSignificantDigits(3, 1)); + + Assert.AreEqual("-0.0452", (-0.0452345).ToMinSignificantDigits(3, 1)); + Assert.AreEqual("-0.00452", (-0.00452345).ToMinSignificantDigits(3, 1)); + + Assert.AreEqual("0.0", 0.0.ToMinSignificantDigits(3, 1)); + //Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1)); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Utils/SITest.cs b/VectoCore/VectoCoreTest/Utils/SITest.cs index 730953293349796e15fc445f25e8a8eadfbd6d18..f5a1661f4e1359854b8da29082121bbce95796e2 100644 --- a/VectoCore/VectoCoreTest/Utils/SITest.cs +++ b/VectoCore/VectoCoreTest/Utils/SITest.cs @@ -690,17 +690,17 @@ namespace TUGraz.VectoCore.Tests.Utils //var val2 = 7.SI(Unit.SI.Cubic.Dezi.Meter).ConvertTo(Unit.SI.Cubic.Dezi.Meter); var val2 = 7.SI(Unit.SI.Cubic.Dezi.Meter).ConvertToCubicDeziMeter(); - AssertHelper.AreRelativeEqual(0.007, val2.Value()); + AssertHelper.AreRelativeEqual(0.007, val2); //var val3 = 5.SI(Unit.SI.Cubic.Dezi.Meter).ConvertTo(Unit.SI.Cubic.Centi.Meter); var val3 = 5.SI(Unit.SI.Cubic.Dezi.Meter).ConvertToCubicCentiMeter(); - AssertHelper.AreRelativeEqual(0.005, val3.Value()); // 5000 cm^3 + AssertHelper.AreRelativeEqual(0.005, val3); // 5000 cm^3 //var val4 = 5.SI(Unit.SI.Cubic.Centi.Meter).ConvertTo(Unit.SI.Cubic.Dezi.Meter); var val4 = 5.SI(Unit.SI.Cubic.Centi.Meter).ConvertToCubicDeziMeter(); - AssertHelper.AreRelativeEqual(0.000005, val4.Value()); // 0.005 dm^3 + AssertHelper.AreRelativeEqual(0.000005, val4); // 0.005 dm^3 var uni1 = Unit.SI.Kilo.Meter.Per.Hour; diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs index 752b50292d63bd9a55811ca75e0b29a38b6907ed..138378260ee4c38db37e88bba69ad7a8329b7d0b 100644 --- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs @@ -89,8 +89,7 @@ namespace TUGraz.VectoCore.Tests.XML // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); //Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(), // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); - Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(), - fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); + Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(),fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); var fldTable = engineDataProvider.FullLoadCurve; Assert.AreEqual(10, fldTable.Rows.Count); diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs index 61019ce23f4edea893efc8d907469e78c76a6249..d6b337590d3704ec33c46aba8abc877b14342e3c 100644 --- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs @@ -1,327 +1,326 @@ -/* -* This file is part of VECTO. -* -* Copyright © 2012-2017 European Union -* -* Developed by Graz University of Technology, -* Institute of Internal Combustion Engines and Thermodynamics, -* Institute of Technical Informatics -* -* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved -* by the European Commission - subsequent versions of the EUPL (the "Licence"); -* You may not use VECTO except in compliance with the Licence. -* You may obtain a copy of the Licence at: -* -* https://joinup.ec.europa.eu/community/eupl/og_page/eupl -* -* Unless required by applicable law or agreed to in writing, VECTO -* distributed under the Licence is distributed on an "AS IS" basis, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the Licence for the specific language governing permissions and -* limitations under the Licence. -* -* Authors: -* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology -* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology -* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology -* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology -* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology -* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology -*/ - -using System.IO; -using System.Linq; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.InputData.FileIO.XML.Engineering; -using TUGraz.VectoCore.InputData.Reader; -using TUGraz.VectoCore.InputData.Reader.ComponentData; -using TUGraz.VectoCore.Models.Simulation.Impl; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; -using TUGraz.VectoCore.OutputData; -using TUGraz.VectoCore.OutputData.FileIO; -using TUGraz.VectoCore.Tests.Utils; -using TUGraz.VectoCore.Utils; +/* +* This file is part of VECTO. +* +* Copyright © 2012-2017 European Union +* +* Developed by Graz University of Technology, +* Institute of Internal Combustion Engines and Thermodynamics, +* Institute of Technical Informatics +* +* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved +* by the European Commission - subsequent versions of the EUPL (the "Licence"); +* You may not use VECTO except in compliance with the Licence. +* You may obtain a copy of the Licence at: +* +* https://joinup.ec.europa.eu/community/eupl/og_page/eupl +* +* Unless required by applicable law or agreed to in writing, VECTO +* distributed under the Licence is distributed on an "AS IS" basis, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the Licence for the specific language governing permissions and +* limitations under the Licence. +* +* Authors: +* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology +* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology +* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology +* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology +* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology +* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology +*/ + +using System.IO; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.FileIO.XML.Engineering; +using TUGraz.VectoCore.InputData.Reader; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using TUGraz.VectoCore.OutputData; +using TUGraz.VectoCore.OutputData.FileIO; +using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; using NUnit.Framework; -namespace TUGraz.VectoCore.Tests.XML -{ - [TestFixture] - public class XMLEngineeringInputRefTest - { - public const string EngineeringSampleFile = "TestData/XML/XMLReaderEngineering/engineering_job-sample_ref.xml"; - - [TestCase] - public void TestXMLInputEngineeringReferencedFileAsStream() - { - AssertHelper.Exception<VectoException>(() => { - var reader = File.OpenRead(EngineeringSampleFile); - var foo = new XMLEngineeringInputDataProvider(reader, true); - }); - } - - [TestCase] - public void TestXMLInputEngReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - - var engineDataProvider = inputDataProvider.EngineInputData; - - Assert.IsFalse(engineDataProvider.SavedInDeclarationMode); - - Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model); - Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value()); - Assert.AreEqual(0.77, engineDataProvider.Inertia.Value()); - - AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCMotorway; }); - AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCRural; }); - AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCUrban; }); - - var fcMapTable = engineDataProvider.FuelConsumptionMap; - Assert.AreEqual(112, fcMapTable.Rows.Count); - Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption); - Assert.AreEqual("torque", fcMapTable.Columns[1].Caption); - Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption); - - Assert.AreEqual("560", fcMapTable.Rows[0][0]); - var fcMap = FuelConsumptionMapReader.Create(fcMapTable); +namespace TUGraz.VectoCore.Tests.XML +{ + [TestFixture] + public class XMLEngineeringInputRefTest + { + public const string EngineeringSampleFile = "TestData/XML/XMLReaderEngineering/engineering_job-sample_ref.xml"; + + [TestCase] + public void TestXMLInputEngineeringReferencedFileAsStream() + { + AssertHelper.Exception<VectoException>(() => { + var reader = File.OpenRead(EngineeringSampleFile); + var foo = new XMLEngineeringInputDataProvider(reader, true); + }); + } + + [TestCase] + public void TestXMLInputEngReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + + var engineDataProvider = inputDataProvider.EngineInputData; + + Assert.IsFalse(engineDataProvider.SavedInDeclarationMode); + + Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model); + Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value()); + Assert.AreEqual(0.77, engineDataProvider.Inertia.Value()); + + AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCMotorway; }); + AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCRural; }); + AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCUrban; }); + + var fcMapTable = engineDataProvider.FuelConsumptionMap; + Assert.AreEqual(112, fcMapTable.Rows.Count); + Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption); + Assert.AreEqual("torque", fcMapTable.Columns[1].Caption); + Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption); + + Assert.AreEqual("560", fcMapTable.Rows[0][0]); + var fcMap = FuelConsumptionMapReader.Create(fcMapTable); //Assert.AreEqual(1256.SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(), // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); //Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(), - // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); - Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(), - fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); - - var fldTable = engineDataProvider.FullLoadCurve; - Assert.AreEqual(10, fldTable.Rows.Count); - Assert.AreEqual("engine speed", fldTable.Columns[0].Caption); - Assert.AreEqual("full load torque", fldTable.Columns[1].Caption); - Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption); - var fldMap = FullLoadCurveReader.Create(fldTable, true); - } - - [TestCase] - public void TestXMLInputGbxReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var gearboxDataProvider = inputDataProvider.GearboxInputData; - - Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model); - Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type); - var gears = gearboxDataProvider.Gears; - Assert.AreEqual(12, gears.Count); - - Assert.AreEqual(1, gears.First().Gear); - Assert.AreEqual(14.93, gears.First().Ratio); - Assert.AreEqual("0", gears.First().LossMap.Rows[0][0]); - Assert.AreEqual("-350", gears.First().LossMap.Rows[0][1]); - Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]); - - var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio, - gears.First().Gear.ToString()); - - Assert.AreEqual("-100", gears.First().ShiftPolygon.Rows[0][0]); - Assert.AreEqual("700", gears.First().ShiftPolygon.Rows[0][1]); - Assert.AreEqual("1800", gears.First().ShiftPolygon.Rows[0][2]); - - //Assert.AreEqual("560", gears.First().FullLoadCurve.Rows[0][0]); - //Assert.AreEqual("2500", gears.First().FullLoadCurve.Rows[0][1]); - - //var fldMap = FullLoadCurveReader.Create(gears.First().FullLoadCurve, true); - } - - [TestCase] - public void TestXMLInputGbxTCReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var tcInputDataProvider = inputDataProvider.GearboxInputData.TorqueConverter; - - - Assert.AreEqual("GBX_ShiftPolygons.vgbs", Path.GetFileName(tcInputDataProvider.ShiftPolygon.Source)); - Assert.AreEqual("-100", tcInputDataProvider.ShiftPolygon.Rows[0][0]); - Assert.AreEqual("700", tcInputDataProvider.ShiftPolygon.Rows[0][1]); - Assert.AreEqual("1800", tcInputDataProvider.ShiftPolygon.Rows[0][2]); - - Assert.AreEqual("tc_data.vtcc", Path.GetFileName(tcInputDataProvider.TCData.Source)); - Assert.AreEqual(3, tcInputDataProvider.TCData.Rows.Count); - Assert.AreEqual("300", tcInputDataProvider.TCData.Rows[0][1]); - Assert.AreEqual("0.9", tcInputDataProvider.TCData.Rows[2][2]); - } - - [TestCase] - public void TestXMLInputAngledriveReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var angledriveInputData = inputDataProvider.AngledriveInputData; - - Assert.AreEqual("Generic Angledrive", angledriveInputData.Model); - - var lossMapData = angledriveInputData.LossMap; - Assert.AreEqual(1.2, angledriveInputData.Ratio); - Assert.AreEqual("0", lossMapData.Rows[0][0]); - Assert.AreEqual("-10000", lossMapData.Rows[0][1]); - Assert.AreEqual("100", lossMapData.Rows[0][2]); - - var lossMap = TransmissionLossMapReader.Create(lossMapData, angledriveInputData.Ratio, "Angledrive"); - } - - [TestCase] - public void TestXMLInputAxlGReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var axlegearDataProvider = inputDataProvider.AxleGearInputData; - - Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model); - - var lossMapData = axlegearDataProvider.LossMap; - Assert.AreEqual(2.59, axlegearDataProvider.Ratio); - Assert.AreEqual("0", lossMapData.Rows[0][0]); - Assert.AreEqual("-5000", lossMapData.Rows[0][1]); - Assert.AreEqual("115", lossMapData.Rows[0][2]); - - var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear"); - } - - [TestCase] - public void TestXMLInputRetarderReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var retarderDataProvider = inputDataProvider.RetarderInputData; - - Assert.AreEqual("Generic Retarder", retarderDataProvider.Model); - - var lossMapData = retarderDataProvider.LossMap; - - Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type); - - Assert.AreEqual("0", lossMapData.Rows[0][0]); - Assert.AreEqual("10", lossMapData.Rows[0][1]); - - var lossMap = RetarderLossMapReader.Create(lossMapData); - } - - [TestCase] - public void TestXMLInputAxleWheelsReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var vehicleDataProvider = inputDataProvider.VehicleInputData; - - var axles = vehicleDataProvider.Axles; - - Assert.AreEqual("315/70 R22.5", axles[0].Wheels); - Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient); - Assert.AreEqual(31300, axles[0].TyreTestLoad.Value()); - - Assert.AreEqual("315/70 R22.5", axles[1].Wheels); - Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient); - Assert.AreEqual(31300, axles[1].TyreTestLoad.Value()); - - //AssertHelper.Exception<VectoException>(() => { var tmp = vehicleDataProvider.Rim; }); - Assert.AreEqual(0.488822, vehicleDataProvider.DynamicTyreRadius.Value()); - } - - [TestCase] - public void TestXMLInputAuxiliariesReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - var auxDataProvider = inputDataProvider.AuxiliaryInputData(); - - var aux = auxDataProvider.Auxiliaries; - var aux1 = aux[0]; - - Assert.AreEqual("ES", aux1.ID); - - Assert.AreEqual(70, aux1.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower)); - Assert.AreEqual(640, aux1.DemandMap.Rows[2].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower)); - - var aux2 = aux[1]; - - Assert.AreEqual("FAN", aux2.ID); - Assert.AreEqual(70, aux2.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower)); - Assert.AreEqual(3190, aux2.DemandMap.Rows[113].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower)); - } - - [TestCase] - public void TestXMLInputADASReferencedFile() - { - //var reader = XmlReader.Create(EngineeringSampleFile); - - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - - var adas = inputDataProvider.DriverInputData; - - Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode); - } - - [TestCase] - public void TestVehicleInputReferencedFile() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - - var vehicleDataProvider = inputDataProvider.VehicleInputData; - - Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory); - Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration); - - Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value()); - Assert.AreEqual(18000.0, vehicleDataProvider.GrossVehicleMassRating.Value()); - Assert.AreEqual(6.29, inputDataProvider.AirdragInputData.AirDragArea.Value()); - - Assert.AreEqual(1500, vehicleDataProvider.Loading.Value()); - Assert.AreEqual(500, vehicleDataProvider.CurbMassExtra.Value()); - - Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio); - } - - [TestCase] - public void TestXMLPowertrainGenerationReferencedFile() - { - var fileWriter = new FileOutputWriter("foo"); - var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml"); - var sumData = new SummaryDataContainer(sumWriter); - var jobContainer = new JobContainer(sumData); - var dataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - - var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, dataProvider, fileWriter); - runsFactory.WriteModalResults = true; - - jobContainer.AddRuns(runsFactory); - - //Assert.AreEqual(6, jobContainer.Runs.Count); - } - - - [TestCase] - public void TestXMEngineering_DriverModelLACExt() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - - var driverDataProvider = inputDataProvider.DriverInputData; - - var lac = driverDataProvider.Lookahead; - Assert.IsTrue(lac.Enabled); - - Assert.AreEqual("lac_speedDependent.csv", Path.GetFileName(lac.CoastingDecisionFactorTargetSpeedLookup.Source)); - Assert.AreEqual("lac_velocityDrop.csv", Path.GetFileName(lac.CoastingDecisionFactorVelocityDropLookup.Source)); - } - - [TestCase] - public void TestXMEngineering_PTO() - { - var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); - - var ptoData = inputDataProvider.PTOTransmissionInputData; - - //Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoData.PTOTransmissionType); - Assert.AreEqual(2, ptoData.PTOLossMap.Rows.Count); - Assert.AreEqual("2800", ptoData.PTOLossMap.Rows[1][0]); - Assert.AreEqual("100", ptoData.PTOLossMap.Rows[1][1]); - - Assert.AreEqual(4, ptoData.PTOCycle.Rows.Count); - Assert.AreEqual("3", ptoData.PTOCycle.Rows[3][0]); - Assert.AreEqual("1200", ptoData.PTOCycle.Rows[3][1]); - Assert.AreEqual("100", ptoData.PTOCycle.Rows[3][2]); - } - } + // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); + Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(), fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); + + var fldTable = engineDataProvider.FullLoadCurve; + Assert.AreEqual(10, fldTable.Rows.Count); + Assert.AreEqual("engine speed", fldTable.Columns[0].Caption); + Assert.AreEqual("full load torque", fldTable.Columns[1].Caption); + Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption); + var fldMap = FullLoadCurveReader.Create(fldTable, true); + } + + [TestCase] + public void TestXMLInputGbxReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var gearboxDataProvider = inputDataProvider.GearboxInputData; + + Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model); + Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type); + var gears = gearboxDataProvider.Gears; + Assert.AreEqual(12, gears.Count); + + Assert.AreEqual(1, gears.First().Gear); + Assert.AreEqual(14.93, gears.First().Ratio); + Assert.AreEqual("0", gears.First().LossMap.Rows[0][0]); + Assert.AreEqual("-350", gears.First().LossMap.Rows[0][1]); + Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]); + + var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio, + gears.First().Gear.ToString()); + + Assert.AreEqual("-100", gears.First().ShiftPolygon.Rows[0][0]); + Assert.AreEqual("700", gears.First().ShiftPolygon.Rows[0][1]); + Assert.AreEqual("1800", gears.First().ShiftPolygon.Rows[0][2]); + + //Assert.AreEqual("560", gears.First().FullLoadCurve.Rows[0][0]); + //Assert.AreEqual("2500", gears.First().FullLoadCurve.Rows[0][1]); + + //var fldMap = FullLoadCurveReader.Create(gears.First().FullLoadCurve, true); + } + + [TestCase] + public void TestXMLInputGbxTCReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var tcInputDataProvider = inputDataProvider.GearboxInputData.TorqueConverter; + + + Assert.AreEqual("GBX_ShiftPolygons.vgbs", Path.GetFileName(tcInputDataProvider.ShiftPolygon.Source)); + Assert.AreEqual("-100", tcInputDataProvider.ShiftPolygon.Rows[0][0]); + Assert.AreEqual("700", tcInputDataProvider.ShiftPolygon.Rows[0][1]); + Assert.AreEqual("1800", tcInputDataProvider.ShiftPolygon.Rows[0][2]); + + Assert.AreEqual("tc_data.vtcc", Path.GetFileName(tcInputDataProvider.TCData.Source)); + Assert.AreEqual(3, tcInputDataProvider.TCData.Rows.Count); + Assert.AreEqual("300", tcInputDataProvider.TCData.Rows[0][1]); + Assert.AreEqual("0.9", tcInputDataProvider.TCData.Rows[2][2]); + } + + [TestCase] + public void TestXMLInputAngledriveReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var angledriveInputData = inputDataProvider.AngledriveInputData; + + Assert.AreEqual("Generic Angledrive", angledriveInputData.Model); + + var lossMapData = angledriveInputData.LossMap; + Assert.AreEqual(1.2, angledriveInputData.Ratio); + Assert.AreEqual("0", lossMapData.Rows[0][0]); + Assert.AreEqual("-10000", lossMapData.Rows[0][1]); + Assert.AreEqual("100", lossMapData.Rows[0][2]); + + var lossMap = TransmissionLossMapReader.Create(lossMapData, angledriveInputData.Ratio, "Angledrive"); + } + + [TestCase] + public void TestXMLInputAxlGReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var axlegearDataProvider = inputDataProvider.AxleGearInputData; + + Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model); + + var lossMapData = axlegearDataProvider.LossMap; + Assert.AreEqual(2.59, axlegearDataProvider.Ratio); + Assert.AreEqual("0", lossMapData.Rows[0][0]); + Assert.AreEqual("-5000", lossMapData.Rows[0][1]); + Assert.AreEqual("115", lossMapData.Rows[0][2]); + + var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear"); + } + + [TestCase] + public void TestXMLInputRetarderReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var retarderDataProvider = inputDataProvider.RetarderInputData; + + Assert.AreEqual("Generic Retarder", retarderDataProvider.Model); + + var lossMapData = retarderDataProvider.LossMap; + + Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type); + + Assert.AreEqual("0", lossMapData.Rows[0][0]); + Assert.AreEqual("10", lossMapData.Rows[0][1]); + + var lossMap = RetarderLossMapReader.Create(lossMapData); + } + + [TestCase] + public void TestXMLInputAxleWheelsReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var vehicleDataProvider = inputDataProvider.VehicleInputData; + + var axles = vehicleDataProvider.Axles; + + Assert.AreEqual("315/70 R22.5", axles[0].Wheels); + Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient); + Assert.AreEqual(31300, axles[0].TyreTestLoad.Value()); + + Assert.AreEqual("315/70 R22.5", axles[1].Wheels); + Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient); + Assert.AreEqual(31300, axles[1].TyreTestLoad.Value()); + + //AssertHelper.Exception<VectoException>(() => { var tmp = vehicleDataProvider.Rim; }); + Assert.AreEqual(0.488822, vehicleDataProvider.DynamicTyreRadius.Value()); + } + + [TestCase] + public void TestXMLInputAuxiliariesReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + var auxDataProvider = inputDataProvider.AuxiliaryInputData(); + + var aux = auxDataProvider.Auxiliaries; + var aux1 = aux[0]; + + Assert.AreEqual("ES", aux1.ID); + + Assert.AreEqual(70, aux1.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower)); + Assert.AreEqual(640, aux1.DemandMap.Rows[2].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower)); + + var aux2 = aux[1]; + + Assert.AreEqual("FAN", aux2.ID); + Assert.AreEqual(70, aux2.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower)); + Assert.AreEqual(3190, aux2.DemandMap.Rows[113].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower)); + } + + [TestCase] + public void TestXMLInputADASReferencedFile() + { + //var reader = XmlReader.Create(EngineeringSampleFile); + + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + + var adas = inputDataProvider.DriverInputData; + + Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode); + } + + [TestCase] + public void TestVehicleInputReferencedFile() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + + var vehicleDataProvider = inputDataProvider.VehicleInputData; + + Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory); + Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration); + + Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value()); + Assert.AreEqual(18000.0, vehicleDataProvider.GrossVehicleMassRating.Value()); + Assert.AreEqual(6.29, inputDataProvider.AirdragInputData.AirDragArea.Value()); + + Assert.AreEqual(1500, vehicleDataProvider.Loading.Value()); + Assert.AreEqual(500, vehicleDataProvider.CurbMassExtra.Value()); + + Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio); + } + + [TestCase] + public void TestXMLPowertrainGenerationReferencedFile() + { + var fileWriter = new FileOutputWriter("foo"); + var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml"); + var sumData = new SummaryDataContainer(sumWriter); + var jobContainer = new JobContainer(sumData); + var dataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + + var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, dataProvider, fileWriter); + runsFactory.WriteModalResults = true; + + jobContainer.AddRuns(runsFactory); + + //Assert.AreEqual(6, jobContainer.Runs.Count); + } + + + [TestCase] + public void TestXMEngineering_DriverModelLACExt() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + + var driverDataProvider = inputDataProvider.DriverInputData; + + var lac = driverDataProvider.Lookahead; + Assert.IsTrue(lac.Enabled); + + Assert.AreEqual("lac_speedDependent.csv", Path.GetFileName(lac.CoastingDecisionFactorTargetSpeedLookup.Source)); + Assert.AreEqual("lac_velocityDrop.csv", Path.GetFileName(lac.CoastingDecisionFactorVelocityDropLookup.Source)); + } + + [TestCase] + public void TestXMEngineering_PTO() + { + var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true); + + var ptoData = inputDataProvider.PTOTransmissionInputData; + + //Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoData.PTOTransmissionType); + Assert.AreEqual(2, ptoData.PTOLossMap.Rows.Count); + Assert.AreEqual("2800", ptoData.PTOLossMap.Rows[1][0]); + Assert.AreEqual("100", ptoData.PTOLossMap.Rows[1][1]); + + Assert.AreEqual(4, ptoData.PTOCycle.Rows.Count); + Assert.AreEqual("3", ptoData.PTOCycle.Rows[3][0]); + Assert.AreEqual("1200", ptoData.PTOCycle.Rows[3][1]); + Assert.AreEqual("100", ptoData.PTOCycle.Rows[3][2]); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs index 43d3b2743b9725f09f649687bdecbf874feeabe6..f16b439d7e100fd4b4484558ae1c33c9c64add40 100644 --- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs @@ -92,8 +92,7 @@ namespace TUGraz.VectoCore.Tests.XML // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); //Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(), // fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); - Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(), - fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); + Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(), fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); var fldTable = engineDataProvider.FullLoadCurve; Assert.AreEqual(10, fldTable.Rows.Count);