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

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

adding missing files

parent 7653630c
No related branches found
No related tags found
No related merge requests found
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
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
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