Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 6e6f970a authored by Markus QUARITSCH's avatar Markus QUARITSCH
Browse files

work on single bus mode: use data from completed bus segment table, powertrain...

work on single bus mode: use data from completed bus segment table, powertrain config from primary vehicle
parent d6b84da1
No related branches found
No related tags found
No related merge requests found
......@@ -7,6 +7,8 @@ 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.Impl;
using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics;
using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC;
using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics;
......@@ -14,10 +16,11 @@ using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
{
public class DeclarationDataAdapterSingleBus : DeclarationDataAdapterCompletedBusGeneric
public class DeclarationDataAdapterSingleBus : DeclarationDataAdapterCompletedBusSpecific
{
#region Implementation of IDeclarationDataAdapter
......@@ -45,226 +48,41 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
return retVal;
}
public override AirdragData CreateAirdragData(
IAirdragDeclarationInputData airdragData, Mission mission, Segment segment)
{
if (CompletedVehicle.Components.AirdragInputData == null ||
CompletedVehicle.Components.AirdragInputData.AirDragArea == null) {
return DefaultAirdragData(mission);
}
var aerodynamicDragArea = CompletedVehicle.Components.AirdragInputData.AirDragArea;
var retVal = SetCommonAirdragData(CompletedVehicle.Components.AirdragInputData);
retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(
aerodynamicDragArea,
GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight),
CrossWindCorrectionMode.DeclarationModeCorrection);
return retVal;
}
#endregion
public ISingleBusInputDataProvider SingleBusInputData { get; set; }
protected IVehicleDeclarationInputData CompletedVehicle
{
get { return SingleBusInputData?.CompletedVehicle; }
}
#region Overrides of DeclarationDataAdapterPrimaryBus
protected override double CalculateAlternatorEfficiency(IList<IAlternatorDeclarationInputData> alternators)
protected override TransmissionLossMap CreateGearLossMap(
ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory)
{
var sum = 0.0;
foreach (var entry in alternators) {
sum += DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup(entry.Technology);
}
foreach (var entry in CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators) {
sum += DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup(entry.Technology);
}
return sum / (alternators.Count + CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators.Count);
return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), true);
}
protected override ElectricsUserInputsConfig GetElectricalUserConfig(
Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass)
{
var currentDemand = GetElectricConsumers(mission, vehicleData, actuations);
var busAux = vehicleData.Components.BusAuxiliaries;
return new ElectricsUserInputsConfig() {
SmartElectrical = busAux.ElectricSupply.SmartElectrics,
ElectricalConsumers = currentDemand,
AlternatorMap =
new SimpleAlternator(
CalculateAlternatorEfficiency(
busAux.ElectricSupply.Alternators.Concat(CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators)
.ToList())) {
Technologies = busAux.ElectricSupply.Alternators
.Concat(CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators).Select(x => x.Technology)
.ToList()
},
PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage,
StoredEnergyEfficiency = Constants.BusAuxiliaries.ElectricSystem.StoredEnergyEfficiency,
ResultCardIdle = new DummyResultCard(),
ResultCardOverrun = new DummyResultCard(),
ResultCardTraction = new DummyResultCard(),
AlternatorGearEfficiency = Constants.BusAuxiliaries.ElectricSystem.AlternatorGearEfficiency,
MaxAlternatorPower = busAux.ElectricSupply.MaxAlternatorPower,
ElectricStorageCapacity = busAux.ElectricSupply.ElectricStorageCapacity ?? 0.SI<WattSecond>()
};
}
protected override bool VehicleHasElectricalConsumer(string consumerName, IBusAuxiliariesDeclarationData busAux)
protected override TorqueConverterData CreateTorqueConverterData(
ITorqueConverterDeclarationInputData torqueConverter, double ratio, CombustionEngineData engineData)
{
var elConsumer = CompletedVehicle.Components.BusAuxiliaries.ElectricConsumers;
switch (consumerName) {
case "Day running lights LED bonus": return elConsumer.DayrunninglightsLED;
case "Position lights LED bonus": return elConsumer.PositionlightsLED;
case "Brake lights LED bonus": return elConsumer.BrakelightsLED;
case "Interior lights LED bonus": return elConsumer.InteriorLightsLED;
case "Headlights LED bonus": return elConsumer.HeadlightsLED;
default: return false;
}
return TorqueConverterDataReader.Create(
torqueConverter.TCData,
DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
ExecutionMode.Declaration, ratio,
DeclarationData.TorqueConverter.CLUpshiftMinAcceleration,
DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
}
protected override double CalculateLengthDependentElectricalConsumers(Mission mission, IVehicleDeclarationInputData vehicleData)
public override AxleGearData CreateAxleGearData(IAxleGearInputData data)
{
return DeclarationData.BusAuxiliaries.CalculateLengthInteriorLights(
CompletedVehicle.Length, IsDoubleDecker, CompletedVehicle.FloorType,
CompletedVehicle.NumberOfPassengersLowerDeck)
.Value();
}
protected override PneumaticUserInputsConfig GetPneumaticUserConfig(
IVehicleDeclarationInputData vehicleData, Mission mission)
{
var retVal = base.GetPneumaticUserConfig(vehicleData, mission);
retVal.Doors = CompletedVehicle.DoorDriveTechnology;
retVal.KneelingHeight = VectoMath.Max(
0.SI<Meter>(), CompletedVehicle.EntranceHeight - Constants.BusParameters.EntranceHeight);
var retVal = SetCommonAxleGearData(data);
retVal.AxleGear.LossMap = ReadAxleLossMap(data, false);
return retVal;
}
public override ISSMInputs CreateSSMModelParameters(
IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel, LoadingType loading)
{
var retVal = base.CreateSSMModelParameters(busAuxInputData, mission, heatingFuel, loading) as SSMInputs;
if (retVal == null) {
throw new VectoException("Unknonw SSMInput Instance");
}
var busAux = CompletedVehicle.Components.BusAuxiliaries;
var hvacBusLength = busAux.HVACAux.SystemConfiguration == BusHVACSystemConfiguration.Configuration2
? 2 * Constants.BusParameters.DriverCompartmentLength
: CompletedVehicle.Length;
var correctedBusWidth = DeclarationData.BusAuxiliaries.CorrectedBusWidth(CompletedVehicle.Width);
var hvacBusheight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(
CompletedVehicle.FloorType,
IsDoubleDecker, CompletedVehicle.Height);
var coolingPower = CalculateMaxCoolingPower(CompletedVehicle, mission);
retVal.BusFloorType = CompletedVehicle.FloorType;
retVal.Technologies = GetSSMTechnologyBenefits(busAuxInputData, CompletedVehicle.FloorType);
retVal.FuelFiredHeaterPower = busAux.HVACAux.AuxHeaterPower;
retVal.BusWindowSurface = DeclarationData.BusAuxiliaries.WindowHeight(IsDoubleDecker) * hvacBusLength +
DeclarationData.BusAuxiliaries.FrontAndRearWindowArea(IsDoubleDecker);
retVal.BusSurfaceArea = 2 * (hvacBusLength * correctedBusWidth + hvacBusLength * CompletedVehicle.Height +
correctedBusWidth * CompletedVehicle.Height);
retVal.BusVolume = hvacBusLength * correctedBusWidth * hvacBusheight;
retVal.UValue = DeclarationData.BusAuxiliaries.UValue(CompletedVehicle.FloorType);
retVal.NumberOfPassengers =
(DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(hvacBusLength, correctedBusWidth) *
mission.BusParameter.PassengerDensity *
(loading == LoadingType.LowLoading ? mission.MissionType.GetLowLoadFactorBus() : 1.0)).LimitTo(
0, CompletedVehicle.NumberOfPassengersUpperDeck + CompletedVehicle.NumberOfPassengersLowerDeck) + 1; // add driver for 'heat input'
retVal.VentilationRate = DeclarationData.BusAuxiliaries.VentilationRate(busAux.HVACAux.SystemConfiguration, false);
retVal.VentilationRateHeating =
DeclarationData.BusAuxiliaries.VentilationRate(busAux.HVACAux.SystemConfiguration, true);
retVal.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2;
retVal.HVACCompressorType = busAux.HVACAux.CompressorTypePassenger; // use passenger compartment
retVal.HVACTechnology = string.Format(
"{0} ({1})", busAux.HVACAux.SystemConfiguration,
string.Join(
", ", new[] { busAux.HVACAux.CompressorTypePassenger.GetName(), busAux.HVACAux.CompressorTypeDriver.GetName() }));
retVal.COP = DeclarationData.BusAuxiliaries.CalculateCOP(
coolingPower.Item1, busAux.HVACAux.CompressorTypeDriver, coolingPower.Item2,
busAux.HVACAux.CompressorTypePassenger,
CompletedVehicle.FloorType);
return retVal;
}
protected override Tuple<Watt, Watt> CalculateMaxCoolingPower(IVehicleDeclarationInputData vehicle, Mission mission)
{
var length = DeclarationData.BusAuxiliaries.CalculateInternalLength(
vehicle.Length, IsDoubleDecker, vehicle.FloorType,
vehicle.NumberOfPassengersLowerDeck);
var height = DeclarationData.BusAuxiliaries.CalculateInternalHeight(vehicle.FloorType,
IsDoubleDecker, vehicle.Height);
var volume = length * height * DeclarationData.BusAuxiliaries.CorrectedBusWidth(vehicle.Width);
var hvacConfiguration = vehicle.Components.BusAuxiliaries.HVACAux.SystemConfiguration;
var driver = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.DriverMaxCoolingPower(
hvacConfiguration, mission.MissionType);
var passenger = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.PassengerMaxCoolingPower(
hvacConfiguration, mission.MissionType, volume);
return Tuple.Create(driver, passenger);
}
public ISingleBusInputDataProvider SingleBusInputData { get; set; }
protected override TechnologyBenefits GetSSMTechnologyBenefits(
IBusAuxiliariesDeclarationData inputData, FloorType floorType)
protected IVehicleDeclarationInputData CompletedVehicle
{
var onVehicle = new List<SSMTechnology>();
var hvacTech = CompletedVehicle.Components.BusAuxiliaries.HVACAux;
foreach (var item in DeclarationData.BusAuxiliaries.SSMTechnologyList) {
if ("Adjustable coolant thermostat".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
(inputData?.HVACAux.AdjustableCoolantThermostat ?? false)) {
onVehicle.Add(item);
}
if ("Engine waste gas heat exchanger".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
(inputData?.HVACAux.EngineWasteGasHeatExchanger ?? false)) {
onVehicle.Add(item);
}
if ("Separate air distribution ducts".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
hvacTech.SeparateAirDistributionDucts) {
onVehicle.Add(item);
}
if ("Adjustable auxiliary heater".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
hvacTech.AdjustableAuxiliaryHeater) {
onVehicle.Add(item);
}
if ("Heat pump systems".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
hvacTech.HeatPump) {
onVehicle.Add(item);
}
if ("Double-glazing".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
hvacTech.DoubleGlasing) {
onVehicle.Add(item);
}
}
return SelectBenefitForFloorType(floorType, onVehicle);
get { return SingleBusInputData?.CompletedVehicle; }
}
#endregion
protected bool IsDoubleDecker
{
get { return CompletedVehicle.NumberOfPassengersUpperDeck > 0; }
}
}
}
using System;
using System.Collections.Generic;
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;
using TUGraz.VectoCore.InputData.Reader.ComponentData;
using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
......@@ -26,6 +29,36 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
#region Implementation of IVectoRunDataFactory
#region Overrides of DeclarationModePrimaryBusVectoRunDataFactory
protected override Segment GetSegment(IVehicleDeclarationInputData vehicle)
{
//if (vehicle.VehicleCategory != VehicleCategory.HeavyBusCompletedVehicle) {
// throw new VectoException(
// "Invalid vehicle category for bus factory! {0}", vehicle.VehicleCategory.GetCategoryName());
//}
var completedVehicle = _singleBusInputData.CompletedVehicle;
var segment = DeclarationData.CompletedBusSegments.Lookup(
_singleBusInputData.PrimaryVehicle.AxleConfiguration.NumAxles(), completedVehicle.VehicleCode, completedVehicle.RegisteredClass, completedVehicle.NumberOfPassengersLowerDeck,
completedVehicle.Height, completedVehicle.FloorType == FloorType.LowFloor);
if (!segment.Found) {
throw new VectoException(
"no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, articulated: {2}, primary",
vehicle.VehicleCategory, _singleBusInputData.PrimaryVehicle.AxleConfiguration,
vehicle.Articulated);
}
foreach (var mission in segment.Missions) {
mission.VehicleHeight = completedVehicle.Height + mission.BusParameter.DeltaHeight;
mission.BusParameter.VehicleLength = completedVehicle.Length;
}
return segment;
}
#endregion
protected override IDeclarationDataAdapter DataAdapter { get { return _dao; } }
......@@ -51,7 +84,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
var simulationRunData = new VectoRunData {
Loading = loading.Key,
VehicleData = DataAdapter.CreateVehicleData(vehicle, mission, loading),
AirdragData = _dao.CreateAirdragData(_singleBusInputData.CompletedVehicle.Components.AirdragInputData, mission, new Segment()),
AirdragData = _dao.CreateAirdragData(_singleBusInputData.CompletedVehicle, mission),
EngineData = DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, mission),
GearboxData = _gearboxData,
AxleGearData = _axlegearData,
......@@ -63,17 +96,18 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
DriverData = _driverdata,
ExecutionMode = ExecutionMode.Declaration,
JobName = InputDataProvider.JobInputData.JobName,
ModFileSuffix = (engineModes.Count > 1 ? string.Format("_EngineMode{0}_", modeIdx) : "") + "_" + mission.BusParameter.BusGroup.GetClassNumber() + "_" + loading.Key.ToString(),
ModFileSuffix = (engineModes.Count > 1 ? string.Format("_EngineMode{0}_", modeIdx) : "") + "_" + mission.BusParameter.BusGroup.GetClassNumber() + "-Single_" + loading.Key.ToString(),
Report = Report,
Mission = mission,
InputDataHash = InputDataProvider.XMLHash,
SimulationType = SimulationType.DistanceCycle,
GearshiftParameters = _gearshiftData,
ShiftStrategy = InputDataProvider.JobInputData.ShiftStrategy
VehicleDesignSpeed = _segment.DesignSpeed,
//ShiftStrategy = InputDataProvider.JobInputData.ShiftStrategy
};
simulationRunData.EngineData.FuelMode = modeIdx;
simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
simulationRunData.BusAuxiliaries = _dao.CreateBusAuxiliariesData(mission, _singleBusInputData.PrimaryVehicle, simulationRunData);
simulationRunData.BusAuxiliaries = _dao.CreateBusAuxiliariesData(mission, _singleBusInputData.PrimaryVehicle, _singleBusInputData.CompletedVehicle, simulationRunData);
return simulationRunData;
}
}
......
......@@ -971,8 +971,11 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
}
[TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group41_nonSmart.xml", 12, TestName = "PrintVectoRunData PrimaryBus Group41 SD CO LL"),
TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group42_SmartPS.xml", 1, TestName = "PrintVectoRunData PrimaryBus Group42 SD HU RL")]
[TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group41_nonSmart.xml", 12, TestName = "PrintVectoRunData PrimaryBus Group41 SD CO/LL"),
TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group42_SmartPS.xml", 1, TestName = "PrintVectoRunData PrimaryBus Group42 SD HU/RL"),
TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto", 0, TestName = "PrintVectoRunData SingleBus Group 41/32b CO/LL"),
TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto", 1, TestName = "PrintVectoRunData SingleBus Group 42/33b HU/RL"),
]
public void PrintModelParametersPrimaryBus(string jobFile, int runIdx)
{
var runs = GetVectoRunData(jobFile);
......@@ -1006,7 +1009,10 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
[TestCase(JobFile_Group41, TestName = "RunCompletedBusSimulation Group41/32b"),
TestCase(JobFile_Group42, TestName = "RunCompletedBusSimulation Group42/33b"),
TestCase(JobFilePrimary41, TestName = "RunPrimaryBusSimulation Group41"),
TestCase(JobFilePrimary42, TestName = "RunPrimaryBusSimulation Group42")]
TestCase(JobFilePrimary42, TestName = "RunPrimaryBusSimulation Group42"),
TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto", TestName = "RunSingleBusSimulation Group 41/32b"),
TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto", TestName = "RunSingleBusSimulation Group 42/33b"),
]
public void TestRunCompletedBusSimulation(string jobName)
{
var relativeJobPath = jobName;
......
{
"Header": {
"CreatedBy": "Markus Quaritsch, IVT, Graz University of Technology",
"Date": "2020-02-07T15:06:30.9725917Z",
"AppVersion": "2.2",
"FileVersion": 6
},
"Body": {
"PrimaryVehicle": "primary_heavyBus group41_nonSmart.xml",
"CompletedVehicle": "vecto_vehicle-completed_heavyBus_41.xml"
}
}
\ No newline at end of file
{
"Header": {
"CreatedBy": "Markus Quaritsch, IVT, Graz University of Technology",
"Date": "2020-02-07T15:06:30.9725917Z",
"AppVersion": "2.2",
"FileVersion": 6
},
"Body": {
"PrimaryVehicle": "primary_heavyBus group42_SmartPS.xml",
"CompletedVehicle": "vecto_vehicle-completed_heavyBus_42.xml"
}
}
\ No newline at end of file
......@@ -304,6 +304,12 @@
<None Include="TestData\Integration\Buses\FactorMethod\CompletedBus_42-33b.vecto">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TestData\Integration\Buses\SingleBus.vecto">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment