Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 4af8c4f3 authored by Harald Martini's avatar Harald Martini
Browse files

moved the calculation of the completed result to...

moved the calculation of the completed result to XMLDeclarationReportCompletedVehicle and pass it to MRF & CIF with a Func<>
parent c4d58a5a
No related branches found
No related tags found
No related merge requests found
...@@ -72,11 +72,11 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation ...@@ -72,11 +72,11 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
public XDocument Report { get; protected set; } public XDocument Report { get; protected set; }
protected List<IResultEntry> results = new List<IResultEntry>(); protected List<IResultEntry> _results = new List<IResultEntry>();
public void WriteResult(IResultEntry resultValue) public void WriteResult(IResultEntry resultValue)
{ {
results.Add(resultValue); _results.Add(resultValue);
} }
public void GenerateReport(XElement resultSignature) public void GenerateReport(XElement resultSignature)
...@@ -115,7 +115,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation ...@@ -115,7 +115,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
Vehicle, Vehicle,
InputDataIntegrity, InputDataIntegrity,
new XElement(Cif_0_9 + XMLNames.Report_ManufacturerRecord_Signature, resultSignature), new XElement(Cif_0_9 + XMLNames.Report_ManufacturerRecord_Signature, resultSignature),
Results.GenerateResults(results), Results.GenerateResults(_results),
XMLHelper.GetApplicationInfo(Cif_0_9) XMLHelper.GetApplicationInfo(Cif_0_9)
}; };
} }
......
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
...@@ -10,6 +11,7 @@ using TUGraz.VectoCommon.Resources; ...@@ -10,6 +11,7 @@ using TUGraz.VectoCommon.Resources;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReport; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReport;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReportXMLTypeWriter; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReportXMLTypeWriter;
using TUGraz.VectoCore.Utils; using TUGraz.VectoCore.Utils;
...@@ -241,18 +243,20 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation ...@@ -241,18 +243,20 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
ManufacturerReportIntegrityPrimaryVehicle, ManufacturerReportIntegrityPrimaryVehicle,
InputDataIntegrity, InputDataIntegrity,
new XElement(Cif_0_9 + XMLNames.Report_ManufacturerRecord_Signature, resultSignature), new XElement(Cif_0_9 + XMLNames.Report_ManufacturerRecord_Signature, resultSignature),
Results.GenerateResults(results), Results.GenerateResults(_results),
XMLHelper.GetApplicationInfo(Cif_0_9) XMLHelper.GetApplicationInfo(Cif_0_9)
}; };
} }
#region Implementation of IXMLCustomerReportCompletedBus #region Implementation of IXMLCustomerReportCompletedBus
public void WriteResult(IResultEntry genericResult, IResultEntry specificResult, IResult primaryResult) public void WriteResult(IResultEntry genericResult, IResultEntry specificResult, IResult primaryResult, Func<IResultEntry, IResultEntry, IResult, IResultEntry> getCompletedResult)
{ {
_allSuccess &= genericResult.Status == VectoRun.Status.Success; _allSuccess &= genericResult.Status == VectoRun.Status.Success;
_allSuccess &= specificResult.Status == VectoRun.Status.Success; _allSuccess &= specificResult.Status == VectoRun.Status.Success;
_resultCount++; _resultCount++;
_results.Add(getCompletedResult(genericResult, specificResult, primaryResult));
//Results.Add( //Results.Add(
// genericResult.Status == VectoRun.Status.Success && specificResult.Status == VectoRun.Status.Success // genericResult.Status == VectoRun.Status.Success && specificResult.Status == VectoRun.Status.Success
// ? GetSuccessResultEntry(genericResult, specificResult, primaryResult) // ? GetSuccessResultEntry(genericResult, specificResult, primaryResult)
......
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Xml.Linq; using System.Xml.Linq;
using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport;
namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile
{ {
...@@ -16,7 +18,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation ...@@ -16,7 +18,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
public interface IXMLCustomerReportCompletedBus public interface IXMLCustomerReportCompletedBus
{ {
/// <summary>
///
/// </summary>
/// <param name="genericResult"></param>
/// <param name="specificResult"></param>
/// <param name="primaryResult"></param>
/// <param name="getCompletedResult">IResultEntry GetCompletedResult(IResultEntry generic,
// IResultEntry specific, IResult primary);</param></param>
void WriteResult(IResultEntry genericResult, void WriteResult(IResultEntry genericResult,
IResultEntry specificResult, IResult primaryResult); IResultEntry specificResult, IResult primaryResult, Func<IResultEntry, IResultEntry, IResult, IResultEntry> getCompletedResult);
} }
} }
\ No newline at end of file
using System.Xml.Linq; using System;
using System.Xml.Linq;
using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
...@@ -15,7 +16,19 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport ...@@ -15,7 +16,19 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport
public interface IXMLManufacturerReportCompletedBus public interface IXMLManufacturerReportCompletedBus
{ {
void WriteResult(XMLDeclarationReport.ResultEntry genericResult, //Not supported in C# 7.3
XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult); //delegate IResultEntry GetCompletedResult(IResultEntry generic,
// IResultEntry specific, IResult primary);
/// <summary>
/// Adds a result to the report, the functor getCompletedResult determines how the result is calculated
/// </summary>
/// <param name="genericResult"></param>
/// <param name="specificResult"></param>
/// <param name="primaryResult"></param>
/// <param name="getCompletedResult">IResultEntry GetCompletedResult(IResultEntry generic,
// IResultEntry specific, IResult primary);</param>
void WriteResult(IResultEntry genericResult,
IResultEntry specificResult, IResult primaryResult, Func<IResultEntry, IResultEntry, IResult, IResultEntry> getCompletedResult);
} }
} }
\ No newline at end of file
...@@ -24,134 +24,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. ...@@ -24,134 +24,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.
internal abstract class CompletedBusManufacturerReportBase : AbstractManufacturerReport, IXMLManufacturerReportCompletedBus internal abstract class CompletedBusManufacturerReportBase : AbstractManufacturerReport, IXMLManufacturerReportCompletedBus
{ {
private class CompletedBusResult : IResultEntry
{
#region Implementation of IResultEntry
public void Initialize(VectoRunData vectoRunData)
{
throw new NotImplementedException();
}
public VectoRunData VectoRunData { get; }
public VectoRun.Status Status { get; set; }
public OvcHevMode OVCMode { get; set; }
public MissionType Mission { get; set; }
public LoadingType LoadingType { get; }
public int FuelMode { get; }
public IList<IFuelProperties> FuelData { get; set; }
public MeterPerSecond AverageSpeed { get; set; }
public MeterPerSecond AverageDrivingSpeed { get; set; }
public MeterPerSecond MaxSpeed { get; set; }
public MeterPerSecond MinSpeed { get; set; }
public MeterPerSquareSecond MaxDeceleration { get; set; }
public MeterPerSquareSecond MaxAcceleration { get; set; }
public PerSecond EngineSpeedDrivingMin { get; set; }
public PerSecond EngineSpeedDrivingAvg { get; set; }
public PerSecond EngineSpeedDrivingMax { get; set; }
public double AverageGearboxEfficiency { get; set; }
public double AverageAxlegearEfficiency { get; set; }
public Scalar FullLoadPercentage { get; set; }
public Scalar GearshiftCount { get; set; }
public Meter Distance { get; set; }
public Dictionary<FuelType, IFuelConsumptionCorrection> CorrectedFinalFuelConsumption =
new Dictionary<FuelType, IFuelConsumptionCorrection>();
public IFuelConsumptionCorrection FuelConsumptionFinal(FuelType fuelType)
{
return CorrectedFinalFuelConsumption.ContainsKey(fuelType) ? CorrectedFinalFuelConsumption[fuelType] : null;
}
public WattSecond ElectricEnergyConsumption { get; set; }
public Kilogram CO2Total { get; set; }
public Kilogram Payload { get; set; }
public Kilogram TotalVehicleMass { get; set; }
public CubicMeter CargoVolume { get; }
public double? PassengerCount { get; set; }
public VehicleClass VehicleClass { get; set; }
public Watt MaxChargingPower { get; }
public double WeightingFactor { get; }
public Meter ActualChargeDepletingRange { get; set; }
public Meter EquivalentAllElectricRange { get; set; }
public Meter ZeroCO2EmissionsRange { get; set; }
public IFuelProperties AuxHeaterFuel { get; set; }
public Kilogram ZEV_FuelConsumption_AuxHtr { get; set; }
public Kilogram ZEV_CO2 { get; set; }
public void SetResultData(VectoRunData runData, IModalDataContainer data, double weightingFactor)
{
throw new NotImplementedException();
}
public string Error => throw new NotImplementedException();
public string StackTrace => throw new NotImplementedException();
public BatterySystemData BatteryData
{
get;
set;
}
#endregion
}
private class CompletedBusFuelConsumption : IFuelConsumptionCorrection
{
#region Implementation of IFuelConsumptionCorrection
public IFuelProperties Fuel { get; set; }
public KilogramPerWattSecond EngineLineCorrectionFactor => throw new NotImplementedException();
public KilogramPerWattSecond VehicleLine => throw new NotImplementedException();
public KilogramPerSecond FC_ESS_H => throw new NotImplementedException();
public KilogramPerSecond FC_ESS_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_BusAux_PS_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_BusAux_ES_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_WHR_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_AUXHTR_H => throw new NotImplementedException();
public KilogramPerSecond FC_AUXHTR_H_CORR => throw new NotImplementedException();
public KilogramPerSecond FC_REESS_SOC_H => throw new NotImplementedException();
public KilogramPerSecond FC_REESS_SOC_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_FINAL_H => throw new NotImplementedException();
public KilogramPerMeter FC_WHR_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_BusAux_PS_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_BusAux_ES_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_AUXHTR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_AUXHTR_KM_CORR => throw new NotImplementedException();
public KilogramPerMeter FC_REESS_SOC_KM => throw new NotImplementedException();
public KilogramPerMeter FC_REESS_SOC_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_ESS_KM => throw new NotImplementedException();
public KilogramPerMeter FC_ESS_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_FINAL_KM => throw new NotImplementedException();
public VolumePerMeter FuelVolumePerMeter => throw new NotImplementedException();
public Kilogram TotalFuelConsumptionCorrected => EnergyDemand / Fuel.LowerHeatingValueVecto;
public Joule EnergyDemand { get; set; }
#endregion
}
protected XNamespace _mrf = XNamespace.Get("urn:tugraz:ivt:VectoAPI:DeclarationOutput:v0.9"); protected XNamespace _mrf = XNamespace.Get("urn:tugraz:ivt:VectoAPI:DeclarationOutput:v0.9");
...@@ -178,7 +52,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. ...@@ -178,7 +52,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.
#region Implementation of IXMLManufacturerReportCompletedBus #region Implementation of IXMLManufacturerReportCompletedBus
public double CalculateFactor<T>( private double CalculateFactor<T>(
(XMLDeclarationReport.ResultEntry genericResult, (XMLDeclarationReport.ResultEntry genericResult,
XMLDeclarationReport.ResultEntry specificResult) results, XMLDeclarationReport.ResultEntry specificResult) results,
Func<XMLDeclarationReport.ResultEntry, T> access) Func<XMLDeclarationReport.ResultEntry, T> access)
...@@ -194,119 +68,122 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. ...@@ -194,119 +68,122 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.
public virtual void WriteResult(XMLDeclarationReport.ResultEntry genericResult,
XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult) public virtual void WriteResult(IResultEntry genericResult,
IResultEntry specificResult, IResult primaryResult,Func<IResultEntry, IResultEntry, IResult, IResultEntry> getCompletedResult)
{ {
_allSuccess &= genericResult.Status == VectoRun.Status.Success; _allSuccess &= genericResult.Status == VectoRun.Status.Success;
_allSuccess &= specificResult.Status == VectoRun.Status.Success; _allSuccess &= specificResult.Status == VectoRun.Status.Success;
_results.Add(getCompletedResult(genericResult, specificResult, primaryResult));
return;
var result = new CompletedBusResult { //var result = new CompletedBusResult {
Status = VectoRun.Status.Success, // Status = VectoRun.Status.Success,
}; //};
result.Status = genericResult.Status != VectoRun.Status.Success ? genericResult.Status : result.Status; //result.Status = genericResult.Status != VectoRun.Status.Success ? genericResult.Status : result.Status;
result.Status = specificResult.Status != VectoRun.Status.Success ? specificResult.Status : result.Status; //result.Status = specificResult.Status != VectoRun.Status.Success ? specificResult.Status : result.Status;
result.OVCMode = specificResult.OVCMode; //result.OVCMode = specificResult.OVCMode;
if (genericResult.OVCMode != specificResult.OVCMode) { //if (genericResult.OVCMode != specificResult.OVCMode) {
throw new VectoException($"generic OVC Mode must be equal to specific OVC Mode! but was gen_ovc = {genericResult.OVCMode} != {specificResult.OVCMode} = spec_ovc"); // throw new VectoException($"generic OVC Mode must be equal to specific OVC Mode! but was gen_ovc = {genericResult.OVCMode} != {specificResult.OVCMode} = spec_ovc");
} //}
result.BatteryData = specificResult.BatteryData; //result.BatteryData = specificResult.BatteryData;
result.Mission = genericResult.Mission; //result.Mission = genericResult.Mission;
result.Distance = genericResult.Distance; //result.Distance = genericResult.Distance;
result.TotalVehicleMass = specificResult.TotalVehicleMass; //result.TotalVehicleMass = specificResult.TotalVehicleMass;
result.Payload = specificResult.Payload; //result.Payload = specificResult.Payload;
result.PassengerCount = specificResult.PassengerCount; //result.PassengerCount = specificResult.PassengerCount;
result.VehicleClass = primaryResult.VehicleGroup; //result.VehicleClass = primaryResult.VehicleGroup;
///Factor for each fuel /////Factor for each fuel
/// Factor for electric Energy Consumption ///// Factor for electric Energy Consumption
//TODO: Add primary bus group to writer ////TODO: Add primary bus group to writer
//TODO: ////TODO:
var combinedResults = (genericResult, specificResult); //var combinedResults = (genericResult, specificResult);
//var speedFactor = CalculateFactor(combinedResults, r => r.AverageSpeed); ////var speedFactor = CalculateFactor(combinedResults, r => r.AverageSpeed);
//result.AverageSpeed = primaryResult. ////result.AverageSpeed = primaryResult.
//Info not available in Primary Results -> no factor method ////Info not available in Primary Results -> no factor method
result.AverageSpeed = specificResult.AverageSpeed; //result.AverageSpeed = specificResult.AverageSpeed;
result.AverageDrivingSpeed = specificResult.AverageDrivingSpeed; //result.AverageDrivingSpeed = specificResult.AverageDrivingSpeed;
result.MinSpeed = specificResult.MinSpeed; //result.MinSpeed = specificResult.MinSpeed;
result.MaxSpeed = specificResult.MaxSpeed; //result.MaxSpeed = specificResult.MaxSpeed;
result.MaxDeceleration = specificResult.MaxDeceleration; //result.MaxDeceleration = specificResult.MaxDeceleration;
result.MaxAcceleration = specificResult.MaxAcceleration; //result.MaxAcceleration = specificResult.MaxAcceleration;
result.FullLoadPercentage = specificResult.FullLoadPercentage; //result.FullLoadPercentage = specificResult.FullLoadPercentage;
result.GearshiftCount = specificResult.GearshiftCount; //result.GearshiftCount = specificResult.GearshiftCount;
result.EngineSpeedDrivingAvg = specificResult.EngineSpeedDrivingAvg; //result.EngineSpeedDrivingAvg = specificResult.EngineSpeedDrivingAvg;
result.EngineSpeedDrivingMin = specificResult.EngineSpeedDrivingMin; //result.EngineSpeedDrivingMin = specificResult.EngineSpeedDrivingMin;
result.EngineSpeedDrivingMax = specificResult.EngineSpeedDrivingMax; //result.EngineSpeedDrivingMax = specificResult.EngineSpeedDrivingMax;
result.AverageGearboxEfficiency = specificResult.AverageGearboxEfficiency; //result.AverageGearboxEfficiency = specificResult.AverageGearboxEfficiency;
result.AverageAxlegearEfficiency = specificResult.AverageAxlegearEfficiency; //result.AverageAxlegearEfficiency = specificResult.AverageAxlegearEfficiency;
//Fuels ////Fuels
result.FuelData = specificResult.FuelData; //result.FuelData = specificResult.FuelData;
var co2Sum = 0.SI<Kilogram>(); //var co2Sum = 0.SI<Kilogram>();
foreach (var fuel in genericResult.CorrectedFinalFuelConsumption.Keys) { //foreach (var fuel in genericResult.CorrectedFinalFuelConsumption.Keys) {
var fuelFactor = CalculateFactor(combinedResults, r => r.FuelConsumptionFinal(fuel).TotalFuelConsumptionCorrected); // var fuelFactor = CalculateFactor(combinedResults, r => r.FuelConsumptionFinal(fuel).TotalFuelConsumptionCorrected);
var completedFuelConsumption = // var completedFuelConsumption =
fuelFactor * (primaryResult.EnergyConsumption[fuel] * specificResult.Distance); // fuelFactor * (primaryResult.EnergyConsumption[fuel] * specificResult.Distance);
var fuelConsumption = new CompletedBusFuelConsumption() { // var fuelConsumption = new CompletedBusFuelConsumption() {
Fuel = specificResult.FuelData.Single(f => f.FuelType == fuel), // Fuel = specificResult.FuelData.Single(f => f.FuelType == fuel),
EnergyDemand = completedFuelConsumption, // EnergyDemand = completedFuelConsumption,
}; // };
co2Sum += fuelConsumption.TotalFuelConsumptionCorrected * fuelConsumption.Fuel.CO2PerFuelWeight; // co2Sum += fuelConsumption.TotalFuelConsumptionCorrected * fuelConsumption.Fuel.CO2PerFuelWeight;
result.CorrectedFinalFuelConsumption.Add(fuel, fuelConsumption); // result.CorrectedFinalFuelConsumption.Add(fuel, fuelConsumption);
} //}
result.CO2Total = co2Sum; //result.CO2Total = co2Sum;
result.ElectricEnergyConsumption = null; // result.ElectricEnergyConsumption = null;
if (!(primaryResult.ElectricEnergyConsumption?.IsEqual(0) ?? true)){ //if (!(primaryResult.ElectricEnergyConsumption?.IsEqual(0) ?? true)){
var electricEnergyFactor = CalculateFactor(combinedResults, // var electricEnergyFactor = CalculateFactor(combinedResults,
r => r.ElectricEnergyConsumption); // r => r.ElectricEnergyConsumption);
result.ElectricEnergyConsumption = // result.ElectricEnergyConsumption =
electricEnergyFactor * primaryResult.ElectricEnergyConsumption * specificResult.Distance; // electricEnergyFactor * primaryResult.ElectricEnergyConsumption * specificResult.Distance;
} // }
if (specificResult.ZEV_FuelConsumption_AuxHtr?.IsGreaterOrEqual(0) ?? false) { //if (specificResult.ZEV_FuelConsumption_AuxHtr?.IsGreaterOrEqual(0) ?? false) {
result.ZEV_FuelConsumption_AuxHtr = specificResult.ZEV_FuelConsumption_AuxHtr; // result.ZEV_FuelConsumption_AuxHtr = specificResult.ZEV_FuelConsumption_AuxHtr;
var auxHeaterFuel = specificResult.AuxHeaterFuel; // var auxHeaterFuel = specificResult.AuxHeaterFuel;
result.AuxHeaterFuel = auxHeaterFuel; // result.AuxHeaterFuel = auxHeaterFuel;
result.FuelData.Add(auxHeaterFuel); // result.FuelData.Add(auxHeaterFuel);
result.ZEV_CO2 = result.ZEV_FuelConsumption_AuxHtr * auxHeaterFuel.CO2PerFuelWeight; // result.ZEV_CO2 = result.ZEV_FuelConsumption_AuxHtr * auxHeaterFuel.CO2PerFuelWeight;
} //}
if (genericResult.VectoRunData.JobType.IsOneOf(VectoSimulationJobType.BatteryElectricVehicle, //if (genericResult.VectoRunData.JobType.IsOneOf(VectoSimulationJobType.BatteryElectricVehicle,
VectoSimulationJobType.IEPC_E)) { // VectoSimulationJobType.IEPC_E)) {
var elRanges = DeclarationData.CalculateElectricRangesPEVCompletedBus(batteryData: result.BatteryData, // var elRanges = DeclarationData.CalculateElectricRangesPEVCompletedBus(batteryData: result.BatteryData,
result.ElectricEnergyConsumption, result.Distance); // result.ElectricEnergyConsumption, result.Distance);
result.EquivalentAllElectricRange = elRanges.EquivalentAllElectricRange; // result.EquivalentAllElectricRange = elRanges.EquivalentAllElectricRange;
result.ActualChargeDepletingRange = elRanges.ActualChargeDepletingRange; // result.ActualChargeDepletingRange = elRanges.ActualChargeDepletingRange;
result.ZeroCO2EmissionsRange = elRanges.ZeroCO2EmissionsRange; // result.ZeroCO2EmissionsRange = elRanges.ZeroCO2EmissionsRange;
} //}
_results.Add(result); // _results.Add(result);
} }
#endregion #endregion
} }
......
...@@ -2,12 +2,17 @@ ...@@ -2,12 +2,17 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using TUGraz.VectoCommon.BusAuxiliaries;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Battery;
using TUGraz.VectoCore.OutputData.ModDataPostprocessing;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport;
...@@ -50,6 +55,8 @@ namespace TUGraz.VectoCore.OutputData.XML ...@@ -50,6 +55,8 @@ namespace TUGraz.VectoCore.OutputData.XML
iepc, iepc,
ihpc); ihpc);
CustomerRpt = _cifFactory.GetCustomerReport( CustomerRpt = _cifFactory.GetCustomerReport(
inputData.JobInputData.ConsolidateManufacturingStage.Vehicle.VehicleCategory, inputData.JobInputData.ConsolidateManufacturingStage.Vehicle.VehicleCategory,
inputData.JobInputData.JobType, inputData.JobInputData.JobType,
...@@ -58,6 +65,7 @@ namespace TUGraz.VectoCore.OutputData.XML ...@@ -58,6 +65,7 @@ namespace TUGraz.VectoCore.OutputData.XML
iepc, iepc,
ihpc); ihpc);
} }
public override void InitializeReport(VectoRunData modelData) public override void InitializeReport(VectoRunData modelData)
{ {
...@@ -120,8 +128,8 @@ namespace TUGraz.VectoCore.OutputData.XML ...@@ -120,8 +128,8 @@ namespace TUGraz.VectoCore.OutputData.XML
genericResult.VehicleClass, genericResult.Mission, genericResult.Payload); genericResult.VehicleClass, genericResult.Mission, genericResult.Payload);
} }
(ManufacturerRpt as IXMLManufacturerReportCompletedBus)?.WriteResult(genericResult, specificResult, primaryResult); (ManufacturerRpt as IXMLManufacturerReportCompletedBus)?.WriteResult(genericResult, specificResult, primaryResult, GetCompletedResult);
(CustomerRpt as IXMLCustomerReportCompletedBus)?.WriteResult(genericResult, specificResult, primaryResult); (CustomerRpt as IXMLCustomerReportCompletedBus)?.WriteResult(genericResult, specificResult, primaryResult, GetCompletedResult);
} }
GenerateReports(); GenerateReports();
...@@ -131,6 +139,272 @@ namespace TUGraz.VectoCore.OutputData.XML ...@@ -131,6 +139,272 @@ namespace TUGraz.VectoCore.OutputData.XML
OutputReports(); OutputReports();
} }
} }
private double CalculateFactor<T>(
(IResultEntry genericResult,
IResultEntry specificResult) results,
Func<IResultEntry, T> access)
{
dynamic spec = access(results.specificResult);
dynamic gen = access(results.genericResult);
dynamic factor = spec / gen;
if (factor is Scalar sc)
{
return sc.Value();
}
return (double)factor;
}
private IResultEntry GetCompletedResult(IResultEntry generic, IResultEntry specific, IResult primary)
{
var result = new CompletedBusResult
{
Status = VectoRun.Status.Success,
};
result.Status = generic.Status != VectoRun.Status.Success ? generic.Status : result.Status;
result.Status = specific.Status != VectoRun.Status.Success ? specific.Status : result.Status;
result.OVCMode = specific.OVCMode;
if (generic.OVCMode != specific.OVCMode)
{
throw new VectoException($"generic OVC Mode must be equal to specific OVC Mode! but was gen_ovc = {generic.OVCMode} != {specific.OVCMode} = spec_ovc");
}
result.BatteryData = specific.BatteryData;
result.Mission = generic.Mission;
result.Distance = generic.Distance;
result.TotalVehicleMass = specific.TotalVehicleMass;
result.Payload = specific.Payload;
result.PassengerCount = specific.PassengerCount;
result.VehicleClass = primary.VehicleGroup;
///Factor for each fuel
/// Factor for electric Energy Consumption
//TODO: Add primary bus group to writer
//TODO:
var combinedResults = (generic, specific);
//var speedFactor = CalculateFactor(combinedResults, r => r.AverageSpeed);
//result.AverageSpeed = primaryResult.
//Info not available in Primary Results -> no factor method
result.AverageSpeed = specific.AverageSpeed;
result.AverageDrivingSpeed = specific.AverageDrivingSpeed;
result.MinSpeed = specific.MinSpeed;
result.MaxSpeed = specific.MaxSpeed;
result.MaxDeceleration = specific.MaxDeceleration;
result.MaxAcceleration = specific.MaxAcceleration;
result.FullLoadPercentage = specific.FullLoadPercentage;
result.GearshiftCount = specific.GearshiftCount;
result.EngineSpeedDrivingAvg = specific.EngineSpeedDrivingAvg;
result.EngineSpeedDrivingMin = specific.EngineSpeedDrivingMin;
result.EngineSpeedDrivingMax = specific.EngineSpeedDrivingMax;
result.AverageGearboxEfficiency = specific.AverageGearboxEfficiency;
result.AverageAxlegearEfficiency = specific.AverageAxlegearEfficiency;
//Fuels
result.FuelData = specific.FuelData;
var co2Sum = 0.SI<Kilogram>();
foreach (var fuel in generic.FuelData.Select(f => f.FuelType))
{
var fuelFactor = CalculateFactor(combinedResults, r => r.FuelConsumptionFinal(fuel).TotalFuelConsumptionCorrected);
var completedFuelConsumption =
fuelFactor * (primary.EnergyConsumption[fuel] * specific.Distance);
var fuelConsumption = new CompletedBusFuelConsumption()
{
Fuel = specific.FuelData.Single(f => f.FuelType == fuel),
EnergyDemand = completedFuelConsumption,
};
co2Sum += fuelConsumption.TotalFuelConsumptionCorrected * fuelConsumption.Fuel.CO2PerFuelWeight;
result.CorrectedFinalFuelConsumption.Add(fuel, fuelConsumption);
}
result.CO2Total = co2Sum;
result.ElectricEnergyConsumption = null;
if (!(primary.ElectricEnergyConsumption?.IsEqual(0) ?? true))
{
var electricEnergyFactor = CalculateFactor(combinedResults,
r => r.ElectricEnergyConsumption);
result.ElectricEnergyConsumption =
electricEnergyFactor * primary.ElectricEnergyConsumption * specific.Distance;
}
if (specific.ZEV_FuelConsumption_AuxHtr?.IsGreaterOrEqual(0) ?? false)
{
result.ZEV_FuelConsumption_AuxHtr = specific.ZEV_FuelConsumption_AuxHtr;
var auxHeaterFuel = specific.AuxHeaterFuel;
result.AuxHeaterFuel = auxHeaterFuel;
result.FuelData.Add(auxHeaterFuel);
result.ZEV_CO2 = result.ZEV_FuelConsumption_AuxHtr * auxHeaterFuel.CO2PerFuelWeight;
}
if (generic.VectoRunData.JobType.IsOneOf(VectoSimulationJobType.BatteryElectricVehicle,
VectoSimulationJobType.IEPC_E))
{
var elRanges = DeclarationData.CalculateElectricRangesPEVCompletedBus(batteryData: result.BatteryData,
result.ElectricEnergyConsumption, result.Distance);
result.EquivalentAllElectricRange = elRanges.EquivalentAllElectricRange;
result.ActualChargeDepletingRange = elRanges.ActualChargeDepletingRange;
result.ZeroCO2EmissionsRange = elRanges.ZeroCO2EmissionsRange;
}
return result;
}
private class CompletedBusResult : IResultEntry
{
#region Implementation of IResultEntry
public void Initialize(VectoRunData vectoRunData)
{
throw new NotImplementedException();
}
public VectoRunData VectoRunData { get; }
public VectoRun.Status Status { get; set; }
public OvcHevMode OVCMode { get; set; }
public MissionType Mission { get; set; }
public LoadingType LoadingType { get; }
public int FuelMode { get; }
public IList<IFuelProperties> FuelData { get; set; }
public MeterPerSecond AverageSpeed { get; set; }
public MeterPerSecond AverageDrivingSpeed { get; set; }
public MeterPerSecond MaxSpeed { get; set; }
public MeterPerSecond MinSpeed { get; set; }
public MeterPerSquareSecond MaxDeceleration { get; set; }
public MeterPerSquareSecond MaxAcceleration { get; set; }
public PerSecond EngineSpeedDrivingMin { get; set; }
public PerSecond EngineSpeedDrivingAvg { get; set; }
public PerSecond EngineSpeedDrivingMax { get; set; }
public double AverageGearboxEfficiency { get; set; }
public double AverageAxlegearEfficiency { get; set; }
public Scalar FullLoadPercentage { get; set; }
public Scalar GearshiftCount { get; set; }
public Meter Distance { get; set; }
public Dictionary<FuelType, IFuelConsumptionCorrection> CorrectedFinalFuelConsumption =
new Dictionary<FuelType, IFuelConsumptionCorrection>();
public IFuelConsumptionCorrection FuelConsumptionFinal(FuelType fuelType)
{
return CorrectedFinalFuelConsumption.ContainsKey(fuelType) ? CorrectedFinalFuelConsumption[fuelType] : null;
}
public WattSecond ElectricEnergyConsumption { get; set; }
public Kilogram CO2Total { get; set; }
public Kilogram Payload { get; set; }
public Kilogram TotalVehicleMass { get; set; }
public CubicMeter CargoVolume { get; }
public double? PassengerCount { get; set; }
public VehicleClass VehicleClass { get; set; }
public Watt MaxChargingPower { get; }
public double WeightingFactor { get; }
public Meter ActualChargeDepletingRange { get; set; }
public Meter EquivalentAllElectricRange { get; set; }
public Meter ZeroCO2EmissionsRange { get; set; }
public IFuelProperties AuxHeaterFuel { get; set; }
public Kilogram ZEV_FuelConsumption_AuxHtr { get; set; }
public Kilogram ZEV_CO2 { get; set; }
public void SetResultData(VectoRunData runData, IModalDataContainer data, double weightingFactor)
{
throw new NotImplementedException();
}
public string Error => throw new NotImplementedException();
public string StackTrace => throw new NotImplementedException();
public BatterySystemData BatteryData
{
get;
set;
}
#endregion
}
private class CompletedBusFuelConsumption : IFuelConsumptionCorrection
{
#region Implementation of IFuelConsumptionCorrection
public IFuelProperties Fuel { get; set; }
public KilogramPerWattSecond EngineLineCorrectionFactor => throw new NotImplementedException();
public KilogramPerWattSecond VehicleLine => throw new NotImplementedException();
public KilogramPerSecond FC_ESS_H => throw new NotImplementedException();
public KilogramPerSecond FC_ESS_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_BusAux_PS_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_BusAux_ES_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_WHR_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_AUXHTR_H => throw new NotImplementedException();
public KilogramPerSecond FC_AUXHTR_H_CORR => throw new NotImplementedException();
public KilogramPerSecond FC_REESS_SOC_H => throw new NotImplementedException();
public KilogramPerSecond FC_REESS_SOC_CORR_H => throw new NotImplementedException();
public KilogramPerSecond FC_FINAL_H => throw new NotImplementedException();
public KilogramPerMeter FC_WHR_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_BusAux_PS_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_BusAux_ES_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_AUXHTR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_AUXHTR_KM_CORR => throw new NotImplementedException();
public KilogramPerMeter FC_REESS_SOC_KM => throw new NotImplementedException();
public KilogramPerMeter FC_REESS_SOC_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_ESS_KM => throw new NotImplementedException();
public KilogramPerMeter FC_ESS_CORR_KM => throw new NotImplementedException();
public KilogramPerMeter FC_FINAL_KM => throw new NotImplementedException();
public VolumePerMeter FuelVolumePerMeter => throw new NotImplementedException();
public Kilogram TotalFuelConsumptionCorrected => EnergyDemand / Fuel.LowerHeatingValueVecto;
public Joule EnergyDemand { get; set; }
#endregion
}
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment