diff --git a/Documentation/Comparison Vecto Results.xlsx b/Documentation/Comparison Vecto Results.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..abbb9e7a9fce1ca2b636ccf11e088c73b1164916 Binary files /dev/null and b/Documentation/Comparison Vecto Results.xlsx differ diff --git a/VECTO/GUI/GearboxGearDialog.vb b/VECTO/GUI/GearboxGearDialog.vb index 98aaaae8b3bc0769176e32dea1cc1fb71684507c..e4b2381f3d279b79f962480bb137531e1a206573 100644 --- a/VECTO/GUI/GearboxGearDialog.vb +++ b/VECTO/GUI/GearboxGearDialog.vb @@ -73,7 +73,7 @@ Public Class GearboxGearDialog If(String.IsNullOrWhiteSpace(TbMaxTorque.Text), Nothing, TbMaxTorque.Text.ToDouble().SI(Of NewtonMeter)) } Dim results As IList(Of ValidationResult) = - gearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), GearboxType) + gearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), GearboxType, False) If (results.Any()) Then Return results.Select(Function(r) r.ErrorMessage + String.Join(", ", r.MemberNames.Distinct())).ToList() diff --git a/VECTO/GUI/VehicleAxleDialog.vb b/VECTO/GUI/VehicleAxleDialog.vb index fefd712c245e86d1999898e5ac5b943aa02a870a..dc6487f4a4009e396cc3f952d5712c79de3ab5bf 100644 --- a/VECTO/GUI/VehicleAxleDialog.vb +++ b/VECTO/GUI/VehicleAxleDialog.vb @@ -59,7 +59,7 @@ Public Class VehicleAxleDialog } Dim results As IList(Of ValidationResult) = - axleData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Nothing) + axleData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Nothing, False) If results.Any() Then Dim messages As IEnumerable(Of String) = diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb index 464423448d2265ccbf385815d814f42e168e65d5..063053471f23f52498b76d1b8d546f1b234718d2 100644 --- a/VECTO/Input Files/Engine.vb +++ b/VECTO/Input Files/Engine.vb @@ -149,7 +149,7 @@ Public Class Engine Public Function SaveFile() As Boolean Dim validationResults As IList(Of ValidationResult) = - Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Nothing) + Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Nothing, False) If validationResults.Count > 0 Then Dim messages As IEnumerable(Of String) = @@ -229,13 +229,14 @@ Public Class Engine ' ReSharper disable once UnusedMember.Global -- used for Validation Public Shared Function ValidateEngine(engine As Engine, validationContext As ValidationContext) As ValidationResult Dim engineData As CombustionEngineData - Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), - ExecutionModeServiceContainer) - Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode) - Dim gbxtypeService As GearboxTypeServiceContainer = - TryCast(validationContext.GetService(GetType(GearboxTypeServiceContainer)), GearboxTypeServiceContainer) - Dim gbxType As GearboxType? = If(gbxtypeService Is Nothing, GearboxType.MT, gbxtypeService.Type) + + Dim modeService As VectoValidationModeServiceContainer = + TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), + VectoValidationModeServiceContainer) + Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode) + Dim emsCycle As Boolean = (modeService IsNot Nothing) AndAlso modeService.IsEMSCycle + Dim gbxType As GearboxType? = If(modeService Is Nothing, GearboxType.MT, modeService.GearboxType) Try If mode = ExecutionMode.Declaration Then @@ -248,7 +249,7 @@ Public Class Engine End If Dim result As IList(Of ValidationResult) = - engineData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType) + engineData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, emsCycle) If Not result.Any() Then Return ValidationResult.Success diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb index 3b9b02216ca954729ff8d4559eab1a4f1d996e33..48aeba42f93ffe902d3815b7b90a32c7a9d11282 100644 --- a/VECTO/Input Files/Gearbox.vb +++ b/VECTO/Input Files/Gearbox.vb @@ -109,7 +109,7 @@ Public Class Gearbox Public Function SaveFile() As Boolean Dim validationResults As IList(Of ValidationResult) = - Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Type) + Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Type, False) If validationResults.Count > 0 Then Dim messages As IEnumerable(Of String) = @@ -186,9 +186,11 @@ Public Class Gearbox ' ReSharper disable once UnusedMember.Global -- used by Validation Public Shared Function ValidateGearbox(gearbox As Gearbox, validationContext As ValidationContext) As ValidationResult - Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), - ExecutionModeServiceContainer) + Dim modeService As VectoValidationModeServiceContainer = + TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), + VectoValidationModeServiceContainer) Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode) + Dim emsCycle As Boolean = (modeService IsNot Nothing) AndAlso modeService.IsEMSCycle Dim axlegearData As AxleGearData Dim gearboxData As GearboxData @@ -226,14 +228,15 @@ Public Class Gearbox End If Dim result As IList(Of ValidationResult) = - gearboxData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gearbox.Type) + gearboxData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gearbox.Type, emsCycle) If result.Any() Then Return _ New ValidationResult("Gearbox Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage + String.Join(Environment.NewLine, r.MemberNames)).ToList()) End If - result = axlegearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gearbox.Type) + result = axlegearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gearbox.Type, + emsCycle) If result.Any() Then Return _ New ValidationResult("Axlegear Configuration is invalid. ", diff --git a/VECTO/Input Files/VectoJob.vb b/VECTO/Input Files/VectoJob.vb index 7efc024c87b30476cec2dd3bd22ab12ebac42f33..4f02fa750970ef3d7002ab28cabf595ec00e0177 100644 --- a/VECTO/Input Files/VectoJob.vb +++ b/VECTO/Input Files/VectoJob.vb @@ -109,7 +109,7 @@ Public Class VectoJob Public Function SaveFile() As Boolean Dim validationResults As IList(Of ValidationResult) = Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), - If(GearboxInputData Is Nothing, GearboxType.MT, GearboxInputData.Type)) + If(GearboxInputData Is Nothing, GearboxType.MT, GearboxInputData.Type), False) If validationResults.Count > 0 Then Dim messages As IEnumerable(Of String) = @@ -308,8 +308,9 @@ Public Class VectoJob ' ReSharper disable once UnusedMember.Global -- used by Validation Public Shared Function ValidateJob(vectoJob As VectoJob, validationContext As ValidationContext) As ValidationResult - Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), - ExecutionModeServiceContainer) + Dim modeService As VectoValidationModeServiceContainer = + TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), + VectoValidationModeServiceContainer) Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode) If mode = ExecutionMode.Engineering AndAlso vectoJob.EngineOnly Then @@ -402,7 +403,7 @@ Public Class VectoJob result = jobData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), - jobData.GearboxData.Type) + jobData.GearboxData.Type, False) If result.Any() Then Return _ New ValidationResult("Vecto Job Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList()) diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb index 283f575a72e5bcd043129d614f3e4f718cad44b7..0c3cd378155d50cf8368ab64adb373707ccd3563 100644 --- a/VECTO/Input Files/Vehicle.vb +++ b/VECTO/Input Files/Vehicle.vb @@ -95,12 +95,12 @@ Public Class Vehicle Dim ptoData As PTOData = Nothing Dim angledriveData As AngledriveData - Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), - ExecutionModeServiceContainer) + Dim modeService As VectoValidationModeServiceContainer = + TryCast(validationContext.GetService(GetType(VectoValidationModeServiceContainer)), + VectoValidationModeServiceContainer) Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode) - Dim gbxtypeService As GearboxTypeServiceContainer = - TryCast(validationContext.GetService(GetType(GearboxTypeServiceContainer)), GearboxTypeServiceContainer) - Dim gbxType As GearboxType? = If(gbxtypeService Is Nothing, Nothing, gbxtypeService.Type) + Dim emsCycle As Boolean = (modeService IsNot Nothing) AndAlso modeService.IsEMSCycle + Dim gbxType As GearboxType? = If(modeService Is Nothing, Nothing, modeService.GearboxType) Try If mode = ExecutionMode.Declaration Then @@ -120,14 +120,15 @@ Public Class Vehicle End If Dim result As IList(Of ValidationResult) = - vehicleData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType) + vehicleData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, emsCycle) If result.Any() Then Return _ New ValidationResult("Vehicle Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage + String.Join(Environment.NewLine, r.MemberNames)).ToList()) End If - result = retarderData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType) + result = retarderData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, + emsCycle) If result.Any() Then Return _ New ValidationResult("Retarder Configuration is invalid. ", @@ -135,7 +136,8 @@ Public Class Vehicle End If If vehicle.AngledriveType = AngledriveType.SeparateAngledrive Then - result = angledriveData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType) + result = angledriveData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, + emsCycle) If result.Any() Then Return _ New ValidationResult("AngleDrive Configuration is invalid. ", @@ -144,7 +146,7 @@ Public Class Vehicle End If If Not vehicle.PTOTransmissionType = "None" Then - result = ptoData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType) + result = ptoData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), gbxType, emsCycle) If result.Any() Then Return _ New ValidationResult("PTO Configuration is invalid. ", @@ -195,7 +197,7 @@ Public Class Vehicle SavedInDeclMode = Cfg.DeclMode Dim validationResults As IList(Of ValidationResult) = - Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Nothing) + Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), Nothing, False) If validationResults.Count > 0 Then Dim messages As IEnumerable(Of String) = diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs index c41577c4c1cf831ace657428b086cd296ffb9c84..42436a1e9ca5955f0aea4ade89ffb075250c314b 100644 --- a/VectoCommon/VectoCommon/Utils/Validation.cs +++ b/VectoCommon/VectoCommon/Utils/Validation.cs @@ -52,15 +52,18 @@ namespace TUGraz.VectoCommon.Utils /// <param name="entity">The entity.</param> /// <param name="mode">validate the entity for the given execution mode</param> /// <param name="gbxType"></param> + /// <param name="cycleType"></param> /// <returns>Null, if the validation was successfull. Otherwise a list of ValidationResults with the ErrorMessages.</returns> - public static IList<ValidationResult> Validate<T>(this T entity, ExecutionMode mode, GearboxType? gbxType) + public static IList<ValidationResult> Validate<T>(this T entity, ExecutionMode mode, GearboxType? gbxType, + bool emsCycle) { if (entity == null) { return new[] { new ValidationResult(string.Format("null value given for {0}", typeof(T))) }; } var context = new ValidationContext(entity); - context.ServiceContainer.AddService(typeof(ExecutionMode), new ExecutionModeServiceContainer(mode)); - context.ServiceContainer.AddService(typeof(GearboxTypeServiceContainer), new GearboxTypeServiceContainer(gbxType)); + context.ServiceContainer.AddService(typeof(VectoValidationModeServiceContainer), + new VectoValidationModeServiceContainer(mode, gbxType, emsCycle)); + var results = new List<ValidationResult>(); Validator.TryValidateObject(entity, context, results, true); @@ -136,27 +139,21 @@ namespace TUGraz.VectoCommon.Utils } } - public class ExecutionModeServiceContainer + public class VectoValidationModeServiceContainer { - public ExecutionModeServiceContainer(ExecutionMode mode) - { - Mode = mode; - } - public ExecutionMode Mode { get; protected set; } - } + public GearboxType? GearboxType { get; protected set; } + public bool IsEMSCycle { get; protected set; } - public class GearboxTypeServiceContainer - { - public GearboxTypeServiceContainer(GearboxType? type) + public VectoValidationModeServiceContainer(ExecutionMode mode, GearboxType? gbxType, bool isEMSCycle = false) { - Type = type; + Mode = mode; + GearboxType = gbxType; + IsEMSCycle = isEMSCycle; } - - - public GearboxType? Type { get; protected set; } } + /// <summary> /// Determines that the attributed object should be validated recursively. /// </summary> @@ -176,11 +173,11 @@ namespace TUGraz.VectoCommon.Utils return ValidationResult.Success; } - var modeService = validationContext.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer; - var mode = modeService != null ? modeService.Mode : ExecutionMode.Declaration; - - var gbxTypeService = validationContext.GetService(typeof(GearboxTypeServiceContainer)) as GearboxTypeServiceContainer; - var gbxType = gbxTypeService != null ? gbxTypeService.Type : GearboxType.MT; + var validationService = + validationContext.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer; + var mode = validationService != null ? validationService.Mode : ExecutionMode.Declaration; + var gbxType = validationService != null ? validationService.GearboxType : GearboxType.MT; + var isEmsCycle = validationService != null && validationService.IsEMSCycle; var enumerable = value as IEnumerable; if (enumerable != null) { @@ -192,8 +189,8 @@ namespace TUGraz.VectoCommon.Utils var baseType = valueType.GetGenericTypeDefinition(); if (baseType == typeof(KeyValuePair<,>)) { var kvResults = new List<ValidationResult>(); - kvResults.AddRange(valueType.GetProperty("Key").GetValue(element).Validate(mode, gbxType)); - kvResults.AddRange(valueType.GetProperty("Value").GetValue(element).Validate(mode, gbxType)); + kvResults.AddRange(valueType.GetProperty("Key").GetValue(element).Validate(mode, gbxType, isEmsCycle)); + kvResults.AddRange(valueType.GetProperty("Value").GetValue(element).Validate(mode, gbxType, isEmsCycle)); if (kvResults.Any()) { return new ValidationResult( string.Format("{1}[{0}] in {1} invalid: {2}", valueType.GetProperty("Key").GetValue(element), @@ -203,7 +200,7 @@ namespace TUGraz.VectoCommon.Utils } } - var results = element.Validate(mode, gbxType); + var results = element.Validate(mode, gbxType, isEmsCycle); if (results.Any()) { return new ValidationResult( string.Format("{1}[{0}] in {1} invalid: {2}", i, validationContext.DisplayName, @@ -213,7 +210,7 @@ namespace TUGraz.VectoCommon.Utils i++; } } else { - var results = value.Validate(mode, gbxType); + var results = value.Validate(mode, gbxType, isEmsCycle); if (!results.Any()) { return ValidationResult.Success; } @@ -247,6 +244,7 @@ namespace TUGraz.VectoCommon.Utils public class SIRangeAttribute : RangeAttribute { private ExecutionMode? _mode; + private bool? _emsMission; private string _unit = "-"; /// <summary> @@ -255,9 +253,72 @@ namespace TUGraz.VectoCommon.Utils /// <param name="minimum">The minimum.</param> /// <param name="maximum">The maximum.</param> /// <param name="mode">if specified the validation is only performed in the corresponding mode</param> - public SIRangeAttribute(int minimum, int maximum, ExecutionMode mode) : base(minimum, maximum) + public SIRangeAttribute(int minimum, int maximum, ExecutionMode mode) + : base(minimum, maximum) + { + _mode = mode; + } + + /// <summary> + /// Checks the Min-Max Range of SI Objects. + /// </summary> + /// <param name="minimum">The minimum.</param> + /// <param name="maximum">The maximum.</param> + public SIRangeAttribute(int minimum, int maximum) + : base(minimum, maximum) {} + + /// <summary> + /// Checks the Min-Max Range of SI Objects. + /// </summary> + /// <param name="minimum">The minimum.</param> + /// <param name="maximum">The maximum.</param> + /// <param name="mode">if specified the validation is only performed in the corresponding mode</param> + public SIRangeAttribute(double minimum, double maximum, ExecutionMode mode) + : base(minimum, maximum) + { + _mode = mode; + } + + /// <summary> + /// Checks the Min-Max Range of SI Objects. + /// </summary> + /// <param name="minimum">The minimum.</param> + /// <param name="maximum">The maximum.</param> + public SIRangeAttribute(double minimum, double maximum) + : base(minimum, maximum) {} + + /// <summary> + /// Checks the Min-Max Range of SI Objects. + /// </summary> + /// <param name="minimum">The minimum.</param> + /// <param name="maximum">The maximum.</param> + /// <param name="mode">if specified the validation is only performed in the corresponding mode</param> + public SIRangeAttribute(SI minimum, SI maximum, ExecutionMode mode) + : base(minimum.Value(), maximum.Value()) + { + _mode = mode; + } + + /// <summary> + /// Checks the Min-Max Range of SI Objects. + /// </summary> + /// <param name="minimum">The minimum.</param> + /// <param name="maximum">The maximum.</param> + public SIRangeAttribute(SI minimum, SI maximum) + : base(minimum.Value(), maximum.Value()) {} + + /// <summary> + /// Checks the Min-Max Range of SI Objects. + /// </summary> + /// <param name="minimum">The minimum.</param> + /// <param name="maximum">The maximum.</param> + /// <param name="mode">if specified the validation is only performed in the corresponding mode</param> + /// <param name="emsMission">Validation only applies if the mission is an EMS mission</param> + public SIRangeAttribute(int minimum, int maximum, ExecutionMode mode, bool emsMission) + : base(minimum, maximum) { _mode = mode; + _emsMission = emsMission; } /// <summary> @@ -265,7 +326,11 @@ namespace TUGraz.VectoCommon.Utils /// </summary> /// <param name="minimum">The minimum.</param> /// <param name="maximum">The maximum.</param> - public SIRangeAttribute(int minimum, int maximum) : base(minimum, maximum) {} + /// <param name="emsMission">Validation only applies if the mission is an EMS mission</param> + public SIRangeAttribute(int minimum, int maximum, bool emsMission) : base(minimum, maximum) + { + _emsMission = emsMission; + } /// <summary> /// Checks the Min-Max Range of SI Objects. @@ -273,9 +338,12 @@ namespace TUGraz.VectoCommon.Utils /// <param name="minimum">The minimum.</param> /// <param name="maximum">The maximum.</param> /// <param name="mode">if specified the validation is only performed in the corresponding mode</param> - public SIRangeAttribute(double minimum, double maximum, ExecutionMode mode) : base(minimum, maximum) + /// <param name="emsMission">Validation only applies if the mission is an EMS mission</param> + public SIRangeAttribute(double minimum, double maximum, ExecutionMode mode, bool emsMission) + : base(minimum, maximum) { _mode = mode; + _emsMission = emsMission; } /// <summary> @@ -283,7 +351,11 @@ namespace TUGraz.VectoCommon.Utils /// </summary> /// <param name="minimum">The minimum.</param> /// <param name="maximum">The maximum.</param> - public SIRangeAttribute(double minimum, double maximum) : base(minimum, maximum) {} + /// <param name="emsMission">Validation only applies if the mission is an EMS mission</param> + public SIRangeAttribute(double minimum, double maximum, bool emsMission) : base(minimum, maximum) + { + _emsMission = emsMission; + } /// <summary> /// Checks the Min-Max Range of SI Objects. @@ -291,9 +363,12 @@ namespace TUGraz.VectoCommon.Utils /// <param name="minimum">The minimum.</param> /// <param name="maximum">The maximum.</param> /// <param name="mode">if specified the validation is only performed in the corresponding mode</param> - public SIRangeAttribute(SI minimum, SI maximum, ExecutionMode mode) : base(minimum.Value(), maximum.Value()) + /// <param name="emsMission">Validation only applies if the mission is an EMS mission</param> + public SIRangeAttribute(SI minimum, SI maximum, ExecutionMode mode, bool emsMission) + : base(minimum.Value(), maximum.Value()) { _mode = mode; + _emsMission = emsMission; } /// <summary> @@ -301,7 +376,11 @@ namespace TUGraz.VectoCommon.Utils /// </summary> /// <param name="minimum">The minimum.</param> /// <param name="maximum">The maximum.</param> - public SIRangeAttribute(SI minimum, SI maximum) : base(minimum.Value(), maximum.Value()) {} + /// <param name="emsMission">Validation only applies if the mission is an EMS mission</param> + public SIRangeAttribute(SI minimum, SI maximum, bool emsMission) : base(minimum.Value(), maximum.Value()) + { + _emsMission = emsMission; + } /// <summary> /// Validates that an SI Object is inside the min-max range. @@ -318,14 +397,19 @@ namespace TUGraz.VectoCommon.Utils if (si != null) { _unit = si.GetUnitString(); } - - var modeService = validationContext.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer; - var mode = modeService == null ? (ExecutionMode?)null : modeService.Mode; - if (mode == null) { - return base.IsValid(si != null ? si.Value() : value, validationContext); - } - if (_mode == null || (_mode != null && (_mode.Value == mode))) { - return base.IsValid(si != null ? si.Value() : value, validationContext); + var validationService = + validationContext.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer; + var mode = validationService != null ? validationService.Mode : (ExecutionMode?)null; + var emsMode = validationService != null && validationService.IsEMSCycle; + + if (!_emsMission.HasValue || _emsMission.Value == emsMode) { + if (mode == null) { + return base.IsValid(si != null ? si.Value() : value, validationContext); + } + if (_mode == null || (_mode != null && (_mode.Value == mode))) { + return base.IsValid(si != null ? si.Value() : value, validationContext); + } + return ValidationResult.Success; } return ValidationResult.Success; } @@ -333,6 +417,7 @@ namespace TUGraz.VectoCommon.Utils public override string FormatErrorMessage(string name) { const string unitString = "{0} [{1}]"; + return string.Format(ErrorMessageString, name, string.Format(unitString, Minimum, _unit), string.Format(unitString, Maximum, _unit)); } diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs index cba7ea910b3815f7e131f0fe5a7a2edc40fdce43..3df392f60f5228f5ee77997c3776f13acfe7e76f 100644 --- a/VectoCore/VectoCore/Configuration/Constants.cs +++ b/VectoCore/VectoCore/Configuration/Constants.cs @@ -167,6 +167,7 @@ namespace TUGraz.VectoCore.Configuration public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>(); public static Kilogram MaximumGrossVehicleWeight = 40000.SI<Kilogram>(); + public static Kilogram MaximumGrossVehicleWeightEMS = 60000.SI<Kilogram>(); // the torque converter characteristics curve has to be defined up to this speed ratio public const double RequiredTorqueConverterSpeedRatio = 2.2; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 87f34b29e060f9c5d2abe829059cff5d04d3204f..705bd8b7de19b8b9f29cf291128a11683cf89f91 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -43,6 +43,7 @@ using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter @@ -93,15 +94,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } var retVal = SetCommonVehicleData(data); - retVal.TrailerGrossVehicleWeight = mission.TrailerGrossVehicleWeight; - retVal.BodyAndTrailerWeight = mission.BodyCurbWeight + mission.TrailerCurbWeight; + retVal.TrailerGrossVehicleWeight = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0); + retVal.BodyAndTrailerWeight = mission.BodyCurbWeight + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); retVal.CurbWeight += retVal.BodyAndTrailerWeight; + retVal.Loading = loading; + var drivenIndex = DrivenAxleIndex(data.Axles); retVal.DynamicTyreRadius = - DeclarationData.Wheels.Lookup(data.Axles[DeclarationData.PoweredAxle()].Wheels).DynamicTyreRadius; // TODO! - retVal.CargoVolume = mission.MissionType != MissionType.Construction ? mission.CargoVolume : 0.SI<CubicMeter>(); + DeclarationData.Wheels.Lookup(data.Axles[drivenIndex].Wheels).DynamicTyreRadius; + retVal.CargoVolume = mission.MissionType != MissionType.Construction ? mission.TotalCargoVolume : 0.SI<CubicMeter>(); - var aerodynamicDragArea = data.AirDragArea + mission.DeltaCdA; + var aerodynamicDragArea = data.AirDragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0); retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(aerodynamicDragArea, @@ -127,23 +130,31 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter axleData.Add(axle); } - axleData.AddRange(mission.TrailerAxleWeightDistribution.Select(tmp => { - var wheel = mission.TrailerType != TrailerType.None - ? DeclarationData.StandardBodies.Lookup(mission.TrailerType.ToString()).Wheels - : DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType); - return new Axle { + foreach (var trailer in mission.Trailer) { + axleData.AddRange(trailer.TrailerWheels.Select(trailerWheel => new Axle { AxleType = AxleType.Trailer, - AxleWeightShare = tmp, + AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count, TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = wheel.Inertia - }; - })); + Inertia = trailerWheel.Inertia + })); + } retVal.AxleData = axleData; return retVal; } + private static int DrivenAxleIndex(IList<IAxleDeclarationInputData> axles) + { + for (var i = 0; i < axles.Count; i++) { + if (axles[i].AxleType != AxleType.VehicleDriven) { + continue; + } + return i; + } + return DeclarationData.PoweredAxle(); + } + internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, GearboxType gearboxType) { if (!engine.SavedInDeclarationMode) { @@ -249,6 +260,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter DemandType = AuxiliaryDemandType.Constant, Technology = auxData.Technology }; + + mission = mission.GetNonEMSMissionType(); switch (auxType) { case AuxiliaryType.Fan: aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault()); diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs index 09a63d5cbc9981403704f7d68597a8dea79c7278..5a9745188299ed856d3f61645882812d0d9428e7 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs @@ -34,6 +34,7 @@ using System.Linq; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.Models.Declaration; @@ -91,8 +92,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl }; Report.InitializeReport(powertrainConfig, segment); } - + var maxEnginePower = engineData.FullLoadCurve.FullLoadStationaryPower(engineData.FullLoadCurve.PreferredSpeed); foreach (var mission in segment.Missions) { + if (mission.MissionType.IsEMS() && maxEnginePower.IsSmaller(DeclarationData.MinEnginePowerForEMS)) { + continue; + } DrivingCycleData cycle; lock (CyclesCacheLock) { if (CyclesCache.ContainsKey(mission.MissionType)) { @@ -121,8 +125,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl Report = Report, Mission = mission, }; - simulationRunData.EngineData.WHTCCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(mission.MissionType, - engineData.WHTCRural, engineData.WHTCUrban, engineData.WHTCMotorway) * engineData.ColdHotCorrectionFactor; + simulationRunData.EngineData.WHTCCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( + mission.MissionType.GetNonEMSMissionType(), engineData.WHTCRural, engineData.WHTCUrban, engineData.WHTCMotorway) * + engineData.ColdHotCorrectionFactor; //simulationRunData.Cycle.Name = mission.MissionType.ToString(); simulationRunData.VehicleData.VehicleClass = segment.VehicleClass; yield return simulationRunData; diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 8d1f35e7334954fe24810951eb51dc4b760dcf36..67388a5ee2818b74ee53cc6fac16e3a3ee350dbb 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -48,6 +48,8 @@ namespace TUGraz.VectoCore.Models.Declaration { public const string DeclarationDataResourcePrefix = "TUGraz.VectoCore.Resources.Declaration"; + public static readonly Watt MinEnginePowerForEMS = 300e3.SI<Watt>(); + private static DeclarationData _instance; private Segments _segments; private Wheels _wheels; @@ -63,6 +65,7 @@ namespace TUGraz.VectoCore.Models.Declaration private Payloads _payloads; private PTOTransmission _pto; + public static PTOTransmission PTOTransmission { get { return Instance()._pto ?? (Instance()._pto = new PTOTransmission()); } @@ -221,7 +224,7 @@ namespace TUGraz.VectoCore.Models.Declaration public const double RollResistanceCoefficient = 0.00555; public const double TyreTestLoad = 37500; public const bool TwinTyres = false; - public const string WheelsType = "385/65 R 22.5"; + //public const string WheelsType = "385/65 R 22.5"; } public static class Engine diff --git a/VectoCore/VectoCore/Models/Declaration/Mission.cs b/VectoCore/VectoCore/Models/Declaration/Mission.cs index 7df3a8328840c6573bd95e35ff6c5d35fa547e7e..0c59348141f39b7aceb8995f5afd25102d78abbe 100644 --- a/VectoCore/VectoCore/Models/Declaration/Mission.cs +++ b/VectoCore/VectoCore/Models/Declaration/Mission.cs @@ -65,22 +65,21 @@ namespace TUGraz.VectoCore.Models.Declaration public MissionType MissionType; public string CrossWindCorrectionParameters; public double[] AxleWeightDistribution; - public double[] TrailerAxleWeightDistribution; + public Kilogram CurbWeight; public Kilogram BodyCurbWeight; public Kilogram BodyGrossVehicleWeight; - public TrailerType TrailerType; - public Kilogram TrailerCurbWeight; - public Kilogram TrailerGrossVehicleWeight; + public Stream CycleFile; - public SquareMeter DeltaCdA; + + public List<MissionTrailer> Trailer; public Kilogram MinLoad; public Kilogram RefLoad; public Kilogram MaxLoad; - public CubicMeter CargoVolume; + public CubicMeter TotalCargoVolume; public Dictionary<LoadingType, Kilogram> Loadings { @@ -94,10 +93,34 @@ namespace TUGraz.VectoCore.Models.Declaration } } + public class MissionTrailer + { + public TrailerType TrailerType; + public Kilogram TrailerCurbWeight; + public Kilogram TrailerGrossVehicleWeight; + public List<Wheels.Entry> TrailerWheels; + public double TrailerAxleWeightShare; + public SquareMeter DeltaCdA; + public CubicMeter CargoVolume; + } + public enum TrailerType { - None, + //None, T1, - T2 + T2, + ST1, + Dolly + } + + public static class TrailterTypeHelper + { + public static TrailerType Parse(string trailer) + { + if ("d".Equals(trailer, StringComparison.InvariantCultureIgnoreCase)) { + return TrailerType.Dolly; + } + return trailer.ParseEnum<TrailerType>(); + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/MissionType.cs b/VectoCore/VectoCore/Models/Declaration/MissionType.cs index 8ccc72b7b96b46651a1bcafc2cd0b158713f896a..8052e790aacd5dd04aef165f11b3af26988d5f32 100644 --- a/VectoCore/VectoCore/Models/Declaration/MissionType.cs +++ b/VectoCore/VectoCore/Models/Declaration/MissionType.cs @@ -34,7 +34,9 @@ namespace TUGraz.VectoCore.Models.Declaration public enum MissionType { LongHaul, + LongHaulEMS, RegionalDelivery, + RegionalDeliveryEMS, UrbanDelivery, MunicipalUtility, Construction, @@ -51,5 +53,21 @@ namespace TUGraz.VectoCore.Models.Declaration { return self.ToString().ToLowerInvariant(); } + + public static bool IsEMS(this MissionType self) + { + return self == MissionType.LongHaulEMS || self == MissionType.RegionalDeliveryEMS; + } + + public static MissionType GetNonEMSMissionType(this MissionType self) + { + if (self == MissionType.LongHaulEMS) { + return MissionType.LongHaul; + } + if (self == MissionType.RegionalDeliveryEMS) { + return MissionType.RegionalDelivery; + } + return self; + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs index 99495073ea211e1f835cbda37cb8a6b99f7320e1..2795c521c8ddd43fad00872b0a6a784960f93dca 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segments.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs @@ -37,6 +37,7 @@ using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Declaration @@ -53,8 +54,7 @@ namespace TUGraz.VectoCore.Models.Declaration protected override string ErrorMessage { - get - { + get { return "ERROR: Could not find the declaration segment for vehicle. Category: {0}, AxleConfiguration: {1}, GrossVehicleWeight: {2}"; } @@ -126,32 +126,49 @@ namespace TUGraz.VectoCore.Models.Declaration foreach (var missionType in missionTypes.Where(m => row.Field<string>(m.ToString()) != "-")) { var body = DeclarationData.StandardBodies.Lookup(row.Field<string>("body")); - var trailerIsUsed = ShouldTrailerBeUsed(row, missionType); - var trailerField = row.Field<string>("trailer"); - var trailerType = trailerIsUsed && !string.IsNullOrWhiteSpace(trailerField) - ? trailerField.ParseEnum<TrailerType>() - : TrailerType.None; - var trailer = trailerIsUsed - ? DeclarationData.StandardBodies.Lookup(trailerField) - : StandardBodies.Empty; + var maxGVW = Constants.SimulationSettings.MaximumGrossVehicleWeight; + var trailers = new List<MissionTrailer>(); + if (missionType.IsEMS()) { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleWeightEMS; + var trailerList = row.Field<string>("ems").Split('+'); + var trailerWeightShares = row.Field<string>("traileraxles" + GetMissionSuffix(missionType)).Split('/'); + if (trailerList.Length != trailerWeightShares.Length) { + throw new VectoException( + "Error in segmentation table: number of trailers and list of weight shares does not match!"); + } + trailers.AddRange(trailerWeightShares.Select((t, i) => CreateTrailer(trailerList[i], t.ToDouble() / 100.0, i == 0))); + } else { + if (ShouldTrailerBeUsed(row, missionType)) { + var trailerValue = row.Field<string>("trailer"); + if (string.IsNullOrWhiteSpace(trailerValue)) { + throw new VectoException("Error in segmentation table: trailer weight share is defined but not trailer type!"); + } + trailers.Add(CreateTrailer(trailerValue, GetTrailerAxleWeightDistribution(row, missionType), true)); + } + } - var semiTrailerField = row.Field<string>("semitrailer"); - var semiTrailer = !string.IsNullOrWhiteSpace(semiTrailerField) - ? DeclarationData.StandardBodies.Lookup(semiTrailerField) - : StandardBodies.Empty; - trailer += semiTrailer; + //var semiTrailerField = row.Field<string>("semitrailer"); + //var semiTrailer = !string.IsNullOrWhiteSpace(semiTrailerField) + // ? DeclarationData.StandardBodies.Lookup(semiTrailerField) + // : StandardBodies.Empty; + + //trailer += semiTrailer; // limit gvw to MaxGVW (40t) - var gvw = VectoMath.Min(grossVehicleWeight + trailer.GrossVehicleWeight, - Constants.SimulationSettings.MaximumGrossVehicleWeight); - var maxLoad = gvw - curbWeight - body.CurbWeight - trailer.CurbWeight; + var gvw = + VectoMath.Min( + grossVehicleWeight + trailers.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0), + maxGVW); + var maxLoad = gvw - curbWeight - body.CurbWeight - + trailers.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); var refLoadValue = row.ParseDoubleOrGetDefault(missionType.ToString(), double.NaN); Kilogram refLoad; if (double.IsNaN(refLoadValue)) { refLoad = DeclarationData.GetPayloadForGrossVehicleWeight(grossVehicleWeight, missionType) + - DeclarationData.GetPayloadForTrailerWeight(trailer.GrossVehicleWeight, trailer.CurbWeight); + trailers.Sum(t => DeclarationData.GetPayloadForTrailerWeight(t.TrailerGrossVehicleWeight, t.TrailerCurbWeight)) + .DefaultIfNull(0); } else { refLoad = refLoadValue.SI<Kilogram>(); } @@ -160,23 +177,20 @@ namespace TUGraz.VectoCore.Models.Declaration var mission = new Mission { MissionType = missionType, - CrossWindCorrectionParameters = row.Field<string>("crosswindcorrection" + GetMissionSuffix(missionType)), + CrossWindCorrectionParameters = row.Field<string>("crosswindcorrection" + GetMissionSuffix(missionType, true)), CycleFile = - RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + + RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + + missionType.ToString().Replace("EMS", "") + Constants.FileExtensions.CycleFile), AxleWeightDistribution = GetAxleWeightDistribution(row, missionType), CurbWeight = curbWeight, BodyCurbWeight = body.CurbWeight, BodyGrossVehicleWeight = grossVehicleWeight, - TrailerType = trailerType, - TrailerCurbWeight = trailer.CurbWeight, - TrailerGrossVehicleWeight = trailer.GrossVehicleWeight, - DeltaCdA = trailer.DeltaCrossWindArea, + Trailer = trailers, MinLoad = 0.SI<Kilogram>(), MaxLoad = maxLoad, RefLoad = refLoad, - TrailerAxleWeightDistribution = GetTrailerAxleWeightDistribution(row, missionType), - CargoVolume = body.CargoVolume + trailer.CargoVolume, + TotalCargoVolume = body.CargoVolume + trailers.Sum(t => t.CargoVolume).DefaultIfNull(0), }; missions.Add(mission); } @@ -191,15 +205,14 @@ namespace TUGraz.VectoCore.Models.Declaration return !string.IsNullOrWhiteSpace(row.Field<string>("traileraxles" + GetMissionSuffix(missionType))); } - private static double[] GetTrailerAxleWeightDistribution(DataRow row, MissionType missionType) + private static double GetTrailerAxleWeightDistribution(DataRow row, MissionType missionType) { var trailerAxles = - row.Field<string>("traileraxles" + GetMissionSuffix(missionType)).Split('/'); - if (!string.IsNullOrWhiteSpace(trailerAxles[0])) { - var count = int.Parse(trailerAxles[1]); - return (trailerAxles[0].ToDouble() / 100.0 / count).Repeat(count).ToArray(); + row.Field<string>("traileraxles" + GetMissionSuffix(missionType)); + if (!string.IsNullOrWhiteSpace(trailerAxles)) { + return trailerAxles.ToDouble() / 100.0; } - return new double[0]; + return 0; } private static double[] GetAxleWeightDistribution(DataRow row, MissionType missionType) @@ -209,9 +222,28 @@ namespace TUGraz.VectoCore.Models.Declaration .Split('/').ToDouble().Select(x => x / 100.0).ToArray(); } - private static string GetMissionSuffix(MissionType missionType) + private static string GetMissionSuffix(MissionType missionType, bool ignoreEMS = false) { - return missionType == MissionType.LongHaul ? "-longhaul" : "-other"; + return "-" + + (missionType.IsEMS() && ignoreEMS + ? "" + : (missionType.GetNonEMSMissionType() == MissionType.LongHaul ? "longhaul" : "other")) + + (missionType.IsEMS() ? "ems" : ""); + } + + private static MissionTrailer CreateTrailer(string trailerValue, double axleWeightShare, bool firstTrailer) + { + var trailerType = TrailterTypeHelper.Parse(trailerValue); + var trailer = DeclarationData.StandardBodies.Lookup(trailerType.ToString()); + return new MissionTrailer { + TrailerType = trailerType, + TrailerWheels = trailer.Wheels, + TrailerAxleWeightShare = axleWeightShare, + TrailerCurbWeight = trailer.CurbWeight, + TrailerGrossVehicleWeight = trailer.GrossVehicleWeight, + DeltaCdA = trailer.DeltaCrossWindArea[firstTrailer ? 0 : 1], + CargoVolume = trailer.CargoVolume + }; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs index 184bf9cb48a971f2b4cbbf6b1e93c56a9199cb84..8c66898676d76c4c737461ba8a5b37b9014e08d2 100644 --- a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs +++ b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs @@ -29,6 +29,8 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; +using System.Collections.Generic; using System.Data; using System.Linq; using TUGraz.VectoCommon.Utils; @@ -40,9 +42,9 @@ namespace TUGraz.VectoCore.Models.Declaration { public Kilogram CurbWeight; public Kilogram GrossVehicleWeight; - public SquareMeter DeltaCrossWindArea; + public SquareMeter[] DeltaCrossWindArea; public string Name; - public Wheels.Entry Wheels; + public List<Wheels.Entry> Wheels; public CubicMeter CargoVolume; public Kilogram MaxPayLoad @@ -50,8 +52,13 @@ namespace TUGraz.VectoCore.Models.Declaration get { return GrossVehicleWeight - CurbWeight; } } - public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter deltaCrossWindArea, - Wheels.Entry wheels, CubicMeter volume) + public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea, + Wheels.Entry wheels, int axleCount, CubicMeter volume) : + this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea, + wheels == null ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels, axleCount).ToList(), volume) {} + + private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea, + List<Wheels.Entry> wheels, CubicMeter volume) { Name = name; CurbWeight = curbWeight; @@ -61,14 +68,15 @@ namespace TUGraz.VectoCore.Models.Declaration CargoVolume = volume; } - - public static StandardBody operator +(StandardBody first, StandardBody second) - { - return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight, - first.GrossVehicleWeight + second.GrossVehicleWeight, - first.DeltaCrossWindArea + second.DeltaCrossWindArea, - null, first.CargoVolume + second.CargoVolume); - } + //public static StandardBody operator +(StandardBody first, StandardBody second) + //{ + // var wheels = new List<Wheels.Entry>(first.Wheels); + // wheels.AddRange(second.Wheels); + // return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight, + // first.GrossVehicleWeight + second.GrossVehicleWeight, + // first.DeltaCrossWindArea + second.DeltaCrossWindArea, + // wheels, first.CargoVolume + second.TotalCargoVolume); + //} } /// <summary> @@ -83,7 +91,7 @@ namespace TUGraz.VectoCore.Models.Declaration public sealed class StandardBodies : LookupData<string, StandardBody> { public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(), - 0.SI<SquareMeter>(), null, 0.SI<CubicMeter>()); + new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>()); protected override string ResourceId { @@ -102,15 +110,23 @@ namespace TUGraz.VectoCore.Models.Declaration protected override void ParseData(DataTable table) { - Data = table.Rows.Cast<DataRow>().Select(k => new StandardBody( - k.Field<string>("name"), - k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(), - k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(), - k.ParseDoubleOrGetDefault("deltacdxafortraileroperationinlonghaul").SI<SquareMeter>(), - !string.IsNullOrWhiteSpace(k.Field<string>("wheels")) - ? DeclarationData.Wheels.Lookup(k.Field<string>("wheels")) - : null, - k.ParseDouble("cargovolume").SI<CubicMeter>())) + Data = table.Rows.Cast<DataRow>().Select(k => { + var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul"); + var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }; + if (!deltaCdxAStr.Equals("-")) { + deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray(); + } + return new StandardBody( + k.Field<string>("name"), + k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(), + k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(), + deltaCdxA, + !string.IsNullOrWhiteSpace(k.Field<string>("wheels")) + ? DeclarationData.Wheels.Lookup(k.Field<string>("wheels")) + : null, + Int32.Parse(k.Field<string>("axlecount")), + k.ParseDouble("cargovolume").SI<CubicMeter>()); + }) .ToDictionary(kv => kv.Name); } } diff --git a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs index dd4107bf9e6a2dd5346b514d7ccacf129ef6a21a..f647443cc000e6535018ee90393f963bb30a913e 100644 --- a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs +++ b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs @@ -62,6 +62,9 @@ namespace TUGraz.VectoCore.Models.Declaration protected override void ParseData(DataTable table) { foreach (MissionType mission in Enum.GetValues(typeof(MissionType))) { + if (mission.IsEMS()) { + continue; + } var values = table.Columns[mission.ToString().ToLower()].Values<string>().ToDouble().ToArray(); Data[mission] = new Entry { Urban = values[0], Rural = values[1], Motorway = values[2] }; } diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs index ac24271e10680039ab3f8562ff9644864d8cc49d..048c4413ce7c7a186d788d48bffc7fe8fb045cf4 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs @@ -42,6 +42,7 @@ using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData; using TUGraz.VectoCore.InputData.Reader.Impl; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.OutputData.ModFilter; @@ -180,7 +181,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl throw new ArgumentOutOfRangeException("CycleType unknown:" + data.Cycle.CycleType); } - var validationErrors = run.Validate(_mode, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type); + var validationErrors = run.Validate(_mode, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type, data.Mission != null && data.Mission.MissionType.IsEMS()); if (validationErrors.Any()) { throw new VectoException("Validation of Run-Data Failed: " + string.Join("\n", validationErrors.Select(r => r.ErrorMessage + string.Join("; ", r.MemberNames)))); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs index bef80d665a8268563dd21d50cb1cbe3f5a28cc3d..2f0f7332970df1762646b4b8e599fcd3709dce97 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs @@ -77,17 +77,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox // ReSharper disable once UnusedMember.Global -- used via validation public static ValidationResult ValidateGearData(GearData gearData, ValidationContext context) { - var modeService = context.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer; - var mode = modeService == null ? ExecutionMode.Declaration : modeService.Mode; - - var gbxTypeService = context.GetService(typeof(GearboxTypeServiceContainer)) as GearboxTypeServiceContainer; - var gbxType = gbxTypeService == null ? GearboxType.MT : gbxTypeService.Type; + var validationService = + context.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer; + var mode = validationService != null ? validationService.Mode : ExecutionMode.Declaration; + var gbxType = validationService != null ? validationService.GearboxType : GearboxType.MT; + var emsMission = validationService != null && validationService.IsEMSCycle; if (gearData.HasTorqueConverter) { if (gearData.TorqueConverterShiftPolygon == null) { return new ValidationResult("Shift Polygon for Torque Converter Gear required!"); } - var result = gearData.TorqueConverterShiftPolygon.Validate(mode, gbxType); + var result = gearData.TorqueConverterShiftPolygon.Validate(mode, gbxType, emsMission); if (result.Any()) { return new ValidationResult(string.Format("Validation of GearData failed"), result.Select(x => x.ErrorMessage)); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs index 9b41a3a89c317a321258b886c7b0ba1beeb6c4a8..3069a63cae0014d01309ab42e67e4641f9f4dcd4 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/ShiftPolygon.cs @@ -145,11 +145,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox // ReSharper disable once UnusedMember.Global -- used via validation public static ValidationResult ValidateShiftPolygon(ShiftPolygon shiftPolygon, ValidationContext validationContext) { - var gbxTypeService = validationContext.GetService(typeof(GearboxTypeServiceContainer)) as GearboxTypeServiceContainer; - var gbxType = gbxTypeService == null ? null : gbxTypeService.Type; + var validationService = + validationContext.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer; + var gbxType = validationService != null ? validationService.GearboxType : null; - if (gbxType == null || gbxType.Value.AutomaticTransmission()) + if (gbxType == null || gbxType.Value.AutomaticTransmission()) { return ValidationResult.Success; + } return shiftPolygon.Downshift.Pairwise(Tuple.Create) .Any( @@ -182,7 +184,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox // vertical line return double.MaxValue.SI<NewtonMeter>(); } - return VectoMath.Interpolate(section.Item1.AngularSpeed, section.Item2.AngularSpeed, section.Item1.Torque, + return VectoMath.Interpolate(section.Item1.AngularSpeed, section.Item2.AngularSpeed, section.Item1.Torque, section.Item2.Torque, inAngularVelocity); } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs index e52acfa68889644ba9fdbe4502350739ec92d1d5..d13afec5cd6d6849eac38bbf8daf335832bd04d5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs @@ -109,13 +109,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { var mode = GetExecutionMode(validationContext); //var gbxType = GetGearboxType(validationContext); + var emsMission = GetEmsMode(validationContext); var result = new List<ValidationResult>(); if (gearboxData.Type.AutomaticTransmission()) { gearboxData.TorqueConverterData.RequiredSpeedRatio = Math.Round(Constants.SimulationSettings.RequiredTorqueConverterSpeedRatio / gearboxData.Gears[1].Ratio * gearboxData.Gears[1].TorqueConverterRatio, 4); - result.AddRange(gearboxData.TorqueConverterData.Validate(mode, gearboxData.Type)); + result.AddRange(gearboxData.TorqueConverterData.Validate(mode, gearboxData.Type, emsMission)); //result.AddRange(gearboxData.PowershiftShiftTime.Validate(mode, gearboxData.Type)); //result.AddRange(gearboxData.PowershiftInertiaFactor.Validate(mode, gearboxData.Type)); validationContext.MemberName = "PowershiftInertiaFactor"; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs index 344747dfddadb6bc78702a81a3c19675f9a47abf..6cb49c1effcb8f81571b27dc8519a560d97aa982 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/SimulationComponentData.cs @@ -57,9 +57,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data protected static ExecutionMode GetExecutionMode(ValidationContext context) { - var modeService = context.GetService(typeof(ExecutionMode)) as ExecutionModeServiceContainer; - return modeService == null ? ExecutionMode.Declaration : modeService.Mode; + var validationService = + context.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer; + return validationService == null ? ExecutionMode.Declaration : validationService.Mode; } + protected static bool GetEmsMode(ValidationContext context) + { + var validationService = + context.GetService(typeof(VectoValidationModeServiceContainer)) as VectoValidationModeServiceContainer; + return validationService != null && validationService.IsEMSCycle; + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs index b5f7b71c78658100949956fe1a1845a818aeb9aa..b9f7ab828b2389ac04dd262bc32eabd77f12dbf6 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs @@ -75,17 +75,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data /// (+ Curb Weight of Standard-Body if it has one) /// (+ Curb Weight of Trailer if it has one) /// </summary> - [Required, SIRange(500, 40000)] + [Required, SIRange(500, 40000, emsMission: false), + SIRange(0, 60000, emsMission: true)] public Kilogram CurbWeight { get; internal set; } - /// <summary> /// Curb Weight of Standard-Body (if it has one) /// + Curb Weight of Trailer (if it has one) /// </summary> public Kilogram BodyAndTrailerWeight { get; internal set; } - [Required, SIRange(0, 40000)] + [Required, SIRange(0, 40000, emsMission: false), + SIRange(0, 60000, emsMission: true)] public Kilogram Loading { get; internal set; } [SIRange(0, 500)] @@ -95,14 +96,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data /// The Gross Vehicle Weight of the Vehicle. /// </summary> [Required, - SIRange(3500, 40000, ExecutionMode.Declaration), + SIRange(3500, 40000, ExecutionMode.Declaration, emsMission: false), + SIRange(0, 60000, ExecutionMode.Declaration, emsMission: true), SIRange(0, 1000000, ExecutionMode.Engineering)] public Kilogram GrossVehicleWeight { get; internal set; } /// <summary> /// The Gross Vehicle Weight of the Trailer (if the vehicle has one). /// </summary> - [Required, SIRange(0, 40000)] + [Required, SIRange(0, 40000, emsMission: false), + SIRange(0, 60000, emsMission: true)] public Kilogram TrailerGrossVehicleWeight { get; internal set; } [Required, SIRange(0.1, 0.7)] @@ -185,6 +188,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public static ValidationResult ValidateVehicleData(VehicleData vehicleData, ValidationContext validationContext) { var mode = GetExecutionMode(validationContext); + var emsCycle = GetEmsMode(validationContext); if (vehicleData.AxleData.Count < 1) { return new ValidationResult("At least two axles need to be specified"); @@ -210,7 +214,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data // total gvw is limited by max gvw (40t) var gvwTotal = VectoMath.Min(vehicleData.GrossVehicleWeight + vehicleData.TrailerGrossVehicleWeight, - Constants.SimulationSettings.MaximumGrossVehicleWeight); + emsCycle + ? Constants.SimulationSettings.MaximumGrossVehicleWeightEMS + : Constants.SimulationSettings.MaximumGrossVehicleWeight); if (mode != ExecutionMode.Declaration) { return ValidationResult.Success; } diff --git a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs index 7ec70b93e499ff48df8fd12b3c0462a333c634b2..2c372d3fa6f3aa92cf448d6e106940770dc61b29 100644 --- a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs @@ -152,7 +152,7 @@ namespace TUGraz.VectoCore.OutputData.PDF CreateTitlePage(Missions) }; //tasks.AddRange( - pages.AddRange(Missions.OrderBy(m => m.Key) + pages.AddRange(Missions.Where(m => !m.Key.IsEMS()).OrderBy(m => m.Key) .Select((m, i) => CreateCyclePage(m.Value, i + 2, Missions.Count + 1))); //Task.WaitAll(tasks.Cast<Task>().ToArray()); @@ -186,7 +186,7 @@ namespace TUGraz.VectoCore.OutputData.PDF { var stream = new MemoryStream(); var resourceName = string.Format("{0}.Report.title{1}CyclesTemplate.pdf", - DeclarationData.DeclarationDataResourcePrefix, missions.Count); + DeclarationData.DeclarationDataResourcePrefix, missions.Count(m => !m.Key.IsEMS())); var inputStream = RessourceHelper.ReadStream(resourceName); var reader = new PdfReader(inputStream); var stamper = new PdfStamper(reader, stream); @@ -208,9 +208,10 @@ namespace TUGraz.VectoCore.OutputData.PDF pdfFields.SetField("PageNr", string.Format("Page {0} of {1}", 1, missions.Count + 1)); var i = 1; - foreach (var results in missions.Values.OrderBy(m => m.Mission.MissionType)) { - var trailerSuffix = results.Mission.TrailerType != TrailerType.None - ? string.Format(" with {0} Trailer", results.Mission.TrailerType) + foreach (var results in missions.Where(m => !m.Key.IsEMS()).Select(m => m.Value).OrderBy(m => m.Mission.MissionType)) { + var trailerSuffix = results.Mission.Trailer.Count > 0 + ? string.Format(" with {0} Trailer", + string.Join(" + ", results.Mission.Trailer.Select(t => t.TrailerType.ToString()))) : ""; pdfFields.SetField("Mission" + i, results.Mission.MissionType + trailerSuffix); @@ -244,7 +245,7 @@ namespace TUGraz.VectoCore.OutputData.PDF img.SetAbsolutePosition(360, 75); content.AddImage(img); - img = GetVehicleImage(Segment, TrailerType.None); + img = GetVehicleImage(Segment, new List<MissionTrailer>()); img.ScaleAbsolute(180, 50); img.SetAbsolutePosition(30, 475); content.AddImage(img); @@ -284,8 +285,9 @@ namespace TUGraz.VectoCore.OutputData.PDF pdfFields.SetField("HDVclass", "HDV Class " + Segment.VehicleClass.GetClassNumber()); pdfFields.SetField("PageNr", string.Format("Page {0} of {1}", currentPageNr, pageCount)); - var trailerSuffix = results.Mission.TrailerType != TrailerType.None - ? string.Format(" with {0} Trailer", results.Mission.TrailerType) + var trailerSuffix = results.Mission.Trailer.Count > 0 + ? string.Format(" with {0} Trailer", + string.Join(" + ", results.Mission.Trailer.Select(t => t.TrailerType.ToString()))) : ""; pdfFields.SetField("Mission", results.Mission.MissionType + trailerSuffix); @@ -310,7 +312,7 @@ namespace TUGraz.VectoCore.OutputData.PDF var content = stamper.GetOverContent(1); - var img = GetVehicleImage(Segment, results.Mission.TrailerType); + var img = GetVehicleImage(Segment, results.Mission.Trailer); img.ScaleAbsolute(180, 50); img.SetAbsolutePosition(600, 475); content.AddImage(img); @@ -613,31 +615,34 @@ namespace TUGraz.VectoCore.OutputData.PDF /// <summary> /// Gets the appropriate vehicle image. /// </summary> - private static Image GetVehicleImage(Segment segment, TrailerType trailerType) + private static Image GetVehicleImage(Segment segment, List<MissionTrailer> trailerType) { - var name = "Undef.png"; - var withTrailer = trailerType != TrailerType.None; + var name = "Undef"; + var withTrailer = trailerType.Count > 0; + var emsTrailer = trailerType.Count > 1; switch (segment.VehicleClass) { case VehicleClass.Class1: case VehicleClass.Class2: case VehicleClass.Class3: - name = withTrailer ? "4x2rt.png" : "4x2r.png"; + name = withTrailer ? "4x2rt" : "4x2r"; break; case VehicleClass.Class4: - name = withTrailer ? "4x2rt.png" : "4x2r.png"; + name = withTrailer ? "4x2rt" : "4x2r"; break; case VehicleClass.Class5: - name = "4x2tt.png"; + name = "4x2tt" + (emsTrailer ? "_ems" : ""); break; case VehicleClass.Class9: - name = withTrailer ? "6x2rt.png" : "6x2r.png"; + case VehicleClass.Class11: + name = withTrailer ? "6x2rt" : "6x2r" + (emsTrailer ? "_ems" : ""); break; case VehicleClass.Class10: - name = "6x2tt.png"; + case VehicleClass.Class12: + name = "6x2tt" + (emsTrailer ? "_ems" : ""); break; } - var hdvClassImagePath = DeclarationData.DeclarationDataResourcePrefix + ".Report." + name; + var hdvClassImagePath = DeclarationData.DeclarationDataResourcePrefix + ".Report." + name + ".png"; var hdvClassImage = RessourceHelper.ReadStream(hdvClassImagePath); return Image.GetInstance(hdvClassImage); } diff --git a/VectoCore/VectoCore/Resources/Declaration/Body_Trailers_Weights.csv b/VectoCore/VectoCore/Resources/Declaration/Body_Trailers_Weights.csv index f48c09b984c9c1a378e1ce74be9b1e8d010a2cf6..4662ec2f104a65e2b9ed86365df5d5d6a38b8a9f 100644 --- a/VectoCore/VectoCore/Resources/Declaration/Body_Trailers_Weights.csv +++ b/VectoCore/VectoCore/Resources/Declaration/Body_Trailers_Weights.csv @@ -1,12 +1,12 @@ -name,curb mass,max gross mass,delta CdxA for trailer operation in long haul,Wheels,cargo volume,remark -#,[kg],[kg],[mæ·«,,[mè¨, -B1,1600,-,-,,36.5,--- -B2,1900,-,-,,45.2,--- -B3,2000,-,-,,47.7,--- -B4,2100,-,-,,49.4,--- -B5,2200,-,-,,51.9,"""B6"" changed to ""B5"" as ""old B5"" not applicable anymore" -T1,3400,10500,0.6,235/75 R17.5,39.8, -T2,5400,18000,0.6,385/65 R22.5,49.5, -ST1,7500,24000,-,,91.0,relevant for fully loaded is GVM of tractor semitrailer combination = 40000kg -ST1-v2,7500,-,-,,91.0, -Dolly,2500,-,-,,0.0,only relevant for EMS +name , curb mass , max gross mass , delta CdxA for trailer operation in long haul , Axle count , Wheels , cargo volume , remark +# , [kg] , [kg] , [mæ·« first trailer/second+ trailer (EMS) , # , , [mè¨ , +B1 , 1600 , - , - , 0 , , 36.5 , --- +B2 , 1900 , - , - , 0 , , 45.2 , --- +B3 , 2000 , - , - , 0 , , 47.7 , --- +B4 , 2100 , - , - , 0 , , 49.4 , --- +B5 , 2200 , - , - , 0 , , 51.9 , """B6"" changed to ""B5"" as ""old B5"" not applicable anymore" +T1 , 3400 , 10500 , 1.3/0.6 , 2 , 235/75 R17.5 , 39.8 , +T2 , 5400 , 18000 , 1.5/0.6 , 2 , 385/65 R22.5 , 49.5 , +ST1 , 7500 , 24000 , 0/1.2 , 3 , 385/65 R22.5 , 91.0 , relevant for fully loaded is GVM of tractor semitrailer combination = 40000kg +ST1-v2 , 7500 , - , 0/1.2 , 3 , 385/65 R22.5 , 91.0 , +Dolly , 2500 , 12000 , 0/0 , 2 , 315/70 R22.5 , 0.0 , only relevant for EMS diff --git a/VectoCore/VectoCore/Resources/Declaration/SegmentTable.csv b/VectoCore/VectoCore/Resources/Declaration/SegmentTable.csv index c211e5d6d572c30340bd44cfd4e9a90ef4deccd8..fb5770455265888e6250f4920c43056e4e162bbc 100644 --- a/VectoCore/VectoCore/Resources/Declaration/SegmentTable.csv +++ b/VectoCore/VectoCore/Resources/Declaration/SegmentTable.csv @@ -1,29 +1,29 @@ -Valid,Vehicle Category,Axle Conf.,GVW_Min,GVW_Max,HDV class,Body,Trailer,Semitrailer,.vacc file,Cross Wind Correction - Long haul,Cross Wind Correction - Other,Truck Axles - Long haul,Truck Axles - Other,Trailer Axles - Long haul,Trailer Axles - Other,Long haul,Regional delivery,Urban delivery,Municipal utility,Construction,Heavy Urban,Urban,Suburban,Interurban,Coach,CdxA_Construction -# @@@quam below 7.5t is not considered by VECTO atm. @@@ 0 ,RigidTruck ,4x2 ,0 ,7.5 ,0 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,-, , -1 ,RigidTruck ,4x2 ,7.5 ,10 ,1 ,B1 , , ,Truck.vacc, ,RigidSolo , ,45/55 , , ,- ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,- , -1 ,Tractor ,4x2 ,7.5 ,10 ,1 ,B1 , , ,Truck.vacc, ,RigidSolo , ,45/55 , , ,- ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,- , -1 ,RigidTruck ,4x2 ,10 ,12 ,2 ,B2 ,T1 , ,Truck.vacc,RigidTrailer ,RigidSolo ,22.5/32.5 ,45/55 ,45/1 , ,pc(R) ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,- , -1 ,Tractor ,4x2 ,10 ,12 ,2 ,B2 ,T1 , ,Truck.vacc,RigidTrailer ,RigidSolo ,22.5/32.5 ,45/55 ,45/1 , ,pc(R) ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,- , -1 ,RigidTruck ,4x2 ,12 ,16 ,3 ,B3 , , ,Truck.vacc, ,RigidSolo , ,40/60 , , ,- ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,- , -1 ,Tractor ,4x2 ,12 ,16 ,3 ,B3 , , ,Truck.vacc, ,RigidSolo , ,40/60 , , ,- ,pc(R) ,pc(R) ,- ,- ,- ,- ,- ,- ,- , -1 ,RigidTruck ,4x2 ,16 ,99 ,4 ,B4 ,T2 , ,Truck.vacc,RigidTrailer ,RigidSolo ,20/30 ,45/55 ,50/2 , ,14000 ,4400 ,- ,4400 ,- ,- ,- ,- ,- ,- , -1 ,Tractor ,4x2 ,16 ,99 ,5 , , ,ST1 ,Truck.vacc,TractorSemitrailer ,TractorSemitrailer ,20/25 ,25/25 ,55/3 ,50/3 ,19300 ,12900 ,- ,- ,- ,- ,- ,- ,- ,- , -0 ,RigidTruck ,4x4 ,7.5 ,16 ,6 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,- ,- ,??? ,??? ,- ,- ,- ,- ,- , -0 ,RigidTruck ,4x4 ,16 ,99 ,7 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , -0 ,Tractor ,4x4 ,16 ,99 ,8 , , , ,Truck.vacc, ,TractorSemitrailer , , , , ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , -1 ,RigidTruck ,6x2 ,0 ,99 ,9 ,B5 ,T2 , ,Truck.vacc,RigidTrailer ,RigidSolo ,20/30/15 ,35/40/25 ,35/2 , ,19300 ,7100 ,- ,7100 ,- ,- ,- ,- ,- ,- , -1 ,Tractor ,6x2 ,0 ,99 ,10 , , ,ST1 ,Truck.vacc,TractorSemitrailer ,TractorSemitrailer ,15/10/20 ,20/10/20 ,55/3 ,50/3 ,19300 ,12900 ,- ,- ,- ,- ,- ,- ,- ,- , -1 ,RigidTruck ,6x4 ,0 ,99 ,11 ,B5 ,T2 , ,Truck.vacc,RigidTrailer ,RigidSolo ,20/22.5/22.5 ,35/35/30 ,35/2 , ,19300 ,7100 ,- ,7100 ,7100 ,- ,- ,- ,- ,- ,8.5 -1 ,Tractor ,6x4 ,0 ,99 ,12 , , ,ST1 ,Truck.vacc,TractorSemitrailer ,TractorSemitrailer ,15/15/15 ,20/15/15 ,55/3 ,50/3 ,19300 ,12900 ,- ,- ,12900 ,- ,- ,- ,- ,- ,8.8 -0 ,RigidTruck ,6x6 ,0 ,99 ,13 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , -0 ,Tractor ,6x6 ,0 ,99 ,14 , , , ,Truck.vacc, ,TractorSemitrailer , , , , ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , -0 ,RigidTruck ,8x2 ,0 ,99 ,15 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,??? ,- ,- ,- ,- ,- ,- ,- ,- , -1 ,RigidTruck ,8x4 ,0 ,99 ,16 , , , ,Truck.vacc, ,RigidSolo , ,25/25/25/25 , , ,- ,- ,- ,- ,12900 ,- ,- ,- ,- ,- , -0 ,RigidTruck ,8x6 ,0 ,99 ,17 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- ,9.0 -0 ,RigidTruck ,8x8 ,0 ,99 ,17 , , , ,Truck.vacc, ,RigidSolo , , , , ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , -0 ,CityBus ,4x2 ,0 ,18 ,B1 , , , , , ,CoachBus , , , , ,- ,- ,- ,- ,- ,??? ,??? ,??? ,- ,- , -0 ,InterurbanBus ,4x2 ,0 ,18 ,B2 , , , , , ,CoachBus , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,??? ,- , -0 ,Coach ,4x2 ,0 ,18 ,B3 , , , , , ,CoachBus , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,- ,??? , -0 ,CityBus ,6x2 ,18 ,99 ,B4 , , , , , ,CoachBus , , , , ,- ,- ,- ,- ,- ,??? ,??? ,??? ,- ,- , -0 ,InterurbanBus ,6x2 ,18 ,99 ,B5 , , , , , ,CoachBus , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,??? ,- , -0 ,Coach ,6x2 ,18 ,99 ,B6 , , , , , ,CoachBus , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,- ,??? , \ No newline at end of file +Valid,Vehicle Category,Axle Conf.,GVW_Min,GVW_Max,HDV class,Body,Trailer,EMS ,.vacc file,Cross Wind Correction - Long haul,Cross Wind Correction - EMS,Cross Wind Correction - Other,Truck Axles - Long haul,Truck Axles - Other,Trailer Axles - Long haul,Trailer Axles - Other,Truck Axles - Long haul EMS,Truck Axles - Other EMS ,Trailer Axles - Long haul EMS,Trailer Axles - Other EMS ,Long haul,Long haul EMS,Regional delivery,Regional delivery EMS,Urban delivery,Municipal utility,Construction,Heavy Urban,Urban,Suburban,Interurban,Coach,CdxA_Construction +## 0 ,RigidTruck ,4x2 ,0 ,7.5 ,0 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- , ,pc(R) , ,pc(R) ,- ,- ,- ,- ,- ,- ,-, , +1 ,RigidTruck ,4x2 ,7.5 ,10 ,1 ,B1 , , ,Truck.vacc, , ,RigidSolo , ,45/55 , , , , , , ,- ,- ,pc(R) ,- ,pc(R) ,- ,- ,- ,- ,- ,- ,- , +1 ,Tractor ,4x2 ,7.5 ,10 ,1 ,B1 , , ,Truck.vacc, , ,RigidSolo , ,45/55 , , , , , , ,- ,- ,pc(R) ,- ,pc(R) ,- ,- ,- ,- ,- ,- ,- , +1 ,RigidTruck ,4x2 ,10 ,12 ,2 ,B2 ,T1 , ,Truck.vacc,RigidTrailer , ,RigidSolo ,22.5/32.5 ,45/55 ,45 , , , , , ,pc(R) ,- ,pc(R) ,- ,pc(R) ,- ,- ,- ,- ,- ,- ,- , +1 ,Tractor ,4x2 ,10 ,12 ,2 ,B2 ,T1 , ,Truck.vacc,RigidTrailer , ,RigidSolo ,22.5/32.5 ,45/55 ,45 , , , , , ,pc(R) ,- ,pc(R) ,- ,pc(R) ,- ,- ,- ,- ,- ,- ,- , +1 ,RigidTruck ,4x2 ,12 ,16 ,3 ,B3 , , ,Truck.vacc, , ,RigidSolo , ,40/60 , , , , , , ,- ,- ,pc(R) ,- ,pc(R) ,- ,- ,- ,- ,- ,- ,- , +1 ,Tractor ,4x2 ,12 ,16 ,3 ,B3 , , ,Truck.vacc, , ,RigidSolo , ,40/60 , , , , , , ,- ,- ,pc(R) ,- ,pc(R) ,- ,- ,- ,- ,- ,- ,- , +1 ,RigidTruck ,4x2 ,16 ,99 ,4 ,B4 ,T2 , ,Truck.vacc,RigidTrailer , ,RigidSolo ,20/30 ,45/55 ,50 , , , , , ,14000 ,- ,4400 ,- ,- ,4400 ,- ,- ,- ,- ,- ,- , +1 ,Tractor ,4x2 ,16 ,99 ,5 , ,ST1 ,ST1+T2 ,Truck.vacc,TractorSemitrailer ,RigidTrailer ,TractorSemitrailer ,20/25 ,25/25 ,55 ,50 ,15/20 ,17.5/25 ,40/25 ,35/22.5 ,19300 ,26500 ,12900 ,17500 ,- ,- ,- ,- ,- ,- ,- ,- , +0 ,RigidTruck ,4x4 ,7.5 ,16 ,6 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- ,- ,- ,- ,- ,??? ,??? ,- ,- ,- ,- ,- , +0 ,RigidTruck ,4x4 ,16 ,99 ,7 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- ,- ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , +0 ,Tractor ,4x4 ,16 ,99 ,8 , , , ,Truck.vacc, , ,TractorSemitrailer , , , , , , , , ,- ,- ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , +1 ,RigidTruck ,6x2 ,0 ,99 ,9 ,B5 ,T2 ,D+ST1 ,Truck.vacc,RigidTrailer ,RigidTrailer ,RigidSolo ,20/30/15 ,35/40/25 ,35 , ,15/20/10 ,17.5/20/10 ,22.5/32.5 ,22.5/30 ,19300 ,26500 ,7100 ,17500 ,- ,7100 ,- ,- ,- ,- ,- ,- , +1 ,Tractor ,6x2 ,0 ,99 ,10 , ,ST1 ,ST1+T2 ,Truck.vacc,TractorSemitrailer ,RigidTrailer ,TractorSemitrailer ,15/10/20 ,20/10/20 ,55 ,50 ,12.5/15/10 ,15/15/10 ,37.5/25 ,35/25 ,19300 ,26500 ,12900 ,17500 ,- ,- ,- ,- ,- ,- ,- ,- , +1 ,RigidTruck ,6x4 ,0 ,99 ,11 ,B5 ,T2 ,D+ST1 ,Truck.vacc,RigidTrailer ,RigidTrailer ,RigidSolo ,20/22.5/22.5 ,35/35/30 ,35 , ,15/20/10 ,17.5/20/10 ,22.5/32.5 ,22.5/30 ,19300 ,26500 ,7100 ,17500 ,- ,7100 ,7100 ,- ,- ,- ,- ,- ,8.5 +1 ,Tractor ,6x4 ,0 ,99 ,12 , ,ST1 ,ST1+T2 ,Truck.vacc,TractorSemitrailer ,RigidTrailer ,TractorSemitrailer ,15/15/15 ,20/15/15 ,55 ,50 ,12.5/15/10 ,15/15/10 ,37.5/25 ,35/25 ,19300 ,26500 ,12900 ,17500 ,- ,- ,12900 ,- ,- ,- ,- ,- ,8.8 +0 ,RigidTruck ,6x6 ,0 ,99 ,13 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- ,- ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , +0 ,Tractor ,6x6 ,0 ,99 ,14 , , , ,Truck.vacc, , ,TractorSemitrailer , , , , , , , , ,- ,- ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , +0 ,RigidTruck ,8x2 ,0 ,99 ,15 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- ,- ,??? ,- ,- ,- ,- ,- ,- ,- ,- ,- , +1 ,RigidTruck ,8x4 ,0 ,99 ,16 , , , ,Truck.vacc, , ,RigidSolo , ,25/25/25/25 , , , , , , ,- ,- ,- ,- ,- ,- ,12900 ,- ,- ,- ,- ,- , +0 ,RigidTruck ,8x6 ,0 ,99 ,17 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- ,- ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- ,9.0 +0 ,RigidTruck ,8x8 ,0 ,99 ,17 , , , ,Truck.vacc, , ,RigidSolo , , , , , , , , ,- ,- ,- ,- ,- ,- ,??? ,- ,- ,- ,- ,- , +0 ,CityBus ,4x2 ,0 ,18 ,B1 , , , , , , ,CoachBus , , , , , , , , ,- ,- ,- ,- ,- ,- ,- ,??? ,??? ,??? ,- ,- , +0 ,InterurbanBus ,4x2 ,0 ,18 ,B2 , , , , , , ,CoachBus , , , , , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,- ,- ,??? ,- , +0 ,Coach ,4x2 ,0 ,18 ,B3 , , , , , , ,CoachBus , , , , , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,- ,- ,- ,??? , +0 ,CityBus ,6x2 ,18 ,99 ,B4 , , , , , , ,CoachBus , , , , , , , , ,- ,- ,- ,- ,- ,- ,- ,??? ,??? ,??? ,- ,- , +0 ,InterurbanBus ,6x2 ,18 ,99 ,B5 , , , , , , ,CoachBus , , , , , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,- ,- ,??? ,- , +0 ,Coach ,6x2 ,18 ,99 ,B6 , , , , , , ,CoachBus , , , , , , , , ,- ,- ,- ,- ,- ,- ,- ,- ,- ,- ,- ,??? , \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/ES-Tech.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/ES-Tech.csv index 699348660812e4f0122fc0040cc06431ca267e9a..74a7d9a7ab4797eea65807e4a5ac7b7b22d54d6c 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/ES-Tech.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/ES-Tech.csv @@ -1,3 +1,3 @@ -Technology, Long haul, Regional delivery, Urban delivery, Municipal utility, Construction -Standard technology, 1200, 1000, 1000, 1000, 1000 -"Standard technology - LED headlights, all", 1150, 950, 950, 950, 950 +Technology , Long haul , Regional delivery , Urban delivery , Municipal utility , Construction +Standard technology , 1200 , 1000 , 1000 , 1000 , 1000 +"Standard technology - LED headlights, all" , 1150 , 950 , 950 , 950 , 950 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/Fan-Tech.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/Fan-Tech.csv index 2b84f3480cf73f4dcb2fb9516af33baebfeddc17..2e1f9ace7e8cfb474600b9563d26d94e7514b040 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/Fan-Tech.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/Fan-Tech.csv @@ -1,12 +1,12 @@ -Technology,Long haul,Regional delivery,Urban delivery,Municipal utility,Construction -Crankshaft mounted - Electronically controlled visco clutch,618,671,516,566,1037 -Crankshaft mounted - Bimetallic controlled visco clutch,818,871,676,766,1277 -Crankshaft mounted - Discrete step clutch,668,721,616,616,1157 -Crankshaft mounted - On/off clutch,718,771,666,666,1237 -Belt driven or driven via transm. - Electronically controlled visco clutch,989,1044,833,933,1478 -Belt driven or driven via transm. - Bimetallic controlled visco clutch,1189,1244,993,1133,1718 -Belt driven or driven via transm. - Discrete step clutch,1039,1094,983,983,1598 -Belt driven or driven via transm. - On/off clutch,1089,1144,1033,1033,1678 -Hydraulic driven - Variable displacement pump,938,1155,832,917,1872 -Hydraulic driven - Constant displacement pump,1200,1400,1000,1100,2300 -Hydraulic driven - Electronically controlled,700,800,600,600,1400 +Technology , Long haul , Regional delivery , Urban delivery , Municipal utility , Construction +Crankshaft mounted - Electronically controlled visco clutch , 618 , 671 , 516 , 566 , 1037 +Crankshaft mounted - Bimetallic controlled visco clutch , 818 , 871 , 676 , 766 , 1277 +Crankshaft mounted - Discrete step clutch , 668 , 721 , 616 , 616 , 1157 +Crankshaft mounted - On/off clutch , 718 , 771 , 666 , 666 , 1237 +Belt driven or driven via transm. - Electronically controlled visco clutch , 989 , 1044 , 833 , 933 , 1478 +Belt driven or driven via transm. - Bimetallic controlled visco clutch , 1189 , 1244 , 993 , 1133 , 1718 +Belt driven or driven via transm. - Discrete step clutch , 1039 , 1094 , 983 , 983 , 1598 +Belt driven or driven via transm. - On/off clutch , 1089 , 1144 , 1033 , 1033 , 1678 +Hydraulic driven - Variable displacement pump , 938 , 1155 , 832 , 917 , 1872 +Hydraulic driven - Constant displacement pump , 1200 , 1400 , 1000 , 1100 , 2300 +Hydraulic driven - Electronically controlled , 700 , 800 , 600 , 600 , 1400 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv index 93962b78bbd055128725016421f4585e976ee00c..faddf16733ed5d12e1ec51045ec4f3b157038405 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/HVAC-Table.csv @@ -1,11 +1,11 @@ -HDV Class,Long haul,Regional delivery,Urban delivery,Municipal utility,Construction -1,,150,150,, -2,200,200,150,, -3,,200,150,, -4,350,200,,300, -5,350,200,,, -9,350,200,,300, -10,350,200,,, -11,350,200,,300,200 -12,350,200,,,200 -16,,,,,200 +HDV Class , Long haul , Regional delivery , Urban delivery , Municipal utility , Construction +1 , , 150 , 150 , , +2 , 200 , 200 , 150 , , +3 , , 200 , 150 , , +4 , 350 , 200 , , 300 , +5 , 350 , 200 , , , +9 , 350 , 200 , , 300 , +10 , 350 , 200 , , , +11 , 350 , 200 , , 300 , 200 +12 , 350 , 200 , , , 200 +16 , , , , , 200 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/PS-Table.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/PS-Table.csv index 916cf5a81a11dbad8fac464eb74e0b6622a58bf4..69050d1fedbf453aee5ff97a079a77cce840a892 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/PS-Table.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/PS-Table.csv @@ -1,29 +1,29 @@ -Technology,Long Haul,Regional Delivery,Urban Delivery,Municipal utility,Construction -Small,1400,1300,1200,1200,1300 -Small + ESS,900,800,800,800,800 -Small + visco clutch,800,700,700,700,700 -Small + mech. clutch,600,600,650,650,600 -Small + ESS + AMS,500,400,500,500,400 -Small + visco clutch + AMS,400,300,400,400,300 -Small + mech. clutch + AMS,200,200,350,350,200 -Medium Supply 1-stage,1600,1400,1350,1350,1500 -Medium Supply 1-stage + ESS,1000,900,900,900,900 -Medium Supply 1-stage + visco clutch,850,800,800,800,750 -Medium Supply 1-stage + mech. clutch,600,550,550,550,600 -Medium Supply 1-stage + ESS + AMS,600,700,700,700,500 -Medium Supply 1-stage + visco clutch + AMS,450,600,600,600,350 -Medium Supply 1-stage + mech. clutch + AMS,200,350,350,350,200 -Medium Supply 2-stage,2100,1750,1700,1700,2100 -Medium Supply 2-stage + ESS,1100,1050,1000,1000,1000 -Medium Supply 2-stage + visco clutch,1000,850,800,800,900 -Medium Supply 2-stage + mech. clutch,700,650,600,600,800 -Medium Supply 2-stage + ESS + AMS,700,850,800,800,500 -Medium Supply 2-stage + visco clutch + AMS,600,650,600,600,400 -Medium Supply 2-stage + mech. clutch + AMS,300,450,400,400,300 -Large Supply,4300,3600,3500,3500,4100 -Large Supply + ESS,1600,1300,1200,1200,1500 -Large Supply + visco clutch,1300,1100,1000,1000,1200 -Large Supply + mech. clutch,800,800,700,700,900 -Large Supply + ESS + AMS,1100,1000,1000,1000,1000 -Large Supply + visco clutch + AMS,800,800,800,800,700 -Large Supply + mech. clutch + AMS,300,500,500,500,400 +Technology , Long Haul , Regional Delivery , Urban Delivery , Municipal utility , Construction +Small , 1400 , 1300 , 1200 , 1200 , 1300 +Small + ESS , 900 , 800 , 800 , 800 , 800 +Small + visco clutch , 800 , 700 , 700 , 700 , 700 +Small + mech. clutch , 600 , 600 , 650 , 650 , 600 +Small + ESS + AMS , 500 , 400 , 500 , 500 , 400 +Small + visco clutch + AMS , 400 , 300 , 400 , 400 , 300 +Small + mech. clutch + AMS , 200 , 200 , 350 , 350 , 200 +Medium Supply 1-stage , 1600 , 1400 , 1350 , 1350 , 1500 +Medium Supply 1-stage + ESS , 1000 , 900 , 900 , 900 , 900 +Medium Supply 1-stage + visco clutch , 850 , 800 , 800 , 800 , 750 +Medium Supply 1-stage + mech. clutch , 600 , 550 , 550 , 550 , 600 +Medium Supply 1-stage + ESS + AMS , 600 , 700 , 700 , 700 , 500 +Medium Supply 1-stage + visco clutch + AMS , 450 , 600 , 600 , 600 , 350 +Medium Supply 1-stage + mech. clutch + AMS , 200 , 350 , 350 , 350 , 200 +Medium Supply 2-stage , 2100 , 1750 , 1700 , 1700 , 2100 +Medium Supply 2-stage + ESS , 1100 , 1050 , 1000 , 1000 , 1000 +Medium Supply 2-stage + visco clutch , 1000 , 850 , 800 , 800 , 900 +Medium Supply 2-stage + mech. clutch , 700 , 650 , 600 , 600 , 800 +Medium Supply 2-stage + ESS + AMS , 700 , 850 , 800 , 800 , 500 +Medium Supply 2-stage + visco clutch + AMS , 600 , 650 , 600 , 600 , 400 +Medium Supply 2-stage + mech. clutch + AMS , 300 , 450 , 400 , 400 , 300 +Large Supply , 4300 , 3600 , 3500 , 3500 , 4100 +Large Supply + ESS , 1600 , 1300 , 1200 , 1200 , 1500 +Large Supply + visco clutch , 1300 , 1100 , 1000 , 1000 , 1200 +Large Supply + mech. clutch , 800 , 800 , 700 , 700 , 900 +Large Supply + ESS + AMS , 1100 , 1000 , 1000 , 1000 , 1000 +Large Supply + visco clutch + AMS , 800 , 800 , 800 , 800 , 700 +Large Supply + mech. clutch + AMS , 300 , 500 , 500 , 500 , 400 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Axles.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Axles.csv index 10f0a576ec75bae5b336277d9571fd2a53e23580..24038186f1aa4c9407c9a755e80968b4279b7b33 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Axles.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Axles.csv @@ -1,5 +1,5 @@ -Steered axles,Long haul,Regional delivery,Urban delivery,Municipal utility,construction -1,100/100/100,100/100/100,100/100/100,100/100/100,100/100/100 -2,100/70/70,100/70/70,100/70/70,100/70/70,100/70/70 -3,100/50/50,100/50/50,100/50/50,100/50/50,100/50/50 -4,100/50/50,100/50/50,100/50/50,100/50/50,100/50/50 +Steered axles , Long haul , Regional delivery , Urban delivery , Municipal utility , construction +1 , 100/100/100 , 100/100/100 , 100/100/100 , 100/100/100 , 100/100/100 +2 , 100/70/70 , 100/70/70 , 100/70/70 , 100/70/70 , 100/70/70 +3 , 100/50/50 , 100/50/50 , 100/50/50 , 100/50/50 , 100/50/50 +4 , 100/50/50 , 100/50/50 , 100/50/50 , 100/50/50 , 100/50/50 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv index 66a43eee79e97a7462474bd77ac78691bfc808da..ec4bf35e3489ad34c9f78ab982163ba76a3aab1f 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Table.csv @@ -1,14 +1,14 @@ -HDV Class,Long haul,Regional delivery,Urban delivery,Municipal utility,Construction -1,,240/20/20,220/20/30,, -2,340/30/0,290/30/20,260/20/30,, -3,,310/30/30,280/30/40,, -4,510/100/0,490/40/40,,430/30/50, -5,600/120/0,540/90/40,480/80/60,, -6,,,,, -7,,,,, -8,,,,, -9,600/120/0,490/60/40,,430/30/50, -10,450/120/0,440/90/40,,, -11,600/120/0,490/60/40,,430/30/50,640/50/80 -12,450/120/0,440/90/40,,,640/50/80 -16,,,,,640/50/80 +HDV Class , Long haul , Regional delivery , Urban delivery , Municipal utility , Construction +1 , , 240/20/20 , 220/20/30 , , +2 , 340/30/0 , 290/30/20 , 260/20/30 , , +3 , , 310/30/30 , 280/30/40 , , +4 , 510/100/0 , 490/40/40 , , 430/30/50 , +5 , 600/120/0 , 540/90/40 , 480/80/60 , , +6 , , , , , +7 , , , , , +8 , , , , , +9 , 600/120/0 , 490/60/40 , , 430/30/50 , +10 , 450/120/0 , 440/90/40 , , , +11 , 600/120/0 , 490/60/40 , , 430/30/50 , 640/50/80 +12 , 450/120/0 , 440/90/40 , , , 640/50/80 +16 , , , , , 640/50/80 \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Tech.csv b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Tech.csv index 494581d6c09dce30c428ab1b6880079aaf34b87f..ff71ce2110ca70ab0dbfb53530fd0cd7b01fbcfd 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Tech.csv +++ b/VectoCore/VectoCore/Resources/Declaration/VAUX/SP-Tech.csv @@ -1,7 +1,7 @@ -Technology,UF,B,S -Fixed displacement,1,1,1 -Fixed displacement with elec. control,0.95,1,1 -Dual displacement,0.85,0.85,0.85 -Variable displacement mech. controlled,0.75,0.75,0.75 -Variable displacement elec. controlled,0.6,0.6,0.6 -Electric,0,1.5,1 +Technology , UF , B , S +Fixed displacement , 1 , 1 , 1 +Fixed displacement with elec. control , 0.95 , 1 , 1 +Dual displacement , 0.85 , 0.85 , 0.85 +Variable displacement mech. controlled , 0.75 , 0.75 , 0.75 +Variable displacement elec. controlled , 0.6 , 0.6 , 0.6 +Electric , 0 , 1.5 , 1 diff --git a/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs b/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs index 445158d5d7f742a5672671ed1efd8afa552fc294..4e49f6c4d4909b2cab65c3ea8c003d11f5f7b814 100644 --- a/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/SimulationDataReaderTest.cs @@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Tests.FileIO AssertHelper.AreRelativeEqual(0.40726954, runData.VehicleData.DynamicTyreRadius); Assert.AreEqual(VehicleClass.Class2, runData.VehicleData.VehicleClass); - Assert.AreEqual(3, runData.VehicleData.AxleData.Count); + Assert.AreEqual(4, runData.VehicleData.AxleData.Count); Assert.AreEqual(6, runData.VehicleData.AxleData[0].Inertia.Value(), Tolerance); Assert.AreEqual(true, runData.DriverData.LookAheadCoasting.Enabled); diff --git a/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs b/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs index c8c4ab8527c33b7d55bfbcafce5feb6c8ee2c343..1968c1d4f27c35927789bcf3fc65685bb99bbf03 100644 --- a/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs +++ b/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs @@ -208,7 +208,7 @@ namespace TUGraz.VectoCore.Tests.Integration var jobContainer = new JobContainer(sumData); jobContainer.AddRuns(factory); - var i = 5; + var i = 8; jobContainer.Runs[i].Run.Run(); Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors, string.Format("{0}", jobContainer.Runs[i].ExecException)); diff --git a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs index 1e10dc65ad6d7fba53802d76ff1abd5c6fca8d6a..f6969dcbb7a3b7ed616096c17f8eb337d7d1264f 100644 --- a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs +++ b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs @@ -176,6 +176,7 @@ namespace TUGraz.VectoCore.Tests.Integration private static VehicleData CreateVehicleData(Kilogram massExtra, Kilogram loading) { + var wheelsType = "385/65 R 22.5"; var axles = new List<Axle> { new Axle { AxleWeightShare = 0.2, @@ -198,21 +199,21 @@ namespace TUGraz.VectoCore.Tests.Integration TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType).Inertia + Inertia = DeclarationData.Wheels.Lookup(wheelsType).Inertia }, new Axle { AxleWeightShare = 0.55 / 3, TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType).Inertia + Inertia = DeclarationData.Wheels.Lookup(wheelsType).Inertia }, new Axle { AxleWeightShare = 0.55 / 3, TwinTyres = DeclarationData.Trailer.TwinTyres, RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = DeclarationData.Wheels.Lookup(DeclarationData.Trailer.WheelsType).Inertia + Inertia = DeclarationData.Wheels.Lookup(wheelsType).Inertia } }; return new VehicleData { diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs index 09b51ff28c0c8dc9bda0beb281c11b6f18b75445..b64c7f5f4007ce2b350cf15935d71f6d5b13830a 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs @@ -43,6 +43,7 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.InputData.Reader.Impl; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.Tests.Utils; namespace TUGraz.VectoCore.Tests.Models.Declaration @@ -538,9 +539,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(expectedBodyWeight, segment.Missions[0].BodyCurbWeight.Value()); } if (expectedTrailerWeight.HasValue) { - var trailerMission = segment.Missions.Where(m => m.TrailerType != TrailerType.None).ToList(); + var trailerMission = segment.Missions.Where(m => m.Trailer.Count > 0).ToList(); if (trailerMission.Count > 0) { - Assert.AreEqual(expectedTrailerWeight, trailerMission.First().TrailerCurbWeight.Value()); + Assert.AreEqual(expectedTrailerWeight, trailerMission.First().Trailer.First().TrailerCurbWeight.Value()); } } } @@ -561,15 +562,15 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class4, new[] { 98.9, 49.4, 49.4 }), TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class5, - new[] { 91.0, 91.0 }), + new[] { 91.0, 140.5, 91.0, 140.5 }), TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class9, - new[] { 101.4, 51.9, 51.9 }), + new[] { 101.4, 142.9, 51.9, 142.9, 51.9 }), TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class10, - new[] { 91.0, 91.0 }), + new[] { 91.0, 140.5, 91.0, 140.5 }), TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 40000, 0, VehicleClass.Class11, - new[] { 101.4, 51.9, 51.9, 51.9 }), + new[] { 101.4, 142.9, 51.9, 142.9, 51.9, 51.9 }), TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 99000, 0, VehicleClass.Class12, - new[] { 91.0, 91.0, 91.0 }), + new[] { 91.0, 140.5, 91.0, 140.5, 91.0 }), TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 99000, 0, VehicleClass.Class16, new[] { 0.0 }) ] @@ -582,7 +583,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(expectedClass, segment.VehicleClass); Assert.AreEqual(expectedCargoVolume.Length, segment.Missions.Length); for (var i = 0; i < expectedCargoVolume.Length; i++) { - Assert.AreEqual(expectedCargoVolume[i], segment.Missions[i].CargoVolume.Value()); + Assert.AreEqual(expectedCargoVolume[i], segment.Missions[i].TotalCargoVolume.Value()); } } @@ -611,21 +612,24 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.225, 0.325 }, - trailerAxleWeightDistribution: new[] { 0.45 }, bodyCurbWeight: 1900, trailerCurbWeight: 3400, - trailerType: TrailerType.T1, minLoad: 0, refLoad: 9813.2353, trailerGrossVehicleWeight: 10500, deltaCdA: 0.6, - maxLoad: 11250); + trailerAxleWeightDistribution: new[] { 0.45 }, trailerAxleCount: new[] { 2 }, bodyCurbWeight: 1900, + trailerCurbWeight: new[] { 3400.0 }, + trailerType: new[] { TrailerType.T1 }, minLoad: 0, refLoad: 9813.2353, trailerGrossVehicleWeight: new[] { 10500.0 }, + deltaCdA: 1.3, maxLoad: 11250); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 1900, trailerCurbWeight: 0, - trailerType: TrailerType.None, minLoad: 0, refLoad: 2984.1176, trailerGrossVehicleWeight: 0, deltaCdA: 0, - maxLoad: 4150); + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 1900, + trailerCurbWeight: new double[] { }, + trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 2984.1176, trailerGrossVehicleWeight: new double[] { }, + deltaCdA: 0, maxLoad: 4150); AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.UrbanDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 1900, trailerCurbWeight: 0, - trailerType: TrailerType.None, minLoad: 0, refLoad: 2984.1176, trailerGrossVehicleWeight: 0, deltaCdA: 0, - maxLoad: 4150); + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 1900, + trailerCurbWeight: new double[] { }, + trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 2984.1176, trailerGrossVehicleWeight: new double[] { }, + deltaCdA: 0, maxLoad: 4150); } /// <summary> @@ -650,15 +654,15 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.4, 0.6 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2000, trailerCurbWeight: 0, - trailerType: TrailerType.None, minLoad: 0, refLoad: 3811.7647, trailerGrossVehicleWeight: 0, deltaCdA: 0, - maxLoad: 6150); + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2000, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 3811.7647, + trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 6150); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.UrbanDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.4, 0.6 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2000, trailerCurbWeight: 0, - trailerType: TrailerType.None, minLoad: 0, refLoad: 3811.7647, trailerGrossVehicleWeight: 0, deltaCdA: 0, - maxLoad: 6150); + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2000, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 3811.7647, + trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 6150); } /// <summary> @@ -686,19 +690,21 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.2, 0.3 }, - trailerAxleWeightDistribution: new[] { 0.25, 0.25 }, bodyCurbWeight: 2100, trailerCurbWeight: 5400, - trailerType: TrailerType.T2, minLoad: 0, refLoad: 14000, trailerGrossVehicleWeight: 18000, deltaCdA: 0.6, - maxLoad: 21000); + trailerAxleWeightDistribution: new[] { 0.5 }, trailerAxleCount: new[] { 2 }, bodyCurbWeight: 2100, + trailerCurbWeight: new[] { 5400.0 }, trailerType: new[] { TrailerType.T2 }, minLoad: 0, refLoad: 14000, + trailerGrossVehicleWeight: new[] { 18000.0 }, deltaCdA: 1.5, maxLoad: 21000); AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2100, trailerCurbWeight: 0, - trailerType: TrailerType.None, minLoad: 0, refLoad: 4400, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 8400); + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2100, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 4400, + trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 8400); AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.MunicipalUtility, cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.45, 0.55 }, - trailerAxleWeightDistribution: new double[] { }, bodyCurbWeight: 2100, trailerCurbWeight: 0, - trailerType: TrailerType.None, minLoad: 0, refLoad: 4400, trailerGrossVehicleWeight: 0, deltaCdA: 0, maxLoad: 8400); + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2100, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 4400, + trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 8400); } /// <summary> @@ -722,48 +728,308 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile); TestAcceleration(data); - Assert.AreEqual(2, segment.Missions.Length); + Assert.AreEqual(4, segment.Missions.Length); AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.2, 0.25 }, - trailerAxleWeightDistribution: (0.55 / 3).Repeat(3).ToArray(), bodyCurbWeight: 0, trailerCurbWeight: 7500, - trailerType: TrailerType.None, minLoad: 0, refLoad: 19300, trailerGrossVehicleWeight: 24000, deltaCdA: 0, - maxLoad: 25000); + trailerAxleWeightDistribution: new[] { 0.55 }, trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0 }, trailerType: new[] { TrailerType.ST1 }, minLoad: 0, refLoad: 19300, + trailerGrossVehicleWeight: new[] { 24000.0 }, deltaCdA: 0, maxLoad: 25000); - AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, + AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.LongHaulEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.15, 0.2 }, + trailerAxleWeightDistribution: new[] { 0.40, 0.25 }, trailerAxleCount: new[] { 3, 2 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0, 5400 }, trailerType: new[] { TrailerType.ST1, TrailerType.T2 }, minLoad: 0, + refLoad: 26500, trailerGrossVehicleWeight: new[] { 24000.0, 18000 }, deltaCdA: 0.6, maxLoad: 39600, ems: true); + + AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.25, 0.25 }, - trailerAxleWeightDistribution: (0.5 / 3).Repeat(3).ToArray(), bodyCurbWeight: 0, trailerCurbWeight: 7500, - trailerType: TrailerType.None, minLoad: 0, refLoad: 12900, trailerGrossVehicleWeight: 24000, deltaCdA: 0, - maxLoad: 25000); + trailerAxleWeightDistribution: new[] { 0.5 }, trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0 }, trailerType: new[] { TrailerType.ST1 }, minLoad: 0, refLoad: 12900, + trailerGrossVehicleWeight: new[] { 24000.0 }, deltaCdA: 0, maxLoad: 25000); + + AssertMission(segment.Missions[3], vehicleData: vehicleData, missionType: MissionType.RegionalDeliveryEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.175, 0.25 }, + trailerAxleWeightDistribution: new[] { 0.35, 0.225 }, trailerAxleCount: new[] { 3, 2 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0, 5400 }, trailerType: new[] { TrailerType.ST1, TrailerType.T2 }, minLoad: 0, + refLoad: 17500, trailerGrossVehicleWeight: new[] { 24000.0, 18000 }, deltaCdA: 0.6, maxLoad: 39600, ems: true); + } + + + /// <summary> + /// Segment 9: fixed reference weight, trailer always used + /// </summary> + [TestCase] + public void Segment9Test() + { + var vehicleData = new { + VehicleCategory = VehicleCategory.RigidTruck, + AxleConfiguration = AxleConfiguration.AxleConfig_6x2, + GrossVehicleMassRating = 24000.SI<Kilogram>(), + CurbWeight = 7500.SI<Kilogram>() + }; + + var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration, + vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight); + + Assert.AreEqual(VehicleClass.Class9, segment.VehicleClass); + + var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile); + TestAcceleration(data); + + Assert.AreEqual(5, segment.Missions.Length); + + AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.2, 0.3, 0.15 }, + trailerAxleWeightDistribution: new[] { 0.35 }, trailerAxleCount: new[] { 2 }, bodyCurbWeight: 2200, + trailerCurbWeight: new[] { 5400.0 }, trailerType: new[] { TrailerType.T2 }, minLoad: 0, refLoad: 19300, + trailerGrossVehicleWeight: new[] { 18000.0 }, deltaCdA: 1.5, maxLoad: 24900); + + AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.LongHaulEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.15, 0.2, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.225, 0.325 }, trailerAxleCount: new[] { 2, 3 }, bodyCurbWeight: 2200, + trailerCurbWeight: new[] { 2500, 7500.0 }, trailerType: new[] { TrailerType.Dolly, TrailerType.ST1 }, minLoad: 0, + refLoad: 26500, trailerGrossVehicleWeight: new[] { 12000.0, 24000 }, deltaCdA: 1.2, maxLoad: 40300, ems: true); + + AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, + cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.35, 0.4, 0.25 }, + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2200, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, + refLoad: 7100, trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 14300); + + AssertMission(segment.Missions[3], vehicleData: vehicleData, missionType: MissionType.RegionalDeliveryEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.175, 0.2, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.225, 0.3 }, trailerAxleCount: new[] { 2, 3 }, bodyCurbWeight: 2200, + trailerCurbWeight: new[] { 2500, 7500.0 }, trailerType: new[] { TrailerType.Dolly, TrailerType.ST1 }, minLoad: 0, + refLoad: 17500, trailerGrossVehicleWeight: new[] { 12000.0, 24000 }, deltaCdA: 1.2, maxLoad: 40300, ems: true); + + AssertMission(segment.Missions[4], vehicleData: vehicleData, missionType: MissionType.MunicipalUtility, + cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.35, 0.4, 0.25 }, + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2200, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, + refLoad: 7100, trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 14300); + } + + /// <summary> + /// Segment 10: fixed reference weight, trailer always used + /// </summary> + [TestCase] + public void Segment10Test() + { + var vehicleData = new { + VehicleCategory = VehicleCategory.Tractor, + AxleConfiguration = AxleConfiguration.AxleConfig_6x2, + GrossVehicleMassRating = 24000.SI<Kilogram>(), + CurbWeight = 7500.SI<Kilogram>() + }; + + var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration, + vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight); + + Assert.AreEqual(VehicleClass.Class10, segment.VehicleClass); + + var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile); + TestAcceleration(data); + + Assert.AreEqual(4, segment.Missions.Length); + + AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, + cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.15, 0.1, 0.2 }, + trailerAxleWeightDistribution: new[] { 0.55 }, trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0 }, trailerType: new[] { TrailerType.ST1 }, minLoad: 0, refLoad: 19300, + trailerGrossVehicleWeight: new[] { 24000.0 }, deltaCdA: 0, maxLoad: 25000); + + AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.LongHaulEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.125, 0.15, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.375, 0.25 }, trailerAxleCount: new[] { 3, 2 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0, 5400 }, trailerType: new[] { TrailerType.ST1, TrailerType.T2 }, minLoad: 0, + refLoad: 26500, trailerGrossVehicleWeight: new[] { 24000.0, 18000 }, deltaCdA: 0.6, maxLoad: 39600, ems: true); + + AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, + cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.2, 0.1, 0.2 }, + trailerAxleWeightDistribution: new[] { 0.5 }, trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0 }, trailerType: new[] { TrailerType.ST1 }, minLoad: 0, refLoad: 12900, + trailerGrossVehicleWeight: new[] { 24000.0 }, deltaCdA: 0, maxLoad: 25000); + + AssertMission(segment.Missions[3], vehicleData: vehicleData, missionType: MissionType.RegionalDeliveryEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.15, 0.15, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.35, 0.25 }, trailerAxleCount: new[] { 3, 2 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0, 5400 }, trailerType: new[] { TrailerType.ST1, TrailerType.T2 }, minLoad: 0, + refLoad: 17500, trailerGrossVehicleWeight: new[] { 24000.0, 18000 }, deltaCdA: 0.6, maxLoad: 39600, ems: true); + } + + /// <summary> + /// Segment 11: fixed reference weight, trailer always used + /// </summary> + [TestCase] + public void Segment11Test() + { + var vehicleData = new { + VehicleCategory = VehicleCategory.RigidTruck, + AxleConfiguration = AxleConfiguration.AxleConfig_6x4, + GrossVehicleMassRating = 24000.SI<Kilogram>(), + CurbWeight = 7500.SI<Kilogram>() + }; + + var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration, + vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight); + + Assert.AreEqual(VehicleClass.Class11, segment.VehicleClass); + + var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile); + TestAcceleration(data); + + Assert.AreEqual(6, segment.Missions.Length); + + AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.2, 0.225, 0.225 }, + trailerAxleWeightDistribution: new[] { 0.35 }, trailerAxleCount: new[] { 2 }, bodyCurbWeight: 2200, + trailerCurbWeight: new[] { 5400.0 }, trailerType: new[] { TrailerType.T2 }, minLoad: 0, refLoad: 19300, + trailerGrossVehicleWeight: new[] { 18000.0 }, deltaCdA: 1.5, maxLoad: 24900); + + AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.LongHaulEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.15, 0.2, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.225, 0.325 }, trailerAxleCount: new[] { 2, 3 }, bodyCurbWeight: 2200, + trailerCurbWeight: new[] { 2500, 7500.0 }, trailerType: new[] { TrailerType.Dolly, TrailerType.ST1 }, minLoad: 0, + refLoad: 26500, trailerGrossVehicleWeight: new[] { 12000.0, 24000 }, deltaCdA: 1.2, maxLoad: 40300, ems: true); + + AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, + cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.35, 0.35, 0.3 }, + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2200, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, + refLoad: 7100, trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 14300); + + AssertMission(segment.Missions[3], vehicleData: vehicleData, missionType: MissionType.RegionalDeliveryEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.175, 0.2, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.225, 0.3 }, trailerAxleCount: new[] { 2, 3 }, bodyCurbWeight: 2200, + trailerCurbWeight: new[] { 2500, 7500.0 }, trailerType: new[] { TrailerType.Dolly, TrailerType.ST1 }, minLoad: 0, + refLoad: 17500, trailerGrossVehicleWeight: new[] { 12000.0, 24000 }, deltaCdA: 1.2, maxLoad: 40300, ems: true); + + AssertMission(segment.Missions[4], vehicleData: vehicleData, missionType: MissionType.MunicipalUtility, + cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.35, 0.35, 0.3 }, + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2200, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, + refLoad: 7100, trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 14300); + + AssertMission(segment.Missions[5], vehicleData: vehicleData, missionType: MissionType.Construction, + cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.35, 0.35, 0.3 }, + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 2200, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, + refLoad: 7100, trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 14300); + } + + /// <summary> + /// Segment 10: fixed reference weight, trailer always used + /// </summary> + [TestCase] + public void Segment12Test() + { + var vehicleData = new { + VehicleCategory = VehicleCategory.Tractor, + AxleConfiguration = AxleConfiguration.AxleConfig_6x4, + GrossVehicleMassRating = 24000.SI<Kilogram>(), + CurbWeight = 7500.SI<Kilogram>() + }; + + var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration, + vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight); + + Assert.AreEqual(VehicleClass.Class12, segment.VehicleClass); + + var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile); + TestAcceleration(data); + + Assert.AreEqual(5, segment.Missions.Length); + + AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.LongHaul, + cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.15, 0.15, 0.15 }, + trailerAxleWeightDistribution: new[] { 0.55 }, trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0 }, trailerType: new[] { TrailerType.ST1 }, minLoad: 0, refLoad: 19300, + trailerGrossVehicleWeight: new[] { 24000.0 }, deltaCdA: 0, maxLoad: 25000); + + AssertMission(segment.Missions[1], vehicleData: vehicleData, missionType: MissionType.LongHaulEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.125, 0.15, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.375, 0.25 }, trailerAxleCount: new[] { 3, 2 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0, 5400 }, trailerType: new[] { TrailerType.ST1, TrailerType.T2 }, minLoad: 0, + refLoad: 26500, trailerGrossVehicleWeight: new[] { 24000.0, 18000 }, deltaCdA: 0.6, maxLoad: 39600, ems: true); + + AssertMission(segment.Missions[2], vehicleData: vehicleData, missionType: MissionType.RegionalDelivery, + cosswindCorrection: "TractorSemitrailer", axleWeightDistribution: new[] { 0.2, 0.15, 0.15 }, + trailerAxleWeightDistribution: new[] { 0.5 }, trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0 }, trailerType: new[] { TrailerType.ST1 }, minLoad: 0, refLoad: 12900, + trailerGrossVehicleWeight: new[] { 24000.0 }, deltaCdA: 0, maxLoad: 25000); + + AssertMission(segment.Missions[3], vehicleData: vehicleData, missionType: MissionType.RegionalDeliveryEMS, + cosswindCorrection: "RigidTrailer", axleWeightDistribution: new[] { 0.15, 0.15, 0.1 }, + trailerAxleWeightDistribution: new[] { 0.35, 0.25 }, trailerAxleCount: new[] { 3, 2 }, bodyCurbWeight: 0, + trailerCurbWeight: new[] { 7500.0, 5400 }, trailerType: new[] { TrailerType.ST1, TrailerType.T2 }, minLoad: 0, + refLoad: 17500, trailerGrossVehicleWeight: new[] { 24000.0, 18000 }, deltaCdA: 0.6, maxLoad: 39600, ems: true); + } + + /// <summary> + /// Segment 9: fixed reference weight, trailer always used + /// </summary> + [TestCase] + public void Segment16Test() + { + var vehicleData = new { + VehicleCategory = VehicleCategory.RigidTruck, + AxleConfiguration = AxleConfiguration.AxleConfig_8x4, + GrossVehicleMassRating = 36000.SI<Kilogram>(), + CurbWeight = 7500.SI<Kilogram>() + }; + + var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration, + vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight); + + Assert.AreEqual(VehicleClass.Class16, segment.VehicleClass); + + var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile); + TestAcceleration(data); + + Assert.AreEqual(1, segment.Missions.Length); + + AssertMission(segment.Missions[0], vehicleData: vehicleData, missionType: MissionType.Construction, + cosswindCorrection: "RigidSolo", axleWeightDistribution: new[] { 0.25, 0.25, 0.25, 0.25 }, + trailerAxleWeightDistribution: new double[] { }, trailerAxleCount: new int[] { }, bodyCurbWeight: 0, + trailerCurbWeight: new double[] { }, trailerType: new TrailerType[] { }, minLoad: 0, refLoad: 12900, + trailerGrossVehicleWeight: new double[] { }, deltaCdA: 0, maxLoad: 28500); } public static void AssertMission(Mission m, dynamic vehicleData, MissionType missionType, string cosswindCorrection, - double[] axleWeightDistribution, double[] trailerAxleWeightDistribution, double bodyCurbWeight, - double trailerCurbWeight, TrailerType trailerType, double minLoad, double refLoad, double maxLoad, - double trailerGrossVehicleWeight, double deltaCdA) + double[] axleWeightDistribution, double[] trailerAxleWeightDistribution, int[] trailerAxleCount, + double bodyCurbWeight, + double[] trailerCurbWeight, TrailerType[] trailerType, double minLoad, double refLoad, double maxLoad, + double[] trailerGrossVehicleWeight, double deltaCdA, bool ems = false) { Assert.AreEqual(missionType, m.MissionType); Assert.AreEqual(cosswindCorrection, m.CrossWindCorrectionParameters); CollectionAssert.AreEqual(axleWeightDistribution, m.AxleWeightDistribution, "Axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", axleWeightDistribution), string.Join(",", m.AxleWeightDistribution)); - CollectionAssert.AreEqual(trailerAxleWeightDistribution, m.TrailerAxleWeightDistribution, + CollectionAssert.AreEqual(trailerAxleWeightDistribution, m.Trailer.Select(t => t.TrailerAxleWeightShare), "Trailer axle distribution not equal.\nexpected: {0}\nactual: {1}", string.Join(",", trailerAxleWeightDistribution), - string.Join(",", m.TrailerAxleWeightDistribution)); + string.Join(",", m.Trailer.Select(t => t.TrailerAxleWeightShare))); Assert.AreEqual(bodyCurbWeight.SI<Kilogram>(), m.BodyCurbWeight); - Assert.AreEqual(trailerCurbWeight.SI<Kilogram>(), m.TrailerCurbWeight); - Assert.AreEqual(trailerType, m.TrailerType); - + CollectionAssert.AreEqual(trailerCurbWeight, m.Trailer.Select(t => t.TrailerCurbWeight.Value())); + CollectionAssert.AreEqual(trailerType, m.Trailer.Select(t => t.TrailerType)); + CollectionAssert.AreEqual(trailerAxleCount, m.Trailer.Select(t => t.TrailerWheels.Count)); Assert.IsNotNull(m.CycleFile); Assert.IsTrue(!string.IsNullOrEmpty(new StreamReader(m.CycleFile).ReadLine())); Assert.AreEqual(minLoad.SI<Kilogram>(), m.MinLoad); AssertHelper.AreRelativeEqual(refLoad, m.RefLoad); Assert.AreEqual(maxLoad.SI<Kilogram>(), m.MaxLoad); - Assert.AreEqual(trailerGrossVehicleWeight.SI<Kilogram>(), m.TrailerGrossVehicleWeight); - Assert.AreEqual(VectoMath.Min(vehicleData.GrossVehicleMassRating + m.TrailerGrossVehicleWeight, 40000.SI<Kilogram>()) - - m.BodyCurbWeight - m.TrailerCurbWeight - vehicleData.CurbWeight, + CollectionAssert.AreEqual(trailerGrossVehicleWeight, m.Trailer.Select(t => t.TrailerGrossVehicleWeight.Value())); + Assert.AreEqual( + VectoMath.Min( + vehicleData.GrossVehicleMassRating + + m.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0), + ems ? 60000.SI<Kilogram>() : 40000.SI<Kilogram>()) + - m.BodyCurbWeight - m.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0) - + vehicleData.CurbWeight, m.MaxLoad); - Assert.AreEqual(deltaCdA.SI<SquareMeter>(), m.DeltaCdA); + Assert.AreEqual(deltaCdA.SI<SquareMeter>(), + m.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0)); } private static void EqualAcceleration(AccelerationCurveData data, double velocity, double acceleration, @@ -804,7 +1070,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var runs = dataReader.NextRun().ToList(); Assert.AreEqual(9, runs.Count); - var withT1 = new[] { 6.0, 6.0, 4.5 }; + var withT1 = new[] { 6.0, 6.0, 4.5, 4.5 }; CollectionAssert.AreEqual(withT1, runs[0].VehicleData.AxleData.Select(a => a.Inertia.Value())); CollectionAssert.AreEqual(withT1, runs[1].VehicleData.AxleData.Select(a => a.Inertia.Value())); CollectionAssert.AreEqual(withT1, runs[2].VehicleData.AxleData.Select(a => a.Inertia.Value())); @@ -849,16 +1115,29 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var dataReader = new DeclarationModeVectoRunDataFactory(dataProvider, null); var runs = dataReader.NextRun().ToList(); - Assert.AreEqual(6, runs.Count); - var withT1 = new[] { 14.9, 14.9, 19.2, 19.2, 19.2 }; - CollectionAssert.AreEqual(withT1, runs[0].VehicleData.AxleData.Select(a => a.Inertia.Value())); - CollectionAssert.AreEqual(withT1, runs[1].VehicleData.AxleData.Select(a => a.Inertia.Value())); - CollectionAssert.AreEqual(withT1, runs[2].VehicleData.AxleData.Select(a => a.Inertia.Value())); - var bodyOnly = new[] { 14.9, 14.9, 19.2, 19.2, 19.2 }; - CollectionAssert.AreEqual(bodyOnly, runs[3].VehicleData.AxleData.Select(a => a.Inertia.Value())); - CollectionAssert.AreEqual(bodyOnly, runs[4].VehicleData.AxleData.Select(a => a.Inertia.Value())); - CollectionAssert.AreEqual(bodyOnly, runs[5].VehicleData.AxleData.Select(a => a.Inertia.Value())); + Assert.AreEqual(VehicleClass.Class5, runs[0].VehicleData.VehicleClass); + Assert.AreEqual(12, runs.Count); + + //var bodyOnly = new[] { 14.9, 14.9 }; + var withST1 = new[] { 14.9, 14.9, 19.2, 19.2, 19.2 }; + var withST1andT2 = new[] { 14.9, 14.9, 19.2, 19.2, 19.2, 19.2, 19.2 }; + + CollectionAssert.AreEqual(withST1, runs[0].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1, runs[1].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1, runs[2].VehicleData.AxleData.Select(a => a.Inertia.Value())); + + CollectionAssert.AreEqual(withST1andT2, runs[3].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1andT2, runs[4].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1andT2, runs[5].VehicleData.AxleData.Select(a => a.Inertia.Value())); + + CollectionAssert.AreEqual(withST1, runs[6].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1, runs[7].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1, runs[8].VehicleData.AxleData.Select(a => a.Inertia.Value())); + + CollectionAssert.AreEqual(withST1andT2, runs[9].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1andT2, runs[10].VehicleData.AxleData.Select(a => a.Inertia.Value())); + CollectionAssert.AreEqual(withST1andT2, runs[11].VehicleData.AxleData.Select(a => a.Inertia.Value())); } } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs index c5490509372da21b4d1afa51935bc88c5a683e88..110c4f0a627cdcdff5b2a1d999b45af769a260db 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs @@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var vehicle = new VehicleContainer(ExecutionMode.Engineering); var axleGearData = MockSimulationDataFactory.CreateAxleGearDataFromFile(AxleGearValidRangeDataFile); var axleGear = new AxleGear(vehicle, axleGearData); - Assert.AreEqual(0, axleGear.Validate(ExecutionMode.Declaration, null).Count); + Assert.AreEqual(0, axleGear.Validate(ExecutionMode.Declaration, null, false).Count); } [TestCase] @@ -150,7 +150,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var vehicle = new VehicleContainer(ExecutionMode.Engineering); var axleGearData = MockSimulationDataFactory.CreateAxleGearDataFromFile(AxleGearInvalidRangeDataFile); var axleGear = new AxleGear(vehicle, axleGearData); - var errors = axleGear.Validate(ExecutionMode.Declaration, null); + var errors = axleGear.Validate(ExecutionMode.Declaration, null, false); Assert.AreEqual(1, errors.Count); } diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs index 18b98f885c862469ed28b94cb0a3959de207fe4b..d77cd1a9d6d72e404dc1d8ff709e6c700e222060 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs @@ -94,7 +94,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData }; data.FullLoadCurve.EngineData = data; - var results = data.Validate(ExecutionMode.Declaration, null); + var results = data.Validate(ExecutionMode.Declaration, null, false); Assert.IsFalse(results.Any(), "Validation Failed: " + string.Join("; ", results.Select(r => r.ErrorMessage))); Assert.IsTrue(data.IsValid()); } @@ -129,7 +129,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var engineData = dao.CreateEngineData(data, null); - var results = engineData.Validate(ExecutionMode.Declaration, null); + var results = engineData.Validate(ExecutionMode.Declaration, null, false); Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage))); Assert.IsTrue(engineData.IsValid()); } @@ -167,7 +167,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var engineData = dao.CreateEngineData(data, GearboxType.AMT); - var results = engineData.Validate(ExecutionMode.Declaration, null); + var results = engineData.Validate(ExecutionMode.Declaration, null, false); Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage))); Assert.IsTrue(engineData.IsValid()); @@ -207,10 +207,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData }, } }; - var result = vehicleData.Validate(ExecutionMode.Engineering, null); + var result = vehicleData.Validate(ExecutionMode.Engineering, null, false); Assert.IsTrue(!result.Any(), "validation should have succeded but failed." + string.Concat(result)); - result = vehicleData.Validate(ExecutionMode.Declaration, null); + result = vehicleData.Validate(ExecutionMode.Declaration, null, false); Assert.IsTrue(result.Any(), "validation should have failed, but succeeded."); } @@ -277,10 +277,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData AxleGearData = axleGearData }; - var results = data.Validate(ExecutionMode.Declaration, null); + var results = data.Validate(ExecutionMode.Declaration, null, false); Assert.IsTrue(results.Any(), "Validation should have failed, but succeded."); - results = vehicleData.Validate(ExecutionMode.Engineering, null); + results = vehicleData.Validate(ExecutionMode.Engineering, null, false); Assert.IsTrue(!results.Any()); } @@ -316,7 +316,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData AxleGearData = axleGearData }; - var results = data.Validate(ExecutionMode.Declaration, null); + var results = data.Validate(ExecutionMode.Declaration, null, false); Assert.IsTrue(results.Any(), "Validation should have failed, but succeded."); } @@ -326,7 +326,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void Validation_Test() { - var results = new DataObject().Validate(ExecutionMode.Declaration, null); + var results = new DataObject().Validate(ExecutionMode.Declaration, null, false); // every field and property should be tested except private parent fields and properties and // (4*4+1) * 2 = 17*2= 34 - 4 private parent fields (+2 public field and property which are tested twice) = 32 @@ -344,7 +344,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData } }; - var results = container.Validate(ExecutionMode.Declaration, null); + var results = container.Validate(ExecutionMode.Declaration, null, false); Assert.AreEqual(1, results.Count); } @@ -367,7 +367,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData VectoCSVFile.ReadStream( InputDataHelper.InputDataAsStream("engine torque,downshift rpm [rpm],upshift rpm [rpm] ", vgbs))); - var results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.MT); + var results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.MT, false); Assert.IsFalse(results.Any()); // change columns @@ -376,7 +376,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData VectoCSVFile.ReadStream( InputDataHelper.InputDataAsStream("engine torque,upshift rpm [rpm], downshift rpm [rpm] ", vgbs))); - results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.MT); + results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.MT, false); Assert.IsTrue(results.Any()); } @@ -396,7 +396,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData VectoCSVFile.ReadStream( InputDataHelper.InputDataAsStream("engine torque,downshift rpm [rpm],upshift rpm [rpm] ", vgbs))); - var results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.ATSerial); + var results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.ATSerial, false); Assert.IsFalse(results.Any()); // change columns @@ -405,7 +405,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData VectoCSVFile.ReadStream( InputDataHelper.InputDataAsStream("engine torque,upshift rpm [rpm], downshift rpm [rpm] ", vgbs))); - results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.ATSerial); + results = shiftPolygon.Validate(ExecutionMode.Declaration, GearboxType.ATSerial, false); Assert.IsFalse(results.Any()); }