diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index 6a1a8f3085a7eed743bcaa40b051d92fe57eafa3..f049130efb609cfcfbbd51b2466652f3d88321ca 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -155,7 +155,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return retVal; } - internal GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data) + internal static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data) { return new GearboxData { InputData = data, @@ -170,8 +170,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; } - protected TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback) + 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) { + return gear.Ratio.IsEqual(1) + ? TransmissionLossMapReader.Create(0.98, gear.Ratio, $"Gear {i + 1}") + : TransmissionLossMapReader.Create(0.96, gear.Ratio, $"Gear {i + 1}"); + } if (gear.LossMap != null) { return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), true); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs index a1eb9c4b278190e08f5b6eccf2db77b5ee354f8b..f80af57120def5d0d3e0d362df92087741a42549 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs @@ -312,11 +312,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, IShiftPolygonCalculator shiftPolygonCalc) { - var gearbox = inputData.Components.GearboxInputData; - - if (!gearbox.SavedInDeclarationMode) { + if (!inputData.Components.GearboxInputData.SavedInDeclarationMode) { WarnDeclarationMode("GearboxData"); } + return DoCreateGearboxData(inputData, runData, shiftPolygonCalc); + } + + public static GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + var gearbox = inputData.Components.GearboxInputData; + var adas = inputData.ADAS; var torqueConverter = inputData.Components.TorqueConverterInputData; @@ -354,9 +360,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var gears = new Dictionary<uint, GearData>(); var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]); + var vehicleCategory = inputData.VehicleCategory; for (uint i = 0; i < gearsInput.Count; i++) { var gear = gearsInput[(int)i]; - var lossMap = CreateGearLossMap(gear, i, false); + var lossMap = CreateGearLossMap(gear, i, false, vehicleCategory); var shiftPolygon = shiftPolygonCalc != null ? shiftPolygonCalc.ComputeDeclarationShiftPolygon( @@ -394,12 +401,25 @@ 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; - retVal.TorqueConverterData = TorqueConverterDataReader.Create( - torqueConverter.TCData, - DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, - ExecutionMode.Declaration, ratio, - DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, - DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + // TODO MQ 20200401 maybe vehiclecategory heavybuscompleted is not correct here. + if (vehicleCategory == VehicleCategory.HeavyBusCompletedVehicle) { + var fileStream = RessourceHelper.ReadStream(DeclarationData.FactorMethodBus.GenericTorqueConvert); + retVal.TorqueConverterData = TorqueConverterDataReader.ReadFromStream(fileStream, + DeclarationData.TorqueConverter.ReferenceRPM, + DeclarationData.TorqueConverter.MaxInputSpeed, + ExecutionMode.Declaration, + ratio, + DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, + DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + } else { + retVal.TorqueConverterData = TorqueConverterDataReader.Create( + torqueConverter.TCData, + DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, + ExecutionMode.Declaration, ratio, + DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, + DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + } + retVal.TorqueConverterData.ModelName = torqueConverter.Model; retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue; retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs index a1f82307dcb36b170472c75c9d1663b8e77b8ec4..b5a47867af9768e0dc99333645f94e4071dce35b 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Linq; using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; @@ -9,22 +7,20 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader.ComponentData; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; -using TUGraz.VectoCore.Models.BusAuxiliaries; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.Impl { public class DeclarationDataAdapterCompletedBus { - public DriverData CreateDriverData(Segment segment, IVehicleDeclarationInputData primaryVehicle) + public DriverData CreateDriverData(Segment segment) { var lookAheadData = new DriverData.LACData { @@ -47,26 +43,21 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl AccelerationCurve = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile), LookAheadCoasting = lookAheadData, OverSpeed = overspeedData, - EngineStopStart = primaryVehicle.ADAS.EngineStopStart - ? new DriverData.EngineStopStartData + 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 + }, + 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 - } - : null, - PCC = primaryVehicle.ADAS.PredictiveCruiseControl != PredictiveCruiseControlType.None - ? new DriverData.PCCData + }, + PCC = new DriverData.PCCData { PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed, MinSpeed = DeclarationData.Driver.PCC.MinSpeed, @@ -75,7 +66,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl UnderSpeed = DeclarationData.Driver.PCC.Underspeed, OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3 } - : null }; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs index 894d410be51bbd6c5f190183e3f043eff2850ce6..02a9d675cf5d79d313ddb73b75a83cf7bf0010bd 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs @@ -137,10 +137,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl _angledriveData = DeclarationData.FactorMethodBus.CreateAngledriveData(primaryVehicle.Components.AngledriveInputData); - _gearboxData = DeclarationData.FactorMethodBus.CreateGearboxData(primaryVehicle, _combustionEngineData.FullLoadCurves[0].MaxTorque); - - var torqueConverterData = DeclarationData.FactorMethodBus.CreateTorqueConverterData(_gearboxData); - _gearboxData.TorqueConverterData = torqueConverterData; + _gearboxData = DeclarationData.FactorMethodBus.CreateGearboxData(primaryVehicle, new VectoRunData() { EngineData = _combustionEngineData, AxleGearData = _axlegearData, VehicleData = }, + null); _gearshiftData = DataAdapterPrimary.CreateGearshiftData( _gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), _combustionEngineData.IdleSpeed); @@ -149,12 +147,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var primaryBusAuxiliaries = primaryVehicle.Components.BusAuxiliaries; _alternatorMap = new SimpleAlternator( - DataAdapterPrimary.CalculateAlternatorEfficiency(primaryBusAuxiliaries.ElectricSupply.Alternators)); + DataAdapterPrimary.CalculateAlternatorEfficiency(primaryBusAuxiliaries.ElectricSupply.Alternators + .Concat(vehicle.Components.BusAuxiliaries.ElectricSupply.Alternators).ToList())); _compressorMap = DataAdapterPrimary.GetCompressorMap(primaryBusAuxiliaries.PneumaticSupply.CompressorSize, primaryBusAuxiliaries.PneumaticSupply.Clutch); - var retarderType = ((XMLDeclarationPrimaryVehicleBusDataProviderV01)primaryVehicle).RetarderType; + var retarderType = primaryVehicle.Components.RetarderInputData.Type; _consumersDeclarationData = DataAdapterPrimary.CreatePneumaticAuxConfig(retarderType); _retarderData = @@ -276,6 +275,8 @@ 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; @@ -310,7 +311,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl simulationRunData.Retarder = _retarderData; - simulationRunData.DriverData = DataAdapterCompleted.CreateDriverData(completedSegment, primaryVehicle); + // todo MQ 20200401: move driver data to initialize method and set member. + simulationRunData.DriverData = DataAdapterCompleted.CreateDriverData(completedSegment); simulationRunData.Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()); @@ -414,6 +416,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl simulationRunData.Retarder = _retarderData; + // todo: use driver data from initialize method simulationRunData.DriverData = DataAdapterPrimary.CreateDriverData(primarySegment, primaryVehicle); 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 735494f84b56a60f60197968d6032d81106923bb..a63f95eb5a57acd5abfc88a6c95ca809b09e020d 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -34,6 +34,7 @@ using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using Newtonsoft.Json.Linq; using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Exceptions; @@ -47,6 +48,8 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; @@ -149,7 +152,7 @@ namespace TUGraz.VectoCore.Models.Declaration private static string GenericEngineCM_Normed_PI = $"{DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_PI_Normed.vmap"; - private static string GenericTorqueConvert = + public static string GenericTorqueConvert = $"{DeclarationDataResourcePrefix}.GenericBusData.GenericTorqueConverter.csv"; #endregion @@ -167,14 +170,14 @@ namespace TUGraz.VectoCore.Models.Declaration { [0] = FullLoadCurveReader.Create(enginePif.EngineModes.First().FullLoadCurve, true) }; - engine.FullLoadCurves = fullLoadCurves; + // 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; - //engine.Fuels ?!?!? - var fuel = GetCombustionEngineFuelData(enginePif.EngineModes.First().Fuels.First().FuelType, pifVehicle.DualFuelVehicle); @@ -233,6 +236,8 @@ namespace TUGraz.VectoCore.Models.Declaration 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; @@ -315,6 +320,7 @@ namespace TUGraz.VectoCore.Models.Declaration Constants.GenericLossMapSettings.OutputTorqueEnd }; + // TODO: MQ 20200401 I_axl from PIF var td0 = Constants.GenericLossMapSettings.T0 + Constants.GenericLossMapSettings.IAxl * Constants.GenericLossMapSettings.T1; @@ -376,6 +382,7 @@ namespace TUGraz.VectoCore.Models.Declaration 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) { @@ -393,16 +400,19 @@ namespace TUGraz.VectoCore.Models.Declaration 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) { return outputLoss / iAxle; @@ -465,67 +475,23 @@ namespace TUGraz.VectoCore.Models.Declaration #region Create Gearbox Data - public static GearboxData CreateGearboxData(IVehicleDeclarationInputData pifVehicle, NewtonMeter fullLoadMaxTorque) - { - 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; - } - - private static Dictionary<uint, GearData> GetGearData(IGearboxDeclarationInputData gearboxData, - Dictionary<int, ITorqueLimitInputData> torqueLimits, NewtonMeter fullLoadMaxTorque) - { - var gearData = new Dictionary<uint, GearData>(); - var numberOfGears = gearboxData.Gears.Count; - var currentGearNumber = (uint)1; - - foreach (var gear in gearboxData.Gears) - { - var maxTorque = VectoMath.Min( - DeclarationDataAdapterHeavyLorry.GbxMaxTorque(gear, numberOfGears, fullLoadMaxTorque), - DeclarationDataAdapterHeavyLorry.VehMaxTorque(gear, numberOfGears, torqueLimits, fullLoadMaxTorque)); - - var currentGear = new GearData - { - Ratio = gear.Ratio, - LossMap = gear.Ratio.IsEqual(1) - ? TransmissionLossMapReader.Create(0.98, gear.Ratio, $"Gear {currentGearNumber}") - : TransmissionLossMapReader.Create(0.96, gear.Ratio, $"Gear {currentGearNumber}"), - MaxSpeed = gear.MaxInputSpeed, - MaxTorque = maxTorque - }; - - gearData.Add(currentGearNumber, currentGear); - currentGearNumber++; - } - - return gearData; - } - - #endregion - - #region Create Torque Converter Data - - public static TorqueConverterData CreateTorqueConverterData(GearboxData gearboxData) + public static GearboxData CreateGearboxData(IVehicleDeclarationInputData pifVehicle, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) { - var firstRatio = gearboxData.Gears.Values.First().Ratio; - var fileStream = RessourceHelper.ReadStream(GenericTorqueConvert); - - return TorqueConverterDataReader.ReadFromStream(fileStream, - 1000.RPMtoRad(), - TorqueConverter.MaxInputSpeed, - ExecutionMode.Declaration, - gearboxData.Type == GearboxType.ATSerial ? 1 : 1 / firstRatio, - Gearbox.UpshiftMinAcceleration, Gearbox.UpshiftMinAcceleration); + 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; } + #endregion # region SSMInputs Methods