diff --git a/VECTO/AdvancedAuxiliariesModule.vb b/VECTO/AdvancedAuxiliariesModule.vb index 14a9f022a0e695b881e0074854abe6d99f53768a..8a2dcf34e31c60d9486d6a143d8a3aba97d267ba 100644 --- a/VECTO/AdvancedAuxiliariesModule.vb +++ b/VECTO/AdvancedAuxiliariesModule.vb @@ -57,7 +57,7 @@ Module AdvancedAuxiliariesModule ' o = Activator.CreateInstance(fileNameWoExtentsion, "VectoAuxiliaries.AdvancedAuxiliaries") - busAux = new BusAuxiliaries() + busAux = new BusAuxiliaries(Nothing) Dim advancedAuxiliary As AdvancedAuxiliary = New AdvancedAuxiliary(busAux.AuxiliaryName, busAux.AuxiliaryVersion, @@ -100,7 +100,7 @@ Module AdvancedAuxiliariesModule Try 'o = Activator.CreateInstance(chosenAssembly.Value.AssemblyName, "VectoAuxiliaries.AdvancedAuxiliaries") - busAux = New BusAuxiliaries() ' DirectCast(o.Unwrap, IAdvancedAuxiliaries) + busAux = New BusAuxiliaries(Nothing) ' DirectCast(o.Unwrap, IAdvancedAuxiliaries) Configure(filePath, vectoFilePath) @@ -186,7 +186,7 @@ Module AdvancedAuxiliariesModule 'Open Assembly and invoke the validation using the paths supplied. Try 'o = Activator.CreateInstance(chosenAssembly.Value.AssemblyName, "VectoAuxiliaries.AdvancedAuxiliaries") - busAux = New BusAuxiliaries() ' DirectCast(o.Unwrap, IAdvancedAuxiliaries) + busAux = New BusAuxiliaries(Nothing) ' DirectCast(o.Unwrap, IAdvancedAuxiliaries) 'result = busAux.ValidateAAUXFile(absoluteAAuxPath, message) diff --git a/VECTOAux/VectoAuxiliariesTests/IntegrationTests/AuxDemandTest.vb b/VECTOAux/VectoAuxiliariesTests/IntegrationTests/AuxDemandTest.vb index 8a90f0806fc8ca56effbe82c401c696e2e5bb087..743a29669be3df965dd2b8a83014b22a5eb0b54f 100644 --- a/VECTOAux/VectoAuxiliariesTests/IntegrationTests/AuxDemandTest.vb +++ b/VECTOAux/VectoAuxiliariesTests/IntegrationTests/AuxDemandTest.vb @@ -25,7 +25,7 @@ Namespace IntegrationTests Dim engineFCMapFilePath = "TestFiles\Integration\24t Coach.vmap" Dim auxFilePath = "TestFiles\Integration\AdvAuxTest.aaux" - Dim aux As BusAuxiliaries = New BusAuxiliaries + Dim aux As BusAuxiliaries = New BusAuxiliaries(Nothing) 'aux.VectoInputs.Cycle = "Coach" 'aux.VectoInputs.VehicleWeightKG = vehicleWeight.SI(Of Kilogram)() @@ -75,7 +75,7 @@ Namespace IntegrationTests Dim engineFCMapFilePath = "TestFiles\Integration\24t Coach.vmap" Dim auxFilePath = "TestFiles\Integration\AdvAuxTest.aaux" - Dim aux As BusAuxiliaries = New BusAuxiliaries + Dim aux As BusAuxiliaries = New BusAuxiliaries(Nothing) 'aux.VectoInputs.Cycle = "Coach" 'aux.VectoInputs.VehicleWeightKG = 12000.SI(Of Kilogram)() diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/M14Tests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/M14Tests.vb index 5c227c571efd00083a3e367f4b60ade4c5b79156..772132e67c6ff961d1fd64132cab0042efa0c7b3 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/M14Tests.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/M14Tests.vb @@ -46,18 +46,18 @@ Namespace UnitTests End Get End Property - Public ReadOnly Property FuelPerHBaseAdjusted As KilogramPerSecond Implements ISSMTOOL.FuelPerHBaseAdjusted - Get - Throw New NotImplementedException - End Get - End Property + 'Public ReadOnly Property FuelPerHBaseAdjusted As KilogramPerSecond Implements ISSMTOOL.FuelPerHBaseAdjusted + ' Get + ' Throw New NotImplementedException + ' End Get + 'End Property - Public ReadOnly Property EngineWasteHeatkW As Watt Implements ISSMTOOL.EngineWasteHeatkW + Public ReadOnly Property EngineWasteHeat As Watt Implements ISSMTOOL.EngineWasteHeat - Public Function FuelPerHBaseAsjusted(AverageUseableEngineWasteHeatKW As Watt) As KilogramPerSecond Implements ISSMTOOL.FuelPerHBaseAsjusted + Public Function AverageAuxHeaterPower(averageUseableEngineWasteHeat As Watt) As Watt Implements ISSMTOOL.AverageAuxHeaterPower - Return (0.5*(AverageUseableEngineWasteHeatKW.Value()*0.835).SI(Unit.SI.Liter.Per.Hour).Value()).SI (of KilogramPerSecond) + Return (0.5*(averageUseableEngineWasteHeat.Value()*0.835).SI(Unit.SI.Liter.Per.Hour).Value()).SI (of Watt) End Function Public Property SSMInputs As ISSMInputs Implements ISSMTOOL.SSMInputs @@ -98,42 +98,42 @@ Namespace UnitTests End Class - <TestFixture()> - Public Class M14Tests + '<TestFixture()> + 'Public Class M14Tests - <OneTimeSetUp> - Public Sub RunBeforeAnyTests() - Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory) - End Sub + ' <OneTimeSetUp> + ' Public Sub RunBeforeAnyTests() + ' Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory) + ' End Sub - <Test()> - Public Sub ValuesTest() + ' <Test()> + ' Public Sub ValuesTest() - 'Arrange - Dim ip1 As Double = 1000.0 - Dim ip5 As Double = 3114 + ' 'Arrange + ' Dim ip1 As Double = 1000.0 + ' Dim ip5 As Double = 3114 - Dim expectedOut1 As Double = 1799.3334 ' 780333.4 - Dim expectedOut2 As Double = 2.13093 + ' Dim expectedOut1 As Double = 1799.3334 ' 780333.4 + ' Dim expectedOut2 As Double = 2.13093 - Dim m13 As New Mock(Of IM13) - Dim hvacSSM As New Mock(Of ISSMTOOL) - Dim signals As New Mock(Of ISignals) - Dim ssmMock As ISSMTOOL = New SSMToolMock() + ' Dim m13 As New Mock(Of IM13) + ' Dim hvacSSM As New Mock(Of ISSMTOOL) + ' Dim signals As New Mock(Of ISignals) + ' Dim ssmMock As ISSMTOOL = New SSMToolMock() - 'Moq' Arrangements - m13.Setup(Function(x) x.WHTCTotalCycleFuelConsumption).Returns((ip1 / 1000).SI(Of Kilogram)) - signals.Setup(Function(x) x.CurrentCycleTimeInSeconds).Returns(ip5) + ' 'Moq' Arrangements + ' m13.Setup(Function(x) x.WHTCTotalCycleFuelConsumption).Returns((ip1 / 1000).SI(Of Kilogram)) + ' signals.Setup(Function(x) x.CurrentCycleTimeInSeconds).Returns(ip5) - Dim fuel = New FuelData.Entry(FuelType.DieselCI, Nothing, 0.SI(of KilogramPerCubicMeter),1.0, 44800.SI(Unit.SI.Joule.Per.Gramm).Cast(Of JoulePerKilogramm), 44800.SI(Unit.SI.Joule.Per.Gramm).Cast(Of JoulePerKilogramm)) - 'Act - Dim m14 As New M14Impl(m13.Object, ssmMock, fuel, signals.Object) + ' Dim fuel = New FuelData.Entry(FuelType.DieselCI, Nothing, 0.SI(of KilogramPerCubicMeter),1.0, 44800.SI(Unit.SI.Joule.Per.Gramm).Cast(Of JoulePerKilogramm), 44800.SI(Unit.SI.Joule.Per.Gramm).Cast(Of JoulePerKilogramm)) + ' 'Act + ' Dim m14 As New M14Impl(m13.Object, ssmMock, fuel, signals.Object) - 'Assert - Assert.AreEqual(expectedOut1.SI(Unit.SI.Gramm).Value(), m14.TotalCycleFC.Value(), 0.1) - 'Assert.AreEqual(expectedOut2.SI(Of Liter).Value(), m14.TotalCycleFCLitres.Value(), 0.00001) - End Sub - End Class + ' 'Assert + ' Assert.AreEqual(expectedOut1.SI(Unit.SI.Gramm).Value(), m14.TotalCycleFC.Value(), 0.1) + ' 'Assert.AreEqual(expectedOut2.SI(Of Liter).Value(), m14.TotalCycleFCLitres.Value(), 0.00001) + ' End Sub + 'End Class End Namespace diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/SSMTOOLTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/SSMTOOLTests.vb index 56b3156fb0c888b68dd3957c59776b187940074d..86600d0caf4494cc52c99fe55850a774fabcd930 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/SSMTOOLTests.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/SSMTOOLTests.vb @@ -91,7 +91,7 @@ Namespace UnitTests Dim auxInput as IBusAuxiliariesDeclarationData = nothing Dim dao = New DeclarationDataAdapterPrimaryBus() - Dim target As ISSMInputs = dao.CreateSSMModelParameters(auxInput, mission, FuelData.Diesel) + Dim target As ISSMInputs = dao.CreateSSMModelParameters(auxInput, mission, FuelData.Diesel, LoadingType.ReferenceLoad) If section = "BusParameterisation" Then 'BUS Parameterisation @@ -599,7 +599,7 @@ Namespace UnitTests Dim dao = New DeclarationDataAdapterPrimaryBus() Dim target As SSMTOOL = New SSMTOOL(dao.CreateSSMModelParameters(auxInput, mission, - FuelData.Diesel)) + FuelData.Diesel, LoadingType.ReferenceLoad)) success = BusAuxWriter.SaveSSMConfig(target.SSMInputs, filePath) 'success = target.Save(filePath) diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/ISSMInputs.cs b/VectoCommon/VectoCommon/BusAuxiliaries/ISSMInputs.cs index 92834cd02c0640f1548511bab430522e8bf00d11..c5f46d8b7a4aa404213f9842218c7aa5f3655c17 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/ISSMInputs.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/ISSMInputs.cs @@ -15,6 +15,8 @@ namespace TUGraz.VectoCommon.BusAuxiliaries IEnvironmentalConditions EnvironmentalConditions { get; } + double NumberOfPassengers { get; } + IACSystem ACSystem { get; } IVentilation Ventilation { get; } diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs index c2819c156e45500a29cd3cce2a3e7ec3c35271f2..00fa62139a141fd4446c42f557e3d77242b57db5 100644 --- a/VectoCommon/VectoCommon/Utils/SI.cs +++ b/VectoCommon/VectoCommon/Utils/SI.cs @@ -751,6 +751,11 @@ namespace TUGraz.VectoCommon.Utils { return SIBase<JoulePerMeter>.Create(joule.Val / meter.Value()); } + + public static Kilogram operator /(Joule j, JoulePerKilogramm jpkg) + { + return SIBase<Kilogram>.Create(j.Val / jpkg.Value()); + } } public class JoulePerNormLiter : SIBase<JoulePerNormLiter> diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs index c0eceb9aea0f51e5eb5d7b5bc2014188cd0ff16a..ad05529c3f64fcb944822b202b9d22c7c3b414b2 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs @@ -85,7 +85,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter PneumaticAuxillariesConfig = CreatePneumaticAuxConfig(runData.Retarder.Type), Actuations = actuations, SSMInputs = CreateSSMModelParameters( - vehicleData.Components.BusAuxiliaries, mission, FuelData.Diesel), + vehicleData.Components.BusAuxiliaries, mission, FuelData.Diesel, runData.Loading), VehicleData = runData.VehicleData, }; @@ -234,7 +234,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VAUXBus." + resource), dragCurveFactorClutch); } - public virtual ISSMInputs CreateSSMModelParameters(IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel) + public virtual ISSMInputs CreateSSMModelParameters(IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel, LoadingType loadingType) { var busParams = mission.BusParameter; @@ -278,7 +278,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter UValue = DeclarationData.BusAuxiliaries.UValue(busParams.FloorType), NumberOfPassengers = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(hvacBusLength, busParams.VehicleWidth) * - busParams.PassengerDensity + 1, // add driver for 'heat input' + busParams.PassengerDensity * (loadingType == LoadingType.LowLoading ? mission.MissionType.GetPassengerDensityLowLoadFactor() : 1.0) + 1, // add driver for 'heat input' VentilationRate = DeclarationData.BusAuxiliaries.VentilationRate(busParams.HVACConfiguration, false), VentilationRateHeating = DeclarationData.BusAuxiliaries.VentilationRate(busParams.HVACConfiguration, true), diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs index 745b314d41d825a8f63c2f7b1c7aedcb3e3fe2eb..cdb598b247d25fb671f6a477ec30a0917e8c6a3c 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs @@ -120,10 +120,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return retVal; } - public override ISSMInputs CreateSSMModelParameters( - IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel) + public override ISSMInputs CreateSSMModelParameters(IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel, LoadingType loading) { - var retVal = base.CreateSSMModelParameters(busAuxInputData, mission, heatingFuel) as SSMInputs; + var retVal = base.CreateSSMModelParameters(busAuxInputData, mission, heatingFuel, loading) as SSMInputs; if (retVal == null) { throw new VectoException("Unknonw SSMInput Instance"); } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs index d0c22da10c9289c9554775fe920876beba0616bf..41f77b25c0344bcd14b4605bd5d08d2c0a205f81 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; @@ -21,6 +22,7 @@ using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; using TUGraz.VectoCore.Models.BusAuxiliaries.Util; +using TUGraz.VectoCore.OutputData; namespace TUGraz.VectoCore.Models.BusAuxiliaries { @@ -66,9 +68,22 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries //private IM14 M14; - public BusAuxiliaries() + public BusAuxiliaries(IModalDataContainer modDataContainer) { Signals = new Signals(); + if (modDataContainer != null) { + modDataContainer.AuxHeaterDemandCalc = AuxHeaterDemandCalculation; + } + } + + protected virtual Joule AuxHeaterDemandCalculation(Second cycleTime, Joule engineWasteHeatTotal) + { + if (auxConfig == null) { + throw new VectoException("Auxiliary configuration missing!"); + } + var ssmTool = new SSMTOOL(auxConfig.SSMInputs); + var M14 = new M14aImpl(ssmTool); + return M14.AuxHeaterDemand(cycleTime, engineWasteHeatTotal); } public void Initialise(IAuxiliaryConfig auxCfg) diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs index 0530682fafa7d21c6cce7f6fdd6683ff489fc174..d09a10d0e87b73e2aff3cf24bb28c5c44a91ff8f 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs @@ -143,10 +143,10 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC } } - public KilogramPerSecond FuelPerHBaseAdjusted + public Watt AverageAuxHeaterPower { get { - var FuelLPerHBaseAdjustedAverage = 0.0.SI<KilogramPerSecond>(); + var averageAuxHeaterPower = 0.0.SI<Watt>(); var gen = ssmTOOL.SSMInputs.EnvironmentalConditions; var tl = ssmTOOL.TechList; @@ -154,17 +154,17 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // If batch mode is disabled use the EC_EnviromentalTemperature and EC_Solar variables. // Else if batch is enable calculate the FuelLPerHBaseAdjusted for each input in the AENV file and then calculate the weighted average if (!gen.BatchMode) - FuelLPerHBaseAdjustedAverage = CalculateFuelLPerHBaseAdjusted( + averageAuxHeaterPower = CalculateAverageAuxHeaterPower( ssmTOOL.SSMInputs, tl, gen.DefaultConditions); else { foreach (var envCondition in gen.EnvironmentalConditionsMap.GetEnvironmentalConditions()) - FuelLPerHBaseAdjustedAverage += CalculateFuelLPerHBaseAdjusted( + averageAuxHeaterPower += CalculateAverageAuxHeaterPower( ssmTOOL.SSMInputs, tl, envCondition); } - return FuelLPerHBaseAdjustedAverage; + return averageAuxHeaterPower; } } @@ -540,7 +540,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC return MechanicalWBaseAdjusted * env.Weighting; } - private KilogramPerSecond CalculateFuelLPerHBaseAdjusted( + private Watt CalculateAverageAuxHeaterPower( ISSMInputs genInputs, ISSMTechnologyBenefits tecList, IEnvironmentalConditionsMapEntry env) { // =MIN(ABS(IF(AND(M89<0,M90<0),VLOOKUP(MAX(M89:M90),M89:P90,4),0)/1000),C71)/C37*(1/(C39*C38)) @@ -566,11 +566,11 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC : Run2.TechListAmendedFuelW(env.Temperature, env.Solar)).Value().SI<Watt>(); } - var fuelLPerHBaseAdjusted = VectoMath.Min(result, genInputs.AuxHeater.FuelFiredHeaterPower) / - genInputs.BoundaryConditions.AuxHeaterEfficiency / - (genInputs.BoundaryConditions.GCVDieselOrHeatingOil /* * ssmTOOL.HVACConstants.FuelDensity*/); + var auxHeaterPower = VectoMath.Min(result, genInputs.AuxHeater.FuelFiredHeaterPower) / + genInputs.BoundaryConditions.AuxHeaterEfficiency; + // / (genInputs.BoundaryConditions.GCVDieselOrHeatingOil /* * ssmTOOL.HVACConstants.FuelDensity*/); - return fuelLPerHBaseAdjusted * env.Weighting; + return auxHeaterPower * env.Weighting; } } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMRun.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMRun.cs index 0d50ccec5ede5b9978d4a51db60c0af37c57fb93..38e99e90d49a29f60cbf12a86cce260cb1787713 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMRun.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMRun.cs @@ -76,8 +76,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // Dim C60 As Double = gen.AH_EngineWasteHeatkW var totalW = TotalW(enviromentalTemperature, solarFactor); - return (totalW < 0 && totalW < (ssmTOOL.EngineWasteHeatkW * -1)) - ? totalW - (ssmTOOL.EngineWasteHeatkW * -1) + return (totalW < 0 && totalW < (ssmTOOL.EngineWasteHeat * -1)) + ? totalW - (ssmTOOL.EngineWasteHeat * -1) : 0.SI<Watt>(); } @@ -89,15 +89,15 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var TLFFH = ssmTOOL.Calculate.TechListAdjustedHeatingW_FuelFiredHeating; // Dim C60 As Double = gen.AH_EngineWasteHeatkW // Dim N79 As Double = Me.TotalKW - //Return IF(IF(((TotalKW * (1 - TLFFH)) < 0 AndAlso(TotalKW * (1 - TLFFH)) < (gen.AH_EngineWasteHeatkW * -1)), _ + //Return IF( IF(( (TotalKW * (1 - TLFFH)) < 0 AndAlso (TotalKW * (1 - TLFFH)) < (gen.AH_EngineWasteHeatkW * -1)), _ // (TotalKW * (1 - TLFFH)) - (gen.AH_EngineWasteHeatkW * -1), 0)*1000 < 0, _ //IF(((TotalKW * (1 - TLFFH)) < 0 AndAlso(TotalKW * (1 - TLFFH)) < (gen.AH_EngineWasteHeatkW * -1)),(TotalKW * (1 - TLFFH)) - (gen.AH_EngineWasteHeatkW * -1),0)*1000,0) - var totalW = TotalW(enviromentalTemperature, solarFactor); - return (totalW * (1 - TLFFH) < 0 && totalW * (1 - TLFFH) < ssmTOOL.EngineWasteHeatkW * -1? - totalW * (1 - TLFFH) - ssmTOOL.EngineWasteHeatkW * -1: 0.SI<Watt>()) < 0 - ? (totalW * (1 - TLFFH) < 0 && totalW * (1 - TLFFH) < ssmTOOL.EngineWasteHeatkW * -1 - ? totalW * (1 - TLFFH) - ssmTOOL.EngineWasteHeatkW * -1 + var totalW = TotalW(enviromentalTemperature, solarFactor) * (1 - TLFFH); + return (totalW < 0 && totalW < ssmTOOL.EngineWasteHeat * -1? + totalW - ssmTOOL.EngineWasteHeat * -1: 0.SI<Watt>()) < 0 + ? (totalW < 0 && totalW < ssmTOOL.EngineWasteHeat * -1 + ? totalW - ssmTOOL.EngineWasteHeat * -1 : 0.SI<Watt>()) : 0.SI<Watt>(); diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMTOOL.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMTOOL.cs index b5cf655fef30cce708883eeebec182b11a8b17ff..8070353c3b41a798296a4e09e3db56041f7d1749 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMTOOL.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMTOOL.cs @@ -23,7 +23,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC TechList = ssmInput.Technologies; Calculate = new SSMCalculate(this); - EngineWasteHeatkW = 0.SI<Watt>(); + EngineWasteHeat = 0.SI<Watt>(); } public ISSMInputs SSMInputs { get; } @@ -82,25 +82,25 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC } } - public KilogramPerSecond FuelPerHBaseAdjusted - { - get { - return Calculate.FuelPerHBaseAdjusted; // .SI(Of LiterPerHour)() - } - } + //public KilogramPerSecond FuelPerHBaseAdjusted + //{ + // get { + // return Calculate.AverageAuxHeaterPower; // .SI(Of LiterPerHour)() + // } + //} - public Watt EngineWasteHeatkW { get; protected set; } + public Watt EngineWasteHeat { get; protected set; } // Dynamicly Get Fuel having re-adjusted Engine Heat Waste, this was originally supposed to be Solid State. Late adjustment request 24/3/2015 - public KilogramPerSecond FuelPerHBaseAsjusted(Watt AverageUseableEngineWasteHeatKW) + public Watt AverageAuxHeaterPower(Watt averageUseableEngineWasteHeat) { // Set Engine Waste Heat //SSMInputs.AuxHeater.EngineWasteHeatkW = AverageUseableEngineWasteHeatKW; - EngineWasteHeatkW = AverageUseableEngineWasteHeatKW; + EngineWasteHeat = averageUseableEngineWasteHeat; - var fba = Calculate.FuelPerHBaseAdjusted; + var fba = Calculate.AverageAuxHeaterPower; // Dim FuelFiredWarning As Boolean = fba * SSMInputs.BC_AuxHeaterEfficiency * HVACConstants.FuelDensity * SSMInputs.BC_GCVDieselOrHeatingOil * 1000 > (AverageUseableEngineWasteHeatKW + SSMInputs.AH_FuelFiredHeaterkW) // If Not FuelFiredHeaterInsufficientWarned AndAlso FuelFiredWarning Then diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs index 143dab91254cf24022e1fbcf3add5b667d36e33a..05e453bbc97be656df80a84a26a4f48ea3e58d2d 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M14Impl.cs @@ -1,57 +1,79 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.HVAC; using TUGraz.VectoCore.Models.Declaration; namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl { - public class M14Impl : AbstractModule, IM14 - { - protected readonly IM13 M13; - protected readonly ISignals Signals; - protected readonly ISSMTOOL SSM; + //public class M14Impl : AbstractModule, IM14 + //{ + // protected readonly IM13 M13; + // protected readonly ISignals Signals; + // protected readonly ISSMTOOL SSM; - protected Kilogram _totalCycleFcGrams; - private readonly IFuelProperties EngineFuel; + // protected Kilogram _totalCycleFcGrams; + // private readonly IFuelProperties EngineFuel; - public M14Impl(IM13 m13, ISSMTOOL ssm, IFuelProperties engineFuel, ISignals signals) - { - M13 = m13; - SSM = ssm; - EngineFuel = engineFuel; - Signals = signals; - } + // public M14Impl(IM13 m13, ISSMTOOL ssm, IFuelProperties engineFuel, ISignals signals) + // { + // M13 = m13; + // SSM = ssm; + // EngineFuel = engineFuel; + // Signals = signals; + // } - protected override void DoCalculate() - { - var s1 = M13.WHTCTotalCycleFuelConsumption * EngineFuel.LowerHeatingValueVectoEngine; - var s2 = SSM.SSMInputs.AuxHeater.FuelEnergyToHeatToCoolant * s1; - var s3 = s2 * SSM.SSMInputs.AuxHeater.CoolantHeatTransferredToAirCabinHeater; - var s4 = s3 / Signals.CurrentCycleTimeInSeconds.SI<Second>(); - var s5 = Signals.CurrentCycleTimeInSeconds.SI<Second>(); - var s6 = s5 * SSM.FuelPerHBaseAsjusted(s4); - var s7 = M13.WHTCTotalCycleFuelConsumption + s6; - _totalCycleFcGrams = s7; - } + // protected override void DoCalculate() + // { + // var s1 = M13.WHTCTotalCycleFuelConsumption * EngineFuel.LowerHeatingValueVectoEngine; + // var s2 = SSM.SSMInputs.AuxHeater.FuelEnergyToHeatToCoolant * s1; + // var s3 = s2 * SSM.SSMInputs.AuxHeater.CoolantHeatTransferredToAirCabinHeater; + // var s4 = s3 / Signals.CurrentCycleTimeInSeconds.SI<Second>(); + // var s5 = Signals.CurrentCycleTimeInSeconds.SI<Second>(); + // var s6 = s5 * SSM.FuelPerHBaseAsjusted(s4); + // var s7 = M13.WHTCTotalCycleFuelConsumption + s6; + // _totalCycleFcGrams = s7; + // } - #region Implementation of IM14 + // #region Implementation of IM14 - public Kilogram TotalCycleFC - { - get { - if (!calculationValid) { - Calculate(); - } - return _totalCycleFcGrams; - } - } + // public Kilogram TotalCycleFC + // { + // get { + // if (!calculationValid) { + // Calculate(); + // } + // return _totalCycleFcGrams; + // } + // } - #endregion + // #endregion + //} + + public class M14aImpl + { + //private Signals _signals; + private SSMTOOL _ssmTool; + + public M14aImpl(SSMTOOL ssmTool) + { + _ssmTool = ssmTool; + } + + public Joule AuxHeaterDemand(Second cycleTime, Joule engineWasteHeat) + { + var averageEngineWasteHeatPwr = engineWasteHeat / cycleTime; + var averageUsableEngineWasteHeat = averageEngineWasteHeatPwr * + _ssmTool.SSMInputs.AuxHeater.FuelEnergyToHeatToCoolant * + _ssmTool.SSMInputs.AuxHeater.CoolantHeatTransferredToAirCabinHeater; + return _ssmTool.AverageAuxHeaterPower(averageUsableEngineWasteHeat) * cycleTime; + } } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs index 9a202b691c794a767bed9ca77f494763d1c0689a..388a49c61fff46a0238ce9267c1a383b252be3e1 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/CompressorMap.cs @@ -98,17 +98,17 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati - public event MessageEventHandler Message; + //public event MessageEventHandler Message; //public delegate void MessageEventHandler(ref object sender, string message, AdvancedAuxiliaryMessageType messageType); - private void OnMessage(object sender, string message, AdvancedAuxiliaryMessageType messageType) - { - if (message != null) { - object compressorMap = this; - Message?.Invoke(ref compressorMap, message, messageType); - } - } + //private void OnMessage(object sender, string message, AdvancedAuxiliaryMessageType messageType) + //{ + // if (message != null) { + // object compressorMap = this; + // Message?.Invoke(ref compressorMap, message, messageType); + // } + //} #region Implementation of IAuxiliaryEvent diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMCalculate.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMCalculate.cs index 5cbe37bd4d637af2d212f8d2d124e94c7cd79421..0b39102998ee2c4446e8bb51113f000b68283b04 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMCalculate.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMCalculate.cs @@ -11,7 +11,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.HV Watt ElectricalWAdjusted { get; } Watt MechanicalWBaseAdjusted { get; } - KilogramPerSecond FuelPerHBaseAdjusted { get; } + + Watt AverageAuxHeaterPower { get; } double TechListAdjustedHeatingW_FuelFiredHeating { get; } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMTOOL.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMTOOL.cs index ad18a9fc981de27c87c7baed0247e7a2fc2af5be..6f32348f04fe1eca2e827c477c8e365109830155 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMTOOL.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/HVAC/ISSMTOOL.cs @@ -15,20 +15,21 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.HV Watt ElectricalWAdjusted { get; } // Watt Watt MechanicalWBaseAdjusted { get; } // Watt - KilogramPerSecond FuelPerHBaseAdjusted { get; } // LiterPerHour - Watt EngineWasteHeatkW { get; } + //KilogramPerSecond FuelPerHBaseAdjusted { get; } // LiterPerHour + + Watt EngineWasteHeat { get; } /// <summary> - /// This alters the waste heat and returns an adjusted fueling value + /// /// </summary> - /// <param name="AverageUseableEngineWasteHeatKW"></param> + /// <param name="averageUseableEngineWasteHeat"></param> /// <returns></returns> /// <remarks></remarks> - KilogramPerSecond FuelPerHBaseAsjusted(Watt AverageUseableEngineWasteHeatKW); + Watt AverageAuxHeaterPower(Watt averageUseableEngineWasteHeat); } - public delegate void MessageEventHandler(ref object sender, string message, AdvancedAuxiliaryMessageType messageType); + //public delegate void MessageEventHandler(ref object sender, string message, AdvancedAuxiliaryMessageType messageType); } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/MissionType.cs b/VectoCore/VectoCore/Models/Declaration/MissionType.cs index 37332bbcf717f6e2b7717b9665eff48dc5425c2f..1daca366e69b777d70e2d103ae7d6cb8a28cb32f 100644 --- a/VectoCore/VectoCore/Models/Declaration/MissionType.cs +++ b/VectoCore/VectoCore/Models/Declaration/MissionType.cs @@ -128,5 +128,17 @@ namespace TUGraz.VectoCore.Models.Declaration default: throw new ArgumentOutOfRangeException(nameof(self), self, null); } } + + public static double GetPassengerDensityLowLoadFactor(this MissionType self) + { + switch (self) { + case MissionType.HeavyUrban: + case MissionType.Urban: + case MissionType.Suburban: return 0.2; + case MissionType.Interurban: return 0.3; + case MissionType.Coach: return 0.4; + default: return 0.1; + } + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs index ba2d3d53929aee22cb5cc9681a1aed2f03768f85..2422f8bb889dd5553c8c97f4c6bd6c1f0bf83c03 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs @@ -70,7 +70,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl DataBus = container; - var tmpAux = new BusAuxiliaries.BusAuxiliaries(); + var tmpAux = new BusAuxiliaries.BusAuxiliaries(container.ModalData); //'Set Signals tmpAux.Signals.EngineIdleSpeed = container.EngineIdleSpeed; diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index d996f355b4ff6d8cbfc5af774ad0e15271b5923c..2ef6cc25beda86e4a363a09b5261b64afae7d7ff 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -114,6 +114,9 @@ namespace TUGraz.VectoCore.OutputData Second Duration { get; } Meter Distance { get; } + + Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; } + KilogramPerWattSecond VehicleLineCorrectionFactor(IFuelProperties fuel); void CalculateAggregateValues(); } diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index 3a4406f4ce7a67e64a9776d384bef8218424ade6..49b67df69f16d253fcf2e14a086ab7eacdf305ce 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -164,6 +164,8 @@ namespace TUGraz.VectoCore.OutputData get { return _distance ?? (_distance = CalcDistance()); } } + public Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; } + public KilogramPerWattSecond VehicleLineCorrectionFactor(IFuelProperties fuel) { if (_vehicleLine.ContainsKey(fuel.FuelType)) { @@ -328,8 +330,9 @@ namespace TUGraz.VectoCore.OutputData ModalResultField.v_act, ModalResultField.v_targ, ModalResultField.acc, - ModalResultField.grad - }); + ModalResultField.grad, + ModalResultField.altitude + }); } if (!_writeEngineOnly) { dataColumns.AddRange( @@ -428,31 +431,9 @@ namespace TUGraz.VectoCore.OutputData }); } } - if (!_writeEngineOnly && WriteAdvancedAux) { - //dataColumns.AddRange( - // new[] { - // ModalResultField.AA_NonSmartAlternatorsEfficiency, - // ModalResultField.AA_SmartIdleCurrent_Amps, - // ModalResultField.AA_SmartIdleAlternatorsEfficiency, - // ModalResultField.AA_SmartTractionCurrent_Amps, - // ModalResultField.AA_SmartTractionAlternatorEfficiency, - // ModalResultField.AA_SmartOverrunCurrent_Amps, - // ModalResultField.AA_SmartOverrunAlternatorEfficiency, - // ModalResultField.AA_CompressorFlowRate_LitrePerSec, - // ModalResultField.BusAux_OverrunFlag, - // ModalResultField.AA_EngineIdleFlag, - // ModalResultField.AA_CompressorFlag, - // ModalResultField.AA_TotalCycleFC_Grams, - // //ModalResultField.AA_TotalCycleFC_Litres, - // ModalResultField.AA_AveragePowerDemandCrankHVACMechanicals, - // ModalResultField.AA_AveragePowerDemandCrankHVACElectricals, - // ModalResultField.AA_AveragePowerDemandCrankElectrics, - // ModalResultField.AA_AveragePowerDemandCrankPneumatics, - // ModalResultField.AA_TotalCycleFuelConsumptionCompressorOff, - // ModalResultField.AA_TotalCycleFuelConsumptionCompressorOn, - // }); - } - dataColumns.Add(ModalResultField.altitude); + //if (!_writeEngineOnly && WriteAdvancedAux) { + + //} return dataColumns; } diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index d239523064d28b6de9339f5d0d05b102ad8276a9..6285f098aa1af3262da918968a9ad5efa74f431d 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -63,8 +63,10 @@ namespace TUGraz.VectoCore.OutputData Fields.FC_BusAux_PS_CORR_H, Fields.FC_BusAux_PS_CORR_KM, Fields.FC_BusAux_ES_CORR_H, Fields.FC_BusAux_ES_CORR_KM, Fields.FCWHR_H_CORR, Fields.FCWHR_KM_CORR, + Fields.FC_AUXHTR_H, Fields.FC_AUXHTR_KM, + Fields.FC_AUXHTR_H_CORR, Fields.FC_AUXHTR_KM_CORR, Fields.FCFINAL_H, Fields.FCFINAL_KM, Fields.FCFINAL_LITERPER100KM, Fields.FCFINAL_LITERPER100TKM, - Fields.FCFINAL_LiterPer100M3KM, Fields.K_VEHLINE + Fields.FCFINAL_LiterPer100M3KM, Fields.FCFINAL_LiterPer100PassengerKM, Fields.K_VEHLINE }; // ReSharper restore InconsistentNaming @@ -100,6 +102,7 @@ namespace TUGraz.VectoCore.OutputData Tuple.Create(Fields.HDV_CO2_VEHICLE_CLASS, typeof(string)), Tuple.Create(Fields.CURB_MASS, typeof(ConvertedSI)), Tuple.Create(Fields.LOADING, typeof(ConvertedSI)), + Tuple.Create(Fields.PassengerCount, typeof(double)), Tuple.Create(Fields.TOTAL_VEHICLE_MASS, typeof(ConvertedSI)), Tuple.Create(Fields.ENGINE_MANUFACTURER, typeof(string)), Tuple.Create(Fields.ENGINE_MODEL, typeof(string)), @@ -171,13 +174,13 @@ namespace TUGraz.VectoCore.OutputData Table.Columns.AddRange( new[] { - Fields.SPECIFIC_FC, Fields.CO2_KM, Fields.CO2_TKM, Fields.CO2_M3KM, Fields.P_WHEEL_POS, Fields.P_FCMAP_POS, + Fields.SPECIFIC_FC, Fields.CO2_KM, Fields.CO2_TKM, Fields.CO2_M3KM, Fields.CO2_PKM, Fields.P_WHEEL_POS, Fields.P_FCMAP_POS, Fields.E_FCMAP_POS, Fields.E_FCMAP_NEG, Fields.E_POWERTRAIN_INERTIA, Fields.E_AUX, Fields.E_CLUTCH_LOSS, Fields.E_TC_LOSS, Fields.E_SHIFT_LOSS, Fields.E_GBX_LOSS, Fields.E_RET_LOSS, Fields.E_ANGLE_LOSS, Fields.E_AXL_LOSS, Fields.E_BRAKE, Fields.E_VEHICLE_INERTIA, Fields.E_WHEEL, Fields.E_AIR, Fields.E_ROLL, Fields.E_GRAD, Fields.AirConsumed, Fields.AirGenerated, Fields.E_PS_CompressorOff, Fields.E_PS_CompressorOn, Fields.E_BusAux_ES_consumed, Fields.E_BusAux_ES_generated, Fields.Delta_E_BusAux_Battery, - Fields.E_BusAux_PS_corr, Fields.E_BusAux_ES_mech_corr, + Fields.E_BusAux_PS_corr, Fields.E_BusAux_ES_mech_corr, Fields.E_BusAux_AuxHeater, Fields.E_WHR_EL, Fields.E_WHR_MECH, Fields.E_AUX_ESS_MECH, Fields.E_ICE_START, Fields.NUM_ICE_STARTS, Fields.ACC, Fields.ACC_POS, Fields.ACC_NEG, Fields.ACC_TIMESHARE, Fields.DEC_TIMESHARE, Fields.CRUISE_TIMESHARE, Fields.MAX_SPEED, Fields.MAX_ACCELERATION, Fields.MAX_DECELERATION, Fields.AVG_ENGINE_SPEED, @@ -277,12 +280,14 @@ namespace TUGraz.VectoCore.OutputData var vehicleLoading = 0.SI<Kilogram>(); var cargoVolume = 0.SI<CubicMeter>(); var gearCount = 0u; + double? passengerCount = null; if (runData.Cycle.CycleType != CycleType.EngineOnly) { WriteFullPowertrain(runData, row); cargoVolume = runData.VehicleData.CargoVolume; vehicleLoading = runData.VehicleData.Loading; gearCount = (uint)runData.GearboxData.Gears.Count; + passengerCount = runData.BusAuxiliaries?.SSMInputs.NumberOfPassengers; } row[Fields.VEHICLE_FUEL_TYPE] = string.Join(", ", modData.FuelData.Select(x => x.GetLabel())); @@ -302,7 +307,7 @@ namespace TUGraz.VectoCore.OutputData row[Fields.ALTITUDE_DELTA] = (ConvertedSI)modData.AltitudeDelta(); - WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume, runData); + WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume, passengerCount, runData); row[Fields.P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt(); @@ -332,7 +337,7 @@ namespace TUGraz.VectoCore.OutputData private static void WriteFuelconsumptionEntries( IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, - CubicMeter cargoVolume, VectoRunData runData) + CubicMeter cargoVolume, double? passengers, VectoRunData runData) { var multipleEngineModes = runData.EngineData.MultipleEngineFuelModes; var vtpCycle = runData.Cycle.CycleType == CycleType.VTP; @@ -381,6 +386,16 @@ namespace TUGraz.VectoCore.OutputData // TODO: Correct for fuel-fired heater + var engineWasteheatSum = modData.FuelData.Aggregate( + 0.SI<Joule>(), + (current, fuel) => current + modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel) * + fuel.LowerHeatingValueVecto); + + var auxHeaterDemand = modData.AuxHeaterDemandCalc(duration, engineWasteheatSum); + + row[Fields.E_BusAux_AuxHeater] = auxHeaterDemand.Cast<WattSecond>().ConvertToKiloWattHour(); + + var firstFuel = true; foreach (var fuel in modData.FuelData) { var suffix = modData.FuelData.Count <= 1 && !multipleEngineModes ? "" : "_" + fuel.FuelType.GetLabel(); @@ -400,11 +415,6 @@ namespace TUGraz.VectoCore.OutputData row[FcCol(Fields.FCWHTCC_KM, suffix)] = modData.FuelConsumptionPerMeter(ModalResultField.FCWHTCc, fuel)?.ConvertToGrammPerKiloMeter(); - //row[FcCol(Fields.FCAAUX_H, suffix)] = - // modData.FuelConsumptionPerSecond(ModalResultField.FCAAUX, fuel)?.ConvertToGrammPerHour(); - //row[FcCol(Fields.FCAAUX_KM, suffix)] = - // modData.FuelConsumptionPerMeter(ModalResultField.FCAAUX, fuel)?.ConvertToGrammPerKiloMeter(); - row[FcCol(Fields.FCESS_H, suffix)] = modData.FuelConsumptionPerSecond(ModalResultField.FCICEStopStart, fuel) ?.ConvertToGrammPerHour(); row[FcCol(Fields.FCESS_KM, suffix)] = modData.FuelConsumptionPerMeter(ModalResultField.FCICEStopStart, fuel) @@ -430,7 +440,17 @@ namespace TUGraz.VectoCore.OutputData var fcWHRCorr = fcBusAuxESCorr + correction * workWhr; row[FcCol(Fields.FCWHR_H_CORR, suffix)] = duration != null ? (fcWHRCorr / duration).ConvertToGrammPerHour() : null; - var fcFinal = fcWHRCorr; + var fcAuxHtr = 0.SI<Kilogram>(); + if (firstFuel) { + firstFuel = false; + fcAuxHtr = auxHeaterDemand / fuel.LowerHeatingValueVecto; + } + var fcAuxHtrCorr = fcWHRCorr + fcAuxHtr; + + var fcFinal = fcAuxHtrCorr; + + row[FcCol(Fields.FC_AUXHTR_H, suffix)] = (fcAuxHtr / duration).ConvertToGrammPerHour(); + row[FcCol(Fields.FC_AUXHTR_H_CORR, suffix)] = (fcAuxHtrCorr / duration).ConvertToGrammPerHour(); row[FcCol(Fields.FCFINAL_H, suffix)] = (fcFinal / duration).ConvertToGrammPerHour(); @@ -438,6 +458,9 @@ namespace TUGraz.VectoCore.OutputData row[FcCol(Fields.FCWHR_KM_CORR, suffix)] = (fcWHRCorr / distance).ConvertToGrammPerKiloMeter(); row[FcCol(Fields.FC_BusAux_PS_CORR_KM, suffix)] = (fcBusAuxPSCorr / distance).ConvertToGrammPerKiloMeter(); row[FcCol(Fields.FC_BusAux_ES_CORR_KM, suffix)] = (fcBusAuxESCorr / distance).ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FC_AUXHTR_KM, suffix)] = (fcAuxHtr / distance).ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FC_AUXHTR_KM_CORR, suffix)] = (fcAuxHtrCorr / distance).ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FCESS_KM_CORR, suffix)] = (fcEssCorr / distance).ConvertToGrammPerKiloMeter(); row[FcCol(Fields.FCFINAL_KM, suffix)] = (fcFinal / distance).ConvertToGrammPerKiloMeter(); @@ -453,12 +476,17 @@ namespace TUGraz.VectoCore.OutputData row[FcCol(Fields.FCFINAL_LiterPer100M3KM, suffix)] = (fcVolumePerMeter / cargoVolume).ConvertToLiterPerCubicMeter100KiloMeter(); } + + if (passengers != null) { + // subtract driver! + row[FcCol(Fields.FCFINAL_LiterPer100PassengerKM, suffix)] = + (fcVolumePerMeter / (passengers.Value - 1)).ConvertToLiterPer100Kilometer(); + } } kilogramCO2PerMeter += fcFinal * fuel.CO2PerFuelWeight / distance; } - } if (vtpCycle) { @@ -473,6 +501,9 @@ namespace TUGraz.VectoCore.OutputData if (cargoVolume > 0) { row[Fields.CO2_M3KM] = (kilogramCO2PerMeter / cargoVolume).ConvertToGrammPerCubicMeterKiloMeter(); } + if (passengers != null) { + row[Fields.CO2_PKM] = (kilogramCO2PerMeter / passengers.Value).ConvertToGrammPerKiloMeter(); + } } private static string FcCol(string col, string suffix) @@ -641,6 +672,11 @@ namespace TUGraz.VectoCore.OutputData { WriteVehicleData(runData.VehicleData, runData.GearboxData.Type, row); + if (runData.BusAuxiliaries != null) { + // subtract driver! + row[Fields.PassengerCount] = runData.BusAuxiliaries.SSMInputs.NumberOfPassengers - 1; + } + row[Fields.TCU_MODEL] = runData.ShiftStrategy; row[Fields.PTO_TECHNOLOGY] = runData.PTO?.TransmissionType ?? ""; @@ -872,6 +908,7 @@ namespace TUGraz.VectoCore.OutputData public static class Fields { + // ReSharper disable InconsistentNaming public const string INTERNAL_PREFIX = "INTERNAL"; @@ -883,6 +920,7 @@ namespace TUGraz.VectoCore.OutputData public const string STATUS = "Status"; public const string CURB_MASS = "Corrected Actual Curb Mass [kg]"; public const string LOADING = "Loading [kg]"; + public const string PassengerCount = "Passenger count [-]"; public const string VEHICLE_MANUFACTURER = "Vehicle manufacturer [-]"; public const string VIN_NUMBER = "VIN number"; @@ -963,6 +1001,10 @@ namespace TUGraz.VectoCore.OutputData public const string FC_BusAux_PS_CORR_KM = "FC-BusAux_PS_Corr{0} [g/km]"; public const string FC_BusAux_ES_CORR_H = "FC-BusAux_ES_Corr{0} [g/h]"; public const string FC_BusAux_ES_CORR_KM = "FC-BusAux_ES_Corr{0} [g/km]"; + public const string FC_AUXHTR_H = "FC-BusAux_AuxHeater{0} [g/h]"; + public const string FC_AUXHTR_KM = "FC-BusAux_AuxHeater{0} [k/km]"; + public const string FC_AUXHTR_H_CORR = "FC-BusAux_AuxHeater_Corr{0} [g/h]"; + public const string FC_AUXHTR_KM_CORR = "FC-BusAux_AuxHeater_Corr{0} [g/km]"; public const string FCFINAL_H = "FC-Final{0} [g/h]"; @@ -970,10 +1012,12 @@ namespace TUGraz.VectoCore.OutputData public const string FCFINAL_LITERPER100KM = "FC-Final{0} [l/100km]"; public const string FCFINAL_LITERPER100TKM = "FC-Final{0} [l/100tkm]"; public const string FCFINAL_LiterPer100M3KM = "FC-Final{0} [l/100m³km]"; + public const string FCFINAL_LiterPer100PassengerKM = "FC-Final{0} [l/100Pkm]"; public const string CO2_KM = "CO2 [g/km]"; public const string CO2_TKM = "CO2 [g/tkm]"; public const string CO2_M3KM = "CO2 [g/m³km]"; + public const string CO2_PKM = "CO2 [g/Pkm]"; public const string P_WHEEL_POS = "P_wheel_in_pos [kW]"; public const string P_FCMAP_POS = "P_fcmap_pos [kW]"; @@ -992,6 +1036,7 @@ namespace TUGraz.VectoCore.OutputData public const string E_BusAux_PS_corr = "E_BusAux_PS_corr [kWh]"; public const string E_BusAux_ES_mech_corr = "E_BusAux_ES_mech_corr [kWh]"; + public const string E_BusAux_AuxHeater = "E_BusAux_AuxhHeater [kWh]"; public const string E_AIR = "E_air [kWh]"; public const string E_ROLL = "E_roll [kWh]"; diff --git a/VectoCore/VectoCoreTest/Models/Declaration/BusFactoryTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/BusFactoryTest.cs index 81cad974751af28dd76b5579976a973d4ca0241a..1681fdec841d430459573df6083cdd042cd5fd3d 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/BusFactoryTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/BusFactoryTest.cs @@ -29,7 +29,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration [ TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_nonSmart.xml", 0, TestName = "Run Primary Bus NonSmart HeavyUrban Low"), + TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_SmartPS.xml", -1, TestName = "Run Primary Bus SmartPS ALL"), + TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_SmartPS.xml", 0, TestName = "Run Primary Bus SmartPS HeavyUrban Low"), + TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_SmartPS.xml", 1, TestName = "Run Primary Bus SmartPS HeavyUrban Ref"), + TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_SmartPS.xml", 13, TestName = "Run Primary Bus SmartPS InterUrban Ref"), TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_nonSmart.xml", -1, TestName = "Run Primary Bus NonSmart ALL"), TestCase(@"TestData\Integration\Buses\vecto_vehicle-primary_heavyBus_SmartPS.xml", -1, TestName = "Run Primary Bus SmartPS ALL"), diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index c3f41332e6e610f29dd6e0ebb425d5badeca3de4..30907527c2083b3b87410f18c02e7d3b2cf41fd7 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -234,6 +234,8 @@ namespace TUGraz.VectoCore.Tests.Utils get { return _distance; } } + public Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; } + public KilogramPerWattSecond VehicleLineCorrectionFactor(IFuelProperties fuel) { return 0.SI<KilogramPerWattSecond>();