diff --git a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs index c8eb1db895ba4625d37aecdc695a38ebbcfa893e..7bb94ac86bac9d1a156f2f43c2f26ab10462e4c7 100644 --- a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs @@ -29,107 +29,107 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.InputData.Reader -{ - public static class FullLoadCurveReader - { - public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false) - { - try { - var data = VectoCSVFile.Read(fileName); - return Create(data, declarationMode); - } catch (Exception ex) { - throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message, ex); - } - } - - public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false) - { - if (data.Columns.Count < 3) { - throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns."); - } - - if (data.Rows.Count < 2) { - throw new VectoException( - "FullLoadCurve must consist of at least two lines with numeric values (below file header)"); - } - - List<EngineFullLoadCurve.FullLoadCurveEntry> entriesFld; - if (HeaderIsValid(data.Columns)) { - entriesFld = CreateFromColumnNames(data); - } else { - LoggingObject.Logger<EngineFullLoadCurve>().Warn( - "FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.", - Fields.EngineSpeed, Fields.TorqueFullLoad, - Fields.TorqueDrag, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName))); - - entriesFld = CreateFromColumnIndizes(data); - } - - LookupData<PerSecond, PT1.PT1Result> tmp; - if (declarationMode) { - tmp = new PT1(); - } else { - tmp = data.Columns.Count > 3 ? new PT1(data) : new PT1(); - } - entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value())); - return new EngineFullLoadCurve(entriesFld, tmp); - } - - private static bool HeaderIsValid(DataColumnCollection columns) - { - return columns.Contains(Fields.EngineSpeed) - && columns.Contains(Fields.TorqueFullLoad) - && columns.Contains(Fields.TorqueDrag); - } - - private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data) - { - return (from DataRow row in data.Rows - select new EngineFullLoadCurve.FullLoadCurveEntry { - EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(), - TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(), - TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>() - }).ToList(); - } - - private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data) - { - return (from DataRow row in data.Rows - select new EngineFullLoadCurve.FullLoadCurveEntry { - EngineSpeed = row.ParseDouble(0).RPMtoRad(), - TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(), - TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>() - }).ToList(); - } - - public static class Fields - { - /// <summary> - /// [rpm] engine speed - /// </summary> - public const string EngineSpeed = "engine speed"; - - /// <summary> - /// [Nm] full load torque - /// </summary> - public const string TorqueFullLoad = "full load torque"; - - /// <summary> - /// [Nm] motoring torque - /// </summary> - public const string TorqueDrag = "motoring torque"; - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader +{ + public static class FullLoadCurveReader + { + public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false) + { + try { + var data = VectoCSVFile.Read(fileName); + return Create(data, declarationMode); + } catch (Exception ex) { + throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message, ex); + } + } + + public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false) + { + if (data.Columns.Count < 3) { + throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns."); + } + + if (data.Rows.Count < 2) { + throw new VectoException( + "FullLoadCurve must consist of at least two lines with numeric values (below file header)"); + } + + List<EngineFullLoadCurve.FullLoadCurveEntry> entriesFld; + if (HeaderIsValid(data.Columns)) { + entriesFld = CreateFromColumnNames(data); + } else { + LoggingObject.Logger<EngineFullLoadCurve>().Warn( + "FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.", + Fields.EngineSpeed, Fields.TorqueFullLoad, + Fields.TorqueDrag, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName))); + + entriesFld = CreateFromColumnIndizes(data); + } + + LookupData<PerSecond, PT1.PT1Result> tmp; + if (declarationMode) { + tmp = new PT1(); + } else { + tmp = data.Columns.Count > 3 ? new PT1(data) : new PT1(); + } + entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value())); + return new EngineFullLoadCurve(entriesFld, tmp); + } + + private static bool HeaderIsValid(DataColumnCollection columns) + { + return columns.Contains(Fields.EngineSpeed) + && columns.Contains(Fields.TorqueFullLoad) + && columns.Contains(Fields.TorqueDrag); + } + + private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data) + { + return (from DataRow row in data.Rows + select new EngineFullLoadCurve.FullLoadCurveEntry { + EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(), + TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(), + TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>() + }).ToList(); + } + + private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data) + { + return (from DataRow row in data.Rows + select new EngineFullLoadCurve.FullLoadCurveEntry { + EngineSpeed = row.ParseDouble(0).RPMtoRad(), + TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(), + TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>() + }).ToList(); + } + + public static class Fields + { + /// <summary> + /// [rpm] engine speed + /// </summary> + public const string EngineSpeed = "engine speed"; + + /// <summary> + /// [Nm] full load torque + /// </summary> + public const string TorqueFullLoad = "full load torque"; + + /// <summary> + /// [Nm] motoring torque + /// </summary> + public const string TorqueDrag = "motoring torque"; + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs index ee258eb3dc4cc846f63a7f9a46eb7657c8fc6aa4..f9e89983f303ea9f82d50780d58d349e85b910d9 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segments.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs @@ -130,7 +130,7 @@ namespace TUGraz.VectoCore.Models.Declaration var errorMessage = string.Format(ErrorMessage, vehicleCategory, axleConfiguration.GetName(), grossVehicleMassRating); Log.Fatal(errorMessage); - throw new VectoException(errorMessage, e); + throw new VectoException(errorMessage, e); } return row; } diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index c49484397340ceece9f4ee713066f5d6618fd144..cd8e02123c5fcfd9655c3b31ce0041886c57b222 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -190,9 +190,12 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/t-km"), (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)), - new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value - ().ToMinSignificantDigits(3, 1)) + result.CargoVolume > 0 + ? new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume) + .Value + ().ToMinSignificantDigits(3, 1)) + : null }; //FC if (fullOutput) { @@ -201,9 +204,11 @@ namespace TUGraz.VectoCore.OutputData.XML retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/t-km"), (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6) .Value().ToMinSignificantDigits(3, 1))); - retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/m³-km"), - (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value() - .ToMinSignificantDigits(3, 1))); + if (result.CargoVolume > 0) { + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/m³-km"), + (result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value() + .ToMinSignificantDigits(3, 1))); + } } if (fuel.FuelDensity != null) { retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/100km"), @@ -212,9 +217,11 @@ namespace TUGraz.VectoCore.OutputData.XML retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/t-km"), (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1))); - retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/m³-km"), - (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / - result.CargoVolume).Value().ToMinSignificantDigits(3, 1))); + if (result.CargoVolume > 0) { + retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/m³-km"), + (result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter / + result.CargoVolume).Value().ToMinSignificantDigits(3, 1))); + } } //CO2 retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/km"), @@ -222,9 +229,11 @@ namespace TUGraz.VectoCore.OutputData.XML retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/t-km"), (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1))); - retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"), - (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value() - .ToMinSignificantDigits(3, 1))); + if (result.CargoVolume > 0) { + retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"), + (result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value() + .ToMinSignificantDigits(3, 1))); + } return retVal; }