diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index 97a6e5c6950ff3f45e4985a581f84b197ce90916..0dd70cf75cdd0f058431b97364161a2a1578d2c0 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -58,7 +58,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter //CertificationNumber = data.CertificationNumber, DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", VehicleCategory = data.VehicleCategory, - AxleConfiguration = data.AxleConfiguration, CurbWeight = data.CurbMassChassis, GrossVehicleWeight = data.GrossVehicleMassRating, AirDensity = Physics.AirDensity, diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 4d63d274f73340f70a75198c5775019255425beb..3bc0f5f6868fa9ce3b016550b1834b0e8a0c93b0 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -85,17 +85,26 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter if (!data.SavedInDeclarationMode) { WarnDeclarationMode("VehicleData"); } + return data.ExemptedVehicle + ? CreateExemptedVehicleData(data) + : CreateNonExemptedVehicleData(data, mission, loading, municipalBodyWeight); + } + private VehicleData CreateNonExemptedVehicleData( + IVehicleDeclarationInputData data, Mission mission, Kilogram loading, Kilogram municipalBodyWeight) + { var retVal = SetCommonVehicleData(data); + retVal.AxleConfiguration = data.AxleConfiguration; retVal.AirDensity = DeclarationData.AirDensity; retVal.VIN = data.VIN; retVal.ManufacturerAddress = data.ManufacturerAddress; retVal.LegislativeClass = data.LegislativeClass; + retVal.ZeroEmissionVehicle = data.ZeroEmissionVehicle; retVal.TrailerGrossVehicleWeight = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0); retVal.BodyAndTrailerWeight = (mission.MissionType == MissionType.MunicipalUtility - ? municipalBodyWeight - : mission.BodyCurbWeight) + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); + ? municipalBodyWeight + : mission.BodyCurbWeight) + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); retVal.Loading = loading; retVal.DynamicTyreRadius = @@ -104,12 +113,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter .Average(); retVal.CargoVolume = mission.MissionType != MissionType.Construction ? mission.TotalCargoVolume : 0.SI<CubicMeter>(); - var axles = data.Axles; if (axles.Count < mission.AxleWeightDistribution.Length) { - throw new VectoException("Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required", + throw new VectoException( + "Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required", data.Axles.Count, mission.AxleWeightDistribution.Length); } + var axleData = new List<Axle>(); for (var i = 0; i < mission.AxleWeightDistribution.Length; i++) { var axleInput = axles[i]; @@ -128,20 +138,37 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } foreach (var trailer in mission.Trailer) { - axleData.AddRange(trailer.TrailerWheels.Select(trailerWheel => new Axle { - AxleType = AxleType.Trailer, - AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count, - TwinTyres = DeclarationData.Trailer.TwinTyres, - RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, - TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), - Inertia = trailerWheel.Inertia, - WheelsDimension = trailerWheel.WheelType - })); + axleData.AddRange( + trailer.TrailerWheels.Select( + trailerWheel => new Axle { + AxleType = AxleType.Trailer, + AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count, + TwinTyres = DeclarationData.Trailer.TwinTyres, + RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient, + TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(), + Inertia = trailerWheel.Inertia, + WheelsDimension = trailerWheel.WheelType + })); } + retVal.AxleData = axleData; return retVal; } + private VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data) + { + var exempted = SetCommonVehicleData(data); + exempted.VIN = data.VIN; + exempted.ManufacturerAddress = data.ManufacturerAddress; + exempted.LegislativeClass = data.LegislativeClass; + exempted.ZeroEmissionVehicle = data.ZeroEmissionVehicle; + exempted.HybridElectricHDV = data.HybridElectricHDV; + exempted.DualFuelVehicle = data.DualFuelVehicle; + exempted.MaxNetPower1 = data.MaxNetPower1; + exempted.MaxNetPower2 = data.MaxNetPower2; + return exempted; + } + internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, PerSecond vehicleEngineIdleSpeed, IGearboxDeclarationInputData gearbox, IEnumerable<ITorqueLimitInputData> torqueLimits) diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index df48694c60c5602fe66b342c03e2e480291dbdee..4dc364224becf269ef458b8a5a6541c428af76f1 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -54,6 +54,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter WarnEngineeringMode("VehicleData"); } var retVal = SetCommonVehicleData(data); + retVal.AxleConfiguration = data.AxleConfiguration; retVal.BodyAndTrailerWeight = data.CurbMassExtra; //retVal.CurbWeight += data.CurbMassExtra; retVal.TrailerGrossVehicleWeight = 0.SI<Kilogram>(); diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs index fed55d58756d8c917cc8e574dfaa63accbf9aaa5..fbc3215d4d54c119b519cc846b290b040def8477 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs @@ -89,6 +89,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { _dao = new DeclarationDataAdapter(); var vehicle = InputDataProvider.JobInputData.Vehicle; + if (vehicle.ExemptedVehicle) { + return; + } _segment = GetVehicleClassification(vehicle.VehicleCategory, vehicle.AxleConfiguration, vehicle.GrossVehicleMassRating, @@ -123,23 +126,33 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl private void InitializeReport() { - var powertrainConfig = new VectoRunData() { - VehicleData = - _dao.CreateVehicleData(InputDataProvider.JobInputData.Vehicle, _segment.Missions.First(), - _segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight), - AirdragData = _airdragData, - EngineData = _engineData, - GearboxData = _gearboxData, - AxleGearData = _axlegearData, - Retarder = _retarderData, - Aux = - _dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), - _segment.Missions.First().MissionType, - _segment.VehicleClass), - PTO = _ptoTransmissionData, - InputDataHash = InputDataProvider.XMLHash - }; - powertrainConfig.VehicleData.VehicleClass = _segment.VehicleClass; + VectoRunData powertrainConfig; + if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle) { + powertrainConfig = new VectoRunData() { + Exempted = true, + VehicleData = _dao.CreateVehicleData(InputDataProvider.JobInputData.Vehicle, null, null, null) + }; + } else { + powertrainConfig = new VectoRunData() { + VehicleData = + _dao.CreateVehicleData( + InputDataProvider.JobInputData.Vehicle, _segment.Missions.First(), + _segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight), + AirdragData = _airdragData, + EngineData = _engineData, + GearboxData = _gearboxData, + AxleGearData = _axlegearData, + Retarder = _retarderData, + Aux = + _dao.CreateAuxiliaryData( + InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), + _segment.Missions.First().MissionType, + _segment.VehicleClass), + PTO = _ptoTransmissionData, + InputDataHash = InputDataProvider.XMLHash + }; + powertrainConfig.VehicleData.VehicleClass = _segment.VehicleClass; + } Report.InitializeReport(powertrainConfig); } @@ -149,11 +162,27 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl throw InitException; } + if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle) { + yield return new VectoRunData { + Exempted = true, + Report = Report, + Mission = new Mission() { MissionType = MissionType.ExemptedMission}, + VehicleData = _dao.CreateVehicleData(InputDataProvider.JobInputData.Vehicle, null, null, null) + }; + } else { + foreach (var vectoRunData in VectoRunDataNonExempted()) + yield return vectoRunData; + } + } + + private IEnumerable<VectoRunData> VectoRunDataNonExempted() + { foreach (var mission in _segment.Missions) { if (mission.MissionType.IsEMS() && _engineData.RatedPowerDeclared.IsSmaller(DeclarationData.MinEnginePowerForEMS)) { continue; } + DrivingCycleData cycle; lock (CyclesCacheLock) { if (CyclesCache.ContainsKey(mission.MissionType)) { @@ -167,14 +196,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var simulationRunData = new VectoRunData { Loading = loading.Key, VehicleData = - _dao.CreateVehicleData(InputDataProvider.JobInputData.Vehicle, mission, loading.Value, + _dao.CreateVehicleData( + InputDataProvider.JobInputData.Vehicle, mission, loading.Value, _segment.MunicipalBodyWeight), AirdragData = _dao.CreateAirdragData(InputDataProvider.JobInputData.Vehicle.AirdragInputData, mission, _segment), EngineData = _engineData.Copy(), // a copy is necessary because every run has a different correction factor! GearboxData = _gearboxData, AxleGearData = _axlegearData, AngledriveData = _angledriveData, - Aux = _dao.CreateAuxiliaryData(InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), mission.MissionType, + Aux = _dao.CreateAuxiliaryData( + InputDataProvider.JobInputData.Vehicle.AuxiliaryInputData(), mission.MissionType, _segment.VehicleClass), Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), Retarder = _retarderData, @@ -188,12 +219,12 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl ? _municipalPtoTransmissionData : _ptoTransmissionData, InputDataHash = InputDataProvider.XMLHash, - SimulationType = SimulationType.DistanceCycle - + SimulationType = SimulationType.DistanceCycle }; simulationRunData.EngineData.FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( - mission.MissionType.GetNonEMSMissionType(), _engineData.WHTCRural, _engineData.WHTCUrban, _engineData.WHTCMotorway) * - _engineData.ColdHotCorrectionFactor * _engineData.CorrectionFactorRegPer; + mission.MissionType.GetNonEMSMissionType(), _engineData.WHTCRural, _engineData.WHTCUrban, + _engineData.WHTCMotorway) * + _engineData.ColdHotCorrectionFactor * _engineData.CorrectionFactorRegPer; simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; yield return simulationRunData; } diff --git a/VectoCore/VectoCore/Models/Declaration/MissionType.cs b/VectoCore/VectoCore/Models/Declaration/MissionType.cs index 893376efc85a1ff21b59503c767448c557476ebf..30989c16455e66c5dbb842086df9422d95190aab 100644 --- a/VectoCore/VectoCore/Models/Declaration/MissionType.cs +++ b/VectoCore/VectoCore/Models/Declaration/MissionType.cs @@ -29,34 +29,35 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public enum MissionType - { - LongHaul, - LongHaulEMS, - RegionalDelivery, - RegionalDeliveryEMS, - UrbanDelivery, - MunicipalUtility, - Construction, - HeavyUrban, - Urban, - Suburban, - Interurban, - Coach, - VerificationTest - } - - public static class MissionTypeHelper - { - public static string GetName(this MissionType self) - { - return self.ToString().ToLowerInvariant(); - } - +using System; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public enum MissionType + { + LongHaul, + LongHaulEMS, + RegionalDelivery, + RegionalDeliveryEMS, + UrbanDelivery, + MunicipalUtility, + Construction, + HeavyUrban, + Urban, + Suburban, + Interurban, + Coach, + VerificationTest, + ExemptedMission + } + + public static class MissionTypeHelper + { + public static string GetName(this MissionType self) + { + return self.ToString().ToLowerInvariant(); + } + public static bool IsEMS(this MissionType self) { return self == MissionType.LongHaulEMS || self == MissionType.RegionalDeliveryEMS; @@ -65,49 +66,49 @@ namespace TUGraz.VectoCore.Models.Declaration public static bool IsDeclarationMission(this MissionType self) { return self != MissionType.VerificationTest; - } - - public static MissionType GetNonEMSMissionType(this MissionType self) - { - if (self == MissionType.LongHaulEMS) { - return MissionType.LongHaul; - } - if (self == MissionType.RegionalDeliveryEMS) { - return MissionType.RegionalDelivery; - } - return self; - } - - public static string ToXMLFormat(this MissionType self) - { - switch (self) { - case MissionType.LongHaul: - return "Long Haul"; - case MissionType.LongHaulEMS: - return "Long Haul EMS"; - case MissionType.RegionalDelivery: - return "Regional Delivery"; - case MissionType.RegionalDeliveryEMS: - return "Regional Delivery EMS"; - case MissionType.UrbanDelivery: - return "Urban Delivery"; - case MissionType.MunicipalUtility: - return "Municipal Utility"; - case MissionType.Construction: - return "Construction"; - //case MissionType.HeavyUrban: - // return ""; - //case MissionType.Urban: - // return ""; - //case MissionType.Suburban: - // return ""; - //case MissionType.Interurban: - // return ""; - //case MissionType.Coach: - // return ""; - default: - throw new ArgumentOutOfRangeException("MissionType", self, null); - } - } - } + } + + public static MissionType GetNonEMSMissionType(this MissionType self) + { + if (self == MissionType.LongHaulEMS) { + return MissionType.LongHaul; + } + if (self == MissionType.RegionalDeliveryEMS) { + return MissionType.RegionalDelivery; + } + return self; + } + + public static string ToXMLFormat(this MissionType self) + { + switch (self) { + case MissionType.LongHaul: + return "Long Haul"; + case MissionType.LongHaulEMS: + return "Long Haul EMS"; + case MissionType.RegionalDelivery: + return "Regional Delivery"; + case MissionType.RegionalDeliveryEMS: + return "Regional Delivery EMS"; + case MissionType.UrbanDelivery: + return "Urban Delivery"; + case MissionType.MunicipalUtility: + return "Municipal Utility"; + case MissionType.Construction: + return "Construction"; + //case MissionType.HeavyUrban: + // return ""; + //case MissionType.Urban: + // return ""; + //case MissionType.Suburban: + // return ""; + //case MissionType.Interurban: + // return ""; + //case MissionType.Coach: + // return ""; + default: + throw new ArgumentOutOfRangeException("MissionType", self, null); + } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs index fe131c8a4ca558818af343ce4a2834257fa5a22e..06281f107a7fcda9d669dad1a2c4a898c457be67 100644 --- a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs +++ b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs @@ -62,7 +62,7 @@ namespace TUGraz.VectoCore.Models.Declaration protected override void ParseData(DataTable table) { foreach (MissionType mission in Enum.GetValues(typeof(MissionType))) { - if (mission.IsEMS() || !mission.IsDeclarationMission()) { + if (mission.IsEMS() || !mission.IsDeclarationMission() || mission == MissionType.ExemptedMission) { continue; } var values = table.Columns[mission.ToString().ToLower()].Values<string>().ToDouble().ToArray(); diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index 21cfcb0a6f79ecf87b4841cdf21d8030ef374f06..490067b8eb59c9f39bcef676101dcabf1cda9723 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -49,6 +49,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [CustomValidation(typeof(VectoRunData), "ValidateRunData")] public class VectoRunData : SimulationComponentData { + public VectoRunData() + { + Exempted = false; + } + [ValidateObject] public VehicleData VehicleData { get; internal set; } @@ -110,6 +115,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public VTPData VTPData { get; set; } + public bool Exempted { get; set; } + public class AuxData { // ReSharper disable once InconsistentNaming diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs b/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs new file mode 100644 index 0000000000000000000000000000000000000000..f91c48b7f25c66d3086c19fe2184d1b3d92d4f71 --- /dev/null +++ b/VectoCore/VectoCore/Models/Simulation/Impl/ExemptedRun.cs @@ -0,0 +1,39 @@ +using System; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.OutputData; + +namespace TUGraz.VectoCore.Models.Simulation.Impl { + internal class ExemptedRun : VectoRun + { + private Action<ModalDataContainer> _writeSumData; + + public ExemptedRun(VehicleContainer data, Action<ModalDataContainer> writeSumData) : base(data) + { + _writeSumData = writeSumData; + } + + #region Overrides of VectoRun + + public override double Progress { get { return 1; } } + + public override string CycleName { get { return "ExemptedVehicle"; } } + + public override string RunSuffix { get { return ""; } } + + protected override IResponse DoSimulationStep() + { + FinishedWithoutErrors = true; + _writeSumData(null); + return new ResponseCycleFinished(); + } + + protected override IResponse Initialize() + { + return new ResponseSuccess(); + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs index 2d3520853d47e45db5113a54da9418f22f8db9f5..a821903749a7c024efc96268faa7b0dfe8af843f 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs @@ -146,37 +146,58 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var warning1Hz = false; foreach (var data in DataReader.NextRun()) { - var d = data; - var addReportResult = PrepareReport(data); - if (!data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz && !warning1Hz) { - Log.Error("Output filter for 1Hz results is only available for distance-based cycles!"); - warning1Hz = true; - } var current = i++; + var d = data; data.JobRunId = current; - IModalDataContainer modContainer = - new ModalDataContainer(data, ModWriter, - addReportResult: _mode == ExecutionMode.Declaration ? addReportResult : null, - writeEngineOnly: _engineOnlyMode, - filter: GetModDataFilter(data)) { - WriteAdvancedAux = data.AdvancedAux != null && data.AdvancedAux.AuxiliaryAssembly == AuxiliaryModel.Advanced, - WriteModalResults = _mode != ExecutionMode.Declaration || WriteModalResults - }; - - var builder = new PowertrainBuilder(modContainer, modData => { + yield return data.Exempted ? GetExemptedRun(data) : GetNonExemptedRun(data, current, d, ref warning1Hz); + } + } + + private IVectoRun GetExemptedRun(VectoRunData data) + { + if (data.Report != null) { + data.Report.PrepareResult(data.Loading, data.Mission, data); + } + return new ExemptedRun(new VehicleContainer(data.ExecutionMode) { RunData = data }, modData => { + if (data.Report != null) { + data.Report.AddResult(data.Loading, data.Mission, data, modData); + } + }); + } + + private IVectoRun GetNonExemptedRun(VectoRunData data, int current, VectoRunData d, ref bool warning1Hz) + { + var addReportResult = PrepareReport(data); + if (!data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz && !warning1Hz) { + Log.Error("Output filter for 1Hz results is only available for distance-based cycles!"); + warning1Hz = true; + } + + IModalDataContainer modContainer = + new ModalDataContainer( + data, ModWriter, + addReportResult: _mode == ExecutionMode.Declaration ? addReportResult : null, + writeEngineOnly: _engineOnlyMode, + filter: GetModDataFilter(data)) { + WriteAdvancedAux = data.AdvancedAux != null && data.AdvancedAux.AuxiliaryAssembly == AuxiliaryModel.Advanced, + WriteModalResults = _mode != ExecutionMode.Declaration || WriteModalResults + }; + + var builder = new PowertrainBuilder( + modContainer, modData => { if (SumData != null) { SumData.Write(modData, JobNumber, current, d); } }); - var run = GetVectoRun(data, builder); + var run = GetVectoRun(data, builder); - if (Validate) { - ValidateVectoRunData(run, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type, - data.Mission != null && data.Mission.MissionType.IsEMS()); - } - yield return run; + if (Validate) { + ValidateVectoRunData( + run, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type, + data.Mission != null && data.Mission.MissionType.IsEMS()); } + return run; } private IModalDataFilter[] GetModDataFilter(VectoRunData data) @@ -244,9 +265,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl if (data.Report != null) { data.Report.PrepareResult(data.Loading, data.Mission, data); } - Action<ModalDataContainer> addReportResult = writer => { + Action<ModalDataContainer> addReportResult = modData => { if (data.Report != null) { - data.Report.AddResult(data.Loading, data.Mission, data, writer); + data.Report.AddResult(data.Loading, data.Mission, data, modData); } }; return addReportResult; diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs index c66eee78a9855d7a5dd3c460e2b1e4ac65416064..84dd263d333388cbf30718c04078514ccc6f0450 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs @@ -61,17 +61,17 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public int RunIdentifier { get; protected set; } - public string RunName + public virtual string RunName { get { return Container.RunData.JobName; } } - public string CycleName + public virtual string CycleName { get { return Container.RunData.Cycle.Name; } } - public string RunSuffix + public virtual string RunSuffix { get { return Container.RunData.ModFileSuffix; } } @@ -81,7 +81,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl get { return Container.RunData.JobRunId; } } - public double Progress + public virtual double Progress { get { return CyclePort.Progress; } } diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 48467a2291bf74ab0e1835cb4c2f9ac2ddba78fb..9fef1b8f0a9a774a1d0d7aba99f2f2066c696c4d 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -327,12 +327,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public void FinishSimulationRun(Exception e = null) { Log.Info("VehicleContainer finishing simulation."); - ModData.Finish(RunStatus, e); + ModData?.Finish(RunStatus, e); WriteSumData(ModData); - ModData.FinishSimulation(); - DrivingCycle.FinishSimulation(); + ModData?.FinishSimulation(); + DrivingCycle?.FinishSimulation(); } public void FinishSimulation() diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs index d8b1a49c947533e83e0d56f50d26eb058e89a9aa..79915c78f42950e55d12e30abf4f9ff24f1640bd 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs @@ -205,6 +205,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data } } + public bool ZeroEmissionVehicle { get; internal set; } + public bool HybridElectricHDV { get; internal set; } + public bool DualFuelVehicle { get; internal set; } + public Watt MaxNetPower1 { get; internal set; } + public Watt MaxNetPower2 { get; internal set; } + protected void ComputeRollResistanceAndReducedMassWheels() { if (TotalVehicleWeight == 0.SI<Kilogram>()) { diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 5226da768a02ae14c98a36c4b6535acd669ad8cc..209bfebe4e5aa071c5b1573b5eef957f73b57883 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -100,13 +100,16 @@ namespace TUGraz.VectoCore.OutputData [MethodImpl(MethodImplOptions.Synchronized)] public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData) { - if (!Missions.ContainsKey(mission.MissionType)) { - Missions[mission.MissionType] = new ResultContainer<T>() { - Mission = mission.MissionType, + var missionType = mission.MissionType; + if (!Missions.ContainsKey(missionType)) { + Missions[MissionType.ExemptedMission] = new ResultContainer<T>() { + Mission = MissionType.ExemptedMission, ResultEntry = new Dictionary<LoadingType, T>(), }; } - Missions[mission.MissionType].ResultEntry[loading] = new T(); + if (missionType != MissionType.ExemptedMission) { + Missions[mission.MissionType].ResultEntry[loading] = new T(); + } _resultCount++; } @@ -118,12 +121,14 @@ namespace TUGraz.VectoCore.OutputData if (!Missions.ContainsKey(mission.MissionType)) { throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType); } - if (!Missions[mission.MissionType].ResultEntry.ContainsKey(loadingType)) { + if (mission.MissionType != MissionType.ExemptedMission && !Missions[mission.MissionType].ResultEntry.ContainsKey(loadingType)) { throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType); } _resultCount--; - DoAddResult(Missions[mission.MissionType].ResultEntry[loadingType], runData, modData); + if (mission.MissionType != MissionType.ExemptedMission) { + DoAddResult(Missions[mission.MissionType].ResultEntry[loadingType], runData, modData); + } if (_resultCount == 0) { DoWriteReport(); diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs index 8125516e3189cb3e4e81b6d090dc28420ff6d189..52ec8ff3b0e47039b74d552e6b379de50dbf82a4 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs @@ -72,6 +72,7 @@ namespace TUGraz.VectoCore.OutputData.XML public void Initialize(VectoRunData modelData) { + var exempted = modelData.Exempted; VehiclePart.Add( new XElement(tns + XMLNames.Component_Model, modelData.VehicleData.ModelName), new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer), @@ -79,24 +80,43 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN), new XElement(tns + XMLNames.Vehicle_LegislativeClass, modelData.VehicleData.LegislativeClass.ToXMLFormat()), new XElement(tns + XMLNames.Report_Vehicle_VehicleGroup, modelData.VehicleData.VehicleClass.GetClassNumber()), - new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()), + exempted ? null : new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()), new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, XMLHelper.ValueAsUnit(modelData.VehicleData.GrossVehicleWeight, XMLNames.Unit_t, 1)), new XElement(tns + XMLNames.Vehicle_CurbMassChassis, XMLHelper.ValueAsUnit(modelData.VehicleData.CurbWeight, XMLNames.Unit_kg)), - new XElement(tns + XMLNames.Report_Vehicle_EngineRatedPower, XMLHelper.ValueAsUnit(modelData.EngineData.RatedPowerDeclared, XMLNames.Unit_kW)), - new XElement(tns + XMLNames.Report_Vehicle_EngineDisplacement, XMLHelper.ValueAsUnit(modelData.EngineData.Displacement, XMLNames.Unit_ltr, 1)), + exempted ? ExemptedData(modelData) : ComponentData(modelData) + ); + InputDataIntegrity = new XElement(tns + "InputDataSignature", + modelData.InputDataHash == null ? CreateDummySig() : new XElement(modelData.InputDataHash)); + } + + private XElement[] ExemptedData(VectoRunData modelData) + { + return null; + } + + private XElement[] ComponentData(VectoRunData modelData) + { + return new[] { + new XElement( + tns + XMLNames.Report_Vehicle_EngineRatedPower, + XMLHelper.ValueAsUnit(modelData.EngineData.RatedPowerDeclared, XMLNames.Unit_kW)), + new XElement( + tns + XMLNames.Report_Vehicle_EngineDisplacement, + XMLHelper.ValueAsUnit(modelData.EngineData.Displacement, XMLNames.Unit_ltr, 1)), new XElement(tns + XMLNames.Engine_FuelType, modelData.EngineData.FuelType.ToXMLFormat()), - new XElement(tns + XMLNames.Report_Vehicle_TransmissionCertificationMethod, + new XElement( + tns + XMLNames.Report_Vehicle_TransmissionCertificationMethod, modelData.GearboxData.CertificationMethod.ToXMLFormat()), new XElement(tns + XMLNames.Gearbox_TransmissionType, modelData.GearboxData.Type.ToXMLFormat()), new XElement(tns + XMLNames.Report_GetGearbox_GearsCount, modelData.GearboxData.Gears.Count), new XElement(tns + XMLNames.Report_Vehicle_Retarder, modelData.Retarder.Type.IsDedicatedComponent()), new XElement(tns + XMLNames.Report_Vehicle_AxleRatio, modelData.AxleGearData.AxleGear.Ratio.ToXMLFormat(3)), - new XElement(tns + XMLNames.Report_Vehicle_AverageRRC, + new XElement( + tns + XMLNames.Report_Vehicle_AverageRRC, modelData.VehicleData.AverageRollingResistanceTruck.ToXMLFormat(4)) - ); - InputDataIntegrity = new XElement(tns + "InputDataSignature", - modelData.InputDataHash == null ? CreateDummySig() : new XElement(modelData.InputDataHash)); + }; + } private XElement CreateDummySig() diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs index 5ac6e0e68dc0744463772745addf552dc24c115b..ae5b5c1d586a3e124943449ab158a1eea57fa6f8 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs @@ -74,6 +74,7 @@ namespace TUGraz.VectoCore.OutputData.XML public void Initialize(VectoRunData modelData) { + var exempted = modelData.Exempted; VehiclePart.Add( new XElement(tns + XMLNames.Component_Model, modelData.VehicleData.ModelName), new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer), @@ -81,27 +82,37 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN), new XElement(tns + XMLNames.Vehicle_LegislativeClass, modelData.VehicleData.LegislativeClass.ToXMLFormat()), new XElement(tns + XMLNames.Report_Vehicle_VehicleGroup, modelData.VehicleData.VehicleClass.GetClassNumber()), - new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()), + exempted ? null : new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()), new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, XMLHelper.ValueAsUnit(modelData.VehicleData.GrossVehicleWeight, XMLNames.Unit_t, 1)), new XElement(tns + XMLNames.Vehicle_CurbMassChassis, XMLHelper.ValueAsUnit(modelData.VehicleData.CurbWeight, XMLNames.Unit_kg)), new XElement(tns + XMLNames.Vehicle_PTO, modelData.PTO != null), - GetTorqueLimits(modelData.EngineData), - new XElement(tns + XMLNames.Vehicle_Components, - GetEngineDescription(modelData.EngineData), - GetGearboxDescription(modelData.GearboxData), - GetTorqueConverterDescription(modelData.GearboxData.TorqueConverterData), - GetRetarderDescription(modelData.Retarder), - GetAngledriveDescription(modelData.AngledriveData), - GetAxlegearDescription(modelData.AxleGearData), - GetAirDragDescription(modelData.AirdragData), - GetAxleWheelsDescription(modelData.VehicleData), - GetAuxiliariesDescription(modelData.Aux) - ) + exempted ? null : GetTorqueLimits(modelData.EngineData), + exempted ? ExemptedData(modelData) : VehicleComponents(modelData) ); InputDataIntegrity = new XElement(tns + XMLNames.Report_Input_Signature, modelData.InputDataHash == null ? CreateDummySig() : new XElement(modelData.InputDataHash)); } + private XElement VehicleComponents(VectoRunData modelData) + { + return new XElement(tns + XMLNames.Vehicle_Components, + GetEngineDescription(modelData.EngineData), + GetGearboxDescription(modelData.GearboxData), + GetTorqueConverterDescription(modelData.GearboxData.TorqueConverterData), + GetRetarderDescription(modelData.Retarder), + GetAngledriveDescription(modelData.AngledriveData), + GetAxlegearDescription(modelData.AxleGearData), + GetAirDragDescription(modelData.AirdragData), + GetAxleWheelsDescription(modelData.VehicleData), + GetAuxiliariesDescription(modelData.Aux) + ); + } + + private XElement ExemptedData(VectoRunData modelData) + { + return null; + } + private XElement CreateDummySig() { return new XElement(di + XMLNames.DI_Signature_Reference, diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 9d297de84f79077a83d9ce41eb3588fcb21d674b..de3b8a7e6ce29e295400248e2132f6864326409f 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -196,6 +196,7 @@ <Compile Include="Models\Simulation\Data\ModalResultField.cs" /> <Compile Include="InputData\Reader\Impl\EngineeringVTPModeVectoRunDataFactory.cs" /> <Compile Include="Models\SimulationComponent\Impl\VTPCycle.cs" /> + <Compile Include="Models\Simulation\Impl\ExemptedRun.cs" /> <Compile Include="OutputData\XML\XMLVTPReport.cs" /> <Compile Include="OutputData\VTPReport.cs" /> <Compile Include="OutputData\ModFilter\ActualModalDataFilter.cs" /> diff --git a/VectoCore/VectoCoreTest/Integration/ExemptedVehicleTest.cs b/VectoCore/VectoCoreTest/Integration/ExemptedVehicleTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..ac7b4a776829b2c5cb163fb2f0517f53bce81297 --- /dev/null +++ b/VectoCore/VectoCoreTest/Integration/ExemptedVehicleTest.cs @@ -0,0 +1,62 @@ +using System; +using System.IO; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Internal; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.OutputData.FileIO; +using TUGraz.VectoCore.Tests.Models.Simulation; + +namespace TUGraz.VectoCore.Tests.Integration +{ + [TestFixture] + public class ExemptedVehicleTest + { + const string ExemptedVehicle = @"Testdata\Integration\DeclarationMode\ExemptedVehicle\vecto_vehicle-sample_exempted.xml"; + + [OneTimeSetUp] + public void RunBeforeAnyTests() + { + Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory); + } + + [TestCase(ExemptedVehicle, 1)] + public void TestSimulationExemptedVehicle(string filename, int numRuns) + { + var writer = new FileOutputWriter(filename); + + var customerFile = writer.XMLCustomerReportName; + var manufactuerFile = writer.XMLFullReportName; + if (File.Exists(customerFile)) { + File.Delete(customerFile); + } + if (File.Exists(manufactuerFile)) { + File.Delete(manufactuerFile); + } + + var inputData = new XMLDeclarationInputDataProvider(filename, true); //.ReadJsonJob(relativeJobPath); + var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, writer) { + WriteModalResults = true, + ActualModalData = true + }; + var jobContainer = new JobContainer(new MockSumWriter()); + + var runs = factory.SimulationRuns().ToList(); + Assert.AreEqual(numRuns, runs.Count); + foreach (var run in runs) { + jobContainer.AddRun(run); + } + //jobContainer.AddRuns(factory); + + jobContainer.Execute(); + jobContainer.WaitFinished(); + var progress = jobContainer.GetProgress(); + Assert.IsTrue(progress.All(r => r.Value.Success), string.Concat<Exception>(progress.Select(r => r.Value.Error))); + + Assert.IsTrue(File.Exists(manufactuerFile)); + Assert.IsTrue(File.Exists(customerFile)); + } + } +} diff --git a/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/ExemptedVehicle/vecto_vehicle-sample_exempted.xml b/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/ExemptedVehicle/vecto_vehicle-sample_exempted.xml new file mode 100644 index 0000000000000000000000000000000000000000..e8c42c7e40d553e5174954ecec33c48951c6aadf --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/ExemptedVehicle/vecto_vehicle-sample_exempted.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<tns:VectoInputDeclaration xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.0" + xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v1.0" + xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationInput:v1.0 E:\QUAM\Workspace\VECTO_quam\VectoCore\VectoCore\Resources\XSD/VectoInput.xsd" + xmlns:di="http://www.w3.org/2000/09/xmldsig#"> + <Vehicle id="VEH-1234567890"> + <Manufacturer>Generic Truck Manufacturer</Manufacturer> + <ManufacturerAddress>Street, ZIP City</ManufacturerAddress> + <Model>Generic Model</Model> + <VIN>VEH-1234567890</VIN> + <Date>2017-02-15T11:00:00Z</Date> + <LegislativeClass>N3</LegislativeClass> + <VehicleCategory>Tractor</VehicleCategory> + <CurbMassChassis>7100</CurbMassChassis> + <GrossVehicleMass>40000</GrossVehicleMass> + <ZeroEmissionVehicle>true</ZeroEmissionVehicle> + <MaxNetPower1>30000</MaxNetPower1> + <MaxNetPower2>20000</MaxNetPower2> + <HybridElectricHDV>true</HybridElectricHDV> + <DualFuelVehicle>true</DualFuelVehicle> + </Vehicle> +</tns:VectoInputDeclaration> \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 63bbe9001d082aff119c9a7880d2a2e627587c35..b5946c0c3e505c2e81891fa98b29a35670f8ddba 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -85,6 +85,7 @@ <Compile Include="Integration\CoachPowerTrain.cs" /> <Compile Include="Integration\Declaration\EngineInputDataTests.cs" /> <Compile Include="Integration\DriverStrategy\SimpleCycles.cs" /> + <Compile Include="Integration\ExemptedVehicleTest.cs" /> <Compile Include="Integration\VocationalVehicleTest.cs" /> <Compile Include="Integration\VTP\VTPTest.cs" /> <Compile Include="Integration\FuelTypesTest.cs" /> @@ -2717,6 +2718,9 @@ <Content Include="TestData\Integration\DeclarationMode\EngineSpeedTooHigh\vecto_vehicle-sample_9gears.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="TestData\Integration\DeclarationMode\ExemptedVehicle\vecto_vehicle-sample_exempted.xml"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle\CityBus_AT_Ser.RSLT_MANUFACTURER.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>