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

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

change aux input structure

parent eabfa096
No related branches found
No related tags found
No related merge requests found
Showing
with 192 additions and 223 deletions
...@@ -83,7 +83,7 @@ namespace TUGraz.VectoCommon.InputData ...@@ -83,7 +83,7 @@ namespace TUGraz.VectoCommon.InputData
/// cf. VECTO Input Parameters.xlsx /// cf. VECTO Input Parameters.xlsx
/// </summary> /// </summary>
Kilogram CurbWeightChassis { get; } Kilogram CurbWeightChassis { get; }
/// <summary> /// <summary>
/// P041 Max. vehicle weight /// P041 Max. vehicle weight
/// cf. VECTO Input Parameters.xlsx /// cf. VECTO Input Parameters.xlsx
...@@ -375,30 +375,18 @@ namespace TUGraz.VectoCommon.InputData ...@@ -375,30 +375,18 @@ namespace TUGraz.VectoCommon.InputData
public interface IAuxiliaryDeclarationInputData public interface IAuxiliaryDeclarationInputData
{ {
bool SavedInDeclarationMode { get; }
/// <summary>
/// P006 Aux-ID
/// cf. VECTO Input Parameters.xlsx
/// </summary>
string ID { get; }
/// <summary> /// <summary>
/// P005 Aux-Type /// P005 Aux-Type
/// cf. VECTO Input Parameters.xlsx /// cf. VECTO Input Parameters.xlsx
/// </summary> /// </summary>
string Type { get; } AuxiliaryType Type { get; }
/// <summary> /// <summary>
/// P118 Aux-Technology /// P118 Aux-Technology
/// cf. VECTO Input Parameters.xlsx /// cf. VECTO Input Parameters.xlsx
/// </summary> /// </summary>
string Technology { get; } IList<string> Technology { get; }
/// <summary>
/// P143 Aux-Techlist
/// cf. VECTO Input Parameters.xlsx
/// </summary>
IList<string> TechList { get; }
} }
} }
\ No newline at end of file
...@@ -214,7 +214,7 @@ namespace TUGraz.VectoCommon.InputData ...@@ -214,7 +214,7 @@ namespace TUGraz.VectoCommon.InputData
KilogramSquareMeter Inertia { get; } KilogramSquareMeter Inertia { get; }
} }
public interface IAuxiliariesEngineeringInputData : IAuxiliariesDeclarationInputData public interface IAuxiliariesEngineeringInputData
{ {
new IList<IAuxiliaryEngineeringInputData> Auxiliaries { get; } new IList<IAuxiliaryEngineeringInputData> Auxiliaries { get; }
...@@ -312,8 +312,14 @@ namespace TUGraz.VectoCommon.InputData ...@@ -312,8 +312,14 @@ namespace TUGraz.VectoCommon.InputData
DataTable CoastingDecisionFactorVelocityDropLookup { get; } DataTable CoastingDecisionFactorVelocityDropLookup { get; }
} }
public interface IAuxiliaryEngineeringInputData : IAuxiliaryDeclarationInputData public interface IAuxiliaryEngineeringInputData
{ {
/// <summary>
/// P006 Aux-ID
/// cf. VECTO Input Parameters.xlsx
/// </summary>
string ID { get; }
/// <summary> /// <summary>
/// either mapping or constant /// either mapping or constant
/// </summary> /// </summary>
......
...@@ -30,55 +30,15 @@ ...@@ -30,55 +30,15 @@
*/ */
using System; using System;
using TUGraz.VectoCore.Configuration;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data namespace TUGraz.VectoCommon.Models
{ {
public enum AuxiliaryType public enum AuxiliaryType
{ {
Fan, Fan,
SteeringPump, SteeringPump,
HeatingVentilationAirCondition, HVAC,
PneumaticSystem, PneumaticSystem,
ElectricSystem 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
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Models\AuxiliaryType.cs" />
<Compile Include="Exceptions\VectoExceptions.cs" /> <Compile Include="Exceptions\VectoExceptions.cs" />
<Compile Include="Exceptions\VectoSimulationException.cs" /> <Compile Include="Exceptions\VectoSimulationException.cs" />
<Compile Include="InputData\DeclarationInputData.cs" /> <Compile Include="InputData\DeclarationInputData.cs" />
......
...@@ -107,7 +107,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON ...@@ -107,7 +107,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
/// Fileformat: .vecto /// Fileformat: .vecto
/// </summary> /// </summary>
public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider, public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider,
IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData,
IAuxiliariesDeclarationInputData
{ {
protected IGearboxEngineeringInputData Gearbox; protected IGearboxEngineeringInputData Gearbox;
protected IAxleGearInputData AxleGear; protected IAxleGearInputData AxleGear;
...@@ -262,7 +263,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON ...@@ -262,7 +263,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData() IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData()
{ {
return AuxiliaryInputData(); return this;
} }
public virtual IRetarderInputData RetarderInputData public virtual IRetarderInputData RetarderInputData
...@@ -450,7 +451,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON ...@@ -450,7 +451,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
#endregion #endregion
public virtual IList<IAuxiliaryEngineeringInputData> Auxiliaries IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries
{ {
get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); } get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); }
} }
...@@ -466,12 +467,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON ...@@ -466,12 +467,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) { foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) {
var auxData = new AuxiliaryDataInputData { var auxData = new AuxiliaryDataInputData {
ID = aux.GetEx<string>("ID"), ID = aux.GetEx<string>("ID"),
Type = aux.GetEx<string>("Type"), Type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")),
Technology = aux.GetEx<string>("Technology"), Technology = new List<string>() { aux.GetEx<string>("Technology") },
}; };
if (aux["TechList"] != null) { //if (aux["TechList"] != null) {
auxData.TechList = aux["TechList"].Select(x => x.ToString()).ToList(); // .Select(x => x.ToString).ToArray(); // auxData.TechList = aux["TechList"].Select(x => x.ToString()).ToList(); // .Select(x => x.ToString).ToArray();
} //}
var auxFile = aux["Path"]; var auxFile = aux["Path"];
retVal.Add(auxData); retVal.Add(auxData);
......
...@@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.InputData.Impl ...@@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.InputData.Impl
public KilogramSquareMeter Inertia { get; internal set; } public KilogramSquareMeter Inertia { get; internal set; }
} }
public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData, IAuxiliaryDeclarationInputData
{ {
public AuxiliaryDataInputData() public AuxiliaryDataInputData()
{ {
...@@ -146,15 +146,11 @@ namespace TUGraz.VectoCore.InputData.Impl ...@@ -146,15 +146,11 @@ namespace TUGraz.VectoCore.InputData.Impl
public AuxiliaryDemandType AuxiliaryType { get; internal set; } public AuxiliaryDemandType AuxiliaryType { get; internal set; }
public bool SavedInDeclarationMode { get; internal set; }
public string ID { get; internal set; } public string ID { get; internal set; }
public string Type { get; internal set; } public AuxiliaryType Type { get; internal set; }
public string Technology { get; internal set; }
public IList<string> TechList { get; internal set; } public IList<string> Technology { get; internal set; }
public double TransmissionRatio { get; internal set; } public double TransmissionRatio { get; internal set; }
......
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
...@@ -240,7 +240,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -240,7 +240,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
} }
foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) { 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) { if (auxData == null) {
throw new VectoException("Auxiliary {0} not found.", auxType); throw new VectoException("Auxiliary {0} not found.", auxType);
} }
...@@ -250,14 +250,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -250,14 +250,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
}; };
switch (auxType) { switch (auxType) {
case AuxiliaryType.Fan: 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; aux.ID = Constants.Auxiliaries.IDs.Fan;
break; break;
case AuxiliaryType.SteeringPump: 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; aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
break; break;
case AuxiliaryType.HeatingVentilationAirCondition: case AuxiliaryType.HVAC:
aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hvdClass); aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hvdClass);
aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition; aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
break; break;
...@@ -266,10 +266,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -266,10 +266,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem; aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem;
break; break;
case AuxiliaryType.ElectricSystem: case AuxiliaryType.ElectricSystem:
aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, //aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission,
auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray()); // auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray());
aux.ID = Constants.Auxiliaries.IDs.ElectricSystem; 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; break;
default: default:
continue; continue;
......
...@@ -36,6 +36,7 @@ using TUGraz.VectoCommon.Exceptions; ...@@ -36,6 +36,7 @@ using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.Reader.ComponentData;
using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data;
...@@ -149,7 +150,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -149,7 +150,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
} else { } else {
throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1); throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1);
} }
var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque); var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque);
var shiftPolygon = gear.ShiftPolygon != null var shiftPolygon = gear.ShiftPolygon != null
? ShiftPolygonReader.Create(gear.ShiftPolygon) ? ShiftPolygonReader.Create(gear.ShiftPolygon)
...@@ -172,9 +173,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -172,9 +173,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData) public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData)
{ {
if (auxInputData.SavedInDeclarationMode) {
WarnEngineeringMode("AuxData");
}
return auxInputData.Auxiliaries.Select(a => { return auxInputData.Auxiliaries.Select(a => {
switch (a.AuxiliaryType) { switch (a.AuxiliaryType) {
case AuxiliaryDemandType.Mapping: case AuxiliaryDemandType.Mapping:
...@@ -190,18 +188,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -190,18 +188,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
private static VectoRunData.AuxData CreateMappingAuxiliary(IAuxiliaryEngineeringInputData a) private static VectoRunData.AuxData CreateMappingAuxiliary(IAuxiliaryEngineeringInputData a)
{ {
if (a.DemandMap == null) { 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) { if (a.DemandMap.Columns.Count != 3 || a.DemandMap.Rows.Count < 4) {
throw new VectoSimulationException( 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 { return new VectoRunData.AuxData {
ID = a.ID, ID = a.ID,
Technology = a.Technology,
TechList = a.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray(),
DemandType = AuxiliaryDemandType.Mapping, DemandType = AuxiliaryDemandType.Mapping,
Data = new AuxiliaryData(a, a.ID) //AuxiliaryData.Create(a.DemandMap) Data = AuxiliaryDataReader.Create(a)
}; };
} }
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
* Martin Rexeis, rexeis@ivt.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.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
...@@ -102,7 +103,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -102,7 +103,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
[Required] public AuxiliaryType Type; [Required] public AuxiliaryType Type;
public string Technology; public IList<string> Technology;
public string[] TechList; public string[] TechList;
...@@ -143,6 +144,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -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, string.Format("Interpolation of Gear-{0}-LossMap failed with torque={1} and angularSpeed={2}", gear.Key,
inTorque, angularVelocity.ConvertTo().Rounds.Per.Minute)); inTorque, angularVelocity.ConvertTo().Rounds.Per.Minute));
} }
var velocity = angularVelocity / gear.Value.Ratio / axleGearData.AxleGear.Ratio *
runData.VehicleData.DynamicTyreRadius;
if (axleGearData != null) { if (axleGearData != null) {
var axleAngularVelocity = angularVelocity / gear.Value.Ratio; var axleAngularVelocity = angularVelocity / gear.Value.Ratio;
...@@ -151,8 +154,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -151,8 +154,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
} catch (VectoException) { } catch (VectoException) {
return return
new ValidationResult( new ValidationResult(
string.Format("Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1}", axleTorque, string.Format(
axleAngularVelocity.ConvertTo().Rounds.Per.Minute)); "Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1} (gear={2}, velocity={3})",
axleTorque, axleAngularVelocity.ConvertTo().Rounds.Per.Minute, gear.Key, velocity));
} }
} }
} }
......
...@@ -40,6 +40,7 @@ using TUGraz.VectoCommon.Exceptions; ...@@ -40,6 +40,7 @@ using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.Reader.ComponentData;
using TUGraz.VectoCore.Utils; using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data namespace TUGraz.VectoCore.Models.SimulationComponent.Data
...@@ -61,109 +62,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data ...@@ -61,109 +62,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut) public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut)
{ {
var value = _map.Interpolate(nAuxiliary.Value(), powerAuxOut.Value()); var value = _map.Interpolate(nAuxiliary.Value(), powerAuxOut.Value());
if (value.HasValue) if (value.HasValue) {
return value.Value.SI<Watt>(); return value.Value.SI<Watt>();
}
throw new VectoException("AuxiliaryData: Interpolation failed. nAux: {0}, powerOut:{1}", nAuxiliary.AsRPM, throw new VectoException("AuxiliaryData: Interpolation failed. nAux: {0}, powerOut:{1}", nAuxiliary.AsRPM,
powerAuxOut); powerAuxOut);
} }
public static AuxiliaryData ReadFromFile(string fileName, string id) internal AuxiliaryData(double transmissionRatio, double efficiencyToEngine, double efficiencyToSupply, DelaunayMap map)
{
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
{ {
/// <summary> _map = map;
/// [1/min] TransmissionRatio = transmissionRatio;
/// </summary> EfficiencyToEngine = efficiencyToEngine;
public const string AuxSpeed = "Auxiliary speed"; EfficiencyToSupply = efficiencyToSupply;
/// <summary>
/// [kW]
/// </summary>
public const string MechPower = "Mechanical power";
/// <summary>
/// [kW]
/// </summary>
public const string SupplyPower = "Supply power";
} }
/// <summary> /// <summary>
...@@ -180,17 +92,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data ...@@ -180,17 +92,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
var results = new List<ValidationResult>(); var results = new List<ValidationResult>();
foreach (var entry in data._map.Points) { foreach (var entry in data._map.Points) {
context.DisplayName = Fields.AuxSpeed; context.DisplayName = AuxiliaryDataReader.Fields.AuxSpeed;
if (!Validator.TryValidateValue(entry.X, context, results, xValidationRules)) { if (!Validator.TryValidateValue(entry.X, context, results, xValidationRules)) {
return new ValidationResult(string.Concat(results)); return new ValidationResult(string.Concat(results));
} }
context.DisplayName = Fields.SupplyPower; context.DisplayName = AuxiliaryDataReader.Fields.SupplyPower;
if (!Validator.TryValidateValue(entry.Y, context, results, yValidationRules)) { if (!Validator.TryValidateValue(entry.Y, context, results, yValidationRules)) {
return new ValidationResult(string.Concat(results)); return new ValidationResult(string.Concat(results));
} }
context.DisplayName = Fields.MechPower; context.DisplayName = AuxiliaryDataReader.Fields.MechPower;
if (!Validator.TryValidateValue(entry.Z, context, results, zValidationRules)) { if (!Validator.TryValidateValue(entry.Z, context, results, zValidationRules)) {
return new ValidationResult(string.Concat(results)); return new ValidationResult(string.Concat(results));
} }
......
...@@ -136,8 +136,10 @@ ...@@ -136,8 +136,10 @@
<Compile Include="InputData\Reader\ComponentData\TransmissionLossMapReader.cs" /> <Compile Include="InputData\Reader\ComponentData\TransmissionLossMapReader.cs" />
<Compile Include="InputData\Reader\ComponentData\RetarderLossMapReader.cs" /> <Compile Include="InputData\Reader\ComponentData\RetarderLossMapReader.cs" />
<Compile Include="InputData\Reader\ComponentData\TorqueConverterDataReader.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\Data\Engine\FuelConsumptionMapReader.cs" />
<Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" /> <Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" />
<Compile Include="Utils\AuxiliaryTypeHelper.cs" />
<Compile Include="Utils\ProviderExtensions.cs" /> <Compile Include="Utils\ProviderExtensions.cs" />
<Compile Include="Models\Declaration\AirDrag.cs" /> <Compile Include="Models\Declaration\AirDrag.cs" />
<Compile Include="Models\Declaration\Fan.cs" /> <Compile Include="Models\Declaration\Fan.cs" />
...@@ -197,7 +199,6 @@ ...@@ -197,7 +199,6 @@
<Compile Include="Models\Simulation\DataBus\IClutchInfo.cs" /> <Compile Include="Models\Simulation\DataBus\IClutchInfo.cs" />
<Compile Include="Models\Simulation\DataBus\IDriverInfo.cs" /> <Compile Include="Models\Simulation\DataBus\IDriverInfo.cs" />
<Compile Include="Models\Simulation\DataBus\IWheelsInfo.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\SimulationComponent\Data\FullLoadCurve.cs" />
<Compile Include="Models\Simulation\DataBus\IMileageCounter.cs" /> <Compile Include="Models\Simulation\DataBus\IMileageCounter.cs" />
<Compile Include="Utils\DebugData.cs" /> <Compile Include="Utils\DebugData.cs" />
......
...@@ -95,9 +95,7 @@ namespace TUGraz.VectoCore.Tests.FileIO ...@@ -95,9 +95,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
((JObject)json["Body"]).Property("Cycles").Remove(); ((JObject)json["Body"]).Property("Cycles").Remove();
AssertHelper.Exception<InvalidFileFormatException>( 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] [TestMethod]
...@@ -107,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.FileIO ...@@ -107,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
((JObject)json["Body"]).Property("Aux").Remove(); ((JObject)json["Body"]).Property("Aux").Remove();
// MK,2016-01-20: Changed for PWheel: aux entry may be missing, and that is ok. // 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); Assert.IsTrue(tmp.Count == 0);
} }
...@@ -154,26 +152,24 @@ namespace TUGraz.VectoCore.Tests.FileIO ...@@ -154,26 +152,24 @@ namespace TUGraz.VectoCore.Tests.FileIO
((JObject)json["Body"]).Property("OverSpeedEcoRoll").Remove(); ((JObject)json["Body"]).Property("OverSpeedEcoRoll").Remove();
AssertHelper.Exception<VectoException>( AssertHelper.Exception<VectoException>(
() => { () => { var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll; },
var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll;
},
"Key OverSpeedEcoRoll not found"); "Key OverSpeedEcoRoll not found");
} }
[TestMethod] //[TestMethod]
public void TestReadingElectricTechlist() //public void TestReadingElectricTechlist()
{ //{
var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile))); // var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights"); // ((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights");
var job = new JSONInputDataV2(json, TestJobFile); // var job = new JSONInputDataV2(json, TestJobFile);
foreach (var aux in job.Auxiliaries) { // foreach (var aux in job.Auxiliaries) {
if (aux.ID == "ES") { // if (aux.ID == "ES") {
Assert.AreEqual(1, aux.TechList.Count); // Assert.AreEqual(1, aux.TechList.Count);
Assert.AreEqual("LED lights", aux.TechList.First()); // Assert.AreEqual("LED lights", aux.TechList.First());
} // }
} // }
} //}
[TestMethod] [TestMethod]
public void JSON_Read_AngleGear() public void JSON_Read_AngleGear()
...@@ -184,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.FileIO ...@@ -184,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
Assert.AreEqual(AngularGearType.SeparateAngularGear, Assert.AreEqual(AngularGearType.SeparateAngularGear,
angleGear["Type"].Value<string>().ParseEnum<AngularGearType>()); angleGear["Type"].Value<string>().ParseEnum<AngularGearType>());
Assert.AreEqual(3.5, angleGear["Ratio"].Value<double>()); Assert.AreEqual(3.5, angleGear["Ratio"].Value<double>());
Assert.AreEqual("AngularGear.vtlm", angleGear["LossMap"].Value<string>()); Assert.AreEqual("AngleGear.vtlm", angleGear["LossMap"].Value<string>());
} }
} }
......
...@@ -39,6 +39,7 @@ using TUGraz.VectoCommon.Models; ...@@ -39,6 +39,7 @@ using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.FileIO.JSON;
using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader;
using TUGraz.VectoCore.InputData.Reader.ComponentData;
using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Impl;
using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.OutputData;
...@@ -104,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation ...@@ -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" }; 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", 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", ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vsum",
@"AuxWriteModFileSumFile.vsum"); @"AuxWriteModFileSumFile.vsum");
} }
...@@ -187,7 +188,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation ...@@ -187,7 +188,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
var aux = new EngineAuxiliary(container); 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 // ratio = 4.078
// efficiency_engine = 0.96 // efficiency_engine = 0.96
// efficiency_supply = 0.98 // efficiency_supply = 0.98
...@@ -246,7 +247,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation ...@@ -246,7 +247,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
var aux = new EngineAuxiliary(container); 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 // ratio = 4.078
// efficiency_engine = 0.96 // efficiency_engine = 0.96
// efficiency_supply = 0.98 // efficiency_supply = 0.98
...@@ -297,7 +298,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation ...@@ -297,7 +298,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
[TestMethod] [TestMethod]
public void AuxFileMissing() 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"); "Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux");
} }
......
...@@ -31,9 +31,11 @@ ...@@ -31,9 +31,11 @@
using System; using System;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Configuration;
using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Tests.Utils; using TUGraz.VectoCore.Tests.Utils;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{ {
...@@ -46,7 +48,7 @@ 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.Fan, AuxiliaryTypeHelper.Parse("Fan"));
Assert.AreEqual(AuxiliaryType.SteeringPump, AuxiliaryTypeHelper.Parse("Steering pump")); Assert.AreEqual(AuxiliaryType.SteeringPump, AuxiliaryTypeHelper.Parse("Steering pump"));
Assert.AreEqual(AuxiliaryType.ElectricSystem, AuxiliaryTypeHelper.Parse("Electric System")); 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")); Assert.AreEqual(AuxiliaryType.PneumaticSystem, AuxiliaryTypeHelper.Parse("Pneumatic System"));
AssertHelper.Exception<ArgumentOutOfRangeException>(() => { AuxiliaryTypeHelper.Parse("Foo Bar Blupp"); }); AssertHelper.Exception<ArgumentOutOfRangeException>(() => { AuxiliaryTypeHelper.Parse("Foo Bar Blupp"); });
} }
...@@ -57,7 +59,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData ...@@ -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.Fan, AuxiliaryTypeHelper.ToString(AuxiliaryType.Fan));
Assert.AreEqual(Constants.Auxiliaries.Names.SteeringPump, AuxiliaryTypeHelper.ToString(AuxiliaryType.SteeringPump)); Assert.AreEqual(Constants.Auxiliaries.Names.SteeringPump, AuxiliaryTypeHelper.ToString(AuxiliaryType.SteeringPump));
Assert.AreEqual(Constants.Auxiliaries.Names.HeatingVentilationAirCondition, Assert.AreEqual(Constants.Auxiliaries.Names.HeatingVentilationAirCondition,
AuxiliaryTypeHelper.ToString(AuxiliaryType.HeatingVentilationAirCondition)); AuxiliaryTypeHelper.ToString(AuxiliaryType.HVAC));
Assert.AreEqual(Constants.Auxiliaries.Names.PneumaticSystem, Assert.AreEqual(Constants.Auxiliaries.Names.PneumaticSystem,
AuxiliaryTypeHelper.ToString(AuxiliaryType.PneumaticSystem)); AuxiliaryTypeHelper.ToString(AuxiliaryType.PneumaticSystem));
Assert.AreEqual(Constants.Auxiliaries.Names.ElectricSystem, Assert.AreEqual(Constants.Auxiliaries.Names.ElectricSystem,
......
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