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

Skip to content
Snippets Groups Projects
Commit 72e41820 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

adding more fields to sum file: P_wheel_Average

rename k_vehline to k_engLine
introduce k_vehline calculated from P_wheel_in
parent 6c4950a8
No related branches found
No related tags found
No related merge requests found
...@@ -117,8 +117,9 @@ namespace TUGraz.VectoCore.OutputData ...@@ -117,8 +117,9 @@ namespace TUGraz.VectoCore.OutputData
Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; } Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; }
KilogramPerWattSecond VehicleLineCorrectionFactor(IFuelProperties fuel); KilogramPerWattSecond EngineLineCorrectionFactor(IFuelProperties fuel);
void CalculateAggregateValues(); void CalculateAggregateValues();
KilogramPerWattSecond VehicleLineSlope(IFuelProperties fuel);
} }
public static class ModalDataContainerExtensions public static class ModalDataContainerExtensions
...@@ -332,7 +333,13 @@ namespace TUGraz.VectoCore.OutputData ...@@ -332,7 +333,13 @@ namespace TUGraz.VectoCore.OutputData
return data.WorkWheelsPos() / data.Duration; return data.WorkWheelsPos() / data.Duration;
} }
public static Watt PowerWheel(this IModalDataContainer data)
{
return data.TimeIntegral<WattSecond>(ModalResultField.P_wheel_in) / data.Duration;
}
public static KilogramPerSecond FuelConsumptionPerSecond(this IModalDataContainer data, ModalResultField mrf, IFuelProperties fuelData) public static KilogramPerSecond FuelConsumptionPerSecond(this IModalDataContainer data, ModalResultField mrf, IFuelProperties fuelData)
{ {
return data.TimeIntegral<Kilogram>(data.GetColumnName(fuelData, mrf)) / data.Duration; return data.TimeIntegral<Kilogram>(data.GetColumnName(fuelData, mrf)) / data.Duration;
...@@ -403,9 +410,12 @@ namespace TUGraz.VectoCore.OutputData ...@@ -403,9 +410,12 @@ namespace TUGraz.VectoCore.OutputData
public static Watt TotalPowerEnginePositiveAverage(this IModalDataContainer data) public static Watt TotalPowerEnginePositiveAverage(this IModalDataContainer data)
{ {
var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval); //var simulationIntervals = data.GetValues<Second>(ModalResultField.simulationInterval);
var values = data.GetValues<Watt>(ModalResultField.P_ice_fcmap) var values = data.GetValues(x => new {
.Zip(simulationIntervals, (value, dt) => new { Dt = dt, Value = value * dt }) Value = x.Field<Watt>(ModalResultField.P_ice_fcmap.GetName()).DefaultIfNull(0) * x.Field<Second>(ModalResultField.simulationInterval.GetName())
})
//.GetValues<Watt>(ModalResultField.P_ice_fcmap)
//.Zip(simulationIntervals, (value, dt) => new { Dt = dt, Value = value * dt })
.Where(v => v.Value > 0).ToList(); .Where(v => v.Value > 0).ToList();
if (values.Any()) { if (values.Any()) {
return values.Sum(v => v.Value) / data.Duration; return values.Sum(v => v.Value) / data.Duration;
...@@ -413,6 +423,20 @@ namespace TUGraz.VectoCore.OutputData ...@@ -413,6 +423,20 @@ namespace TUGraz.VectoCore.OutputData
return 0.SI<Watt>(); return 0.SI<Watt>();
} }
public static Watt TotalPowerEngineAverage(this IModalDataContainer data)
{
var values = data.GetValues(
x => new {
Value = x.Field<Watt>(ModalResultField.P_ice_fcmap.GetName()).DefaultIfNull(0) *
x.Field<Second>(ModalResultField.simulationInterval.GetName())
}).ToList();
if (values.Any()) {
return values.Sum(v => v.Value) / data.Duration;
}
return 0.SI<Watt>();
}
public static MeterPerSecond Speed(this IModalDataContainer data) public static MeterPerSecond Speed(this IModalDataContainer data)
{ {
var distance = data.Distance; var distance = data.Distance;
......
...@@ -67,7 +67,8 @@ namespace TUGraz.VectoCore.OutputData ...@@ -67,7 +67,8 @@ namespace TUGraz.VectoCore.OutputData
}; };
private readonly Dictionary<String, SI> _timeIntegrals = new Dictionary<string, SI>(); private readonly Dictionary<String, SI> _timeIntegrals = new Dictionary<string, SI>();
private readonly Dictionary<FuelType, KilogramPerWattSecond> _vehicleLine = new Dictionary<FuelType, KilogramPerWattSecond>(); private readonly Dictionary<FuelType, KilogramPerWattSecond> _engLine = new Dictionary<FuelType, KilogramPerWattSecond>();
private readonly Dictionary<FuelType, KilogramPerWattSecond> _vehLine = new Dictionary<FuelType, KilogramPerWattSecond>();
public int JobRunId { get; } public int JobRunId { get; }
public string RunName { get; } public string RunName { get; }
...@@ -166,10 +167,10 @@ namespace TUGraz.VectoCore.OutputData ...@@ -166,10 +167,10 @@ namespace TUGraz.VectoCore.OutputData
public Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; } public Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; }
public KilogramPerWattSecond VehicleLineCorrectionFactor(IFuelProperties fuel) public KilogramPerWattSecond EngineLineCorrectionFactor(IFuelProperties fuel)
{ {
if (_vehicleLine.ContainsKey(fuel.FuelType)) { if (_engLine.ContainsKey(fuel.FuelType)) {
return _vehicleLine[fuel.FuelType]; return _engLine[fuel.FuelType];
} }
double k, d, r; double k, d, r;
...@@ -181,9 +182,29 @@ namespace TUGraz.VectoCore.OutputData ...@@ -181,9 +182,29 @@ namespace TUGraz.VectoCore.OutputData
x.Field<SI>(GetColumnName(fuel, ModalResultField.FCFinal)).Value()) x.Field<SI>(GetColumnName(fuel, ModalResultField.FCFinal)).Value())
: null).Where(x => x != null && x.Y > 0), : null).Where(x => x != null && x.Y > 0),
out k, out d, out r); out k, out d, out r);
_vehicleLine[fuel.FuelType] = k.SI<KilogramPerWattSecond>(); _engLine[fuel.FuelType] = k.SI<KilogramPerWattSecond>();
return _vehicleLine[fuel.FuelType]; return _engLine[fuel.FuelType];
}
public KilogramPerWattSecond VehicleLineSlope(IFuelProperties fuel)
{
if (_vehLine.ContainsKey(fuel.FuelType)) {
return _vehLine[fuel.FuelType];
}
double k, d, r;
VectoMath.LeastSquaresFitting(
GetValues(
row => row.Field<bool>(ModalResultField.ICEOn.GetName())
? new Point(
row.Field<SI>(ModalResultField.P_wheel_in.GetName()).Value(),
row.Field<SI>(GetColumnName(fuel, ModalResultField.FCFinal)).Value())
: null)
.Where(x => x != null && x.Y > 0), out k, out d, out r);
_vehLine[fuel.FuelType] = k.SI<KilogramPerWattSecond>();
return _vehLine[fuel.FuelType];
} }
public void CalculateAggregateValues() public void CalculateAggregateValues()
...@@ -195,7 +216,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -195,7 +216,7 @@ namespace TUGraz.VectoCore.OutputData
} }
foreach (var fuel in FuelColumns.Keys) { foreach (var fuel in FuelColumns.Keys) {
VehicleLineCorrectionFactor(fuel); EngineLineCorrectionFactor(fuel);
TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCMap)); TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCMap));
TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCNCVc)); TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCNCVc));
TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCWHTCc)); TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCWHTCc));
......
...@@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.OutputData
Fields.FC_AUXHTR_H_CORR, Fields.FC_AUXHTR_KM_CORR, Fields.FC_AUXHTR_H_CORR, Fields.FC_AUXHTR_KM_CORR,
Fields.FCFINAL_H, Fields.FCFINAL_KM, Fields.FCFINAL_LITERPER100KM, Fields.FCFINAL_LITERPER100TKM, Fields.FCFINAL_H, Fields.FCFINAL_KM, Fields.FCFINAL_LITERPER100KM, Fields.FCFINAL_LITERPER100TKM,
Fields.FCFINAL_LiterPer100M3KM, Fields.FCFINAL_LiterPer100PassengerKM, Fields.FCFINAL_LiterPer100M3KM, Fields.FCFINAL_LiterPer100PassengerKM,
Fields.SPECIFIC_FC, Fields.K_VEHLINE Fields.SPECIFIC_FC, Fields.K_VEHLINE, Fields.K_ENGLINE
}; };
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming
...@@ -175,7 +175,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -175,7 +175,7 @@ namespace TUGraz.VectoCore.OutputData
Table.Columns.AddRange( Table.Columns.AddRange(
new[] { new[] {
Fields.CO2_KM, Fields.CO2_TKM, Fields.CO2_M3KM, Fields.CO2_PKM, Fields.P_WHEEL_POS, Fields.P_FCMAP_POS, Fields.CO2_KM, Fields.CO2_TKM, Fields.CO2_M3KM, Fields.CO2_PKM, Fields.P_WHEEL, Fields.P_WHEEL_POS, Fields.P_FCMAP, Fields.P_FCMAP_POS,
Fields.E_FCMAP_POS, Fields.E_FCMAP_NEG, Fields.E_POWERTRAIN_INERTIA, Fields.E_AUX, Fields.E_CLUTCH_LOSS, Fields.E_FCMAP_POS, Fields.E_FCMAP_NEG, Fields.E_POWERTRAIN_INERTIA, Fields.E_AUX, Fields.E_CLUTCH_LOSS,
Fields.E_TC_LOSS, Fields.E_SHIFT_LOSS, Fields.E_GBX_LOSS, Fields.E_RET_LOSS, Fields.E_ANGLE_LOSS, Fields.E_TC_LOSS, Fields.E_SHIFT_LOSS, Fields.E_GBX_LOSS, Fields.E_RET_LOSS, Fields.E_ANGLE_LOSS,
Fields.E_AXL_LOSS, Fields.E_BRAKE, Fields.E_VEHICLE_INERTIA, Fields.E_WHEEL, Fields.E_AIR, Fields.E_ROLL, Fields.E_GRAD, Fields.E_AXL_LOSS, Fields.E_BRAKE, Fields.E_VEHICLE_INERTIA, Fields.E_WHEEL, Fields.E_AIR, Fields.E_ROLL, Fields.E_GRAD,
...@@ -328,8 +328,10 @@ namespace TUGraz.VectoCore.OutputData ...@@ -328,8 +328,10 @@ namespace TUGraz.VectoCore.OutputData
} }
row[Fields.P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt(); row[Fields.P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt();
row[Fields.P_WHEEL] = modData.PowerWheel().ConvertToKiloWatt();
row[Fields.P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt(); row[Fields.P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt();
row[Fields.P_FCMAP] = modData.TotalPowerEngineAverage().ConvertToKiloWatt();
WriteAuxiliaries(modData, row, runData.BusAuxiliaries != null); WriteAuxiliaries(modData, row, runData.BusAuxiliaries != null);
...@@ -438,10 +440,12 @@ namespace TUGraz.VectoCore.OutputData ...@@ -438,10 +440,12 @@ namespace TUGraz.VectoCore.OutputData
var fcModSum = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel); var fcModSum = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel);
var correction = modData.VehicleLineCorrectionFactor(fuel); var correction = modData.EngineLineCorrectionFactor(fuel);
row[FcCol(Fields.K_VEHLINE, suffix)] = correction.ConvertToGramPerKiloWattHour();
row[FcCol(Fields.K_ENGLINE, suffix)] = correction.ConvertToGramPerKiloWattHour();
row[FcCol(Fields.K_VEHLINE, suffix)] = modData.VehicleLineSlope(fuel).ConvertToGramPerKiloWattHour();
var fcEssCorr = fcModSum + correction * workESS; var fcEssCorr = fcModSum + correction * workESS;
row[FcCol(Fields.FCESS_H_CORR, suffix)] = duration != null ? (fcEssCorr / duration).ConvertToGrammPerHour() : null; row[FcCol(Fields.FCESS_H_CORR, suffix)] = duration != null ? (fcEssCorr / duration).ConvertToGrammPerHour() : null;
...@@ -1054,7 +1058,9 @@ namespace TUGraz.VectoCore.OutputData ...@@ -1054,7 +1058,9 @@ namespace TUGraz.VectoCore.OutputData
public const string CO2_PKM = "CO2 [g/Pkm]"; public const string CO2_PKM = "CO2 [g/Pkm]";
public const string P_WHEEL_POS = "P_wheel_in_pos [kW]"; public const string P_WHEEL_POS = "P_wheel_in_pos [kW]";
public const string P_WHEEL = "P_wheel_in [kW]";
public const string P_FCMAP_POS = "P_fcmap_pos [kW]"; public const string P_FCMAP_POS = "P_fcmap_pos [kW]";
public const string P_FCMAP = "P_fcmap [kW]";
public const string E_FORMAT = "E_{0} [kWh]"; public const string E_FORMAT = "E_{0} [kWh]";
public const string E_AUX_FORMAT = "E_aux_{0} [kWh]"; public const string E_AUX_FORMAT = "E_aux_{0} [kWh]";
...@@ -1063,6 +1069,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -1063,6 +1069,7 @@ namespace TUGraz.VectoCore.OutputData
public const string E_AUX_ESS_MECH = "E_aux_ess_mech [kWh]"; public const string E_AUX_ESS_MECH = "E_aux_ess_mech [kWh]";
public const string E_ICE_START = "E_ice_start [kWh]"; public const string E_ICE_START = "E_ice_start [kWh]";
public const string NUM_ICE_STARTS = "ice_starts [-]"; public const string NUM_ICE_STARTS = "ice_starts [-]";
public const string K_ENGLINE = "k_engline{0} [g/kWh]";
public const string K_VEHLINE = "k_vehline{0} [g/kWh]"; public const string K_VEHLINE = "k_vehline{0} [g/kWh]";
public const string E_WHR_EL = "E_WHR_el [kWh]"; public const string E_WHR_EL = "E_WHR_el [kWh]";
......
...@@ -185,7 +185,7 @@ namespace TUGraz.VectoCore.OutputData.XML ...@@ -185,7 +185,7 @@ namespace TUGraz.VectoCore.OutputData.XML
var correction = 0.SI<KilogramPerWattSecond>(); var correction = 0.SI<KilogramPerWattSecond>();
if (!(workWHR + workESS + workBusAuxCorr).IsEqual(0)) { if (!(workWHR + workESS + workBusAuxCorr).IsEqual(0)) {
correction = data.VehicleLineCorrectionFactor(entry); correction = data.EngineLineCorrectionFactor(entry);
} }
var fcAuxHtr = 0.SI<Kilogram>(); var fcAuxHtr = 0.SI<Kilogram>();
if (firstFuel) { if (firstFuel) {
......
...@@ -236,7 +236,7 @@ namespace TUGraz.VectoCore.Tests.Utils ...@@ -236,7 +236,7 @@ namespace TUGraz.VectoCore.Tests.Utils
public Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; } public Func<Second, Joule, Joule> AuxHeaterDemandCalc { get; set; }
public KilogramPerWattSecond VehicleLineCorrectionFactor(IFuelProperties fuel) public KilogramPerWattSecond EngineLineCorrectionFactor(IFuelProperties fuel)
{ {
return 0.SI<KilogramPerWattSecond>(); return 0.SI<KilogramPerWattSecond>();
} }
...@@ -246,6 +246,11 @@ namespace TUGraz.VectoCore.Tests.Utils ...@@ -246,6 +246,11 @@ namespace TUGraz.VectoCore.Tests.Utils
} }
public KilogramPerWattSecond VehicleLineSlope(IFuelProperties fuel)
{
return 0.SI<KilogramPerWattSecond>();
}
public string RunName { get; set; } public string RunName { get; set; }
public string CycleName { get; set; } public string CycleName { get; set; }
public string RunSuffix { get; set; } public string RunSuffix { get; set; }
......
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