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