diff --git a/VectoCommon/VectoCommon/Models/VehicleCategory.cs b/VectoCommon/VectoCommon/Models/VehicleCategory.cs index 732ed89df177098c8a543c231454a8da546019ab..11e0d37ca7dd511580c25edecac59591b2e00ea5 100644 --- a/VectoCommon/VectoCommon/Models/VehicleCategory.cs +++ b/VectoCommon/VectoCommon/Models/VehicleCategory.cs @@ -43,7 +43,8 @@ namespace TUGraz.VectoCommon.Models //InterurbanBus, Coach, HeavyBusPrimaryVehicle, - HeavyBusCompletedVehicle + HeavyBusCompletedVehicle, + GenericBusVehicle } public static class VehicleCategoryHelper @@ -129,6 +130,7 @@ namespace TUGraz.VectoCommon.Models case VehicleCategory.Coach: case VehicleCategory.HeavyBusPrimaryVehicle: case VehicleCategory.HeavyBusCompletedVehicle: + case VehicleCategory.GenericBusVehicle: return false; default: throw new ArgumentOutOfRangeException("VehicleCategory", category, null); @@ -141,7 +143,8 @@ namespace TUGraz.VectoCommon.Models case VehicleCategory.Coach: case VehicleCategory.CityBus: case VehicleCategory.HeavyBusPrimaryVehicle: - case VehicleCategory.HeavyBusCompletedVehicle: return true; + case VehicleCategory.HeavyBusCompletedVehicle: + case VehicleCategory.GenericBusVehicle: return true; default: return false; } } diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs index f28214c356e94063905c3a1c0d2e3e8a814e92a1..03d87f046813e5b760f52b477e3ab5541c6d0a09 100644 --- a/VectoCore/VectoCore/Configuration/Constants.cs +++ b/VectoCore/VectoCore/Configuration/Constants.cs @@ -358,7 +358,6 @@ namespace TUGraz.VectoCore.Configuration public const double OutputTorqueStart = 250; public const double OutputTorqueEnd = 10000; - public const double IAxl = 6.5; public const double Efficiency = 0.98; public const double T0 = 52.5; @@ -366,6 +365,8 @@ namespace TUGraz.VectoCore.Configuration public const double Td_n = 150; public const double FactorAngleDrive = 0.75; + + public const double RetarderGenericFactor = 0.5; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs index 0b3ad62e0ff87221e59e1fa09b7f02efa586a4c3..786b0be8c14a4e842881463a7437b00b85ccb32f 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs @@ -2,6 +2,7 @@ using System.Xml; using System.Xml.Linq; using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader; using TUGraz.VectoCore.Utils; @@ -234,7 +235,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider // --------------------------------------------------------------------------------------- - public class XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01 : XMLDeclarationComponentsDataProviderV10, IXMLVehicleComponentsDeclaration + public class XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01 : XMLDeclarationComponentsDataProviderV10, IXMLVehicleComponentsDeclaration, + IRetarderInputData + { public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_PRIMARY_BUS_VEHICLE_URI_V01; @@ -244,13 +247,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider private IBusAuxiliariesDeclarationData _busAuxiliaries; - - public XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01(IXMLDeclarationVehicleData vehicle, XmlNode componentNode, - string sourceFile) : base(vehicle, componentNode, sourceFile) { } + + public XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01(IXMLDeclarationVehicleData vehicle, + XmlNode componentNode, string sourceFile) : base(vehicle, componentNode, sourceFile) { } + IRetarderInputData IVehicleComponentsDeclaration.RetarderInputData { - get { return null; } + get { return this; } } ITorqueConverterDeclarationInputData IVehicleComponentsDeclaration.TorqueConverterInputData @@ -277,5 +281,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider { get { return NAMESPACE_URI; } } + + #region IRetarderInputData Interface Implementation + + public RetarderType Type { get{ return _vehicle.RetarderType; }} + public double Ratio { get { return _vehicle.RetarderRatio; }} + public TableData LossMap { get; } + + #endregion } } \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index f049130efb609cfcfbbd51b2466652f3d88321ca..aea433164656b507af9e955a57f53446f1891c9e 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -164,7 +164,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ModelName = data.Model, Date = data.Date, CertificationMethod = data.CertificationMethod, - CertificationNumber = data.CertificationNumber, + CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ? + data.CertificationNumber : "", DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", Type = data.Type }; @@ -172,8 +173,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter protected static TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory ) { - // TODO MQ 20200401 maybe vehiclecategory heavybuscompleted is not correct here. - if (vehicleCategory == VehicleCategory.HeavyBusCompletedVehicle) { + if (vehicleCategory == VehicleCategory.GenericBusVehicle) { return gear.Ratio.IsEqual(1) ? TransmissionLossMapReader.Create(0.98, gear.Ratio, $"Gear {i + 1}") : TransmissionLossMapReader.Create(0.96, gear.Ratio, $"Gear {i + 1}"); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs index f80af57120def5d0d3e0d362df92087741a42549..96d475ca97b612ce60a2634686aa5e70730e56c3 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs @@ -360,7 +360,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var gears = new Dictionary<uint, GearData>(); var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]); - var vehicleCategory = inputData.VehicleCategory; + var vehicleCategory = runData.VehicleData.VehicleCategory == VehicleCategory.GenericBusVehicle + ? VehicleCategory.GenericBusVehicle + : inputData.VehicleCategory; for (uint i = 0; i < gearsInput.Count; i++) { var gear = gearsInput[(int)i]; var lossMap = CreateGearLossMap(gear, i, false, vehicleCategory); @@ -401,8 +403,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter if (retVal.Type.AutomaticTransmission()) { var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio; retVal.PowershiftShiftTime = DeclarationData.Gearbox.PowershiftShiftTime; - // TODO MQ 20200401 maybe vehiclecategory heavybuscompleted is not correct here. - if (vehicleCategory == VehicleCategory.HeavyBusCompletedVehicle) { + + if (vehicleCategory == VehicleCategory.GenericBusVehicle) { var fileStream = RessourceHelper.ReadStream(DeclarationData.FactorMethodBus.GenericTorqueConvert); retVal.TorqueConverterData = TorqueConverterDataReader.ReadFromStream(fileStream, DeclarationData.TorqueConverter.ReferenceRPM, @@ -420,10 +422,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); } - retVal.TorqueConverterData.ModelName = torqueConverter.Model; - retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue; - retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod; - retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber; + if (torqueConverter != null) { + retVal.TorqueConverterData.ModelName = torqueConverter.Model; + retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue; + retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod; + retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber; + } } return retVal; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs index a3f729163fe1b7ab301e67966cde5766acb2126c..e436a195c96f83f31af3847c63f16ddba65949c2 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs @@ -25,64 +25,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter { #region Overrides of DeclarationDataAdapterTruck - public DriverData CreateDriverData(Segment segment, IVehicleDeclarationInputData primaryVehicle) - { - var lookAheadData = new DriverData.LACData { - Enabled = DeclarationData.Driver.LookAhead.Enabled, - //Deceleration = DeclarationData.Driver.LookAhead.Deceleration, - MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed, - LookAheadDecisionFactor = new LACDecisionFactor(), - LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor - }; - - var overspeedData = new DriverData.OverSpeedData { - Enabled = true, - MinSpeed = DeclarationData.Driver.OverSpeed.MinSpeed, - OverSpeed = DeclarationData.Driver.OverSpeed.AllowedOverSpeed, - }; - - var driver = new DriverData { - AccelerationCurve = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile), - LookAheadCoasting = lookAheadData, - OverSpeed = overspeedData, - EngineStopStart = primaryVehicle.ADAS.EngineStopStart - ? new DriverData.EngineStopStartData { - EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay, - MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan, - UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor - } - : null, - EcoRoll = primaryVehicle.ADAS.EcoRoll != EcoRollType.None - ? new DriverData.EcoRollData { - UnderspeedThreshold = DeclarationData.Driver.EcoRoll.UnderspeedThreshold, - MinSpeed = DeclarationData.Driver.EcoRoll.MinSpeed, - ActivationPhaseDuration = DeclarationData.Driver.EcoRoll.ActivationDelay, - AccelerationLowerLimit = DeclarationData.Driver.EcoRoll.AccelerationLowerLimit, - AccelerationUpperLimit = DeclarationData.Driver.EcoRoll.AccelerationUpperLimit - } - : null, - PCC = primaryVehicle.ADAS.PredictiveCruiseControl != PredictiveCruiseControlType.None - ? new DriverData.PCCData { - PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed, - MinSpeed = DeclarationData.Driver.PCC.MinSpeed, - PreviewDistanceUseCase1 = DeclarationData.Driver.PCC.PreviewDistanceUseCase1, - PreviewDistanceUseCase2 = DeclarationData.Driver.PCC.PreviewDistanceUseCase2, - UnderSpeed = DeclarationData.Driver.PCC.Underspeed, - OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3 - } - : null - }; - - return driver; - } - - - public override VehicleData CreateVehicleData(IVehicleDeclarationInputData pifVehicle, Mission mission, KeyValuePair<LoadingType, Kilogram> loading) + public VehicleData CreateVehicleData(IVehicleDeclarationInputData pifVehicle, Mission mission, + KeyValuePair<LoadingType, Kilogram> loading, Meter dynamicTyreRadius) { var vehicleData = new VehicleData { AxleData = GetAxles(pifVehicle.Components.AxleWheels.AxlesDeclaration, mission.AxleWeightDistribution), - DynamicTyreRadius = GetDynamicTyreRadius(pifVehicle.Components.AxleWheels.AxlesDeclaration), + DynamicTyreRadius = dynamicTyreRadius, AxleConfiguration = pifVehicle.AxleConfiguration, CurbMass = mission.CurbMass, BodyAndTrailerMass = 0.SI<Kilogram>(), @@ -122,23 +71,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return axles; } - private Meter GetDynamicTyreRadius(IList<IAxleDeclarationInputData> axleWheels) - { - Meter dynamicTyreRadius = null; - - for (int i = 0; i < axleWheels.Count; i++) - { - if (axleWheels[i].AxleType == AxleType.VehicleDriven) - { - dynamicTyreRadius = DeclarationData.Wheels.Lookup(axleWheels[i].Tyre.Dimension.RemoveWhitespace()).DynamicTyreRadius; - break; - } - } - - return dynamicTyreRadius; - } - - public ElectricsUserInputsConfig CreateElectricalUserInputsConfig(IVehicleDeclarationInputData primaryVehicle, IAlternatorMap alternatorMap, Mission mission) { diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 6db127ed4e183f3d0dccfca09d0aee692b494305..46cc7d7187a5cbb01575aa6a6e9e7abfdf36e70c 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -317,7 +317,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } for (uint i = 0; i < gearbox.Gears.Count; i++) { var gear = gearbox.Gears[(int)i]; - var lossMap = CreateGearLossMap(gear, i, true); + var lossMap = CreateGearLossMap(gear, i, true, VehicleCategory.Unknown); var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing ? ShiftPolygonReader.Create(gear.ShiftPolygon) diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs index b5a47867af9768e0dc99333645f94e4071dce35b..e0e67622880b230d47728b869d480480b19c3151 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs @@ -20,57 +20,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { public class DeclarationDataAdapterCompletedBus { - public DriverData CreateDriverData(Segment segment) - { - var lookAheadData = new DriverData.LACData - { - Enabled = DeclarationData.Driver.LookAhead.Enabled, - //Deceleration = DeclarationData.Driver.LookAhead.Deceleration, - MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed, - LookAheadDecisionFactor = new LACDecisionFactor(), - LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor - }; - - var overspeedData = new DriverData.OverSpeedData - { - Enabled = true, - MinSpeed = DeclarationData.Driver.OverSpeed.MinSpeed, - OverSpeed = DeclarationData.Driver.OverSpeed.AllowedOverSpeed, - }; - - var driver = new DriverData - { - AccelerationCurve = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile), - LookAheadCoasting = lookAheadData, - OverSpeed = overspeedData, - EngineStopStart = new DriverData.EngineStopStartData - { - EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay, - MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan, - UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor - }, - EcoRoll = new DriverData.EcoRollData - { - UnderspeedThreshold = DeclarationData.Driver.EcoRoll.UnderspeedThreshold, - MinSpeed = DeclarationData.Driver.EcoRoll.MinSpeed, - ActivationPhaseDuration = DeclarationData.Driver.EcoRoll.ActivationDelay, - AccelerationLowerLimit = DeclarationData.Driver.EcoRoll.AccelerationLowerLimit, - AccelerationUpperLimit = DeclarationData.Driver.EcoRoll.AccelerationUpperLimit - }, - PCC = new DriverData.PCCData - { - PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed, - MinSpeed = DeclarationData.Driver.PCC.MinSpeed, - PreviewDistanceUseCase1 = DeclarationData.Driver.PCC.PreviewDistanceUseCase1, - PreviewDistanceUseCase2 = DeclarationData.Driver.PCC.PreviewDistanceUseCase2, - UnderSpeed = DeclarationData.Driver.PCC.Underspeed, - OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3 - } - }; - - - return driver; - } public AirdragData CreateAirdragData(IVehicleDeclarationInputData completedVehicle, Mission mission) { @@ -101,7 +50,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } public VehicleData CreateVehicleData(IVehicleDeclarationInputData pifVehicle, - IVehicleDeclarationInputData completedVehicle, Mission mission, KeyValuePair<LoadingType, Kilogram> loading) + IVehicleDeclarationInputData completedVehicle, Mission mission, + KeyValuePair<LoadingType, Kilogram> loading, Meter dynamicTyreRadius) { var vehicleData = new VehicleData { @@ -110,7 +60,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl BodyAndTrailerMass = 0.SI<Kilogram>(), Loading = GetLoading(completedVehicle, mission, loading), GrossVehicleMass = completedVehicle.GrossVehicleMassRating, - DynamicTyreRadius = GetDynamicTyreRadius(pifVehicle.Components.AxleWheels.AxlesDeclaration), + DynamicTyreRadius = dynamicTyreRadius, AxleData = GetAxles(pifVehicle.Components.AxleWheels.AxlesDeclaration, mission.AxleWeightDistribution) }; @@ -392,23 +342,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl return axles; } - - private Meter GetDynamicTyreRadius(IList<IAxleDeclarationInputData> axleWheels) - { - Meter dynamicTyreRadius = null; - - for (int i = 0; i < axleWheels.Count; i++) - { - if (axleWheels[i].AxleType == AxleType.VehicleDriven) - { - dynamicTyreRadius = DeclarationData.Wheels.Lookup(axleWheels[i].Tyre.Dimension.RemoveWhitespace()).DynamicTyreRadius; - break; - } - } - - return dynamicTyreRadius; - } - + private Kilogram GetLoading(IVehicleDeclarationInputData completedVehicle, Mission mission, KeyValuePair<LoadingType, Kilogram> loading) { var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(completedVehicle.Length, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs index 02a9d675cf5d79d313ddb73b75a83cf7bf0010bd..37fa283c37e34443594ff5ebeffd410402c12bc4 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs @@ -36,6 +36,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl protected Segment _segment; + protected DriverData _driverdata; protected AirdragData _airdragData; protected AxleGearData _axlegearData; @@ -52,6 +53,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl //protected Exception InitException; protected ShiftStrategyParameters _gearshiftData; + private VehicleData _tmpVehicleData; + private DriverData _driverData; + protected IDeclarationDataAdapter DataAdapter { get; } @@ -130,16 +134,26 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl //_municipalPtoTransmissionData = null; + _tmpVehicleData = new VehicleData { + DynamicTyreRadius = DeclarationData.FactorMethodBus.GetDynamicTyreRadius(primaryVehicle), + VehicleCategory = VehicleCategory.GenericBusVehicle + }; + _combustionEngineData = DeclarationData.FactorMethodBus.CreateBusEngineData(primaryVehicle); _axlegearData = DeclarationData.FactorMethodBus.CreateAxlegearData(primaryVehicle.Components.AxleGearInputData); - _angledriveData = - DeclarationData.FactorMethodBus.CreateAngledriveData(primaryVehicle.Components.AngledriveInputData); + + _angledriveData = DeclarationData.FactorMethodBus.CreateAngledriveData( + primaryVehicle.Components.AngledriveInputData, + primaryVehicle.Components.AxleGearInputData.Ratio); - _gearboxData = DeclarationData.FactorMethodBus.CreateGearboxData(primaryVehicle, new VectoRunData() { EngineData = _combustionEngineData, AxleGearData = _axlegearData, VehicleData = }, + + _gearboxData = DeclarationData.FactorMethodBus.CreateGearboxData(primaryVehicle, + new VectoRunData() { EngineData = _combustionEngineData, AxleGearData = _axlegearData, VehicleData = _tmpVehicleData }, null); + _gearshiftData = DataAdapterPrimary.CreateGearshiftData( _gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), _combustionEngineData.IdleSpeed); @@ -158,7 +172,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl _retarderData = DeclarationData.FactorMethodBus.CreateRetarderData(primaryVehicle.Components.RetarderInputData); - + + _driverData = new GenericBusDriverData().CreateGenericBusDriverData(_segment); } protected virtual IEnumerable<VectoRunData> GetNextRun() @@ -275,15 +290,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl // mission, InputDataProvider.JobInputData.Vehicle, simulationRunData); //return simulationRunData; - - // TODO MQ completedSegment == _segment? - var completedSegment = GetCompletedSegment(completedVehicle, primaryVehicle.AxleConfiguration); var primaryBusAuxiliaries = primaryVehicle.Components.BusAuxiliaries; var simulationRunData = new VectoRunData { Loading = loading.Key, - VehicleData = DataAdapterCompleted.CreateVehicleData(primaryVehicle, completedVehicle, mission, loading), + VehicleData = DataAdapterCompleted.CreateVehicleData(primaryVehicle, completedVehicle, + mission, loading, _tmpVehicleData.DynamicTyreRadius), AirdragData = DataAdapterCompleted.CreateAirdragData(completedVehicle, mission), EngineData = _combustionEngineData, GearboxData = _gearboxData, @@ -291,7 +304,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl AngledriveData = _angledriveData, GearshiftParameters = _gearshiftData, Aux = DataAdapterPrimary.CreateAuxiliaryData(primaryVehicle.Components.AuxiliaryInputData, - primaryBusAuxiliaries, mission.MissionType, completedSegment.VehicleClass, + primaryBusAuxiliaries, mission.MissionType, _segment.VehicleClass, completedVehicle.Length) }; @@ -310,9 +323,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl simulationRunData.BusAuxiliaries = auxiliaryConfig; simulationRunData.Retarder = _retarderData; - - // todo MQ 20200401: move driver data to initialize method and set member. - simulationRunData.DriverData = DataAdapterCompleted.CreateDriverData(completedSegment); + + simulationRunData.DriverData = _driverData; simulationRunData.Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()); @@ -388,7 +400,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var simulationRunData = new VectoRunData { Loading = loading.Key, - VehicleData = DataAdapterPrimary.CreateVehicleData(primaryVehicle, mission, loading), + VehicleData = DataAdapterPrimary.CreateVehicleData(primaryVehicle, mission, loading, + _tmpVehicleData.DynamicTyreRadius), AirdragData = DataAdapterPrimary.CreateAirdragData(null, mission, new Segment()), EngineData = _combustionEngineData, GearboxData = _gearboxData, @@ -416,8 +429,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl simulationRunData.Retarder = _retarderData; - // todo: use driver data from initialize method - simulationRunData.DriverData = DataAdapterPrimary.CreateDriverData(primarySegment, primaryVehicle); + simulationRunData.DriverData = _driverData; simulationRunData.Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()); diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index a63f95eb5a57acd5abfc88a6c95ca809b09e020d..59f3421862c0586cd3ee746e5ba4899c35b59604 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -82,6 +82,10 @@ namespace TUGraz.VectoCore.Models.Declaration public static readonly ElectricSystem ElectricSystem = new ElectricSystem(); public static readonly Fan Fan = new Fan(); + public static readonly GenericBusEngineData GenericBusEngineData = new GenericBusEngineData(); + public static readonly GenericBusAxelgearData GenericBusAxelgearData = new GenericBusAxelgearData(); + public static readonly GenericBusAngledriveData GenericBusAngledriveData = new GenericBusAngledriveData(); + public static readonly GenericBusRetarderData GenericBusRetarderData = new GenericBusRetarderData(); public static readonly HeatingVentilationAirConditioning HeatingVentilationAirConditioning = new HeatingVentilationAirConditioning(); @@ -146,331 +150,38 @@ namespace TUGraz.VectoCore.Models.Declaration public static class FactorMethodBus { #region Constans - private static string GenericEngineCM_Normed_CI = - $"{DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_CI_Normed.vmap"; - private static string GenericEngineCM_Normed_PI = - $"{DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_PI_Normed.vmap"; - public static string GenericTorqueConvert = $"{DeclarationDataResourcePrefix}.GenericBusData.GenericTorqueConverter.csv"; + #endregion - - + #region Create Engine Data public static CombustionEngineData CreateBusEngineData(IVehicleDeclarationInputData pifVehicle) { - var enginePif = pifVehicle.Components.EngineInputData; - var gearbox = pifVehicle.Components.GearboxInputData; - - var engine = new CombustionEngineData(); - - var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve> - { - [0] = FullLoadCurveReader.Create(enginePif.EngineModes.First().FullLoadCurve, true) - }; - // TODO: MQ 20200401 add full-load curves per gear, limited by max torque (gbx or vehicle) - // see DeclarationDataAdapterHeavyLorry ln 235ff. - - engine.FullLoadCurves = fullLoadCurves; - - engine.IdleSpeed = enginePif.EngineModes[0].IdleSpeed; - engine.Displacement = enginePif.Displacement; - - var fuel = GetCombustionEngineFuelData(enginePif.EngineModes.First().Fuels.First().FuelType, - pifVehicle.DualFuelVehicle); - - - engine.WHRType = WHRType.None; - - engine.Fuels = new List<CombustionEngineFuelData> { fuel }; - - engine.Inertia = Engine.EngineInertia(engine.Displacement, gearbox.Type); - return engine; - } - - - private static CombustionEngineFuelData GetCombustionEngineFuelData(FuelType fuelType, bool isDualFuel) - { - var ressourceId = string.Empty; - - if (isDualFuel) - { - ressourceId = GenericEngineCM_Normed_CI; - } - else - { - switch (fuelType) - { - case FuelType.DieselCI: - case FuelType.EthanolCI: - case FuelType.NGCI: - ressourceId = GenericEngineCM_Normed_CI; - break; - case FuelType.EthanolPI: - case FuelType.LPGPI: - case FuelType.PetrolPI: - case FuelType.NGPI: - ressourceId = GenericEngineCM_Normed_PI; - break; - } - } - //ToDo ConsumptionMap - //var denormalizedData = DenormalizeData(ressourceId); - //var fcMap = FuelConsumptionMapReader.Create(denormalizedData); - - var fuel = new CombustionEngineFuelData - { - WHTCUrban = 1, - WHTCRural = 1, - WHTCMotorway = 1, - ColdHotCorrectionFactor = 1, - CorrectionFactorRegPer = 1, - //ConsumptionMap = fcMap - }; - - return fuel; - - } - - private static DataTable DenormalizeData(string ressourceId) - { - // TODO: use vehicle specific values. n_idle from PIF, nRated calculated from - // full-load curve (fullLoadCurves[0].RatedSpeed), m_rated => max torque (fullLoadCurves[0].MaxTorque) - var nIdle = 600.0; - var nRated = 1800.0; - var mRated = 1750.0; - - var normedData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(ressourceId), source: ressourceId); - - var result = new DataTable(); - result.Columns.Add(FuelConsumptionMapReader.Fields.EngineSpeed); - result.Columns.Add(FuelConsumptionMapReader.Fields.Torque); - result.Columns.Add(FuelConsumptionMapReader.Fields.FuelConsumption); - - foreach (DataRow row in normedData.Rows) - { - var engineSpeed = DenormalizeEngineSpeed((string)row[FuelConsumptionMapReader.Fields.EngineSpeed], - nIdle, nRated); - var torque = DenormalizeTorque((string)row[FuelConsumptionMapReader.Fields.Torque], mRated); - var fc = DenormalizeFC((string)row[FuelConsumptionMapReader.Fields.FuelConsumption], mRated); - - var newRow = result.NewRow(); - newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = engineSpeed; - newRow[FuelConsumptionMapReader.Fields.Torque] = torque; - newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = fc; - result.Rows.Add(newRow); - } - - return result; - } - - private static double DenormalizeFC(string fc, double mRated) - { - return fc.ToDouble() * mRated; - } - - private static double DenormalizeTorque(string torque, double mRated) - { - return torque.ToDouble() * mRated; - } - - private static double DenormalizeEngineSpeed(string engineSpeed, double nIdle, double nRated) - { - return engineSpeed.ToDouble() * (nRated - nIdle) + nIdle; + return GenericBusEngineData.CreateGenericBusEngineData(pifVehicle); } #endregion #region Create Axlegear Data - public static AxleGearData CreateAxlegearData(IAxleGearInputData axlegearData) - { - var axleGear = new AxleGearData - { - LineType = axlegearData.LineType, - InputData = axlegearData - }; - - var outputLossMap = CreateAxlegearOutputLossMap(); - var inputLossMap = CalculateAxleInputLossMap(outputLossMap); - - var transmissionData = new TransmissionData - { - Ratio = axlegearData.Ratio, - LossMap = TransmissionLossMapReader.Create(inputLossMap, axlegearData.Ratio, "Axlegear") - }; - - axleGear.AxleGear = transmissionData; - - return axleGear; - } - - private static DataTable CreateAxlegearOutputLossMap() - { - var lossMap = new DataTable(); - lossMap.Columns.Add("output speed"); - lossMap.Columns.Add("output torque"); - lossMap.Columns.Add("output torque loss"); - - var torques = new [] { - Constants.GenericLossMapSettings.OutputTorqueEnd * -1.0, - Constants.GenericLossMapSettings.OutputTorqueStart *-1.0, - Constants.GenericLossMapSettings.OutputTorqueStart, - Constants.GenericLossMapSettings.OutputTorqueEnd - }; - // TODO: MQ 20200401 I_axl from PIF - var td0 = Constants.GenericLossMapSettings.T0 + - Constants.GenericLossMapSettings.IAxl * - Constants.GenericLossMapSettings.T1; - - var td0_ = td0 * 0.5; - var td150_ = td0 * 0.5; - var td_n = Constants.GenericLossMapSettings.Td_n; - var efficiency = Constants.GenericLossMapSettings.Efficiency; - - var torqueIndex = 0; - - for (int i = 0; i < 12; i++) { - var speed = 0.0; - double calculationSpeed; - double torque; - - if (i % 4 == 0) - torqueIndex = 0; - - if (i < 4) - speed = 0.0; - else if (i >= 4 && i < 8) - speed = Constants.GenericLossMapSettings.OutputSpeedStart; - else if (i >= 8 && i < 12) - speed = Constants.GenericLossMapSettings.OutputSpeedEnd; - - calculationSpeed = speed.Equals(0.0) - ? Constants.GenericLossMapSettings.OutputSpeedStart - : speed; - - torque = torques[torqueIndex++]; - - var newRow = lossMap.NewRow(); - newRow[lossMap.Columns[0]] = speed; - newRow[lossMap.Columns[1]] = torque; - newRow[lossMap.Columns[2]] = - CalculateOutputTorqueLoss(td0_, td150_, td_n, calculationSpeed, torque, efficiency); - - lossMap.Rows.Add(newRow); - } - - return lossMap; - } - - private static double CalculateOutputTorqueLoss(double td0_, double td150_, double td_n, - double outputspeed, double ouputTorque, double efficiency) - { - if (ouputTorque < 0) - ouputTorque = ouputTorque * -1.0; - - return td0_+ td150_ * outputspeed/td_n + ouputTorque/ efficiency - ouputTorque; - } - - private static DataTable CalculateAxleInputLossMap(DataTable outputLossMap) - { - var inputLossMap = new DataTable(); - - inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed); - inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque); - inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss); - - // TODO: MQ 20200401 use axlegear ratio from PIF - var iAxle = Constants.GenericLossMapSettings.IAxl; - - foreach (DataRow row in outputLossMap.Rows) { - var outputSpeed = row[0].ToString().ToDouble(); - var outputTorque = row[1].ToString().ToDouble(); - var outputLoss = row[2].ToString().ToDouble(); - - var newRow = inputLossMap.NewRow(); - newRow[0] = GetInputSpeed(outputSpeed, iAxle); - newRow[1] = GetInputTorque(outputTorque, outputLoss, iAxle); - newRow[2] = GetInputTorqueLoss(outputLoss, iAxle); - inputLossMap.Rows.Add(newRow); - } - - return inputLossMap; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static double GetInputSpeed(double outputSpeed, double iAxle) - { - return outputSpeed * iAxle; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static double GetInputTorque(double outputTorque, double outputLoss, double iAxle) - { - return (outputTorque + outputLoss) / iAxle; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static double GetInputTorqueLoss(double outputLoss, double iAxle) + public static AxleGearData CreateAxlegearData(IAxleGearInputData axlegearData) { - return outputLoss / iAxle; + return GenericBusAxelgearData.CreateGenericBusAxlegearData(axlegearData); } #endregion #region Create Angledrive Data - public static AngledriveData CreateAngledriveData(IAngledriveInputData angledriveInputData) + public static AngledriveData CreateAngledriveData(IAngledriveInputData angledriveInputData, double axleRatio) { - if (angledriveInputData.DataSource.SourceFile == null) - return null; - - var angledriveData = new AngledriveData - { - Type = angledriveInputData.Type, - InputData = angledriveInputData - }; - - var axleGearOutputLossMap = CreateAxlegearOutputLossMap(); - var axleGearInputLossMap = CalculateAxleInputLossMap(axleGearOutputLossMap); - - var transmissionAngleDrive = new TransmissionData - { - Ratio = angledriveInputData.Ratio, - LossMap = GetAngleDriveLossMap(axleGearInputLossMap, angledriveInputData.Ratio) - }; - - - angledriveData.Angledrive = transmissionAngleDrive; - - return angledriveData; - } - - private static TransmissionLossMap GetAngleDriveLossMap(DataTable axleGearInputTable, double ratio) - { - var angleDriveLossMap = new DataTable(); - angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed); - angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque); - angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss); - - var angleDriveFactor = Constants.GenericLossMapSettings.FactorAngleDrive; - foreach (DataRow row in axleGearInputTable.Rows) { - var inputSpeed = row[0].ToString().ToDouble(); - var inputTorque = row[1].ToString().ToDouble(); - var inputTorqueLoss = row[2].ToString().ToDouble() * angleDriveFactor; - - var newRow = angleDriveLossMap.NewRow(); - newRow[0] = inputSpeed; - newRow[1] = inputTorque; - newRow[2] = inputTorqueLoss; - angleDriveLossMap.Rows.Add(newRow); - } - - return TransmissionLossMapReader.Create(angleDriveFactor, ratio, "AngleDrive"); + return GenericBusAngledriveData.CreateGenericBusAngledriveData(angledriveInputData, axleRatio, + GenericBusAxelgearData.AxleGearInputLossMap); } - + #endregion #region Create Gearbox Data @@ -479,16 +190,6 @@ namespace TUGraz.VectoCore.Models.Declaration IShiftPolygonCalculator shiftPolygonCalc) { return DeclarationDataAdapterHeavyLorry.DoCreateGearboxData(pifVehicle, runData, shiftPolygonCalc); - //var gearbox = new GearboxData - //{ - // Inertia = 0.SI<KilogramSquareMeter>(), - // TractionInterruption = - // GearBoxTypeHelper.TractionInterruption(pifVehicle.Components.GearboxInputData.Type), - // Gears = GetGearData(pifVehicle.Components.GearboxInputData, - // pifVehicle.TorqueLimits.ToDictionary(e => e.Gear), fullLoadMaxTorque) - //}; - - //return gearbox; } @@ -521,69 +222,32 @@ namespace TUGraz.VectoCore.Models.Declaration public static RetarderData CreateRetarderData(IRetarderInputData retarderInput) { - if (retarderInput == null) - return null; - - var retarder = new RetarderData - { - Ratio = retarderInput.Ratio, - Type = retarderInput.Type, - LossMap = GenerateGenericLossMap(retarderInput.Ratio) - }; - - return retarder; + return GenericBusRetarderData.CreateGenericBusRetarderData(retarderInput); } - private static RetarderLossMap GenerateGenericLossMap(double stepUpRatio) - { - var factorGeneric = 0.5; - - var retarderSpeeds = new double [] { - 0, 200 , 400, 600, 900, 1200, - 1600, 2000, 2500, 3000, 3500, 4000, - 4500, 5000 - }; + #endregion - var genericRetarderLosses = GetHydrodynamicRetardersLoss(retarderSpeeds, stepUpRatio); - //var genericRetarderLosses = GetMagneticRetarderLoss(retarderSpeeds, stepUpRatio); - - var torqueLoss = new DataTable(); - torqueLoss.Columns.Add(RetarderLossMapReader.Fields.RetarderSpeed); - torqueLoss.Columns.Add(RetarderLossMapReader.Fields.TorqueLoss); - - for (int i = 0; i < genericRetarderLosses.Length; i++) { - var newRow = torqueLoss.NewRow(); - newRow[RetarderLossMapReader.Fields.RetarderSpeed] = retarderSpeeds[i]; - newRow[RetarderLossMapReader.Fields.TorqueLoss] = genericRetarderLosses[i] * factorGeneric; - torqueLoss.Rows.Add(newRow); - } + #region Common Getters - return RetarderLossMapReader.Create(torqueLoss); - } - - private static double[] GetHydrodynamicRetardersLoss(double[] retarderSpeeds, double stepUpRatio) + public static Meter GetDynamicTyreRadius(IVehicleDeclarationInputData primaryVehicle) { - var losses = new double[retarderSpeeds.Length]; + var axleWheels = primaryVehicle.Components.AxleWheels.AxlesDeclaration; + Meter dynamicTyreRadius = null; - for (int i = 0; i < retarderSpeeds.Length; i++) { - losses[i] = 10.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 3) * Math.Pow(retarderSpeeds[i] / 1000.0, 2); + for (int i = 0; i < axleWheels.Count; i++) + { + if (axleWheels[i].AxleType == AxleType.VehicleDriven) + { + dynamicTyreRadius = DeclarationData.Wheels.Lookup(axleWheels[i].Tyre.Dimension.RemoveWhitespace()).DynamicTyreRadius; + break; + } } - return losses; + return dynamicTyreRadius; } - private static double[] GetMagneticRetarderLoss(double[] retarderSpeeds, double stepUpRatio) - { - var losses = new double[retarderSpeeds.Length]; - - for (int i = 0; i < retarderSpeeds.Length; i++) { - losses[i] = 15.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 4) * Math.Pow(retarderSpeeds[i] / 1000.0, 3); - } - - return losses; - } - #endregion + } diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusAngledriveData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusAngledriveData.cs new file mode 100644 index 0000000000000000000000000000000000000000..d92d0ed3ed5a0288e05aeb547cae0e779a682e93 --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/GenericBusAngledriveData.cs @@ -0,0 +1,61 @@ +using System; +using System.Data; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class GenericBusAngledriveData + { + public AngledriveData CreateGenericBusAngledriveData(IAngledriveInputData angledriveInputData, double axleRatio, + DataTable axleGearInputLossMap) + { + if (angledriveInputData.DataSource.SourceFile == null) + return null; + + var angledriveData = new AngledriveData + { + Type = angledriveInputData.Type, + InputData = angledriveInputData + }; + + var transmissionAngleDrive = new TransmissionData + { + Ratio = angledriveInputData.Ratio, + LossMap = GetAngleDriveLossMap(axleGearInputLossMap, angledriveInputData.Ratio) + }; + + angledriveData.Angledrive = transmissionAngleDrive; + + return angledriveData; + } + + private TransmissionLossMap GetAngleDriveLossMap(DataTable axleGearInputTable, double ratio) + { + var angleDriveLossMap = new DataTable(); + angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed); + angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque); + angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss); + + var angleDriveFactor = Constants.GenericLossMapSettings.FactorAngleDrive; + foreach (DataRow row in axleGearInputTable.Rows) + { + var inputSpeed = row[0].ToString().ToDouble(); + var inputTorque = row[1].ToString().ToDouble(); + var inputTorqueLoss = row[2].ToString().ToDouble() * angleDriveFactor; + + var newRow = angleDriveLossMap.NewRow(); + newRow[0] = inputSpeed; + newRow[1] = inputTorque; + newRow[2] = inputTorqueLoss; + angleDriveLossMap.Rows.Add(newRow); + } + + return TransmissionLossMapReader.Create(angleDriveFactor, ratio, "AngleDrive"); + } + } +} diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusAxelgearData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusAxelgearData.cs new file mode 100644 index 0000000000000000000000000000000000000000..d52f7643efe13555466dc45976bd14cd0feab57c --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/GenericBusAxelgearData.cs @@ -0,0 +1,150 @@ +using System; +using System.Data; +using System.Runtime.CompilerServices; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class GenericBusAxelgearData + { + public DataTable AxleGearInputLossMap { get; private set; } + + public AxleGearData CreateGenericBusAxlegearData(IAxleGearInputData axlegearData) + { + var axleGear = new AxleGearData + { + LineType = axlegearData.LineType, + InputData = axlegearData + }; + + var ratio = axlegearData.Ratio; + + var outputLossMap = CreateAxlegearOutputLossMap(ratio); + AxleGearInputLossMap = CalculateAxleInputLossMap(outputLossMap, ratio); + + var transmissionData = new TransmissionData + { + Ratio = axlegearData.Ratio, + LossMap = TransmissionLossMapReader.Create(AxleGearInputLossMap, ratio, "Axlegear") + }; + + axleGear.AxleGear = transmissionData; + + return axleGear; + } + + private DataTable CreateAxlegearOutputLossMap(double axleRatio) + { + var torques = new[] { + Constants.GenericLossMapSettings.OutputTorqueEnd * -1.0, + Constants.GenericLossMapSettings.OutputTorqueStart *-1.0, + Constants.GenericLossMapSettings.OutputTorqueStart, + Constants.GenericLossMapSettings.OutputTorqueEnd + }; + + var outStart = Constants.GenericLossMapSettings.OutputSpeedStart; + var outEnd = Constants.GenericLossMapSettings.OutputSpeedEnd; + + var outputSpeeds = new[] { + 0, 0, 0, 0, + outStart, outStart,outStart, outStart, + outEnd, outEnd, outEnd, outEnd + }; + + var td0 = Constants.GenericLossMapSettings.T0 + + axleRatio * Constants.GenericLossMapSettings.T1; + + var td0_ = td0 * 0.5; + var td150_ = td0 * 0.5; + var td_n = Constants.GenericLossMapSettings.Td_n; + var efficiency = Constants.GenericLossMapSettings.Efficiency; + + var torqueIndex = 0; + + + var lossMap = new DataTable(); + lossMap.Columns.Add("output speed"); + lossMap.Columns.Add("output torque"); + lossMap.Columns.Add("output torque loss"); + + for (int i = 0; i < 12; i++) + { + if (i % 4 == 0) + torqueIndex = 0; + + var calculationSpeed = outputSpeeds[i].IsEqual(0) + ? outputSpeeds[4] + : outputSpeeds[i]; + + var torque = torques[torqueIndex++]; + + var newRow = lossMap.NewRow(); + newRow[lossMap.Columns[0]] = outputSpeeds[i]; + newRow[lossMap.Columns[1]] = torque; + newRow[lossMap.Columns[2]] = + CalculateOutputTorqueLoss(td0_, td150_, td_n, calculationSpeed, torque, efficiency); + + lossMap.Rows.Add(newRow); + + } + + return lossMap; + } + + private double CalculateOutputTorqueLoss(double td0_, double td150_, double td_n, + double outputspeed, double ouputTorque, double efficiency) + { + if (ouputTorque < 0) + ouputTorque = ouputTorque * -1.0; + + return td0_ + td150_ * outputspeed / td_n + ouputTorque / efficiency - ouputTorque; + } + + private DataTable CalculateAxleInputLossMap(DataTable outputLossMap, double axleRatio) + { + var inputLossMap = new DataTable(); + + inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed); + inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque); + inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss); + + foreach (DataRow row in outputLossMap.Rows) + { + var outputSpeed = row[0].ToString().ToDouble(); + var outputTorque = row[1].ToString().ToDouble(); + var outputLoss = row[2].ToString().ToDouble(); + + var newRow = inputLossMap.NewRow(); + newRow[0] = GetInputSpeed(outputSpeed, axleRatio); + newRow[1] = GetInputTorque(outputTorque, outputLoss, axleRatio); + newRow[2] = GetInputTorqueLoss(outputLoss, axleRatio); + inputLossMap.Rows.Add(newRow); + } + + return inputLossMap; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private double GetInputSpeed(double outputSpeed, double iAxle) + { + return outputSpeed * iAxle; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private double GetInputTorque(double outputTorque, double outputLoss, double iAxle) + { + return (outputTorque + outputLoss) / iAxle; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private double GetInputTorqueLoss(double outputLoss, double iAxle) + { + return outputLoss / iAxle; + } + } +} diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusDriverData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusDriverData.cs new file mode 100644 index 0000000000000000000000000000000000000000..000a1939cb32130f266d82a8e3c17932cfa545e9 --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/GenericBusDriverData.cs @@ -0,0 +1,60 @@ +using System; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class GenericBusDriverData + { + public DriverData CreateGenericBusDriverData(Segment completedSegment) + { + var lookAheadData = new DriverData.LACData + { + Enabled = DeclarationData.Driver.LookAhead.Enabled, + //Deceleration = DeclarationData.Driver.LookAhead.Deceleration, + MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed, + LookAheadDecisionFactor = new LACDecisionFactor(), + LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor + }; + + var overspeedData = new DriverData.OverSpeedData + { + Enabled = true, + MinSpeed = DeclarationData.Driver.OverSpeed.MinSpeed, + OverSpeed = DeclarationData.Driver.OverSpeed.AllowedOverSpeed, + }; + + var driver = new DriverData + { + AccelerationCurve = AccelerationCurveReader.ReadFromStream(completedSegment.AccelerationFile), + LookAheadCoasting = lookAheadData, + OverSpeed = overspeedData, + EngineStopStart = new DriverData.EngineStopStartData + { + EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay, + MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan, + UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor + }, + EcoRoll = new DriverData.EcoRollData + { + UnderspeedThreshold = DeclarationData.Driver.EcoRoll.UnderspeedThreshold, + MinSpeed = DeclarationData.Driver.EcoRoll.MinSpeed, + ActivationPhaseDuration = DeclarationData.Driver.EcoRoll.ActivationDelay, + AccelerationLowerLimit = DeclarationData.Driver.EcoRoll.AccelerationLowerLimit, + AccelerationUpperLimit = DeclarationData.Driver.EcoRoll.AccelerationUpperLimit + }, + PCC = new DriverData.PCCData + { + PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed, + MinSpeed = DeclarationData.Driver.PCC.MinSpeed, + PreviewDistanceUseCase1 = DeclarationData.Driver.PCC.PreviewDistanceUseCase1, + PreviewDistanceUseCase2 = DeclarationData.Driver.PCC.PreviewDistanceUseCase2, + UnderSpeed = DeclarationData.Driver.PCC.Underspeed, + OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3 + } + }; + + return driver; + } + } +} diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusEngineData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusEngineData.cs new file mode 100644 index 0000000000000000000000000000000000000000..0508826008ceb6249e11f5d2feeed40f377269e1 --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/GenericBusEngineData.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Runtime.CompilerServices; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class GenericBusEngineData + { + #region Constans + + private static string GenericEngineCM_Normed_CI = + $"{DeclarationData.DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_CI_Normed.vmap"; + + private static string GenericEngineCM_Normed_PI = + $"{DeclarationData.DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_PI_Normed.vmap"; + + #endregion + + public CombustionEngineData CreateGenericBusEngineData(IVehicleDeclarationInputData pifVehicle) + { + var enginePif = pifVehicle.Components.EngineInputData; + var gearbox = pifVehicle.Components.GearboxInputData; + + var engine = new CombustionEngineData(); + + var limits = pifVehicle.TorqueLimits.ToDictionary(e => e.Gear); + var numGears = gearbox.Gears.Count; + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); + fullLoadCurves[0] = FullLoadCurveReader.Create(enginePif.EngineModes.First().FullLoadCurve, true); + fullLoadCurves[0].EngineData = engine; + + foreach (var gear in gearbox.Gears) + { + var maxTorque = VectoMath.Min( + DeclarationDataAdapterHeavyLorry.GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), + DeclarationDataAdapterHeavyLorry.VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque)); + fullLoadCurves[(uint)gear.Gear] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); + } + + engine.FullLoadCurves = fullLoadCurves; + engine.IdleSpeed = enginePif.EngineModes[0].IdleSpeed; + engine.Displacement = enginePif.Displacement; + + var fuel = GetCombustionEngineFuelData(pifVehicle, fullLoadCurves[0]); + + engine.WHRType = WHRType.None; + + engine.Fuels = new List<CombustionEngineFuelData> { fuel }; + + engine.Inertia = DeclarationData.Engine.EngineInertia(engine.Displacement, gearbox.Type); + return engine; + } + + + private string GetEngineRessourceId(IVehicleDeclarationInputData vehiclePif) + { + var fuelType = vehiclePif.Components.EngineInputData.EngineModes.First().Fuels.First().FuelType; + var isDualFuel = vehiclePif.DualFuelVehicle; + + if (isDualFuel) + return GenericEngineCM_Normed_CI; + + switch (fuelType) + { + case FuelType.DieselCI: + case FuelType.EthanolCI: + case FuelType.NGCI: + return GenericEngineCM_Normed_CI; + default: + return GenericEngineCM_Normed_PI; + } + } + + + private CombustionEngineFuelData GetCombustionEngineFuelData(IVehicleDeclarationInputData vehiclePif, + EngineFullLoadCurve fullLoadCurve) + { + var ressourceId = GetEngineRessourceId(vehiclePif); + + var nIdle = vehiclePif.Components.EngineInputData.RatedSpeedDeclared.AsRPM; + var nRated = fullLoadCurve.RatedSpeed.Value(); + var mRated = fullLoadCurve.MaxTorque.Value(); + + var denormalizedData = DenormalizeData(ressourceId, nIdle, nRated, mRated); + + var engineSpeed = denormalizedData.AsEnumerable().Select(r => + r.Field<string>(FuelConsumptionMapReader.Fields.EngineSpeed).ToDouble()).ToArray(); + + var clusterResult = new MeanShiftClustering().FindClusters(engineSpeed, 1); + + for (int i = 0; i < clusterResult.Length; i++) { + var currentTorque = fullLoadCurve.DragLoadStationaryTorque(clusterResult[i].RPMtoRad()).Value(); + SetDragLoadFuelConsumption(denormalizedData, clusterResult[i], currentTorque); + } + + var fcMap = FuelConsumptionMapReader.Create(denormalizedData); + + var fuel = new CombustionEngineFuelData + { + WHTCUrban = 1, + WHTCRural = 1, + WHTCMotorway = 1, + ColdHotCorrectionFactor = 1, + CorrectionFactorRegPer = 1, + ConsumptionMap = fcMap + }; + + return fuel; + } + + private void SetDragLoadFuelConsumption(DataTable currentDataTable, double engineSpeed, double torque) + { + for (int i = 0; i < currentDataTable.Rows.Count; i++) { + var currentRowSpeed = currentDataTable.Rows[i] + [FuelConsumptionMapReader.Fields.EngineSpeed].ToString().ToDouble(); + + if (currentRowSpeed.IsEqual(engineSpeed)) { + var newRow = currentDataTable.NewRow(); + newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = engineSpeed; + newRow[FuelConsumptionMapReader.Fields.Torque] = torque; + newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = 0; + currentDataTable.Rows.InsertAt(newRow, i); + break; + } + } + } + + private DataTable DenormalizeData(string ressourceId, double nIdle, double nRated, double mRated) + { + var normedData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(ressourceId), source: ressourceId); + + var result = new DataTable(); + result.Columns.Add(FuelConsumptionMapReader.Fields.EngineSpeed); + result.Columns.Add(FuelConsumptionMapReader.Fields.Torque); + result.Columns.Add(FuelConsumptionMapReader.Fields.FuelConsumption); + + foreach (DataRow row in normedData.Rows) + { + var engineSpeed = DenormalizeEngineSpeed((string)row[FuelConsumptionMapReader.Fields.EngineSpeed], + nIdle, nRated); + var torque = DenormalizeTorque((string)row[FuelConsumptionMapReader.Fields.Torque], mRated); + var fc = DenormalizeFC((string)row[FuelConsumptionMapReader.Fields.FuelConsumption], mRated); + + var newRow = result.NewRow(); + newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = engineSpeed; + newRow[FuelConsumptionMapReader.Fields.Torque] = torque; + newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = fc; + result.Rows.Add(newRow); + } + + return result; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private double DenormalizeFC(string fc, double mRated) + { + return fc.ToDouble() * mRated; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private double DenormalizeTorque(string torque, double mRated) + { + return torque.ToDouble() * mRated; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private double DenormalizeEngineSpeed(string engineSpeed, double nIdle, double nRated) + { + return engineSpeed.ToDouble() * (nRated - nIdle) + nIdle; + } + + } +} diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusRetarderData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusRetarderData.cs new file mode 100644 index 0000000000000000000000000000000000000000..865975904fa460ae945c5b707c29e313fa8123f5 --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/GenericBusRetarderData.cs @@ -0,0 +1,78 @@ +using System; +using System.Data; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public class GenericBusRetarderData + { + public RetarderData CreateGenericBusRetarderData(IRetarderInputData retarderInput) + { + if (retarderInput == null) + return null; + + var retarder = new RetarderData + { + Ratio = retarderInput.Ratio, + Type = retarderInput.Type, + LossMap = GenerateGenericLossMap(retarderInput.Ratio) + }; + + return retarder; + } + + private RetarderLossMap GenerateGenericLossMap(double stepUpRatio) + { + var retarderSpeeds = new double[] { + 0, 200 , 400, 600, 900, 1200, + 1600, 2000, 2500, 3000, 3500, 4000, + 4500, 5000 + }; + + var genericRetarderLosses = GetHydrodynamicRetardersLoss(retarderSpeeds, stepUpRatio); + //var genericRetarderLosses = GetMagneticRetarderLoss(retarderSpeeds, stepUpRatio); + + var torqueLoss = new DataTable(); + torqueLoss.Columns.Add(RetarderLossMapReader.Fields.RetarderSpeed); + torqueLoss.Columns.Add(RetarderLossMapReader.Fields.TorqueLoss); + + for (int i = 0; i < genericRetarderLosses.Length; i++) + { + var newRow = torqueLoss.NewRow(); + newRow[RetarderLossMapReader.Fields.RetarderSpeed] = retarderSpeeds[i]; + newRow[RetarderLossMapReader.Fields.TorqueLoss] = genericRetarderLosses[i] * + Constants.GenericLossMapSettings.RetarderGenericFactor; + torqueLoss.Rows.Add(newRow); + } + + return RetarderLossMapReader.Create(torqueLoss); + } + + private double[] GetHydrodynamicRetardersLoss(double[] retarderSpeeds, double stepUpRatio) + { + var losses = new double[retarderSpeeds.Length]; + + for (int i = 0; i < retarderSpeeds.Length; i++) + { + losses[i] = 10.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 3) * Math.Pow(retarderSpeeds[i] / 1000.0, 2); + } + + return losses; + } + + private double[] GetMagneticRetarderLoss(double[] retarderSpeeds, double stepUpRatio) + { + var losses = new double[retarderSpeeds.Length]; + + for (int i = 0; i < retarderSpeeds.Length; i++) + { + losses[i] = 15.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 4) * Math.Pow(retarderSpeeds[i] / 1000.0, 3); + } + + return losses; + } + } +} diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 122ebd80b08065037bd66b794c8f70a685621b61..2f8f9f4b9514a7af3b2d06a5e50166fff05b772d 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -320,6 +320,11 @@ <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\HVAC\SSMRun.cs" /> <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\HVAC\SSMTOOL.cs" /> <Compile Include="Models\Declaration\CompletedBusSegments.cs" /> + <Compile Include="Models\Declaration\GenericBusAngledriveData.cs" /> + <Compile Include="Models\Declaration\GenericBusAxelgearData.cs" /> + <Compile Include="Models\Declaration\GenericBusDriverData.cs" /> + <Compile Include="Models\Declaration\GenericBusEngineData.cs" /> + <Compile Include="Models\Declaration\GenericBusRetarderData.cs" /> <Compile Include="Models\Declaration\SSMTechnology.cs" /> <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\M06Impl.cs" /> <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\M07Impl.cs" /> diff --git a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs index 35ff24b1de430bd7bc82ad3ec76e172797cc2202..48465ec2c7e41eb485c0869430ce81d0a0975d2a 100644 --- a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs +++ b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs @@ -275,7 +275,7 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus var genericEngine = relatedRun.VectoRunDataGenericBody.EngineData; var specificEngine = relatedRun.VectoRunDataSpezificBody.EngineData; - Assert.AreEqual(1, genericEngine.FullLoadCurves.Count); + Assert.AreEqual(7, genericEngine.FullLoadCurves.Count); AssertFullLoadAndDragCurve(genericEngine.FullLoadCurves[0].FullLoadEntries); AssertFullLoadAndDragCurve(specificEngine.FullLoadCurves[0].FullLoadEntries); @@ -806,8 +806,13 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus var genericRetarder = relatedRun.VectoRunDataGenericBody.Retarder; var specificRetarder = relatedRun.VectoRunDataSpezificBody.Retarder; - Assert.IsNull(genericRetarder); - Assert.IsNull(specificRetarder); + Assert.AreEqual(1, genericRetarder.Ratio); + Assert.AreEqual( genericRetarder.Ratio, specificRetarder.Ratio); + + Assert.AreEqual(RetarderType.TransmissionOutputRetarder, genericRetarder.Type); + Assert.AreEqual(genericRetarder.Type, specificRetarder.Type); + + Assert.AreEqual(genericRetarder.LossMap, specificRetarder.LossMap); } #endregion @@ -835,17 +840,42 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus Assert.AreEqual(DeclarationData.Driver.OverSpeed.AllowedOverSpeed, genericDriver.OverSpeed.OverSpeed); Assert.AreEqual(genericDriver.OverSpeed, specificDriver.OverSpeed); - Assert.IsNull(genericDriver.EngineStopStart); - Assert.IsNull(genericDriver.EcoRoll); - Assert.IsNull(genericDriver.PCC); + AssertStopStartData(genericDriver.EngineStopStart); + AssertEcoRoll(genericDriver.EcoRoll); + AssertPccData(genericDriver.PCC); - Assert.IsNull(specificDriver.EngineStopStart); - Assert.IsNull(specificDriver.EcoRoll); - Assert.IsNull(specificDriver.PCC); + AssertStopStartData(specificDriver.EngineStopStart); + AssertEcoRoll(specificDriver.EcoRoll); + AssertPccData(specificDriver.PCC); + } + + private void AssertStopStartData(DriverData.EngineStopStartData engineStopStart) + { + Assert.AreEqual(DeclarationData.Driver.EngineStopStart.ActivationDelay, engineStopStart.EngineOffStandStillActivationDelay); + Assert.AreEqual(DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan, engineStopStart.MaxEngineOffTimespan); + Assert.AreEqual(DeclarationData.Driver.EngineStopStart.UtilityFactor, engineStopStart.UtilityFactor); } - - #endregion + private void AssertEcoRoll(DriverData.EcoRollData ecoRoll) + { + Assert.AreEqual(DeclarationData.Driver.EcoRoll.UnderspeedThreshold, ecoRoll.UnderspeedThreshold); + Assert.AreEqual(DeclarationData.Driver.EcoRoll.MinSpeed, ecoRoll.MinSpeed); + Assert.AreEqual(DeclarationData.Driver.EcoRoll.ActivationDelay, ecoRoll.ActivationPhaseDuration); + Assert.AreEqual(DeclarationData.Driver.EcoRoll.AccelerationLowerLimit, ecoRoll.AccelerationLowerLimit); + Assert.AreEqual(DeclarationData.Driver.EcoRoll.AccelerationUpperLimit, ecoRoll.AccelerationUpperLimit); + } + + private void AssertPccData(DriverData.PCCData pccData) + { + Assert.AreEqual(DeclarationData.Driver.PCC.PCCEnableSpeed, pccData.PCCEnableSpeed); + Assert.AreEqual(DeclarationData.Driver.PCC.MinSpeed, pccData.MinSpeed); + Assert.AreEqual(DeclarationData.Driver.PCC.PreviewDistanceUseCase1, pccData.PreviewDistanceUseCase1); + Assert.AreEqual(DeclarationData.Driver.PCC.PreviewDistanceUseCase2, pccData.PreviewDistanceUseCase2); + Assert.AreEqual(DeclarationData.Driver.PCC.Underspeed, pccData.UnderSpeed); + Assert.AreEqual(DeclarationData.Driver.PCC.OverspeedUseCase3, pccData.OverspeedUseCase3); + } + + #endregion private CrosswindCorrectionCdxALookup GetCrosswindCorrection(string crossWindCorrectionParams, SquareMeter aerodynamicDragArea, Meter vehicleHeight) diff --git a/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs b/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs index da65eb60efbe92d2d1c0abf52bf62ac734d601d9..9ad11695f9dd1db55e8d84abf84e023b7214ed0d 100644 --- a/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs @@ -61,9 +61,9 @@ namespace TUGraz.VectoCore.Tests.XML Assert.AreEqual(false, vehicle.Articulated); Assert.AreEqual(25000, vehicle.GrossVehicleMassRating.Value()); Assert.AreEqual(600, vehicle.EngineIdleSpeed.Value()); - Assert.AreEqual("Transmission Output Retarder", ((XMLDeclarationPrimaryVehicleBusDataProviderV01)vehicle).RetarderType.ToXMLFormat()); - Assert.AreEqual(1.000, ((XMLDeclarationPrimaryVehicleBusDataProviderV01)vehicle).RetarderRatio); - Assert.AreEqual("None", ((XMLDeclarationPrimaryVehicleBusDataProviderV01)vehicle).AngledriveType.ToXMLFormat()); + Assert.AreEqual("Transmission Output Retarder", vehicle.Components.RetarderInputData.Type.ToXMLFormat()); + Assert.AreEqual(1.000, vehicle.Components.RetarderInputData.Ratio); + Assert.AreEqual("None", vehicle.Components.AngledriveInputData.Type.ToXMLFormat()); Assert.IsFalse(vehicle.ZeroEmissionVehicle); Assert.IsFalse(vehicle.ADAS.EngineStopStart); @@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Tests.XML TestAngledrive(components.AngledriveInputData); - Assert.IsNull(components.RetarderInputData); + TestRetarderInputData(components.RetarderInputData); TestAxlegear(components.AxleGearInputData); @@ -199,6 +199,14 @@ namespace TUGraz.VectoCore.Tests.XML Assert.That(() => angeldrive.Efficiency, Throws.TypeOf<VectoException>()); } + private void TestRetarderInputData(IRetarderInputData retarder) + { + Assert.IsNotNull(retarder); + Assert.IsNull(retarder.LossMap); + Assert.AreEqual("Transmission Output Retarder", retarder.Type.ToXMLFormat()); + Assert.AreEqual(1.000, retarder.Ratio); + } + private void TestAxlegear(IAxleGearInputData axelGear) { Assert.AreEqual("Generic Gearbox Manufacturer", axelGear.Manufacturer);