From 5d3326f03b94d8cf1d0d39d2fd2829e1985ba8f2 Mon Sep 17 00:00:00 2001 From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at> Date: Tue, 6 Sep 2022 16:53:04 +0200 Subject: [PATCH] cleaned up files, implemented DataAdapter for Conventional Heavy Lorry --- .../AbstractSimulationDataAdapter.cs | 343 ++------ ...clarationDataAdapterGenericCompletedBus.cs | 7 +- ...clarationDataAdapterCompletedBusGeneric.cs | 9 +- .../DeclarationDataAdapterNinjectModule.cs | 7 +- .../DeclarationDataAdapterSingleBus.cs | 183 ++--- .../EngineeringDataAdapter.cs | 265 ++++++- .../HeavyLorry/Conventional.cs | 748 ------------------ .../DeclarationDataAdapterHeavyLorry.cs | 291 +++++-- .../DeclarationDataAdapterHeavyLorry_old.cs | 104 +++ .../DataObjectAdapter/HeavyLorry/HEV_P1.cs | 10 - .../DataObjectAdapter/HeavyLorry/HEV_P2.cs | 11 - .../DataObjectAdapter/HeavyLorry/HEV_P2_5.cs | 12 - .../DataObjectAdapter/HeavyLorry/HEV_P3.cs | 12 - .../DataObjectAdapter/HeavyLorry/HEV_P4.cs | 12 - .../DataObjectAdapter/HeavyLorry/HEV_S3.cs | 10 - .../DataObjectAdapter/HeavyLorry/HEV_S4.cs | 10 - .../HeavyLorryDeclarationDataAdapter.cd | 2 + .../DataObjectAdapter/HeavyLorry/LorryBase.cs | 94 --- .../DataObjectAdapter/HeavyLorry/PEV_E2.cs | 11 - .../DataObjectAdapter/HeavyLorry/PEV_E3.cs | 11 - .../DataObjectAdapter/HeavyLorry/PEV_E4.cs | 11 - .../HeavyLorry/PEV_E_IEPC.cs | 11 - .../HeavyLorry/SerialHybrid.cs | 26 - .../IDeclarationDataAdapter.cs | 11 +- .../DeclarationDataAdapterPrimaryBus.cs | 135 ++-- .../SimulationComponents/ADASDataAdapter.cs | 24 + .../AirdragDataAdapter.cs | 156 ++++ .../AngledriveDataAdapter.cs | 78 ++ .../AuxiliaryDataAdapter.cs | 565 +++++++++++++ .../AxleGearDataAdapter.cs | 79 ++ .../SimulationComponents/DataAdapterBase.cs | 24 + .../SimulationComponents/EngineDataAdapter.cs | 226 ++++++ .../GearBoxDataAdapter.cs | 383 +++++++++ .../SimulationComponents/PTODataAdapter.cs | 40 + .../RetarderDataAdapter.cs | 88 +++ .../TorqueConverterDataAdapter.cs | 53 ++ .../VehicleDataAdapter.cs | 247 ++++++ .../Reader/VectoRunDataFactoryFactory.cs | 5 +- .../VectoRunDataFactoryNinjectModule.cs | 20 +- .../Electrics/ElectricsUserInputsConfig.cs | 6 +- VectoCore/VectoCore/VectoCore.csproj | 1 - .../RunDataFactoryFactoryTest.cs | 12 +- 42 files changed, 2845 insertions(+), 1508 deletions(-) delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index 126c19ea45..a73feb8bf9 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -48,39 +48,20 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter public abstract class AbstractSimulationDataAdapter : LoggingObject { // ========================= - - internal VehicleData SetCommonVehicleData(IVehicleDeclarationInputData data) - { - var retVal = new VehicleData { - InputData = data, - SavedInDeclarationMode = data.SavedInDeclarationMode, - Manufacturer = data.Manufacturer, - ModelName = data.Model, - Date = data.Date, - //CertificationNumber = data.CertificationNumber, - DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", - VehicleCategory = data.VehicleCategory, - CurbMass = data.CurbMassChassis, - GrossVehicleMass = data.GrossVehicleMassRating, - AirDensity = Physics.AirDensity, - }; - - return retVal; - } - protected VehicleData.ADASData CreateADAS(IAdvancedDriverAssistantSystemDeclarationInputData adas) { - return new VehicleData.ADASData { + return new VehicleData.ADASData + { EngineStopStart = adas.EngineStopStart, EcoRoll = adas.EcoRoll, PredictiveCruiseControl = adas.PredictiveCruiseControl, InputData = adas }; } - internal AirdragData SetCommonAirdragData(IAirdragDeclarationInputData data) { - var retVal = new AirdragData() { + var retVal = new AirdragData() + { SavedInDeclarationMode = data.SavedInDeclarationMode, Manufacturer = data.Manufacturer, ModelName = data.Model, @@ -91,61 +72,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; return retVal; } - - internal RetarderData SetCommonRetarderData(IRetarderInputData retarderInputData, - PowertrainPosition position = PowertrainPosition.HybridPositionNotSet) - { - try { - var retarder = new RetarderData { Type = retarderInputData.Type }; - - switch (retarder.Type) { - case RetarderType.TransmissionInputRetarder: - case RetarderType.TransmissionOutputRetarder: - if (!(position.IsParallelHybrid() || position.IsOneOf(PowertrainPosition.HybridPositionNotSet, PowertrainPosition.BatteryElectricE2))) { - throw new ArgumentException("Transmission retarder is only allowed in powertrains that " + - "contain a gearbox: Conventional, HEV-P, and PEV-E2.", nameof(retarder)); - } - - retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap); - retarder.Ratio = retarderInputData.Ratio; - break; - - case RetarderType.AxlegearInputRetarder: - if (position != PowertrainPosition.BatteryElectricE3) - throw new ArgumentException("AxlegearInputRetarder is only allowed for PEV-E3, HEV-S3, S-IEPC, E-IEPC. ", nameof(retarder)); - retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap); - retarder.Ratio = retarderInputData.Ratio; - break; - - case RetarderType.None: - case RetarderType.LossesIncludedInTransmission: - case RetarderType.EngineRetarder: - retarder.Ratio = 1; - break; - - default: - throw new ArgumentOutOfRangeException(nameof(retarder), retarder.Type, "RetarderType unknown"); - } - - if (retarder.Type.IsDedicatedComponent()) { - retarder.SavedInDeclarationMode = retarderInputData.SavedInDeclarationMode; - retarder.Manufacturer = retarderInputData.Manufacturer; - retarder.ModelName = retarderInputData.Model; - retarder.Date = retarderInputData.Date; - retarder.CertificationMethod = retarderInputData.CertificationMethod; - retarder.CertificationNumber = retarderInputData.CertificationNumber; - retarder.DigestValueInput = retarderInputData.DigestValue != null ? retarderInputData.DigestValue.DigestValue : ""; - } - - return retarder; - } catch (Exception e) { - throw new VectoException("Error while Reading Retarder Data: {0}", e.Message); - } - } - internal CombustionEngineData SetCommonCombustionEngineData(IEngineDeclarationInputData data, TankSystem? tankSystem) { - var retVal = new CombustionEngineData { + var retVal = new CombustionEngineData + { InputData = data, SavedInDeclarationMode = data.SavedInDeclarationMode, Manufacturer = data.Manufacturer, @@ -166,71 +96,36 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; return retVal; } - - internal static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data) - { - return new GearboxData { - InputData = data, - SavedInDeclarationMode = data.SavedInDeclarationMode, - Manufacturer = data.Manufacturer, - ModelName = data.Model, - Date = data.Date, - CertificationMethod = data.CertificationMethod, - CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ? - data.CertificationNumber : "", - DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", - Type = data.Type - }; - } - - protected virtual TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, + protected virtual TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory, GearboxType gearboxType) { - if (gear.LossMap != null) { + if (gear.LossMap != null) + { return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, $"Gear {i + 1}", true); } - if (useEfficiencyFallback) { + if (useEfficiencyFallback) + { return TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, $"Gear {i + 1}"); } throw new InvalidFileFormatException("Gear {0} LossMap missing.", i + 1); } - - protected static void CreateTCSecondGearATSerial(GearData gearData, - ShiftPolygon shiftPolygon) - { - gearData.TorqueConverterRatio = gearData.Ratio; - gearData.TorqueConverterGearLossMap = gearData.LossMap; - gearData.TorqueConverterShiftPolygon = shiftPolygon; - } - - protected static void CreateTCFirstGearATSerial(GearData gearData, - ShiftPolygon shiftPolygon) - { - gearData.TorqueConverterRatio = gearData.Ratio; - gearData.TorqueConverterGearLossMap = gearData.LossMap; - gearData.TorqueConverterShiftPolygon = shiftPolygon; - } - - protected virtual void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon) - { - gearData.TorqueConverterRatio = 1; - gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, $"TCGear {i + 1}"); - gearData.TorqueConverterShiftPolygon = shiftPolygon; - } - - internal TransmissionLossMap ReadAxleLossMap(IAxleGearInputData data, bool useEfficiencyFallback) { TransmissionLossMap axleLossMap; - if (data.LossMap == null && useEfficiencyFallback) { + if (data.LossMap == null && useEfficiencyFallback) + { axleLossMap = TransmissionLossMapReader.Create(data.Efficiency, data.Ratio, "Axlegear"); - } else { - if (data.LossMap == null) { + } + else + { + if (data.LossMap == null) + { throw new InvalidFileFormatException("LossMap for Axlegear is missing."); } axleLossMap = TransmissionLossMapReader.Create(data.LossMap, data.Ratio, "Axlegear", true); } - if (axleLossMap == null) { + if (axleLossMap == null) + { throw new InvalidFileFormatException("LossMap for Axlegear is missing."); } return axleLossMap; @@ -238,7 +133,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter internal AxleGearData SetCommonAxleGearData(IAxleGearInputData data) { - return new AxleGearData { + return new AxleGearData + { InputData = data, SavedInDeclarationMode = data.SavedInDeclarationMode, Manufacturer = data.Manufacturer, @@ -252,56 +148,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; } - /// <summary> - /// Creates an AngledriveData or returns null if there is no anglegear. - /// </summary> - /// <param name="data"></param> - /// <param name="useEfficiencyFallback">if true, the Efficiency value is used if no LossMap is found.</param> - /// <returns></returns> - internal AngledriveData DoCreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback) - { - try { - var type = data?.Type ?? AngledriveType.None; - - switch (type) { - case AngledriveType.LossesIncludedInGearbox: - case AngledriveType.None: - return null; - case AngledriveType.SeparateAngledrive: - var angledriveData = new AngledriveData { - InputData = data, - SavedInDeclarationMode = data.SavedInDeclarationMode, - Manufacturer = data.Manufacturer, - ModelName = data.Model, - Date = data.Date, - CertificationMethod = data.CertificationMethod, - CertificationNumber = data.CertificationNumber, - DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", - Type = type, - Angledrive = new TransmissionData { Ratio = data.Ratio } - }; - try { - angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.LossMap, - data.Ratio, "Angledrive", true); - } catch (VectoException ex) { - Log.Info("Angledrive Loss Map not found."); - if (useEfficiencyFallback) { - Log.Info("Angledrive Trying with Efficiency instead of Loss Map."); - angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.Efficiency, - data.Ratio, "Angledrive"); - } else { - throw new VectoException("Angledrive: LossMap not found.", ex); - } - } - return angledriveData; - default: - throw new ArgumentOutOfRangeException(nameof(data), "Unknown Angledrive Type."); - } - } catch (Exception e) { - throw new VectoException("Error while reading Angledrive data: {0}", e.Message, e); - } - } - internal static ElectricMotorFullLoadCurve IntersectEMFullLoadCurves(ElectricMotorFullLoadCurve fullLoadCurve, ElectricMotorFullLoadCurve maxTorqueCurve) { @@ -310,31 +156,38 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return fullLoadCurve; } - if (maxTorqueCurve.MaxSpeed.IsSmaller(fullLoadCurve.MaxSpeed)) { + if (maxTorqueCurve.MaxSpeed.IsSmaller(fullLoadCurve.MaxSpeed)) + { throw new VectoException("EM Torque limitation has to cover the whole speed range"); } var motorSpeeds = fullLoadCurve.FullLoadEntries.Select(x => x.MotorSpeed) .Concat(maxTorqueCurve.FullLoadEntries.Select(x => x.MotorSpeed)).ToList(); // iterate over all segments in the full-load curve - foreach (var fldTuple in fullLoadCurve.FullLoadEntries.Pairwise()) { + foreach (var fldTuple in fullLoadCurve.FullLoadEntries.Pairwise()) + { // find all grid points of max torque curve within the current segment of fld var maxPtsWithinSegment = maxTorqueCurve.FullLoadEntries.Where(x => x.MotorSpeed.IsGreaterOrEqual(fldTuple.Item1.MotorSpeed) && x.MotorSpeed.IsSmallerOrEqual(fldTuple.Item2.MotorSpeed)).OrderBy(x => x.MotorSpeed).ToList(); - if (maxPtsWithinSegment.Count == 0) { + if (maxPtsWithinSegment.Count == 0) + { // if grid pint is within, take the 'surrounding' segment var segment = maxTorqueCurve.FullLoadEntries.GetSection(x => x.MotorSpeed < fldTuple.Item1.MotorSpeed); maxPtsWithinSegment = new[] { segment.Item1, segment.Item2 }.ToList(); - } else { + } + else + { // add the point just before and just after the current list of points - if (maxPtsWithinSegment.Min(x => x.MotorSpeed).IsGreater(fldTuple.Item1.MotorSpeed)) { + if (maxPtsWithinSegment.Min(x => x.MotorSpeed).IsGreater(fldTuple.Item1.MotorSpeed)) + { maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.Last(x => x.MotorSpeed.IsSmaller(fldTuple.Item1.MotorSpeed))); } - if (maxPtsWithinSegment.Max(x => x.MotorSpeed).IsSmaller(fldTuple.Item2.MotorSpeed)) { + if (maxPtsWithinSegment.Max(x => x.MotorSpeed).IsSmaller(fldTuple.Item2.MotorSpeed)) + { maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.First(x => x.MotorSpeed.IsGreater(fldTuple.Item2.MotorSpeed))); } @@ -347,16 +200,19 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var fldEdgeGenerate = Edge.Create(new Point(fldTuple.Item1.MotorSpeed.Value(), fldTuple.Item1.FullGenerationTorque.Value()), new Point(fldTuple.Item2.MotorSpeed.Value(), fldTuple.Item2.FullGenerationTorque.Value())); - foreach (var maxTuple in maxPtsWithinSegment.Pairwise()) { + foreach (var maxTuple in maxPtsWithinSegment.Pairwise()) + { var maxEdgeDrive = Edge.Create(new Point(maxTuple.Item1.MotorSpeed.Value(), maxTuple.Item1.FullDriveTorque.Value()), new Point(maxTuple.Item2.MotorSpeed.Value(), maxTuple.Item2.FullDriveTorque.Value())); - if (!(maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY).IsEqual(0, 1e-12)) { + if (!(maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY).IsEqual(0, 1e-12)) + { // lines are not parallel var nIntersectDrive = ((fldEdgeDrive.OffsetXY - maxEdgeDrive.OffsetXY) / (maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY)).SI<PerSecond>(); - if (nIntersectDrive.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) { + if (nIntersectDrive.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) + { motorSpeeds.Add(nIntersectDrive); } } @@ -364,14 +220,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var maxEdgeGenerate = Edge.Create(new Point(maxTuple.Item1.MotorSpeed.Value(), maxTuple.Item1.FullGenerationTorque.Value()), new Point(maxTuple.Item2.MotorSpeed.Value(), maxTuple.Item2.FullGenerationTorque.Value())); - if (!((maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY).IsEqual(0, 1e-12))) { + if (!((maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY).IsEqual(0, 1e-12))) + { // lines are not parallel var nIntersectGenerate = ((fldEdgeGenerate.OffsetXY - maxEdgeGenerate.OffsetXY) / (maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY)).SI<PerSecond>(); - if (nIntersectGenerate.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) { + if (nIntersectGenerate.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) + { motorSpeeds.Add(nIntersectGenerate); } } @@ -380,7 +238,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter // create new full-load curve with values closest to zero. return new ElectricMotorFullLoadCurve(motorSpeeds.OrderBy(x => x.Value()).Distinct().Select(x => - new ElectricMotorFullLoadCurve.FullLoadEntry() { + new ElectricMotorFullLoadCurve.FullLoadEntry() + { MotorSpeed = x, FullDriveTorque = VectoMath.Max(fullLoadCurve.FullLoadDriveTorque(x), maxTorqueCurve.FullLoadDriveTorque(x)), @@ -388,11 +247,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter maxTorqueCurve.FullGenerationTorque(x)), }).ToList()); } - - - - - /// <summary> /// Intersects ICE full load curves. /// </summary> @@ -401,33 +255,45 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter /// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns> internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, NewtonMeter maxTorque) { - if (maxTorque == null) { + if (maxTorque == null) + { return engineCurve; } var entries = new List<EngineFullLoadCurve.FullLoadCurveEntry>(); var firstEntry = engineCurve.FullLoadEntries.First(); - if (firstEntry.TorqueFullLoad < maxTorque) { + if (firstEntry.TorqueFullLoad < maxTorque) + { entries.Add(engineCurve.FullLoadEntries.First()); - } else { - entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry { + } + else + { + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { EngineSpeed = firstEntry.EngineSpeed, TorqueFullLoad = maxTorque, TorqueDrag = firstEntry.TorqueDrag }); } - foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create)) { - if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque) { + foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create)) + { + if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque) + { // segment is below maxTorque line -> use directly entries.Add(entry.Item2); - } else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque) { + } + else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque) + { // segment is above maxTorque line -> add limited entry - entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry { + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { EngineSpeed = entry.Item2.EngineSpeed, TorqueFullLoad = maxTorque, TorqueDrag = entry.Item2.TorqueDrag }); - } else { + } + else + { // segment intersects maxTorque line -> add new entry at intersection var edgeFull = Edge.Create( new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueFullLoad.Value()), @@ -436,15 +302,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueDrag.Value()), new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueDrag.Value())); var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; - if (!entries.Any(x => x.EngineSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.EngineSpeed.Value())) { - entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry { + if (!entries.Any(x => x.EngineSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.EngineSpeed.Value())) + { + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { EngineSpeed = intersectionX.SI<PerSecond>(), TorqueFullLoad = maxTorque, TorqueDrag = VectoMath.Interpolate(edgeDrag.P1, edgeDrag.P2, intersectionX).SI<NewtonMeter>() }); - } + } - entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry { + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { EngineSpeed = entry.Item2.EngineSpeed, TorqueFullLoad = entry.Item2.TorqueFullLoad > maxTorque ? maxTorque : entry.Item2.TorqueFullLoad, TorqueDrag = entry.Item2.TorqueDrag @@ -452,70 +321,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } } - var flc = new EngineFullLoadCurve(entries.ToList(), engineCurve.PT1Data) { + var flc = new EngineFullLoadCurve(entries.ToList(), engineCurve.PT1Data) + { EngineData = engineCurve.EngineData, }; return flc; } - - - /// <summary> - /// Intersects max torque curve. - /// </summary> - /// <param name="maxTorqueEntries"></param> - /// <param name="maxTorque"></param> - /// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns> - internal static IList<VehicleMaxPropulsionTorque.FullLoadEntry> IntersectMaxPropulsionTorqueCurve(IList<VehicleMaxPropulsionTorque.FullLoadEntry> maxTorqueEntries, NewtonMeter maxTorque) - { - if (maxTorque == null) { - return maxTorqueEntries; - } - - var entries = new List<VehicleMaxPropulsionTorque.FullLoadEntry>(); - var firstEntry = maxTorqueEntries.First(); - if (firstEntry.FullDriveTorque < maxTorque) { - entries.Add(maxTorqueEntries.First()); - } else { - entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { - MotorSpeed = firstEntry.MotorSpeed, - FullDriveTorque = maxTorque, - }); - } - foreach (var entry in maxTorqueEntries.Pairwise(Tuple.Create)) { - if (entry.Item1.FullDriveTorque <= maxTorque && entry.Item2.FullDriveTorque <= maxTorque) { - // segment is below maxTorque line -> use directly - entries.Add(entry.Item2); - } else if (entry.Item1.FullDriveTorque > maxTorque && entry.Item2.FullDriveTorque > maxTorque) { - // segment is above maxTorque line -> add limited entry - entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { - MotorSpeed = entry.Item2.MotorSpeed, - FullDriveTorque = maxTorque, - }); - } else { - // segment intersects maxTorque line -> add new entry at intersection - var edgeFull = Edge.Create( - new Point(entry.Item1.MotorSpeed.Value(), entry.Item1.FullDriveTorque.Value()), - new Point(entry.Item2.MotorSpeed.Value(), entry.Item2.FullDriveTorque.Value())); - - var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; - if (!entries.Any(x => x.MotorSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.MotorSpeed.Value())) { - entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { - MotorSpeed = intersectionX.SI<PerSecond>(), - FullDriveTorque = maxTorque, - }); - } - - entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { - MotorSpeed = entry.Item2.MotorSpeed, - FullDriveTorque = entry.Item2.FullDriveTorque > maxTorque ? maxTorque : entry.Item2.FullDriveTorque, - - }); - } - } - - - return entries; - } } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs index 5a0d690937..fd8b7eb012 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs @@ -15,6 +15,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener { public abstract class CompletedBusBase : IGenericCompletedBusDataAdapter { + private readonly IRetarderDataAdapter _retarderDataAdapter = new GenericRetarderDataAdapter(); #region Implementation of IDeclarationDataAdapter private readonly IDriverDataAdapter _driverDataAdapter = new CompletedBusGenericDriverDataAdapter(); @@ -62,9 +63,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener } public RetarderData CreateRetarderData(IRetarderInputData retarderData) - { - throw new NotImplementedException(); - } + { + return _retarderDataAdapter.CreateRetarderData(retarderData); + } public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) { diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs index 9610bd77c5..6968df3069 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs @@ -58,18 +58,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter #region Overrides of DeclarationDataAdapterHeavyLorry - public override AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) + public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) { return _genericPowertrainData.CreateGenericBusAxlegearData(axlegearData); } - public override AngledriveData CreateAngledriveData(IAngledriveInputData data) + public AngledriveData CreateAngledriveData(IAngledriveInputData data) { return _genericPowertrainData.CreateGenericBusAngledriveData(data); } - public override RetarderData CreateRetarderData(IRetarderInputData retarder) + public RetarderData CreateRetarderData(IRetarderInputData retarder) { return _genericRetarderData.CreateGenericBusRetarderData(retarder); } @@ -87,7 +87,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter gear.Ratio.IsEqual(1) ? GearEfficiencyDirectGear : GearEfficiencyIndirectGear, gear.Ratio, $"Gear {i + 1}"); } - protected override void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon) + protected void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon) { gearData.TorqueConverterRatio = 1; //gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(GearEfficiencyIndirectGear, 1, string.Format("TCGear {0}", i + 1)); @@ -102,6 +102,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter protected override TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType, ITorqueConverterDeclarationInputData torqueConverter, double ratio, CombustionEngineData engineData) { + if (torqueConverter != null && torqueConverter.TCData != null) { return TorqueConverterDataReader.Create( torqueConverter.TCData, diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs index a82f81a1fb..b385e7f827 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs @@ -1,7 +1,6 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Generic; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Specific; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; -using TUGraz.VectoCore.InputData.Reader.Impl; using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRunDataFactory; using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDataFactory; using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFactory; @@ -56,6 +55,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Bind<IDeclarationDataAdapter>().To<HeavyLorry.DeclarationDataAdapterHeavyLorry.PEV_E_IEPC>() .WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.PEV_E_IEPC>(); + + Bind<IDeclarationDataAdapter>().To<HeavyLorry.DeclarationDataAdapterHeavyLorry.Exempted>() + .WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.Exempted>(); #endregion HeavyLorry #region PrimaryBus @@ -102,6 +104,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Bind<IDeclarationDataAdapter>().To<DeclarationDataAdapterPrimaryBus.PEV_E_IEPC>() .WhenInjectedExactlyInto<DeclarationModePrimaryBusRunDataFactory.PEV_E_IEPC>(); + Bind<IDeclarationDataAdapter>().To<DeclarationDataAdapterPrimaryBus.Exempted>() + .WhenInjectedExactlyInto<DeclarationModePrimaryBusRunDataFactory.Exempted>(); + #endregion #region CompletedBus Generic diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs index 5fd0766f12..cfa10bb5d2 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs @@ -25,97 +25,98 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter { #region Implementation of IDeclarationDataAdapter - public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) - { - var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea( - CompletedVehicle.Length, - CompletedVehicle.Width); - var passengerCountRef = busFloorArea * (loading.Key == LoadingType.LowLoading - ? mission.BusParameter.PassengerDensityLow - : mission.BusParameter.PassengerDensityRef); - var passengerCountDecl = CompletedVehicle.NumberPassengerSeatsUpperDeck + - CompletedVehicle.NumberPassengerSeatsLowerDeck - + (mission.MissionType == MissionType.Coach - ? 0 - : CompletedVehicle.NumberPassengersStandingLowerDeck + - CompletedVehicle.NumberPassengersStandingUpperDeck); - - //var refLoad = passengerCount * mission.MissionType.GetAveragePassengerMass(); - if (loading.Key != LoadingType.ReferenceLoad && loading.Key != LoadingType.LowLoading) { - throw new VectoException("Unhandled loading type: {0}", loading.Key); - } - - var passengerCountCalc = loading.Key == LoadingType.ReferenceLoad - ? VectoMath.Min(passengerCountRef, (int)passengerCountDecl) - : passengerCountRef * mission.MissionType.GetLowLoadFactorBus(); - var payload = passengerCountCalc * mission.MissionType.GetAveragePassengerMass(); - - var retVal = CreateNonExemptedVehicleData(vehicle, segment, mission, payload, passengerCountCalc, allowVocational); - retVal.CurbMass = CompletedVehicle.CurbMassChassis; - return retVal; - } + //public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) + //{ + // var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea( + // CompletedVehicle.Length, + // CompletedVehicle.Width); + // var passengerCountRef = busFloorArea * (loading.Key == LoadingType.LowLoading + // ? mission.BusParameter.PassengerDensityLow + // : mission.BusParameter.PassengerDensityRef); + // var passengerCountDecl = CompletedVehicle.NumberPassengerSeatsUpperDeck + + // CompletedVehicle.NumberPassengerSeatsLowerDeck + // + (mission.MissionType == MissionType.Coach + // ? 0 + // : CompletedVehicle.NumberPassengersStandingLowerDeck + + // CompletedVehicle.NumberPassengersStandingUpperDeck); + + // //var refLoad = passengerCount * mission.MissionType.GetAveragePassengerMass(); + // if (loading.Key != LoadingType.ReferenceLoad && loading.Key != LoadingType.LowLoading) { + // throw new VectoException("Unhandled loading type: {0}", loading.Key); + // } + + // var passengerCountCalc = loading.Key == LoadingType.ReferenceLoad + // ? VectoMath.Min(passengerCountRef, (int)passengerCountDecl) + // : passengerCountRef * mission.MissionType.GetLowLoadFactorBus(); + // var payload = passengerCountCalc * mission.MissionType.GetAveragePassengerMass(); + + // var retVal = CreateNonExemptedVehicleData(vehicle, segment, mission, payload, passengerCountCalc, allowVocational); + // retVal.CurbMass = CompletedVehicle.CurbMassChassis; + // return retVal; + //} #endregion - public override CombustionEngineData CreateEngineData( - IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) - { - var engine = vehicle.Components.EngineInputData; - var gearbox = vehicle.Components.GearboxInputData; - - if (!engine.SavedInDeclarationMode) { - WarnDeclarationMode("EngineData"); - } - - var retVal = SetCommonCombustionEngineData(engine, SingleBusInputData.CompletedVehicle.TankSystem); - retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed); - - retVal.Fuels = new List<CombustionEngineFuelData>(); - foreach (var fuel in mode.Fuels) { - retVal.Fuels.Add( - new CombustionEngineFuelData() { - WHTCUrban = fuel.WHTCUrban, - WHTCRural = fuel.WHTCRural, - WHTCMotorway = fuel.WHTCMotorway, - ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor, - CorrectionFactorRegPer = fuel.CorrectionFactorRegPer, - FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, SingleBusInputData.CompletedVehicle.TankSystem), - ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap), - FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( - mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban, - fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer, - }); - } - - retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type); - retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime; - var limits = vehicle.TorqueLimits.ToDictionary(e => e.Gear); - var numGears = gearbox.Gears.Count; - var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); - fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true); - fullLoadCurves[0].EngineData = retVal; - foreach (var gear in gearbox.Gears) { - var maxTorque = VectoMath.Min( - GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), - VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque)); - fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); - } - - retVal.FullLoadCurves = fullLoadCurves; - - retVal.WHRType = engine.WHRType; - if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) { - retVal.ElectricalWHR = CreateWHRData( - mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput); - } - if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) { - retVal.MechanicalWHR = CreateWHRData( - mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain); - } - - return retVal; - } + //public override CombustionEngineData CreateEngineData( + // IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) + //{ + // throw new NotImplementedException(); + // var engine = vehicle.Components.EngineInputData; + // var gearbox = vehicle.Components.GearboxInputData; + + // if (!engine.SavedInDeclarationMode) { + // WarnDeclarationMode("EngineData"); + // } + + // var retVal = SetCommonCombustionEngineData(engine, SingleBusInputData.CompletedVehicle.TankSystem); + // retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed); + + // retVal.Fuels = new List<CombustionEngineFuelData>(); + // foreach (var fuel in mode.Fuels) { + // retVal.Fuels.Add( + // new CombustionEngineFuelData() { + // WHTCUrban = fuel.WHTCUrban, + // WHTCRural = fuel.WHTCRural, + // WHTCMotorway = fuel.WHTCMotorway, + // ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor, + // CorrectionFactorRegPer = fuel.CorrectionFactorRegPer, + // FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, SingleBusInputData.CompletedVehicle.TankSystem), + // ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap), + // FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( + // mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban, + // fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer, + // }); + // } + + // retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type); + // retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime; + // var limits = vehicle.TorqueLimits.ToDictionary(e => e.Gear); + // var numGears = gearbox.Gears.Count; + // var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); + // fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true); + // fullLoadCurves[0].EngineData = retVal; + // foreach (var gear in gearbox.Gears) { + // var maxTorque = VectoMath.Min( + // GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), + // VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque)); + // fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); + // } + + // retVal.FullLoadCurves = fullLoadCurves; + + // retVal.WHRType = engine.WHRType; + // if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) { + // retVal.ElectricalWHR = CreateWHRData( + // mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput); + // } + // if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) { + // retVal.MechanicalWHR = CreateWHRData( + // mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain); + // } + + // return retVal; + //} protected override TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory, GearboxType gearboxType) { @@ -144,10 +145,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter #region Overrides of DeclarationDataAdapterCompletedBusGeneric - public override RetarderData CreateRetarderData(IRetarderInputData retarder) - { - return SetCommonRetarderData(retarder); - } + //public override RetarderData CreateRetarderData(IRetarderInputData retarder) + //{ + // return SetCommonRetarderData(retarder); + //} #endregion diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 6f6e5df2d2..9248c30bfc 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -42,6 +42,7 @@ using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.Impl; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; using TUGraz.VectoCore.InputData.Reader.ShiftStrategy; using TUGraz.VectoCore.Models.BusAuxiliaries; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; @@ -62,6 +63,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter { public class EngineeringDataAdapter : AbstractSimulationDataAdapter { + private AirdragDataAdapter _airdragDataAdapter = new AirdragDataAdapter(); internal VehicleData CreateVehicleData(IVehicleEngineeringInputData data) { if (data.SavedInDeclarationMode) { @@ -146,7 +148,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter : 4.SI<Meter>()); retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup( airDragArea, - HeavyLorry.DeclarationDataAdapterHeavyLorry.Conventional.GetDeclarationAirResistanceCurve( + _airdragDataAdapter.GetDeclarationAirResistanceCurve( GetAirdragParameterSet( data.VehicleCategory, data.AxleConfiguration, data.Components.AxleWheels.AxlesEngineering.Count, data.GrossVehicleMassRating), airDragArea, height), @@ -709,24 +711,24 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter - private Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(IBusAuxElectricSystemEngineeringData busAuxElectricSystem) + private Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetElectricConsumers(IBusAuxElectricSystemEngineeringData busAuxElectricSystem) { - var retVal = new Dictionary<string, ElectricConsumerEntry>(); + var retVal = new Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry>(); var iBase = busAuxElectricSystem.CurrentDemandEngineOffStandstill; var iSP = busAuxElectricSystem.CurrentDemandEngineOffDriving - busAuxElectricSystem.CurrentDemandEngineOffStandstill; var iFan = busAuxElectricSystem.CurrentDemand - busAuxElectricSystem.CurrentDemandEngineOffDriving; - retVal["BaseLoad"] = new ElectricConsumerEntry() { + retVal["BaseLoad"] = new AuxiliaryDataAdapter.ElectricConsumerEntry() { Current = iBase, BaseVehicle = true }; - retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry() { + retVal[Constants.Auxiliaries.IDs.SteeringPump] = new AuxiliaryDataAdapter.ElectricConsumerEntry() { Current = iSP, ActiveDuringEngineStopStandstill = false, }; - retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry() { + retVal[Constants.Auxiliaries.IDs.Fan] = new AuxiliaryDataAdapter.ElectricConsumerEntry() { Current = iFan, ActiveDuringEngineStopStandstill = false, ActiveDuringEngineStopDriving = false, @@ -1306,6 +1308,257 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return null; } + + internal VehicleData SetCommonVehicleData(IVehicleDeclarationInputData data) + { + var retVal = new VehicleData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + //CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + VehicleCategory = data.VehicleCategory, + CurbMass = data.CurbMassChassis, + GrossVehicleMass = data.GrossVehicleMassRating, + AirDensity = Physics.AirDensity, + }; + + return retVal; + } + + internal RetarderData SetCommonRetarderData(IRetarderInputData retarderInputData, + PowertrainPosition position = PowertrainPosition.HybridPositionNotSet) + { + try + { + var retarder = new RetarderData { Type = retarderInputData.Type }; + + switch (retarder.Type) + { + case RetarderType.TransmissionInputRetarder: + case RetarderType.TransmissionOutputRetarder: + if (!(position.IsParallelHybrid() || position.IsOneOf(PowertrainPosition.HybridPositionNotSet, PowertrainPosition.BatteryElectricE2))) + { + throw new ArgumentException("Transmission retarder is only allowed in powertrains that " + + "contain a gearbox: Conventional, HEV-P, and PEV-E2.", nameof(retarder)); + } + + retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap); + retarder.Ratio = retarderInputData.Ratio; + break; + + case RetarderType.AxlegearInputRetarder: + if (position != PowertrainPosition.BatteryElectricE3) + throw new ArgumentException("AxlegearInputRetarder is only allowed for PEV-E3, HEV-S3, S-IEPC, E-IEPC. ", nameof(retarder)); + retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap); + retarder.Ratio = retarderInputData.Ratio; + break; + + case RetarderType.None: + case RetarderType.LossesIncludedInTransmission: + case RetarderType.EngineRetarder: + retarder.Ratio = 1; + break; + + default: + throw new ArgumentOutOfRangeException(nameof(retarder), retarder.Type, "RetarderType unknown"); + } + + if (retarder.Type.IsDedicatedComponent()) + { + retarder.SavedInDeclarationMode = retarderInputData.SavedInDeclarationMode; + retarder.Manufacturer = retarderInputData.Manufacturer; + retarder.ModelName = retarderInputData.Model; + retarder.Date = retarderInputData.Date; + retarder.CertificationMethod = retarderInputData.CertificationMethod; + retarder.CertificationNumber = retarderInputData.CertificationNumber; + retarder.DigestValueInput = retarderInputData.DigestValue != null ? retarderInputData.DigestValue.DigestValue : ""; + } + + return retarder; + } + catch (Exception e) + { + throw new VectoException("Error while Reading Retarder Data: {0}", e.Message); + } + } + + internal static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data) + { + return new GearboxData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + CertificationMethod = data.CertificationMethod, + CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ? + data.CertificationNumber : "", + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + Type = data.Type + }; + } + + protected static void CreateTCSecondGearATSerial(GearData gearData, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = gearData.Ratio; + gearData.TorqueConverterGearLossMap = gearData.LossMap; + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + protected static void CreateTCFirstGearATSerial(GearData gearData, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = gearData.Ratio; + gearData.TorqueConverterGearLossMap = gearData.LossMap; + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + protected virtual void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = 1; + gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, $"TCGear {i + 1}"); + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + /// <summary> + /// Creates an AngledriveData or returns null if there is no anglegear. + /// </summary> + /// <param name="data"></param> + /// <param name="useEfficiencyFallback">if true, the Efficiency value is used if no LossMap is found.</param> + /// <returns></returns> + internal AngledriveData DoCreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback) + { + try + { + var type = data?.Type ?? AngledriveType.None; + + switch (type) + { + case AngledriveType.LossesIncludedInGearbox: + case AngledriveType.None: + return null; + case AngledriveType.SeparateAngledrive: + var angledriveData = new AngledriveData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + CertificationMethod = data.CertificationMethod, + CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + Type = type, + Angledrive = new TransmissionData { Ratio = data.Ratio } + }; + try + { + angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.LossMap, + data.Ratio, "Angledrive", true); + } + catch (VectoException ex) + { + Log.Info("Angledrive Loss Map not found."); + if (useEfficiencyFallback) + { + Log.Info("Angledrive Trying with Efficiency instead of Loss Map."); + angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.Efficiency, + data.Ratio, "Angledrive"); + } + else + { + throw new VectoException("Angledrive: LossMap not found.", ex); + } + } + return angledriveData; + default: + throw new ArgumentOutOfRangeException(nameof(data), "Unknown Angledrive Type."); + } + } + catch (Exception e) + { + throw new VectoException("Error while reading Angledrive data: {0}", e.Message, e); + } + } + + /// <summary> + /// Intersects max torque curve. + /// </summary> + /// <param name="maxTorqueEntries"></param> + /// <param name="maxTorque"></param> + /// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns> + internal static IList<VehicleMaxPropulsionTorque.FullLoadEntry> IntersectMaxPropulsionTorqueCurve(IList<VehicleMaxPropulsionTorque.FullLoadEntry> maxTorqueEntries, NewtonMeter maxTorque) + { + if (maxTorque == null) + { + return maxTorqueEntries; + } + + var entries = new List<VehicleMaxPropulsionTorque.FullLoadEntry>(); + var firstEntry = maxTorqueEntries.First(); + if (firstEntry.FullDriveTorque < maxTorque) + { + entries.Add(maxTorqueEntries.First()); + } + else + { + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry + { + MotorSpeed = firstEntry.MotorSpeed, + FullDriveTorque = maxTorque, + }); + } + foreach (var entry in maxTorqueEntries.Pairwise(Tuple.Create)) + { + if (entry.Item1.FullDriveTorque <= maxTorque && entry.Item2.FullDriveTorque <= maxTorque) + { + // segment is below maxTorque line -> use directly + entries.Add(entry.Item2); + } + else if (entry.Item1.FullDriveTorque > maxTorque && entry.Item2.FullDriveTorque > maxTorque) + { + // segment is above maxTorque line -> add limited entry + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry + { + MotorSpeed = entry.Item2.MotorSpeed, + FullDriveTorque = maxTorque, + }); + } + else + { + // segment intersects maxTorque line -> add new entry at intersection + var edgeFull = Edge.Create( + new Point(entry.Item1.MotorSpeed.Value(), entry.Item1.FullDriveTorque.Value()), + new Point(entry.Item2.MotorSpeed.Value(), entry.Item2.FullDriveTorque.Value())); + + var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; + if (!entries.Any(x => x.MotorSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.MotorSpeed.Value())) + { + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry + { + MotorSpeed = intersectionX.SI<PerSecond>(), + FullDriveTorque = maxTorque, + }); + } + + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry + { + MotorSpeed = entry.Item2.MotorSpeed, + FullDriveTorque = entry.Item2.FullDriveTorque > maxTorque ? maxTorque : entry.Item2.FullDriveTorque, + + }); + } + } + + + return entries; + } } public class IEPCGearboxInputData : IGearboxDeclarationInputData diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs deleted file mode 100644 index 146ca0f720..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs +++ /dev/null @@ -1,748 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.InputData; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Configuration; -using TUGraz.VectoCore.InputData.Reader.ComponentData; -using TUGraz.VectoCore.InputData.Reader.ShiftStrategy; -using TUGraz.VectoCore.Models.Declaration; -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; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class Conventional : LorryBase - { - public static readonly GearboxType[] SupportedGearboxTypes = - { GearboxType.MT, GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial }; - - - public override VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Segment segment, - Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) - { - if (!data.SavedInDeclarationMode) { - WarnDeclarationMode("VehicleData"); - } - - //return data.ExemptedVehicle - // ? CreateExemptedVehicleData(data) - // : CreateNonExemptedVehicleData(data, segment, mission, loading.Value.Item1, loading.Value.Item2, - // allowVocational); - return CreateNonExemptedVehicleData(data, segment, mission, loading.Value.Item1, loading.Value.Item2, allowVocational); - } - - protected virtual VehicleData CreateNonExemptedVehicleData(IVehicleDeclarationInputData data, - Segment segment, Mission mission, Kilogram loading, double? passengerCount, bool allowVocational) - { - var retVal = SetCommonVehicleData(data); - retVal.LegislativeClass = data.LegislativeClass; - 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.VehicleClass = segment.VehicleClass; - retVal.SleeperCab = retVal.VehicleClass.IsMediumLorry() ? false : data.SleeperCab; - retVal.TrailerGrossVehicleMass = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0); - - retVal.BodyAndTrailerMass = - mission.BodyCurbWeight + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); - - retVal.Loading = loading; - retVal.PassengerCount = passengerCount; - retVal.DynamicTyreRadius = - data.Components.AxleWheels.AxlesDeclaration.Where(axle => axle.AxleType == AxleType.VehicleDriven) - .Select(da => DeclarationData.Wheels.Lookup(da.Tyre.Dimension).DynamicTyreRadius) - .Average(); - if (segment.VehicleClass.IsMediumLorry() && segment.VehicleClass.IsVan()) { - retVal.CargoVolume = data.CargoVolume; - } else { - retVal.CargoVolume = mission.MissionType != MissionType.Construction - ? mission.TotalCargoVolume - : 0.SI<CubicMeter>(); - } - - retVal.VocationalVehicle = allowVocational && data.VocationalVehicle; - retVal.ADAS = CreateADAS(data.ADAS); - - var axles = data.Components.AxleWheels.AxlesDeclaration; - if (axles.Count < mission.AxleWeightDistribution.Length) { - throw new VectoException( - "Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required", - axles.Count, mission.AxleWeightDistribution.Length); - } - - var axleData = new List<Axle>(); - for (var i = 0; i < mission.AxleWeightDistribution.Length; i++) { - var axleInput = axles[i]; - var axle = new Axle { - WheelsDimension = axleInput.Tyre.Dimension, - AxleType = axleInput.AxleType, - AxleWeightShare = mission.AxleWeightDistribution[i], - TwinTyres = axleInput.TwinTyres, - RollResistanceCoefficient = axleInput.Tyre.RollResistanceCoefficient, - TyreTestLoad = axleInput.Tyre.TyreTestLoad, - FuelEfficiencyClass = axleInput.Tyre.FuelEfficiencyClass, - Inertia = DeclarationData.Wheels.Lookup(axleInput.Tyre.Dimension.RemoveWhitespace()).Inertia, - CertificationNumber = axleInput.Tyre.CertificationNumber, - DigestValueInput = axleInput.Tyre.DigestValue == null - ? "" - : axleInput.Tyre.DigestValue.DigestValue, - }; - axleData.Add(axle); - } - - 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>(), - FuelEfficiencyClass = DeclarationData.Trailer.FuelEfficiencyClass, - Inertia = trailerWheel.Inertia, - WheelsDimension = trailerWheel.WheelType - })); - } - - retVal.AxleData = axleData; - return retVal; - } - - - protected virtual 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; - } - - - public override CombustionEngineData CreateEngineData( - IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) - { - var engine = vehicle.Components.EngineInputData; - var gearbox = vehicle.Components.GearboxInputData; - - if (!engine.SavedInDeclarationMode) { - WarnDeclarationMode("EngineData"); - } - - var retVal = SetCommonCombustionEngineData(engine, vehicle.TankSystem); - retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed); - - retVal.Fuels = new List<CombustionEngineFuelData>(); - foreach (var fuel in mode.Fuels) { - retVal.Fuels.Add( - new CombustionEngineFuelData() { - WHTCUrban = fuel.WHTCUrban, - WHTCRural = fuel.WHTCRural, - WHTCMotorway = fuel.WHTCMotorway, - ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor, - CorrectionFactorRegPer = fuel.CorrectionFactorRegPer, - FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, vehicle.TankSystem), - ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap), - FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( - mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban, - fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer, - }); - } - - retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type); - retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime; - var limits = vehicle.TorqueLimits?.ToDictionary(e => e.Gear) ?? - new Dictionary<int, ITorqueLimitInputData>(); - var numGears = gearbox.Gears.Count; - var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); - fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true); - fullLoadCurves[0].EngineData = retVal; - foreach (var gear in gearbox.Gears) { - var maxTorque = VectoMath.Min( - GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), - VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque)); - fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); - } - - retVal.FullLoadCurves = fullLoadCurves; - - retVal.WHRType = engine.WHRType; - if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) { - retVal.ElectricalWHR = CreateWHRData( - mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput); - } - - if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) { - retVal.MechanicalWHR = CreateWHRData( - mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain); - } - - return retVal; - } - - protected static WHRData CreateWHRData(IWHRData whrInputData, MissionType missionType, WHRType type) - { - if (whrInputData == null || whrInputData.GeneratedPower == null) { - throw new VectoException("Missing WHR Data"); - } - - var whr = new WHRData() { - CFUrban = whrInputData.UrbanCorrectionFactor, - CFRural = whrInputData.RuralCorrectionFactor, - CFMotorway = whrInputData.MotorwayCorrectionFactor, - CFColdHot = whrInputData.BFColdHot, - CFRegPer = whrInputData.CFRegPer, - WHRMap = WHRPowerReader.Create(whrInputData.GeneratedPower, type) - }; - whr.WHRCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( - missionType.GetNonEMSMissionType(), whr.CFRural, whr.CFUrban, - whr.CFMotorway) * whr.CFColdHot * whr.CFRegPer; - return whr; - } - - protected internal static NewtonMeter VehMaxTorque( - ITransmissionInputData gear, int numGears, - Dictionary<int, ITorqueLimitInputData> limits, - NewtonMeter maxEngineTorque) - { - if (gear.Gear - 1 >= numGears / 2) { - // only upper half of gears can limit if max-torque <= 0.95 of engine max torque - if (limits.TryGetValue(gear.Gear, out var limit) && limit.MaxTorque <= - DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque) { - return limit.MaxTorque; - } - } - - return null; - } - - protected internal static NewtonMeter GbxMaxTorque( - ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque - ) - { - if (gear.Gear - 1 < numGears / 2) { - // gears count from 1 to n, -> n entries, lower half can always limit - if (gear.MaxTorque != null) { - return gear.MaxTorque; - } - } else { - // upper half can only limit if max-torque <= 90% of engine max torque - if (gear.MaxTorque != null && - gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque) { - return gear.MaxTorque; - } - } - - return null; - } - - public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, - IShiftPolygonCalculator shiftPolygonCalc) - { - if (!inputData.Components.GearboxInputData.SavedInDeclarationMode) { - WarnDeclarationMode("GearboxData"); - } - - return DoCreateGearboxData(inputData, runData, shiftPolygonCalc); - } - - public virtual GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, - IShiftPolygonCalculator shiftPolygonCalc) - { - var gearbox = inputData.Components.GearboxInputData; - - var adas = inputData.ADAS; - var torqueConverter = inputData.Components.TorqueConverterInputData; - - var engine = runData.EngineData; - var axlegearRatio = runData.AxleGearData.AxleGear.Ratio; - var dynamicTyreRadius = runData.VehicleData.DynamicTyreRadius; - - var retVal = SetCommonGearboxData(gearbox); - - //if (adas != null && retVal.Type.AutomaticTransmission() && adas.EcoRoll != EcoRollType.None && - // !adas.ATEcoRollReleaseLockupClutch.HasValue) { - // throw new VectoException("Input parameter ATEcoRollReleaseLockupClutch required for AT transmission"); - //} - - retVal.ATEcoRollReleaseLockupClutch = - adas != null && adas.EcoRoll != EcoRollType.None && retVal.Type.AutomaticTransmission() - ? (adas.ATEcoRollReleaseLockupClutch.HasValue ? adas.ATEcoRollReleaseLockupClutch.Value : false) - : false; - - if (!SupportedGearboxTypes.Contains(gearbox.Type)) { - throw new VectoSimulationException("Unsupported gearbox type: {0}!", retVal.Type); - } - - var gearsInput = gearbox.Gears; - if (gearsInput.Count < 1) { - throw new VectoSimulationException( - "At least one Gear-Entry must be defined in Gearbox!"); - } - - SetDeclarationData(retVal); - - var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2 - ? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio - : 1.0; - - var gears = new Dictionary<uint, GearData>(); - var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]); - 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, gearbox.Type); - - var shiftPolygon = shiftPolygonCalc != null - ? shiftPolygonCalc.ComputeDeclarationShiftPolygon( - gearbox.Type, (int)i, engine.FullLoadCurves[i + 1], gearbox.Gears, engine, axlegearRatio, - dynamicTyreRadius) - : DeclarationData.Gearbox.ComputeShiftPolygon( - gearbox.Type, (int)i, engine.FullLoadCurves[i + 1], - gearsInput, engine, - axlegearRatio, dynamicTyreRadius, null); - - var gearData = new GearData { - ShiftPolygon = shiftPolygon, - MaxSpeed = gear.MaxInputSpeed, - MaxTorque = gear.MaxTorque, - Ratio = gear.Ratio, - LossMap = lossMap, - }; - - CreateATGearData(gearbox, i, gearData, tcShiftPolygon, gearDifferenceRatio, gears, - runData.VehicleData.VehicleCategory); - gears.Add(i + 1, gearData); - } - - // remove disabled gears (only the last or last two gears may be removed) - if (inputData.TorqueLimits != null) { - var toRemove = (from tqLimit in inputData.TorqueLimits - where tqLimit.Gear >= gears.Keys.Max() - 1 && tqLimit.MaxTorque.IsEqual(0) - select (uint)tqLimit.Gear).ToList(); - if (toRemove.Count > 0 && toRemove.Min() <= gears.Count - toRemove.Count) { - throw new VectoException( - "Only the last 1 or 2 gears can be disabled. Disabling gear {0} for a {1}-speed gearbox is not allowed.", - toRemove.Min(), gears.Count); - } - - foreach (var entry in toRemove) { - gears.Remove(entry); - } - } - - retVal.Gears = gears; - 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 = - CreateTorqueConverterData(gearbox.Type, torqueConverter, ratio, engine); - - if (torqueConverter != null) { - retVal.TorqueConverterData.Manufacturer = torqueConverter.Manufacturer; - retVal.TorqueConverterData.ModelName = torqueConverter.Model; - retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue; - retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod; - retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber; - retVal.TorqueConverterData.Date = torqueConverter.Date; - retVal.TorqueConverterData.AppVersion = torqueConverter.AppVersion; - } - } - - // update disengageWhenHaltingSpeed - if (retVal.Type.AutomaticTransmission()) { - var firstGear = retVal.GearList.First(x => x.IsLockedGear()); - if (retVal.Gears[firstGear.Gear].ShiftPolygon.Downshift.Any()) { - var downshiftSpeedInc = retVal.Gears[firstGear.Gear].ShiftPolygon - .InterpolateDownshiftSpeed(0.SI<NewtonMeter>()) * 1.05; - var vehicleSpeedDisengage = - downshiftSpeedInc / axlegearRatio / retVal.Gears[firstGear.Gear].Ratio * - dynamicTyreRadius; - retVal.DisengageWhenHaltingSpeed = vehicleSpeedDisengage; - } - } - - return retVal; - } - - protected virtual TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType, - ITorqueConverterDeclarationInputData torqueConverter, double ratio, - CombustionEngineData componentsEngineInputData) - { - return TorqueConverterDataReader.Create( - torqueConverter.TCData, - DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, - ExecutionMode.Declaration, ratio, - DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, - DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); - } - - protected virtual void CreateATGearData( - IGearboxDeclarationInputData gearbox, uint i, GearData gearData, - ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears, - VehicleCategory vehicleCategory) - { - if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) { - // powersplit transmission: torque converter already contains ratio and losses - CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon); - } - - if (gearbox.Type == GearboxType.ATSerial) { - if (i == 0) { - // torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode - CreateTCFirstGearATSerial(gearData, tcShiftPolygon); - } - - if (i == 1 && gearDifferenceRatio >= - DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) { - // ratio between first and second gear is above threshold, torqueconverter is active in second gear as well - // -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear - CreateTCSecondGearATSerial(gearData, tcShiftPolygon); - - // NOTE: the lower gear in 'gears' dictionary has index i !! - gears[i].Ratio = double.NaN; - gears[i].LossMap = null; - } - } - } - - private static void SetDeclarationData(GearboxData retVal) - { - retVal.Inertia = DeclarationData.Gearbox.Inertia; - retVal.TractionInterruption = retVal.Type.TractionInterruption(); - } - - public override AxleGearData CreateAxleGearData(IAxleGearInputData data) - { - var retVal = SetCommonAxleGearData(data); - retVal.AxleGear.LossMap = ReadAxleLossMap(data, false); - return retVal; - } - - public override AngledriveData CreateAngledriveData(IAngledriveInputData data) - { - return DoCreateAngledriveData(data, false); - } - - - public override IList<VectoRunData.AuxData> CreateAuxiliaryData( - IAuxiliariesDeclarationInputData auxInputData, - IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, - Meter vehicleLength, int? numSteeredAxles) - { - if (!auxInputData.SavedInDeclarationMode) { - WarnDeclarationMode("AuxiliariesData"); - } - - var retVal = new List<VectoRunData.AuxData>(); - - if (auxInputData.Auxiliaries.Count != 5) { - Log.Error( - "In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System."); - throw new VectoException( - "In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System."); - } - - foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) { - var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType); - if (auxData == null) { - throw new VectoException("Auxiliary {0} not found.", auxType); - } - - var aux = new VectoRunData.AuxData { - DemandType = AuxiliaryDemandType.Constant, - Technology = auxData.Technology - }; - - mission = mission.GetNonEMSMissionType(); - switch (auxType) { - case AuxiliaryType.Fan: - aux.PowerDemand = DeclarationData.Fan.LookupPowerDemand(hvdClass, mission, - auxData.Technology.FirstOrDefault()); - aux.ID = Constants.Auxiliaries.IDs.Fan; - break; - case AuxiliaryType.SteeringPump: - if (numSteeredAxles.HasValue && auxData.Technology.Count != numSteeredAxles.Value) { - throw new VectoException( - $"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {auxData.Technology.Count})"); - } - - aux.PowerDemand = - DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology); - aux.ID = Constants.Auxiliaries.IDs.SteeringPump; - break; - case AuxiliaryType.HVAC: - aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup( - mission, - auxData.Technology.FirstOrDefault(), hvdClass).PowerDemand; - aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition; - break; - case AuxiliaryType.PneumaticSystem: - aux.PowerDemand = DeclarationData.PneumaticSystem - .Lookup(mission, auxData.Technology.FirstOrDefault()) - .PowerDemand; - aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem; - break; - case AuxiliaryType.ElectricSystem: - aux.PowerDemand = DeclarationData.ElectricSystem - .Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand; - aux.ID = Constants.Auxiliaries.IDs.ElectricSystem; - break; - default: continue; - } - - retVal.Add(aux); - } - - return retVal; - } - - public override AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) - { - if (double.IsNaN(gbxData.AxlegearRatio)) { - throw new VectoException( - "Axlegear ratio required in gearbox data for gearboxes with included axlegear"); - } - - return new AxleGearData() { - AxleGear = new TransmissionData() { - Ratio = gbxData.AxlegearRatio, - LossMap = TransmissionLossMapReader.Create(1.0, gbxData.AxlegearRatio, "Axlegear") - } - }; - } - - protected void WarnDeclarationMode(string inputData) - { - Log.Warn("{0} not in Declaration Mode!", inputData); - } - - public override RetarderData CreateRetarderData(IRetarderInputData retarder) - { - return SetCommonRetarderData(retarder); - } - - public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> - GetDeclarationAirResistanceCurve( - string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight) - { - var startSpeed = Constants.SimulationSettings.CrosswindCorrection.MinVehicleSpeed; - var maxSpeed = Constants.SimulationSettings.CrosswindCorrection.MaxVehicleSpeed; - var speedStep = Constants.SimulationSettings.CrosswindCorrection.VehicleSpeedStep; - - var maxAlpha = Constants.SimulationSettings.CrosswindCorrection.MaxAlpha; - var alphaStep = Constants.SimulationSettings.CrosswindCorrection.AlphaStep; - - var startHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MinHeight; - var maxHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MaxHeight; - var heightPercentStep = Constants.SimulationSettings.CrosswindCorrection.HeightStep; - var heightShare = (double)heightPercentStep / maxHeightPercent; - - var values = DeclarationData.AirDrag.Lookup(crosswindCorrectionParameters); - - // first entry (0m/s) will get CdxA of second entry. - var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> { - new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry { - Velocity = 0.SI<MeterPerSecond>(), - EffectiveCrossSectionArea = 0.SI<SquareMeter>() - } - }; - - for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep) { - var vVeh = speed.KMPHtoMeterPerSecond(); - - var cdASum = 0.SI<SquareMeter>(); - - for (var heightPercent = startHeightPercent; - heightPercent < maxHeightPercent; - heightPercent += heightPercentStep) { - var height = heightPercent / 100.0 * vehicleHeight; - var vWind = Physics.BaseWindSpeed * - Math.Pow(height / Physics.BaseWindHeight, Physics.HellmannExponent); - - for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep) { - var vAirX = vVeh + vWind * Math.Cos(alpha.ToRadian()); - var vAirY = vWind * Math.Sin(alpha.ToRadian()); - - var beta = Math.Atan(vAirY / vAirX).ToDegree(); - - // ΔCdxA = A1β + A2β² + A3β³ - var deltaCdA = values.A1 * beta + values.A2 * beta * beta + values.A3 * beta * beta * beta; - - // CdxA(β) = CdxA(0) + ΔCdxA(β) - var cdA = aerodynamicDragAera + deltaCdA; - - var share = (alpha == 0 || alpha == maxAlpha ? alphaStep / 2.0 : alphaStep) / maxAlpha; - - // v_air = sqrt(v_airX²+vAirY²) - // cdASum = CdxA(β) * v_air²/v_veh² - cdASum += heightShare * share * cdA * (vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh); - } - } - - points.Add( - new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry { - Velocity = vVeh, - EffectiveCrossSectionArea = cdASum - }); - } - - points[0].EffectiveCrossSectionArea = points[1].EffectiveCrossSectionArea; - return points; - } - - public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto) - { - if (pto != null && pto.PTOTransmissionType != "None") { - return new PTOData { - TransmissionType = pto.PTOTransmissionType, - LossMap = PTOIdleLossMapReader.GetZeroLossMap(), - }; - } - - return null; - } - - public override AirdragData CreateAirdragData( - IAirdragDeclarationInputData airdragInputData, Mission mission, - Segment segment) - { - if (airdragInputData == null || airdragInputData.AirDragArea == null) { - return DefaultAirdragData(mission); - } - - var retVal = SetCommonAirdragData(airdragInputData); - retVal.CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection; - retVal.DeclaredAirdragArea = mission.MissionType == MissionType.Construction - ? mission.DefaultCDxA - : airdragInputData.AirDragArea; - - var aerodynamicDragArea = - retVal.DeclaredAirdragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0); - - retVal.CrossWindCorrectionCurve = - new CrosswindCorrectionCdxALookup( - aerodynamicDragArea, - GetDeclarationAirResistanceCurve( - mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight), - CrossWindCorrectionMode.DeclarationModeCorrection); - return retVal; - } - - protected virtual AirdragData DefaultAirdragData(Mission mission) - { - var aerodynamicDragArea = mission.DefaultCDxA + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0); - - return new AirdragData() { - CertificationMethod = CertificationMethod.StandardValues, - CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection, - DeclaredAirdragArea = mission.DefaultCDxA, - CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup( - aerodynamicDragArea, - GetDeclarationAirResistanceCurve( - mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight), - CrossWindCorrectionMode.DeclarationModeCorrection) - }; - } - - public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, - PerSecond engineIdlingSpeed) - { - var retVal = new ShiftStrategyParameters { - TorqueReserve = DeclarationData.GearboxTCU.TorqueReserve, - StartTorqueReserve = DeclarationData.GearboxTCU.TorqueReserveStart, - TimeBetweenGearshifts = DeclarationData.Gearbox.MinTimeBetweenGearshifts, - StartSpeed = DeclarationData.GearboxTCU.StartSpeed, - StartAcceleration = DeclarationData.GearboxTCU.StartAcceleration, - DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay, - UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay, - UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration, - - StartVelocity = DeclarationData.GearboxTCU.StartSpeed, - GearResidenceTime = DeclarationData.GearboxTCU.GearResidenceTime, - DnT99L_highMin1 = DeclarationData.GearboxTCU.DnT99L_highMin1, - DnT99L_highMin2 = DeclarationData.GearboxTCU.DnT99L_highMin2, - AllowedGearRangeUp = DeclarationData.GearboxTCU.AllowedGearRangeUp, - AllowedGearRangeDown = DeclarationData.GearboxTCU.AllowedGearRangeDown, - LookBackInterval = DeclarationData.GearboxTCU.LookBackInterval, - DriverAccelerationLookBackInterval = DeclarationData.GearboxTCU.DriverAccelerationLookBackInterval, - DriverAccelerationThresholdLow = DeclarationData.GearboxTCU.DriverAccelerationThresholdLow, - AverageCardanPowerThresholdPropulsion = - DeclarationData.GearboxTCU.AverageCardanPowerThresholdPropulsion, - CurrentCardanPowerThresholdPropulsion = - DeclarationData.GearboxTCU.CurrentCardanPowerThresholdPropulsion, - TargetSpeedDeviationFactor = DeclarationData.GearboxTCU.TargetSpeedDeviationFactor, - EngineSpeedHighDriveOffFactor = DeclarationData.GearboxTCU.EngineSpeedHighDriveOffFactor, - RatingFactorCurrentGear = gbx.Type.AutomaticTransmission() - ? DeclarationData.GearboxTCU.RatingFactorCurrentGearAT - : DeclarationData.GearboxTCU.RatingFactorCurrentGear, - AccelerationReserveLookup = AccelerationReserveLookupReader.ReadFromStream( - RessourceHelper.ReadStream( - DeclarationData.DeclarationDataResourcePrefix + - ".GearshiftParameters.AccelerationReserveLookup.csv")), - ShareTorque99L = ShareTorque99lLookupReader.ReadFromStream( - RessourceHelper.ReadStream( - DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareTq99L.csv") - ), - PredictionDurationLookup = PredictionDurationLookupReader.ReadFromStream( - RessourceHelper.ReadStream( - DeclarationData.DeclarationDataResourcePrefix + - ".GearshiftParameters.PredictionTimeLookup.csv") - ), - ShareIdleLow = ShareIdleLowReader.ReadFromStream( - RessourceHelper.ReadStream( - DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareIdleLow.csv") - ), - ShareEngineHigh = EngineSpeedHighLookupReader.ReadFromStream( - RessourceHelper.ReadStream( - DeclarationData.DeclarationDataResourcePrefix + - ".GearshiftParameters.ShareEngineSpeedHigh.csv") - ), - - //-------------------- - RatioEarlyUpshiftFC = DeclarationData.GearboxTCU.RatioEarlyUpshiftFC / axleRatio, - RatioEarlyDownshiftFC = DeclarationData.GearboxTCU.RatioEarlyDownshiftFC / axleRatio, - AllowedGearRangeFC = gbx.Type.AutomaticTransmission() - ? (gbx.Gears.Count > DeclarationData.GearboxTCU.ATSkipGearsThreshold - ? DeclarationData.GearboxTCU.AllowedGearRangeFCATSkipGear - : DeclarationData.GearboxTCU.AllowedGearRangeFCAT) - : DeclarationData.GearboxTCU.AllowedGearRangeFCAMT, - VelocityDropFactor = DeclarationData.GearboxTCU.VelocityDropFactor, - AccelerationFactor = DeclarationData.GearboxTCU.AccelerationFactor, - MinEngineSpeedPostUpshift = 0.RPMtoRad(), - ATLookAheadTime = DeclarationData.GearboxTCU.ATLookAheadTime, - - LoadStageThresoldsUp = DeclarationData.GearboxTCU.LoadStageThresholdsUp, - LoadStageThresoldsDown = DeclarationData.GearboxTCU.LoadStageThresoldsDown, - ShiftSpeedsTCToLocked = DeclarationData.GearboxTCU.ShiftSpeedsTCToLocked - .Select(x => x.Select(y => y + engineIdlingSpeed.AsRPM).ToArray()).ToArray(), - }; - - return retVal; - } - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 377f87edd1..a7ce233f9a 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -31,99 +31,278 @@ using System; using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; +using TUGraz.VectoCore.InputData.Reader.ShiftStrategy; using TUGraz.VectoCore.Models.Declaration; 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; +using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry { - public partial class DeclarationDataAdapterHeavyLorry : AbstractSimulationDataAdapter, IDeclarationDataAdapter { - [Obsolete("Use DeclarationDataAdapterHeavyLorry.Conventional instead, created automatically with NInject")] - public DeclarationDataAdapterHeavyLorry() + public abstract class LorryBase : AbstractSimulationDataAdapter, IDeclarationDataAdapter { - - } - private IDeclarationDataAdapter _declarationDataAdapterImplementation = new Conventional(); - public static readonly GearboxType[] SupportedGearboxTypes = Conventional.SupportedGearboxTypes; - public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve(string parameterSet, SquareMeter si, Meter meter) - { - return Conventional.GetDeclarationAirResistanceCurve(parameterSet, si, meter); - } - #region Implementation of IDeclarationDataAdapter + #region Implementation of IDeclarationDataAdapter - public DriverData CreateDriverData() - { - return _declarationDataAdapterImplementation.CreateDriverData(); - } + private readonly IDriverDataAdapter _driverDataAdapter = new LorryDriverDataAdapter(); + protected readonly IVehicleDataAdapter _vehicleDataAdapter = new LorryVehicleDataAdapter(); + private readonly IAxleGearDataAdapter _axleGearDataAdapter = new AxleGearDataAdapterBase(); + private readonly IRetarderDataAdapter _retarderDataAdapter = new RetarderDataAdapter(); + private readonly IAirdragDataAdapter _airdragDataAdapter = new AirdragDataAdapter(); + private readonly IPTODataAdapter _ptoDataAdapter = new PTODataAdapterLorry(); + public DriverData CreateDriverData() + { + return _driverDataAdapter.CreateDriverData(); + } - public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, - KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) - { - return _declarationDataAdapterImplementation.CreateVehicleData(vehicle, segment, mission, loading, allowVocational); - } + public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, + Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) + { + return _vehicleDataAdapter.CreateVehicleData(vehicle, segment, mission, loading.Value.Item1, + loading.Value.Item2, allowVocational); + } - public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment) - { - return _declarationDataAdapterImplementation.CreateAirdragData(airdragData, mission, segment); - } + public virtual AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, + Segment segment) + { + return _airdragDataAdapter.CreateAirdragData(airdragData, mission, segment); + } - public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) - { - return _declarationDataAdapterImplementation.CreateAxleGearData(axlegearData); - } + public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) + { + return _axleGearDataAdapter.CreateAxleGearData(axlegearData); + } - public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) - { - return _declarationDataAdapterImplementation.CreateAngledriveData(angledriveData); - } + public virtual AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) + { + throw new NotImplementedException(); + } - public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, - Mission mission) - { - return _declarationDataAdapterImplementation.CreateEngineData(vehicle, engineMode, mission); - } + public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, + IEngineModeDeclarationInputData engineMode, + Mission mission) + { + throw new NotImplementedException(); + } - public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, - IShiftPolygonCalculator shiftPolygonCalc) - { - return _declarationDataAdapterImplementation.CreateGearboxData(inputData, runData, shiftPolygonCalc); + public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + throw new NotImplementedException(); + } + + public abstract ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, + PerSecond engineIdlingSpeed); + + public RetarderData CreateRetarderData(IRetarderInputData retarderData) + { + return _retarderDataAdapter.CreateRetarderData(retarderData); + } + + public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) + { + return _ptoDataAdapter.CreatePTOTransmissionData(ptoData); + } + + public abstract IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles); + + public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) + { + return _axleGearDataAdapter.CreateDummyAxleGearData(gbxData); + } + + #endregion } - public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + public class Conventional : LorryBase { - return _declarationDataAdapterImplementation.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); + public static readonly GearboxType[] SupportedGearboxTypes = + { GearboxType.MT, GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial }; + + private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter(); + private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter()); + private IAngledriveDataAdapter _angleDriveDataAdapter = new AngledriveDataAdapter(); + private IAuxiliaryDataAdapter _auxAdapter = new HeavyLorryAuxiliaryDataAdapter(); + public override CombustionEngineData CreateEngineData( + IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) + { + return _engineDataAdapter.CreateEngineData(vehicle, mode, mission); + } + + + + public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + return _gearboxDataAdapter.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes); + } + + protected virtual TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType, + ITorqueConverterDeclarationInputData torqueConverter, double ratio, + CombustionEngineData componentsEngineInputData) + { + return TorqueConverterDataReader.Create( + torqueConverter.TCData, + DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, + ExecutionMode.Declaration, ratio, + DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, + DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + } + + #region Overrides of LorryBase + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + return _gearboxDataAdapter.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); + } + + #endregion + + + public override AngledriveData CreateAngledriveData(IAngledriveInputData data) + { + return _angleDriveDataAdapter.CreateAngledriveData(data, false); + } + + + public override IList<VectoRunData.AuxData> CreateAuxiliaryData( + IAuxiliariesDeclarationInputData auxInputData, + IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, + Meter vehicleLength, int? numSteeredAxles) + { + return _auxAdapter.CreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength, + numSteeredAxles); + } } - public RetarderData CreateRetarderData(IRetarderInputData retarderData) + public abstract class SerialHybrid : LorryBase { - return _declarationDataAdapterImplementation.CreateRetarderData(retarderData); + #region Overrides of LorryBase + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + throw new NotImplementedException(); + } + + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + { + throw new NotImplementedException(); + } + + #endregion } - public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) + public abstract class ParallelHybrid : LorryBase { - return _declarationDataAdapterImplementation.CreatePTOTransmissionData(ptoData); + #region Overrides of LorryBase + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + throw new NotImplementedException(); + } + + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + { + throw new NotImplementedException(); + } + + #endregion } - public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public abstract class BatteryElectric : LorryBase { - return _declarationDataAdapterImplementation.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength, numSteeredAxles); - } + #region Overrides of LorryBase + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + throw new NotImplementedException(); + } - public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + { + throw new NotImplementedException(); + } + + #endregion + } + public class HEV_S2 : SerialHybrid { } + public class HEV_S3 : SerialHybrid { } + public class HEV_S4 : SerialHybrid { } + public class HEV_S_IEPC : SerialHybrid { } + public class HEV_P1 : ParallelHybrid { } + public class HEV_P2 : ParallelHybrid { } + public class HEV_P2_5 : ParallelHybrid { } + public class HEV_P3 : ParallelHybrid { } + public class HEV_P4 : ParallelHybrid { } + public class PEV_E2 : BatteryElectric { } + public class PEV_E3 : BatteryElectric { } + public class PEV_E4 : BatteryElectric { } + public class PEV_E_IEPC : BatteryElectric { } + public class Exempted : LorryBase { - return _declarationDataAdapterImplementation.CreateDummyAxleGearData(gbxData); + #region Overrides of LorryBase + + public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) + { + return _vehicleDataAdapter.CreateExemptedVehicleData(vehicle); + } + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + throw new NotImplementedException(); + } + + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + { + throw new NotImplementedException(); + } + + #endregion } - #endregion + + + + + + + + + + + + + + + + + + + + + + } -} +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs new file mode 100644 index 0000000000..b1e4a78062 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry +{ + + + + public partial class DeclarationDataAdapterHeavyLorry + { + [Obsolete("Use DeclarationDataAdapterHeavyLorry.Conventional instead, created automatically with NInject")] + public DeclarationDataAdapterHeavyLorry() { } + + private IDeclarationDataAdapter _declarationDataAdapterImplementation = new Conventional(); + public static readonly GearboxType[] SupportedGearboxTypes = Conventional.SupportedGearboxTypes; + + //public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve( + // string parameterSet, SquareMeter si, Meter meter) + //{ + // //return Conventional.GetDeclarationAirResistanceCurve(parameterSet, si, meter); + //} + + #region Implementation of IDeclarationDataAdapter + + public DriverData CreateDriverData() + { + return _declarationDataAdapterImplementation.CreateDriverData(); + } + + public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) + { + return _declarationDataAdapterImplementation.CreateVehicleData(vehicle, segment, mission, loading, + allowVocational); + } + + public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment) + { + return _declarationDataAdapterImplementation.CreateAirdragData(airdragData, mission, segment); + } + + public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) + { + return _declarationDataAdapterImplementation.CreateAxleGearData(axlegearData); + } + + public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) + { + return _declarationDataAdapterImplementation.CreateAngledriveData(angledriveData); + } + + public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, + IEngineModeDeclarationInputData engineMode, + Mission mission) + { + return _declarationDataAdapterImplementation.CreateEngineData(vehicle, engineMode, mission); + } + + public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + return _declarationDataAdapterImplementation.CreateGearboxData(inputData, runData, shiftPolygonCalc); + } + + public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, + PerSecond engineIdlingSpeed) + { + return _declarationDataAdapterImplementation.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); + } + + public RetarderData CreateRetarderData(IRetarderInputData retarderData) + { + return _declarationDataAdapterImplementation.CreateRetarderData(retarderData); + } + + public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) + { + return _declarationDataAdapterImplementation.CreatePTOTransmissionData(ptoData); + } + + public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + { + return _declarationDataAdapterImplementation.CreateAuxiliaryData(auxData, busAuxData, missionType, + vehicleClass, vehicleLength, numSteeredAxles); + } + + public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) + { + return _declarationDataAdapterImplementation.CreateDummyAxleGearData(gbxData); + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs deleted file mode 100644 index bef6a10f64..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_P1 : LorryBase - { - - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs deleted file mode 100644 index 648cea5b2c..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_P2 : LorryBase - { - - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs deleted file mode 100644 index da14951413..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs +++ /dev/null @@ -1,12 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_P2_5 : LorryBase - { - - } - - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs deleted file mode 100644 index 331c5372f5..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs +++ /dev/null @@ -1,12 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_P3 : LorryBase - { - - } - - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs deleted file mode 100644 index 99a743928b..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs +++ /dev/null @@ -1,12 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_P4 : LorryBase - { - - } - - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs deleted file mode 100644 index 383233462f..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_S3 : LorryBase - { - - } - } -} diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs deleted file mode 100644 index 48deec22b0..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class HEV_S4 : LorryBase - { - - } - } -} diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd new file mode 100644 index 0000000000..7b894197b9 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<ClassDiagram /> \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs deleted file mode 100644 index e573fd19bd..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections.Generic; -using TUGraz.VectoCommon.InputData; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.SimulationComponent; -using TUGraz.VectoCore.Models.SimulationComponent.Data; - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public abstract class LorryBase : AbstractSimulationDataAdapter, IDeclarationDataAdapter - { - #region Implementation of IDeclarationDataAdapter - - private readonly IDriverDataAdapter _driverDataAdapter = new LorryDriverDataAdapter(); - - public DriverData CreateDriverData() - { - return _driverDataAdapter.CreateDriverData(); - } - - public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, - Mission mission, - KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) - { - throw new NotImplementedException(); - } - - public virtual AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, - Segment segment) - { - throw new NotImplementedException(); - } - - public virtual AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) - { - throw new NotImplementedException(); - } - - public virtual AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) - { - throw new NotImplementedException(); - } - - public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, - IEngineModeDeclarationInputData engineMode, - Mission mission) - { - throw new NotImplementedException(); - } - - public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, - IShiftPolygonCalculator shiftPolygonCalc) - { - throw new NotImplementedException(); - } - - public virtual ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, - PerSecond engineIdlingSpeed) - { - throw new NotImplementedException(); - } - - public virtual RetarderData CreateRetarderData(IRetarderInputData retarderData) - { - throw new NotImplementedException(); - } - - public virtual PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) - { - throw new NotImplementedException(); - } - - public virtual IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, - IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) - { - throw new NotImplementedException(); - } - - public virtual AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) - { - throw new NotImplementedException(); - } - - #endregion - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs deleted file mode 100644 index eeb02207a9..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class PEV_E2 : LorryBase - { - - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs deleted file mode 100644 index ebcf0d47e6..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class PEV_E3 : LorryBase - { - - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs deleted file mode 100644 index 54254768d6..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class PEV_E4 : LorryBase - { - - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs deleted file mode 100644 index ba61ea4702..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs +++ /dev/null @@ -1,11 +0,0 @@ - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public class PEV_E_IEPC : LorryBase - { - - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs deleted file mode 100644 index 4881c93911..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using TUGraz.VectoCommon.InputData; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.SimulationComponent; -using TUGraz.VectoCore.Models.SimulationComponent.Data; - -namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -{ - public partial class DeclarationDataAdapterHeavyLorry - { - public abstract class SerialHybrid : LorryBase { } - - public class HEV_S2 : SerialHybrid - { - } - - - public class HEV_S_IEPC : SerialHybrid - { - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs index 646604ee60..ebd1f99eae 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -27,12 +28,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter { AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData); } - public interface IGenericCompletedBusDataAdapter : IDeclarationDataAdapter + public interface IPrimaryBusDeclarationDataAdapter : IDeclarationDataAdapter + { + IAuxiliaryConfig CreateBusAuxiliariesData( + Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData); + } + + public interface IGenericCompletedBusDataAdapter : IPrimaryBusDeclarationDataAdapter { } - public interface ISpecificCompletedBusDataAdapter : IDeclarationDataAdapter + public interface ISpecificCompletedBusDataAdapter : IPrimaryBusDeclarationDataAdapter { } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs index d709fc41b2..ce4e0f499c 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs @@ -34,6 +34,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus public override VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) { + var retVal = base.CreateVehicleData(data, segment, mission, loading, allowVocational); if (data.ExemptedVehicle) { return retVal; @@ -43,38 +44,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus return retVal; } - protected override VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data) - { - var exempted = new VehicleData { - InputData = data, - SavedInDeclarationMode = data.SavedInDeclarationMode, - Manufacturer = data.Manufacturer, - ModelName = data.Model, - Date = data.Date, - //CertificationNumber = data.CertificationNumber, - DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", - VehicleCategory = data.VehicleCategory, - //CurbMass = data.CurbMassChassis, - GrossVehicleMass = data.GrossVehicleMassRating, - AirDensity = Physics.AirDensity, - }; - 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; - exempted.AxleConfiguration = data.AxleConfiguration; - return exempted; - } - - public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto) - { - return null; - } - public override IList<VectoRunData.AuxData> CreateAuxiliaryData( IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles) @@ -170,7 +139,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus return DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup("default"); } - protected virtual Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass) + protected virtual Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetElectricConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass) { var retVal = GetDefaultElectricConsumers(mission, vehicleData, actuations); @@ -181,10 +150,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus return retVal; } - protected virtual Dictionary<string, ElectricConsumerEntry> GetDefaultElectricConsumers( + protected virtual Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetDefaultElectricConsumers( Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations) { - var retVal = new Dictionary<string, ElectricConsumerEntry>(); + var retVal = new Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry>(); var doorDutyCycleFraction = (actuations.ParkBrakeAndDoors * Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond) / actuations.CycleTime; @@ -211,7 +180,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus current = 0.SI<Ampere>(); } - retVal[consumer.ConsumerName] = new ElectricConsumerEntry { + retVal[consumer.ConsumerName] = new AuxiliaryDataAdapter.ElectricConsumerEntry { BaseVehicle = consumer.BaseVehicle, Current = current }; @@ -244,13 +213,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus return mission.BusParameter.ElectricalConsumers.GetVECTOValueOrDefault(consumer.ConsumerName, 0); } - protected virtual Dictionary<string, ElectricConsumerEntry> GetElectricAuxConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, VehicleClass vehicleClass, IBusAuxiliariesDeclarationData busAux) + protected virtual Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetElectricAuxConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, VehicleClass vehicleClass, IBusAuxiliariesDeclarationData busAux) { - var retVal = new Dictionary<string, ElectricConsumerEntry>(); + var retVal = new Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry>(); var spPower = DeclarationData.SteeringPumpBus.LookupElectricalPowerDemand( mission.MissionType, busAux.SteeringPumpTechnology, vehicleData.Length ?? mission.BusParameter.VehicleLength); - retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry { + retVal[Constants.Auxiliaries.IDs.SteeringPump] = new AuxiliaryDataAdapter.ElectricConsumerEntry { ActiveDuringEngineStopStandstill = false, BaseVehicle = false, Current = spPower / Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage @@ -258,7 +227,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus var fanPower = DeclarationData.Fan.LookupElectricalPowerDemand( vehicleClass, mission.MissionType, busAux.FanTechnology); - retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry { + retVal[Constants.Auxiliaries.IDs.Fan] = new AuxiliaryDataAdapter.ElectricConsumerEntry { ActiveDuringEngineStopStandstill = false, ActiveDuringEngineStopDriving = false, BaseVehicle = false, @@ -480,20 +449,27 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus } - public abstract class PrimaryBusBase : IDeclarationDataAdapter + public abstract class PrimaryBusBase : IPrimaryBusDeclarationDataAdapter { #region Implementation of IDeclarationDataAdapter private readonly IDriverDataAdapter _driverDataAdapter = new PrimaryBusDriverDataAdapter(); + protected readonly IVehicleDataAdapter _vehicleDataAdapter = new PrimaryBusVehicleDataAdapter(); + protected readonly IAxleGearDataAdapter _axleGearDataAdapter = new AxleGearDataAdapterBase(); + protected readonly IPTODataAdapter _ptoDataAdapter = new PTODataAdapterBus(); + protected readonly IAuxiliaryDataAdapter _auxDataAdapter = new PrimaryBusAuxiliaryDataAdapter(); + protected readonly IRetarderDataAdapter _retarderDataAdapter = new RetarderDataAdapter(); + public DriverData CreateDriverData() { return _driverDataAdapter.CreateDriverData(); } - public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, + public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) { - throw new NotImplementedException(); + return _vehicleDataAdapter.CreateVehicleData(vehicle, segment, mission, loading.Value.Item1, + loading.Value.Item2, allowVocational); } public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment) @@ -503,7 +479,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) { - throw new NotImplementedException(); + return _axleGearDataAdapter.CreateAxleGearData(axlegearData); } public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) @@ -511,37 +487,38 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus throw new NotImplementedException(); } - public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, + public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, Mission mission) { throw new NotImplementedException(); } - public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, IShiftPolygonCalculator shiftPolygonCalc) { throw new NotImplementedException(); } - public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + public virtual ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) { throw new NotImplementedException(); } public RetarderData CreateRetarderData(IRetarderInputData retarderData) { - throw new NotImplementedException(); + return _retarderDataAdapter.CreateRetarderData(retarderData); } public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) { - throw new NotImplementedException(); + return _ptoDataAdapter.CreatePTOTransmissionData(ptoData); } public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) { - throw new NotImplementedException(); + return _auxDataAdapter.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength, + numSteeredAxles); } public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) @@ -549,12 +526,40 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus throw new NotImplementedException(); } + public IAuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, + VectoRunData runData) + { + return _auxDataAdapter.CreateBusAuxiliariesData(mission, vehicleData, runData); + } + #endregion } public class Conventional : PrimaryBusBase { + protected IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter(); + protected IGearboxDataAdapter _gearboxDataAdapter = + new GearboxDataAdapter(new TorqueConverterDataAdapter()); + #region Overrides of PrimaryBusBase + public override CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, + Mission mission) + { + return _engineDataAdapter.CreateEngineData(vehicle, engineMode, mission); + } + + public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + return _gearboxDataAdapter.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes); + } + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + return _gearboxDataAdapter.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); + } + + #endregion } public class HEV_S2 : PrimaryBusBase @@ -627,23 +632,31 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus public class Exempted : PrimaryBusBase { + #region Overrides of PrimaryBusBase + + public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) + { + return _vehicleDataAdapter.CreateExemptedVehicleData(vehicle); + } + #endregion } } - public class ElectricConsumerEntry { + //public class ElectricConsumerEntry { - public ElectricConsumerEntry() - { - ActiveDuringEngineStopStandstill = true; - ActiveDuringEngineStopDriving = true; - } + // public ElectricConsumerEntry() + // { + // ActiveDuringEngineStopStandstill = true; + // ActiveDuringEngineStopDriving = true; + // } - public bool ActiveDuringEngineStopDriving { get; set; } + // public bool ActiveDuringEngineStopDriving { get; set; } - public bool ActiveDuringEngineStopStandstill { get; set; } + // public bool ActiveDuringEngineStopStandstill { get; set; } - public bool BaseVehicle { get; set; } - public Ampere Current { get; set; } - } + // public bool BaseVehicle { get; set; } + // public Ampere Current { get; set; } + //} } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs new file mode 100644 index 0000000000..330e260c79 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs @@ -0,0 +1,24 @@ +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IADASDataAdapter + { + VehicleData.ADASData CreateADAS(IAdvancedDriverAssistantSystemDeclarationInputData adas); + } + public class ADASDataAdapter : IADASDataAdapter + { + + public VehicleData.ADASData CreateADAS(IAdvancedDriverAssistantSystemDeclarationInputData adas) + { + return new VehicleData.ADASData + { + EngineStopStart = adas.EngineStopStart, + EcoRoll = adas.EcoRoll, + PredictiveCruiseControl = adas.PredictiveCruiseControl, + InputData = adas + }; + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs new file mode 100644 index 0000000000..479d1fdc11 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + internal interface IAirdragDataAdapter + { + AirdragData CreateAirdragData( + IAirdragDeclarationInputData airdragInputData, Mission mission, + Segment segment); + } + + internal class AirdragDataAdapter : IAirdragDataAdapter + { + public List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> + GetDeclarationAirResistanceCurve( + string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight) + { + var startSpeed = Constants.SimulationSettings.CrosswindCorrection.MinVehicleSpeed; + var maxSpeed = Constants.SimulationSettings.CrosswindCorrection.MaxVehicleSpeed; + var speedStep = Constants.SimulationSettings.CrosswindCorrection.VehicleSpeedStep; + + var maxAlpha = Constants.SimulationSettings.CrosswindCorrection.MaxAlpha; + var alphaStep = Constants.SimulationSettings.CrosswindCorrection.AlphaStep; + + var startHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MinHeight; + var maxHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MaxHeight; + var heightPercentStep = Constants.SimulationSettings.CrosswindCorrection.HeightStep; + var heightShare = (double)heightPercentStep / maxHeightPercent; + + var values = DeclarationData.AirDrag.Lookup(crosswindCorrectionParameters); + + // first entry (0m/s) will get CdxA of second entry. + var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> { + new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry { + Velocity = 0.SI<MeterPerSecond>(), + EffectiveCrossSectionArea = 0.SI<SquareMeter>() + } + }; + + for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep) + { + var vVeh = speed.KMPHtoMeterPerSecond(); + + var cdASum = 0.SI<SquareMeter>(); + + for (var heightPercent = startHeightPercent; + heightPercent < maxHeightPercent; + heightPercent += heightPercentStep) + { + var height = heightPercent / 100.0 * vehicleHeight; + var vWind = Physics.BaseWindSpeed * + Math.Pow(height / Physics.BaseWindHeight, Physics.HellmannExponent); + + for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep) + { + var vAirX = vVeh + vWind * Math.Cos(alpha.ToRadian()); + var vAirY = vWind * Math.Sin(alpha.ToRadian()); + + var beta = Math.Atan(vAirY / vAirX).ToDegree(); + + // ΔCdxA = A1β + A2β² + A3β³ + var deltaCdA = values.A1 * beta + values.A2 * beta * beta + values.A3 * beta * beta * beta; + + // CdxA(β) = CdxA(0) + ΔCdxA(β) + var cdA = aerodynamicDragAera + deltaCdA; + + var share = (alpha == 0 || alpha == maxAlpha ? alphaStep / 2.0 : alphaStep) / maxAlpha; + + // v_air = sqrt(v_airX²+vAirY²) + // cdASum = CdxA(β) * v_air²/v_veh² + cdASum += heightShare * share * cdA * (vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh); + } + } + + points.Add( + new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry + { + Velocity = vVeh, + EffectiveCrossSectionArea = cdASum + }); + } + + points[0].EffectiveCrossSectionArea = points[1].EffectiveCrossSectionArea; + return points; + } + protected virtual AirdragData DefaultAirdragData(Mission mission) + { + var aerodynamicDragArea = mission.DefaultCDxA + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0); + + return new AirdragData() + { + CertificationMethod = CertificationMethod.StandardValues, + CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection, + DeclaredAirdragArea = mission.DefaultCDxA, + CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup( + aerodynamicDragArea, + GetDeclarationAirResistanceCurve( + mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight), + CrossWindCorrectionMode.DeclarationModeCorrection) + }; + } + internal AirdragData SetCommonAirdragData(IAirdragDeclarationInputData data) + { + var retVal = new AirdragData() { + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + CertificationMethod = data.CertificationMethod, + CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + }; + return retVal; + } + + public AirdragData CreateAirdragData( + IAirdragDeclarationInputData airdragInputData, Mission mission, + Segment segment) + { + if (airdragInputData == null || airdragInputData.AirDragArea == null) + { + return DefaultAirdragData(mission); + } + + var retVal = SetCommonAirdragData(airdragInputData); + retVal.CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection; + retVal.DeclaredAirdragArea = mission.MissionType == MissionType.Construction + ? mission.DefaultCDxA + : airdragInputData.AirDragArea; + + var aerodynamicDragArea = + retVal.DeclaredAirdragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0); + + retVal.CrossWindCorrectionCurve = + new CrosswindCorrectionCdxALookup( + aerodynamicDragArea, + GetDeclarationAirResistanceCurve( + mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight), + CrossWindCorrectionMode.DeclarationModeCorrection); + return retVal; + } + + } +} diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs new file mode 100644 index 0000000000..f748c6cbe9 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs @@ -0,0 +1,78 @@ +using System; +using NLog.Fluent; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.GenericModelData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IAngledriveDataAdapter + { + AngledriveData CreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback); + } + + public class AngledriveDataAdapter : IAngledriveDataAdapter + { + public AngledriveData CreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback) + { + try { + var type = data?.Type ?? AngledriveType.None; + + switch (type) { + case AngledriveType.LossesIncludedInGearbox: + case AngledriveType.None: + return null; + case AngledriveType.SeparateAngledrive: + var angledriveData = new AngledriveData { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + CertificationMethod = data.CertificationMethod, + CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + Type = type, + Angledrive = new TransmissionData { Ratio = data.Ratio } + }; + try { + angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.LossMap, + data.Ratio, "Angledrive", true); + } catch (VectoException ex) { + Log.Info("Angledrive Loss Map not found."); + if (useEfficiencyFallback) { + Log.Info("Angledrive Trying with Efficiency instead of Loss Map."); + angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.Efficiency, + data.Ratio, "Angledrive"); + } else { + throw new VectoException("Angledrive: LossMap not found.", ex); + } + } + + return angledriveData; + default: + throw new ArgumentOutOfRangeException(nameof(data), "Unknown Angledrive Type."); + } + } catch (Exception e) { + throw new VectoException("Error while reading Angledrive data: {0}", e.Message, e); + } + } + } + + public class GenericAngledriveDataAdapter : IAngledriveDataAdapter + { + private readonly GenericTransmissionComponentData _genericPowertrainData = new GenericTransmissionComponentData(); + #region Implementation of IAngledriveDataAdapter + + public AngledriveData CreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback) + { + return _genericPowertrainData.CreateGenericBusAngledriveData(data); + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs new file mode 100644 index 0000000000..8efb4c058f --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs @@ -0,0 +1,565 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; +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.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IAuxiliaryDataAdapter + { + IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, + IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, Meter vehicleLength, + int? numSteeredAxles); + + AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData); + + + } + + public abstract class AuxiliaryDataAdapter : ComponentDataAdapterBase, IAuxiliaryDataAdapter + { + public class ElectricConsumerEntry + { + + public ElectricConsumerEntry() + { + ActiveDuringEngineStopStandstill = true; + ActiveDuringEngineStopDriving = true; + } + + public bool ActiveDuringEngineStopDriving { get; set; } + + public bool ActiveDuringEngineStopStandstill { get; set; } + + public bool BaseVehicle { get; set; } + public Ampere Current { get; set; } + } + public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, + IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, Meter vehicleLength, + int? numSteeredAxles) + { + CheckDeclarationMode(auxInputData, "AuxiliariesData"); + return DoCreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength, numSteeredAxles); + } + + public abstract AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData); + + protected abstract IList<VectoRunData.AuxData> DoCreateAuxiliaryData( + IAuxiliariesDeclarationInputData auxInputData, + IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hdvClass, Meter vehicleLength, + int? numSteeredAxles); + + + } + + public class HeavyLorryAuxiliaryDataAdapter : AuxiliaryDataAdapter + { + #region Overrides of AuxiliaryDataAdapter + + public override AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData) + { + throw new System.NotImplementedException(); + } + + protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, + MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles) + { + var retVal = new List<VectoRunData.AuxData>(); + + if (auxInputData.Auxiliaries.Count != 5) + { + Log.Error( + "In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System."); + throw new VectoException( + "In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System."); + } + + foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) + { + var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType); + if (auxData == null) + { + throw new VectoException("Auxiliary {0} not found.", auxType); + } + + var aux = new VectoRunData.AuxData + { + DemandType = AuxiliaryDemandType.Constant, + Technology = auxData.Technology + }; + + mission = mission.GetNonEMSMissionType(); + switch (auxType) + { + case AuxiliaryType.Fan: + aux.PowerDemand = DeclarationData.Fan.LookupPowerDemand(hdvClass, mission, auxData.Technology.FirstOrDefault()); + aux.ID = Constants.Auxiliaries.IDs.Fan; + break; + case AuxiliaryType.SteeringPump: + if (numSteeredAxles.HasValue && auxData.Technology.Count != numSteeredAxles.Value) + { + throw new VectoException($"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {auxData.Technology.Count})"); + } + aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hdvClass, auxData.Technology); + aux.ID = Constants.Auxiliaries.IDs.SteeringPump; + break; + case AuxiliaryType.HVAC: + aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup( + mission, + auxData.Technology.FirstOrDefault(), hdvClass).PowerDemand; + aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition; + break; + case AuxiliaryType.PneumaticSystem: + aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault()) + .PowerDemand; + aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem; + break; + case AuxiliaryType.ElectricSystem: + aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand; + aux.ID = Constants.Auxiliaries.IDs.ElectricSystem; + break; + default: continue; + } + + retVal.Add(aux); + } + + return retVal; + } + + #endregion + } + + public class PrimaryBusAuxiliaryDataAdapter : AuxiliaryDataAdapter + { + private ElectricsUserInputsConfig GetDefaultElectricalUserConfig() + { + return new ElectricsUserInputsConfig() + { + PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage, + StoredEnergyEfficiency = Constants.BusAuxiliaries.ElectricSystem.StoredEnergyEfficiency, + ResultCardIdle = new DummyResultCard(), + ResultCardOverrun = new DummyResultCard(), + ResultCardTraction = new DummyResultCard(), + AlternatorGearEfficiency = Constants.BusAuxiliaries.ElectricSystem.AlternatorGearEfficiency, + DoorActuationTimeSecond = Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond, + }; + } + private double GetNumberOfElectricalConsumersForMission(Mission mission, ElectricalConsumer consumer, + IVehicleDeclarationInputData vehicleData) + { + if (consumer.ConsumerName.Equals(Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer, + StringComparison.CurrentCultureIgnoreCase)) + { + var count = DeclarationData.BusAuxiliaries.DefaultElectricConsumerList.Items.First(x => + x.ConsumerName.Equals( + Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer, + StringComparison.CurrentCultureIgnoreCase)).NumberInActualVehicle.ToDouble(); + + switch (vehicleData.DoorDriveTechnology) + { + case ConsumerTechnology.Electrically: + return count; + case ConsumerTechnology.Mixed: + return count * 0.5; + default: + return 0; + } + } + + return mission.BusParameter.ElectricalConsumers.GetVECTOValueOrDefault(consumer.ConsumerName, 0); + } + + protected virtual Dictionary<string, ElectricConsumerEntry> GetDefaultElectricConsumers( + Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations) + { + var retVal = new Dictionary<string, ElectricConsumerEntry>(); + var doorDutyCycleFraction = + (actuations.ParkBrakeAndDoors * Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond) / + actuations.CycleTime; + var busAux = vehicleData.Components.BusAuxiliaries; + var electricDoors = vehicleData.DoorDriveTechnology == ConsumerTechnology.Electrically || + vehicleData.DoorDriveTechnology == ConsumerTechnology.Mixed; + + foreach (var consumer in DeclarationData.BusAuxiliaries.DefaultElectricConsumerList.Items) + { + var applied = consumer.DefaultConsumer || consumer.Bonus + ? 1.0 + : GetNumberOfElectricalConsumersForMission(mission, consumer, vehicleData); + var nbr = consumer.DefaultConsumer + ? GetNumberOfElectricalConsumersInVehicle(consumer.NumberInActualVehicle, mission, vehicleData) + : 1.0; + + var dutyCycle = electricDoors && consumer.ConsumerName.Equals( + Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer, + StringComparison.CurrentCultureIgnoreCase) + ? doorDutyCycleFraction + : consumer.PhaseIdleTractionOn; + + var current = applied * consumer.NominalCurrent(mission.MissionType) * dutyCycle * nbr; + if (consumer.Bonus && !VehicleHasElectricalConsumer(consumer.ConsumerName, busAux)) + { + current = 0.SI<Ampere>(); + } + + retVal[consumer.ConsumerName] = new ElectricConsumerEntry + { + BaseVehicle = consumer.BaseVehicle, + Current = current + }; + } + + return retVal; + } + + protected virtual bool VehicleHasElectricalConsumer(string consumerName, IBusAuxiliariesDeclarationData busAux) + { + switch (consumerName) + { + case "Day running lights LED bonus": + case "Position lights LED bonus": + case "Brake lights LED bonus": // return false; + case "Interior lights LED bonus": + case "Headlights LED bonus": return true; + default: return false; + } + } + protected virtual double CalculateLengthDependentElectricalConsumers(Mission mission, IVehicleDeclarationInputData vehicleData) + { + var busParams = mission.BusParameter; + return DeclarationData.BusAuxiliaries.CalculateLengthInteriorLights( + busParams.VehicleLength, busParams.VehicleCode, busParams.NumberPassengersLowerDeck) + .Value(); + } + + protected virtual double GetNumberOfElectricalConsumersInVehicle(string nbr, Mission mission, IVehicleDeclarationInputData vehicleData) + { + if ("f_IntLight(L_CoC)".Equals(nbr, StringComparison.InvariantCultureIgnoreCase)) + { + return CalculateLengthDependentElectricalConsumers(mission, vehicleData); + } + + return nbr.ToDouble(); + } + + private Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass) + { + var retVal = GetDefaultElectricConsumers(mission, vehicleData, actuations); + + foreach (var entry in GetElectricAuxConsumers(mission, vehicleData, vehicleClass, vehicleData.Components.BusAuxiliaries)) + { + retVal[entry.Key] = entry.Value; + } + + return retVal; + } + protected virtual Dictionary<string, ElectricConsumerEntry> GetElectricAuxConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, VehicleClass vehicleClass, IBusAuxiliariesDeclarationData busAux) + { + var retVal = new Dictionary<string, ElectricConsumerEntry>(); + var spPower = DeclarationData.SteeringPumpBus.LookupElectricalPowerDemand( + mission.MissionType, busAux.SteeringPumpTechnology, + vehicleData.Length ?? mission.BusParameter.VehicleLength); + retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry + { + ActiveDuringEngineStopStandstill = false, + BaseVehicle = false, + Current = spPower / Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage + }; + + var fanPower = DeclarationData.Fan.LookupElectricalPowerDemand( + vehicleClass, mission.MissionType, busAux.FanTechnology); + retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry + { + ActiveDuringEngineStopStandstill = false, + ActiveDuringEngineStopDriving = false, + BaseVehicle = false, + Current = fanPower / Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage + }; + return retVal; + } + protected virtual double CalculateAlternatorEfficiency(IList<IAlternatorDeclarationInputData> alternators) + { + return DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup("default"); + } + + private ElectricsUserInputsConfig GetElectricalUserConfig( + Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass) + { + var currentDemand = GetElectricConsumers(mission, vehicleData, actuations, vehicleClass); + var busAux = vehicleData.Components.BusAuxiliaries; + + var retVal = GetDefaultElectricalUserConfig(); + + retVal.AlternatorType = busAux.ElectricSupply.AlternatorTechnology; + retVal.ElectricalConsumers = currentDemand; + retVal.AlternatorMap = new SimpleAlternator(CalculateAlternatorEfficiency(busAux.ElectricSupply.Alternators)); + + switch (retVal.AlternatorType) + { + case AlternatorType.Smart when busAux.ElectricSupply.Alternators.Count == 0: + throw new VectoException("at least one alternator is required when specifying smart electrics!"); + case AlternatorType.Smart when busAux.ElectricSupply.ElectricStorage.Count == 0: + throw new VectoException("at least one electric storage (battery or capacitor) is required when specifying smart electrics!"); + } + + retVal.MaxAlternatorPower = busAux.ElectricSupply.Alternators.Sum(x => x.RatedVoltage * x.RatedCurrent); + retVal.ElectricStorageCapacity = busAux.ElectricSupply.ElectricStorage.Sum(x => x.ElectricStorageCapacity) ?? 0.SI<WattSecond>(); + + return retVal; + } + protected virtual PneumaticUserInputsConfig GetPneumaticUserConfig(IVehicleDeclarationInputData vehicleData, Mission mission) + { + var busAux = vehicleData.Components.BusAuxiliaries; + + //throw new NotImplementedException(); + return new PneumaticUserInputsConfig() + { + KneelingHeight = VectoMath.Max(0.SI<Meter>(), mission.BusParameter.EntranceHeight - Constants.BusParameters.EntranceHeight), + CompressorGearEfficiency = Constants.BusAuxiliaries.PneumaticUserConfig.CompressorGearEfficiency, + CompressorGearRatio = busAux.PneumaticSupply.Ratio, + CompressorMap = DeclarationData.BusAuxiliaries.GetCompressorMap(busAux.PneumaticSupply.CompressorSize, busAux.PneumaticSupply.Clutch), + SmartAirCompression = busAux.PneumaticSupply.SmartAirCompression, + SmartRegeneration = busAux.PneumaticSupply.SmartRegeneration, + AdBlueDosing = busAux.PneumaticConsumers.AdBlueDosing, + Doors = ConsumerTechnology.Pneumatically, + AirSuspensionControl = busAux.PneumaticConsumers.AirsuspensionControl, + }; + } + protected internal virtual IPneumaticsConsumersDemand CreatePneumaticAuxConfig(RetarderType retarderType) + { + return new PneumaticsConsumersDemand() + { + AdBlueInjection = Constants.BusAuxiliaries.PneumaticConsumersDemands.AdBlueInjection, + AirControlledSuspension = Constants.BusAuxiliaries.PneumaticConsumersDemands.AirControlledSuspension, + Braking = retarderType == RetarderType.None + ? Constants.BusAuxiliaries.PneumaticConsumersDemands.BrakingNoRetarder + : Constants.BusAuxiliaries.PneumaticConsumersDemands.BrakingWithRetarder, + BreakingWithKneeling = Constants.BusAuxiliaries.PneumaticConsumersDemands.BreakingAndKneeling, + DeadVolBlowOuts = Constants.BusAuxiliaries.PneumaticConsumersDemands.DeadVolBlowOuts, + DeadVolume = Constants.BusAuxiliaries.PneumaticConsumersDemands.DeadVolume, + NonSmartRegenFractionTotalAirDemand = + Constants.BusAuxiliaries.PneumaticConsumersDemands.NonSmartRegenFractionTotalAirDemand, + SmartRegenFractionTotalAirDemand = + Constants.BusAuxiliaries.PneumaticConsumersDemands.SmartRegenFractionTotalAirDemand, + OverrunUtilisationForCompressionFraction = + Constants.BusAuxiliaries.PneumaticConsumersDemands.OverrunUtilisationForCompressionFraction, + DoorOpening = Constants.BusAuxiliaries.PneumaticConsumersDemands.DoorOpening, + StopBrakeActuation = Constants.BusAuxiliaries.PneumaticConsumersDemands.StopBrakeActuation, + }; + } + public virtual ISSMDeclarationInputs CreateSSMModelParameters(IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel, LoadingType loadingType) + { + var busParams = mission.BusParameter; + + var isDoubleDecker = busParams.VehicleCode.IsDoubleDeckerBus(); + var internalLength = busParams.HVACConfiguration == BusHVACSystemConfiguration.Configuration2 + ? 2 * Constants.BusParameters.DriverCompartmentLength // OK + : DeclarationData.BusAuxiliaries.CalculateInternalLength(busParams.VehicleLength, + busParams.VehicleCode, 10); // missing: correction length for low floor buses + var internalHeight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(mission.BusParameter.VehicleCode, RegistrationClass.II, busParams.BodyHeight); + var coolingPower = CalculateMaxCoolingPower(null, null, mission); + + var retVal = GetDefaulSSMInputs(heatingFuel); + retVal.BusFloorType = busParams.VehicleCode.GetFloorType(); + retVal.Technologies = GetSSMTechnologyBenefits(busAuxInputData, mission.BusParameter.VehicleCode.GetFloorType()); + + retVal.FuelFiredHeaterPower = busParams.HVACAuxHeaterPower; + retVal.BusWindowSurface = DeclarationData.BusAuxiliaries.WindowHeight(busParams.DoubleDecker) * internalLength + + DeclarationData.BusAuxiliaries.FrontAndRearWindowArea(busParams.DoubleDecker); + retVal.BusSurfaceArea = 2 * (internalLength * busParams.VehicleWidth + internalLength * internalHeight + + (isDoubleDecker ? 2.0 : 1.0) * busParams.VehicleWidth * busParams.BodyHeight); + retVal.BusVolume = internalLength * busParams.VehicleWidth * internalHeight; + + retVal.UValue = DeclarationData.BusAuxiliaries.UValue(busParams.VehicleCode.GetFloorType()); + retVal.NumberOfPassengers = + DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(internalLength, busParams.VehicleWidth) * + (loadingType == LoadingType.LowLoading ? mission.BusParameter.PassengerDensityLow : mission.BusParameter.PassengerDensityRef) * + (loadingType == LoadingType.LowLoading ? mission.MissionType.GetLowLoadFactorBus() : 1.0) + 1; // add driver for 'heat input' + retVal.VentilationRate = DeclarationData.BusAuxiliaries.VentilationRate(busParams.HVACConfiguration, false); + retVal.VentilationRateHeating = DeclarationData.BusAuxiliaries.VentilationRate(busParams.HVACConfiguration, true); + + retVal.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2; + retVal.HVACCompressorType = busParams.HVACCompressorType; // use passenger compartment + retVal.COP = DeclarationData.BusAuxiliaries.CalculateCOP( + + coolingPower.Item1, HeatPumpType.none, coolingPower.Item2, busParams.HVACCompressorType, + busParams.VehicleCode.GetFloorType()); + retVal.HVACTechnology = $"{busParams.HVACConfiguration.GetName()} " + + $"({string.Join(", ", busParams.HVACCompressorType.GetName(), HeatPumpType.none.GetName())})"; + + //SetHVACParameters(retVal, vehicleData, mission); + + return retVal; + } + protected virtual TechnologyBenefits GetSSMTechnologyBenefits(IBusAuxiliariesDeclarationData inputData, FloorType floorType) + { + var onVehicle = new List<SSMTechnology>(); + foreach (var item in DeclarationData.BusAuxiliaries.SSMTechnologyList) + { + if ("Adjustable coolant thermostat".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) && + (inputData?.HVACAux.AdjustableCoolantThermostat ?? false)) + { + onVehicle.Add(item); + } + + if ("Engine waste gas heat exchanger".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) && + (inputData?.HVACAux.EngineWasteGasHeatExchanger ?? false)) + { + onVehicle.Add(item); + } + } + + return SelectBenefitForFloorType(floorType, onVehicle); + } + + protected virtual TechnologyBenefits SelectBenefitForFloorType(FloorType floorType, List<SSMTechnology> onVehicle) + { + var retVal = new TechnologyBenefits(); + + switch (floorType) + { + case FloorType.LowFloor: + retVal.CValueVariation = onVehicle.Sum(x => x.LowFloorC); + retVal.HValueVariation = onVehicle.Sum(x => x.LowFloorH); + retVal.VCValueVariation = onVehicle.Sum(x => x.ActiveVC ? x.LowFloorV : 0); + retVal.VHValueVariation = onVehicle.Sum(x => x.ActiveVH ? x.LowFloorV : 0); + retVal.VVValueVariation = onVehicle.Sum(x => x.ActiveVV ? x.LowFloorV : 0); + break; + case FloorType.HighFloor: + retVal.CValueVariation = onVehicle.Sum(x => x.RaisedFloorC); + retVal.HValueVariation = onVehicle.Sum(x => x.RaisedFloorH); + retVal.VCValueVariation = onVehicle.Sum(x => x.ActiveVC ? x.RaisedFloorV : 0); + retVal.VHValueVariation = onVehicle.Sum(x => x.ActiveVH ? x.RaisedFloorV : 0); + retVal.VVValueVariation = onVehicle.Sum(x => x.ActiveVV ? x.RaisedFloorV : 0); + break; + case FloorType.SemiLowFloor: + retVal.CValueVariation = onVehicle.Sum(x => x.SemiLowFloorC); + retVal.HValueVariation = onVehicle.Sum(x => x.SemiLowFloorH); + retVal.VCValueVariation = onVehicle.Sum(x => x.ActiveVC ? x.SemiLowFloorV : 0); + retVal.VHValueVariation = onVehicle.Sum(x => x.ActiveVH ? x.SemiLowFloorV : 0); + retVal.VVValueVariation = onVehicle.Sum(x => x.ActiveVV ? x.SemiLowFloorV : 0); + break; + } + + return retVal; + } + + public SSMInputs GetDefaulSSMInputs(IFuelProperties heatingFuel) + { + return new SSMInputs(null, heatingFuel) + { + DefaultConditions = new EnvironmentalConditionMapEntry( + Constants.BusAuxiliaries.SteadyStateModel.DefaultTemperature, + Constants.BusAuxiliaries.SteadyStateModel.DefaultSolar, + 1.0), + EnvironmentalConditionsMap = DeclarationData.BusAuxiliaries.DefaultEnvironmentalConditions, + HeatingBoundaryTemperature = Constants.BusAuxiliaries.SteadyStateModel.HeatingBoundaryTemperature, + CoolingBoundaryTemperature = Constants.BusAuxiliaries.SteadyStateModel.CoolingBoundaryTemperature, + + SpecificVentilationPower = Constants.BusAuxiliaries.SteadyStateModel.SpecificVentilationPower, + + AuxHeaterEfficiency = Constants.BusAuxiliaries.SteadyStateModel.AuxHeaterEfficiency, + FuelEnergyToHeatToCoolant = Constants.BusAuxiliaries.Heater.FuelEnergyToHeatToCoolant, + CoolantHeatTransferredToAirCabinHeater = Constants.BusAuxiliaries.Heater.CoolantHeatTransferredToAirCabinHeater, + GFactor = Constants.BusAuxiliaries.SteadyStateModel.GFactor, + + VentilationOnDuringHeating = true, + VentilationWhenBothHeatingAndACInactive = true, + VentilationDuringAC = true, + + MaxPossibleBenefitFromTechnologyList = + Constants.BusAuxiliaries.SteadyStateModel.MaxPossibleBenefitFromTechnologyList, + }; + } + + protected virtual Tuple<Watt, Watt> CalculateMaxCoolingPower(IVehicleDeclarationInputData vehicleData, IVehicleDeclarationInputData primaryVehicle, Mission mission) + { + var busParams = mission.BusParameter; + + var length = DeclarationData.BusAuxiliaries.CalculateInternalLength( + busParams.VehicleLength, busParams.VehicleCode, + busParams.NumberPassengersLowerDeck); + var height = DeclarationData.BusAuxiliaries.CalculateInternalHeight(busParams.VehicleCode, RegistrationClass.II, busParams.BodyHeight); + var volume = length * height * busParams.VehicleWidth; + + var driver = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.DriverMaxCoolingPower( + busParams.HVACConfiguration, mission.MissionType); + var passenger = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.PassengerMaxCoolingPower( + busParams.HVACConfiguration, mission.MissionType, volume); + + return Tuple.Create(driver, passenger); + } + + #region Overrides of AuxiliaryDataAdapter + + public override AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData) + { + var actuations = DeclarationData.BusAuxiliaries.ActuationsMap.Lookup(runData.Mission.MissionType); + + var retVal = new AuxiliaryConfig + { + InputData = vehicleData.Components.BusAuxiliaries, + ElectricalUserInputsConfig = GetElectricalUserConfig(mission, vehicleData, actuations, runData.VehicleData.VehicleClass), + PneumaticUserInputsConfig = GetPneumaticUserConfig(vehicleData, mission), + PneumaticAuxillariesConfig = CreatePneumaticAuxConfig(runData.Retarder.Type), + Actuations = actuations, + SSMInputs = CreateSSMModelParameters( + vehicleData.Components.BusAuxiliaries, mission, FuelData.Diesel, runData.Loading), + VehicleData = runData.VehicleData, + }; + + return retVal; + } + + protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, + MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles) + { + if (auxInputData != null) + { + throw new VectoException("Only BusAuxiliaries can be provided as input!"); + } + + if (numSteeredAxles.HasValue && busAuxData.SteeringPumpTechnology.Count != numSteeredAxles.Value) + { + throw new VectoException($"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {busAuxData.SteeringPumpTechnology.Count})"); + } + var retVal = new List<VectoRunData.AuxData>(); + + retVal.Add( + new VectoRunData.AuxData() + { + DemandType = AuxiliaryDemandType.Constant, + Technology = new List<string>() { busAuxData.FanTechnology }, + ID = Constants.Auxiliaries.IDs.Fan, + PowerDemand = DeclarationData.Fan.LookupMechanicalPowerDemand(hdvClass, mission, busAuxData.FanTechnology) + }); + retVal.Add( + new VectoRunData.AuxData() + { + DemandType = AuxiliaryDemandType.Constant, + Technology = busAuxData.SteeringPumpTechnology, + ID = Constants.Auxiliaries.IDs.SteeringPump, + PowerDemand = DeclarationData.SteeringPumpBus.LookupMechanicalPowerDemand( + mission, busAuxData.SteeringPumpTechnology, vehicleLength) + }); + return retVal; + } + + #endregion + } + + +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs new file mode 100644 index 0000000000..577e2922e0 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs @@ -0,0 +1,79 @@ +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IAxleGearDataAdapter + { + AxleGearData CreateAxleGearData(IAxleGearInputData data); + AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData); + } + + public class AxleGearDataAdapterBase : IAxleGearDataAdapter + { + public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) + { + if (double.IsNaN(gbxData.AxlegearRatio)) + { + throw new VectoException( + "Axlegear ratio required in gearbox data for gearboxes with included axlegear"); + } + + return new AxleGearData() + { + AxleGear = new TransmissionData() + { + Ratio = gbxData.AxlegearRatio, + LossMap = TransmissionLossMapReader.Create(1.0, gbxData.AxlegearRatio, "Axlegear") + } + }; + } + internal TransmissionLossMap ReadAxleLossMap(IAxleGearInputData data, bool useEfficiencyFallback) + { + TransmissionLossMap axleLossMap; + if (data.LossMap == null && useEfficiencyFallback) + { + axleLossMap = TransmissionLossMapReader.Create(data.Efficiency, data.Ratio, "Axlegear"); + } + else + { + if (data.LossMap == null) + { + throw new InvalidFileFormatException("LossMap for Axlegear is missing."); + } + axleLossMap = TransmissionLossMapReader.Create(data.LossMap, data.Ratio, "Axlegear", true); + } + if (axleLossMap == null) + { + throw new InvalidFileFormatException("LossMap for Axlegear is missing."); + } + return axleLossMap; + } + internal AxleGearData SetCommonAxleGearData(IAxleGearInputData data) + { + return new AxleGearData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + LineType = data.LineType, + Date = data.Date, + CertificationMethod = data.CertificationMethod, + CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + AxleGear = new GearData { Ratio = data.Ratio } + }; + } + public AxleGearData CreateAxleGearData(IAxleGearInputData data) + { + + var retVal = SetCommonAxleGearData(data); + retVal.AxleGear.LossMap = ReadAxleLossMap(data, false); + return retVal; + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs new file mode 100644 index 0000000000..abb20ce585 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs @@ -0,0 +1,24 @@ +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public abstract class ComponentDataAdapterBase : LoggingObject + { + protected void CheckDeclarationMode(IComponentInputData component, string componentName) + { + if (!component.SavedInDeclarationMode) + { + Log.Warn("{0} not in Declaration Mode!", componentName); + } + } + protected void CheckDeclarationMode(IAuxiliariesDeclarationInputData aux, string componentName) + { + if (!aux.SavedInDeclarationMode) + { + Log.Warn("{0} not in Declaration Mode!", componentName); + } + } + } +} + diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs new file mode 100644 index 0000000000..7fdf303ac1 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IEngineDataAdapter + { + CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, + IEngineModeDeclarationInputData mode, Mission mission); + } + public abstract class EngineComponentDataAdapter : ComponentDataAdapterBase, IEngineDataAdapter + { + internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, NewtonMeter maxTorque) + { + if (maxTorque == null) + { + return engineCurve; + } + + var entries = new List<EngineFullLoadCurve.FullLoadCurveEntry>(); + var firstEntry = engineCurve.FullLoadEntries.First(); + if (firstEntry.TorqueFullLoad < maxTorque) + { + entries.Add(engineCurve.FullLoadEntries.First()); + } + else + { + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { + EngineSpeed = firstEntry.EngineSpeed, + TorqueFullLoad = maxTorque, + TorqueDrag = firstEntry.TorqueDrag + }); + } + foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create)) + { + if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque) + { + // segment is below maxTorque line -> use directly + entries.Add(entry.Item2); + } + else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque) + { + // segment is above maxTorque line -> add limited entry + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { + EngineSpeed = entry.Item2.EngineSpeed, + TorqueFullLoad = maxTorque, + TorqueDrag = entry.Item2.TorqueDrag + }); + } + else + { + // segment intersects maxTorque line -> add new entry at intersection + var edgeFull = Edge.Create( + new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueFullLoad.Value()), + new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueFullLoad.Value())); + var edgeDrag = Edge.Create( + new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueDrag.Value()), + new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueDrag.Value())); + var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; + if (!entries.Any(x => x.EngineSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.EngineSpeed.Value())) + { + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { + EngineSpeed = intersectionX.SI<PerSecond>(), + TorqueFullLoad = maxTorque, + TorqueDrag = VectoMath.Interpolate(edgeDrag.P1, edgeDrag.P2, intersectionX).SI<NewtonMeter>() + }); + } + + entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry + { + EngineSpeed = entry.Item2.EngineSpeed, + TorqueFullLoad = entry.Item2.TorqueFullLoad > maxTorque ? maxTorque : entry.Item2.TorqueFullLoad, + TorqueDrag = entry.Item2.TorqueDrag + }); + } + } + + var flc = new EngineFullLoadCurve(entries.ToList(), engineCurve.PT1Data) + { + EngineData = engineCurve.EngineData, + }; + return flc; + } + protected static WHRData CreateWHRData(IWHRData whrInputData, MissionType missionType, WHRType type) + { + if (whrInputData == null || whrInputData.GeneratedPower == null) + { + throw new VectoException("Missing WHR Data"); + } + + var whr = new WHRData() + { + CFUrban = whrInputData.UrbanCorrectionFactor, + CFRural = whrInputData.RuralCorrectionFactor, + CFMotorway = whrInputData.MotorwayCorrectionFactor, + CFColdHot = whrInputData.BFColdHot, + CFRegPer = whrInputData.CFRegPer, + WHRMap = WHRPowerReader.Create(whrInputData.GeneratedPower, type) + }; + whr.WHRCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( + missionType.GetNonEMSMissionType(), whr.CFRural, whr.CFUrban, + whr.CFMotorway) * whr.CFColdHot * whr.CFRegPer; + return whr; + } + public static CombustionEngineData SetCommonCombustionEngineData(IEngineDeclarationInputData data, TankSystem? tankSystem) + { + var retVal = new CombustionEngineData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + CertificationNumber = data.CertificationNumber, + CertificationMethod = CertificationMethod.Measured, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + Displacement = data.Displacement, + //IdleSpeed = data.IdleSpeed, + //ConsumptionMap = FuelConsumptionMapReader.Create(data.FuelConsumptionMap), + RatedPowerDeclared = data.RatedPowerDeclared, + RatedSpeedDeclared = data.RatedSpeedDeclared, + MaxTorqueDeclared = data.MaxTorqueDeclared, + //FuelData = DeclarationData.FuelData.Lookup(data.FuelType, tankSystem) + MultipleEngineFuelModes = data.EngineModes.Count > 1, + WHRType = data.WHRType, + }; + return retVal; + } + + #region Implementation of IEngineDataAdapter + + public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, + Mission mission) + { + CheckDeclarationMode(vehicle.Components.EngineInputData, "EngineData"); + return DoCreateEngineData(vehicle, mode, mission); + } + + protected abstract CombustionEngineData DoCreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission); + + #endregion + } + + public class CombustionEngineComponentDataAdapter : EngineComponentDataAdapter + { + #region Overrides of EngineDataAdapter + + protected override CombustionEngineData DoCreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) + { + var engine = vehicle.Components.EngineInputData; + var gearbox = vehicle.Components.GearboxInputData; + + var retVal = SetCommonCombustionEngineData(engine, vehicle.TankSystem); + retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed); + + retVal.Fuels = new List<CombustionEngineFuelData>(); + foreach (var fuel in mode.Fuels) + { + retVal.Fuels.Add( + new CombustionEngineFuelData() + { + WHTCUrban = fuel.WHTCUrban, + WHTCRural = fuel.WHTCRural, + WHTCMotorway = fuel.WHTCMotorway, + ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor, + CorrectionFactorRegPer = fuel.CorrectionFactorRegPer, + FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, vehicle.TankSystem), + ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap), + FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( + mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban, + fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer, + }); + } + + retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type); + retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime; + var limits = vehicle.TorqueLimits?.ToDictionary(e => e.Gear) ?? + new Dictionary<int, ITorqueLimitInputData>(); + var numGears = gearbox.Gears.Count; + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); + fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true); + fullLoadCurves[0].EngineData = retVal; + foreach (var gear in gearbox.Gears) + { + var maxTorque = VectoMath.Min( + GearboxDataAdapterBase.GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), + VehicleDataAdapter.VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque)); + fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); + } + + retVal.FullLoadCurves = fullLoadCurves; + + retVal.WHRType = engine.WHRType; + if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) + { + retVal.ElectricalWHR = CreateWHRData( + mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput); + } + + if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) + { + retVal.MechanicalWHR = CreateWHRData( + mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain); + } + + return retVal; + } + + #endregion + } + + +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs new file mode 100644 index 0000000000..6a13d24eaa --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs @@ -0,0 +1,383 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.ShiftStrategy; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IGearboxDataAdapter + { + GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes); + + ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, + PerSecond engineIdlingSpeed); + } + + public abstract class GearboxDataAdapterBase : ComponentDataAdapterBase, IGearboxDataAdapter + { + #region Helper + protected internal static NewtonMeter GbxMaxTorque( + ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque + ) + { + if (gear.Gear - 1 < numGears / 2) + { + // gears count from 1 to n, -> n entries, lower half can always limit + if (gear.MaxTorque != null) + { + return gear.MaxTorque; + } + } + else + { + // upper half can only limit if max-torque <= 90% of engine max torque + if (gear.MaxTorque != null && + gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque) + { + return gear.MaxTorque; + } + } + + return null; + } + public static void CreateTCSecondGearATSerial(GearData gearData, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = gearData.Ratio; + gearData.TorqueConverterGearLossMap = gearData.LossMap; + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + public static void CreateTCFirstGearATSerial(GearData gearData, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = gearData.Ratio; + gearData.TorqueConverterGearLossMap = gearData.LossMap; + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + public static void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = 1; + gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, $"TCGear {i + 1}"); + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + protected virtual void CreateATGearData( + IGearboxDeclarationInputData gearbox, uint i, GearData gearData, + ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears, + VehicleCategory vehicleCategory) + { + if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) + { + // powersplit transmission: torque converter already contains ratio and losses + CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon); + } + + if (gearbox.Type == GearboxType.ATSerial) + { + if (i == 0) + { + // torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode + CreateTCFirstGearATSerial(gearData, tcShiftPolygon); + } + + if (i == 1 && gearDifferenceRatio >= + DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) + { + // ratio between first and second gear is above threshold, torqueconverter is active in second gear as well + // -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear + CreateTCSecondGearATSerial(gearData, tcShiftPolygon); + + // NOTE: the lower gear in 'gears' dictionary has index i !! + gears[i].Ratio = double.NaN; + gears[i].LossMap = null; + } + } + } + + public static TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, + bool useEfficiencyFallback, VehicleCategory vehicleCategory, GearboxType gearboxType) + { + if (gear.LossMap != null) + { + return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, $"Gear {i + 1}", true); + } + if (useEfficiencyFallback) + { + return TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, $"Gear {i + 1}"); + } + throw new InvalidFileFormatException("Gear {0} LossMap missing.", i + 1); + } + #endregion + protected static void SetDeclarationData(GearboxData retVal) + { + retVal.Inertia = DeclarationData.Gearbox.Inertia; + retVal.TractionInterruption = retVal.Type.TractionInterruption(); + } + + protected static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data) + { + return new GearboxData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + CertificationMethod = data.CertificationMethod, + CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ? + data.CertificationNumber : "", + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + Type = data.Type + }; + } + + public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes) + { + CheckDeclarationMode(inputData.Components.GearboxInputData, "Gearbox"); + return DoCreateGearboxData(inputData, runData, shiftPolygonCalculator, supportedGearboxTypes); + } + + protected abstract GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes); + + + public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, + PerSecond engineIdlingSpeed) + { + var retVal = new ShiftStrategyParameters + { + TorqueReserve = DeclarationData.GearboxTCU.TorqueReserve, + StartTorqueReserve = DeclarationData.GearboxTCU.TorqueReserveStart, + TimeBetweenGearshifts = DeclarationData.Gearbox.MinTimeBetweenGearshifts, + StartSpeed = DeclarationData.GearboxTCU.StartSpeed, + StartAcceleration = DeclarationData.GearboxTCU.StartAcceleration, + DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay, + UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay, + UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration, + + StartVelocity = DeclarationData.GearboxTCU.StartSpeed, + GearResidenceTime = DeclarationData.GearboxTCU.GearResidenceTime, + DnT99L_highMin1 = DeclarationData.GearboxTCU.DnT99L_highMin1, + DnT99L_highMin2 = DeclarationData.GearboxTCU.DnT99L_highMin2, + AllowedGearRangeUp = DeclarationData.GearboxTCU.AllowedGearRangeUp, + AllowedGearRangeDown = DeclarationData.GearboxTCU.AllowedGearRangeDown, + LookBackInterval = DeclarationData.GearboxTCU.LookBackInterval, + DriverAccelerationLookBackInterval = DeclarationData.GearboxTCU.DriverAccelerationLookBackInterval, + DriverAccelerationThresholdLow = DeclarationData.GearboxTCU.DriverAccelerationThresholdLow, + AverageCardanPowerThresholdPropulsion = + DeclarationData.GearboxTCU.AverageCardanPowerThresholdPropulsion, + CurrentCardanPowerThresholdPropulsion = + DeclarationData.GearboxTCU.CurrentCardanPowerThresholdPropulsion, + TargetSpeedDeviationFactor = DeclarationData.GearboxTCU.TargetSpeedDeviationFactor, + EngineSpeedHighDriveOffFactor = DeclarationData.GearboxTCU.EngineSpeedHighDriveOffFactor, + RatingFactorCurrentGear = gbx.Type.AutomaticTransmission() + ? DeclarationData.GearboxTCU.RatingFactorCurrentGearAT + : DeclarationData.GearboxTCU.RatingFactorCurrentGear, + AccelerationReserveLookup = AccelerationReserveLookupReader.ReadFromStream( + RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + + ".GearshiftParameters.AccelerationReserveLookup.csv")), + ShareTorque99L = ShareTorque99lLookupReader.ReadFromStream( + RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareTq99L.csv") + ), + PredictionDurationLookup = PredictionDurationLookupReader.ReadFromStream( + RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + + ".GearshiftParameters.PredictionTimeLookup.csv") + ), + ShareIdleLow = ShareIdleLowReader.ReadFromStream( + RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareIdleLow.csv") + ), + ShareEngineHigh = EngineSpeedHighLookupReader.ReadFromStream( + RessourceHelper.ReadStream( + DeclarationData.DeclarationDataResourcePrefix + + ".GearshiftParameters.ShareEngineSpeedHigh.csv") + ), + + //-------------------- + RatioEarlyUpshiftFC = DeclarationData.GearboxTCU.RatioEarlyUpshiftFC / axleRatio, + RatioEarlyDownshiftFC = DeclarationData.GearboxTCU.RatioEarlyDownshiftFC / axleRatio, + AllowedGearRangeFC = gbx.Type.AutomaticTransmission() + ? (gbx.Gears.Count > DeclarationData.GearboxTCU.ATSkipGearsThreshold + ? DeclarationData.GearboxTCU.AllowedGearRangeFCATSkipGear + : DeclarationData.GearboxTCU.AllowedGearRangeFCAT) + : DeclarationData.GearboxTCU.AllowedGearRangeFCAMT, + VelocityDropFactor = DeclarationData.GearboxTCU.VelocityDropFactor, + AccelerationFactor = DeclarationData.GearboxTCU.AccelerationFactor, + MinEngineSpeedPostUpshift = 0.RPMtoRad(), + ATLookAheadTime = DeclarationData.GearboxTCU.ATLookAheadTime, + + LoadStageThresoldsUp = DeclarationData.GearboxTCU.LoadStageThresholdsUp, + LoadStageThresoldsDown = DeclarationData.GearboxTCU.LoadStageThresoldsDown, + ShiftSpeedsTCToLocked = DeclarationData.GearboxTCU.ShiftSpeedsTCToLocked + .Select(x => x.Select(y => y + engineIdlingSpeed.AsRPM).ToArray()).ToArray(), + }; + + return retVal; + } + } + + public class GearboxDataAdapter : GearboxDataAdapterBase + { + private readonly ITorqueConverterDataAdapter _torqueConverterDataAdapter; + + public GearboxDataAdapter(ITorqueConverterDataAdapter torqueConverterDataAdapter) + { + _torqueConverterDataAdapter = torqueConverterDataAdapter; + } + #region Overrides of GearBoxDataAdapterBase + + protected override GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes) + { + var gearbox = inputData.Components.GearboxInputData; + + var adas = inputData.ADAS; + var torqueConverter = inputData.Components.TorqueConverterInputData; + + var engine = runData.EngineData; + var axlegearRatio = runData.AxleGearData.AxleGear.Ratio; + var dynamicTyreRadius = runData.VehicleData.DynamicTyreRadius; + + var retVal = SetCommonGearboxData(gearbox); + + //if (adas != null && retVal.Type.AutomaticTransmission() && adas.EcoRoll != EcoRollType.None && + // !adas.ATEcoRollReleaseLockupClutch.HasValue) { + // throw new VectoException("Input parameter ATEcoRollReleaseLockupClutch required for AT transmission"); + //} + + retVal.ATEcoRollReleaseLockupClutch = + adas != null && adas.EcoRoll != EcoRollType.None && retVal.Type.AutomaticTransmission() + ? (adas.ATEcoRollReleaseLockupClutch.HasValue ? adas.ATEcoRollReleaseLockupClutch.Value : false) + : false; + + if (!supportedGearboxTypes.Contains(gearbox.Type)) + { + throw new VectoSimulationException("Unsupported gearbox type: {0}!", retVal.Type); + } + + var gearsInput = gearbox.Gears; + if (gearsInput.Count < 1) + { + throw new VectoSimulationException( + "At least one Gear-Entry must be defined in Gearbox!"); + } + + SetDeclarationData(retVal); + + var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2 + ? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio + : 1.0; + + var gears = new Dictionary<uint, GearData>(); + var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]); + 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, gearbox.Type); + + var shiftPolygon = shiftPolygonCalculator != null + ? shiftPolygonCalculator.ComputeDeclarationShiftPolygon( + gearbox.Type, (int)i, engine.FullLoadCurves[i + 1], gearbox.Gears, engine, axlegearRatio, + dynamicTyreRadius) + : DeclarationData.Gearbox.ComputeShiftPolygon( + gearbox.Type, (int)i, engine.FullLoadCurves[i + 1], + gearsInput, engine, + axlegearRatio, dynamicTyreRadius, null); + + var gearData = new GearData + { + ShiftPolygon = shiftPolygon, + MaxSpeed = gear.MaxInputSpeed, + MaxTorque = gear.MaxTorque, + Ratio = gear.Ratio, + LossMap = lossMap, + }; + + CreateATGearData(gearbox, i, gearData, tcShiftPolygon, gearDifferenceRatio, gears, + runData.VehicleData.VehicleCategory); + gears.Add(i + 1, gearData); + } + + // remove disabled gears (only the last or last two gears may be removed) + if (inputData.TorqueLimits != null) + { + var toRemove = (from tqLimit in inputData.TorqueLimits + where tqLimit.Gear >= gears.Keys.Max() - 1 && tqLimit.MaxTorque.IsEqual(0) + select (uint)tqLimit.Gear).ToList(); + if (toRemove.Count > 0 && toRemove.Min() <= gears.Count - toRemove.Count) + { + throw new VectoException( + "Only the last 1 or 2 gears can be disabled. Disabling gear {0} for a {1}-speed gearbox is not allowed.", + toRemove.Min(), gears.Count); + } + + foreach (var entry in toRemove) + { + gears.Remove(entry); + } + } + + retVal.Gears = gears; + 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 = + _torqueConverterDataAdapter.CreateTorqueConverterData(gearbox.Type, torqueConverter, ratio, engine); + + if (torqueConverter != null) + { + retVal.TorqueConverterData.Manufacturer = torqueConverter.Manufacturer; + retVal.TorqueConverterData.ModelName = torqueConverter.Model; + retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue; + retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod; + retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber; + retVal.TorqueConverterData.Date = torqueConverter.Date; + retVal.TorqueConverterData.AppVersion = torqueConverter.AppVersion; + } + } + + // update disengageWhenHaltingSpeed + if (retVal.Type.AutomaticTransmission()) + { + var firstGear = retVal.GearList.First(x => x.IsLockedGear()); + if (retVal.Gears[firstGear.Gear].ShiftPolygon.Downshift.Any()) + { + var downshiftSpeedInc = retVal.Gears[firstGear.Gear].ShiftPolygon + .InterpolateDownshiftSpeed(0.SI<NewtonMeter>()) * 1.05; + var vehicleSpeedDisengage = + downshiftSpeedInc / axlegearRatio / retVal.Gears[firstGear.Gear].Ratio * + dynamicTyreRadius; + retVal.DisengageWhenHaltingSpeed = vehicleSpeedDisengage; + } + } + + return retVal; + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs new file mode 100644 index 0000000000..49f5ba3741 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs @@ -0,0 +1,40 @@ +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IPTODataAdapter + { + PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto); + } + + public class PTODataAdapterLorry : IPTODataAdapter + { + public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto) + { + if (pto != null && pto.PTOTransmissionType != "None") + { + return new PTOData + { + TransmissionType = pto.PTOTransmissionType, + LossMap = PTOIdleLossMapReader.GetZeroLossMap(), + }; + } + + return null; + } + } + + public class PTODataAdapterBus : IPTODataAdapter + { + #region Implementation of IPTODataAdapter + + public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto) + { + return null; + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs new file mode 100644 index 0000000000..9461ddf32f --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs @@ -0,0 +1,88 @@ +using System; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IRetarderDataAdapter + { + RetarderData CreateRetarderData(IRetarderInputData retarder); + } + public class RetarderDataAdapter : IRetarderDataAdapter + { + public RetarderData CreateRetarderData(IRetarderInputData retarder) + { + return SetCommonRetarderData(retarder); + } + internal static RetarderData SetCommonRetarderData(IRetarderInputData retarderInputData, + PowertrainPosition position = PowertrainPosition.HybridPositionNotSet) + { + try + { + var retarder = new RetarderData { Type = retarderInputData.Type }; + + switch (retarder.Type) + { + case RetarderType.TransmissionInputRetarder: + case RetarderType.TransmissionOutputRetarder: + if (!(position.IsParallelHybrid() || position.IsOneOf(PowertrainPosition.HybridPositionNotSet, PowertrainPosition.BatteryElectricE2))) + { + throw new ArgumentException("Transmission retarder is only allowed in powertrains that " + + "contain a gearbox: Conventional, HEV-P, and PEV-E2.", nameof(retarder)); + } + + retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap); + retarder.Ratio = retarderInputData.Ratio; + break; + + case RetarderType.AxlegearInputRetarder: + if (position != PowertrainPosition.BatteryElectricE3) + throw new ArgumentException("AxlegearInputRetarder is only allowed for PEV-E3, HEV-S3, S-IEPC, E-IEPC. ", nameof(retarder)); + retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap); + retarder.Ratio = retarderInputData.Ratio; + break; + + case RetarderType.None: + case RetarderType.LossesIncludedInTransmission: + case RetarderType.EngineRetarder: + retarder.Ratio = 1; + break; + + default: + throw new ArgumentOutOfRangeException(nameof(retarder), retarder.Type, "RetarderType unknown"); + } + + if (retarder.Type.IsDedicatedComponent()) + { + retarder.SavedInDeclarationMode = retarderInputData.SavedInDeclarationMode; + retarder.Manufacturer = retarderInputData.Manufacturer; + retarder.ModelName = retarderInputData.Model; + retarder.Date = retarderInputData.Date; + retarder.CertificationMethod = retarderInputData.CertificationMethod; + retarder.CertificationNumber = retarderInputData.CertificationNumber; + retarder.DigestValueInput = retarderInputData.DigestValue != null ? retarderInputData.DigestValue.DigestValue : ""; + } + + return retarder; + } + catch (Exception e) + { + throw new VectoException("Error while Reading Retarder Data: {0}", e.Message); + } + } + } + + public class GenericRetarderDataAdapter : IRetarderDataAdapter + { + private readonly GenericBusRetarderData _genericRetarderData = new GenericBusRetarderData(); + public RetarderData CreateRetarderData(IRetarderInputData retarder) + { + return _genericRetarderData.CreateGenericBusRetarderData(retarder); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs new file mode 100644 index 0000000000..eb7d615599 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs @@ -0,0 +1,53 @@ +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface ITorqueConverterDataAdapter + { + TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType, + ITorqueConverterDeclarationInputData torqueConverter, double ratio, + CombustionEngineData engineData); + } + public class TorqueConverterDataAdapter : ITorqueConverterDataAdapter + { + public virtual TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType, + ITorqueConverterDeclarationInputData torqueConverter, double ratio, + CombustionEngineData engineData) + { + return TorqueConverterDataReader.Create( + torqueConverter.TCData, + DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, + ExecutionMode.Declaration, ratio, + DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, + DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + } + } + + public class GenericCompletedBusTorqueConverterDataAdapter : ITorqueConverterDataAdapter + { + private readonly GenericTorqueConverterData _genericTorqueConverterData = new GenericTorqueConverterData(); + #region Implementation of ITorqueConverterDataAdapter + + public TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType, + ITorqueConverterDeclarationInputData torqueConverter, double ratio, CombustionEngineData engineData) + { + if (torqueConverter != null && torqueConverter.TCData != null) + { + return TorqueConverterDataReader.Create( + torqueConverter.TCData, + DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, + ExecutionMode.Engineering, ratio, + DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, + DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + } + return _genericTorqueConverterData.CreateTorqueConverterData(gearboxType, ratio, engineData); + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs new file mode 100644 index 0000000000..669bdec7ec --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs @@ -0,0 +1,247 @@ + +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public interface IVehicleDataAdapter + { + VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Segment segment, Mission mission, + Kilogram loading, double? passengerCount, bool allowVocational); + VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data); + } + internal abstract class VehicleDataAdapter : ComponentDataAdapterBase, IVehicleDataAdapter + { + public static NewtonMeter VehMaxTorque( + ITransmissionInputData gear, int numGears, + Dictionary<int, ITorqueLimitInputData> limits, + NewtonMeter maxEngineTorque) + { + if (gear.Gear - 1 >= numGears / 2) + { + // only upper half of gears can limit if max-torque <= 0.95 of engine max torque + if (limits.TryGetValue(gear.Gear, out var limit) && limit.MaxTorque <= + DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque) + { + return limit.MaxTorque; + } + } + + return null; + } + protected readonly IADASDataAdapter _adasDataAdapter = new ADASDataAdapter(); + internal static VehicleData SetCommonVehicleData(IVehicleDeclarationInputData data) + { + var retVal = new VehicleData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + //CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + VehicleCategory = data.VehicleCategory, + CurbMass = data.CurbMassChassis, + GrossVehicleMass = data.GrossVehicleMassRating, + AirDensity = Physics.AirDensity, + }; + + return retVal; + } + + + #region Implementation of IVehicleDataAdapter + + public VehicleData CreateVehicleData(IVehicleDeclarationInputData data, + Segment segment, + Mission mission, + Kilogram loading, + double? passengerCount, + bool allowVocational) + { + CheckDeclarationMode(data, "Vehicle"); + return DoCreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational); + } + protected abstract VehicleData DoCreateVehicleData(IVehicleDeclarationInputData data, + Segment segment, + Mission mission, + Kilogram loading, + double? passengerCount, + bool allowVocational); + + public VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data) + { + CheckDeclarationMode(data, "Vehicle"); + return DoCreateExemptedVehicleData(data); + } + + protected abstract VehicleData DoCreateExemptedVehicleData(IVehicleDeclarationInputData data); + + #endregion + } + + internal class LorryVehicleDataAdapter : VehicleDataAdapter + { + protected override VehicleData DoCreateVehicleData(IVehicleDeclarationInputData data, + Segment segment, Mission mission, Kilogram loading, double? passengerCount, bool allowVocational) + { + var retVal = SetCommonVehicleData(data); + retVal.LegislativeClass = data.LegislativeClass; + 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.VehicleClass = segment.VehicleClass; + retVal.SleeperCab = retVal.VehicleClass.IsMediumLorry() ? false : data.SleeperCab; + retVal.TrailerGrossVehicleMass = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0); + + retVal.BodyAndTrailerMass = + mission.BodyCurbWeight + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0); + + retVal.Loading = loading; + retVal.PassengerCount = passengerCount; + retVal.DynamicTyreRadius = + data.Components.AxleWheels.AxlesDeclaration.Where(axle => axle.AxleType == AxleType.VehicleDriven) + .Select(da => DeclarationData.Wheels.Lookup(da.Tyre.Dimension).DynamicTyreRadius) + .Average(); + if (segment.VehicleClass.IsMediumLorry() && segment.VehicleClass.IsVan()) + { + retVal.CargoVolume = data.CargoVolume; + } + else + { + retVal.CargoVolume = mission.MissionType != MissionType.Construction + ? mission.TotalCargoVolume + : 0.SI<CubicMeter>(); + } + + retVal.VocationalVehicle = allowVocational && data.VocationalVehicle; + retVal.ADAS = _adasDataAdapter.CreateADAS(data.ADAS); + + var axles = data.Components.AxleWheels.AxlesDeclaration; + if (axles.Count < mission.AxleWeightDistribution.Length) + { + throw new VectoException( + "Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required", + axles.Count, mission.AxleWeightDistribution.Length); + } + + var axleData = new List<Axle>(); + for (var i = 0; i < mission.AxleWeightDistribution.Length; i++) + { + var axleInput = axles[i]; + var axle = new Axle + { + WheelsDimension = axleInput.Tyre.Dimension, + AxleType = axleInput.AxleType, + AxleWeightShare = mission.AxleWeightDistribution[i], + TwinTyres = axleInput.TwinTyres, + RollResistanceCoefficient = axleInput.Tyre.RollResistanceCoefficient, + TyreTestLoad = axleInput.Tyre.TyreTestLoad, + FuelEfficiencyClass = axleInput.Tyre.FuelEfficiencyClass, + Inertia = DeclarationData.Wheels.Lookup(axleInput.Tyre.Dimension.RemoveWhitespace()).Inertia, + CertificationNumber = axleInput.Tyre.CertificationNumber, + DigestValueInput = axleInput.Tyre.DigestValue == null + ? "" + : axleInput.Tyre.DigestValue.DigestValue, + }; + axleData.Add(axle); + } + + 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>(), + FuelEfficiencyClass = DeclarationData.Trailer.FuelEfficiencyClass, + Inertia = trailerWheel.Inertia, + WheelsDimension = trailerWheel.WheelType + })); + } + + retVal.AxleData = axleData; + return retVal; + } + + protected override VehicleData DoCreateExemptedVehicleData(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 class PrimaryBusVehicleDataAdapter : LorryVehicleDataAdapter + { + #region Overrides of VehicleDataAdapter + + protected override VehicleData DoCreateVehicleData(IVehicleDeclarationInputData data, Segment segment, Mission mission, Kilogram loading, + double? passengerCount, bool allowVocational) + { + var retVal = base.CreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational); + if (data.ExemptedVehicle) + { + System.Diagnostics.Debug.Assert( false, "CreateExemptedVehicleData should be used"); + return retVal; + } + retVal.CurbMass = mission.CurbMass; + retVal.GrossVehicleMass = 40000.SI<Kilogram>(); + return retVal; + } + + #endregion + + protected override VehicleData DoCreateExemptedVehicleData(IVehicleDeclarationInputData data) + { + var exempted = new VehicleData + { + InputData = data, + SavedInDeclarationMode = data.SavedInDeclarationMode, + Manufacturer = data.Manufacturer, + ModelName = data.Model, + Date = data.Date, + //CertificationNumber = data.CertificationNumber, + DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "", + VehicleCategory = data.VehicleCategory, + //CurbMass = data.CurbMassChassis, + GrossVehicleMass = data.GrossVehicleMassRating, + AirDensity = Physics.AirDensity, + }; + 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; + exempted.AxleConfiguration = data.AxleConfiguration; + return exempted; + } + + } +} diff --git a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs index bc24206808..73e944e9c2 100644 --- a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs @@ -16,7 +16,7 @@ namespace TUGraz.VectoCore.InputData.Reader { public interface IInternalRunDataFactoryFactory { - + IVectoRunDataFactory CreateSingleBusRunDataFactory(); IVectoRunDataFactory CreateDeclarationRunDataFactory(VehicleTypeAndArchitectureStringHelperRundata.VehicleClassification vehicleClassification, IDeclarationInputDataProvider dataProvider, IDeclarationReport report); @@ -119,7 +119,8 @@ namespace TUGraz.VectoCore.InputData.Reader private IVectoRunDataFactory CreateRunDataReader(ISingleBusInputDataProvider singleBusProvider, IDeclarationReport report) { - return new DeclarationModeSingleBusVectoRunDataFactory(singleBusProvider, report); + throw new NotImplementedException(); + //return new DeclarationModeSingleBusVectoRunDataFactory(singleBusProvider, report); } diff --git a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs index 85c9413168..c40b0149f0 100644 --- a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs +++ b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs @@ -33,27 +33,13 @@ namespace TUGraz.VectoCore.InputData.Reader () => new CombineArgumentsToNameInstanceProvider( new CombineArgumentsToNameInstanceProvider.MethodSettings() { combineToNameDelegate = _vehicleStringHelper.CreateName, - methods = new [] { + methods = new [] { typeof(IInternalRunDataFactoryFactory) .GetMethod(nameof(IInternalRunDataFactoryFactory - .CreateDeclarationRunDataFactory), - new [] - { - typeof(VehicleTypeAndArchitectureStringHelperRundata.VehicleClassification), - typeof(IDeclarationInputDataProvider), - typeof(IDeclarationReport) - } - ), + .CreateDeclarationRunDataFactory)), typeof(IInternalRunDataFactoryFactory) .GetMethod(nameof(IInternalRunDataFactoryFactory - .CreateDeclarationCompletedBusRunDataFactory)//, - //new [] - //{ - // typeof(VehicleTypeAndArchitectureStringHelperRundata.VehicleClassification), - // typeof(IDeclarationInputDataProvider), - // typeof(IDeclarationReport) - //} - ) + .CreateDeclarationCompletedBusRunDataFactory)) }, skipArguments = 1, takeArguments = 1, diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs index e8fd9298b6..86610f8f3f 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs @@ -16,9 +16,7 @@ using Newtonsoft.Json; using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; -using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; -using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics { @@ -41,7 +39,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric public AlternatorType AlternatorType { get; set; } [JsonIgnore] - public Dictionary<string, ElectricConsumerEntry> ElectricalConsumers { get; set; } + public Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> ElectricalConsumers { get; set; } public string[] ElectricalConsumersSerialized { diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 65670ee07e..161fb79169 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -134,7 +134,6 @@ <ItemGroup> <Folder Include="InputData\Reader\DataObjectAdapter\CompletedBus\Generic\" /> - <Folder Include="InputData\Reader\DataObjectAdapter\SimulationComponents\" /> </ItemGroup> </Project> \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs index f38a4d8a33..a48fe62e1d 100644 --- a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs +++ b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel.Design; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -16,7 +17,6 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Generic; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Specific; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; -using TUGraz.VectoCore.InputData.Reader.Impl; using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRunDataFactory; using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDataFactory; using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFactory; @@ -24,6 +24,7 @@ using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFa namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory { [TestFixture] + [Parallelizable(ParallelScope.All)] internal class RunDataFactoryFactoryTest { private IVectoRunDataFactoryFactory _runDataFactoryFactory; @@ -221,7 +222,7 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory } [Test] - public void Exempted_HeavyLorryTest([Values]ArchitectureID architectureId, [Values]VectoSimulationJobType simType) + public void Exempted_HeavyLorryTest([Values]ArchitectureID architectureId, [Values]VectoSimulationJobType simType, [Values]bool checkDeclarationDataAdapter) { var input = new Mock<IDeclarationInputDataProvider>() .Exempted() @@ -229,7 +230,8 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory input.Setup(m => m.JobInputData.JobType).Returns(simType); input.Setup(m => m.JobInputData.Vehicle.ArchitectureID).Returns(architectureId); - CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.Exempted), null); + CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.Exempted), + checkDeclarationDataAdapter ? typeof(DeclarationDataAdapterHeavyLorry.Exempted) : null); } @@ -380,7 +382,7 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory [Test] - public void Exempted_PrimaryBusTest([Values] ArchitectureID architectureId, [Values] VectoSimulationJobType simType) + public void Exempted_PrimaryBusTest([Values] ArchitectureID architectureId, [Values] VectoSimulationJobType simType, [Values] bool checkDeclarationDataAdapter) { var input = new Mock<IDeclarationInputDataProvider>() .Exempted() @@ -388,7 +390,7 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory input.Setup(m => m.JobInputData.JobType).Returns(simType); input.Setup(m => m.JobInputData.Vehicle.ArchitectureID).Returns(architectureId); - CreateRunDataFactory(input, typeof(DeclarationModePrimaryBusRunDataFactory.Exempted), null); + CreateRunDataFactory(input, typeof(DeclarationModePrimaryBusRunDataFactory.Exempted), checkDeclarationDataAdapter ? typeof(DeclarationDataAdapterPrimaryBus.Exempted) : null); } -- GitLab