diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb index 18bd338ee58e8a67da2967b6ff8302c114d6b7bf..0863126db6e867e1dd55e8b86071fec98d863f33 100644 --- a/VECTO/GUI/VectoJobForm.vb +++ b/VECTO/GUI/VectoJobForm.vb @@ -1312,7 +1312,7 @@ lbDlog: True) Catch End Try - If s0 Is Nothing Then + If Not s0.Found Then HDVclass = "-" Else HDVclass = s0.VehicleClass.GetClassNumber() @@ -1327,7 +1327,7 @@ lbDlog: End If - PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, HDVclass.ToInt()), False) _ + PicVehicle.Image = ConvPicPath(If(Not s0.Found, -1, HDVclass.ToInt()), False) _ 'Image.FromFile(cDeclaration.ConvPicPath(HDVclass, False)) TbHVCclass.Text = String.Format("HDV Class {0}", HDVclass) diff --git a/VECTO/GUI/VehicleForm.vb b/VECTO/GUI/VehicleForm.vb index daa4612ba1e77845c5392c1cf3cc57be9495a621..25eea0c99f89e21704d0edf89ee250b679a84b78 100644 --- a/VECTO/GUI/VehicleForm.vb +++ b/VECTO/GUI/VehicleForm.vb @@ -132,13 +132,13 @@ Public Class VehicleForm Catch ' no segment found - ignore End Try - If Not s0 Is Nothing Then + If s0.Found Then _hdVclass = s0.VehicleClass.GetClassNumber() End If TbHDVclass.Text = _hdVclass - PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, _hdVclass.ToInt()), False) + PicVehicle.Image = ConvPicPath(If(Not s0.Found, -1, _hdVclass.ToInt()), False) End Sub @@ -160,7 +160,7 @@ Public Class VehicleForm Catch ' no segment found - ignore End Try - If Not s0 Is Nothing Then + If s0.found Then _hdVclass = s0.VehicleClass.GetClassNumber() Dim axleCount As Integer = s0.Missions(0).AxleWeightDistribution.Count() Dim i0 As Integer = LvRRC.Items.Count diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 84fadaad75271337382f6828faf8632ef6307c18..5ef3caa5f2b15e4c4f454754327171707f918bff 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -271,7 +271,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } private static void CreateATGearData(IGearboxDeclarationInputData gearbox, uint i, GearData gearData, - ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears, VehicleCategory vehicleCategory) + ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears, + VehicleCategory vehicleCategory) { if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) { // powersplit transmission: torque converter already contains ratio and losses @@ -282,7 +283,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter // torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode CreateTCFirstGearATSerial(gearData, tcShiftPolygon); } - if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) { + if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) { // ratio between first and second gear is above threshold, torqueconverter is active in second gear as well // -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear CreateTCSecondGearATSerial(gearData, tcShiftPolygon); @@ -335,7 +336,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter mission = mission.GetNonEMSMissionType(); switch (auxType) { case AuxiliaryType.Fan: - aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault()); + aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand; aux.ID = Constants.Auxiliaries.IDs.Fan; break; case AuxiliaryType.SteeringPump: @@ -344,15 +345,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter break; case AuxiliaryType.HVAC: aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, - auxData.Technology.FirstOrDefault(), hvdClass); + auxData.Technology.FirstOrDefault(), hvdClass).PowerDemand; aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition; break; case AuxiliaryType.PneumaticSystem: - aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault()); + aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand; aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem; break; case AuxiliaryType.ElectricSystem: - aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault()); + aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand; aux.ID = Constants.Auxiliaries.IDs.ElectricSystem; break; default: diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs index 8a61d30f9378869da8e4711a1e544f2c475383d3..201451de671cc15783395728810412506986e909 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; using System.Linq; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -90,9 +91,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl _segment = GetVehicleClassification(InputDataProvider.VehicleInputData.VehicleCategory, InputDataProvider.VehicleInputData.AxleConfiguration, InputDataProvider.VehicleInputData.GrossVehicleMassRating, InputDataProvider.VehicleInputData.CurbMassChassis); + if (!_segment.Found) { + throw new VectoException( + "no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, GVMR: {2}", + InputDataProvider.VehicleInputData.VehicleCategory, InputDataProvider.VehicleInputData.AxleConfiguration, + InputDataProvider.VehicleInputData.GrossVehicleMassRating); + } _driverdata = _dao.CreateDriverData(InputDataProvider.DriverInputData); _driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile); - var tempVehicle = _dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(), _segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight); _airdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, _segment.Missions.First(), _segment); diff --git a/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs b/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs new file mode 100644 index 0000000000000000000000000000000000000000..a04ddfb72d6a5c7079b1e5fb4e90dbd5aa3d44d7 --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs @@ -0,0 +1,9 @@ +using TUGraz.VectoCommon.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public struct AuxDemandEntry + { + public Watt PowerDemand; + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs b/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs index 4c9d90ef465111e095004010cc87e8e066806260..8bddb989396845919e56d3bc5c45633ab6fd3205 100644 --- a/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs +++ b/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs @@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Declaration { - public sealed class ElectricSystem : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable + public sealed class ElectricSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable { private readonly Alternator _alternator = new Alternator(); @@ -58,19 +58,19 @@ namespace TUGraz.VectoCore.Models.Declaration foreach (DataColumn col in table.Columns) { if (col.Caption != "technology") { Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = - row.ParseDouble(col).SI<Watt>(); + new AuxDemandEntry() { PowerDemand = row.ParseDouble(col).SI<Watt>() }; } } } } - public override Watt Lookup(MissionType missionType, string technology = null) + public override AuxDemandEntry Lookup(MissionType missionType, string technology = null) { if (string.IsNullOrWhiteSpace(technology)) { technology = "Standard technology"; } var value = base.Lookup(missionType, technology); - return value / _alternator.Lookup(missionType); + return new AuxDemandEntry() { PowerDemand = value.PowerDemand / _alternator.Lookup(missionType) }; } internal sealed class Alternator : LookupData<MissionType, string, double> diff --git a/VectoCore/VectoCore/Models/Declaration/Fan.cs b/VectoCore/VectoCore/Models/Declaration/Fan.cs index 6a35c66ede7c0641af79320544ca830db54a029a..3a576c5d04d0a6b6bda5543afe71755c7627e00c 100644 --- a/VectoCore/VectoCore/Models/Declaration/Fan.cs +++ b/VectoCore/VectoCore/Models/Declaration/Fan.cs @@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Declaration { - public sealed class Fan : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable + public sealed class Fan : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable { protected override string ResourceId { @@ -56,13 +56,13 @@ namespace TUGraz.VectoCore.Models.Declaration foreach (DataColumn col in table.Columns) { if (col.Caption != "technology") { - Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = row.ParseDouble(col).SI<Watt>(); + Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = new AuxDemandEntry(){PowerDemand = row.ParseDouble(col).SI<Watt>()}; } } } } - public override Watt Lookup(MissionType mission, string technology = null) + public override AuxDemandEntry Lookup(MissionType mission, string technology = null) { if (string.IsNullOrWhiteSpace(technology)) { technology = "Crankshaft mounted - Electronically controlled visco clutch"; diff --git a/VectoCore/VectoCore/Models/Declaration/FuelData.cs b/VectoCore/VectoCore/Models/Declaration/FuelData.cs index e925bfcd173d38f5229d5d487dcd52f83e5e24c7..6f176a7b0d70c1c976fa78f5ac36a34bb557eef8 100644 --- a/VectoCore/VectoCore/Models/Declaration/FuelData.cs +++ b/VectoCore/VectoCore/Models/Declaration/FuelData.cs @@ -29,73 +29,73 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class FuelData : LookupData<FuelType, FuelData.Entry> - { - private static FuelData _instance; - - public static FuelData Instance() - { - return _instance ?? (_instance = new FuelData()); - } - - private FuelData() {} - - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".FuelTypes.csv"; } - } - - protected override string ErrorMessage - { - get { throw new InvalidOperationException("ErrorMessage not applicable."); } - } - - public static Entry Diesel - { - get { return Instance().Lookup(FuelType.DieselCI); } - } - - protected override void ParseData(DataTable table) - { - Data = table.Rows.Cast<DataRow>() - .Select(r => { - var density = r.Field<string>("fueldensity"); - return new Entry( - r.Field<string>(0).ParseEnum<FuelType>(), - string.IsNullOrWhiteSpace(density) ? null : density.ToDouble(0).SI<KilogramPerCubicMeter>(), - r.ParseDouble("co2perfuelweight"), - r.ParseDouble("lowerheatingvalue").SI().Kilo.Joule.Per.Kilo.Gramm.Cast<JoulePerKilogramm>() - ); - }) - .ToDictionary(e => e.FuelType); - } - - public class Entry - { - public Entry(FuelType type, KilogramPerCubicMeter density, double weight, JoulePerKilogramm heatingValue) - { - FuelType = type; - FuelDensity = density; - CO2PerFuelWeight = weight; - LowerHeatingValue = heatingValue; - } - - public FuelType FuelType { get; private set; } - - public KilogramPerCubicMeter FuelDensity { get; private set; } - - public double CO2PerFuelWeight { get; private set; } - - public JoulePerKilogramm LowerHeatingValue { get; private set; } - } - } +using System; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public sealed class FuelData : LookupData<FuelType, FuelData.Entry> + { + private static FuelData _instance; + + public static FuelData Instance() + { + return _instance ?? (_instance = new FuelData()); + } + + private FuelData() {} + + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".FuelTypes.csv"; } + } + + protected override string ErrorMessage + { + get { throw new InvalidOperationException("ErrorMessage not applicable."); } + } + + public static Entry Diesel + { + get { return Instance().Lookup(FuelType.DieselCI); } + } + + protected override void ParseData(DataTable table) + { + Data = table.Rows.Cast<DataRow>() + .Select(r => { + var density = r.Field<string>("fueldensity"); + return new Entry( + r.Field<string>(0).ParseEnum<FuelType>(), + string.IsNullOrWhiteSpace(density) ? null : density.ToDouble(0).SI<KilogramPerCubicMeter>(), + r.ParseDouble("co2perfuelweight"), + r.ParseDouble("lowerheatingvalue").SI().Kilo.Joule.Per.Kilo.Gramm.Cast<JoulePerKilogramm>() + ); + }) + .ToDictionary(e => e.FuelType); + } + + public struct Entry + { + public Entry(FuelType type, KilogramPerCubicMeter density, double weight, JoulePerKilogramm heatingValue) : this() + { + FuelType = type; + FuelDensity = density; + CO2PerFuelWeight = weight; + LowerHeatingValue = heatingValue; + } + + public FuelType FuelType { get; private set; } + + public KilogramPerCubicMeter FuelDensity { get; private set; } + + public double CO2PerFuelWeight { get; private set; } + + public JoulePerKilogramm LowerHeatingValue { get; private set; } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/HVAC.cs b/VectoCore/VectoCore/Models/Declaration/HVAC.cs index 5a59d415340dc4a61d732e0aa73cf5120e6655e1..650b6c576ca488b4616201e3a868c3e430517f8b 100644 --- a/VectoCore/VectoCore/Models/Declaration/HVAC.cs +++ b/VectoCore/VectoCore/Models/Declaration/HVAC.cs @@ -29,50 +29,52 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class HeatingVentilationAirConditioning : LookupData<MissionType, string, VehicleClass, Watt>, - IDeclarationAuxiliaryTable - { - private List<string> Technologies; - - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; } - } - - protected override string ErrorMessage - { - get { - return "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'"; - } - } - - protected override void ParseData(DataTable table) - { - foreach (DataRow row in table.Rows) { - var hdvClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass")); - var technology = row.Field<string>("technology"); - foreach (DataColumn col in table.Columns) { - var value = row.ParseDoubleOrGetDefault(col.Caption, double.NaN); - if (col.Caption != "hdvclass" && col.Caption != "technology" && !double.IsNaN(value)) { - Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology, hdvClass)] = value.SI<Watt>(); - } - } - } - Technologies = Data.Select(x => x.Key.Item2).Distinct().ToList(); - } - - public string[] GetTechnologies() - { - return Technologies.ToArray(); - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public sealed class HeatingVentilationAirConditioning : LookupData<MissionType, string, VehicleClass, AuxDemandEntry>, + IDeclarationAuxiliaryTable + { + private List<string> Technologies; + + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; } + } + + protected override string ErrorMessage + { + get { + return "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'"; + } + } + + protected override void ParseData(DataTable table) + { + foreach (DataRow row in table.Rows) { + var hdvClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass")); + var technology = row.Field<string>("technology"); + foreach (DataColumn col in table.Columns) { + var value = row.ParseDoubleOrGetDefault(col.Caption, double.NaN); + if (col.Caption != "hdvclass" && col.Caption != "technology" && !double.IsNaN(value)) { + Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology, hdvClass)] = new AuxDemandEntry() { + PowerDemand = value.SI<Watt>() + }; + } + } + } + Technologies = Data.Select(x => x.Key.Item2).Distinct().ToList(); + } + + public string[] GetTechnologies() + { + return Technologies.ToArray(); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs index 933841f9c4fb0c38702425b2f45a511fb1e7fc9f..18a24da2aaa0ae03aebded43a37ba0a35e3c5847 100644 --- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs +++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs @@ -29,91 +29,91 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Collections.Generic; -using System.Data; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public abstract class LookupData : LoggingObject - { - protected abstract string ResourceId { get; } - protected abstract string ErrorMessage { get; } - protected abstract void ParseData(DataTable table); - - protected LookupData() - { - if (!string.IsNullOrWhiteSpace(ResourceId)) { - var table = ReadCsvResource(ResourceId); - NormalizeTable(table); - ParseData(table); - } - } - - protected static DataTable ReadCsvResource(string resourceId) - { - return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId); - } - - protected static void NormalizeTable(DataTable table) - { - foreach (DataColumn col in table.Columns) { - table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace(); - } - } - } - - public abstract class LookupData<TKey, TValue> : LookupData - { - protected Dictionary<TKey, TValue> Data = new Dictionary<TKey, TValue>(); - - public virtual TValue Lookup(TKey key) - { - try { - return Data[key]; - } catch (KeyNotFoundException) { - throw new VectoException(string.Format(ErrorMessage, key)); - } - } - } - - public abstract class LookupData<TKey1, TKey2, TValue> : LookupData - { - protected readonly Dictionary<Tuple<TKey1, TKey2>, TValue> Data = new Dictionary<Tuple<TKey1, TKey2>, TValue>(); - - public virtual TValue Lookup(TKey1 key1, TKey2 key2) - { - try { - return Data[Tuple.Create(key1, key2)]; - } catch (KeyNotFoundException) { - throw new VectoException(string.Format(ErrorMessage, key1, key2)); - } - } - } - - public abstract class LookupData<TKey1, TKey2, TKey3, TValue> : LookupData - { - protected readonly Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> Data = - new Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue>(); - - public virtual TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3) - { - try { - return Data[Tuple.Create(key1, key2, key3)]; - } catch (KeyNotFoundException) { - throw new VectoException(string.Format(ErrorMessage, key1, key2, key3)); - } - } - - //public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3); - } - - public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TValue> : LookupData - { - public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4); - } +using System; +using System.Collections.Generic; +using System.Data; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public abstract class LookupData : LoggingObject + { + protected abstract string ResourceId { get; } + protected abstract string ErrorMessage { get; } + protected abstract void ParseData(DataTable table); + + protected LookupData() + { + if (!string.IsNullOrWhiteSpace(ResourceId)) { + var table = ReadCsvResource(ResourceId); + NormalizeTable(table); + ParseData(table); + } + } + + protected static DataTable ReadCsvResource(string resourceId) + { + return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId); + } + + protected static void NormalizeTable(DataTable table) + { + foreach (DataColumn col in table.Columns) { + table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace(); + } + } + } + + public abstract class LookupData<TKey, TValue> : LookupData where TValue : struct + { + protected Dictionary<TKey, TValue> Data = new Dictionary<TKey, TValue>(); + + public virtual TValue Lookup(TKey key) + { + try { + return Data[key]; + } catch (KeyNotFoundException) { + throw new VectoException(string.Format(ErrorMessage, key)); + } + } + } + + public abstract class LookupData<TKey1, TKey2, TValue> : LookupData where TValue : struct + { + protected readonly Dictionary<Tuple<TKey1, TKey2>, TValue> Data = new Dictionary<Tuple<TKey1, TKey2>, TValue>(); + + public virtual TValue Lookup(TKey1 key1, TKey2 key2) + { + try { + return Data[Tuple.Create(key1, key2)]; + } catch (KeyNotFoundException) { + throw new VectoException(string.Format(ErrorMessage, key1, key2)); + } + } + } + + public abstract class LookupData<TKey1, TKey2, TKey3, TValue> : LookupData where TValue : struct + { + protected readonly Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> Data = + new Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue>(); + + public virtual TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3) + { + try { + return Data[Tuple.Create(key1, key2, key3)]; + } catch (KeyNotFoundException) { + throw new VectoException(string.Format(ErrorMessage, key1, key2, key3)); + } + } + + //public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3); + } + + public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TValue> : LookupData where TValue : struct + { + public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4); + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/PT1.cs b/VectoCore/VectoCore/Models/Declaration/PT1.cs index 085011993d36a09c8c38a32853a15d12ceca7209..f4737177eccfedc65f67dc12f3d09f6fd6b2c402 100644 --- a/VectoCore/VectoCore/Models/Declaration/PT1.cs +++ b/VectoCore/VectoCore/Models/Declaration/PT1.cs @@ -29,101 +29,101 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class PT1 : LookupData<PerSecond, PT1.PT1Result> - { - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".PT1.csv"; } - } - - protected override string ErrorMessage - { - get { throw new InvalidOperationException("ErrorMessage not applicable."); } - } - - private List<KeyValuePair<PerSecond, Second>> _entries; - - public PT1() - { - ParseData(ReadCsvResource(ResourceId)); - } - - public PT1(DataTable data) - { - ParseDataFromFld(data); - } - - protected override void ParseData(DataTable table) - { - _entries = table.Rows.Cast<DataRow>() - .Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble("rpm").RPMtoRad(), r.ParseDouble("PT1").SI<Second>())) - .OrderBy(x => x.Key) - .ToList(); - } - - private void ParseDataFromFld(DataTable data) - { - if (data.Columns.Count < 3) { - throw new VectoException("FullLoadCurve/PT1 Data File must consist of at least 4 columns."); - } - - if (data.Rows.Count < 2) { - throw new VectoException( - "FullLoadCurve/PT1 must consist of at least two lines with numeric values (below file header)"); - } - - if (data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PT1)) { - _entries = data.Rows.Cast<DataRow>() - .Select( - r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(Fields.EngineSpeed).RPMtoRad(), - r.ParseDouble(Fields.PT1).SI<Second>())) - .OrderBy(x => x.Key).ToList(); - } else { - _entries = data.Rows.Cast<DataRow>() - .Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(0).RPMtoRad(), r.ParseDouble(3).SI<Second>())) - .OrderBy(x => x.Key).ToList(); - } - } - - public override PT1Result Lookup(PerSecond key) - { - var extrapolated = key.IsSmaller(_entries[0].Key) || key.IsGreater(_entries.Last().Key); - - var index = _entries.FindIndex(x => x.Key.IsGreater(key)); - if (index <= 0) { - index = key.IsGreater(_entries[0].Key) ? _entries.Count - 1 : 1; - } - - var pt1 = VectoMath.Interpolate(_entries[index - 1].Key, _entries[index].Key, _entries[index - 1].Value, - _entries[index].Value, key); - if (pt1 < 0) { - pt1 = 0.SI<Second>(); - extrapolated = true; - //throw new VectoException("The calculated pt1 value must not be smaller than 0. Value: " + pt1); - } - return new PT1Result() { Value = pt1, Extrapolated = extrapolated }; - } - - private static class Fields - { - public const string PT1 = "PT1"; - public const string EngineSpeed = "engine speed"; - } - - public class PT1Result - { - public Second Value; - public bool Extrapolated; - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public sealed class PT1 : LookupData<PerSecond, PT1.PT1Result> + { + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".PT1.csv"; } + } + + protected override string ErrorMessage + { + get { throw new InvalidOperationException("ErrorMessage not applicable."); } + } + + private List<KeyValuePair<PerSecond, Second>> _entries; + + public PT1() + { + ParseData(ReadCsvResource(ResourceId)); + } + + public PT1(DataTable data) + { + ParseDataFromFld(data); + } + + protected override void ParseData(DataTable table) + { + _entries = table.Rows.Cast<DataRow>() + .Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble("rpm").RPMtoRad(), r.ParseDouble("PT1").SI<Second>())) + .OrderBy(x => x.Key) + .ToList(); + } + + private void ParseDataFromFld(DataTable data) + { + if (data.Columns.Count < 3) { + throw new VectoException("FullLoadCurve/PT1 Data File must consist of at least 4 columns."); + } + + if (data.Rows.Count < 2) { + throw new VectoException( + "FullLoadCurve/PT1 must consist of at least two lines with numeric values (below file header)"); + } + + if (data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PT1)) { + _entries = data.Rows.Cast<DataRow>() + .Select( + r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(Fields.EngineSpeed).RPMtoRad(), + r.ParseDouble(Fields.PT1).SI<Second>())) + .OrderBy(x => x.Key).ToList(); + } else { + _entries = data.Rows.Cast<DataRow>() + .Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(0).RPMtoRad(), r.ParseDouble(3).SI<Second>())) + .OrderBy(x => x.Key).ToList(); + } + } + + public override PT1Result Lookup(PerSecond key) + { + var extrapolated = key.IsSmaller(_entries[0].Key) || key.IsGreater(_entries.Last().Key); + + var index = _entries.FindIndex(x => x.Key.IsGreater(key)); + if (index <= 0) { + index = key.IsGreater(_entries[0].Key) ? _entries.Count - 1 : 1; + } + + var pt1 = VectoMath.Interpolate(_entries[index - 1].Key, _entries[index].Key, _entries[index - 1].Value, + _entries[index].Value, key); + if (pt1 < 0) { + pt1 = 0.SI<Second>(); + extrapolated = true; + //throw new VectoException("The calculated pt1 value must not be smaller than 0. Value: " + pt1); + } + return new PT1Result() { Value = pt1, Extrapolated = extrapolated }; + } + + private static class Fields + { + public const string PT1 = "PT1"; + public const string EngineSpeed = "engine speed"; + } + + public struct PT1Result + { + public Second Value; + public bool Extrapolated; + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs b/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs index ffbfd1fe09992698d6005baebbdd03d6b0a355d4..1231691fafa4537d39eeae34daa7b8928bceb9d3 100644 --- a/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs +++ b/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs @@ -36,7 +36,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Declaration { - public sealed class PTOTransmission : LookupData<string, Watt>, IDeclarationAuxiliaryTable + public sealed class PTOTransmission : LookupData<string, AuxDemandEntry>, IDeclarationAuxiliaryTable { public const string NoPTO = "None"; @@ -54,7 +54,7 @@ namespace TUGraz.VectoCore.Models.Declaration { Data = table.Rows.Cast<DataRow>().ToDictionary( r => r.Field<string>("technology"), - r => r.ParseDouble("powerloss").SI<Watt>()); + r => new AuxDemandEntry { PowerDemand = r.ParseDouble("powerloss").SI<Watt>() }); } public string[] GetTechnologies() diff --git a/VectoCore/VectoCore/Models/Declaration/Payloads.cs b/VectoCore/VectoCore/Models/Declaration/Payloads.cs index 1203a2743e97da58e26745287bd0808b86a2d8b6..be9d124b14d6a4971662cba681b86d05173723ce 100644 --- a/VectoCore/VectoCore/Models/Declaration/Payloads.cs +++ b/VectoCore/VectoCore/Models/Declaration/Payloads.cs @@ -29,72 +29,72 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry> - { - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; } - } - - protected override string ErrorMessage - { - get { throw new InvalidOperationException("ErrorMessage not applicable."); } - } - - public Kilogram Lookup10Percent(Kilogram grossVehicleWeight) - { - var section = Data.GetSection(d => d.Key > grossVehicleWeight); - return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, - section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent, - grossVehicleWeight); - } - - public Kilogram Lookup50Percent(Kilogram grossVehicleWeight) - { - var section = Data.GetSection(d => d.Key > grossVehicleWeight); - return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, - section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent, - grossVehicleWeight); - } - - public Kilogram Lookup75Percent(Kilogram grossVehicleWeight) - { - var section = Data.GetSection(d => d.Key > grossVehicleWeight); - return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, - section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent, - grossVehicleWeight); - } - - public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight) - { - return 0.75 * (grossVehicleWeight - curbWeight); - } - - protected override void ParseData(DataTable table) - { - Data = table.Rows.Cast<DataRow>() - .ToDictionary( - kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(), - kv => new PayloadEntry { - Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(), - Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(), - Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>() - }); - } - - public sealed class PayloadEntry - { - public Kilogram Payload10Percent; - public Kilogram Payload50Percent; - public Kilogram Payload75Percent; - } - } +using System; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry> + { + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; } + } + + protected override string ErrorMessage + { + get { throw new InvalidOperationException("ErrorMessage not applicable."); } + } + + public Kilogram Lookup10Percent(Kilogram grossVehicleWeight) + { + var section = Data.GetSection(d => d.Key > grossVehicleWeight); + return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, + section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent, + grossVehicleWeight); + } + + public Kilogram Lookup50Percent(Kilogram grossVehicleWeight) + { + var section = Data.GetSection(d => d.Key > grossVehicleWeight); + return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, + section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent, + grossVehicleWeight); + } + + public Kilogram Lookup75Percent(Kilogram grossVehicleWeight) + { + var section = Data.GetSection(d => d.Key > grossVehicleWeight); + return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key, + section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent, + grossVehicleWeight); + } + + public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight) + { + return 0.75 * (grossVehicleWeight - curbWeight); + } + + protected override void ParseData(DataTable table) + { + Data = table.Rows.Cast<DataRow>() + .ToDictionary( + kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(), + kv => new PayloadEntry { + Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(), + Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(), + Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>() + }); + } + + public struct PayloadEntry + { + public Kilogram Payload10Percent; + public Kilogram Payload50Percent; + public Kilogram Payload75Percent; + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs index 4f4194b90a29696a8db9f54f66968853a85d6403..ef291b23cd70ad0a2d0e478a3f61b2041245cc1a 100644 --- a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs +++ b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs @@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Declaration { - public sealed class PneumaticSystem : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable + public sealed class PneumaticSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable { protected override string ResourceId { @@ -55,7 +55,9 @@ namespace TUGraz.VectoCore.Models.Declaration var technology = row.Field<string>("technology"); foreach (DataColumn col in table.Columns) { if (col.Caption != "technology") { - Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = row.ParseDouble(col.Caption).SI<Watt>(); + Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = new AuxDemandEntry() { + PowerDemand = row.ParseDouble(col.Caption).SI<Watt>() + }; } } } diff --git a/VectoCore/VectoCore/Models/Declaration/Segment.cs b/VectoCore/VectoCore/Models/Declaration/Segment.cs index aa0627c1736abbd73aa7e080d42a234e0c493a4c..2dee8dfb6e52a66d25d37cc9d200cce51224c156 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segment.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segment.cs @@ -35,8 +35,10 @@ using TUGraz.VectoCommon.Utils; namespace TUGraz.VectoCore.Models.Declaration { - public class Segment + public struct Segment { + public bool Found; + public VehicleClass VehicleClass { get; internal set; } public VehicleCategory VehicleCategory { get; set; } diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs index f070c9e29b1c41c2d2131dc48e2165dbcc551461..7f4e8ab244a66b4d0cf4ac2d545f173b8078d200 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segments.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs @@ -78,8 +78,12 @@ namespace TUGraz.VectoCore.Models.Declaration } var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, considerInvalid); + if (row == null) { + return new Segment() { Found = false }; + } var segment = new Segment { + Found = true, GrossVehicleWeightMin = row.ParseDouble("gvw_min").SI().Ton.Cast<Kilogram>(), GrossVehicleWeightMax = row.ParseDouble("gvw_max").SI().Ton.Cast<Kilogram>(), VehicleCategory = vehicleCategory, diff --git a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs index 9b34acee42590d6b9733112cfda713842f067a21..f19aa9fb02fee03c6bef1810adbe47b8aeb565ef 100644 --- a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs +++ b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs @@ -29,105 +29,105 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class StandardBody - { - public readonly Kilogram CurbWeight; - public readonly Kilogram GrossVehicleWeight; - public readonly SquareMeter[] DeltaCrossWindArea; - public readonly string Name; - public readonly List<Wheels.Entry> Wheels; - public readonly CubicMeter CargoVolume; - - public Kilogram MaxPayLoad - { - get { return GrossVehicleWeight - CurbWeight; } - } - - public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea, - Wheels.Entry wheels, int axleCount, CubicMeter volume) : - this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea, - wheels == null ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels, axleCount).ToList(), volume) {} - - private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea, - List<Wheels.Entry> wheels, CubicMeter volume) - { - Name = name; - CurbWeight = curbWeight; - GrossVehicleWeight = grossVehicleWeight; - DeltaCrossWindArea = deltaCrossWindArea; - Wheels = wheels; - CargoVolume = volume; - } - - //public static StandardBody operator +(StandardBody first, StandardBody second) - //{ - // var wheels = new List<Wheels.Entry>(first.Wheels); - // wheels.AddRange(second.Wheels); - // return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight, - // first.GrossVehicleWeight + second.GrossVehicleWeight, - // first.DeltaCrossWindArea + second.DeltaCrossWindArea, - // wheels, first.CargoVolume + second.TotalCargoVolume); - //} - } - - /// <summary> - /// Lookup Class for Standard Weights of Bodies, Trailers and Semitrailers. - /// Standard Weights include - /// CurbWeight (=Empty Weight), - /// Gross Vehicle Weight (=Maximum Allowed Weight), - /// MaxPayload, - /// DeltaCrossWindArea, - /// Wheels - /// </summary> - public sealed class StandardBodies : LookupData<string, StandardBody> - { - public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(), - new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>()); - - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".Body_Trailers_Weights.csv"; } - } - - protected override string ErrorMessage - { - get { return "StandardWeigths Lookup Error: No value found for ID '{0}'"; } - } - - public override StandardBody Lookup(string id) - { - return string.IsNullOrWhiteSpace(id) ? Empty : base.Lookup(id); - } - - protected override void ParseData(DataTable table) - { - Data = table.Rows.Cast<DataRow>().Select(k => { - var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul"); - var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }; - if (!deltaCdxAStr.Equals("-")) { - deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray(); - } - return new StandardBody( - k.Field<string>("name"), - k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(), - k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(), - deltaCdxA, - !string.IsNullOrWhiteSpace(k.Field<string>("wheels")) - ? DeclarationData.Wheels.Lookup(k.Field<string>("wheels")) - : null, - Int32.Parse(k.Field<string>("axlecount")), - k.ParseDouble("cargovolume").SI<CubicMeter>()); - }) - .ToDictionary(kv => kv.Name); - } - } +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public struct StandardBody + { + public readonly Kilogram CurbWeight; + public readonly Kilogram GrossVehicleWeight; + public readonly SquareMeter[] DeltaCrossWindArea; + public readonly string Name; + public readonly List<Wheels.Entry> Wheels; + public readonly CubicMeter CargoVolume; + + public Kilogram MaxPayLoad + { + get { return GrossVehicleWeight - CurbWeight; } + } + + public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea, + Wheels.Entry? wheels, int axleCount, CubicMeter volume) : + this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea, + !wheels.HasValue ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels.Value, axleCount).ToList(), volume) {} + + private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea, + List<Wheels.Entry> wheels, CubicMeter volume) + { + Name = name; + CurbWeight = curbWeight; + GrossVehicleWeight = grossVehicleWeight; + DeltaCrossWindArea = deltaCrossWindArea; + Wheels = wheels; + CargoVolume = volume; + } + + //public static StandardBody operator +(StandardBody first, StandardBody second) + //{ + // var wheels = new List<Wheels.Entry>(first.Wheels); + // wheels.AddRange(second.Wheels); + // return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight, + // first.GrossVehicleWeight + second.GrossVehicleWeight, + // first.DeltaCrossWindArea + second.DeltaCrossWindArea, + // wheels, first.CargoVolume + second.TotalCargoVolume); + //} + } + + /// <summary> + /// Lookup Class for Standard Weights of Bodies, Trailers and Semitrailers. + /// Standard Weights include + /// CurbWeight (=Empty Weight), + /// Gross Vehicle Weight (=Maximum Allowed Weight), + /// MaxPayload, + /// DeltaCrossWindArea, + /// Wheels + /// </summary> + public sealed class StandardBodies : LookupData<string, StandardBody> + { + public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(), + new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>()); + + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".Body_Trailers_Weights.csv"; } + } + + protected override string ErrorMessage + { + get { return "StandardWeigths Lookup Error: No value found for ID '{0}'"; } + } + + public override StandardBody Lookup(string id) + { + return string.IsNullOrWhiteSpace(id) ? Empty : base.Lookup(id); + } + + protected override void ParseData(DataTable table) + { + Data = table.Rows.Cast<DataRow>().Select(k => { + var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul"); + var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }; + if (!deltaCdxAStr.Equals("-")) { + deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray(); + } + return new StandardBody( + k.Field<string>("name"), + k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(), + k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(), + deltaCdxA, + !string.IsNullOrWhiteSpace(k.Field<string>("wheels")) + ? DeclarationData.Wheels.Lookup(k.Field<string>("wheels")) + : (Wheels.Entry?)null, + int.Parse(k.Field<string>("axlecount")), + k.ParseDouble("cargovolume").SI<CubicMeter>()); + }) + .ToDictionary(kv => kv.Name); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs index 8b0ec360f361a9866664f2ac8cf29f26b5c5161a..2089c310f32077c1d6e54338a784dd03a9e089c8 100644 --- a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs +++ b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs @@ -178,7 +178,7 @@ namespace TUGraz.VectoCore.Models.Declaration } } - private class SteeringPumpValues<T> + private struct SteeringPumpValues<T> { public T UnloadedFriction; public T Banking; diff --git a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs index 48f214845805dfe649099f9247f5a8773dcfbbf8..94e7ea1ed6641251467d3161d48b9a7c2605ab65 100644 --- a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs +++ b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs @@ -71,7 +71,7 @@ namespace TUGraz.VectoCore.Models.Declaration } } - private class Entry + private struct Entry { public double Rural; public double Urban; diff --git a/VectoCore/VectoCore/Models/Declaration/Wheels.cs b/VectoCore/VectoCore/Models/Declaration/Wheels.cs index c19a08e0a288a8899ae8a80dc1d0ec2b80069ab3..9bf7e401338c9498168ed13b54796e9384125aee 100644 --- a/VectoCore/VectoCore/Models/Declaration/Wheels.cs +++ b/VectoCore/VectoCore/Models/Declaration/Wheels.cs @@ -29,61 +29,61 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Data; -using System.Linq; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Models.Declaration -{ - public sealed class Wheels : LookupData<string, Wheels.Entry> - { - private string[] _dimensions; - - protected override string ResourceId - { - get { return DeclarationData.DeclarationDataResourcePrefix + ".Wheels.csv"; } - } - - protected override string ErrorMessage - { - get { return "Wheels Lookup Error: No value found for Wheels. Key: '{0}'"; } - } - - public override Entry Lookup(string key) - { - return base.Lookup(key.RemoveWhitespace()); - } - - protected override void ParseData(DataTable table) - { - Data = table.Rows.Cast<DataRow>() - .Select(row => new Entry { - WheelType = row.Field<string>(0).RemoveWhitespace(), - Inertia = row.ParseDouble("inertia").SI<KilogramSquareMeter>(), - WheelsDiameter = row.ParseDouble("d").SI().Milli.Meter.Cast<Meter>(), - CircumferenceFactor = row.ParseDouble("f") - }).ToDictionary(e => e.WheelType); - _dimensions = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(0)).ToArray(); - } - - public class Entry - { - public string WheelType; - public KilogramSquareMeter Inertia; - public Meter WheelsDiameter; - public double CircumferenceFactor; - - public Meter DynamicTyreRadius - { - get { return WheelsDiameter * CircumferenceFactor / (2 * Math.PI); } - } - } - - public string[] GetWheelsDimensions() - { - return _dimensions; - } - } +using System; +using System.Data; +using System.Linq; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration +{ + public sealed class Wheels : LookupData<string, Wheels.Entry> + { + private string[] _dimensions; + + protected override string ResourceId + { + get { return DeclarationData.DeclarationDataResourcePrefix + ".Wheels.csv"; } + } + + protected override string ErrorMessage + { + get { return "Wheels Lookup Error: No value found for Wheels. Key: '{0}'"; } + } + + public override Entry Lookup(string key) + { + return base.Lookup(key.RemoveWhitespace()); + } + + protected override void ParseData(DataTable table) + { + Data = table.Rows.Cast<DataRow>() + .Select(row => new Entry { + WheelType = row.Field<string>(0).RemoveWhitespace(), + Inertia = row.ParseDouble("inertia").SI<KilogramSquareMeter>(), + WheelsDiameter = row.ParseDouble("d").SI().Milli.Meter.Cast<Meter>(), + CircumferenceFactor = row.ParseDouble("f") + }).ToDictionary(e => e.WheelType); + _dimensions = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(0)).ToArray(); + } + + public struct Entry + { + public string WheelType; + public KilogramSquareMeter Inertia; + public Meter WheelsDiameter; + public double CircumferenceFactor; + + public Meter DynamicTyreRadius + { + get { return WheelsDiameter * CircumferenceFactor / (2 * Math.PI); } + } + } + + public string[] GetWheelsDimensions() + { + return _dimensions; + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 9ffcefc470bfcdb0282dc8ca5c34e0426daf38fc..f677315e4e085472ae482fcf597976cf8ad75c4a 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -263,7 +263,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl if (data.PTO != null) { aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission, - DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType)); + DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand); container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 3ebf64a5186d0987ad6eb90ba3f3d25d3c429998..1167eee4a5069514f9a6e12fc19c8e3ef17ac702 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -29,134 +29,134 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.Simulation.Impl; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; - -namespace TUGraz.VectoCore.OutputData -{ - public interface IDeclarationReport - { - void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData); - void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData); - void InitializeReport(VectoRunData modelData, Segment segment); - } - - /// <summary> - /// Class for creating a declaration report. - /// </summary> - public abstract class DeclarationReport<T> : IDeclarationReport where T : new() - { - public class ResultContainer<TEntry> - { - public MissionType Mission; - - public Dictionary<LoadingType, TEntry> ModData; - } - - //public class MissionProfile - //{ - // public readonly IList<double> DistanceKm; - // public readonly IList<double> TargetSpeed; - // public readonly IList<double> Altitude; - - // public MissionProfile(IModalDataContainer m) - // { - // DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(); - // TargetSpeed = - // m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble(); - // Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble(); - // } - //} - - /// <summary> - /// Dictionary of MissionTypes and their corresponding results. - /// </summary> - protected readonly Dictionary<MissionType, ResultContainer<T>> Missions = - new Dictionary<MissionType, ResultContainer<T>>(); - - /// <summary> - /// The full load curve. - /// </summary> - internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; } - - /// <summary> - /// The declaration segment from the segment table - /// </summary> - internal Segment Segment { get; set; } - - - /// <summary> - /// The result count determines how many results must be given before the report gets written. - /// </summary> - private int _resultCount; - - [MethodImpl(MethodImplOptions.Synchronized)] - public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData) - { - if (!Missions.ContainsKey(mission.MissionType)) { - Missions[mission.MissionType] = new ResultContainer<T>() { - Mission = mission.MissionType, - ModData = new Dictionary<LoadingType, T>(), - }; - } - Missions[mission.MissionType].ModData[loading] = new T(); - _resultCount++; - } - - - [MethodImpl(MethodImplOptions.Synchronized)] - public void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, - IModalDataContainer modData) - { - if (modData.RunStatus != VectoRun.Status.Success) { - //Missions.Clear(); - return; - } - if (!Missions.ContainsKey(mission.MissionType)) { - throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType); - } - if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) { - throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType); - } - //if (Missions[mission.MissionType].MissionProfile == null) { - // Missions[mission.MissionType].MissionProfile = new MissionProfile(modData); - //} - _resultCount--; - - DoAddResult(Missions[mission.MissionType].ModData[loadingType], runData, modData); - - if (_resultCount == 0) { - DoWriteReport(); - Flc = null; - Segment = null; - } - } - - /// <summary> - /// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written. - /// </summary> - /// <param name="entry"></param> - /// <param name="runData"></param> - /// <param name="modData">The mod data.</param> - [MethodImpl(MethodImplOptions.Synchronized)] - protected abstract void DoAddResult(T entry, VectoRunData runData, IModalDataContainer modData); - - - protected internal abstract void DoWriteReport(); - - - public void InitializeReport(VectoRunData modelData, Segment segment) - { - Segment = segment; - - DoInitializeReport(modelData, segment); - } - - protected abstract void DoInitializeReport(VectoRunData modelData, Segment segment); - } +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; + +namespace TUGraz.VectoCore.OutputData +{ + public interface IDeclarationReport + { + void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData); + void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData); + void InitializeReport(VectoRunData modelData, Segment segment); + } + + /// <summary> + /// Class for creating a declaration report. + /// </summary> + public abstract class DeclarationReport<T> : IDeclarationReport where T : new() + { + public class ResultContainer<TEntry> + { + public MissionType Mission; + + public Dictionary<LoadingType, TEntry> ModData; + } + + //public class MissionProfile + //{ + // public readonly IList<double> DistanceKm; + // public readonly IList<double> TargetSpeed; + // public readonly IList<double> Altitude; + + // public MissionProfile(IModalDataContainer m) + // { + // DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(); + // TargetSpeed = + // m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble(); + // Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble(); + // } + //} + + /// <summary> + /// Dictionary of MissionTypes and their corresponding results. + /// </summary> + protected readonly Dictionary<MissionType, ResultContainer<T>> Missions = + new Dictionary<MissionType, ResultContainer<T>>(); + + /// <summary> + /// The full load curve. + /// </summary> + internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; } + + /// <summary> + /// The declaration segment from the segment table + /// </summary> + internal Segment? Segment { get; set; } + + + /// <summary> + /// The result count determines how many results must be given before the report gets written. + /// </summary> + private int _resultCount; + + [MethodImpl(MethodImplOptions.Synchronized)] + public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData) + { + if (!Missions.ContainsKey(mission.MissionType)) { + Missions[mission.MissionType] = new ResultContainer<T>() { + Mission = mission.MissionType, + ModData = new Dictionary<LoadingType, T>(), + }; + } + Missions[mission.MissionType].ModData[loading] = new T(); + _resultCount++; + } + + + [MethodImpl(MethodImplOptions.Synchronized)] + public void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, + IModalDataContainer modData) + { + if (modData.RunStatus != VectoRun.Status.Success) { + //Missions.Clear(); + return; + } + if (!Missions.ContainsKey(mission.MissionType)) { + throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType); + } + if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) { + throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType); + } + //if (Missions[mission.MissionType].MissionProfile == null) { + // Missions[mission.MissionType].MissionProfile = new MissionProfile(modData); + //} + _resultCount--; + + DoAddResult(Missions[mission.MissionType].ModData[loadingType], runData, modData); + + if (_resultCount == 0) { + DoWriteReport(); + Flc = null; + Segment = null; + } + } + + /// <summary> + /// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written. + /// </summary> + /// <param name="entry"></param> + /// <param name="runData"></param> + /// <param name="modData">The mod data.</param> + [MethodImpl(MethodImplOptions.Synchronized)] + protected abstract void DoAddResult(T entry, VectoRunData runData, IModalDataContainer modData); + + + protected internal abstract void DoWriteReport(); + + + public void InitializeReport(VectoRunData modelData, Segment segment) + { + Segment = segment; + + DoInitializeReport(modelData, segment); + } + + protected abstract void DoInitializeReport(VectoRunData modelData, Segment segment); + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index aae00d06abb7382634365a52ac96303aa8ee38ce..72a0ccda5bb9b2d4c02324f48c836f848d279cab 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -155,6 +155,7 @@ <Compile Include="InputData\Reader\Impl\EngineeringModeVectoRunDataFactory.cs" /> <Compile Include="InputData\Reader\Impl\EngineOnlyVectoRunDataFactory.cs" /> <Compile Include="InputData\Reader\ShiftPolygonReader.cs" /> + <Compile Include="Models\Declaration\AuxDemandEntry.cs" /> <Compile Include="Models\Declaration\AuxiliaryTypeHelper.cs" /> <Compile Include="Models\Connector\Ports\IDriverDemandPort.cs" /> <Compile Include="Models\Connector\Ports\IDrivingCyclePort.cs" /> diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs index fa83d8f4bd6fc4c0f618c5bb814570846f6135eb..1f7494ea4780561fc94b36f05754538ec43e7c39 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs @@ -269,8 +269,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration public void CrossWindAreaCdxANotSet_Other() { foreach (var correctionMode in EnumHelper.GetValues<CrossWindCorrectionMode>()) { - if (correctionMode == CrossWindCorrectionMode.DeclarationModeCorrection) + if (correctionMode == CrossWindCorrectionMode.DeclarationModeCorrection) { continue; + } var airDrag = new AirdragData { CrossWindCorrectionMode = correctionMode, @@ -295,7 +296,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration TestCase(MissionType.Construction, "Standard technology - LED headlights, all", 950, 0.7),] public void AuxElectricSystemTest(MissionType mission, string technology, double value, double efficiency) { - AssertHelper.AreRelativeEqual(value / efficiency, DeclarationData.ElectricSystem.Lookup(mission, technology)); + AssertHelper.AreRelativeEqual(value / efficiency, DeclarationData.ElectricSystem.Lookup(mission, technology).PowerDemand.Value()); } [TestCase(MissionType.Interurban, "Standard technology"), @@ -317,7 +318,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration TestCase("only one engaged gearwheel above oil level", 0)] public void AuxPTOTransmissionTest(string technology, double value) { - AssertHelper.AreRelativeEqual(value, DeclarationData.PTOTransmission.Lookup(technology)); + AssertHelper.AreRelativeEqual(value, DeclarationData.PTOTransmission.Lookup(technology).PowerDemand.Value()); } [TestCase("Superfluid")] @@ -343,8 +344,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration public void AuxFanTechTest(string technology, int[] expected) { for (var i = 0; i < _missions.Length; i++) { - var value = DeclarationData.Fan.Lookup(_missions[i], technology); - Assert.AreEqual(expected[i], value.Value(), Tolerance); + var lookup = DeclarationData.Fan.Lookup(_missions[i], technology); + Assert.AreEqual(expected[i], lookup.PowerDemand.Value(), Tolerance); } } @@ -372,7 +373,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration for (var i = 0; i < expected.Length; i++) { if (expected[i] > 0) { AssertHelper.AreRelativeEqual(expected[i], - DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "Default", vehicleClass)); + DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "Default", vehicleClass).PowerDemand.Value()); } else { var i1 = i; AssertHelper.Exception<VectoException>( @@ -395,7 +396,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration { for (var i = 0; i < expected.Length; i++) { AssertHelper.AreRelativeEqual(expected[i], - DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "None", vehicleClass)); + DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "None", vehicleClass).PowerDemand.Value()); } } @@ -442,8 +443,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration public void AuxPneumaticSystemTest(string technology, int[] expected) { for (var i = 0; i < _missions.Length; i++) { - var value = DeclarationData.PneumaticSystem.Lookup(_missions[i], technology); - AssertHelper.AreRelativeEqual(expected[i], value); + var lookup = DeclarationData.PneumaticSystem.Lookup(_missions[i], technology); + AssertHelper.AreRelativeEqual(expected[i], lookup.PowerDemand.Value()); } } @@ -547,11 +548,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration public void SegmentWeightOutOfRange4X2(double weight) { AssertHelper.Exception<VectoException>(() => - DeclarationData.Segments.Lookup( - VehicleCategory.RigidTruck, - AxleConfiguration.AxleConfig_4x2, - weight.SI<Kilogram>(), - 0.SI<Kilogram>()), + DeclarationData.Segments.Lookup( + VehicleCategory.RigidTruck, + AxleConfiguration.AxleConfig_4x2, + weight.SI<Kilogram>(), + 0.SI<Kilogram>()), "Gross vehicle mass must be greater than 7.5 tons"); } @@ -564,11 +565,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration public void SegmentWeightOutOfRange4X4(double weight) { AssertHelper.Exception<VectoException>(() => - DeclarationData.Segments.Lookup( - VehicleCategory.RigidTruck, - AxleConfiguration.AxleConfig_4x4, - weight.SI<Kilogram>(), - 0.SI<Kilogram>()), + DeclarationData.Segments.Lookup( + VehicleCategory.RigidTruck, + AxleConfiguration.AxleConfig_4x4, + weight.SI<Kilogram>(), + 0.SI<Kilogram>()), "Gross vehicle mass must be greater than 7.5 tons"); } diff --git a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs index 8d73537a0b633d77c197010cf02d8adf3575159e..d84faffa190492ef352f0d218d513a98b92ca77a 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs @@ -83,14 +83,14 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var mission = MissionType.LongHaul; aux.AddConstant("FAN", - DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump")); - aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, "Medium Supply 1-stage")); + DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump").PowerDemand); + aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, "Medium Supply 1-stage").PowerDemand); aux.AddConstant("STP", DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass, new[] { "Variable displacement mech. controlled" })); - aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission)); + aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission).PowerDemand); aux.AddConstant("AC", - DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, "Default", hdvClass)); + DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, "Default", hdvClass).PowerDemand); var speed = 1400.RPMtoRad(); var torque = 500.SI<NewtonMeter>(); diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs index 25f0dc1d1985a3d49bc1c3f4a22d3cabc1b9eca9..ddd426858d7126ca1e641666b4e51043b656dc06 100644 --- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs +++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs @@ -29,778 +29,778 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Windows.Forms; -using System.Xml; -using System.Xml.Linq; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using TUGraz.VectoCommon.Exceptions; -using TUGraz.VectoCommon.Models; -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; -using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; -using TUGraz.VectoCore.OutputData; -using TUGraz.VectoCore.OutputData.FileIO; -using TUGraz.VectoCore.Tests.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Tests.XML -{ - [TestClass] - public class XMLDeclarationInputTest - { - const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml"; - const string SampleVehicleFullDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample_FULL.xml"; - - [TestMethod] - public void TestXMLInputEng() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - - var engineDataProvider = inputDataProvider.EngineInputData; - - Assert.IsTrue(engineDataProvider.SavedInDeclarationMode); - - Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model); - Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value()); - Assert.AreEqual(1.0097, engineDataProvider.WHTCUrban); - //AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.Inertia; }); - - var fcMapTable = engineDataProvider.FuelConsumptionMap; - Assert.AreEqual(112, fcMapTable.Rows.Count); - Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption); - Assert.AreEqual("torque", fcMapTable.Columns[1].Caption); - Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption); - - Assert.AreEqual("560.00", fcMapTable.Rows[0][0]); - var fcMap = FuelConsumptionMapReader.Create(fcMapTable); - Assert.AreEqual(1256.SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(), - fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); - - var fldTable = engineDataProvider.FullLoadCurve; - Assert.AreEqual(10, fldTable.Rows.Count); - 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 = FullLoadCurveReader.Create(fldTable, true); - } - - [TestMethod] - public void TestXMLInputGbx() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var gearboxDataProvider = inputDataProvider.GearboxInputData; - - Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model); - Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type); - var gears = gearboxDataProvider.Gears; - Assert.AreEqual(12, gears.Count); - - Assert.AreEqual(1, gears.First().Gear); - Assert.AreEqual(14.93, gears.First().Ratio); - Assert.AreEqual("0.00", gears.First().LossMap.Rows[0][0]); - Assert.AreEqual("-350.00", gears.First().LossMap.Rows[0][1]); - Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]); - - var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio, - gears.First().Gear.ToString()); - - Assert.AreEqual(5000, gears.First().MaxTorque.Value()); - } - - [TestMethod] - public void TestXMLInputAxlG() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var axlegearDataProvider = inputDataProvider.AxleGearInputData; - - Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model); - - var lossMapData = axlegearDataProvider.LossMap; - Assert.AreEqual(2.59, axlegearDataProvider.Ratio); - Assert.AreEqual("0.00", lossMapData.Rows[0][0]); - Assert.AreEqual("-5000.00", lossMapData.Rows[0][1]); - Assert.AreEqual("115.00", lossMapData.Rows[0][2]); - - var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear"); - Assert.IsNotNull(lossMap); - - AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; }); - } - - [TestMethod] - public void TestXMLInputRetarder() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var retarderDataProvider = inputDataProvider.RetarderInputData; - - Assert.AreEqual("Generic Retarder", retarderDataProvider.Model); - - var lossMapData = retarderDataProvider.LossMap; - - Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type); - - Assert.AreEqual("0.00", lossMapData.Rows[0][0]); - Assert.AreEqual("10.00", lossMapData.Rows[0][1]); - - var lossMap = RetarderLossMapReader.Create(lossMapData); - Assert.IsNotNull(lossMap); - } - - [TestMethod] - public void TestXMLInputAxleWheels() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var vehicleDataProvider = inputDataProvider.VehicleInputData; - - var axles = vehicleDataProvider.Axles; - - Assert.AreEqual("315/70 R22.5", axles[0].Wheels); - Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient); - Assert.AreEqual(31300, axles[0].TyreTestLoad.Value()); - - Assert.AreEqual("315/70 R22.5", axles[1].Wheels); - Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient); - Assert.AreEqual(31300, axles[1].TyreTestLoad.Value()); - } - - [TestMethod] - public void TestXMLInputAxleWheelsDuplicates() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var firstAxle = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_Components, - XMLNames.Component_AxleWheels, - XMLNames.ComponentDataWrapper, - XMLNames.AxleWheels_Axles, - helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty) - ), manager); - firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty); - firstAxle.SetTypedValue(2); - - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - var vehicleDataProvider = inputDataProvider.VehicleInputData; - - AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; }); - } - - [TestMethod] - public void TestXMLInputAxleWheelsAxleNumTooLow() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var firstAxle = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_Components, - XMLNames.Component_AxleWheels, - XMLNames.ComponentDataWrapper, - XMLNames.AxleWheels_Axles, - helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty) - ), manager); - firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty); - firstAxle.SetTypedValue(0); - - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - AssertHelper.Exception<VectoException>( - () => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); }); - } - - [TestMethod] - public void TestXMLInputAxleWheelsAxleNumTooHigh() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var firstAxle = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_Components, - XMLNames.Component_AxleWheels, - XMLNames.ComponentDataWrapper, - XMLNames.AxleWheels_Axles, - helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty) - ), manager); - firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty); - firstAxle.SetTypedValue(3); - - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - var vehicleDataProvider = inputDataProvider.VehicleInputData; - - AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; }); - } - - [TestMethod] - public void TestXMLInputAuxiliaries() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var auxDataProvider = inputDataProvider.AuxiliaryInputData(); - - var aux = auxDataProvider.Auxiliaries; - var aux1 = aux[0]; - - Assert.AreEqual(AuxiliaryType.Fan, aux1.Type); - Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux1.Technology.First()); - - var aux3 = aux[2]; - Assert.AreEqual(AuxiliaryType.ElectricSystem, aux3.Type); - Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First()); - } - - [TestMethod] - public void TestXMLInputADAS() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - - var adas = inputDataProvider.DriverInputData; - - Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode); - } - - [TestMethod] - public void TestVehicleInput() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - - var vehicleDataProvider = inputDataProvider.VehicleInputData; - - Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory); - Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration); - - Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value()); - Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value()); - Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value()); - - Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio); - } - - [TestMethod] - public void TestXMLPowertrainGeneration() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var fileWriter = new FileOutputWriter("foo"); - var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml"); - var sumData = new SummaryDataContainer(sumWriter); - var jobContainer = new JobContainer(sumData); - var dataProvider = new XMLDeclarationInputDataProvider(reader, true); - - var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter); - runsFactory.WriteModalResults = true; - - jobContainer.AddRuns(runsFactory); - - Assert.AreEqual(8, jobContainer.Runs.Count); - } - - [TestMethod] - public void TestFullFeaturedXMEngineering_TorqueConverter() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - - var tcDataProvider = inputDataProvider.TorqueConverterInputData; - - - Assert.AreEqual(3, tcDataProvider.TCData.Rows.Count); - Assert.AreEqual("300.00", tcDataProvider.TCData.Rows[0][2]); - Assert.AreEqual("0.90", tcDataProvider.TCData.Rows[2][1]); - } - - [TestMethod] - public void TestFullFeaturedXMLDeclaration_AngleDrive() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - - - var angledriveDataProvider = inputDataProvider.AngledriveInputData; - - Assert.AreEqual(2.345, angledriveDataProvider.Ratio); - Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count); - Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]); - - AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; }); - } - - [TestMethod] - public void TestVehicleInputData() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle; - - Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory); - Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration); - - Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value()); - Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value()); - Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value()); - - Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio); - } - - [TestMethod] - public void TestFullFeaturedXMLDeclaration_TorqueLimits() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle; - - var torqueLimits = vehicleDataProvider.TorqueLimits.OrderBy(x => x.Gear).ToList(); - Assert.AreEqual(3, torqueLimits.Count); - Assert.AreEqual(1, torqueLimits[0].Gear); - Assert.AreEqual(2500, torqueLimits[0].MaxTorque.Value()); - Assert.AreEqual(12, torqueLimits[2].Gear); - } - - [TestMethod] - public void TestFullFeaturedXMLDeclaration_GbxTorqueLimits() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var gearboxDataProvider = inputDataProvider.GearboxInputData; - var gears = gearboxDataProvider.Gears; - - Assert.AreEqual(12, gears.Count); - Assert.AreEqual(1900, gears[0].MaxTorque.Value()); - Assert.AreEqual(1900, gears[1].MaxTorque.Value()); - Assert.IsNull(gears[11].MaxTorque); - } - - [TestMethod] - public void TestFullFeaturedXMLDeclaration_GbxSpeedLimits() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var gearboxDataProvider = inputDataProvider.GearboxInputData; - var gears = gearboxDataProvider.Gears; - - Assert.AreEqual(12, gears.Count); - Assert.AreEqual(2000, gears[0].MaxInputSpeed.AsRPM, 1e-6); - Assert.AreEqual(2000, gears[1].MaxInputSpeed.AsRPM, 1e-6); - Assert.IsNull(gears[11].MaxInputSpeed); - } - - [TestMethod] - public void TestElementNotAvailable() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var retarderRatio = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_RetarderRatio), manager); - retarderRatio.DeleteSelf(); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - - AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.RetarderInputData.Ratio; }); - } - - [TestMethod] - public void TestRetarderTypeNone() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var retarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_RetarderType), manager); - retarderType.SetValue("None"); - - var retarder = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_Components, - XMLNames.Component_Retarder), manager); - retarder.DeleteSelf(); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - - var factory = new SimulatorFactory(ExecutionMode.Declaration, inputDataProvider, new FileOutputWriter("dummy")); - var jobContainer = new JobContainer(null); - jobContainer.AddRuns(factory); - jobContainer.Execute(); - } - - [TestMethod] - public void TestRetarderTypes() - { - var retarderTypes = new Dictionary<string, RetarderType>() { - { "None", RetarderType.None }, - { "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission }, - { "Engine Retarder", RetarderType.EngineRetarder }, - { "Transmission Input Retarder", RetarderType.TransmissionInputRetarder }, - { "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder } - } - ; - foreach (var retarderType in retarderTypes) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_RetarderType), manager); - xmlRetarderType.SetValue(retarderType.Key); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - - Assert.AreEqual(retarderType.Value, inputDataProvider.RetarderInputData.Type); - } - } - - [TestMethod] - public void TestAxleConfigurationTypes() - { - var axleConfigurations = new Dictionary<string, AxleConfiguration>() { - { "4x2", AxleConfiguration.AxleConfig_4x2 }, - //{ "4x4", AxleConfiguration.AxleConfig_4x4 }, - { "6x2", AxleConfiguration.AxleConfig_6x2 }, - { "6x4", AxleConfiguration.AxleConfig_6x4 }, - //{ "6x6", AxleConfiguration.AxleConfig_6x6 }, - //{ "8x2", AxleConfiguration.AxleConfig_8x2 }, - { "8x4", AxleConfiguration.AxleConfig_8x4 }, - //{ "8x6", AxleConfiguration.AxleConfig_8x6 }, - //{ "8x8", AxleConfiguration.AxleConfig_8x8 } - }; - foreach (var axleConfiguration in axleConfigurations) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_AxleConfiguration), manager); - xmlRetarderType.SetValue(axleConfiguration.Key); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - - Assert.AreEqual(axleConfiguration.Value, inputDataProvider.VehicleInputData.AxleConfiguration); - } - } - - [TestMethod] - public void TestVehicleCategoryTypes() - { - var vehicleCategories = new Dictionary<string, VehicleCategory>() { - { "Rigid Truck", VehicleCategory.RigidTruck }, - { "Tractor", VehicleCategory.Tractor }, - //{ "City Bus", VehicleCategory.CityBus }, - //{ "Interurban Bus", VehicleCategory.InterurbanBus }, - //{ "Coach", VehicleCategory.Coach } - }; - foreach (var vehicleCategory in vehicleCategories) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_VehicleCategory), manager); - xmlRetarderType.SetValue(vehicleCategory.Key); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); - - Assert.AreEqual(vehicleCategory.Value, inputDataProvider.VehicleInputData.VehicleCategory); - } - } - - - [TestMethod] - public void TestWheelsTypes() - { - var retarderTypes = new Dictionary<string, RetarderType>() { }; - foreach (var retarderType in retarderTypes) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, - Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_RetarderType), - manager); - xmlRetarderType.SetValue(retarderType.Key); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, - true); - - Assert.AreEqual(retarderType.Value, - inputDataProvider.RetarderInputData.Type); - } - } - - [TestMethod] - public void TestPTOTypeTypes() - { - var ptoTypes = new string[][] { - new[] { "none", "none" }, - new[] { "only one engaged gearwheel above oil level", "none" }, - new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" }, - new[] { "only the drive shaft of the PTO", "multi-disc clutch" }, - new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" }, - new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" }, - new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" }, - new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" }, - new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" }, - new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" }, - new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" }, - }; - foreach (var ptoType in ptoTypes) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, - Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_PTO, - XMLNames.Vehicle_PTO_ShaftsGearWheels), - manager); - ptoGearWheels.SetValue(ptoType[0]); - var ptoOther = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, - Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_PTO, - XMLNames.Vehicle_PTO_OtherElements), - manager); - ptoOther.SetValue(ptoType[1]); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, - true); - - if (ptoType[0] == "none") { - Assert.AreEqual("None", - inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); - } else if (ptoType[0] == "only one engaged gearwheel above oil level") { - Assert.AreEqual(ptoType[0], - inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); - } else { - Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]), - inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); - } - DeclarationData.PTOTransmission.Lookup(inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); - } - } - - [TestMethod] - public void TestAngledriveTypes() - { - var angledriveTypes = new Dictionary<string, AngledriveType>() { - { "None", AngledriveType.None }, - { "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox }, - { "Separate Angledrive", AngledriveType.SeparateAngledrive } - }; - foreach (var angleDrive in angledriveTypes) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, - Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_AngledriveType), - manager); - xmlRetarderType.SetValue(angleDrive.Key); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, - true); - - Assert.AreEqual(angleDrive.Value, inputDataProvider.AngledriveInputData.Type); - } - } - - [TestMethod] - public void TestGearboxTypes() - { - var gearboxTypes = new Dictionary<string, GearboxType>() { - { "SMT", GearboxType.MT }, - { "AMT", GearboxType.AMT }, - { "APT-S", GearboxType.ATSerial }, - { "APT-P", GearboxType.ATPowerSplit } - }; - foreach (var gearboxType in gearboxTypes) { - var reader = XmlReader.Create(SampleVehicleDecl); - - var doc = new XmlDocument(); - doc.Load(reader); - var nav = doc.CreateNavigator(); - var manager = new XmlNamespaceManager(nav.NameTable); - var helper = new XPathHelper(ExecutionMode.Declaration); - helper.AddNamespaces(manager); - - var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( - helper.NSPrefix(XMLNames.VectoInputDeclaration, - Constants.XML.RootNSPrefix), - XMLNames.Component_Vehicle, - XMLNames.Vehicle_Components, - XMLNames.Component_Gearbox, - XMLNames.ComponentDataWrapper, - XMLNames.Gearbox_TransmissionType), - manager); - xmlRetarderType.SetValue(gearboxType.Key); - - var modified = XmlReader.Create(new StringReader(nav.OuterXml)); - - var inputDataProvider = new XMLDeclarationInputDataProvider(modified, - true); - - Assert.AreEqual(gearboxType.Value, inputDataProvider.GearboxInputData.Type); - } - } - - [TestMethod] - public void TestPTOInputNone() - { - var reader = XmlReader.Create(SampleVehicleDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var ptoDataProvider = inputDataProvider.PTOTransmissionInputData; - - Assert.AreEqual("None", ptoDataProvider.PTOTransmissionType); - } - - [TestMethod] - public void TestPTOInput() - { - var reader = XmlReader.Create(SampleVehicleFullDecl); - - var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); - var ptoDataProvider = inputDataProvider.PTOTransmissionInputData; - var ptoLosses = DeclarationData.PTOTransmission.Lookup(ptoDataProvider.PTOTransmissionType); - - Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoDataProvider.PTOTransmissionType); - Assert.AreEqual(1000, ptoLosses.Value()); - } - } +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Models; +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; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using TUGraz.VectoCore.OutputData; +using TUGraz.VectoCore.OutputData.FileIO; +using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Tests.XML +{ + [TestClass] + public class XMLDeclarationInputTest + { + const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml"; + const string SampleVehicleFullDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample_FULL.xml"; + + [TestMethod] + public void TestXMLInputEng() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + + var engineDataProvider = inputDataProvider.EngineInputData; + + Assert.IsTrue(engineDataProvider.SavedInDeclarationMode); + + Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model); + Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value()); + Assert.AreEqual(1.0097, engineDataProvider.WHTCUrban); + //AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.Inertia; }); + + var fcMapTable = engineDataProvider.FuelConsumptionMap; + Assert.AreEqual(112, fcMapTable.Rows.Count); + Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption); + Assert.AreEqual("torque", fcMapTable.Columns[1].Caption); + Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption); + + Assert.AreEqual("560.00", fcMapTable.Rows[0][0]); + var fcMap = FuelConsumptionMapReader.Create(fcMapTable); + Assert.AreEqual(1256.SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(), + fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value()); + + var fldTable = engineDataProvider.FullLoadCurve; + Assert.AreEqual(10, fldTable.Rows.Count); + 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 = FullLoadCurveReader.Create(fldTable, true); + } + + [TestMethod] + public void TestXMLInputGbx() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var gearboxDataProvider = inputDataProvider.GearboxInputData; + + Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model); + Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type); + var gears = gearboxDataProvider.Gears; + Assert.AreEqual(12, gears.Count); + + Assert.AreEqual(1, gears.First().Gear); + Assert.AreEqual(14.93, gears.First().Ratio); + Assert.AreEqual("0.00", gears.First().LossMap.Rows[0][0]); + Assert.AreEqual("-350.00", gears.First().LossMap.Rows[0][1]); + Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]); + + var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio, + gears.First().Gear.ToString()); + + Assert.AreEqual(5000, gears.First().MaxTorque.Value()); + } + + [TestMethod] + public void TestXMLInputAxlG() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var axlegearDataProvider = inputDataProvider.AxleGearInputData; + + Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model); + + var lossMapData = axlegearDataProvider.LossMap; + Assert.AreEqual(2.59, axlegearDataProvider.Ratio); + Assert.AreEqual("0.00", lossMapData.Rows[0][0]); + Assert.AreEqual("-5000.00", lossMapData.Rows[0][1]); + Assert.AreEqual("115.00", lossMapData.Rows[0][2]); + + var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear"); + Assert.IsNotNull(lossMap); + + AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; }); + } + + [TestMethod] + public void TestXMLInputRetarder() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var retarderDataProvider = inputDataProvider.RetarderInputData; + + Assert.AreEqual("Generic Retarder", retarderDataProvider.Model); + + var lossMapData = retarderDataProvider.LossMap; + + Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type); + + Assert.AreEqual("0.00", lossMapData.Rows[0][0]); + Assert.AreEqual("10.00", lossMapData.Rows[0][1]); + + var lossMap = RetarderLossMapReader.Create(lossMapData); + Assert.IsNotNull(lossMap); + } + + [TestMethod] + public void TestXMLInputAxleWheels() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var vehicleDataProvider = inputDataProvider.VehicleInputData; + + var axles = vehicleDataProvider.Axles; + + Assert.AreEqual("315/70 R22.5", axles[0].Wheels); + Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient); + Assert.AreEqual(31300, axles[0].TyreTestLoad.Value()); + + Assert.AreEqual("315/70 R22.5", axles[1].Wheels); + Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient); + Assert.AreEqual(31300, axles[1].TyreTestLoad.Value()); + } + + [TestMethod] + public void TestXMLInputAxleWheelsDuplicates() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var firstAxle = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_Components, + XMLNames.Component_AxleWheels, + XMLNames.ComponentDataWrapper, + XMLNames.AxleWheels_Axles, + helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty) + ), manager); + firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty); + firstAxle.SetTypedValue(2); + + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + var vehicleDataProvider = inputDataProvider.VehicleInputData; + + AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; }); + } + + [TestMethod] + public void TestXMLInputAxleWheelsAxleNumTooLow() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var firstAxle = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_Components, + XMLNames.Component_AxleWheels, + XMLNames.ComponentDataWrapper, + XMLNames.AxleWheels_Axles, + helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty) + ), manager); + firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty); + firstAxle.SetTypedValue(0); + + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + AssertHelper.Exception<VectoException>( + () => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); }); + } + + [TestMethod] + public void TestXMLInputAxleWheelsAxleNumTooHigh() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var firstAxle = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_Components, + XMLNames.Component_AxleWheels, + XMLNames.ComponentDataWrapper, + XMLNames.AxleWheels_Axles, + helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty) + ), manager); + firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty); + firstAxle.SetTypedValue(3); + + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + var vehicleDataProvider = inputDataProvider.VehicleInputData; + + AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; }); + } + + [TestMethod] + public void TestXMLInputAuxiliaries() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var auxDataProvider = inputDataProvider.AuxiliaryInputData(); + + var aux = auxDataProvider.Auxiliaries; + var aux1 = aux[0]; + + Assert.AreEqual(AuxiliaryType.Fan, aux1.Type); + Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux1.Technology.First()); + + var aux3 = aux[2]; + Assert.AreEqual(AuxiliaryType.ElectricSystem, aux3.Type); + Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First()); + } + + [TestMethod] + public void TestXMLInputADAS() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + + var adas = inputDataProvider.DriverInputData; + + Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode); + } + + [TestMethod] + public void TestVehicleInput() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + + var vehicleDataProvider = inputDataProvider.VehicleInputData; + + Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory); + Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration); + + Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value()); + Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value()); + Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value()); + + Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio); + } + + [TestMethod] + public void TestXMLPowertrainGeneration() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var fileWriter = new FileOutputWriter("foo"); + var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml"); + var sumData = new SummaryDataContainer(sumWriter); + var jobContainer = new JobContainer(sumData); + var dataProvider = new XMLDeclarationInputDataProvider(reader, true); + + var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter); + runsFactory.WriteModalResults = true; + + jobContainer.AddRuns(runsFactory); + + Assert.AreEqual(8, jobContainer.Runs.Count); + } + + [TestMethod] + public void TestFullFeaturedXMEngineering_TorqueConverter() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + + var tcDataProvider = inputDataProvider.TorqueConverterInputData; + + + Assert.AreEqual(3, tcDataProvider.TCData.Rows.Count); + Assert.AreEqual("300.00", tcDataProvider.TCData.Rows[0][2]); + Assert.AreEqual("0.90", tcDataProvider.TCData.Rows[2][1]); + } + + [TestMethod] + public void TestFullFeaturedXMLDeclaration_AngleDrive() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + + + var angledriveDataProvider = inputDataProvider.AngledriveInputData; + + Assert.AreEqual(2.345, angledriveDataProvider.Ratio); + Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count); + Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]); + + AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; }); + } + + [TestMethod] + public void TestVehicleInputData() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle; + + Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory); + Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration); + + Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value()); + Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value()); + Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value()); + + Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio); + } + + [TestMethod] + public void TestFullFeaturedXMLDeclaration_TorqueLimits() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle; + + var torqueLimits = vehicleDataProvider.TorqueLimits.OrderBy(x => x.Gear).ToList(); + Assert.AreEqual(3, torqueLimits.Count); + Assert.AreEqual(1, torqueLimits[0].Gear); + Assert.AreEqual(2500, torqueLimits[0].MaxTorque.Value()); + Assert.AreEqual(12, torqueLimits[2].Gear); + } + + [TestMethod] + public void TestFullFeaturedXMLDeclaration_GbxTorqueLimits() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var gearboxDataProvider = inputDataProvider.GearboxInputData; + var gears = gearboxDataProvider.Gears; + + Assert.AreEqual(12, gears.Count); + Assert.AreEqual(1900, gears[0].MaxTorque.Value()); + Assert.AreEqual(1900, gears[1].MaxTorque.Value()); + Assert.IsNull(gears[11].MaxTorque); + } + + [TestMethod] + public void TestFullFeaturedXMLDeclaration_GbxSpeedLimits() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var gearboxDataProvider = inputDataProvider.GearboxInputData; + var gears = gearboxDataProvider.Gears; + + Assert.AreEqual(12, gears.Count); + Assert.AreEqual(2000, gears[0].MaxInputSpeed.AsRPM, 1e-6); + Assert.AreEqual(2000, gears[1].MaxInputSpeed.AsRPM, 1e-6); + Assert.IsNull(gears[11].MaxInputSpeed); + } + + [TestMethod] + public void TestElementNotAvailable() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var retarderRatio = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_RetarderRatio), manager); + retarderRatio.DeleteSelf(); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + + AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.RetarderInputData.Ratio; }); + } + + [TestMethod] + public void TestRetarderTypeNone() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var retarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_RetarderType), manager); + retarderType.SetValue("None"); + + var retarder = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_Components, + XMLNames.Component_Retarder), manager); + retarder.DeleteSelf(); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + + var factory = new SimulatorFactory(ExecutionMode.Declaration, inputDataProvider, new FileOutputWriter("dummy")); + var jobContainer = new JobContainer(null); + jobContainer.AddRuns(factory); + jobContainer.Execute(); + } + + [TestMethod] + public void TestRetarderTypes() + { + var retarderTypes = new Dictionary<string, RetarderType>() { + { "None", RetarderType.None }, + { "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission }, + { "Engine Retarder", RetarderType.EngineRetarder }, + { "Transmission Input Retarder", RetarderType.TransmissionInputRetarder }, + { "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder } + } + ; + foreach (var retarderType in retarderTypes) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_RetarderType), manager); + xmlRetarderType.SetValue(retarderType.Key); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + + Assert.AreEqual(retarderType.Value, inputDataProvider.RetarderInputData.Type); + } + } + + [TestMethod] + public void TestAxleConfigurationTypes() + { + var axleConfigurations = new Dictionary<string, AxleConfiguration>() { + { "4x2", AxleConfiguration.AxleConfig_4x2 }, + //{ "4x4", AxleConfiguration.AxleConfig_4x4 }, + { "6x2", AxleConfiguration.AxleConfig_6x2 }, + { "6x4", AxleConfiguration.AxleConfig_6x4 }, + //{ "6x6", AxleConfiguration.AxleConfig_6x6 }, + //{ "8x2", AxleConfiguration.AxleConfig_8x2 }, + { "8x4", AxleConfiguration.AxleConfig_8x4 }, + //{ "8x6", AxleConfiguration.AxleConfig_8x6 }, + //{ "8x8", AxleConfiguration.AxleConfig_8x8 } + }; + foreach (var axleConfiguration in axleConfigurations) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_AxleConfiguration), manager); + xmlRetarderType.SetValue(axleConfiguration.Key); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + + Assert.AreEqual(axleConfiguration.Value, inputDataProvider.VehicleInputData.AxleConfiguration); + } + } + + [TestMethod] + public void TestVehicleCategoryTypes() + { + var vehicleCategories = new Dictionary<string, VehicleCategory>() { + { "Rigid Truck", VehicleCategory.RigidTruck }, + { "Tractor", VehicleCategory.Tractor }, + //{ "City Bus", VehicleCategory.CityBus }, + //{ "Interurban Bus", VehicleCategory.InterurbanBus }, + //{ "Coach", VehicleCategory.Coach } + }; + foreach (var vehicleCategory in vehicleCategories) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_VehicleCategory), manager); + xmlRetarderType.SetValue(vehicleCategory.Key); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); + + Assert.AreEqual(vehicleCategory.Value, inputDataProvider.VehicleInputData.VehicleCategory); + } + } + + + [TestMethod] + public void TestWheelsTypes() + { + var retarderTypes = new Dictionary<string, RetarderType>() { }; + foreach (var retarderType in retarderTypes) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, + Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_RetarderType), + manager); + xmlRetarderType.SetValue(retarderType.Key); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, + true); + + Assert.AreEqual(retarderType.Value, + inputDataProvider.RetarderInputData.Type); + } + } + + [TestMethod] + public void TestPTOTypeTypes() + { + var ptoTypes = new string[][] { + new[] { "none", "none" }, + new[] { "only one engaged gearwheel above oil level", "none" }, + new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" }, + new[] { "only the drive shaft of the PTO", "multi-disc clutch" }, + new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" }, + new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" }, + new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" }, + new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" }, + new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" }, + new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" }, + new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" }, + }; + foreach (var ptoType in ptoTypes) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, + Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_PTO, + XMLNames.Vehicle_PTO_ShaftsGearWheels), + manager); + ptoGearWheels.SetValue(ptoType[0]); + var ptoOther = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, + Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_PTO, + XMLNames.Vehicle_PTO_OtherElements), + manager); + ptoOther.SetValue(ptoType[1]); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, + true); + + if (ptoType[0] == "none") { + Assert.AreEqual("None", + inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); + } else if (ptoType[0] == "only one engaged gearwheel above oil level") { + Assert.AreEqual(ptoType[0], + inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); + } else { + Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]), + inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); + } + DeclarationData.PTOTransmission.Lookup(inputDataProvider.PTOTransmissionInputData.PTOTransmissionType); + } + } + + [TestMethod] + public void TestAngledriveTypes() + { + var angledriveTypes = new Dictionary<string, AngledriveType>() { + { "None", AngledriveType.None }, + { "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox }, + { "Separate Angledrive", AngledriveType.SeparateAngledrive } + }; + foreach (var angleDrive in angledriveTypes) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, + Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_AngledriveType), + manager); + xmlRetarderType.SetValue(angleDrive.Key); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, + true); + + Assert.AreEqual(angleDrive.Value, inputDataProvider.AngledriveInputData.Type); + } + } + + [TestMethod] + public void TestGearboxTypes() + { + var gearboxTypes = new Dictionary<string, GearboxType>() { + { "SMT", GearboxType.MT }, + { "AMT", GearboxType.AMT }, + { "APT-S", GearboxType.ATSerial }, + { "APT-P", GearboxType.ATPowerSplit } + }; + foreach (var gearboxType in gearboxTypes) { + var reader = XmlReader.Create(SampleVehicleDecl); + + var doc = new XmlDocument(); + doc.Load(reader); + var nav = doc.CreateNavigator(); + var manager = new XmlNamespaceManager(nav.NameTable); + var helper = new XPathHelper(ExecutionMode.Declaration); + helper.AddNamespaces(manager); + + var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs( + helper.NSPrefix(XMLNames.VectoInputDeclaration, + Constants.XML.RootNSPrefix), + XMLNames.Component_Vehicle, + XMLNames.Vehicle_Components, + XMLNames.Component_Gearbox, + XMLNames.ComponentDataWrapper, + XMLNames.Gearbox_TransmissionType), + manager); + xmlRetarderType.SetValue(gearboxType.Key); + + var modified = XmlReader.Create(new StringReader(nav.OuterXml)); + + var inputDataProvider = new XMLDeclarationInputDataProvider(modified, + true); + + Assert.AreEqual(gearboxType.Value, inputDataProvider.GearboxInputData.Type); + } + } + + [TestMethod] + public void TestPTOInputNone() + { + var reader = XmlReader.Create(SampleVehicleDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var ptoDataProvider = inputDataProvider.PTOTransmissionInputData; + + Assert.AreEqual("None", ptoDataProvider.PTOTransmissionType); + } + + [TestMethod] + public void TestPTOInput() + { + var reader = XmlReader.Create(SampleVehicleFullDecl); + + var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true); + var ptoDataProvider = inputDataProvider.PTOTransmissionInputData; + var lookup = DeclarationData.PTOTransmission.Lookup(ptoDataProvider.PTOTransmissionType); + + Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoDataProvider.PTOTransmissionType); + Assert.AreEqual(1000, lookup.PowerDemand.Value()); + } + } } \ No newline at end of file