diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/AirCompressorTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/AirCompressorTests.vb index 649fa409a9368d7d80f84b9f4717fd91f13da8be..42b29219096dd2fe772f17b0e0e7475eb33740b1 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/AirCompressorTests.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/AirCompressorTests.vb @@ -43,9 +43,9 @@ Namespace UnitTests Return New CompressorMapMock(True) End Function - Private Function GetGoodCompressor() As IM4_AirCompressor + Private Function GetGoodCompressor() As M04Impl Dim map As ICompressorMap = GetNonFailingCompressorMapMock() - Dim target As IM4_AirCompressor = New M04Impl(map, GoodRatio, GoodEfficiency, _signals) + Dim target As M04Impl = New M04Impl(map, GoodRatio, GoodEfficiency, _signals) Return target End Function @@ -94,7 +94,7 @@ Namespace UnitTests <TestCase()> Public Sub SetEfficiencyTest() - Dim comp As IM4_AirCompressor = GetGoodCompressor() + Dim comp = GetGoodCompressor() Dim target As Double = 0.3 comp.PulleyGearEfficiency = target Dim actual As Double = comp.PulleyGearEfficiency @@ -104,7 +104,7 @@ Namespace UnitTests <TestCase(TooLowEfficiency)> <TestCase(TooHighEfficiency)> Public Sub SetEfficiencyOutOfRangeTest(ByVal efficiency As Single) - Dim comp As IM4_AirCompressor = GetGoodCompressor() + Dim comp = GetGoodCompressor() Assert.That(Sub() comp.PulleyGearEfficiency = efficiency, Throws.InstanceOf(Of ArgumentException)) End Sub @@ -119,7 +119,7 @@ Namespace UnitTests <TestCase()> Public Sub SetRatioTest() - Dim comp As IM4_AirCompressor = GetGoodCompressor() + Dim comp = GetGoodCompressor() Dim target As Double = 3 comp.PulleyGearRatio = target Dim actual As Double = comp.PulleyGearRatio @@ -129,7 +129,7 @@ Namespace UnitTests <TestCase(TooLowRatio)> <TestCase(TooHighRatio)> Public Sub SetRatioOutOfRangeTest(ByVal ratio As Single) - Dim comp As IM4_AirCompressor = GetGoodCompressor() + Dim comp = GetGoodCompressor() Assert.That(Sub() comp.PulleyGearRatio = ratio, Throws.InstanceOf(Of ArgumentException)) End Sub diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs index 3c26f069441ab03d78da343b9ccae0e0558bb144..0406a991972bc8f80644814eed5a59577b2e0c7a 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs @@ -111,15 +111,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter VectoRunData runData, IShiftPolygonCalculator shiftPolygonCalc); - //RetarderData CreateRetarderData(IRetarderInputData retarderData); - //PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData); - ShiftStrategyParameters CreateGearshiftData(double axleRatio, PerSecond engineIdlingSpeed, GearboxType gearboxType, int gearsCount); - //VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, - // KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational); - CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, Mission mission); @@ -138,8 +132,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter public interface IGenericCompletedBusDeclarationDataAdapter : IDeclarationDataAdapter { - //VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, - // KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational); AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment); @@ -160,8 +152,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed); - //RetarderData CreateRetarderData(IRetarderInputData retarderData); - DriverData CreateDriverData(Segment segment); IAuxiliaryConfig CreateBusAuxiliariesData( diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs index ecea0fff887bfce838528b738adc1161f37d9ce6..c79ae26219b1eb1d20332c34a5d5d1d8691585ed 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs @@ -535,7 +535,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { KneelingHeight = VectoMath.Max(0.SI<Meter>(), mission.BusParameter.EntranceHeight - Constants.BusParameters.EntranceHeight), CompressorGearEfficiency = Constants.BusAuxiliaries.PneumaticUserConfig.CompressorGearEfficiency, - CompressorGearRatio = busAux.PneumaticSupply.Ratio, + CompressorGearRatio = busAux.PneumaticSupply.CompressorDrive == CompressorDrive.electrically ? 0.0 : busAux.PneumaticSupply.Ratio, CompressorMap = DeclarationData.BusAuxiliaries.GetCompressorMap(busAux.PneumaticSupply), SmartAirCompression = busAux.PneumaticSupply.SmartAirCompression, SmartRegeneration = busAux.PneumaticSupply.SmartRegeneration, diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs index 63fb0b35fafa4618ef201c973664d47698ab16b0..8e76c0a3b7dcb93f5c8d75d8c48517f52bf6c884 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs @@ -74,9 +74,11 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries M3 = new M03Impl(auxConfig, compressorMap, auxCfg.Actuations, Signals); - M4 = new M04Impl( - compressorMap, auxConfig.PneumaticUserInputsConfig.CompressorGearRatio, - auxConfig.PneumaticUserInputsConfig.CompressorGearEfficiency, Signals); + M4 = compressorMap == null + ? (IM4_AirCompressor)new M04Impl_NoMechanicalCompressor() + : new M04Impl( + compressorMap, auxConfig.PneumaticUserInputsConfig.CompressorGearRatio, + auxConfig.PneumaticUserInputsConfig.CompressorGearEfficiency, Signals); M5 = new M05Impl_P0(M0, M1, M2, ElectricStorage, electricUserInputConfigNoAlternator, Signals); M6 = new M06Impl(electricUserInputConfigNoAlternator, M1, M2, M3, M4, M5, Signals); @@ -204,9 +206,11 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries M3 = new M03Impl(auxConfig, compressorMap, auxCfg.Actuations, Signals); - M4 = new M04Impl( - compressorMap, auxConfig.PneumaticUserInputsConfig.CompressorGearRatio, - auxConfig.PneumaticUserInputsConfig.CompressorGearEfficiency, Signals); + M4 = compressorMap == null + ? (IM4_AirCompressor)new M04Impl_NoMechanicalCompressor() + : new M04Impl( + compressorMap, auxConfig.PneumaticUserInputsConfig.CompressorGearRatio, + auxConfig.PneumaticUserInputsConfig.CompressorGearEfficiency, Signals); //M5 = new M05Impl( // M0_5, auxConfig.ElectricalUserInputsConfig.PowerNetVoltage, diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs index 5cd7e5147c28dbcf65f273f59c7ceafd83b1f4be..0c372f64f2f0c216270a1d68079b857bfd10143d 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs @@ -41,6 +41,9 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati private readonly IList<CompressorMapValues> Entries; + private PerSecond _maxSpeed; + private PerSecond _minSpeed; + // Returns the AveragePowerDemand per unit flow rate in seconds. public JoulePerNormLiter GetAveragePowerDemandPerCompressorUnitFlowRate() { @@ -76,12 +79,14 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati public string Source { get; } + protected PerSecond MinSpeed => _minSpeed ?? (_minSpeed = Entries.Min(x => x.CompressorSpeed)); + protected PerSecond MaxSpeed => _maxSpeed ?? (_maxSpeed = Entries.Max(x => x.CompressorSpeed)); public CompressorResult Interpolate(PerSecond rpm) { var retVal = new CompressorResult(); - var min = Entries.Min(x => x.CompressorSpeed); - var max = Entries.Max(x => x.CompressorSpeed); + var min = MinSpeed; + var max = MaxSpeed; if (rpm < min || rpm > max) { retVal.BoundariesExceeded = true; rpm = rpm.LimitTo(min, max); diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs index 1ae9f502d0a07f21ec1f91175216281731b8c572..a788e098daf1f6b5be4144e5d65f36b271fdfb70 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs @@ -84,6 +84,9 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati public Watt GetAveragePowerDemandAtCrankFromPneumatics() { + if (_pneumaticsCompressorFlowRateMap == null) { + return 0.SI<Watt>(); + } var cmp = _pneumaticsCompressorFlowRateMap.Interpolate( _signals.EngineSpeed * _compressorGearRatio); diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M04Impl_NoMechanicalCompressor.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M04Impl_NoMechanicalCompressor.cs new file mode 100644 index 0000000000000000000000000000000000000000..cf1d1b452abcc200ec0225166dfc98db6fadce57 --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M04Impl_NoMechanicalCompressor.cs @@ -0,0 +1,48 @@ +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics +{ + public class M04Impl_NoMechanicalCompressor : IM4_AirCompressor + { + #region Implementation of IAbstractModule + + public void ResetCalculations() + { + + } + + #endregion + + #region Implementation of IM4_AirCompressor + + public double PulleyGearRatio => double.NaN; + public double PulleyGearEfficiency => double.NaN; + public NormLiterPerSecond GetFlowRate() + { + return 0.SI<NormLiterPerSecond>(); + } + + public Watt GetPowerCompressorOff() + { + return 0.SI<Watt>(); + } + + public Watt GetPowerCompressorOn() + { + return 0.SI<Watt>(); + } + + public Watt GetPowerDifference() + { + return 0.SI<Watt>(); + } + + public JoulePerNormLiter GetAveragePowerDemandPerCompressorUnitFlowRate() + { + return 0.SI<JoulePerNormLiter>(); + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/IM4_AirCompressor.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/IM4_AirCompressor.cs index 91c64d445f8a4ef7c28360210533b00ad4e98247..1797c6ae5203ce74724aef909adc4e5395bdb0b2 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/IM4_AirCompressor.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/IM4_AirCompressor.cs @@ -22,7 +22,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules /// <value></value> /// <returns></returns> /// <remarks></remarks> - double PulleyGearRatio { get; set; } + double PulleyGearRatio { get; } /// <summary> /// Efficiency of the Pulley or Gear used to drive the compressor @@ -30,7 +30,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules /// <value></value> /// <returns></returns> /// <remarks></remarks> - double PulleyGearEfficiency { get; set; } + double PulleyGearEfficiency { get; } /// <summary> diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 6e54283f1b831d6bb9489cf5d1c352e218f78a4a..a153241ef1ae84e385e60771aa14df67da25f581 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -293,9 +293,9 @@ namespace TUGraz.VectoCore.Models.Declaration if (pneumaticSupply.CompressorDrive == CompressorDrive.electrically) { return null; - //var size = GetCompressorResourceForSize("Small"); - //return CompressorMapReader.ReadStream( - // RessourceHelper.ReadStream(DeclarationDataResourcePrefix + ".VAUXBus." + size), 1, $"{compressorSize} - {clutchType}"); + //var size = GetCompressorResourceForSize("electrically"); + // return CompressorMapReader.ReadStream( + // RessourceHelper.ReadStream(DeclarationDataResourcePrefix + ".VAUXBus." + size), 1, $"{compressorSize} - {clutchType}"); } var resource = GetCompressorResourceForSize(compressorSize); @@ -322,6 +322,7 @@ namespace TUGraz.VectoCore.Models.Declaration case "Medium Supply 2-stage": return "DEFAULT_2-Cylinder_1-Stage_650ccm.acmp"; case "Large Supply 1-stage": return "DEFAULT_2-Cylinder_2-Stage_398ccm.acmp"; case "Large Supply 2-stage": return "DEFAULT_3-Cylinder_2-Stage_598ccm.acmp"; + //case "electrically": return "DEFAULT_electrically.acmp"; default: throw new ArgumentException($"unknown compressor size {compressorSize}", compressorSize); } } diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_1-Cylinder_1-Stage_393ccm.acmp b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_1-Cylinder_1-Stage_393ccm.acmp index 3825e555a14cbf566c54033a67564b64790e38d7..0baf2277941937e9238b2ad9b62288b1198cd23d 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_1-Cylinder_1-Stage_393ccm.acmp +++ b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_1-Cylinder_1-Stage_393ccm.acmp @@ -1,12 +1,12 @@ -rpm,flowRate [l/min],power on [W],power off [W] -500,83.42357042,1428,181.9 -750,141.6565216,1890,342.4 -1000,198.5612781,2467.5,513.6 -1250,241.9965577,3097.5,716.9 -1500,293.5664883,3759,866.7 -1750,335.5358341,4294.5,1080.7 -2000,398.488427,5166,1273.3 -2250,425.0944822,6006,1433.8 -2500,458.3225806,6541.5,1540.8 -2750,478.2312925,7066.5,1712 -3000,511.85438,7665,1958.1 +rpm , flowRate [l/min] , power on [W] , power off [W] +500 , 83.42357042 , 1428 , 181.9 +750 , 141.6565216 , 1890 , 342.4 +1000 , 198.5612781 , 2467.5 , 513.6 +1250 , 241.9965577 , 3097.5 , 716.9 +1500 , 293.5664883 , 3759 , 866.7 +1750 , 335.5358341 , 4294.5 , 1080.7 +2000 , 398.488427 , 5166 , 1273.3 +2250 , 425.0944822 , 6006 , 1433.8 +2500 , 458.3225806 , 6541.5 , 1540.8 +2750 , 478.2312925 , 7066.5 , 1712 +3000 , 511.85438 , 7665 , 1958.1 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_1-Stage_650ccm.acmp b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_1-Stage_650ccm.acmp index 988a3bd5ef83cc6f54babb5747d4741f682ae74a..960cea5dfa185fd01e1c3ae500c2275e6a85cb67 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_1-Stage_650ccm.acmp +++ b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_1-Stage_650ccm.acmp @@ -1,9 +1,9 @@ -rpm,flowRate [l/min],power on [W],power off [W] -800,250.5365596,3139.5,524.3 -1200,374.3533986,4609.5,1027.2 -1600,508.4123859,6205.5,1572.9 -2000,619.1263282,7770,2065.1 -2400,762.6185788,9723,2696.4 -2550,819.2371476,10363.5,2856.9 -2800,898.7501978,11613,3349.1 -3200,979.4827586,13282.5,4012.5 +rpm , flowRate [l/min] , power on [W] , power off [W] +800 , 250.5365596 , 3139.5 , 524.3 +1200 , 374.3533986 , 4609.5 , 1027.2 +1600 , 508.4123859 , 6205.5 , 1572.9 +2000 , 619.1263282 , 7770 , 2065.1 +2400 , 762.6185788 , 9723 , 2696.4 +2550 , 819.2371476 , 10363.5 , 2856.9 +2800 , 898.7501978 , 11613 , 3349.1 +3200 , 979.4827586 , 13282.5 , 4012.5 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_2-Stage_398ccm.acmp b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_2-Stage_398ccm.acmp index 57420d82a62b58b211e01598c0aeca71a74a6cb2..137fd5268598af6c0a7ddf6ffa7f0207c72ba433 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_2-Stage_398ccm.acmp +++ b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_2-Cylinder_2-Stage_398ccm.acmp @@ -1,10 +1,10 @@ -rpm,flowRate [l/min],power on [W],power off [W] -800,209.7130243,2079,160.5 -1200,348.3681702,3160.5,342.4 -1600,411.2603567,4315.5,604.55 -2000,520.8333333,5901,963 -2400,598.4042553,6961.5,1433.8 -2550,618.1318681,7360.5,1637.1 -2800,655.1473124,8127,1968.8 -3200,806.2234795,10043.25,2755.25 -3600,857.9169175,11571,3702.2 +rpm , flowRate [l/min] , power on [W] , power off [W] +800 , 209.7130243 , 2079 , 160.5 +1200 , 348.3681702 , 3160.5 , 342.4 +1600 , 411.2603567 , 4315.5 , 604.55 +2000 , 520.8333333 , 5901 , 963 +2400 , 598.4042553 , 6961.5 , 1433.8 +2550 , 618.1318681 , 7360.5 , 1637.1 +2800 , 655.1473124 , 8127 , 1968.8 +3200 , 806.2234795 , 10043.25 , 2755.25 +3600 , 857.9169175 , 11571 , 3702.2 diff --git a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_3-Cylinder_2-Stage_598ccm.acmp b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_3-Cylinder_2-Stage_598ccm.acmp index 024770c46fed4fd9a6b501afd3e5db9809f5b43e..d7357838593965078ee5da55cc84dacb9235c481 100644 --- a/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_3-Cylinder_2-Stage_598ccm.acmp +++ b/VectoCore/VectoCore/Resources/Declaration/VAUXBus/DEFAULT_3-Cylinder_2-Stage_598ccm.acmp @@ -1,9 +1,9 @@ -rpm,flowRate [l/min],power on [W],power off [W] -700,268.8679245,2698.5,149.8 -1200,455.170778,4641,363.8 -1700,619.9877948,6772.5,823.9 -2200,723.0141287,8778,1508.7 -2550,800.5469547,10468.5,2075.8 -2800,913.4228898,12253.5,2461 -3300,996.5379955,14070,3145.8 -3550,1048.442907,15078,3755.7 +rpm , flowRate [l/min] , power on [W] , power off [W] +700 , 268.8679245 , 2698.5 , 149.8 +1200 , 455.170778 , 4641 , 363.8 +1700 , 619.9877948 , 6772.5 , 823.9 +2200 , 723.0141287 , 8778 , 1508.7 +2550 , 800.5469547 , 10468.5 , 2075.8 +2800 , 913.4228898 , 12253.5 , 2461 +3300 , 996.5379955 , 14070 , 3145.8 +3550 , 1048.442907 , 15078 , 3755.7