From 2450c63a9d8e8a5e417960c499a6b72316a2d939 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 10 Nov 2022 20:18:16 +0100 Subject: [PATCH] use separate SSM config for cooling and heating (different system configuration, different heatpumps) extend IACSystem with max values for heating, length of passenger and driver compartment to split heating/cooling demand adding testcases for different HVAC configurations, expected electric and mechanic power, depending on heatpump technologies for heating and cooling --- .../VectoAuxiliariesTests/UnitTests/Utils.vb | 2 +- .../HeatingDistributionCase.cs | 0 .../BusAuxiliaries/IAuxiliaryConfig.cs | 2 + .../IEnvironmentalConditionsMapEntry.cs | 2 + .../BusAuxiliaries/ISSMDeclarationInputs.cs | 20 +- .../FileIO/JSON/BusAuxiliaryInputData.cs | 1 + .../InputData/FileIO/JSON/SSMInputData.cs | 6 +- .../EnvironmentalContidionsMapReader.cs | 1 + .../AbstractSimulationDataAdapter.cs | 9 + ...larationDataAdapterSpecificCompletedBus.cs | 9 + .../EngineeringDataAdapter.cs | 8 +- .../AuxiliaryDataAdapter.cs | 159 ++++++++-- .../Models/BusAuxiliaries/BusAuxiliaries.cs | 4 +- .../HVAC/EnvironmentalConditionMapEntry.cs | 7 +- .../Impl/HVAC/SSMCalculate.cs | 274 +++++++++++++++--- .../DownstreamModules/Impl/HVAC/SSMInputs.cs | 43 ++- .../Models/Declaration/DeclarationData.cs | 3 + .../Models/Declaration/HVACCoolingPower.cs | 26 +- .../OutputData/FileIO/BusAuxWriter.cs | 4 +- .../Buses/HVACHeatingPowerDriver.csv | 11 + .../Buses/HVACHeatingPowerPassenger.csv | 11 + VectoCore/VectoCore/VectoCore.csproj | 2 + .../BusAux/SSMTestHeatingCooling.cs | 240 +++++++++++++++ .../EngineeringModeBusAuxTest.cs | 2 +- .../primary_heavyBus group41.RSLT_VIF.xml | 101 +++---- VectoCore/VectoCoreTest/VectoCoreTest.csproj | 1 + 26 files changed, 813 insertions(+), 135 deletions(-) rename {VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC => VectoCommon/VectoCommon/BusAuxiliaries}/HeatingDistributionCase.cs (100%) create mode 100644 VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerDriver.csv create mode 100644 VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerPassenger.csv create mode 100644 VectoCore/VectoCoreTest/Models/Declaration/BusAux/SSMTestHeatingCooling.cs diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb index b2d94c0129..2d69439f00 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb @@ -125,7 +125,7 @@ Public Class Utils .Technologies = techBenefits, .BusFloorType = FloorType.HighFloor, .BusSurfaceArea = 0.SI(Of SquareMeter), - .BusVolume = 0.SI(Of CubicMeter), + .BusVolumeVentilation = 0.SI(Of CubicMeter), .BusWindowSurface = 0.SI(of SquareMeter), .UValue = 3.SI(Of WattPerKelvinSquareMeter), .VentilationRate = 20.SI(Unit.SI.Per.Hour).Cast (Of PerSecond), diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCase.cs b/VectoCommon/VectoCommon/BusAuxiliaries/HeatingDistributionCase.cs similarity index 100% rename from VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/HeatingDistributionCase.cs rename to VectoCommon/VectoCommon/BusAuxiliaries/HeatingDistributionCase.cs diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs index 2945f0a32a..0e41a07bfb 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs @@ -27,6 +27,8 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { ISSMInputs SSMInputsCooling { get; } + ISSMInputs SSMInputsHeating { get; } + IActuations Actuations { get; } bool ConfigValuesAreTheSameAs(IAuxiliaryConfig other); diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IEnvironmentalConditionsMapEntry.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IEnvironmentalConditionsMapEntry.cs index 7f2c864db8..b8907ffd07 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/IEnvironmentalConditionsMapEntry.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IEnvironmentalConditionsMapEntry.cs @@ -5,6 +5,8 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { public interface IEnvironmentalConditionsMapEntry { + int ID { get; } + Kelvin Temperature { get; } WattPerSquareMeter Solar { get; } diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs b/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs index 6d83f958cd..c5deca2da0 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/ISSMDeclarationInputs.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; namespace TUGraz.VectoCommon.BusAuxiliaries @@ -28,6 +29,8 @@ namespace TUGraz.VectoCommon.BusAuxiliaries string HVACTechnology { get; } + HeatingDistributionCase HeatingDistributionCase { get; } + //HeatPumpType HeatPumpTypeHeatingDriverCompartment { get; } HeatPumpType HeatPumpTypeDriverCompartment { get; } @@ -39,6 +42,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries BusHVACSystemConfiguration HVACSystemConfiguration { get; } string Source { get; } + } public interface ISSMBusParameters @@ -47,7 +51,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries FloorType BusFloorType { get; } SquareMeter BusWindowSurface { get; } SquareMeter BusSurfaceArea { get; } - CubicMeter BusVolume { get; } + CubicMeter BusVolumeVentilation { get; } } public interface ISSMBoundaryConditions @@ -98,7 +102,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries public interface IACSystem { // AC-system - HeatPumpType HVACCompressorType { get; } + //HeatPumpType HVACCompressorType { get; } Watt HVACMaxCoolingPower { get; } @@ -106,6 +110,18 @@ namespace TUGraz.VectoCommon.BusAuxiliaries Watt HVACMaxCoolingPowerPassenger { get; } + HeaterType ElectricHeater { get; } + + Watt MaxHeatingPower { get; } + + Watt MaxHeatingPowerDriver { get; } + + Watt MaxHeatingPowerPassenger { get; } + + double DriverHVACContribution { get; } + + double PassengerHVACContribution { get; } + //double COP { get; } } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs index 6cfb5309d5..c79e5a10cb 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs @@ -58,6 +58,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON PneumaticAuxillariesConfig = pac, PneumaticUserInputsConfig = puc, SSMInputsCooling = ssm, + SSMInputsHeating = ssm, Actuations = actuations, VehicleData = vehicleData }; diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/SSMInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/SSMInputData.cs index e1bab9b6db..0ed8b61fb1 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/SSMInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/SSMInputData.cs @@ -62,17 +62,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON retVal.BusFloorType = genInput.GetEx<string>("BP_FloorType").ParseEnum<FloorType>(); retVal.BusSurfaceArea = genInput.GetEx<double>("BP_BusSurfaceArea").SI<SquareMeter>(); retVal.BusWindowSurface = genInput.GetEx<double>("BP_BusWindowSurfaceArea").SI<SquareMeter>(); - retVal.BusVolume = genInput.GetEx<double>("BP_BusVolume").SI<CubicMeter>(); + retVal.BusVolumeVentilation = genInput.GetEx<double>("BP_BusVolume").SI<CubicMeter>(); retVal.NumberOfPassengers = genInput.GetEx<double>("BP_PassengerCount"); //retVal.EnviromentalTemperature = genInput.GetEx<double>("EC_EnviromentalTemperature").DegCelsiusToKelvin(); //retVal.Solar = genInput.GetEx<double>("EC_Solar").SI<WattPerSquareMeter>(); - retVal.DefaultConditions = new EnvironmentalConditionMapEntry( + retVal.DefaultConditions = new EnvironmentalConditionMapEntry(0, genInput.GetEx<double>("EC_EnviromentalTemperature").DegCelsiusToKelvin(), genInput.GetEx<double>("EC_Solar").SI<WattPerSquareMeter>(), 1.0, heatPumpCoP, heaterEff); //retVal.EnviromentalConditions_BatchFile = genInput.GetEx<string>("EC_EnviromentalConditions_BatchFile"); //retVal.BatchMode = genInput.GetEx<bool>("EC_EnviromentalConditions_BatchEnabled"); - retVal.HVACCompressorType = HeatPumpTypeHelper.Parse(genInput.GetEx<string>("AC_CompressorType")); + //retVal.HVACCompressorType = HeatPumpTypeHelper.Parse(genInput.GetEx<string>("AC_CompressorType")); retVal.HVACMaxCoolingPowerPassenger = genInput.GetEx<double>("AC_CompressorCapacitykW").SI(Unit.SI.Kilo.Watt).Cast<Watt>(); retVal.VentilationOnDuringHeating = genInput.GetEx<bool>("VEN_VentilationOnDuringHeating"); retVal.VentilationWhenBothHeatingAndACInactive = genInput.GetEx<bool>("VEN_VentilationWhenBothHeatingAndACInactive"); diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs index c058f95693..52280ee899 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/EnvironmentalContidionsMapReader.cs @@ -77,6 +77,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData } entries.Add( new EnvironmentalConditionMapEntry( + row.Field<string>(Fields.ID).ToInt(), row.ParseDouble(Fields.EnvTemp).DegCelsiusToKelvin(), row.ParseDouble(Fields.Solar).SI<WattPerSquareMeter>(), row.ParseDouble(Fields.WeightingFactor), diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index a73feb8bf9..7c54f6cb15 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -32,11 +32,17 @@ 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.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; @@ -327,7 +333,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; return flc; } + + } + } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Specific/DeclarationDataAdapterSpecificCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Specific/DeclarationDataAdapterSpecificCompletedBus.cs index e2179f950a..92680d2c5b 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Specific/DeclarationDataAdapterSpecificCompletedBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Specific/DeclarationDataAdapterSpecificCompletedBus.cs @@ -1,10 +1,16 @@ 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.SimulationComponents; +using TUGraz.VectoCore.Models.BusAuxiliaries; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent; @@ -27,8 +33,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Speci IVehicleDeclarationInputData completedVehicle, VectoRunData runData) { throw new NotImplementedException(); + } + + public VehicleData CreateVehicleData(IVehicleDeclarationInputData primaryVehicle, IVehicleDeclarationInputData completedVehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) { diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 251db4d677..ccdb1718ec 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -569,7 +569,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter private IAuxiliaryConfig GetBusAuxiliariesData(VehicleData vehicleData, IBusAuxiliariesEngineeringData busAux) { - return new AuxiliaryConfig() { + var retVal = new AuxiliaryConfig() { //InputData = auxInputData.BusAuxiliariesData, ElectricalUserInputsConfig = new ElectricsUserInputsConfig() { PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage, @@ -637,11 +637,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }, VehicleData = vehicleData, }; + retVal.SSMInputsHeating = retVal.SSMInputsCooling; + return retVal; } private IAuxiliaryConfig GetBatteryElectricBusAuxiliariesData(VehicleData vehicleData, IBusAuxiliariesEngineeringData busAux) { - return new AuxiliaryConfig() { + var retVal = new AuxiliaryConfig() { //InputData = auxInputData.BusAuxiliariesData, ElectricalUserInputsConfig = new ElectricsUserInputsConfig() { PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage, @@ -707,6 +709,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }, VehicleData = vehicleData, }; + retVal.SSMInputsHeating = retVal.SSMInputsCooling; + return retVal; } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs index 29bbf551ab..5019a88890 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs @@ -399,8 +399,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen ? 2 * Constants.BusParameters.DriverCompartmentLength // OK : DeclarationData.BusAuxiliaries.CalculateInternalLength(busParams.VehicleLength, busParams.VehicleCode, 10); // missing: correction length for low floor buses + var ventilationLength = DeclarationData.BusAuxiliaries.CalculateInternalLength(busParams.VehicleLength, + busParams.VehicleCode, 10); var internalHeight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(mission.BusParameter.VehicleCode, RegistrationClass.II, busParams.BodyHeight); var coolingPower = CalculateMaxCoolingPower(mission, applicableHVACConfiguration); + var heatingPower = CalculateMaxHeatingPower(mission, applicableHVACConfiguration); var retVal = GetDefaulSSMInputs(heatingFuel); retVal.BusFloorType = busParams.VehicleCode.GetFloorType(); @@ -411,7 +414,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen 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.BusVolumeVentilation = ventilationLength * busParams.VehicleWidth * internalHeight; retVal.UValue = DeclarationData.BusAuxiliaries.UValue(busParams.VehicleCode.GetFloorType()); retVal.NumberOfPassengers = @@ -424,14 +427,26 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen //retVal.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2; retVal.HVACMaxCoolingPowerDriver = coolingPower.Item1; retVal.HVACMaxCoolingPowerPassenger = coolingPower.Item2; + retVal.MaxHeatingPowerDriver = heatingPower.Item1; + retVal.MaxHeatingPowerPassenger = heatingPower.Item2; retVal.HeatPumpTypeDriverCompartment = driverHeatpumpType; retVal.HeatPumpTypePassengerCompartment = passengerHeatpumpType; retVal.HVACSystemConfiguration = applicableHVACConfiguration; - retVal.HVACCompressorType = passengerHeatpumpType; // use passenger compartment - + //retVal.HVACCompressorType = passengerHeatpumpType; // use passenger compartment + + retVal.DriverCompartmentLength = applicableHVACConfiguration.RequiresDriverAC() + ? applicableHVACConfiguration.IsOneOf(BusHVACSystemConfiguration.Configuration2, BusHVACSystemConfiguration.Configuration4) + ? 2 * Constants.BusParameters.DriverCompartmentLength + : Constants.BusParameters.DriverCompartmentLength + : 0.SI<Meter>(); + retVal.PassengerCompartmentLength = applicableHVACConfiguration.RequiresPassengerAC() + ? applicableHVACConfiguration.IsOneOf(BusHVACSystemConfiguration.Configuration2, BusHVACSystemConfiguration.Configuration4) + ? 0.SI<Meter>() + : internalLength - Constants.BusParameters.DriverCompartmentLength + : 0.SI<Meter>(); return retVal; } @@ -552,6 +567,24 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return Tuple.Create(driver, passenger); } + protected virtual Tuple<Watt, Watt> CalculateMaxHeatingPower(Mission mission, BusHVACSystemConfiguration hvacConfiguration) + { + 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.HVACMaxHeatingPower.DriverMaxHeatingPower( + hvacConfiguration, mission.MissionType); + var passenger = DeclarationData.BusAuxiliaries.HVACMaxHeatingPower.PassengerMaxHeatingPower( + hvacConfiguration, mission.MissionType, volume); + + return Tuple.Create(driver, passenger); + } + #region Overrides of AuxiliaryDataAdapter public override AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData primaryVehicle, VectoRunData runData) @@ -683,7 +716,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return false; } - protected double CalculateLengthDependentElectricalConsumers(Mission mission, IVehicleDeclarationInputData vehicleData) + protected override double CalculateLengthDependentElectricalConsumers(Mission mission, IVehicleDeclarationInputData vehicleData) { var busParams = mission.BusParameter; return DeclarationData.BusAuxiliaries.CalculateLengthInteriorLights( @@ -709,12 +742,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen completedVehicle.VehicleCode, completedVehicle.LowEntry, primaryVehicle.AxleConfiguration.NumAxles(), primaryVehicle.Articulated); - var pasengerCompartmentLength = DeclarationData.BusAuxiliaries.CalculateInternalLength( + var passengerCompartmentLength = DeclarationData.BusAuxiliaries.CalculateInternalLength( completedVehicle.Length, completedVehicle.VehicleCode, (int)completedVehicle.NumberPassengerSeatsLowerDeck) - Constants.BusParameters.DriverCompartmentLength - correctionLengthDrivetrainVolume; var internalHeight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(completedVehicle.VehicleCode, completedVehicle.RegisteredClass, completedVehicle.Height); - var volume = pasengerCompartmentLength * internalHeight * completedVehicle.Width; + var volume = passengerCompartmentLength * internalHeight * completedVehicle.Width; var driver = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.DriverMaxCoolingPower( hvacConfiguration, mission.MissionType); @@ -724,6 +757,37 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return Tuple.Create(driver, passenger); } + private Tuple<Watt, Watt> CalculateMaxHeatingPower(IVehicleDeclarationInputData completedVehicle, + IVehicleDeclarationInputData primaryVehicle, + Mission mission, BusHVACSystemConfiguration hvacConfiguration) + { + //var hvacConfiguration = completedVehicle.Components.BusAuxiliaries.HVACAux.SystemConfiguration; + if (hvacConfiguration.IsOneOf(BusHVACSystemConfiguration.Configuration0, BusHVACSystemConfiguration.Unknown)) { + throw new VectoException( + $"HVAC Configuration {hvacConfiguration.ToXmlFormat()} is invalid for final step"); + } + + var correctionLengthDrivetrainVolume = DeclarationData.BusAuxiliaries.CorrectionLengthDrivetrainVolume( + completedVehicle.VehicleCode, completedVehicle.LowEntry, primaryVehicle.AxleConfiguration.NumAxles(), + primaryVehicle.Articulated); + + var passengerCompartmentLength = DeclarationData.BusAuxiliaries.CalculateInternalLength( + completedVehicle.Length, completedVehicle.VehicleCode, + (int)completedVehicle.NumberPassengerSeatsLowerDeck) - Constants.BusParameters.DriverCompartmentLength - correctionLengthDrivetrainVolume; + + var internalHeight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(completedVehicle.VehicleCode, completedVehicle.RegisteredClass, completedVehicle.Height); + var volume = passengerCompartmentLength * internalHeight * completedVehicle.Width; + + var driver = DeclarationData.BusAuxiliaries.HVACMaxHeatingPower.DriverMaxHeatingPower( + hvacConfiguration, mission.MissionType); + var passenger = DeclarationData.BusAuxiliaries.HVACMaxHeatingPower.PassengerMaxHeatingPower( + hvacConfiguration, mission.MissionType, volume); + + return Tuple.Create(driver, passenger); + } + + + private PneumaticUserInputsConfig CreatePneumaticUserInputsConfig(IBusAuxiliariesDeclarationData primaryBusAuxiliaries, IVehicleDeclarationInputData completedVehicle) { @@ -798,20 +862,41 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen throw new VectoException("HeatPumpTypePassengerCompartment Heating input parameter is required"); } - if (hvacConfiguration.RequiresDriverAC() && - (busAux.HeatPumpTypeCoolingDriverCompartment == HeatPumpType.none || - busAux.HeatPumpTypeHeatingDriverCompartment == HeatPumpType.none)) { - throw new VectoException("HVAC System Configuration {0} requires a Driver Heatpump Technology", - hvacConfiguration); + var hvacConfigCooling = DeclarationData.BusAuxiliaries.GetHVACConfig(hvacConfiguration.Value, + busAux.HeatPumpTypeCoolingDriverCompartment.Value, busAux.HeatPumpTypeCoolingPassengerCompartment.Value); + var hvacConfigHeating = DeclarationData.BusAuxiliaries.GetHVACConfig(hvacConfiguration.Value, + busAux.HeatPumpTypeHeatingDriverCompartment.Value, busAux.HeatPumpTypeHeatingPassengerCompartment.Value); + + if (hvacConfigHeating != hvacConfiguration && hvacConfigCooling != hvacConfiguration) { + throw new VectoException( + $"The HVAC System Configuration must be either matched for the case heating or cooling h:{hvacConfigHeating.GetName()}/c:{hvacConfigCooling.GetName()}"); } - if (hvacConfiguration.RequiresPassengerAC() && - (busAux.HeatPumpTypeCoolingPassengerCompartment == HeatPumpType.none || - busAux.HeatPumpTypeHeatingPassengerCompartment == HeatPumpType.none)) { - throw new VectoException("HVAC System Configuration {0} requires a Passenger Heatpump Technology", - hvacConfiguration); + var xEVBus = !primaryVehicle.VehicleType.IsOneOf(VectoSimulationJobType.ConventionalVehicle, + VectoSimulationJobType.EngineOnlySimulation); + if (xEVBus && busAux.AirElectricHeater == null) { + throw new VectoException("AirElectricHeater input parameter is required for xEV vehicles"); + } + if (xEVBus && busAux.WaterElectricHeater == null) { + throw new VectoException("AirElectricHeater input parameter is required for xEV vehicles"); + } + if (xEVBus && busAux.OtherHeatingTechnology == null) { + throw new VectoException("AirElectricHeater input parameter is required for xEV vehicles"); } + //if (hvacConfiguration.RequiresDriverAC() && + // (busAux.HeatPumpTypeCoolingDriverCompartment == HeatPumpType.none || + // busAux.HeatPumpTypeHeatingDriverCompartment == HeatPumpType.none)) { + // throw new VectoException("HVAC System Configuration {0} requires a Driver Heatpump Technology", + // hvacConfiguration); + //} + //if (hvacConfiguration.RequiresPassengerAC() && + // (busAux.HeatPumpTypeCoolingPassengerCompartment == HeatPumpType.none || + // busAux.HeatPumpTypeHeatingPassengerCompartment == HeatPumpType.none)) { + // throw new VectoException("HVAC System Configuration {0} requires a Passenger Heatpump Technology", + // hvacConfiguration); + //} + var applicableSystemConfigCooling = DeclarationData.BusAuxiliaries.GetHVACConfig(hvacConfiguration.Value, busAux.HeatPumpTypeCoolingDriverCompartment.Value, busAux.HeatPumpTypeCoolingPassengerCompartment.Value); var applicableSystemConfigHeating = DeclarationData.BusAuxiliaries.GetHVACConfig(hvacConfiguration.Value, @@ -820,13 +905,31 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var ssmCooling = DoGetSsmInputs(mission, completedVehicle, primaryVehicle, loadingType, applicableSystemConfigCooling, busAux.HeatPumpTypeCoolingDriverCompartment.Value, busAux.HeatPumpTypeCoolingPassengerCompartment.Value); + ssmCooling.ElectricHeater = HeaterType.None; var ssmHeating = DoGetSsmInputs(mission, completedVehicle, primaryVehicle, loadingType, applicableSystemConfigHeating, busAux.HeatPumpTypeHeatingDriverCompartment.Value, busAux.HeatPumpTypeHeatingPassengerCompartment.Value); + ssmHeating.ElectricHeater = GetElectricHeater(busAux); return (ssmCooling, ssmHeating); } + private HeaterType GetElectricHeater(IHVACBusAuxiliariesDeclarationData busAux) + { + var retVal = HeaterType.None; + if (busAux.AirElectricHeater.HasValue && busAux.AirElectricHeater.Value) { + retVal |= HeaterType.AirElectricHeater; + } + if (busAux.WaterElectricHeater.HasValue && busAux.WaterElectricHeater.Value) { + retVal |= HeaterType.WaterElectricHeater; + } + if (busAux.OtherHeatingTechnology.HasValue && busAux.OtherHeatingTechnology.Value) { + retVal |= HeaterType.OtherElectricHeating; + } + + return retVal; + } + private SSMInputs DoGetSsmInputs(Mission mission, IVehicleDeclarationInputData completedVehicle, IVehicleDeclarationInputData primaryVehicle, LoadingType loadingType, BusHVACSystemConfiguration hvacConfiguration, HeatPumpType heatPumpTypeDriverCompartment, @@ -839,6 +942,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen : DeclarationData.BusAuxiliaries.CalculateInternalLength( completedVehicle.Length, completedVehicle.VehicleCode, completedVehicle.NumberPassengerSeatsLowerDeck.Value); + var ventilationLength = DeclarationData.BusAuxiliaries.CalculateInternalLength(completedVehicle.Length, + completedVehicle.VehicleCode, + completedVehicle.NumberPassengerSeatsLowerDeck.Value); var correctionLengthDrivetrainVolume = DeclarationData.BusAuxiliaries.CorrectionLengthDrivetrainVolume( completedVehicle.VehicleCode, completedVehicle.LowEntry, primaryVehicle.AxleConfiguration.NumAxles(), primaryVehicle.Articulated); @@ -847,7 +953,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var correctedBusWidth = DeclarationData.BusAuxiliaries.CorrectedBusWidth(completedVehicle.Width); var coolingPower = CalculateMaxCoolingPower(completedVehicle, primaryVehicle, mission, hvacConfiguration); - + var heatingPower = CalculateMaxHeatingPower(completedVehicle, primaryVehicle, mission, hvacConfiguration); var ssmInputs = _primaryBusDataAdapter.GetDefaulSSMInputs(FuelData.Diesel); ssmInputs.BusFloorType = completedVehicle.VehicleCode.GetFloorType(); @@ -857,7 +963,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen DeclarationData.BusAuxiliaries.FrontAndRearWindowArea(isDoubleDecker); ssmInputs.BusSurfaceArea = 2 * (completedVehicle.Length * correctedBusWidth + internalLength * internalHeight + (isDoubleDecker ? 2.0 : 1.0) * correctedBusWidth * completedVehicle.Height); // use equations sent by Tobias - ssmInputs.BusVolume = (internalLength - correctionLengthDrivetrainVolume) * correctedBusWidth * internalHeight; + ssmInputs.BusVolumeVentilation = (ventilationLength - correctionLengthDrivetrainVolume) * correctedBusWidth * internalHeight; ssmInputs.UValue = DeclarationData.BusAuxiliaries.UValue(completedVehicle.VehicleCode.GetFloorType()); ssmInputs.NumberOfPassengers = GetNumberOfPassengers( @@ -871,6 +977,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen //ssmInputs.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2; ssmInputs.HVACMaxCoolingPowerDriver = coolingPower.Item1; ssmInputs.HVACMaxCoolingPowerPassenger = coolingPower.Item2; + ssmInputs.MaxHeatingPowerDriver = heatingPower.Item1; + ssmInputs.MaxHeatingPowerPassenger = heatingPower.Item2; //ssmInputs.HeatPumpTypeHeatingDriverCompartment = busAux.HeatPumpTypeHeatingDriverCompartment.Value; ssmInputs.HeatPumpTypeDriverCompartment = heatPumpTypeDriverCompartment; @@ -878,8 +986,19 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen ssmInputs.HeatPumpTypePassengerCompartment = heatPumpTypePassengerCompartment; ssmInputs.HVACSystemConfiguration = hvacConfiguration; - - ssmInputs.HVACCompressorType = heatPumpTypePassengerCompartment; // use passenger compartment + + ssmInputs.DriverCompartmentLength = hvacConfiguration.RequiresDriverAC() + ? hvacConfiguration.IsOneOf(BusHVACSystemConfiguration.Configuration2, BusHVACSystemConfiguration.Configuration4) + ? 2 * Constants.BusParameters.DriverCompartmentLength + : Constants.BusParameters.DriverCompartmentLength + : 0.SI<Meter>(); + ssmInputs.PassengerCompartmentLength = hvacConfiguration.RequiresPassengerAC() + ? hvacConfiguration.IsOneOf(BusHVACSystemConfiguration.Configuration2, BusHVACSystemConfiguration.Configuration4) + ? 0.SI<Meter>() + : internalLength - Constants.BusParameters.DriverCompartmentLength + : 0.SI<Meter>(); + + //ssmInputs.HVACCompressorType = heatPumpTypePassengerCompartment; // use passenger compartment return ssmInputs; } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs index ab5e99422d..6497224abd 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs @@ -166,12 +166,12 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries throw new VectoException("Auxiliary configuration missing!"); } - if (auxConfig.SSMInputsCooling is ISSMEngineeringInputs ssmEngineeringInputs) { + if (auxConfig.SSMInputsHeating is ISSMEngineeringInputs ssmEngineeringInputs) { var M14eng = new M14bImpl(ssmEngineeringInputs); return M14eng.AuxHeaterDemand(cycleTime, engineWasteHeatTotal); } - var M14 = new M14aImpl(new SSMTOOL(auxConfig.SSMInputsCooling)); + var M14 = new M14aImpl(new SSMTOOL(auxConfig.SSMInputsHeating)); return M14.AuxHeaterDemand(cycleTime, engineWasteHeatTotal); } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/EnvironmentalConditionMapEntry.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/EnvironmentalConditionMapEntry.cs index 12884e42c7..d4a00040f9 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/EnvironmentalConditionMapEntry.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/EnvironmentalConditionMapEntry.cs @@ -6,14 +6,15 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC { public class EnvironmentalConditionMapEntry : IEnvironmentalConditionsMapEntry { - public EnvironmentalConditionMapEntry(Kelvin temperature, WattPerSquareMeter solar, double weight) : this( + public EnvironmentalConditionMapEntry(Kelvin temperature, WattPerSquareMeter solar, double weight) : this(-1, temperature, solar, weight, new Dictionary<HeatPumpType, double>(), new Dictionary<HeaterType, double>()) { } - public EnvironmentalConditionMapEntry(Kelvin temperature, WattPerSquareMeter solar, double weight, + public EnvironmentalConditionMapEntry(int id, Kelvin temperature, WattPerSquareMeter solar, double weight, Dictionary<HeatPumpType, double> heatPumpCoP, Dictionary<HeaterType, double> heaterEfficiency) { + ID = id; Temperature = temperature; Solar = solar; Weighting = weight; @@ -21,6 +22,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC HeaterEfficiency = heaterEfficiency; } + public int ID { get; } + public IReadOnlyDictionary<HeaterType, double> HeaterEfficiency { get; } public IReadOnlyDictionary<HeatPumpType, double> HeatPumpCoP { get; } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs index 353f544600..a53e7929fb 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMCalculate.cs @@ -169,9 +169,68 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC } } + public Watt AverageHeatingPowerHeatPumpElectric + { + get + { + var averagePower = 0.0.SI<Watt>(); + var gen = ssmTOOL.SSMInputs.EnvironmentalConditions; + var tl = ssmTOOL.TechList; + + if (!gen.BatchMode) { + averagePower = + CalculateAverageHeatpumpHeatingPowerElectric(ssmTOOL.SSMInputs, tl, gen.DefaultConditions); + } else { + foreach (var envCondition in gen.EnvironmentalConditionsMap.GetEnvironmentalConditions()) + averagePower += CalculateAverageHeatpumpHeatingPowerElectric( + ssmTOOL.SSMInputs, tl, envCondition); + } + + return averagePower; + } + } + + public Watt AverageHeatingPowerHeatPumpMech { + get { + var averagePower = 0.0.SI<Watt>(); + var gen = ssmTOOL.SSMInputs.EnvironmentalConditions; + var tl = ssmTOOL.TechList; + + if (!gen.BatchMode) { + averagePower = + CalculateAverageHeatpumpHeatingPowerMech(ssmTOOL.SSMInputs, tl, gen.DefaultConditions); + } else { + foreach (var envCondition in gen.EnvironmentalConditionsMap.GetEnvironmentalConditions()) + averagePower += CalculateAverageHeatpumpHeatingPowerMech( + ssmTOOL.SSMInputs, tl, envCondition); + } + + return averagePower; + } + } + + public Watt AverageHeatingPowerElectricHeater { + get { + var averagePower = 0.0.SI<Watt>(); + var gen = ssmTOOL.SSMInputs.EnvironmentalConditions; + var tl = ssmTOOL.TechList; + + if (!gen.BatchMode) { + averagePower = + CalculateAverageHeatingPowerElectricHeater(ssmTOOL.SSMInputs, tl, gen.DefaultConditions); + } else { + foreach (var envCondition in gen.EnvironmentalConditionsMap.GetEnvironmentalConditions()) + averagePower += CalculateAverageHeatingPowerElectricHeater( + ssmTOOL.SSMInputs, tl, envCondition); + } + + return averagePower; + } + } + // Base Values - + public Watt BaseHeatingW_ElectricalVentilation(Kelvin environmentalTemperature, WattPerSquareMeter solar) { @@ -225,6 +284,10 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var gen = ssmTOOL.SSMInputs; + if (environmentalTemperature < gen.BoundaryConditions.TemperatureCoolingTurnsOff) { + return 0.SI<Watt>(); + } + // Dim C46 = gen.EC_EnviromentalTemperature // Dim C28 = gen.BC_TemperatureCoolingTurnsOff // Dim C53 = gen.AC_CompressorTypeDerived @@ -234,13 +297,24 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var run1TotalW = Run1.TotalW(environmentalTemperature, solar); var run2TotalW = Run2.TotalW(environmentalTemperature, solar); - return environmentalTemperature < gen.BoundaryConditions.TemperatureCoolingTurnsOff - ? 0.SI<Watt>() - : gen.ACSystem.HVACCompressorType.IsElectrical() - ? 0.SI<Watt>() - : run1TotalW > 0 && run2TotalW > 0 - ? VectoMath.Min(run1TotalW, run2TotalW) - : 0.SI<Watt>(); + if (run1TotalW.IsSmallerOrEqual(0) || run2TotalW.IsSmallerOrEqual(0)) { + return 0.SI<Watt>(); + } + + var coolingPwr = VectoMath.Min(run1TotalW, run2TotalW); + var driverContribution = coolingPwr * gen.ACSystem.DriverHVACContribution; + var passengerContribution = coolingPwr * gen.ACSystem.PassengerHVACContribution; + var retVal = (gen.HeatPumpTypeDriverCompartment.IsMechanical() ? driverContribution : 0.SI<Watt>()) + + (gen.HeatPumpTypePassengerCompartment.IsMechanical() ? passengerContribution : 0.SI<Watt>()); + return retVal; + + //return environmentalTemperature < gen.BoundaryConditions.TemperatureCoolingTurnsOff + // ? 0.SI<Watt>() + // : gen.ACSystem.HVACCompressorType.IsElectrical() + // ? 0.SI<Watt>() + // : run1TotalW > 0 && run2TotalW > 0 + // ? VectoMath.Min(run1TotalW, run2TotalW) + // : 0.SI<Watt>(); } protected Watt BaseCoolingW_ElectricalCoolingHeating(Kelvin environmentalTemperature, WattPerSquareMeter solar) @@ -249,6 +323,10 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var gen = ssmTOOL.SSMInputs; + if (environmentalTemperature < gen.BoundaryConditions.TemperatureCoolingTurnsOff) { + return 0.SI<Watt>(); + } + // Dim C46 = gen.EC_EnviromentalTemperature // Dim C28 = gen.BC_TemperatureCoolingTurnsOff // Dim C53 = gen.AC_CompressorTypeDerived @@ -257,13 +335,25 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var run1TotalW = Run1.TotalW(environmentalTemperature, solar); var run2TotalW = Run2.TotalW(environmentalTemperature, solar); - return environmentalTemperature < gen.BoundaryConditions.TemperatureCoolingTurnsOff - ? 0.SI<Watt>() - : gen.ACSystem.HVACCompressorType.IsElectrical() - ? run1TotalW > 0 && run2TotalW > 0 - ? VectoMath.Min(run1TotalW, run2TotalW) - : 0.SI<Watt>() - : 0.SI<Watt>(); + + if (run1TotalW.IsSmallerOrEqual(0) || run2TotalW.IsSmallerOrEqual(0)) { + return 0.SI<Watt>(); + } + + var coolingPwr = VectoMath.Min(run1TotalW, run2TotalW); + var driverContribution = coolingPwr * gen.ACSystem.DriverHVACContribution; + var passengerContribution = coolingPwr * gen.ACSystem.PassengerHVACContribution; + var retVal = (gen.HeatPumpTypeDriverCompartment.IsElectrical() ? driverContribution : 0.SI<Watt>()) + + (gen.HeatPumpTypePassengerCompartment.IsElectrical() ? passengerContribution : 0.SI<Watt>()); + return retVal; + + //return environmentalTemperature < gen.BoundaryConditions.TemperatureCoolingTurnsOff + // ? 0.SI<Watt>() + // : gen.ACSystem.HVACCompressorType.IsElectrical() + // ? run1TotalW > 0 && run2TotalW > 0 + // ? VectoMath.Min(run1TotalW, run2TotalW) + // : 0.SI<Watt>() + // : 0.SI<Watt>(); } protected Watt BaseCoolingW_ElectricalVentilation(Kelvin environmentalTemperature, WattPerSquareMeter solar) @@ -375,9 +465,9 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // Math.Max(If(gen.AC_CompressorType.ToLower() = "mechanical", tl.CValueVariation, 0), // -gen.BC_MaxPossibleBenefitFromTechnologyList)) - if (gen.ACSystem.HVACCompressorType.IsElectrical()) { - return 0; - } + //if (gen.ACSystem.HVACCompressorType.IsElectrical()) { + // return 0; + //} return tl.CValueVariation.LimitTo( -gen.BoundaryConditions.MaxPossibleBenefitFromTechnologyList, @@ -397,9 +487,9 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // Dim C43 As Double = gen.BC_MaxPossibleBenefitFromTechnologyList // Dim C53 As string = gen.AC_CompressorType - if (gen.ACSystem.HVACCompressorType.IsMechanical()) { - return 0; - } + //if (gen.ACSystem.HVACCompressorType.IsMechanical()) { + // return 0; + //} return tl.CValueVariation.LimitTo( -gen.BoundaryConditions.MaxPossibleBenefitFromTechnologyList, @@ -456,12 +546,11 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // Dim I94 = BaseCoolingW_ElectricalVentilation // Dim I95 = BaseVentilationW_ElectricalVentilation - var cop = GetCoP(genInputs, env); + var cop = GetCoPCooling(genInputs, env); var electricCoolingPower = double.IsNaN(cop) ? 0.SI<Watt>() : VectoMath.Min(BaseCoolingW_ElectricalCoolingHeating(env.Temperature, env.Solar), - genInputs.ACSystem.HVACMaxCoolingPower) / - cop; + genInputs.ACSystem.HVACMaxCoolingPower) / cop; var electricalWBaseCurrentResult = electricCoolingPower + BaseHeatingW_ElectricalVentilation(env.Temperature, env.Solar) + @@ -471,7 +560,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC return electricalWBaseCurrentResult * env.Weighting; } - private double GetCoP(ISSMDeclarationInputs genInputs, IEnvironmentalConditionsMapEntry env) + private double GetCoPCooling(ISSMDeclarationInputs genInputs, IEnvironmentalConditionsMapEntry env) { var hvacConfig = genInputs.HVACSystemConfiguration; if (hvacConfig.RequiresDriverAC() && hvacConfig.RequiresPassengerAC()) { @@ -504,6 +593,39 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC return double.NaN; } + private double GetCoPHeating(ISSMDeclarationInputs genInputs, IEnvironmentalConditionsMapEntry env) + { + var hvacConfig = genInputs.HVACSystemConfiguration; + if (hvacConfig.RequiresDriverAC() && hvacConfig.RequiresPassengerAC()) { + var heatingTechDriver = genInputs.HeatPumpTypeDriverCompartment; + var heatingTechPassenger = genInputs.HeatPumpTypePassengerCompartment; + + var copDriver = env.HeatPumpCoP.ContainsKey(heatingTechDriver) ? env.HeatPumpCoP[heatingTechDriver] : double.NaN; + var copPassenger = env.HeatPumpCoP.ContainsKey(heatingTechPassenger) ? env.HeatPumpCoP[heatingTechPassenger] : double.NaN; + + if (double.IsNaN(copDriver) || double.IsNaN(copPassenger)) { + return double.NaN; + } + + return (genInputs.ACSystem.MaxHeatingPowerDriver * copDriver + genInputs.ACSystem.MaxHeatingPowerPassenger * copPassenger) / + (genInputs.ACSystem.MaxHeatingPowerDriver + genInputs.ACSystem.MaxHeatingPowerPassenger); + } + + if (hvacConfig.RequiresPassengerAC()) { + var heatingTechPassenger = genInputs.HeatPumpTypePassengerCompartment; + var copPassenger = env.HeatPumpCoP.ContainsKey(heatingTechPassenger) ? env.HeatPumpCoP[heatingTechPassenger] : double.NaN; + return copPassenger; + } + + if (hvacConfig.RequiresDriverAC()) { + var heatingTechDriver = genInputs.HeatPumpTypeDriverCompartment; + var copDriver = env.HeatPumpCoP.ContainsKey(heatingTechDriver) ? env.HeatPumpCoP[heatingTechDriver] : double.NaN; + return copDriver; + } + + return double.NaN; + } + private Watt CalculateMechanicalWBase(ISSMDeclarationInputs genInputs, IEnvironmentalConditionsMapEntry env) { // =MIN(F94,C54*1000)/C59 @@ -512,7 +634,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // Dim C54 = genInputs.AC_CompressorCapacitykW // Dim C59 = genInputs.AC_COP - var cop = GetCoP(genInputs, env); + var cop = GetCoPCooling(genInputs, env); var mechanicalWBaseCurrentResult = double.IsNaN(cop) ? 0.SI<Watt>() @@ -550,7 +672,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var H94 = BaseCoolingW_ElectricalCoolingHeating(env.Temperature, env.Solar); var H100 = TechListAdjustedCoolingW_ElectricalCoolingHeating; var C54 = genInputs.ACSystem.HVACMaxCoolingPower; - var C59 = GetCoP(genInputs, env); + var C59 = GetCoPCooling(genInputs, env); if (double.IsNaN(C59) && H94.IsEqual(0)) { return 0.SI<Watt>(); } @@ -575,7 +697,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC var F94 = BaseCoolingW_Mechanical(env.Temperature, env.Solar); var F100 = TechListAdjustedCoolingW_Mechanical; var C54 = genInputs.ACSystem.HVACMaxCoolingPower; - var C59 = GetCoP(genInputs, env); + var C59 = GetCoPCooling(genInputs, env); if (double.IsNaN(C59) && F94.IsEqual(0)) { return 0.SI<Watt>(); } @@ -586,6 +708,96 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC private Watt CalculateAverageAuxHeaterPower( ISSMDeclarationInputs genInputs, ISSMTechnologyBenefits tecList, IEnvironmentalConditionsMapEntry env) + { + var heatingPower = CalculateAverageHeatingPower(genInputs, tecList, env); + var heatingDistributionCase = genInputs.HeatingDistributionCase; + var heatingDistribution = + DeclarationData.BusAuxiliaries.HeatingDistribution.Lookup(heatingDistributionCase, env.ID); + + var auxHeaterPower = heatingPower * (heatingDistribution?.GetFuelHeaterContribution() ?? 0); + var auxHeaterPowerLtd = VectoMath.Min(auxHeaterPower, genInputs.AuxHeater.FuelFiredHeaterPower) / + genInputs.BoundaryConditions.AuxHeaterEfficiency; + + return auxHeaterPowerLtd * env.Weighting; + } + + private Watt CalculateAverageHeatpumpHeatingPowerMech(ISSMDeclarationInputs genInputs, + ISSMTechnologyBenefits tecList, IEnvironmentalConditionsMapEntry env) + { + var heatingPower = CalculateAverageHeatingPower(genInputs, tecList, env); + var heatingDistributionCase = genInputs.HeatingDistributionCase; + var heatingDistribution = + DeclarationData.BusAuxiliaries.HeatingDistribution.Lookup(heatingDistributionCase, env.ID); + + var heaterPower = heatingPower * (heatingDistribution?.GetHeatpumpContribution(genInputs.HeatPumpTypeDriverCompartment) ?? 0); + var cop = GetCoPHeating(genInputs, env); + var heaterPowerLtd = heaterPower.IsEqual(0) || double.IsNaN(cop) ? 0.SI<Watt>() : VectoMath.Min(heaterPower, genInputs.ACSystem.MaxHeatingPower) / cop; + + var driverContribution = heaterPowerLtd * genInputs.ACSystem.DriverHVACContribution; + var passengerContribution = heaterPowerLtd * genInputs.ACSystem.PassengerHVACContribution; + var retVal = (genInputs.HeatPumpTypeDriverCompartment.IsMechanical() ? driverContribution : 0.SI<Watt>()) + + (genInputs.HeatPumpTypePassengerCompartment.IsMechanical() ? passengerContribution : 0.SI<Watt>()); + + return retVal * env.Weighting; + } + + private Watt CalculateAverageHeatpumpHeatingPowerElectric(ISSMDeclarationInputs genInputs, + ISSMTechnologyBenefits tecList, IEnvironmentalConditionsMapEntry env) + { + var heatingPower = CalculateAverageHeatingPower(genInputs, tecList, env); + var heatingDistributionCase = genInputs.HeatingDistributionCase; + var heatingDistribution = + DeclarationData.BusAuxiliaries.HeatingDistribution.Lookup(heatingDistributionCase, env.ID); + + var heaterPower = heatingPower * (heatingDistribution?.GetHeatpumpContribution(genInputs.HeatPumpTypeDriverCompartment) ?? 0); + var cop = GetCoPHeating(genInputs, env); + var heaterPowerLtd = heaterPower.IsEqual(0) || double.IsNaN(cop) ? 0.SI<Watt>() : VectoMath.Min(heaterPower, genInputs.ACSystem.MaxHeatingPower) / cop; + + var driverContribution = heaterPowerLtd * genInputs.ACSystem.DriverHVACContribution; + var passengerContribution = heaterPowerLtd * genInputs.ACSystem.PassengerHVACContribution; + var retVal = (genInputs.HeatPumpTypeDriverCompartment.IsElectrical() ? driverContribution : 0.SI<Watt>()) + + (genInputs.HeatPumpTypePassengerCompartment.IsElectrical() ? passengerContribution : 0.SI<Watt>()); + + return retVal * env.Weighting; + } + + private Watt CalculateAverageHeatingPowerElectricHeater(ISSMDeclarationInputs genInputs, + ISSMTechnologyBenefits tecList, IEnvironmentalConditionsMapEntry env) + { + var heatingPower = CalculateAverageHeatingPower(genInputs, tecList, env); + var heatingDistributionCase = genInputs.HeatingDistributionCase; + var heatingDistribution = + DeclarationData.BusAuxiliaries.HeatingDistribution.Lookup(heatingDistributionCase, env.ID); + + var heaterPower = heatingPower * (heatingDistribution?.GetElectricHeaterContribution(genInputs.ACSystem.ElectricHeater) ?? 0); + var efficiency = GetElectricHeaterEfficiency(genInputs, env); + var heaterPowerLtd = heaterPower.IsEqual(0) || double.IsNaN(efficiency) ? 0.SI<Watt>() : VectoMath.Min(heaterPower, genInputs.ACSystem.MaxHeatingPower) / efficiency; + + var driverContribution = heaterPowerLtd * genInputs.ACSystem.DriverHVACContribution; + var passengerContribution = heaterPowerLtd * genInputs.ACSystem.PassengerHVACContribution; + var retVal = (genInputs.HeatPumpTypeDriverCompartment.IsElectrical() ? driverContribution : 0.SI<Watt>()) + + (genInputs.HeatPumpTypePassengerCompartment.IsElectrical() ? passengerContribution : 0.SI<Watt>()); + + return retVal * env.Weighting; + } + + private double GetElectricHeaterEfficiency(ISSMDeclarationInputs genInputs, IEnvironmentalConditionsMapEntry env) + { + var cnt = 0; + var sum = 0.0; + foreach (var heaterType in EnumHelper.GetValues<HeaterType>()) { + if ((genInputs.ACSystem.ElectricHeater & heaterType) == 0) { + continue; + } + + cnt++; + sum += env.HeaterEfficiency[heaterType]; + } + return sum / cnt; + } + + private Watt CalculateAverageHeatingPower( + ISSMDeclarationInputs 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)) @@ -609,12 +821,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC ? Run1.TechListAmendedFuelHeater(env.Temperature, env.Solar) : Run2.TechListAmendedFuelHeater(env.Temperature, env.Solar)).Value().SI<Watt>(); } + return result; - var auxHeaterPower = VectoMath.Min(result, genInputs.AuxHeater.FuelFiredHeaterPower) / - genInputs.BoundaryConditions.AuxHeaterEfficiency; - // / (genInputs.BoundaryConditions.GCVDieselOrHeatingOil /* * ssmTOOL.HVACConstants.FuelDensity*/); - - return auxHeaterPower * env.Weighting; } } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMInputs.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMInputs.cs index 8eb8d491f9..6c842a9a15 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMInputs.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/HVAC/SSMInputs.cs @@ -13,6 +13,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC IAuxHeater, ISSMBusParameters { private readonly IFuelProperties HeatingFuel; + private HeatingDistributionCase? _heatingDistributionCase; public SSMInputs(string source, IFuelProperties heatingFuel = null) { @@ -35,7 +36,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC public SquareMeter BusWindowSurface { get; internal set; } // D11/C11 - ( M/3 ) - public CubicMeter BusVolume { get; internal set; } + public CubicMeter BusVolumeVentilation { get; internal set; } // C17 public double GFactor { get; set; } @@ -80,7 +81,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC public Watt VentPower(bool heating) { // =C31*C35 - return BusVolume * (heating ? VentilationRateHeating : VentilationRate) * SpecificVentilationPower; + return BusVolumeVentilation * (heating ? VentilationRateHeating : VentilationRate) * SpecificVentilationPower; } // C35 - ( Wh/M3 ) @@ -108,7 +109,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC // C53 - "Continous/2-stage/3-stage/4-stage - public HeatPumpType HVACCompressorType { get; set; } + //public HeatPumpType HVACCompressorType { get; set; } // C54 - ( KW ) @@ -163,11 +164,47 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC public string HVACTechnology => $"{HVACSystemConfiguration.GetName()} " + $"({string.Join(", ", HeatPumpTypePassengerCompartment.GetName(), HeatPumpTypeDriverCompartment.GetName())})"; + public HeatingDistributionCase HeatingDistributionCase + { + get + { + if (!_heatingDistributionCase.HasValue) { + _heatingDistributionCase = GetHeatingDistributionCase(); + } + + return _heatingDistributionCase.Value; + } + } + protected virtual HeatingDistributionCase GetHeatingDistributionCase() + { + return HeatingDistributions.GetHeatingDistributionCase(HeatPumpTypePassengerCompartment, ElectricHeater, + AuxHeater.FuelFiredHeaterPower.IsGreater(0)); + } + + public HeatingDistributionCasesMap HeatingDistributions { get; set; } + //public HeatPumpType HeatPumpTypeHeatingDriverCompartment { get; set; } public HeatPumpType HeatPumpTypeDriverCompartment { get; set; } //public HeatPumpType HeatPumpTypeHeatingPassengerCompartment { get; set; } public HeatPumpType HeatPumpTypePassengerCompartment { get; set; } public BusHVACSystemConfiguration HVACSystemConfiguration { get; set; } + public HeaterType ElectricHeater { get; set; } + public Watt MaxHeatingPower => (MaxHeatingPowerDriver ?? 0.SI<Watt>()) + (MaxHeatingPowerPassenger ?? 0.SI<Watt>()); + + public Watt MaxHeatingPowerDriver { get; set; } + public Watt MaxHeatingPowerPassenger { get; set; } + + public Meter DriverCompartmentLength { get; set; } + + public Meter PassengerCompartmentLength { get; set; } + + public double DriverHVACContribution => (DriverCompartmentLength + PassengerCompartmentLength).IsEqual(0) + ? 0 + : (DriverCompartmentLength / (DriverCompartmentLength + PassengerCompartmentLength)).Value(); + + public double PassengerHVACContribution => (DriverCompartmentLength + PassengerCompartmentLength).IsEqual(0) + ? 0 + : (PassengerCompartmentLength / (DriverCompartmentLength + PassengerCompartmentLength)).Value(); #endregion } diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 6bc99bd147..73b1d42bfd 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -248,6 +248,7 @@ namespace TUGraz.VectoCore.Models.Declaration public static BusAlternatorTechnologies AlternatorTechnologies = new BusAlternatorTechnologies(); private static HVACCoolingPower hvacMaxCoolingPower; + private static HVACHeatingPower hvacMaxHeatingPower; private static HeatingDistributionCasesMap heatingDistributionCasesMap; private static HeatingDistributionMap heatingDistributionMap; @@ -277,6 +278,8 @@ namespace TUGraz.VectoCore.Models.Declaration public static HVACCoolingPower HVACMaxCoolingPower => hvacMaxCoolingPower ?? (hvacMaxCoolingPower = new HVACCoolingPower()); + public static HVACHeatingPower HVACMaxHeatingPower => hvacMaxHeatingPower ?? (hvacMaxHeatingPower = new HVACHeatingPower()); + public static PerSecond VentilationRate(BusHVACSystemConfiguration? hvacSystemConfig, bool heating) { diff --git a/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs b/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs index 8aabc4c513..17968d2bb0 100644 --- a/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs +++ b/VectoCore/VectoCore/Models/Declaration/HVACCoolingPower.cs @@ -17,13 +17,31 @@ namespace TUGraz.VectoCore.Models.Declaration { return DriverCoolingPower.Lookup(configuration, mission).SI<Watt>(); } - public Watt PassengerMaxCoolingPower(BusHVACSystemConfiguration configuration, MissionType mission, CubicMeter volume) + public Watt PassengerMaxCoolingPower(BusHVACSystemConfiguration configuration, MissionType mission, + CubicMeter volume) { return PassengerCoolingPower.Lookup(configuration, mission).SI<WattPerCubicMeter>() * volume; } + } + + public class HVACHeatingPower + { + private static HVACLookup DriverCoolingPower = new HVACLookup(".Buses.HVACHeatingPowerDriver.csv"); + private static HVACLookup PassengerCoolingPower = new HVACLookup(".Buses.HVACHeatingPowerPassenger.csv"); + + public Watt DriverMaxHeatingPower(BusHVACSystemConfiguration configuration, MissionType mission) + { + return DriverCoolingPower.Lookup(configuration, mission).SI<Watt>(); + } + public Watt PassengerMaxHeatingPower(BusHVACSystemConfiguration configuration, MissionType mission, + CubicMeter volume) + { + return PassengerCoolingPower.Lookup(configuration, mission).SI<WattPerCubicMeter>() * volume; + } + } - private class HVACLookup : LookupData<BusHVACSystemConfiguration, MissionType, double>{ + public class HVACLookup : LookupData<BusHVACSystemConfiguration, MissionType, double>{ public HVACLookup(string resource) { ResourceId = DeclarationData.DeclarationDataResourcePrefix + resource; @@ -50,5 +68,7 @@ namespace TUGraz.VectoCore.Models.Declaration { #endregion } - } + + + } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs index ae43871f44..189904c2c8 100644 --- a/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs +++ b/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs @@ -200,12 +200,12 @@ namespace TUGraz.VectoCore.OutputData.FileIO retVal["BP_FloorType"] = ssmInputs.BusParameters.BusFloorType.ToString(); retVal["BP_BusSurfaceArea"] = ssmInputs.BusParameters.BusSurfaceArea.Value(); retVal["BP_BusWindowSurfaceArea"] = ssmInputs.BusParameters.BusWindowSurface.Value(); - retVal["BP_BusVolume"] = ssmInputs.BusParameters.BusVolume.Value(); + retVal["BP_BusVolume"] = ssmInputs.BusParameters.BusVolumeVentilation.Value(); retVal["BP_PassengerCount"] = ssmInputs.BusParameters.NumberOfPassengers; retVal["EC_EnviromentalTemperature"] = ssmInputs.EnvironmentalConditions.DefaultConditions.Temperature.AsDegCelsius; retVal["EC_Solar"] = ssmInputs.EnvironmentalConditions.DefaultConditions.Solar.Value(); - retVal["AC_CompressorType"] = ssmInputs.ACSystem.HVACCompressorType.ToString(); + //retVal["AC_CompressorType"] = ssmInputs.ACSystem.HVACCompressorType.ToString(); retVal["AC_CompressorCapacitykW"] = ssmInputs.ACSystem.HVACMaxCoolingPower.ConvertToKiloWatt().Value; //retVal["AC_COP"] = ssmInputs.ACSystem.COP; retVal["VEN_VentilationOnDuringHeating"] = ssmInputs.Ventilation.VentilationOnDuringHeating; diff --git a/VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerDriver.csv b/VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerDriver.csv new file mode 100644 index 0000000000..18b372ff43 --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerDriver.csv @@ -0,0 +1,11 @@ +Configuration , Heavy Urban , Urban , Suburban , Interurban , Coach +1 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +2 , 5.00 , 5.00 , 5.00 , 5.00 , 4.00 +3 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +4 , 5.00 , 5.00 , 5.00 , 5.00 , 4.00 +5 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +6 , 3.50 , 3.50 , 3.50 , 3.00 , 2.50 +7 , 5.00 , 5.00 , 5.00 , 5.00 , 4.00 +8 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +9 , 5.00 , 5.00 , 5.00 , 5.00 , 4.00 +10 , 5.00 , 5.00 , 5.00 , 5.00 , 4.00 \ No newline at end of file diff --git a/VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerPassenger.csv b/VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerPassenger.csv new file mode 100644 index 0000000000..367b4dda94 --- /dev/null +++ b/VectoCore/VectoCore/Resources/Declaration/Buses/HVACHeatingPowerPassenger.csv @@ -0,0 +1,11 @@ +Configuration , Heavy Urban , Urban , Suburban , Interurban , Coach +1 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +2 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +3 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +4 , 0.00 , 0.00 , 0.00 , 0.00 , 0.00 +5 , 0.25 , 0.25 , 0.25 , 0.35 , 0.55 +6 , 0.25 , 0.25 , 0.25 , 0.35 , 0.55 +7 , 0.25 , 0.25 , 0.25 , 0.35 , 0.55 +8 , 0.25 , 0.25 , 0.25 , 0.35 , 0.55 +9 , 0.25 , 0.25 , 0.25 , 0.35 , 0.55 +10 , 0.25 , 0.25 , 0.25 , 0.35 , 0.55 \ No newline at end of file diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 0c90a52c29..ce9ca871b4 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -55,6 +55,8 @@ <None Remove="Resources\Declaration\Buses\DefaultActuationsMap.apac" /> <None Remove="Resources\Declaration\Buses\HeatingDistribution.csv" /> <None Remove="Resources\Declaration\Buses\HeatingDistributionCases.csv" /> + <None Remove="Resources\Declaration\Buses\HVACHeatingPowerDriver.csv" /> + <None Remove="Resources\Declaration\Buses\HVACHeatingPowerPassenger.csv" /> <None Remove="Resources\Declaration\VAUXBus\DEFAULT_1-Cylinder_1-Stage_393ccm.acmp" /> <None Remove="Resources\Declaration\VAUXBus\DEFAULT_2-Cylinder_1-Stage_650ccm.acmp" /> <None Remove="Resources\Declaration\VAUXBus\DEFAULT_2-Cylinder_2-Stage_398ccm.acmp" /> diff --git a/VectoCore/VectoCoreTest/Models/Declaration/BusAux/SSMTestHeatingCooling.cs b/VectoCore/VectoCoreTest/Models/Declaration/BusAux/SSMTestHeatingCooling.cs new file mode 100644 index 0000000000..16e9d1b8b8 --- /dev/null +++ b/VectoCore/VectoCoreTest/Models/Declaration/BusAux/SSMTestHeatingCooling.cs @@ -0,0 +1,240 @@ +using System.Collections.Generic; +using System.Linq; +using Moq; +using NUnit.Framework; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Impl; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Specific; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.Tests.Models.Declaration.BusAux; + +[TestFixture, Parallelizable(ParallelScope.All)] +public class SSMTestHeatingCooling +{ + + [ + TestCase(BusHVACSystemConfiguration.Configuration1, HeatPumpType.none, HeatPumpType.none, 1, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration1, HeatPumpType.none, HeatPumpType.none, 6, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration1, HeatPumpType.none, HeatPumpType.none, 8, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration1, HeatPumpType.none, HeatPumpType.none, 11, 0, 0.0), + + TestCase(BusHVACSystemConfiguration.Configuration2, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 1, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration2, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 6, 299.88, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration2, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 8, 287.8848, 1.0156), + TestCase(BusHVACSystemConfiguration.Configuration2, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 11, 287.8848, 1351.1654), + + TestCase(BusHVACSystemConfiguration.Configuration3, HeatPumpType.none, HeatPumpType.none, 1, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration3, HeatPumpType.none, HeatPumpType.none, 6, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration3, HeatPumpType.none, HeatPumpType.none, 8, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration3, HeatPumpType.none, HeatPumpType.none, 11, 0, 0.0), + + TestCase(BusHVACSystemConfiguration.Configuration4, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 1, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration4, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 6, 856.80, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration4, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 8, 822.5280, 633.1093), + TestCase(BusHVACSystemConfiguration.Configuration4, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 11, 822.5280, 2000.0), + + TestCase(BusHVACSystemConfiguration.Configuration6, HeatPumpType.none, HeatPumpType.non_R_744_2_stage, 6, 856.80, 0.0) + + ] + public void SSMTest_Cooling_SingleEnvironment(BusHVACSystemConfiguration cfg, HeatPumpType driverHeatpump, + HeatPumpType passengerHeatpump, int envId, double expectedElPwrW, double expectedMechPwrW) + { + var auxData = GetAuxParametersConventionalSingleDeckForTest(cfg, driverHeatpump, passengerHeatpump); + + // set list of environmental conditions to a single entry + var ssmInputs = auxData.SSMInputsCooling as SSMInputs; + Assert.NotNull(ssmInputs); + var envAll = ssmInputs.EnvironmentalConditions; + var selectedEnv = envAll.EnvironmentalConditionsMap.GetEnvironmentalConditions().Where(x => x.ID == envId).FirstOrDefault(); + Assert.NotNull(selectedEnv); + var newEnv = new EnvironmentalConditionMapEntry(selectedEnv.ID, selectedEnv.Temperature, selectedEnv.Solar, 1.0, + selectedEnv.HeatPumpCoP.ToDictionary(x => x.Key, x => x.Value), + selectedEnv.HeaterEfficiency.ToDictionary(x => x.Key, x => x.Value)); + ssmInputs.EnvironmentalConditionsMap = new EnvironmentalConditionsMap(new[] { newEnv }); + // --- + + var ssm = new SSMTOOL(auxData.SSMInputsCooling); + + Assert.AreEqual(expectedElPwrW, ssm.ElectricalWAdjusted.Value(), 1e-3); + Assert.AreEqual(expectedMechPwrW, ssm.MechanicalWBaseAdjusted.Value(), 1e-3); + + } + + + [ + // electric: only ventilation, mechanic: heatpump + TestCase(BusHVACSystemConfiguration.Configuration1, HeatPumpType.none, HeatPumpType.none, 293.8056, 0.0), // correct? I'd expect P_el = 293 as well! (ventilation low) + TestCase(BusHVACSystemConfiguration.Configuration2, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 293.8056, 109.29748), + TestCase(BusHVACSystemConfiguration.Configuration3, HeatPumpType.none, HeatPumpType.none, 662.12989, 0.0), // correct? I'd expect p_el = 622 as well! (ventilation high) + TestCase(BusHVACSystemConfiguration.Configuration4, HeatPumpType.non_R_744_2_stage, HeatPumpType.none, 662.12989, 398.5246), + + TestCase(BusHVACSystemConfiguration.Configuration6, HeatPumpType.none, HeatPumpType.non_R_744_2_stage, 662.1298, 444.7991), + + // electric: ventilation + heatpump + //TestCase(BusHVACSystemConfiguration.Configuration1, HeatPumpType.none, HeatPumpType.none, 0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration2, HeatPumpType.non_R_744_continuous, HeatPumpType.none, 394.405, 0.0), + //TestCase(BusHVACSystemConfiguration.Configuration3, HeatPumpType.none, HeatPumpType.none, 0.0, 0.0), + TestCase(BusHVACSystemConfiguration.Configuration4, HeatPumpType.non_R_744_continuous, HeatPumpType.none, 1031.611, 0.0), + + ] + public void SSMTest_Cooling_AvgAllEnvironments(BusHVACSystemConfiguration cfg, HeatPumpType driverHeatpump, + HeatPumpType passengerHeatpump, double expectedElPwrW, double expectedMechPwrW) + { + var auxData = GetAuxParametersConventionalSingleDeckForTest(cfg, driverHeatpump, passengerHeatpump); + + var ssm = new SSMTOOL(auxData.SSMInputsCooling); + + Assert.AreEqual(expectedElPwrW, ssm.ElectricalWAdjusted.Value(), 1e-3); + Assert.AreEqual(expectedMechPwrW, ssm.MechanicalWBaseAdjusted.Value(), 1e-3); + + } + + private IAuxiliaryConfig GetAuxParametersConventionalSingleDeckForTest(BusHVACSystemConfiguration hvacConfig, HeatPumpType driverHeatpump, + HeatPumpType passengerHeatpump) + { + return CreateBusAuxInputParameters(MissionType.Urban, + VehicleClass.Class31a, + VectoSimulationJobType.ConventionalVehicle, + VehicleCode.CA, + RegistrationClass.II, + AxleConfiguration.AxleConfig_4x2, + false, + false, + 12.SI<Meter>(), + 3.SI<Meter>(), + 2.55.SI<Meter>(), + 40, + 0, + HeatPumpType.none, + driverHeatpump, + HeatPumpType.none, + passengerHeatpump, + 30000.SI<Watt>(), + false, + false, + false, + hvacConfig, + false, + false, + false, + false, + false, + steeringpumps: new[] { "Dual displacement" }, + fanTech: "Crankshaft mounted - Discrete step clutch", + alternatorTech: AlternatorType.Conventional, entranceHeight: 0.3.SI<Meter>()); + + } + + private IAuxiliaryConfig CreateBusAuxInputParameters(MissionType missionType, VehicleClass vehicleClass, + VectoSimulationJobType vehicleType, + VehicleCode vehicleCode, RegistrationClass registrationClass, + AxleConfiguration axleconfiguration, bool articulated, + bool lowEntry, Meter length, + Meter height, Meter width, int numPassengersLowerdeck, int numPassengersUpperdeck, + HeatPumpType hpHeatingDriver, HeatPumpType hpCoolingDriver, HeatPumpType hpHeatingPassenger, + HeatPumpType hpCoolingPassenger, Watt auxHeaterPower, + bool airElectricHeater, bool waterElectricHeater, bool otherElectricHeater, + BusHVACSystemConfiguration hvacConfig, bool doubleGlazing, bool adjustableAuxHeater, + bool separateAirdistributionDicts, bool adjustableCoolantThermostat, bool engineWasteGasHeatExchanger, + string[] steeringpumps, string fanTech, AlternatorType alternatorTech, Meter entranceHeight) + { + var dao = new SpecificCompletedBusAuxiliaryDataAdapter(new PrimaryBusAuxiliaryDataAdapter()); + + var segment = DeclarationData.CompletedBusSegments.Lookup(axleconfiguration.NumAxles(), + vehicleCode, registrationClass, numPassengersLowerdeck, height, lowEntry); + var mission = segment.Missions.FirstOrDefault(); + + var primaryVehicle = new Mock<IVehicleDeclarationInputData>(); + primaryVehicle.Setup(p => p.VehicleType).Returns(vehicleType); + primaryVehicle.Setup(p => p.AxleConfiguration).Returns(axleconfiguration); + primaryVehicle.Setup(p => p.Articulated).Returns(articulated); + + var primaryComponents = new Mock<IVehicleComponentsDeclaration>(); + var primaryBusAux = new Mock<IBusAuxiliariesDeclarationData>(); + var primaryBusAuxPS_S = new Mock<IPneumaticSupplyDeclarationData>(); + var primaryBusAuxPS_C = new Mock<IPneumaticConsumersDeclarationData>(); + var primaryBusAuxHVAC = new Mock<IHVACBusAuxiliariesDeclarationData>(); + var primaryBusAuxES = new Mock<IElectricSupplyDeclarationData>(); + primaryVehicle.Setup(p => p.Components).Returns(primaryComponents.Object); + primaryComponents.Setup(p => p.BusAuxiliaries).Returns(primaryBusAux.Object); + primaryBusAux.Setup(p => p.PneumaticSupply).Returns(primaryBusAuxPS_S.Object); + primaryBusAux.Setup(p => p.PneumaticConsumers).Returns(primaryBusAuxPS_C.Object); + primaryBusAux.Setup(p => p.HVACAux).Returns(primaryBusAuxHVAC.Object); + primaryBusAux.Setup(p => p.ElectricSupply).Returns(primaryBusAuxES.Object); + + primaryBusAux.Setup(p => p.FanTechnology).Returns(fanTech); + primaryBusAux.Setup(p => p.SteeringPumpTechnology).Returns(steeringpumps.ToList); + + primaryBusAuxPS_S.Setup(p => p.CompressorDrive).Returns(CompressorDrive.electrically); + primaryBusAuxPS_S.Setup(p => p.CompressorSize).Returns("Medium Supply 2-stage"); + primaryBusAuxPS_S.Setup(p => p.SmartAirCompression).Returns(false); + primaryBusAuxPS_S.Setup(p => p.SmartRegeneration).Returns(false); + + primaryBusAuxES.Setup(p => p.AlternatorTechnology).Returns(alternatorTech); + primaryBusAuxES.Setup(p => p.Alternators).Returns(new[] { new AlternatorInputData(28.3.SI<Volt>(), 50.SI<Ampere>()) }.Cast<IAlternatorDeclarationInputData>().ToList()); + primaryBusAuxES.Setup(p => p.ElectricStorage).Returns(new List<IBusAuxElectricStorageDeclarationInputData>()); + + primaryBusAuxPS_C.Setup(p => p.AdBlueDosing).Returns(ConsumerTechnology.Mechanically); + primaryBusAuxPS_C.Setup(p => p.AirsuspensionControl).Returns(ConsumerTechnology.Electrically); + primaryBusAuxHVAC.Setup(p => p.DoubleGlazing).Returns(doubleGlazing); + primaryBusAuxHVAC.Setup(p => p.AdjustableAuxiliaryHeater).Returns(adjustableAuxHeater); + primaryBusAuxHVAC.Setup(p => p.SeparateAirDistributionDucts).Returns(separateAirdistributionDicts); + primaryBusAuxHVAC.Setup(p => p.AdjustableCoolantThermostat).Returns(adjustableCoolantThermostat); + primaryBusAuxHVAC.Setup(p => p.EngineWasteGasHeatExchanger).Returns(engineWasteGasHeatExchanger); + + var completedVehicle = new Mock<IVehicleDeclarationInputData>(); + completedVehicle.Setup(c => c.VehicleCode).Returns(vehicleCode); + completedVehicle.Setup(c => c.Length).Returns(length); + completedVehicle.Setup(c => c.Height).Returns(height); + completedVehicle.Setup(c => c.Width).Returns(width); + completedVehicle.Setup(c => c.NumberPassengerSeatsLowerDeck).Returns(numPassengersLowerdeck); + completedVehicle.Setup(c => c.NumberPassengersStandingLowerDeck).Returns(0); + completedVehicle.Setup(c => c.NumberPassengerSeatsUpperDeck).Returns(numPassengersUpperdeck); + completedVehicle.Setup(c => c.NumberPassengersStandingUpperDeck).Returns(0); + completedVehicle.Setup(c => c.RegisteredClass).Returns(registrationClass); + completedVehicle.Setup(c => c.LowEntry).Returns(lowEntry); + completedVehicle.Setup(c => c.EntranceHeight).Returns(entranceHeight); + + var completedComponents = new Mock<IVehicleComponentsDeclaration>(); + var completedBusAux = new Mock<IBusAuxiliariesDeclarationData>(); + var completedHVACAux = new Mock<IHVACBusAuxiliariesDeclarationData>(); + completedBusAux.Setup(c => c.HVACAux).Returns(completedHVACAux.Object); + completedComponents.Setup(c => c.BusAuxiliaries).Returns(completedBusAux.Object); + completedVehicle.Setup(c => c.Components).Returns(completedComponents.Object); + + completedHVACAux.Setup(c => c.SystemConfiguration).Returns(hvacConfig); + completedHVACAux.Setup(c => c.AuxHeaterPower).Returns(auxHeaterPower); + completedHVACAux.Setup(c => c.SeparateAirDistributionDucts).Returns(mission.BusParameter.SeparateAirDistributionDuctsHVACCfg.Contains(hvacConfig)); + completedHVACAux.Setup(c => c.HeatPumpTypeHeatingDriverCompartment).Returns(hpHeatingDriver); + completedHVACAux.Setup(c => c.HeatPumpTypeHeatingPassengerCompartment).Returns(hpHeatingPassenger); + completedHVACAux.Setup(c => c.HeatPumpTypeCoolingDriverCompartment).Returns(hpCoolingDriver); + completedHVACAux.Setup(c => c.HeatPumpTypeCoolingPassengerCompartment).Returns(hpCoolingPassenger); + completedHVACAux.Setup(c => c.AirElectricHeater).Returns(airElectricHeater); + completedHVACAux.Setup(c => c.WaterElectricHeater).Returns(waterElectricHeater); + completedHVACAux.Setup(c => c.OtherHeatingTechnology).Returns(otherElectricHeater); + + + var runData = new VectoRunData() { + Mission = mission, + Loading = LoadingType.ReferenceLoad, + VehicleData = new VehicleData() { + VehicleClass = vehicleClass, + }, + Retarder = new RetarderData() { + Type = RetarderType.None + } + }; + + var retVal = dao.CreateBusAuxiliariesData(mission, primaryVehicle.Object, completedVehicle.Object, runData); + + return retVal; + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs b/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs index 71f9c77df6..22989795bd 100644 --- a/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs +++ b/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs @@ -1048,7 +1048,7 @@ namespace TUGraz.VectoCore.Tests.Models.EngineeringMode }, VehicleData = vehicleData, }; - + retVal.SSMInputsHeating = retVal.SSMInputsCooling; return retVal; } diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group41.RSLT_VIF.xml b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group41.RSLT_VIF.xml index 7c2653ee3a..37bdb796d2 100644 --- a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group41.RSLT_VIF.xml +++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group41.RSLT_VIF.xml @@ -4,13 +4,14 @@ xmlns:di="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/ xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" +xmlns:v2.4="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1 ./../../../../../VectoCore/Resources/XSD/VectoOutputMultistep.0.1.xsd"> <PrimaryVehicle> <Data xsi:type="PrimaryVehicleDataType" id="PIF-4121ae4751874cefa376"> - <Vehicle xsi:type="VehiclePIFType"> - <ManufacturerPrimaryVehicle>Generic Truck Manufacturer</ManufacturerPrimaryVehicle> - <ManufacturerAddressPrimaryVehicle>Street, ZIP City</ManufacturerAddressPrimaryVehicle> + <Vehicle xsi:type="ConventionalVehicleVIFType"> + <Manufacturer>Generic Truck Manufacturer</Manufacturer> + <ManufacturerAddress>Street, ZIP City</ManufacturerAddress> <Model>Generic Model</Model> <VIN>VEH-1234567890_nonSmart</VIN> <Date>2017-02-15T11:00:00Z</Date> @@ -24,11 +25,11 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <RetarderRatio>1.000</RetarderRatio> <AngledriveType>None</AngledriveType> <ZeroEmissionVehicle>false</ZeroEmissionVehicle> - <ADAS xmlns:adas="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" xsi:type="adas:AdvancedDriverAssistantSystemsType"> - <adas:EngineStopStart>false</adas:EngineStopStart> - <adas:EcoRollWithoutEngineStop>false</adas:EcoRollWithoutEngineStop> - <adas:EcoRollWithEngineStop>false</adas:EcoRollWithEngineStop> - <adas:PredictiveCruiseControl>none</adas:PredictiveCruiseControl> + <ADAS xsi:type="v2.4:ADAS_Conventional_Type"> + <v2.4:EngineStopStart>false</v2.4:EngineStopStart> + <v2.4:EcoRollWithoutEngineStop>false</v2.4:EcoRollWithoutEngineStop> + <v2.4:EcoRollWithEngineStop>false</v2.4:EcoRollWithEngineStop> + <v2.4:PredictiveCruiseControl>none</v2.4:PredictiveCruiseControl> </ADAS> <TorqueLimits xmlns:tcl="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="tcl:TorqueLimitsType"> <tcl:Entry gear="6" maxTorque="1800"/> @@ -36,7 +37,7 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" </TorqueLimits> <Components xsi:type="Vehicle_Conventional_ComponentsVIFType"> <Engine> - <Data xsi:type="EngineDataPIFType"> + <Data xsi:type="EngineDataVIFType"> <Manufacturer>Generic Engine Manufacturer</Manufacturer> <Model>Generic primary bus 41 Engine</Model> <CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber> @@ -47,9 +48,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <RatedPower>220000</RatedPower> <MaxEngineTorque>1100</MaxEngineTorque> <WHRType> - <v2.3:MechanicalOutputICE>false</v2.3:MechanicalOutputICE> - <v2.3:MechanicalOutputDrivetrain>false</v2.3:MechanicalOutputDrivetrain> - <v2.3:ElectricalOutput>false</v2.3:ElectricalOutput> + <MechanicalOutputICE>false</MechanicalOutputICE> + <MechanicalOutputDrivetrain>false</MechanicalOutputDrivetrain> + <ElectricalOutput>false</ElectricalOutput> </WHRType> <Mode> <IdlingSpeed>700</IdlingSpeed> @@ -74,14 +75,14 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" </Data> </Engine> <Transmission> - <Data xsi:type="TransmissionDataPIFType"> + <Data xsi:type="TransmissionDataVIFType"> <Manufacturer>Generic Gearbox Manufacturer</Manufacturer> <Model>AT 6 Gear</Model> <MainCertificationMethod>Standard values</MainCertificationMethod> <Date>2017-01-11T11:00:00Z</Date> <AppVersion>3.0.1</AppVersion> <TransmissionType>APT-S</TransmissionType> - <Gears xsi:type="TransmissionGearsPIFType"> + <Gears xsi:type="TransmissionGearsVIFType"> <Gear number="1"> <Ratio>3.364</Ratio> <MaxTorque>1900</MaxTorque> @@ -112,7 +113,7 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" </Data> </Transmission> <Axlegear> - <Data xsi:type="AxlegearDataPIFType"> + <Data xsi:type="AxlegearDataVIFType"> <Manufacturer>Generic Gearbox Manufacturer</Manufacturer> <Model>Generic primary bus 41 AxleGear</Model> <CertificationMethod>Standard values</CertificationMethod> @@ -123,7 +124,7 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" </Data> </Axlegear> <AxleWheels> - <Data xsi:type="AxleWheelsDataPIFType"> + <Data xsi:type="AxleWheelsDataVIFType"> <Axles> <vif0.1:Axle axleNumber="1" xsi:type="AxleDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0"> <AxleType>VehicleNonDriven</AxleType> @@ -183,7 +184,7 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" </Data> </AxleWheels> <Auxiliaries> - <Data xmlns:aux="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.6" xsi:type="AuxiliaryDataPIFType"> + <Data xsi:type="AUX_Conventional_PrimaryBusType"> <Fan> <Technology>Hydraulic driven - Constant displacement pump</Technology> </Fan> @@ -235,7 +236,7 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Results> <Status>success</Status> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Heavy Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">13098.63</TotalVehicleMass> @@ -246,10 +247,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">20.73851</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1520.18</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Heavy Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">17593.16</TotalVehicleMass> @@ -260,10 +260,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">24.94611</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1828.60</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">13098.63</TotalVehicleMass> @@ -274,10 +273,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">16.93598</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1241.44</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">17593.16</TotalVehicleMass> @@ -288,10 +286,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">20.36950</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1493.13</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Suburban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">13098.63</TotalVehicleMass> @@ -302,10 +299,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">15.03487</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1102.09</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Suburban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">17593.16</TotalVehicleMass> @@ -316,10 +312,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">18.14589</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1330.13</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Interurban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">12854.90</TotalVehicleMass> @@ -330,10 +325,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">12.90679</EnergyConsumption> </Fuel> - <CO2 unit="g/km">946.09</CO2> </Result> <Result status="success"> - <VehicleGroup>P31SD</VehicleGroup> + <PrimaryVehicleSubgroup>P31SD</PrimaryVehicleSubgroup> <Mission>Interurban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">15494.61</TotalVehicleMass> @@ -344,10 +338,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">14.34621</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1051.61</CO2> </Result> <Result status="success"> - <VehicleGroup>P31DD</VehicleGroup> + <PrimaryVehicleSubgroup>P31DD</PrimaryVehicleSubgroup> <Mission>Heavy Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">13543.34</TotalVehicleMass> @@ -358,10 +351,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">21.81903</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1599.38</CO2> </Result> <Result status="success"> - <VehicleGroup>P31DD</VehicleGroup> + <PrimaryVehicleSubgroup>P31DD</PrimaryVehicleSubgroup> <Mission>Heavy Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">18316.69</TotalVehicleMass> @@ -372,10 +364,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">26.59833</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1949.71</CO2> </Result> <Result status="success"> - <VehicleGroup>P31DD</VehicleGroup> + <PrimaryVehicleSubgroup>P31DD</PrimaryVehicleSubgroup> <Mission>Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">13543.34</TotalVehicleMass> @@ -386,10 +377,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">17.82311</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1306.47</CO2> </Result> <Result status="success"> - <VehicleGroup>P31DD</VehicleGroup> + <PrimaryVehicleSubgroup>P31DD</PrimaryVehicleSubgroup> <Mission>Urban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">18316.69</TotalVehicleMass> @@ -400,10 +390,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">21.69768</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1590.49</CO2> </Result> <Result status="success"> - <VehicleGroup>P31DD</VehicleGroup> + <PrimaryVehicleSubgroup>P31DD</PrimaryVehicleSubgroup> <Mission>Suburban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">13543.34</TotalVehicleMass> @@ -414,10 +403,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">15.74932</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1154.46</CO2> </Result> <Result status="success"> - <VehicleGroup>P31DD</VehicleGroup> + <PrimaryVehicleSubgroup>P31DD</PrimaryVehicleSubgroup> <Mission>Suburban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">18316.69</TotalVehicleMass> @@ -428,10 +416,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">19.17775</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1405.77</CO2> </Result> <Result status="success"> - <VehicleGroup>P32SD</VehicleGroup> + <PrimaryVehicleSubgroup>P32SD</PrimaryVehicleSubgroup> <Mission>Interurban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">14225.44</TotalVehicleMass> @@ -442,10 +429,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">13.19757</EnergyConsumption> </Fuel> - <CO2 unit="g/km">967.41</CO2> </Result> <Result status="success"> - <VehicleGroup>P32SD</VehicleGroup> + <PrimaryVehicleSubgroup>P32SD</PrimaryVehicleSubgroup> <Mission>Interurban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">16669.61</TotalVehicleMass> @@ -456,10 +442,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">14.54412</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1066.11</CO2> </Result> <Result status="success"> - <VehicleGroup>P32SD</VehicleGroup> + <PrimaryVehicleSubgroup>P32SD</PrimaryVehicleSubgroup> <Mission>Coach</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">14244.99</TotalVehicleMass> @@ -470,10 +455,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">11.13867</EnergyConsumption> </Fuel> - <CO2 unit="g/km">816.49</CO2> </Result> <Result status="success"> - <VehicleGroup>P32SD</VehicleGroup> + <PrimaryVehicleSubgroup>P32SD</PrimaryVehicleSubgroup> <Mission>Coach</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">15887.48</TotalVehicleMass> @@ -484,10 +468,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">11.58643</EnergyConsumption> </Fuel> - <CO2 unit="g/km">849.31</CO2> </Result> <Result status="success"> - <VehicleGroup>P32DD</VehicleGroup> + <PrimaryVehicleSubgroup>P32DD</PrimaryVehicleSubgroup> <Mission>Interurban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">14662.82</TotalVehicleMass> @@ -498,10 +481,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">13.62230</EnergyConsumption> </Fuel> - <CO2 unit="g/km">998.54</CO2> </Result> <Result status="success"> - <VehicleGroup>P32DD</VehicleGroup> + <PrimaryVehicleSubgroup>P32DD</PrimaryVehicleSubgroup> <Mission>Interurban</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">17609.41</TotalVehicleMass> @@ -512,10 +494,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">15.22020</EnergyConsumption> </Fuel> - <CO2 unit="g/km">1115.67</CO2> </Result> <Result status="success"> - <VehicleGroup>P32DD</VehicleGroup> + <PrimaryVehicleSubgroup>P32DD</PrimaryVehicleSubgroup> <Mission>Coach</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">14747.01</TotalVehicleMass> @@ -526,10 +507,9 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">11.61807</EnergyConsumption> </Fuel> - <CO2 unit="g/km">851.63</CO2> </Result> <Result status="success"> - <VehicleGroup>P32DD</VehicleGroup> + <PrimaryVehicleSubgroup>P32DD</PrimaryVehicleSubgroup> <Mission>Coach</Mission> <SimulationParameters> <TotalVehicleMass unit="kg">16767.53</TotalVehicleMass> @@ -540,7 +520,6 @@ xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" <Fuel type="Diesel CI"> <EnergyConsumption unit="MJ/km">12.15012</EnergyConsumption> </Fuel> - <CO2 unit="g/km">890.63</CO2> </Result> </Results> <ApplicationInformation> diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 758a88223c..236a10fe1d 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -39,6 +39,7 @@ <ItemGroup> <Folder Include="InputData\DeclarationDataAdapterTest\" /> + <Folder Include="Models\Declaration\BusAux\" /> </ItemGroup> <Choose> <When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(
 $(DefineConstants), '^(.*;)*MOCKUP(;.*)*$'))"> -- GitLab