diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs index 6628bac04ff604b73748ffef679fb8c911374ea2..5533fb1269f96d708e0f2dc60886dc4be5fc19cf 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusSpecific.cs @@ -25,9 +25,23 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IVehicleDeclarationInputData completedVehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) { + if (completedVehicle.NumberPassengerSeatsLowerDeck == null) { + throw new VectoException("NumberOfPassengerSeatsLowerDeck input parameter is required"); + } + if (completedVehicle.NumberPassengerSeatsUpperDeck == null) { + throw new VectoException("NumberOfPassengerSeatsUpperDeck input parameter is required"); + } + if (completedVehicle.NumberPassengersStandingLowerDeck == null) { + throw new VectoException("NumberOfPassengersStandingLowerDeck input parameter is required"); + } + if (completedVehicle.NumberPassengersStandingUpperDeck == null) { + throw new VectoException("NumberOfPassengersStandingUpperDeck input parameter is required"); + } var passengers = GetNumberOfPassengers( mission, completedVehicle.Length, completedVehicle.Width, - (int)completedVehicle.NumberPassengerSeatsLowerDeck + (int)completedVehicle.NumberPassengerSeatsUpperDeck, loading.Key); + completedVehicle.NumberPassengerSeatsLowerDeck.Value + completedVehicle.NumberPassengerSeatsUpperDeck.Value, + completedVehicle.NumberPassengersStandingLowerDeck.Value + completedVehicle.NumberPassengersStandingUpperDeck.Value, + loading.Key); var vehicleData = base.CreateVehicleData(primaryVehicle, segment, mission, loading, false); vehicleData.InputData = completedVehicle; @@ -187,53 +201,58 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var hvacConfiguration = completedVehicle.Components.BusAuxiliaries.HVACAux.SystemConfiguration; var busAux = completedVehicle.Components.BusAuxiliaries.HVACAux; - if (hvacConfiguration.RequiresDriverAC() && (!busAux.HeatPumpTypeDriverCompartment.HasValue || busAux.HeatPumpTypeDriverCompartment == HeatPumpType.none)) { - throw new VectoException("HVAC System Configuration {0} requires DriverAC Technology", hvacConfiguration); - } - //ToDo FK HeatPumpMode error check - //if (hvacConfiguration.RequiresPassengerAC() && (!busAux.HeatPumpTypePassengerCompartment.HasValue || busAux.HeatPumpTypePassengerCompartment == HeatPumpType.none)) { - // throw new VectoException("HVAC System Configuration {0} requires PassengerAC Technology", hvacConfiguration); - //} - - if (mission.BusParameter.SeparateAirDistributionDuctsHVACCfg.Contains(hvacConfiguration) && + + if (mission.BusParameter.SeparateAirDistributionDuctsHVACCfg.Contains(hvacConfiguration) && (busAux.SeparateAirDistributionDucts == null || !busAux.SeparateAirDistributionDucts.Value)) { throw new VectoException("Input parameter 'separate air distribution ducts' has to be set to 'true' for vehicle group '{0}' and HVAC configuration '{1}'", mission.BusParameter.BusGroup.GetClassNumber(), hvacConfiguration.GetName()); } if (completedVehicle.NumberPassengerSeatsLowerDeck == null) { - throw new VectoException("NumberOfPassengersLowerDeck input parameter is required"); + throw new VectoException("NumberOfPassengerSeatsLowerDeck input parameter is required"); } if (completedVehicle.NumberPassengerSeatsUpperDeck == null) { - throw new VectoException("NumberOfPassengersUpperDeck input parameter is required"); + throw new VectoException("NumberOfPassengerSeatsUpperDeck input parameter is required"); + } + if (completedVehicle.NumberPassengersStandingLowerDeck == null) { + throw new VectoException("NumberOfPassengersStandingLowerDeck input parameter is required"); + } + if (completedVehicle.NumberPassengersStandingUpperDeck == null) { + throw new VectoException("NumberOfPassengersStandingUpperDeck input parameter is required"); } if (busAux.HeatPumpTypeDriverCompartment == null) { throw new VectoException("HeatPumpTypeDriverCompartment input parameter is required"); } - if (busAux.HeatPumpPassengerCompartments == null) { + if (busAux.HeatPumpPassengerCompartments == null || busAux.HeatPumpPassengerCompartments.Count == 0) { throw new VectoException("HeatPumpPassengerCompartments input parameter is required"); } if (busAux.HeatPumpModeDriverCompartment == null || (busAux.HeatPumpTypeDriverCompartment != HeatPumpType.none && busAux.HeatPumpModeDriverCompartment.Value == HeatPumpMode.N_A)) { throw new VectoException("HeatPumpTypeDriverCompartment input parameter is required"); } - //ToDo FK HeatPumpMode error check - //if (busAux.HeatPumpModePassengerCompartments == null || (busAux.HeatPumpTypePassengerCompartment != HeatPumpType.none && busAux.HeatPumpModePassengerCompartment.Value == HeatPumpMode.N_A)) { - // throw new VectoException("HeatPumpModePassengerCompartment input parameter is required"); - //} + if (hvacConfiguration.RequiresDriverAC() && busAux.HeatPumpTypeDriverCompartment == HeatPumpType.none) { + throw new VectoException("HVAC System Configuration {0} requires DriverAC Technology", hvacConfiguration); + } + + if (hvacConfiguration.RequiresPassengerAC() && busAux.HeatPumpPassengerCompartments.All(x => x.Item1 == HeatPumpType.none)) { + throw new VectoException("HVAC System Configuration {0} requires PassengerAC Technology", hvacConfiguration); + } + + if (busAux.HeatPumpPassengerCompartments.Any(x => x.Item1 != HeatPumpType.none && x.Item2 == HeatPumpMode.N_A)) { + throw new VectoException("HeatPumpModePassengerCompartment input parameter is required"); + } - var heatPumpTypeDriverCompartment = + var heatPumpTypeDriverCompartment = busAux.HeatPumpModeDriverCompartment == HeatPumpMode.heating ? HeatPumpType.none : busAux.HeatPumpTypeDriverCompartment.Value; - //ToDo FK HeatPumpMode for calculation COP - //var heatPumpTypePassengerCompartment = - // busAux.HeatPumpModePassengerCompartment == HeatPumpMode.heating - // ? HeatPumpType.none - // : busAux.HeatPumpTypePassengerCompartment.Value; + var heatPumpTypePassengerCompartment = ( + busAux.HeatPumpPassengerCompartments.All(x => x.Item2 == HeatPumpMode.heating) + ? new[] {HeatPumpType.none}.ToList() + : busAux.HeatPumpPassengerCompartments.Select(x => x.Item1).ToList()).FirstOrDefault(); - var internalLength = hvacConfiguration == BusHVACSystemConfiguration.Configuration2 + var internalLength = hvacConfiguration == BusHVACSystemConfiguration.Configuration2 ? 2 * Constants.BusParameters.DriverCompartmentLength // OK : DeclarationData.BusAuxiliaries.CalculateInternalLength( completedVehicle.Length, completedVehicle.VehicleCode, @@ -264,23 +283,25 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ssmInputs.UValue = DeclarationData.BusAuxiliaries.UValue(completedVehicle.VehicleCode.GetFloorType()); ssmInputs.NumberOfPassengers = GetNumberOfPassengers( mission, internalLength, correctedBusWidth, - completedVehicle.NumberPassengerSeatsLowerDeck.Value + completedVehicle.NumberPassengerSeatsUpperDeck.Value, loadingType) + 1; // add driver for 'heat input' + completedVehicle.NumberPassengerSeatsLowerDeck.Value + completedVehicle.NumberPassengerSeatsUpperDeck.Value, + completedVehicle.NumberPassengersStandingLowerDeck.Value + completedVehicle.NumberPassengersStandingUpperDeck.Value, + loadingType) + 1; // add driver for 'heat input' ssmInputs.VentilationRate = DeclarationData.BusAuxiliaries.VentilationRate(hvacConfiguration, false); ssmInputs.VentilationRateHeating = DeclarationData.BusAuxiliaries.VentilationRate(hvacConfiguration, true); ssmInputs.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2; - //ToDo FK COP calculation - //ssmInputs.HVACCompressorType = heatPumpTypePassengerCompartment; // use passenger compartment - //ssmInputs.HVACTechnology = string.Format( - // "{0} ({1})", busAux.SystemConfiguration.GetName(), - // string.Join(", ", new[] { heatPumpTypePassengerCompartment.GetName(), heatPumpTypeDriverCompartment.GetName() })); - //; - //ssmInputs.COP = DeclarationData.BusAuxiliaries.CalculateCOP( - // coolingPower.Item1, heatPumpTypeDriverCompartment, coolingPower.Item2, heatPumpTypePassengerCompartment, - // floorType); - - return ssmInputs; + //ToDo FK COP calculation + ssmInputs.HVACCompressorType = heatPumpTypePassengerCompartment; // use passenger compartment + ssmInputs.HVACTechnology = string.Format( + "{0} ({1})", busAux.SystemConfiguration.GetName(), + string.Join(", ", new[] { heatPumpTypePassengerCompartment.GetName(), heatPumpTypeDriverCompartment.GetName() })); + ; + ssmInputs.COP = DeclarationData.BusAuxiliaries.CalculateCOP( + coolingPower.Item1, heatPumpTypeDriverCompartment, coolingPower.Item2, heatPumpTypePassengerCompartment /* average */, + floorType); + + return ssmInputs; } @@ -381,7 +402,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter #endregion - protected double GetNumberOfPassengers(Mission mission, Meter length, Meter width, double registeredPassengers, LoadingType loading) + protected double GetNumberOfPassengers(Mission mission, Meter length, Meter width, double registeredPassengers, + double registeredPassengersStanding, LoadingType loading) { var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(length, width); var passengerCountRef = busFloorArea * (loading == LoadingType.LowLoading