From 0117c11d1091772e9c482973f62872bdbd2b1f6a Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Tue, 26 Apr 2016 13:09:56 +0200 Subject: [PATCH] adding missing files --- .../InputData/Reader/FullLoadCurveReader.cs | 113 ++++++++++++++++++ .../InputData/Reader/ShiftPolygonReader.cs | 95 +++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/ShiftPolygonReader.cs diff --git a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs new file mode 100644 index 0000000000..85216c06f6 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader +{ + public class FullLoadCurveReader : LoggingObject + { + public static FullLoadCurve ReadFromFile(string fileName, bool declarationMode = false, bool engineFld = false) + { + try { + var data = VectoCSVFile.Read(fileName); + return Create(data, declarationMode, engineFld); + } catch (Exception ex) { + throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message); + } + } + + + public static FullLoadCurve Create(DataTable data, bool declarationMode = false, bool engineFld = false) + { + if (engineFld) { + if (data.Columns.Count < 3) { + throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns."); + } + } else { + if (data.Columns.Count < 2) { + throw new VectoException("Gearbox FullLoadCurve Data File must consist of at least 2 columns."); + } + } + + if (data.Rows.Count < 2) { + throw new VectoException( + "FullLoadCurve must consist of at least two lines with numeric values (below file header)"); + } + + List<FullLoadCurve.FullLoadCurveEntry> entriesFld; + if (HeaderIsValid(data.Columns, engineFld)) { + entriesFld = CreateFromColumnNames(data, engineFld); + } else { + Logger<FullLoadCurve>().Warn( + "FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.", + Fields.EngineSpeed, Fields.TorqueFullLoad, + Fields.TorqueDrag, ", ".Join(data.Columns.Cast<DataColumn>().Select(c => c.ColumnName))); + + entriesFld = CreateFromColumnIndizes(data, engineFld); + } + + LookupData<PerSecond, Second> tmp; + if (declarationMode) { + tmp = new PT1(); + } else { + tmp = PT1Curve.Create(data); + } + entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value())); + return new FullLoadCurve { FullLoadEntries = entriesFld, PT1Data = tmp }; + } + + private static bool HeaderIsValid(DataColumnCollection columns, bool engineFld) + { + return columns.Contains(Fields.EngineSpeed) + && columns.Contains(Fields.TorqueFullLoad) + && (!engineFld || columns.Contains(Fields.TorqueDrag)); + } + + private static List<FullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data, bool engineFld) + { + return (from DataRow row in data.Rows + select new FullLoadCurve.FullLoadCurveEntry { + EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(), + TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(), + TorqueDrag = (engineFld ? row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>() : null) + }).ToList(); + } + + private static List<FullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data, bool engineFld) + { + return (from DataRow row in data.Rows + select new FullLoadCurve.FullLoadCurveEntry { + EngineSpeed = row.ParseDouble(0).RPMtoRad(), + TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(), + TorqueDrag = (engineFld ? row.ParseDouble(2).SI<NewtonMeter>() : null) + }).ToList(); + } + + + private 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/InputData/Reader/ShiftPolygonReader.cs b/VectoCore/VectoCore/InputData/Reader/ShiftPolygonReader.cs new file mode 100644 index 0000000000..8909e47c55 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/ShiftPolygonReader.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader +{ + public class ShiftPolygonReader : LoggingObject + { + public static ShiftPolygon ReadFromFile(string fileName) + { + try { + var data = VectoCSVFile.Read(fileName); + return Create(data); + } catch (Exception ex) { + throw new VectoException("ERROR while reading ShiftPolygon: " + ex.Message); + } + } + + public static ShiftPolygon Create(DataTable data) + { + if (data.Columns.Count != 3) { + throw new VectoException("ShiftPolygon Data File must contain exactly 3 columns."); + } + + if (data.Rows.Count < 2) { + throw new VectoException("ShiftPolygon must have at least two entries"); + } + + List<ShiftPolygon.ShiftPolygonEntry> entriesDown, entriesUp; + if (HeaderIsValid(data.Columns)) { + entriesDown = CreateFromColumnNames(data, Fields.AngularSpeedDown); + entriesUp = CreateFromColumnNames(data, Fields.AngularSpeedUp); + } else { + Logger<ShiftPolygon>() + .Warn( + "ShiftPolygon: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index", + Fields.Torque, Fields.AngularSpeedUp, Fields.AngularSpeedDown, + ", ".Join(data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Reverse())); + entriesDown = CreateFromColumnIndizes(data, 1); + entriesUp = CreateFromColumnIndizes(data, 2); + } + return new ShiftPolygon(entriesDown, entriesUp); + } + + + private static bool HeaderIsValid(DataColumnCollection columns) + { + return columns.Contains(Fields.Torque) && columns.Contains(Fields.AngularSpeedUp) && + columns.Contains((Fields.AngularSpeedDown)); + } + + private static List<ShiftPolygon.ShiftPolygonEntry> CreateFromColumnNames(DataTable data, string columnName) + { + return (from DataRow row in data.Rows + select new ShiftPolygon.ShiftPolygonEntry { + Torque = DataTableExtensionMethods.ParseDouble(row, (string)Fields.Torque).SI<NewtonMeter>(), + AngularSpeed = row.ParseDouble(columnName).RPMtoRad(), + }).ToList(); + } + + private static List<ShiftPolygon.ShiftPolygonEntry> CreateFromColumnIndizes(DataTable data, int column) + { + return (from DataRow row in data.Rows + select + new ShiftPolygon.ShiftPolygonEntry { + Torque = row.ParseDouble(0).SI<NewtonMeter>(), + AngularSpeed = row.ParseDouble(column).RPMtoRad(), + }).ToList(); + } + + private static class Fields + { + /// <summary> + /// [Nm] torque + /// </summary> + public const string Torque = "engine torque"; + + /// <summary> + /// [rpm] threshold for upshift + /// </summary> + public const string AngularSpeedUp = "upshift rpm"; + + /// <summary> + /// [rpm] threshold for downshift + /// </summary> + public const string AngularSpeedDown = "downshift rpm"; + } + } +} \ No newline at end of file -- GitLab