diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs index cefd8c1086532aba7b75c9a672fc5a92e90d0b24..53f8f9d710f044357290eb380309baf20e6b95de 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs @@ -484,21 +484,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON get { return Body.GetEx<string>(JsonKeys.Gearbox_ModelName); } } - public string Creator - { - get { return "N/A"; } - } - public string Date { get { return "N/A"; } } - public string TechnicalReportId - { - get { return "N/A"; } - } - public CertificationMethod CertificationMethod { get { return CertificationMethod.NotCertified; } diff --git a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs index ee415044494be15d9f2bb2df4a809e693f4a2db0..666f4c68a4dae77a0b738f0b245fdd4d922bad92 100644 --- a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs @@ -45,26 +45,20 @@ namespace TUGraz.VectoCore.InputData.Reader { public class FullLoadCurveReader : LoggingObject { - public static FullLoadCurve ReadFromFile(string fileName, bool declarationMode = false, bool engineFld = false) + public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false) { try { var data = VectoCSVFile.Read(fileName); - return Create(data, declarationMode, engineFld); + return Create(data, declarationMode); } catch (Exception ex) { throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message, ex); } } - public static FullLoadCurve Create(DataTable data, bool declarationMode = false, bool engineFld = false) + public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = 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.Columns.Count < 3) { + throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns."); } if (data.Rows.Count < 2) { @@ -72,16 +66,16 @@ namespace TUGraz.VectoCore.InputData.Reader "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); + List<EngineFullLoadCurve.FullLoadCurveEntry> entriesFld; + if (HeaderIsValid(data.Columns)) { + entriesFld = CreateFromColumnNames(data); } else { - Logger<FullLoadCurve>().Warn( + 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, engineFld); + entriesFld = CreateFromColumnIndizes(data); } LookupData<PerSecond, PT1.PT1Result> tmp; @@ -95,33 +89,33 @@ namespace TUGraz.VectoCore.InputData.Reader } } entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value())); - return new FullLoadCurve { FullLoadEntries = entriesFld, PT1Data = tmp }; + return new EngineFullLoadCurve { FullLoadEntries = entriesFld, PT1Data = tmp }; } - private static bool HeaderIsValid(DataColumnCollection columns, bool engineFld) + private static bool HeaderIsValid(DataColumnCollection columns) { return columns.Contains(Fields.EngineSpeed) && columns.Contains(Fields.TorqueFullLoad) - && (!engineFld || columns.Contains(Fields.TorqueDrag)); + && columns.Contains(Fields.TorqueDrag); } - private static List<FullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data, bool engineFld) + private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data) { return (from DataRow row in data.Rows - select new FullLoadCurve.FullLoadCurveEntry { + select new EngineFullLoadCurve.FullLoadCurveEntry { EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(), TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(), - TorqueDrag = engineFld ? row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>() : null + TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>() }).ToList(); } - private static List<FullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data, bool engineFld) + private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data) { return (from DataRow row in data.Rows - select new FullLoadCurve.FullLoadCurveEntry { + select new EngineFullLoadCurve.FullLoadCurveEntry { EngineSpeed = row.ParseDouble(0).RPMtoRad(), TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(), - TorqueDrag = engineFld ? row.ParseDouble(2).SI<NewtonMeter>() : null + TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>() }).ToList(); } diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 6944fad5cf8b921816506a2f5e670bf9f0150fe4..694195235ba6c57bf46fca43fc37803ae1953bee 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -291,7 +291,7 @@ namespace TUGraz.VectoCore.Models.Declaration /// <param name="fullLoadCurve"></param> /// <param name="rpmLimit"></param> /// <returns></returns> - internal static IEnumerable<Point> ShiftPolygonFldMargin(List<FullLoadCurve.FullLoadCurveEntry> fullLoadCurve, + internal static IEnumerable<Point> ShiftPolygonFldMargin(List<EngineFullLoadCurve.FullLoadCurveEntry> fullLoadCurve, PerSecond rpmLimit) { return fullLoadCurve.TakeWhile(fldEntry => fldEntry.EngineSpeed < rpmLimit) @@ -386,7 +386,8 @@ namespace TUGraz.VectoCore.Models.Declaration private static PerSecond UpshiftLowRPM = 900.RPMtoRad(); private static PerSecond UpshiftHighRPM = 1150.RPMtoRad(); - public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve, bool first = false, bool last = false) + public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve, bool first = false, + bool last = false) { var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1; var maxTorque = fullLoadCurve.MaxTorque * 1.1; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs index fa6b684bf5f16f5e5b02309e467162c705952bbe..aaedc3db532b5a9a77e7c371d3b15dbce89a8991 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs @@ -29,11 +29,15 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Data; +using System.Diagnostics; using System.Linq; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Utils; @@ -43,25 +47,26 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine /// <summary> /// Represents the Full load curve. /// </summary> - public class EngineFullLoadCurve : FullLoadCurve + public class EngineFullLoadCurve : SimulationComponentData { + private Watt _maxPower; + private PerSecond _ratedSpeed; + private NewtonMeter _maxTorque; + private NewtonMeter _maxDragTorque; + private PerSecond _preferredSpeed; private PerSecond _engineSpeedLo; // 55% of Pmax private PerSecond _engineSpeedHi; // 70% of Pmax private PerSecond _n95hSpeed; // 95% of Pmax private PerSecond _n80hSpeed; // 80% of Pmax - public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false) - { - var curve = FullLoadCurveReader.ReadFromFile(fileName, declarationMode, true); - return new EngineFullLoadCurve { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data }; - } + [Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries; - public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false, NewtonMeter maxTorque = null) - { - var curve = FullLoadCurveReader.Create(data, declarationMode, true); - return new EngineFullLoadCurve() { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data }; - } + private SortedList<PerSecond, int> _quickLookup; + + [Required] internal LookupData<PerSecond, PT1.PT1Result> PT1Data; + + internal EngineFullLoadCurve() {} public Watt FullLoadStationaryPower(PerSecond angularVelocity) { @@ -80,6 +85,147 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine return PT1Data.Lookup(angularVelocity); } + /// <summary> + /// Get the rated speed from the given full-load curve (i.e. speed with max. power) + /// </summary> + [Required, SIRange(0, 5000 * Constants.RPMToRad)] + public PerSecond RatedSpeed + { + get { return _ratedSpeed ?? ComputeRatedSpeed().Item1; } + } + + /// <summary> + /// Gets the maximum power. + /// </summary> + [Required, SIRange(0, 10000 * 5000 * Constants.RPMToRad)] + public Watt MaxPower + { + get { return _maxPower ?? ComputeRatedSpeed().Item2; } + } + + public NewtonMeter MaxTorque + { + get { return _maxTorque ?? FindMaxTorque(); } + } + + public NewtonMeter MaxDragTorque + { + get { return _maxDragTorque ?? FindMaxDragTorque(); } + } + + public virtual NewtonMeter FullLoadStationaryTorque(PerSecond angularVelocity) + { + var idx = FindIndex(angularVelocity); + return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed, + FullLoadEntries[idx - 1].TorqueFullLoad, FullLoadEntries[idx].TorqueFullLoad, + angularVelocity); + } + + public virtual NewtonMeter DragLoadStationaryTorque(PerSecond angularVelocity) + { + var idx = FindIndex(angularVelocity); + return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed, + FullLoadEntries[idx - 1].TorqueDrag, FullLoadEntries[idx].TorqueDrag, + angularVelocity); + } + + private NewtonMeter FindMaxTorque() + { + _maxTorque = FullLoadEntries.Max(x => x.TorqueFullLoad); + return _maxTorque; + } + + private NewtonMeter FindMaxDragTorque() + { + _maxDragTorque = FullLoadEntries.Min(x => x.TorqueDrag); + return _maxDragTorque; + } + + /// <summary> + /// Compute the engine's rated speed from the given full-load curve (i.e. engine speed with max. power) + /// </summary> + protected Tuple<PerSecond, Watt> ComputeRatedSpeed() + { + var max = new Tuple<PerSecond, Watt>(0.SI<PerSecond>(), 0.SI<Watt>()); + for (var idx = 1; idx < FullLoadEntries.Count; idx++) { + var currentMax = FindMaxPower(FullLoadEntries[idx - 1], FullLoadEntries[idx]); + if (currentMax.Item2 > max.Item2) { + max = currentMax; + } + } + + _ratedSpeed = max.Item1; + _maxPower = max.Item2; + + return max; + } + + private Tuple<PerSecond, Watt> FindMaxPower(FullLoadCurveEntry p1, FullLoadCurveEntry p2) + { + if (p1.EngineSpeed.IsEqual(p2.EngineSpeed)) { + return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed); + } + + if (p2.EngineSpeed < p1.EngineSpeed) { + var tmp = p1; + p1 = p2; + p2 = tmp; + } + + // y = kx + d + var k = (p2.TorqueFullLoad - p1.TorqueFullLoad) / (p2.EngineSpeed - p1.EngineSpeed); + var d = p2.TorqueFullLoad - k * p2.EngineSpeed; + if (k.IsEqual(0)) { + return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed); + } + var engineSpeedMaxPower = -d / (2 * k); + if (engineSpeedMaxPower.IsSmaller(p1.EngineSpeed) || engineSpeedMaxPower.IsGreater(p2.EngineSpeed)) { + if (p2.TorqueFullLoad * p2.EngineSpeed > p1.TorqueFullLoad * p1.EngineSpeed) { + return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed); + } + return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed); + } + var engineTorqueMaxPower = FullLoadStationaryTorque(engineSpeedMaxPower); + return Tuple.Create(engineSpeedMaxPower, engineTorqueMaxPower * engineSpeedMaxPower); + } + + + /// <summary> + /// Get item index for the segment of the full-load curve where the angularVelocity lies within. + /// </summary> + protected int FindIndex(PerSecond angularVelocity) + { + if (angularVelocity < FullLoadEntries.First().EngineSpeed) { + return 1; + } + if (angularVelocity > FullLoadEntries.Last().EngineSpeed) { + return FullLoadEntries.Count - 1; + } + + if (_quickLookup == null) { + _quickLookup = new SortedList<PerSecond, int>(); + var i = 10; + for (; i < FullLoadEntries.Count; i += 10) { + _quickLookup.Add(FullLoadEntries[i].EngineSpeed, Math.Max(1, i - 10)); + } + _quickLookup.Add(FullLoadEntries.Last().EngineSpeed + 0.1.SI<PerSecond>(), Math.Max(1, i - 10)); + } + var start = 1; + foreach (var lookup in _quickLookup.Where(lookup => angularVelocity < lookup.Key)) { + start = lookup.Value; + break; + } + + for (var index = start; index < FullLoadEntries.Count; index++) { + if (angularVelocity >= FullLoadEntries[index - 1].EngineSpeed && + angularVelocity <= FullLoadEntries[index].EngineSpeed) { + return index; + } + } + throw new VectoException("angular velocity {0} exceeds full load curve: min: {1} max: {2}", angularVelocity, + FullLoadEntries.First().EngineSpeed, FullLoadEntries.Last().EngineSpeed); + } + /// <summary> /// Get the engine's preferred speed from the given full-load curve (i.e. Speed at 51% torque/speed-integral between idling and N95h.) /// </summary> @@ -271,5 +417,52 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine } #endregion + + [DebuggerDisplay("n: {EngineSpeed}, fullTorque: {TorqueFullLoad}, dragTorque: {TorqueDrag}")] + internal class FullLoadCurveEntry + { + [Required, SIRange(0, 5000 * Constants.RPMToRad)] + public PerSecond EngineSpeed { get; set; } + + [Required, SIRange(0, 10000)] + public NewtonMeter TorqueFullLoad { get; set; } + + [Required, SIRange(-10000, 0)] + public NewtonMeter TorqueDrag { get; set; } + + #region Equality members + + protected bool Equals(FullLoadCurveEntry other) + { + return Equals(EngineSpeed, other.EngineSpeed) && Equals(TorqueFullLoad, other.TorqueFullLoad) && + Equals(TorqueDrag, other.TorqueDrag); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) { + return false; + } + if (ReferenceEquals(this, obj)) { + return true; + } + if (obj.GetType() != GetType()) { + return false; + } + return Equals((FullLoadCurveEntry)obj); + } + + public override int GetHashCode() + { + unchecked { + var hashCode = EngineSpeed != null ? EngineSpeed.GetHashCode() : 0; + hashCode = (hashCode * 397) ^ (TorqueFullLoad != null ? TorqueFullLoad.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (TorqueDrag != null ? TorqueDrag.GetHashCode() : 0); + return hashCode; + } + } + + #endregion + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs deleted file mode 100644 index b7bf245479af05eedde94ad0a815be27b23b0b4b..0000000000000000000000000000000000000000 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs +++ /dev/null @@ -1,245 +0,0 @@ -/* -* This file is part of VECTO. -* -* Copyright © 2012-2016 European Union -* -* Developed by Graz University of Technology, -* Institute of Internal Combustion Engines and Thermodynamics, -* Institute of Technical Informatics -* -* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved -* by the European Commission - subsequent versions of the EUPL (the "Licence"); -* You may not use VECTO except in compliance with the Licence. -* You may obtain a copy of the Licence at: -* -* https://joinup.ec.europa.eu/community/eupl/og_page/eupl -* -* Unless required by applicable law or agreed to in writing, VECTO -* distributed under the Licence is distributed on an "AS IS" basis, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the Licence for the specific language governing permissions and -* limitations under the Licence. -* -* Authors: -* Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology -* Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology -* Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology -* Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology -* Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology -* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology -*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Diagnostics; -using System.Linq; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Configuration; -using TUGraz.VectoCore.Models.Declaration; - -namespace TUGraz.VectoCore.Models.SimulationComponent.Data -{ - public class FullLoadCurve : SimulationComponentData - { - private Watt _maxPower; - private PerSecond _ratedSpeed; - private NewtonMeter _maxTorque; - private NewtonMeter _maxDragTorque; - - [Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries; - - private SortedList<PerSecond, int> _quickLookup; - - [Required] internal LookupData<PerSecond, PT1.PT1Result> PT1Data; - - /// <summary> - /// Get the rated speed from the given full-load curve (i.e. speed with max. power) - /// </summary> - [Required, SIRange(0, 5000 * Constants.RPMToRad)] - public PerSecond RatedSpeed - { - get { return _ratedSpeed ?? ComputeRatedSpeed().Item1; } - } - - /// <summary> - /// Gets the maximum power. - /// </summary> - [Required, SIRange(0, 10000 * 5000 * Constants.RPMToRad)] - public Watt MaxPower - { - get { return _maxPower ?? ComputeRatedSpeed().Item2; } - } - - public NewtonMeter MaxTorque - { - get { return _maxTorque ?? FindMaxTorque(); } - } - - public NewtonMeter MaxDragTorque - { - get { return _maxDragTorque ?? FindMaxDragTorque(); } - } - - public virtual NewtonMeter FullLoadStationaryTorque(PerSecond angularVelocity) - { - var idx = FindIndex(angularVelocity); - return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed, - FullLoadEntries[idx - 1].TorqueFullLoad, FullLoadEntries[idx].TorqueFullLoad, - angularVelocity); - } - - public virtual NewtonMeter DragLoadStationaryTorque(PerSecond angularVelocity) - { - var idx = FindIndex(angularVelocity); - return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed, - FullLoadEntries[idx - 1].TorqueDrag, FullLoadEntries[idx].TorqueDrag, - angularVelocity); - } - - private NewtonMeter FindMaxTorque() - { - _maxTorque = FullLoadEntries.Max(x => x.TorqueFullLoad); - return _maxTorque; - } - - private NewtonMeter FindMaxDragTorque() - { - _maxDragTorque = FullLoadEntries.Min(x => x.TorqueDrag); - return _maxDragTorque; - } - - /// <summary> - /// Compute the engine's rated speed from the given full-load curve (i.e. engine speed with max. power) - /// </summary> - protected Tuple<PerSecond, Watt> ComputeRatedSpeed() - { - var max = new Tuple<PerSecond, Watt>(0.SI<PerSecond>(), 0.SI<Watt>()); - for (var idx = 1; idx < FullLoadEntries.Count; idx++) { - var currentMax = FindMaxPower(FullLoadEntries[idx - 1], FullLoadEntries[idx]); - if (currentMax.Item2 > max.Item2) { - max = currentMax; - } - } - - _ratedSpeed = max.Item1; - _maxPower = max.Item2; - - return max; - } - - private Tuple<PerSecond, Watt> FindMaxPower(FullLoadCurveEntry p1, FullLoadCurveEntry p2) - { - if (p1.EngineSpeed.IsEqual(p2.EngineSpeed)) { - return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed); - } - - if (p2.EngineSpeed < p1.EngineSpeed) { - var tmp = p1; - p1 = p2; - p2 = tmp; - } - - // y = kx + d - var k = (p2.TorqueFullLoad - p1.TorqueFullLoad) / (p2.EngineSpeed - p1.EngineSpeed); - var d = p2.TorqueFullLoad - k * p2.EngineSpeed; - if (k.IsEqual(0)) { - return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed); - } - var engineSpeedMaxPower = -d / (2 * k); - if (engineSpeedMaxPower.IsSmaller(p1.EngineSpeed) || engineSpeedMaxPower.IsGreater(p2.EngineSpeed)) { - if (p2.TorqueFullLoad * p2.EngineSpeed > p1.TorqueFullLoad * p1.EngineSpeed) { - return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed); - } - return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed); - } - var engineTorqueMaxPower = FullLoadStationaryTorque(engineSpeedMaxPower); - return Tuple.Create(engineSpeedMaxPower, engineTorqueMaxPower * engineSpeedMaxPower); - } - - - /// <summary> - /// Get item index for the segment of the full-load curve where the angularVelocity lies within. - /// </summary> - protected int FindIndex(PerSecond angularVelocity) - { - if (angularVelocity < FullLoadEntries.First().EngineSpeed) { - return 1; - } - if (angularVelocity > FullLoadEntries.Last().EngineSpeed) { - return FullLoadEntries.Count - 1; - } - - if (_quickLookup == null) { - _quickLookup = new SortedList<PerSecond, int>(); - var i = 10; - for (; i < FullLoadEntries.Count; i += 10) { - _quickLookup.Add(FullLoadEntries[i].EngineSpeed, Math.Max(1, i - 10)); - } - _quickLookup.Add(FullLoadEntries.Last().EngineSpeed + 0.1.SI<PerSecond>(), Math.Max(1, i - 10)); - } - var start = 1; - foreach (var lookup in _quickLookup.Where(lookup => angularVelocity < lookup.Key)) { - start = lookup.Value; - break; - } - - for (var index = start; index < FullLoadEntries.Count; index++) { - if (angularVelocity >= FullLoadEntries[index - 1].EngineSpeed && - angularVelocity <= FullLoadEntries[index].EngineSpeed) { - return index; - } - } - throw new VectoException("angular velocity {0} exceeds full load curve: min: {1} max: {2}", angularVelocity, - FullLoadEntries.First().EngineSpeed, FullLoadEntries.Last().EngineSpeed); - } - - [DebuggerDisplay("n: {EngineSpeed}, fullTorque: {TorqueFullLoad}, dragTorque: {TorqueDrag}")] - internal class FullLoadCurveEntry - { - [Required, SIRange(0, 5000 * Constants.RPMToRad)] - public PerSecond EngineSpeed { get; set; } - - [Required, SIRange(0, 10000)] - public NewtonMeter TorqueFullLoad { get; set; } - - [Required, SIRange(-10000, 0)] - public NewtonMeter TorqueDrag { get; set; } - - #region Equality members - - protected bool Equals(FullLoadCurveEntry other) - { - return Equals(EngineSpeed, other.EngineSpeed) && Equals(TorqueFullLoad, other.TorqueFullLoad) && - Equals(TorqueDrag, other.TorqueDrag); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) { - return false; - } - if (ReferenceEquals(this, obj)) { - return true; - } - if (obj.GetType() != GetType()) { - return false; - } - return Equals((FullLoadCurveEntry)obj); - } - - public override int GetHashCode() - { - unchecked { - var hashCode = EngineSpeed != null ? EngineSpeed.GetHashCode() : 0; - hashCode = (hashCode * 397) ^ (TorqueFullLoad != null ? TorqueFullLoad.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (TorqueDrag != null ? TorqueDrag.GetHashCode() : 0); - return hashCode; - } - } - - #endregion - } - } -} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs b/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs index 6f3f6a355040f939f5362680d6c1852b65934b75..8d41f094b662da891c1ab8738950fc51a7dad529 100644 --- a/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs +++ b/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs @@ -34,6 +34,7 @@ using System.Diagnostics; using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; namespace TUGraz.VectoCore.Tests.Dummy @@ -47,11 +48,12 @@ namespace TUGraz.VectoCore.Tests.Dummy var engineFile1 = @"TestData\Components\40t_Long_Haul_Truck.vfld"; var engineFile2 = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld"; - if (!File.Exists(engineFile2)) + if (!File.Exists(engineFile2)) { Assert.Inconclusive("Confidential File not found. Test cannot run without file."); + } - var map1 = EngineFullLoadCurve.ReadFromFile(engineFile1, true); - var map2 = EngineFullLoadCurve.ReadFromFile(engineFile2, true); + var map1 = FullLoadCurveReader.ReadFromFile(engineFile1, true); + var map2 = FullLoadCurveReader.ReadFromFile(engineFile2, true); map1.FullLoadStationaryTorque(1000.RPMtoRad()); map2.FullLoadStationaryTorque(1000.RPMtoRad()); @@ -77,10 +79,11 @@ namespace TUGraz.VectoCore.Tests.Dummy { var engineFile2 = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld"; - if (!File.Exists(engineFile2)) + if (!File.Exists(engineFile2)) { Assert.Inconclusive("Confidential File not found. Test cannot run without file."); + } - var map = EngineFullLoadCurve.ReadFromFile(engineFile2, true); + var map = FullLoadCurveReader.ReadFromFile(engineFile2, true); Assert.AreEqual(1208, map.FullLoadStationaryTorque(500.RPMtoRad()).Value(), 1e-3); diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs index c2249114939f526752c2d284fa49f26c25363f3f..96344a77f16f41fe558d8abd6244295affd1c6f2 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs @@ -38,6 +38,7 @@ using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.FileIO.JSON; +using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -248,7 +249,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration DeclarationData.Gearbox.ShiftPolygonFldMargin( engineFld.Select( p => - new FullLoadCurve.FullLoadCurveEntry() { + new EngineFullLoadCurve.FullLoadCurveEntry() { EngineSpeed = p.X.SI<PerSecond>(), TorqueFullLoad = p.Y.SI<NewtonMeter>() }).ToList(), @@ -444,7 +445,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration }; var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(); - fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(engineFldFile, true); + fullLoadCurves[0] = FullLoadCurveReader.ReadFromFile(engineFldFile, true); fullLoadCurves[0].EngineData = engineData; for (uint i = 1; i <= gearboxData.Gears.Count; i++) { fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0], @@ -531,7 +532,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration }; var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(); - fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(Path.Combine(BasePath, engineFldFile), true); + fullLoadCurves[0] = FullLoadCurveReader.ReadFromFile(Path.Combine(BasePath, engineFldFile), true); fullLoadCurves[0].EngineData = engineData; for (uint i = 1; i <= gearboxData.Gears.Count; i++) { fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0], diff --git a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs index 3e6abd469222220bc2e8a963282f1fafd771af2d..e0b70749528b1d5896d71a27f15bd9bd4d0ac2e9 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs @@ -224,7 +224,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation fullLoad.Rows.Add("0", "5000", "-5000", "0"); fullLoad.Rows.Add("3000", "5000", "-5000", "0"); - var fullLoadCurve = EngineFullLoadCurve.Create(fullLoad); + var fullLoadCurve = FullLoadCurveReader.Create(fullLoad); var data = new VectoRunData { Cycle = drivingCycle, VehicleData = @@ -291,7 +291,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation fullLoad.Rows.Add("0", "5000", "-5000", "0"); fullLoad.Rows.Add("3000", "5000", "-5000", "0"); - var fullLoadCurve = EngineFullLoadCurve.Create(fullLoad); + var fullLoadCurve = FullLoadCurveReader.Create(fullLoad); var data = new VectoRunData { Cycle = drivingCycle, VehicleData = diff --git a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs index fcb338353fe65a99c7901b4fb11cab963d117aae..49658a7215a0932f69479429ed12a8312c0ca307 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs @@ -128,7 +128,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation fullLoad.Rows.Add("0", "5000", "-5000", "0"); fullLoad.Rows.Add("3000", "5000", "-5000", "0"); - var fullLoadCurve = EngineFullLoadCurve.Create(fullLoad); + var fullLoadCurve = FullLoadCurveReader.Create(fullLoad); var data = new VectoRunData { Cycle = drivingCycle, AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } }, diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs index dc8277a9e0fc52db89b7bce5de6890f5015f7fc0..7343808a0915dfdff667ea7fd844ceefe5ebd461 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs @@ -250,7 +250,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent Inertia = 0.SI<KilogramSquareMeter>(), }; var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(); - fullLoadCurves[0] = EngineFullLoadCurve.Create( + fullLoadCurves[0] = FullLoadCurveReader.Create( VectoCSVFile.ReadStream( InputDataHelper.InputDataAsStream("engine speed [1/min],full load torque [Nm],motoring torque [Nm],PT1 [s]", fld))); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs index 8a03c5cb6eb9f0f05686c75e259eb4a4c6a33f7a..a07591196884eaaa99f425e8077fef9511e3bc2c 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs @@ -36,6 +36,7 @@ using NLog.Config; using NLog.Targets; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -57,7 +58,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void TestFullLoadStaticTorque() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance); Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance); @@ -67,14 +68,14 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void TestFullLoadEngineSpeedRated() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); Assert.AreEqual(181.8444, fldCurve.RatedSpeed.Value(), Tolerance); } [TestMethod] public void TestFullLoadStaticPower() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); Assert.AreEqual(69198.814183, fldCurve.FullLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance); Assert.AreEqual(283162.218372, fldCurve.FullLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance); @@ -84,7 +85,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void TestDragLoadStaticTorque() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); Assert.AreEqual(-149, fldCurve.DragLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance); Assert.AreEqual(-301, fldCurve.DragLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance); @@ -96,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void TestDragLoadStaticPower() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); Assert.AreEqual(-8737.81636, fldCurve.DragLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance); Assert.AreEqual(-63041.29254, fldCurve.DragLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance); @@ -106,7 +107,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void TestPT1() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); Assert.AreEqual(0.6, fldCurve.PT1(560.RPMtoRad()).Value.Value(), Tolerance); Assert.AreEqual(0.25, fldCurve.PT1(2000.RPMtoRad()).Value.Value(), Tolerance); @@ -116,7 +117,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void TestPreferredSpeed() { - var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); + var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD); fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() }; AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed); var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed); @@ -145,7 +146,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData "2100,1100,-320,0.25", }; var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData); - var fldCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldEntries)); + var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries)); fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() }; var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed); @@ -170,7 +171,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData "4000,811.7189964,-138.7132, 1.0", }; var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData); - var fldCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldEntries)); + var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries)); fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() }; AssertHelper.Exception<VectoException>(() => { var tmp = fldCurve.N95hSpeed; }); @@ -187,7 +188,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData public void Test_FileRead_WrongFileFormat_InsufficientColumns() { AssertHelper.Exception<VectoException>( - () => EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient columns.vfld"), + () => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient columns.vfld"), "ERROR while reading FullLoadCurve File: Engine FullLoadCurve Data File must consist of at least 3 columns."); } @@ -205,7 +206,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData target.Parameters.Add(new MethodCallParameter("${level}")); target.Parameters.Add(new MethodCallParameter("${message}")); SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Warn); - EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve wrong header.vfld"); + FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve wrong header.vfld"); Assert.IsTrue( LogList.Contains( "FullLoadCurve: Header Line is not valid. Expected: \'engine speed, full load torque, motoring torque\', Got: \'n, Mfull, Mdrag, PT1\'. Falling back to column index."), @@ -224,7 +225,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData [TestMethod] public void Test_FileRead_NoHeader() { - var curve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve no header.vfld"); + var curve = FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve no header.vfld"); var result = curve.FullLoadStationaryTorque(1.SI<PerSecond>()); Assert.AreNotEqual(result.Value(), 0.0); } @@ -236,7 +237,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData public void Test_FileRead_InsufficientEntries() { AssertHelper.Exception<VectoException>( - () => EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient entries.vfld"), + () => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient entries.vfld"), "ERROR while reading FullLoadCurve File: FullLoadCurve must consist of at least two lines with numeric values (below file header)"); } @@ -246,8 +247,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var engineData = new CombustionEngineData { FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { - { 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, - { 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") } + { 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") } }, IdleSpeed = 560.RPMtoRad() }; @@ -289,7 +290,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData }; var fldCurve = - EngineFullLoadCurve.Create( + FullLoadCurveReader.Create( VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s]", fldEntries))); Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs index 57eaeb48bf8c29c409289159b4d03ab132a43e01..6d817b5c0001aae8a81fefa0e64a6b8daeb8f081 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs @@ -304,7 +304,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData }; var dataEng = VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm]", engineFldString)); - var engineFld = EngineFullLoadCurve.Create(dataEng, true); + var engineFld = FullLoadCurveReader.Create(dataEng, true); var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFld, 2500.SI<NewtonMeter>()); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs index b1f96980a878cacd8159fb39efdcb28c4d2d4236..f35363407c47374493f73c8df38b800eca3f8830 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs @@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData WHTCUrban = 1, WHTCRural = 1, WHTCMotorway = 1, - FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, EngineFullLoadCurve.Create(fullLoad) } }, + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, FullLoadCurveReader.Create(fullLoad) } }, ConsumptionMap = FuelConsumptionMapReader.Create(fuelConsumption) }; data.FullLoadCurves[0].EngineData = data; @@ -224,8 +224,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var engineData = new CombustionEngineData { FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { - { 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, - { 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, }, IdleSpeed = 560.RPMtoRad() }; @@ -300,8 +300,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var engineData = new CombustionEngineData { FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { - { 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, - { 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") } + { 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") } }, IdleSpeed = 560.RPMtoRad() }; @@ -622,12 +622,22 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData public string Creator { get; set; } public string Date { get; set; } public string TechnicalReportId { get; set; } - public CertificationMethod CertificationMethod { get{return CertificationMethod.NotCertified;}} + + public CertificationMethod CertificationMethod + { + get { return CertificationMethod.NotCertified; } + } + public string CertificationNumber { get; set; } public string DigestValue { get; set; } public GearboxType Type { get; set; } public IList<ITransmissionInputData> Gears { get; set; } - ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter { get { return TorqueConverter; } } + + ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter + { + get { return TorqueConverter; } + } + public KilogramSquareMeter Inertia { get; set; } public Second TractionInterruption { get; set; } public Second MinTimeBetweenGearshift { get; set; } diff --git a/VectoCore/VectoCoreTest/Utils/MockRunData.cs b/VectoCore/VectoCoreTest/Utils/MockRunData.cs index 2da0eabb143cdb4a4c4bc9a641034888c9bd9b76..486e03dc0b972f7037ffdf330f60e07276e1efe5 100644 --- a/VectoCore/VectoCoreTest/Utils/MockRunData.cs +++ b/VectoCore/VectoCoreTest/Utils/MockRunData.cs @@ -53,7 +53,6 @@ namespace TUGraz.VectoCore.Tests.Utils Loading = 0.SI<Kilogram>(), TotalRollResistanceCoefficient = 0, DynamicTyreRadius = 1.SI<Meter>(), - }; AirdragData = new AirdragData() { CrossWindCorrectionCurve = @@ -69,18 +68,18 @@ namespace TUGraz.VectoCore.Tests.Utils FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, new EngineFullLoadCurve() { - FullLoadEntries = new List<FullLoadCurve.FullLoadCurveEntry>() { - new FullLoadCurve.FullLoadCurveEntry() { + FullLoadEntries = new List<EngineFullLoadCurve.FullLoadCurveEntry>() { + new EngineFullLoadCurve.FullLoadCurveEntry() { EngineSpeed = 600.RPMtoRad(), TorqueDrag = -100.SI<NewtonMeter>(), TorqueFullLoad = 500.SI<NewtonMeter>() }, - new FullLoadCurve.FullLoadCurveEntry() { + new EngineFullLoadCurve.FullLoadCurveEntry() { EngineSpeed = 1800.RPMtoRad(), TorqueDrag = -120.SI<NewtonMeter>(), TorqueFullLoad = 1200.SI<NewtonMeter>() }, - new FullLoadCurve.FullLoadCurveEntry() { + new EngineFullLoadCurve.FullLoadCurveEntry() { EngineSpeed = 2500.RPMtoRad(), TorqueDrag = -150.SI<NewtonMeter>(), TorqueFullLoad = 400.SI<NewtonMeter>() diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs index c640c011a754040b8720eb00a90052996dbe6209..68f6e3f6da4b45f63b434c786e1f15e807dbf734 100644 --- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs @@ -42,6 +42,7 @@ using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration; +using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Impl; @@ -91,7 +92,7 @@ namespace TUGraz.VectoCore.Tests.XML Assert.AreEqual("engine speed", fldTable.Columns[0].Caption); Assert.AreEqual("full load torque", fldTable.Columns[1].Caption); Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption); - var fldMap = EngineFullLoadCurve.Create(fldTable, true); + var fldMap = FullLoadCurveReader.Create(fldTable, true); } [TestMethod] diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs index e5a8a5338e8779d1427dd3b31691a98ab995e65a..f109dd7a551fa365ad20c514457f1ca0e5056b47 100644 --- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs @@ -37,6 +37,7 @@ using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.FileIO.XML.Engineering; +using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; @@ -94,7 +95,7 @@ namespace TUGraz.VectoCore.Tests.XML Assert.AreEqual("engine speed", fldTable.Columns[0].Caption); Assert.AreEqual("full load torque", fldTable.Columns[1].Caption); Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption); - var fldMap = EngineFullLoadCurve.Create(fldTable, true); + var fldMap = FullLoadCurveReader.Create(fldTable, true); } [TestMethod] diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs index f51bc8dcc2abcd463fe03b5c381463e9f1ef7488..230b5a3255e359b356d7b236b5c3ac7561676a54 100644 --- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs @@ -41,6 +41,7 @@ using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.FileIO.XML.Engineering; +using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Impl; @@ -95,7 +96,7 @@ namespace TUGraz.VectoCore.Tests.XML Assert.AreEqual("engine speed", fldTable.Columns[0].Caption); Assert.AreEqual("full load torque", fldTable.Columns[1].Caption); Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption); - var fldMap = EngineFullLoadCurve.Create(fldTable, true); + var fldMap = FullLoadCurveReader.Create(fldTable, true); } [TestMethod]