From 36bebdb8abbffad05ea295bf77e09dfcea4bdaa9 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 28 Jul 2016 14:15:41 +0200 Subject: [PATCH] change aux input structure --- .../InputData/DeclarationInputData.cs | 22 +--- .../InputData/EngineeringInputData.cs | 10 +- .../VectoCommon/Models}/AuxiliaryType.cs | 44 +------ VectoCommon/VectoCommon/VectoCommon.csproj | 1 + .../InputData/FileIO/JSON/JSONInputData.cs | 17 +-- .../VectoCore/InputData/Impl/InputData.cs | 10 +- .../ComponentData/AuxiliaryDataReader.cs | 105 +++++++++++++++++ .../DeclarationDataAdapter.cs | 14 +-- .../EngineeringDataAdapter.cs | 14 +-- .../Models/Simulation/Data/VectoRunData.cs | 10 +- .../SimulationComponent/Data/AuxiliaryData.cs | 110 ++---------------- VectoCore/VectoCore/VectoCore.csproj | 3 +- VectoCore/VectoCoreTest/FileIO/JsonTest.cs | 40 +++---- .../Models/Simulation/AuxTests.cs | 9 +- .../AuxiliaryTypeHelperTest.cs | 6 +- 15 files changed, 192 insertions(+), 223 deletions(-) rename {VectoCore/VectoCore/Models/SimulationComponent/Data => VectoCommon/VectoCommon/Models}/AuxiliaryType.cs (50%) create mode 100644 VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 18411c284f..ad9bdc4e22 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -83,7 +83,7 @@ namespace TUGraz.VectoCommon.InputData /// cf. VECTO Input Parameters.xlsx /// </summary> Kilogram CurbWeightChassis { get; } - + /// <summary> /// P041 Max. vehicle weight /// cf. VECTO Input Parameters.xlsx @@ -375,30 +375,18 @@ namespace TUGraz.VectoCommon.InputData public interface IAuxiliaryDeclarationInputData { - bool SavedInDeclarationMode { get; } - - /// <summary> - /// P006 Aux-ID - /// cf. VECTO Input Parameters.xlsx - /// </summary> - string ID { get; } - /// <summary> /// P005 Aux-Type /// cf. VECTO Input Parameters.xlsx /// </summary> - string Type { get; } + AuxiliaryType Type { get; } /// <summary> /// P118 Aux-Technology /// cf. VECTO Input Parameters.xlsx /// </summary> - string Technology { get; } - - /// <summary> - /// P143 Aux-Techlist - /// cf. VECTO Input Parameters.xlsx - /// </summary> - IList<string> TechList { get; } + IList<string> Technology { get; } } + + } \ No newline at end of file diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs index 38d30a59b8..3db09e9cf3 100644 --- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs +++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs @@ -214,7 +214,7 @@ namespace TUGraz.VectoCommon.InputData KilogramSquareMeter Inertia { get; } } - public interface IAuxiliariesEngineeringInputData : IAuxiliariesDeclarationInputData + public interface IAuxiliariesEngineeringInputData { new IList<IAuxiliaryEngineeringInputData> Auxiliaries { get; } @@ -312,8 +312,14 @@ namespace TUGraz.VectoCommon.InputData DataTable CoastingDecisionFactorVelocityDropLookup { get; } } - public interface IAuxiliaryEngineeringInputData : IAuxiliaryDeclarationInputData + public interface IAuxiliaryEngineeringInputData { + /// <summary> + /// P006 Aux-ID + /// cf. VECTO Input Parameters.xlsx + /// </summary> + string ID { get; } + /// <summary> /// either mapping or constant /// </summary> diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryType.cs b/VectoCommon/VectoCommon/Models/AuxiliaryType.cs similarity index 50% rename from VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryType.cs rename to VectoCommon/VectoCommon/Models/AuxiliaryType.cs index 301861343d..4b0e572845 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryType.cs +++ b/VectoCommon/VectoCommon/Models/AuxiliaryType.cs @@ -30,55 +30,15 @@ */ using System; -using TUGraz.VectoCore.Configuration; -namespace TUGraz.VectoCore.Models.SimulationComponent.Data +namespace TUGraz.VectoCommon.Models { public enum AuxiliaryType { Fan, SteeringPump, - HeatingVentilationAirCondition, + HVAC, PneumaticSystem, ElectricSystem } - - public static class AuxiliaryTypeHelper - { - public static AuxiliaryType Parse(string s) - { - switch (s) { - case Constants.Auxiliaries.Names.Fan: - return AuxiliaryType.Fan; - case Constants.Auxiliaries.Names.SteeringPump: - return AuxiliaryType.SteeringPump; - case Constants.Auxiliaries.Names.HeatingVentilationAirCondition: - return AuxiliaryType.HeatingVentilationAirCondition; - case Constants.Auxiliaries.Names.ElectricSystem: - return AuxiliaryType.ElectricSystem; - case Constants.Auxiliaries.Names.PneumaticSystem: - return AuxiliaryType.PneumaticSystem; - default: - throw new ArgumentOutOfRangeException("s", s, "Could not parse auxiliary type string."); - } - } - - public static string ToString(AuxiliaryType t) - { - switch (t) { - case AuxiliaryType.Fan: - return Constants.Auxiliaries.Names.Fan; - case AuxiliaryType.SteeringPump: - return Constants.Auxiliaries.Names.SteeringPump; - case AuxiliaryType.HeatingVentilationAirCondition: - return Constants.Auxiliaries.Names.HeatingVentilationAirCondition; - case AuxiliaryType.PneumaticSystem: - return Constants.Auxiliaries.Names.PneumaticSystem; - case AuxiliaryType.ElectricSystem: - return Constants.Auxiliaries.Names.ElectricSystem; - default: - throw new ArgumentOutOfRangeException(); - } - } - } } \ No newline at end of file diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj index 0a9080e74c..1132531c6f 100644 --- a/VectoCommon/VectoCommon/VectoCommon.csproj +++ b/VectoCommon/VectoCommon/VectoCommon.csproj @@ -44,6 +44,7 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> + <Compile Include="Models\AuxiliaryType.cs" /> <Compile Include="Exceptions\VectoExceptions.cs" /> <Compile Include="Exceptions\VectoSimulationException.cs" /> <Compile Include="InputData\DeclarationInputData.cs" /> diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs index f3e79e02a1..c382a404ed 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs @@ -107,7 +107,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON /// Fileformat: .vecto /// </summary> public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider, - IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData + IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData, + IAuxiliariesDeclarationInputData { protected IGearboxEngineeringInputData Gearbox; protected IAxleGearInputData AxleGear; @@ -262,7 +263,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData() { - return AuxiliaryInputData(); + return this; } public virtual IRetarderInputData RetarderInputData @@ -450,7 +451,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON #endregion - public virtual IList<IAuxiliaryEngineeringInputData> Auxiliaries + IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries { get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); } } @@ -466,12 +467,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) { var auxData = new AuxiliaryDataInputData { ID = aux.GetEx<string>("ID"), - Type = aux.GetEx<string>("Type"), - Technology = aux.GetEx<string>("Technology"), + Type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")), + Technology = new List<string>() { aux.GetEx<string>("Technology") }, }; - if (aux["TechList"] != null) { - auxData.TechList = aux["TechList"].Select(x => x.ToString()).ToList(); // .Select(x => x.ToString).ToArray(); - } + //if (aux["TechList"] != null) { + // auxData.TechList = aux["TechList"].Select(x => x.ToString()).ToList(); // .Select(x => x.ToString).ToArray(); + //} var auxFile = aux["Path"]; retVal.Add(auxData); diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs index a142e60497..7f065d5a4b 100644 --- a/VectoCore/VectoCore/InputData/Impl/InputData.cs +++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs @@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.InputData.Impl public KilogramSquareMeter Inertia { get; internal set; } } - public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData + public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData, IAuxiliaryDeclarationInputData { public AuxiliaryDataInputData() { @@ -146,15 +146,11 @@ namespace TUGraz.VectoCore.InputData.Impl public AuxiliaryDemandType AuxiliaryType { get; internal set; } - public bool SavedInDeclarationMode { get; internal set; } - public string ID { get; internal set; } - public string Type { get; internal set; } - - public string Technology { get; internal set; } + public AuxiliaryType Type { get; internal set; } - public IList<string> TechList { get; internal set; } + public IList<string> Technology { get; internal set; } public double TransmissionRatio { get; internal set; } diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs new file mode 100644 index 0000000000..83aef8d8b7 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs @@ -0,0 +1,105 @@ +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.InputData.Reader.ComponentData +{ + public sealed class AuxiliaryDataReader + { + public static AuxiliaryData Create(IAuxiliaryEngineeringInputData data) + { + var map = ReadAuxMap(data.ID, data.DemandMap); + return new AuxiliaryData(data.TransmissionRatio, data.EfficiencyToEngine, data.EfficiencyToSupply, map); + } + + public static AuxiliaryData ReadFromFile(string fileName, string id) + { + try { + var stream = new StreamReader(fileName); + stream.ReadLine(); // skip header "Transmission ration to engine rpm [-]" + var transmissionRatio = stream.ReadLine().IndulgentParse(); + stream.ReadLine(); // skip header "Efficiency to engine [-]" + var efficiencyToEngine = stream.ReadLine().IndulgentParse(); + stream.ReadLine(); // skip header "Efficiency auxiliary to supply [-]" + var efficiencyToSupply = stream.ReadLine().IndulgentParse(); + + var m = new MemoryStream(Encoding.UTF8.GetBytes(stream.ReadToEnd())); + var table = VectoCSVFile.ReadStream(m); + var map = ReadAuxMap(id, table); + + return new AuxiliaryData(transmissionRatio, efficiencyToEngine, efficiencyToSupply, map); + ; + } catch (FileNotFoundException e) { + throw new VectoException("Auxiliary file not found: " + fileName, e); + } + } + + private static DelaunayMap ReadAuxMap(string id, DataTable table) + { + var map = new DelaunayMap(id); + if (HeaderIsValid(table.Columns)) { + FillFromColumnNames(table, map); + } else { + FillFromColumnIndizes(table, map); + } + + map.Triangulate(); + return map; + } + + + private static void FillFromColumnIndizes(DataTable table, DelaunayMap map) + { + var data = table.Rows.Cast<DataRow>().Select(row => new { + AuxiliarySpeed = row.ParseDouble(0).RPMtoRad(), + MechanicalPower = row.ParseDouble(1).SI().Kilo.Watt.Cast<Watt>(), + SupplyPower = row.ParseDouble(2).SI().Kilo.Watt.Cast<Watt>() + }); + foreach (var d in data) { + map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value()); + } + } + + private static void FillFromColumnNames(DataTable table, DelaunayMap map) + { + var data = table.Rows.Cast<DataRow>().Select(row => new { + AuxiliarySpeed = DataTableExtensionMethods.ParseDouble(row, (string)Fields.AuxSpeed).RPMtoRad(), + MechanicalPower = DataTableExtensionMethods.ParseDouble(row, (string)Fields.MechPower).SI().Kilo.Watt.Cast<Watt>(), + SupplyPower = DataTableExtensionMethods.ParseDouble(row, (string)Fields.SupplyPower).SI().Kilo.Watt.Cast<Watt>() + }); + foreach (var d in data) { + map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value()); + } + } + + private static bool HeaderIsValid(DataColumnCollection columns) + { + return columns.Contains(Fields.AuxSpeed) && columns.Contains(Fields.MechPower) && + columns.Contains(Fields.SupplyPower); + } + + public static class Fields + { + /// <summary> + /// [1/min] + /// </summary> + public const string AuxSpeed = "Auxiliary speed"; + + /// <summary> + /// [kW] + /// </summary> + public const string MechPower = "Mechanical power"; + + /// <summary> + /// [kW] + /// </summary> + public const string SupplyPower = "Supply power"; + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 77cc69ecfa..a97cef888c 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -240,7 +240,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) { - var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => AuxiliaryTypeHelper.Parse(a.Type) == auxType); + var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType); if (auxData == null) { throw new VectoException("Auxiliary {0} not found.", auxType); } @@ -250,14 +250,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; switch (auxType) { case AuxiliaryType.Fan: - aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology); + aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.First()); aux.ID = Constants.Auxiliaries.IDs.Fan; break; case AuxiliaryType.SteeringPump: - aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology); + aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology.First()); aux.ID = Constants.Auxiliaries.IDs.SteeringPump; break; - case AuxiliaryType.HeatingVentilationAirCondition: + case AuxiliaryType.HVAC: aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hvdClass); aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition; break; @@ -266,10 +266,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem; break; case AuxiliaryType.ElectricSystem: - aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, - auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray()); + //aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, + // auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray()); aux.ID = Constants.Auxiliaries.IDs.ElectricSystem; - aux.TechList = auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray(); + //aux.TechList = auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray(); break; default: continue; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 223e245d2b..70c767dea0 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -36,6 +36,7 @@ using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -149,7 +150,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } else { throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1); } - + var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque); var shiftPolygon = gear.ShiftPolygon != null ? ShiftPolygonReader.Create(gear.ShiftPolygon) @@ -172,9 +173,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData) { - if (auxInputData.SavedInDeclarationMode) { - WarnEngineeringMode("AuxData"); - } return auxInputData.Auxiliaries.Select(a => { switch (a.AuxiliaryType) { case AuxiliaryDemandType.Mapping: @@ -190,18 +188,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter private static VectoRunData.AuxData CreateMappingAuxiliary(IAuxiliaryEngineeringInputData a) { if (a.DemandMap == null) { - throw new VectoSimulationException("Demand Map for auxiliary {0} {1} required", a.ID, a.Technology); + throw new VectoSimulationException("Demand Map for auxiliary {0} required", a.ID); } if (a.DemandMap.Columns.Count != 3 || a.DemandMap.Rows.Count < 4) { throw new VectoSimulationException( - "Demand Map for auxiliary {0} {1} has to contain exactly 3 columns and at least 4 rows", a.ID, a.Technology); + "Demand Map for auxiliary {0} has to contain exactly 3 columns and at least 4 rows", a.ID); } return new VectoRunData.AuxData { ID = a.ID, - Technology = a.Technology, - TechList = a.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray(), DemandType = AuxiliaryDemandType.Mapping, - Data = new AuxiliaryData(a, a.ID) //AuxiliaryData.Create(a.DemandMap) + Data = AuxiliaryDataReader.Create(a) }; } diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index cfcd4fc25b..b1a536787d 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -29,6 +29,7 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using TUGraz.VectoCommon.Exceptions; @@ -102,7 +103,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [Required] public AuxiliaryType Type; - public string Technology; + public IList<string> Technology; public string[] TechList; @@ -143,6 +144,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data string.Format("Interpolation of Gear-{0}-LossMap failed with torque={1} and angularSpeed={2}", gear.Key, inTorque, angularVelocity.ConvertTo().Rounds.Per.Minute)); } + var velocity = angularVelocity / gear.Value.Ratio / axleGearData.AxleGear.Ratio * + runData.VehicleData.DynamicTyreRadius; if (axleGearData != null) { var axleAngularVelocity = angularVelocity / gear.Value.Ratio; @@ -151,8 +154,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data } catch (VectoException) { return new ValidationResult( - string.Format("Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1}", axleTorque, - axleAngularVelocity.ConvertTo().Rounds.Per.Minute)); + string.Format( + "Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1} (gear={2}, velocity={3})", + axleTorque, axleAngularVelocity.ConvertTo().Rounds.Per.Minute, gear.Key, velocity)); } } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs index fdf0714366..4056d61288 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs @@ -40,6 +40,7 @@ using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.SimulationComponent.Data @@ -61,109 +62,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut) { var value = _map.Interpolate(nAuxiliary.Value(), powerAuxOut.Value()); - if (value.HasValue) + if (value.HasValue) { return value.Value.SI<Watt>(); + } throw new VectoException("AuxiliaryData: Interpolation failed. nAux: {0}, powerOut:{1}", nAuxiliary.AsRPM, powerAuxOut); } - public static AuxiliaryData ReadFromFile(string fileName, string id) - { - var auxData = new AuxiliaryData(id); - - try { - var stream = new StreamReader(fileName); - stream.ReadLine(); // skip header "Transmission ration to engine rpm [-]" - auxData.TransmissionRatio = stream.ReadLine().IndulgentParse(); - stream.ReadLine(); // skip header "Efficiency to engine [-]" - auxData.EfficiencyToEngine = stream.ReadLine().IndulgentParse(); - stream.ReadLine(); // skip header "Efficiency auxiliary to supply [-]" - auxData.EfficiencyToSupply = stream.ReadLine().IndulgentParse(); - - var m = new MemoryStream(Encoding.UTF8.GetBytes(stream.ReadToEnd())); - var table = VectoCSVFile.ReadStream(m); - - if (HeaderIsValid(table.Columns)) { - FillFromColumnNames(table, auxData._map); - } else { - FillFromColumnIndizes(table, auxData._map); - } - - auxData._map.Triangulate(); - - return auxData; - } catch (FileNotFoundException e) { - throw new VectoException("Auxiliary file not found: " + fileName, e); - } - } - - private static void FillFromColumnIndizes(DataTable table, DelaunayMap map) - { - var data = table.Rows.Cast<DataRow>().Select(row => new { - AuxiliarySpeed = row.ParseDouble(0).RPMtoRad(), - MechanicalPower = row.ParseDouble(1).SI().Kilo.Watt.Cast<Watt>(), - SupplyPower = row.ParseDouble(2).SI().Kilo.Watt.Cast<Watt>() - }); - foreach (var d in data) { - map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value()); - } - } - - private static void FillFromColumnNames(DataTable table, DelaunayMap map) - { - var data = table.Rows.Cast<DataRow>().Select(row => new { - AuxiliarySpeed = row.ParseDouble(Fields.AuxSpeed).RPMtoRad(), - MechanicalPower = row.ParseDouble(Fields.MechPower).SI().Kilo.Watt.Cast<Watt>(), - SupplyPower = row.ParseDouble(Fields.SupplyPower).SI().Kilo.Watt.Cast<Watt>() - }); - foreach (var d in data) { - map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value()); - } - } - - internal AuxiliaryData(string id) - { - _map = new DelaunayMap(id); - } - - internal AuxiliaryData(IAuxiliaryEngineeringInputData data, string id) - { - _map = new DelaunayMap("AuxiliaryData " + id); - TransmissionRatio = data.TransmissionRatio; - EfficiencyToEngine = data.EfficiencyToEngine; - EfficiencyToSupply = data.EfficiencyToSupply; - if (HeaderIsValid(data.DemandMap.Columns)) { - FillFromColumnNames(data.DemandMap, _map); - } else { - FillFromColumnIndizes(data.DemandMap, _map); - } - - _map.Triangulate(); - } - - private static bool HeaderIsValid(DataColumnCollection columns) - { - return columns.Contains(Fields.AuxSpeed) && columns.Contains(Fields.MechPower) && - columns.Contains(Fields.SupplyPower); - } - - private static class Fields + internal AuxiliaryData(double transmissionRatio, double efficiencyToEngine, double efficiencyToSupply, DelaunayMap map) { - /// <summary> - /// [1/min] - /// </summary> - public const string AuxSpeed = "Auxiliary speed"; - - /// <summary> - /// [kW] - /// </summary> - public const string MechPower = "Mechanical power"; - - /// <summary> - /// [kW] - /// </summary> - public const string SupplyPower = "Supply power"; + _map = map; + TransmissionRatio = transmissionRatio; + EfficiencyToEngine = efficiencyToEngine; + EfficiencyToSupply = efficiencyToSupply; } /// <summary> @@ -180,17 +92,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data var results = new List<ValidationResult>(); foreach (var entry in data._map.Points) { - context.DisplayName = Fields.AuxSpeed; + context.DisplayName = AuxiliaryDataReader.Fields.AuxSpeed; if (!Validator.TryValidateValue(entry.X, context, results, xValidationRules)) { return new ValidationResult(string.Concat(results)); } - context.DisplayName = Fields.SupplyPower; + context.DisplayName = AuxiliaryDataReader.Fields.SupplyPower; if (!Validator.TryValidateValue(entry.Y, context, results, yValidationRules)) { return new ValidationResult(string.Concat(results)); } - context.DisplayName = Fields.MechPower; + context.DisplayName = AuxiliaryDataReader.Fields.MechPower; if (!Validator.TryValidateValue(entry.Z, context, results, zValidationRules)) { return new ValidationResult(string.Concat(results)); } diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 6280561b3c..2bae0791eb 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -136,8 +136,10 @@ <Compile Include="InputData\Reader\ComponentData\TransmissionLossMapReader.cs" /> <Compile Include="InputData\Reader\ComponentData\RetarderLossMapReader.cs" /> <Compile Include="InputData\Reader\ComponentData\TorqueConverterDataReader.cs" /> + <Compile Include="InputData\Reader\ComponentData\AuxiliaryDataReader.cs" /> <Compile Include="Models\SimulationComponent\Data\Engine\FuelConsumptionMapReader.cs" /> <Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" /> + <Compile Include="Utils\AuxiliaryTypeHelper.cs" /> <Compile Include="Utils\ProviderExtensions.cs" /> <Compile Include="Models\Declaration\AirDrag.cs" /> <Compile Include="Models\Declaration\Fan.cs" /> @@ -197,7 +199,6 @@ <Compile Include="Models\Simulation\DataBus\IClutchInfo.cs" /> <Compile Include="Models\Simulation\DataBus\IDriverInfo.cs" /> <Compile Include="Models\Simulation\DataBus\IWheelsInfo.cs" /> - <Compile Include="Models\SimulationComponent\Data\AuxiliaryType.cs" /> <Compile Include="Models\SimulationComponent\Data\FullLoadCurve.cs" /> <Compile Include="Models\Simulation\DataBus\IMileageCounter.cs" /> <Compile Include="Utils\DebugData.cs" /> diff --git a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs index 69f9c6ad9a..e086e41bc5 100644 --- a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs @@ -95,9 +95,7 @@ namespace TUGraz.VectoCore.Tests.FileIO ((JObject)json["Body"]).Property("Cycles").Remove(); AssertHelper.Exception<InvalidFileFormatException>( - () => { - var tmp = new JSONInputDataV2(json, TestJobFile).Cycles; - }, "Key Cycles not found"); + () => { var tmp = new JSONInputDataV2(json, TestJobFile).Cycles; }, "Key Cycles not found"); } [TestMethod] @@ -107,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.FileIO ((JObject)json["Body"]).Property("Aux").Remove(); // MK,2016-01-20: Changed for PWheel: aux entry may be missing, and that is ok. - var tmp = new JSONInputDataV2(json, TestJobFile).Auxiliaries; + var tmp = new JSONInputDataV2(json, TestJobFile).AuxiliaryInputData().Auxiliaries; Assert.IsTrue(tmp.Count == 0); } @@ -154,26 +152,24 @@ namespace TUGraz.VectoCore.Tests.FileIO ((JObject)json["Body"]).Property("OverSpeedEcoRoll").Remove(); AssertHelper.Exception<VectoException>( - () => { - var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll; - }, + () => { var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll; }, "Key OverSpeedEcoRoll not found"); } - [TestMethod] - public void TestReadingElectricTechlist() - { - var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile))); - ((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights"); - - var job = new JSONInputDataV2(json, TestJobFile); - foreach (var aux in job.Auxiliaries) { - if (aux.ID == "ES") { - Assert.AreEqual(1, aux.TechList.Count); - Assert.AreEqual("LED lights", aux.TechList.First()); - } - } - } + //[TestMethod] + //public void TestReadingElectricTechlist() + //{ + // var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile))); + // ((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights"); + + // var job = new JSONInputDataV2(json, TestJobFile); + // foreach (var aux in job.Auxiliaries) { + // if (aux.ID == "ES") { + // Assert.AreEqual(1, aux.TechList.Count); + // Assert.AreEqual("LED lights", aux.TechList.First()); + // } + // } + //} [TestMethod] public void JSON_Read_AngleGear() @@ -184,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual(AngularGearType.SeparateAngularGear, angleGear["Type"].Value<string>().ParseEnum<AngularGearType>()); Assert.AreEqual(3.5, angleGear["Ratio"].Value<double>()); - Assert.AreEqual("AngularGear.vtlm", angleGear["LossMap"].Value<string>()); + Assert.AreEqual("AngleGear.vtlm", angleGear["LossMap"].Value<string>()); } } diff --git a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs index 70d7c3a54d..45c5cd4824 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs @@ -39,6 +39,7 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.Reader; +using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.OutputData; @@ -104,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var testColumns = new[] { "P_aux_FAN", "P_aux_STP", "P_aux_AC", "P_aux_ES", "P_aux_PS", "P_aux" }; ResultFileHelper.TestModFile(@"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod", - @"AuxWriteModFileSumFile.vmod", testColumns, testVelocity:false); + @"AuxWriteModFileSumFile.vmod", testColumns, testVelocity: false); ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vsum", @"AuxWriteModFileSumFile.vsum"); } @@ -187,7 +188,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var aux = new EngineAuxiliary(container); - var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT"); + var auxData = AuxiliaryDataReader.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT"); // ratio = 4.078 // efficiency_engine = 0.96 // efficiency_supply = 0.98 @@ -246,7 +247,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var aux = new EngineAuxiliary(container); - var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT"); + var auxData = AuxiliaryDataReader.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT"); // ratio = 4.078 // efficiency_engine = 0.96 // efficiency_supply = 0.98 @@ -297,7 +298,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation [TestMethod] public void AuxFileMissing() { - AssertHelper.Exception<VectoException>(() => AuxiliaryData.ReadFromFile(@"NOT_EXISTING_AUX_FILE.vaux", "N.A."), + AssertHelper.Exception<VectoException>(() => AuxiliaryDataReader.ReadFromFile(@"NOT_EXISTING_AUX_FILE.vaux", "N.A."), "Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux"); } diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs index 39c9c69acd..868c10ab9c 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs @@ -31,9 +31,11 @@ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; +using TUGraz.VectoCommon.Models; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { @@ -46,7 +48,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData Assert.AreEqual(AuxiliaryType.Fan, AuxiliaryTypeHelper.Parse("Fan")); Assert.AreEqual(AuxiliaryType.SteeringPump, AuxiliaryTypeHelper.Parse("Steering pump")); Assert.AreEqual(AuxiliaryType.ElectricSystem, AuxiliaryTypeHelper.Parse("Electric System")); - Assert.AreEqual(AuxiliaryType.HeatingVentilationAirCondition, AuxiliaryTypeHelper.Parse("HVAC")); + Assert.AreEqual(AuxiliaryType.HVAC, AuxiliaryTypeHelper.Parse("HVAC")); Assert.AreEqual(AuxiliaryType.PneumaticSystem, AuxiliaryTypeHelper.Parse("Pneumatic System")); AssertHelper.Exception<ArgumentOutOfRangeException>(() => { AuxiliaryTypeHelper.Parse("Foo Bar Blupp"); }); } @@ -57,7 +59,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData Assert.AreEqual(Constants.Auxiliaries.Names.Fan, AuxiliaryTypeHelper.ToString(AuxiliaryType.Fan)); Assert.AreEqual(Constants.Auxiliaries.Names.SteeringPump, AuxiliaryTypeHelper.ToString(AuxiliaryType.SteeringPump)); Assert.AreEqual(Constants.Auxiliaries.Names.HeatingVentilationAirCondition, - AuxiliaryTypeHelper.ToString(AuxiliaryType.HeatingVentilationAirCondition)); + AuxiliaryTypeHelper.ToString(AuxiliaryType.HVAC)); Assert.AreEqual(Constants.Auxiliaries.Names.PneumaticSystem, AuxiliaryTypeHelper.ToString(AuxiliaryType.PneumaticSystem)); Assert.AreEqual(Constants.Auxiliaries.Names.ElectricSystem, -- GitLab