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

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

implementing vehicle, reading required declaration data

TODO: Crosswind correction (new method according to acea whitebook)
parent 9cd71741
No related branches found
No related tags found
No related merge requests found
Showing
with 622 additions and 492 deletions
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.FileIO
{
// public class VehicleFileDeclaration
// {
public class VehicleFileV5Declaration
{
[JsonProperty(Required = Required.Always)] public JsonDataHeader Header;
[JsonProperty(Required = Required.Always)] public DataBodyDecl Body;
//public void SetProperties(VehicleData vehicleData)
//{
// vehicleData.AxleConfiguration = AxleConfiguration.AxleConfig4x2;
// vehicleData.Retarder = new RetarderData(Body.Retarder, vehicleData.BasePath);
// vehicleData.AxleData = new List<VehicleData.Axle>(Body.AxleConfig.Axles.Count);
// var RRC = 0.0;
// var mRed0 = 0.SI<Kilogram>();
// foreach (var axleData in Body.AxleConfig.Axles) {
// var axle = new VehicleData.Axle(axleData);
// if (axle.RollResistanceCoefficient < 0) {
// throw new VectoException("Axle roll resistance coefficient < 0");
// }
// if (axle.TyreTestLoad <= 0) {
// throw new VectoException("Axle tyre test load (FzISO) must be greater than 0!");
// }
// var nrWheels = axle.TwinTyres ? 4 : 2;
// RRC += axle.AxleWeightShare * axle.RollResistanceCoefficient *
// Math.Pow(
// (axle.AxleWeightShare * vehicleData.TotalVehicleWeight() * Physics.GravityAccelleration / axle.TyreTestLoad /
// nrWheels).Double(), Physics.RollResistanceExponent - 1);
// mRed0 += nrWheels * (axle.Inertia / vehicleData.DynamicTyreRadius / vehicleData.DynamicTyreRadius).Cast<Kilogram>();
// vehicleData._axleData.Add(axle);
// }
// vehicleData.TotalRollResistanceCoefficient = RRC;
// vehicleData.ReducedMassWheels = mRed0;
// vehicleData.VehicleCategory = Enum.Parse(typeof (VehicleCategory), Body.VehicleCategoryStr, true);
// //switch (Body.CrossWindCorrectionModeStr) {
// // case "CdOfBeta":
// // vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.VAirBeta;
// // break;
// // case "CdOfV":
// // vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependent;
// // break;
// // default:
// // vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection;
// // break;
// //}
//}
public class DataBodyDecl
{
[JsonProperty("SavedInDeclMode", Required = Required.Always)] public bool SavedInDeclarationMode;
[JsonProperty("VehCat", Required = Required.Always)] public string VehicleCategoryStr;
public VehicleCategory VehicleCategory()
{
return (VehicleCategory) Enum.Parse(typeof (VehicleCategory), VehicleCategoryStr, true);
}
[JsonProperty(Required = Required.Always)] public double CurbWeight;
//[JsonProperty]
//public double CurbWeightExtra;
//[JsonProperty]
//public double Loading;
[JsonProperty("MassMax", Required = Required.Always)] public double GrossVehicleMassRating;
[JsonProperty("Cd", Required = Required.Always)] public double DragCoefficient;
[JsonProperty("CrossSecArea", Required = Required.Always)] public double CrossSectionArea;
[JsonProperty("Cd2")] public double DragCoefficientRigidTruck; // without trailer
[JsonProperty("CrossSecArea2")] public double CrossSectionAreaRigidTruck;
//[JsonProperty("rdyn")]
//public double DynamicTyreRadius;
[JsonProperty("Rim", Required = Required.Always)] public string RimStr;
//[JsonProperty("CdCorrMode")]
//public string CrossWindCorrectionModeStr;
//[JsonProperty("CdCorrFile")]
//public string CrossWindCorrectionFile;
[JsonProperty("Retarder", Required = Required.Always)] public RetarderData.Data Retarder;
[JsonProperty(Required = Required.Always)] public AxleConfigData AxleConfig;
public class AxleConfigData
{
[JsonProperty("Type", Required = Required.Always)] public string TypeStr;
[JsonProperty(Required = Required.Always)] public IList<AxleDataDecl> Axles;
}
public class AxleDataDecl
{
//[JsonProperty]
//public double Inertia;
[JsonProperty(Required = Required.Always)] public string WheelsStr;
//[JsonProperty(Required = Required.Always)]
//public double AxleWeightShare;
[JsonProperty(Required = Required.Always)] public bool TwinTyres;
[JsonProperty("RRCISO", Required = Required.Always)] public double RollResistanceCoefficient;
[JsonProperty("FzISO", Required = Required.Always)] public double TyreTestLoad;
}
}
}
// }
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.FileIO
{
// class VehicleFileEngineering
// {
public class VehicleFileV5Engineering : VehicleFileV5Declaration
{
// [JsonProperty(Required = Required.Always)] public JsonDataHeader Header;
[JsonProperty(Required = Required.Always)] public new DataBodyEng Body;
//public void SetProperties(VehicleData vehicleData)
//{
// vehicleData._axleConfiguration = VehicleData.AxleConfiguration.AxleConfig4x2;
// vehicleData._retarder = new RetarderData(Body.Retarder, vehicleData.BasePath);
// vehicleData._axleData = new List<VehicleData.Axle>(Body.AxleConfig.Axles.Count);
// var RRC = 0.0;
// var mRed0 = 0.SI<Kilogram>();
// foreach (var axleData in Body.AxleConfig.Axles) {
// var axle = new VehicleData.Axle(axleData);
// if (axle.RollResistanceCoefficient < 0) {
// throw new VectoException("Axle roll resistance coefficient < 0");
// }
// if (axle.TyreTestLoad <= 0) {
// throw new VectoException("Axle tyre test load (FzISO) must be greater than 0!");
// }
// var nrWheels = axle.TwinTyres ? 4 : 2;
// RRC += axle.AxleWeightShare * axle.RollResistanceCoefficient *
// Math.Pow(
// (axle.AxleWeightShare * vehicleData.TotalVehicleWeight() * Physics.GravityAccelleration / axle.TyreTestLoad /
// nrWheels).Double(), Physics.RollResistanceExponent - 1);
// mRed0 += nrWheels * (axle.Inertia / vehicleData.DynamicTyreRadius / vehicleData.DynamicTyreRadius).Cast<Kilogram>();
// vehicleData._axleData.Add(axle);
// }
// vehicleData.TotalRollResistanceCoefficient = RRC;
// vehicleData.ReducedMassWheels = mRed0;
// switch (Body.VehicleCategoryStr) {
// case "RigidTruck":
// vehicleData.Category = VehicleData.VehicleCategory.RigidTruck;
// break;
// case "Tractor":
// vehicleData.Category = VehicleData.VehicleCategory.Tractor;
// break;
// case "CityBus":
// vehicleData.Category = VehicleData.VehicleCategory.CityBus;
// break;
// case "InterurbanBus":
// vehicleData.Category = VehicleData.VehicleCategory.InterurbanBus;
// break;
// case "Coach":
// vehicleData.Category = VehicleData.VehicleCategory.Coach;
// break;
// }
// switch (Body.CrossWindCorrectionModeStr) {
// case "CdOfBeta":
// vehicleData._crossWindCorrectionMode = VehicleData.CrossWindCorrectionMode.VAirBeta;
// break;
// case "CdOfV":
// vehicleData._crossWindCorrectionMode = VehicleData.CrossWindCorrectionMode.SpeedDependent;
// break;
// default:
// vehicleData._crossWindCorrectionMode = VehicleData.CrossWindCorrectionMode.NoCorrection;
// break;
// }
//}
public class DataBodyEng : DataBodyDecl
{
//[JsonProperty("SavedInDeclMode")] public bool SavedInDeclarationMode;
//[JsonProperty("VehCat", Required = Required.Always)] public string VehicleCategoryStr;
//[JsonProperty(Required = Required.Always)] public double CurbWeight;
[JsonProperty] public double CurbWeightExtra;
[JsonProperty] public double Loading;
//[JsonProperty("MassMax", Required = Required.Always)] public double GrossVehicleMassRating;
//[JsonProperty("Cd2")] public double DragCoefficientRigidTruck; // without trailer
//[JsonProperty("CrossSecArea2")] public double CrossSectionAreaRigidTruck;
//[JsonProperty("Cd", Required = Required.Always)] public double DragCoefficient;
//[JsonProperty("CrossSecArea", Required = Required.Always)] public double CrossSectionArea;
[JsonProperty("rdyn")] public double DynamicTyreRadius;
//[JsonProperty("Rim")] public string RimStr;
[JsonProperty("CdCorrMode")] public string CrossWindCorrectionModeStr;
[JsonProperty("CdCorrFile")] public string CrossWindCorrectionFile;
//[JsonProperty("Retarder", Required = Required.Always)] public RetarderData.Data Retarder;
[JsonProperty(Required = Required.Always)] public new AxleConfigData AxleConfig;
public new class AxleConfigData
{
[JsonProperty("Type", Required = Required.Always)] public string TypeStr;
[JsonProperty(Required = Required.Always)] public IList<AxleDataEng> Axles;
}
public class AxleDataEng : AxleDataDecl
{
[JsonProperty] public double Inertia;
// [JsonProperty] public string WheelsStr;
[JsonProperty] public double AxleWeightShare;
// [JsonProperty(Required = Required.Always)] public bool TwinTyres;
// [JsonProperty("RRCISO", Required = Required.Always)] public double RollResistanceCoefficient;
// [JsonProperty("FzISO", Required = Required.Always)] public double TyreTestLoad;
}
}
}
}
//}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Data;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Resources.Declaration
{
public abstract class LookupData<TEntryType>
{
protected Dictionary<String, TEntryType> _data;
protected DataTable ReadCsvFile(string resourceId)
{
var myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
var file = myAssembly.GetManifestResourceStream(resourceId);
return VectoCSVFile.ReadStream(file);
}
protected abstract void ParseData(DataTable table);
public TEntryType Lookup(String key)
{
var retVal = default(TEntryType);
if (_data.ContainsKey(key)) {
retVal = _data[key];
}
return retVal;
}
}
}
\ No newline at end of file
using System;
using System.Data;
using System.Linq;
using TUGraz.VectoCore.Resources.Declaration;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Declaration
{
public class Rims : LookupData<Rims.RimsEntry>
{
private const string ResourceId = "TUGraz.VectoCore.Resources.Declaration.Rims.csv";
internal Rims()
{
var csvFile = ReadCsvFile(ResourceId);
ParseData(csvFile);
}
protected override sealed void ParseData(DataTable table)
{
_data = (from DataRow row in table.Rows
select new RimsEntry {
RimsType = row[0].ToString(),
F_a = row.ParseDouble(1),
F_b = row.ParseDouble(2),
}).ToDictionary(e => e.RimsType);
}
public class RimsEntry
{
public string RimsType;
public double F_a;
public double F_b;
}
}
}
\ No newline at end of file
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Resources.Declaration;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Declaration
{
public class Wheels : LookupData<Wheels.WheelsEntry>
{
private const string ResourceId = "TUGraz.VectoCore.Resources.Declaration.Wheels.csv";
internal Wheels()
{
var csvFile = ReadCsvFile(ResourceId);
ParseData(csvFile);
}
protected override sealed void ParseData(DataTable table)
{
_data = (from DataRow row in table.Rows
select new WheelsEntry {
WheelType = row[0].ToString(),
Inertia = row.ParseDouble(1).SI<KilogramSquareMeter>(),
DynamicTyreRadius = row.ParseDouble(2).SI().Milli.Meter.Cast<Meter>(),
SizeClass = Int32.Parse(row[3].ToString())
}).ToDictionary(e => e.WheelType);
}
public class WheelsEntry
{
public string WheelType;
public KilogramSquareMeter Inertia;
public Meter DynamicTyreRadius;
public int SizeClass;
}
}
}
\ No newline at end of file
using TUGraz.VectoCore.Models.Declaration;
namespace TUGraz.VectoCore.Models
{
public class DeclarationData
{
private static DeclarationData _instance;
public readonly Wheels Wheels;
public readonly Rims Rims;
private DeclarationData()
{
Wheels = new Wheels();
Rims = new Rims();
}
public static DeclarationData Instance()
{
return _instance ?? (_instance = new DeclarationData());
}
}
}
\ No newline at end of file
using System.IO;
using System.Security.AccessControl;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.DeclarationData
{
public class Wheels
{
private static Wheels _instance;
private const string ResourceId = "DeclarationWheels";
protected Wheels()
{
System.Reflection.Assembly myAssembly;
//myAssembly = this.GetType().Assembly;
myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
string[] resources = myAssembly.GetManifestResourceNames();
string list = "";
foreach (string resource in resources) {
list += resource + "\r\n";
}
//System.Resources.ResourceManager myManager = new System.Resources.ResourceManager("TUGraz.VectoCore.Resources.Declaration.Wheels.csv", myAssembly);
System.IO.Stream file =
myAssembly.GetManifestResourceStream("TUGraz.VectoCore.Resources.Declaration.Wheels.csv");
var csvFile = VectoCSVFile.ReadStream(file);
}
public static Wheels Instance()
{
if (_instance == null) {
_instance = new Wheels();
}
return _instance;
}
}
}
\ No newline at end of file
......@@ -84,9 +84,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <summary>
/// [kgm^2]
/// </summary>
public SI Inertia
public KilogramSquareMeter Inertia
{
get { return _data.Body.Inertia.SI().Kilo.Gramm.Square.Meter; }
get { return _data.Body.Inertia.SI<KilogramSquareMeter>(); }
protected set { _data.Body.Inertia = (double) value.ConvertTo().Kilo.Gramm.Square.Meter; }
}
......
......@@ -203,9 +203,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
/// <summary>
/// kgm^2
/// </summary>
public SI Inertia
public KilogramSquareMeter Inertia
{
get { return _data.Body.Inertia.SI().Kilo.Gramm.Square.Meter; }
get { return _data.Body.Inertia.SI<KilogramSquareMeter>(); }
protected set { _data.Body.Inertia = (double) value.ConvertTo().Kilo.Gramm.Square.Meter; }
}
......
......@@ -14,10 +14,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
}
protected static int GetFileVersion(string jsonStr)
protected static Tuple<int, bool> GetFileVersion(string jsonStr)
{
dynamic json = JsonConvert.DeserializeObject(jsonStr);
return json.Header.FileVersion;
return new Tuple<int, bool>(json.Header.FileVersion, json.Body.SavedinDeclMode);
}
}
}
\ No newline at end of file
......@@ -5,482 +5,166 @@ using System.IO;
using System.Runtime.Serialization;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.FileIO;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Data
{
public class VehicleData : SimulationComponentData
public enum VehicleCategory
{
public enum VehicleCategory
{
RigidTruck,
Tractor,
CityBus,
InterurbanBus,
Coach
}
RigidTruck,
Tractor,
CityBus,
InterurbanBus,
Coach
}
public enum CrossWindCorrectionMode
{
NoCorrection,
SpeedDependent,
VAirBeta
}
public enum CrossWindCorrectionMode
{
NoCorrection,
SpeedDependent,
VAirBeta
}
public enum AxleConfiguration
{
AxleConfig4x2,
AxleConfig4x4,
AxleConfig6x2,
AxleConfig6x4,
AxleConfig6x6,
AxleConfig8x2,
AxleConfig8x4,
AxleConfig8x6,
AxleConfig8x8,
}
public enum AxleConfiguration
{
AxleConfig4x2,
AxleConfig4x4,
AxleConfig6x2,
AxleConfig6x4,
AxleConfig6x6,
AxleConfig8x2,
AxleConfig8x4,
AxleConfig8x6,
AxleConfig8x8,
}
[DataMember] private DataV5Engineering _data;
public class VehicleData : SimulationComponentData
{
//public static VehicleData ReadFromFile(string fileName)
//{
// return ReadFromJson(File.ReadAllText(fileName), Path.GetDirectoryName(fileName));
//}
[DataMember]
protected DataV5Engineering Data
{
get { return _data; }
set
{
_data = value;
_data.SetProperties(this);
}
}
[DataMember] private CrossWindCorrectionMode _crossWindCorrectionMode;
//public static VehicleData ReadFromJson(string json, string basePath = "")
//{
// //var vehicleData = new VehicleData(basePath);
[DataMember] private RetarderData _retarder;
// var fileInfo = GetFileVersion(json);
// switch (fileInfo.Item1) {
// case 5:
// if (fileInfo.Item2) {
// var data = JsonConvert.DeserializeObject<VehicleFileV5Declaration>(json);
// return new VehicleData(basePath, data);
// } else {
// var data = JsonConvert.DeserializeObject<VehicleFileV5Engineering>(json);
// return new VehicleData(basePath, data);
// }
// //vehicleData.Data = data;
// default:
// throw new UnsupportedFileVersionException("Unsupported Version of .vveh file. Got Version " + fileInfo.Item1);
// }
[DataMember] private List<Axle> _axleData;
// //return null;
//}
[DataMember] private AxleConfiguration _axleConfiguration;
[DataMember]
public string BasePath { get; protected set; }
//protected VehicleData(string basePath, VehicleFileV5Declaration data)
//{
// BasePath = basePath;
// SetGenericData(data.Body);
//}
protected VehicleData(string basePath)
{
BasePath = basePath;
}
//protected VehicleData(string basePath, VehicleFileV5Engineering data)
//{
// BasePath = basePath;
// SetGenericData(data.Body);
//}
public bool SavedInDeclarationMode
protected void SetGenericData(VehicleFileV5Declaration.DataBodyDecl data)
{
get { return _data.Body.SavedInDeclarationMode; }
set { _data.Body.SavedInDeclarationMode = value; }
SavedInDeclarationMode = data.SavedInDeclarationMode;
VehicleCategory = data.VehicleCategory();
GrossVehicleMassRating = data.GrossVehicleMassRating.SI<Kilogram>();
DragCoefficient = data.DragCoefficient;
CrossSectionArea = data.CrossSectionArea.SI<SquareMeter>();
DragCoefficientRigidTruck = data.DragCoefficientRigidTruck;
CrossSectionAreaRigidTruck = data.CrossSectionAreaRigidTruck.SI<SquareMeter>();
}
[DataMember] private VehicleCategory _vehicleCategory;
public string BasePath { get; protected set; }
public bool SavedInDeclarationMode { get; internal set; }
public VehicleCategory Category
protected readonly VehicleCategory _vehicleCategory;
public VehicleCategory VehicleCategory
{
get { return _vehicleCategory; }
set
{
_vehicleCategory = value;
_data.Body.VehicleCategoryStr = value.ToString();
}
}
public CrossWindCorrectionMode CrossWindCorrectionMode { get; protected set; }
public Kilogram CurbWeight
{
get { return _data.Body.CurbWeight.SI<Kilogram>(); }
set { _data.Body.CurbWeight = value.Double(); }
}
public RetarderData Retarder { get; protected set; }
//[DataMember] private List<Axle> _axleData;
public Kilogram CurbWeigthExtra
{
get { return _data.Body.CurbWeightExtra.SI<Kilogram>(); }
set { _data.Body.CurbWeightExtra = value.Double(); }
}
public AxleConfiguration AxleConfiguration { get; protected set; }
public Kilogram Loading
{
get { return _data.Body.Loading.SI<Kilogram>(); }
set { _data.Body.Loading = value.Double(); }
}
public Kilogram CurbWeight { get; protected set; }
public Kilogram CurbWeigthExtra { get; protected set; }
public Kilogram Loading { get; protected set; }
public Kilogram TotalVehicleWeight()
{
return CurbWeight + CurbWeigthExtra + Loading;
}
public Kilogram GrossVehicleMassRating
{
get { return _data.Body.GrossVehicleMassRating.SI<Kilogram>(); }
set { _data.Body.GrossVehicleMassRating = (double) value.ConvertTo().Kilo.Kilo.Gramm; }
}
public Kilogram GrossVehicleMassRating { get; protected internal set; }
public double DragCoefficient
{
get { return _data.Body.DragCoefficient; }
set { _data.Body.DragCoefficient = value; }
}
public double DragCoefficient { get; protected internal set; }
public SquareMeter CrossSectionArea
{
get { return _data.Body.CrossSectionArea.SI<SquareMeter>(); }
set { _data.Body.CrossSectionArea = value.Double(); }
}
public SquareMeter CrossSectionArea { get; protected internal set; }
public double DragCoefficientRigidTruck
{
get { return _data.Body.DragCoefficient; }
set { _data.Body.DragCoefficient = value; }
}
public double DragCoefficientRigidTruck { get; protected internal set; }
public SquareMeter CrossSectionAreaRigidTruck
{
get { return _data.Body.CrossSectionArea.SI<SquareMeter>(); }
set { _data.Body.CrossSectionArea = value.Double(); }
}
public SquareMeter CrossSectionAreaRigidTruck { get; protected internal set; }
public Meter DynamicTyreRadius
{
get { return _data.Body.DynamicTyreRadius.SI().Milli.Meter.Cast<Meter>(); }
set { _data.Body.DynamicTyreRadius = (double) value.ConvertTo().Milli.Meter; }
}
public CrossWindCorrectionMode CrossWindCorrection { get; protected set; }
public Meter DynamicTyreRadius { get; protected set; }
public Kilogram ReducedMassWheels { get; set; }
public string Rim
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
public string Rim { get; protected set; }
public CrossWindCorrectionMode CrossWindCorrection
{
get { return _crossWindCorrectionMode; }
set { _crossWindCorrectionMode = value; }
}
public double TotalRollResistanceCoefficient { get; protected set; }
}
public RetarderData Retarder
{
get { return _retarder; }
protected set { _retarder = value; }
}
public class Axle
{
//private DataV5Engineering.DataBody.AxleData _data;
public AxleConfiguration Axles
public Axle()
{
get { return _axleConfiguration; }
//_data = data;
}
public double TotalRollResistanceCoefficient { get; protected set; }
public static VehicleData ReadFromFile(string fileName)
{
return ReadFromJson(File.ReadAllText(fileName), Path.GetDirectoryName(fileName));
}
//public Axle(DataV5Declaration.DataBody.AxleData data) {}
public static VehicleData ReadFromJson(string json, string basePath = "")
{
var vehicleData = new VehicleData(basePath);
var fileVersion = GetFileVersion(json);
switch (fileVersion) {
case 5:
var data = JsonConvert.DeserializeObject<DataV5Engineering>(json);
vehicleData.Data = data;
break;
default:
throw new UnsupportedFileVersionException("Unsupported Version of .vveh file. Got Version " + fileVersion);
}
return vehicleData;
}
public KilogramSquareMeter Inertia { get; protected set; }
public class DataV5Engineering
{
[JsonProperty(Required = Required.Always)] public JsonDataHeader Header;
[JsonProperty(Required = Required.Always)] public DataBody Body;
public void SetProperties(VehicleData vehicleData)
{
vehicleData._axleConfiguration = AxleConfiguration.AxleConfig4x2;
vehicleData._retarder = new RetarderData(Body.Retarder, vehicleData.BasePath);
vehicleData._axleData = new List<Axle>(Body.AxleConfig.Axles.Count);
var RRC = 0.0;
var mRed0 = 0.SI<Kilogram>();
foreach (var axleData in Body.AxleConfig.Axles) {
var axle = new Axle(axleData);
if (axle.RollResistanceCoefficient < 0) {
throw new VectoException("Axle roll resistance coefficient < 0");
}
if (axle.TyreTestLoad <= 0) {
throw new VectoException("Axle tyre test load (FzISO) must be greater than 0!");
}
var nrWheels = axle.TwinTyres ? 4 : 2;
RRC += axle.AxleWeightShare * axle.RollResistanceCoefficient *
Math.Pow(
(axle.AxleWeightShare * vehicleData.TotalVehicleWeight() * Physics.GravityAccelleration / axle.TyreTestLoad /
nrWheels).Double(), Physics.RollResistanceExponent - 1);
mRed0 += nrWheels * (axle.Inertia / vehicleData.DynamicTyreRadius / vehicleData.DynamicTyreRadius).Cast<Kilogram>();
vehicleData._axleData.Add(axle);
}
vehicleData.TotalRollResistanceCoefficient = RRC;
vehicleData.ReducedMassWheels = mRed0;
switch (Body.VehicleCategoryStr) {
case "RigidTruck":
vehicleData.Category = VehicleCategory.RigidTruck;
break;
case "Tractor":
vehicleData.Category = VehicleCategory.Tractor;
break;
case "CityBus":
vehicleData.Category = VehicleCategory.CityBus;
break;
case "InterurbanBus":
vehicleData.Category = VehicleCategory.InterurbanBus;
break;
case "Coach":
vehicleData.Category = VehicleCategory.Coach;
break;
}
switch (Body.CrossWindCorrectionModeStr) {
case "CdOfBeta":
vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.VAirBeta;
break;
case "CdOfV":
vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependent;
break;
default:
vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection;
break;
}
}
public class DataBody
{
[JsonProperty("SavedInDeclMode")] public bool SavedInDeclarationMode;
[JsonProperty("VehCat", Required = Required.Always)] public string VehicleCategoryStr;
[JsonProperty(Required = Required.Always)] public double CurbWeight;
[JsonProperty] public double CurbWeightExtra;
[JsonProperty] public double Loading;
[JsonProperty("MassMax", Required = Required.Always)] public double GrossVehicleMassRating;
[JsonProperty("Cd2")] public double DragCoefficientRigidTruck; // without trailer
[JsonProperty("CrossSecArea2")] public double CrossSectionAreaRigidTruck;
[JsonProperty("Cd", Required = Required.Always)] public double DragCoefficient;
[JsonProperty("CrossSecArea", Required = Required.Always)] public double CrossSectionArea;
[JsonProperty("rdyn")] public double DynamicTyreRadius;
[JsonProperty("Rim")] public string RimStr;
[JsonProperty("CdCorrMode")] public string CrossWindCorrectionModeStr;
[JsonProperty("CdCorrFile")] public string CrossWindCorrectionFile;
[JsonProperty("Retarder", Required = Required.Always)] public RetarderData.Data Retarder;
[JsonProperty(Required = Required.Always)] public AxleConfigData AxleConfig;
public class AxleConfigData
{
[JsonProperty("Type", Required = Required.Always)] public string TypeStr;
[JsonProperty(Required = Required.Always)] public IList<AxleData> Axles;
}
public class AxleData
{
[JsonProperty] public double Inertia;
[JsonProperty] public string WheelsStr;
[JsonProperty] public double AxleWeightShare;
[JsonProperty(Required = Required.Always)] public bool TwinTyres;
[JsonProperty("RRCISO", Required = Required.Always)] public double RollResistanceCoefficient;
[JsonProperty("FzISO", Required = Required.Always)] public double TyreTestLoad;
}
}
}
public double RollResistanceCoefficient { get; protected set; }
public Newton TyreTestLoad { get; protected set; }
public class DataV5Declaration
{
[JsonProperty(Required = Required.Always)] public JsonDataHeader Header;
[JsonProperty(Required = Required.Always)] public DataBody Body;
public void SetProperties(VehicleData vehicleData)
{
vehicleData._axleConfiguration = AxleConfiguration.AxleConfig4x2;
vehicleData._retarder = new RetarderData(Body.Retarder, vehicleData.BasePath);
vehicleData._axleData = new List<Axle>(Body.AxleConfig.Axles.Count);
var RRC = 0.0;
var mRed0 = 0.SI<Kilogram>();
foreach (var axleData in Body.AxleConfig.Axles) {
var axle = new Axle(axleData);
if (axle.RollResistanceCoefficient < 0) {
throw new VectoException("Axle roll resistance coefficient < 0");
}
if (axle.TyreTestLoad <= 0) {
throw new VectoException("Axle tyre test load (FzISO) must be greater than 0!");
}
var nrWheels = axle.TwinTyres ? 4 : 2;
RRC += axle.AxleWeightShare * axle.RollResistanceCoefficient *
Math.Pow(
(axle.AxleWeightShare * vehicleData.TotalVehicleWeight() * Physics.GravityAccelleration / axle.TyreTestLoad /
nrWheels).Double(), Physics.RollResistanceExponent - 1);
mRed0 += nrWheels * (axle.Inertia / vehicleData.DynamicTyreRadius / vehicleData.DynamicTyreRadius).Cast<Kilogram>();
vehicleData._axleData.Add(axle);
}
vehicleData.TotalRollResistanceCoefficient = RRC;
vehicleData.ReducedMassWheels = mRed0;
switch (Body.VehicleCategoryStr) {
case "RigidTruck":
vehicleData.Category = VehicleCategory.RigidTruck;
break;
case "Tractor":
vehicleData.Category = VehicleCategory.Tractor;
break;
case "CityBus":
vehicleData.Category = VehicleCategory.CityBus;
break;
case "InterurbanBus":
vehicleData.Category = VehicleCategory.InterurbanBus;
break;
case "Coach":
vehicleData.Category = VehicleCategory.Coach;
break;
}
//switch (Body.CrossWindCorrectionModeStr) {
// case "CdOfBeta":
// vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.VAirBeta;
// break;
// case "CdOfV":
// vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependent;
// break;
// default:
// vehicleData._crossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection;
// break;
//}
}
public class DataBody
{
[JsonProperty("SavedInDeclMode", Required = Required.Always)] public bool SavedInDeclarationMode;
[JsonProperty("VehCat", Required = Required.Always)] public string VehicleCategoryStr;
[JsonProperty(Required = Required.Always)] public double CurbWeight;
//[JsonProperty]
//public double CurbWeightExtra;
//[JsonProperty]
//public double Loading;
[JsonProperty("MassMax", Required = Required.Always)] public double GrossVehicleMassRating;
[JsonProperty("Cd2")] public double DragCoefficientRigidTruck; // without trailer
[JsonProperty("CrossSecArea2")] public double CrossSectionAreaRigidTruck;
[JsonProperty("Cd", Required = Required.Always)] public double DragCoefficient;
[JsonProperty("CrossSecArea", Required = Required.Always)] public double CrossSectionArea;
//[JsonProperty("rdyn")]
//public double DynamicTyreRadius;
[JsonProperty("Rim", Required = Required.Always)] public string RimStr;
//[JsonProperty("CdCorrMode")]
//public string CrossWindCorrectionModeStr;
//[JsonProperty("CdCorrFile")]
//public string CrossWindCorrectionFile;
[JsonProperty("Retarder", Required = Required.Always)] public RetarderData.Data Retarder;
[JsonProperty(Required = Required.Always)] public AxleConfigData AxleConfig;
public class AxleConfigData
{
[JsonProperty("Type", Required = Required.Always)] public string TypeStr;
[JsonProperty(Required = Required.Always)] public IList<AxleData> Axles;
}
public class AxleData
{
//[JsonProperty]
//public double Inertia;
[JsonProperty(Required = Required.Always)] public string WheelsStr;
//[JsonProperty(Required = Required.Always)]
//public double AxleWeightShare;
[JsonProperty(Required = Required.Always)] public bool TwinTyres;
[JsonProperty("RRCISO", Required = Required.Always)] public double RollResistanceCoefficient;
[JsonProperty("FzISO", Required = Required.Always)] public double TyreTestLoad;
}
}
}
public double AxleWeightShare { get; protected set; }
public class Axle
{
private DataV5Engineering.DataBody.AxleData _data;
public Axle(DataV5Engineering.DataBody.AxleData data)
{
_data = data;
}
public Axle(DataV5Declaration.DataBody.AxleData data) {}
public SI Inertia
{
get { return _data.Inertia.SI().Kilo.Gramm.Square.Meter; }
set { _data.Inertia = value.Double(); }
}
public double RollResistanceCoefficient
{
get { return _data.RollResistanceCoefficient; }
set { _data.RollResistanceCoefficient = value; }
}
public Newton TyreTestLoad
{
get { return _data.TyreTestLoad.SI<Newton>(); }
set { _data.TyreTestLoad = value.Double(); }
}
public double AxleWeightShare
{
get { return _data.AxleWeightShare; }
set { _data.AxleWeightShare = value; }
}
public bool TwinTyres
{
get { return _data.TwinTyres; }
set { _data.TwinTyres = value; }
}
}
public bool TwinTyres { get; protected set; }
}
}
\ No newline at end of file
using System.IO;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.FileIO;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.SimulationComponent.Factories
{
public class DeclarationModeSimulationComponentFactory
{
protected static DeclarationModeSimulationComponentFactory _instance;
public static DeclarationModeSimulationComponentFactory Instance()
{
return _instance ?? (_instance = new DeclarationModeSimulationComponentFactory());
}
public VehicleData CreateVehicleData(string fileName)
{
var json = File.ReadAllText(fileName);
var fileInfo = SimulationComponentData.GetFileVersion(json);
if (!fileInfo.Item2) {
throw new VectoException("File not saved in Declaration Mode!");
}
switch (fileInfo.Item1) {
case 5:
var data = JsonConvert.DeserializeObject<VehicleFileV5Declaration>(json);
return CreateVehicleData(Path.GetDirectoryName(fileName), data.Body);
default:
throw new UnsupportedFileVersionException("Unsupported Version of .vveh file. Got Version " + fileInfo.Item1);
}
}
protected VehicleData CreateVehicleData(string basePath, VehicleFileV5Declaration.DataBodyDecl data)
{
return new VehicleData {
SavedInDeclarationMode = data.SavedInDeclarationMode,
VehicleCategory = data.VehicleCategory(),
GrossVehicleMassRating = data.GrossVehicleMassRating.SI<Kilogram>(),
DragCoefficient = data.DragCoefficient,
CrossSectionArea = data.CrossSectionArea.SI<SquareMeter>(),
DragCoefficientRigidTruck = data.DragCoefficientRigidTruck,
CrossSectionAreaRigidTruck = data.CrossSectionAreaRigidTruck.SI<SquareMeter>()
};
}
}
}
\ No newline at end of file
namespace TUGraz.VectoCore.Models.SimulationComponent.Factories
{
public class EngineeringModeSimulationComponentFactory
{
}
}
\ No newline at end of file
......@@ -14,13 +14,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
private VehicleState _previousState;
private VehicleState _currentState;
private VehicleData _data;
private readonly VehicleData _data;
public Vehicle(VehicleContainer container, VehicleData data) : base(container)
{
_data = data;
_previousState = new VehicleState();
_previousState.Velocity = 0.SI<MeterPerSecond>();
_previousState = new VehicleState { Velocity = 0.SI<MeterPerSecond>() };
_currentState = new VehicleState();
}
......@@ -71,8 +70,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected Newton AirDragResistance()
{
// TODO different types of cross-wind correction...
var Cd = _data.DragCoefficient;
var vAir = _currentState.Velocity;
var Cd = _data.DragCoefficient;
switch (_data.CrossWindCorrection) {
case CrossWindCorrectionMode.SpeedDependent:
//Cd =
break;
case CrossWindCorrectionMode.VAirBeta:
break;
}
return (Cd * _data.CrossSectionArea * Physics.AirDensity / 2 * vAir * vAir).Cast<Newton>();
}
......
rims,F(a),F(b)
rims,F_a,F_b
5° DC Rims,3.03,3.03
15° DC Rims,3.03,3.05
Multipurpose – Radial,3,3
......
......@@ -46,6 +46,12 @@ namespace TUGraz.VectoCore.Utils
protected SquareMeter(double val) : base(val, new SI().Square.Meter) {}
}
public class KilogramSquareMeter : SIBase<KilogramSquareMeter>
{
public KilogramSquareMeter() : this(0) {}
protected KilogramSquareMeter(double val) : base(val, new SI().Kilo.Gramm.Square.Meter) {}
}
public class Watt : SIBase<Watt>
{
public Watt() : this(0) {}
......
......@@ -108,6 +108,8 @@
<ItemGroup>
<Compile Include="Exceptions\VectoExceptions.cs" />
<Compile Include="Exceptions\VectoSimulationException.cs" />
<Compile Include="FileIO\VehicleFileDeclaration.cs" />
<Compile Include="FileIO\VehicleFileEngineering.cs" />
<Compile Include="Models\Connector\Ports\IDriverDemandPort.cs" />
<Compile Include="Models\Connector\Ports\IDriverDemandProvider.cs" />
<Compile Include="Models\Connector\Ports\IDrivingCycleDemandPort.cs" />
......@@ -119,7 +121,9 @@
<Compile Include="Models\Connector\Ports\Impl\Response.cs" />
<Compile Include="Models\Connector\Ports\IFvPort.cs" />
<Compile Include="Models\Connector\Ports\ITnPort.cs" />
<Compile Include="Models\DeclarationData\Wheels.cs" />
<Compile Include="Models\DeclarationData.cs" />
<Compile Include="Models\Declaration\Rims.cs" />
<Compile Include="Models\Declaration\Wheels.cs" />
<Compile Include="Models\SimulationComponent\Data\AuxiliariesDemandAdapter.cs" />
<Compile Include="Models\SimulationComponent\Data\CombustionEngineData.cs" />
<Compile Include="Models\SimulationComponent\Data\DrivingCycleData.cs" />
......@@ -143,11 +147,7 @@
<Compile Include="Models\SimulationComponent\Impl\Vehicle.cs" />
<Compile Include="Models\SimulationComponent\IPowerTrainComponent.cs" />
<Compile Include="Models\SimulationComponent\IVehicle.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Models\Declaration\LookupData.cs" />
<Compile Include="Utils\Formulas.cs" />
<Compile Include="Utils\IntExtensionMethods.cs" />
<Compile Include="Utils\Physics.cs" />
......@@ -197,12 +197,6 @@
<EmbeddedResource Include="Resources\Declaration\Rims.csv" />
<EmbeddedResource Include="Resources\Declaration\Wheels.csv" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
......
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCore.Models.DeclarationData;
using TUGraz.VectoCore.Models.Declaration;
namespace TUGraz.VectoCore.Tests.Models.DeclarationData
{
[TestClass]
public class DeclarationDataTest
{
public const double Tolerance = 0.0001;
[TestMethod]
public void WheelDataTest()
{
var wheels = Wheels.Instance();
var wheels = VectoCore.Models.DeclarationData.Instance().Wheels;
var tmp = wheels.Lookup("285/70 R 19.5");
Assert.AreEqual(7.9, tmp.Inertia.Double(), Tolerance);
Assert.AreEqual(0.8943, tmp.DynamicTyreRadius.Double(), Tolerance);
Assert.AreEqual(0, tmp.SizeClass);
}
[TestMethod]
public void RimsDataTest()
{
var rims = VectoCore.Models.DeclarationData.Instance().Rims;
var tmp = rims.Lookup("15° DC Rims");
Assert.AreEqual(3.03, tmp.F_a, Tolerance);
Assert.AreEqual(3.05, tmp.F_b, Tolerance);
}
}
}
}
\ No newline at end of file
......@@ -18,7 +18,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
var container = new VehicleContainer();
var vehicleData = VehicleData.ReadFromFile(VehicleDataFile);
vehicleData.CrossWindCorrection = VehicleData.CrossWindCorrectionMode.NoCorrection;
//vehicleData.CrossWindCorrection = VehicleData.CrossWindCorrectionMode.NoCorrection;
var vehicle = new Vehicle(container, vehicleData, 17.210535);
var mockPort = new MockFvOutPort();
......
......@@ -13,7 +13,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
{
var vehicleData = VehicleData.ReadFromFile(VehicleDataFile);
Assert.AreEqual(VehicleData.VehicleCategory.Coach, vehicleData.Category);
Assert.AreEqual(VehicleCategory.Coach, vehicleData.VehicleCategory);
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment